Skip to content

Commit 8811d8b

Browse files
authored
Adds Submodel Selection for Download Dialog (#681)
1 parent 3464d24 commit 8811d8b

File tree

4 files changed

+109
-54
lines changed

4 files changed

+109
-54
lines changed

aas-web-ui/src/components.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ declare module 'vue' {
102102
SubmodelElementWrapper: typeof import('./components/UIComponents/SubmodelElementWrapper.vue')['default']
103103
SubmodelForm: typeof import('./components/EditorComponents/SubmodelForm.vue')['default']
104104
SubmodelList: typeof import('./components/SubmodelList.vue')['default']
105+
SubmodelSelection: typeof import('./components/AppNavigation/SubmodelSelection.vue')['default']
105106
SubmodelTree: typeof import('./components/SubmodelTree.vue')['default']
106107
SupplementalSemanticID: typeof import('./components/UIComponents/SupplementalSemanticID.vue')['default']
107108
TechnicalData_v1_2: typeof import('./components/Plugins/Submodels/TechnicalData_v1_2.vue')['default']

aas-web-ui/src/components/AppNavigation/DeleteAAS.vue

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
<v-alert v-if="deleteSubmodels" class="mb-2" variant="tonal" border color="warning">
1212
Warning: If other shells refer to the same submodels, those references are not deleted!
1313
</v-alert>
14+
<SubmodelSelection
15+
v-if="deleteSubmodels"
16+
:selected="selected"
17+
:submodel-ids="submodelIds"
18+
@update:selected="updateSelectedSubmodels" />
1419
</v-card-text>
1520
<v-card-actions>
1621
<v-spacer></v-spacer>
@@ -24,6 +29,8 @@
2429
<script lang="ts" setup>
2530
import { computed, ref, watch } from 'vue';
2631
import { useRouter } from 'vue-router';
32+
import { useAASRepositoryClient } from '@/composables/Client/AASRepositoryClient';
33+
import { useSMRepositoryClient } from '@/composables/Client/SMRepositoryClient';
2734
import { useRequestHandling } from '@/composables/RequestHandling';
2835
import { useAASStore } from '@/store/AASDataStore';
2936
import { useNavigationStore } from '@/store/NavigationStore';
@@ -36,6 +43,8 @@
3643
const navigationStore = useNavigationStore();
3744
3845
const { getRequest, deleteRequest } = useRequestHandling();
46+
const { getSubmodelRefsById } = useAASRepositoryClient();
47+
const { fetchSmById } = useSMRepositoryClient();
3948
4049
const props = defineProps<{
4150
modelValue: boolean;
@@ -50,13 +59,23 @@
5059
const deleteDialog = ref(false); // Variable to store if the delete dialog is open
5160
const deleteLoading = ref(false); // Variable to store if the AAS is being deleted
5261
const deleteSubmodels = ref(false); // Variable to store if the Submodels should be deleted
62+
const submodelIds = ref<any[]>([]); // Variable to store the Submodel Ids of the AAS
63+
const selected = ref<string[]>([]); // Variable to store the selected Submodel Ids
5364
5465
const submodelRegistryURL = computed(() => navigationStore.getSubmodelRegistryURL); // Get Submodel Registry URL from Store
5566
5667
watch(
5768
() => props.modelValue,
58-
(value) => {
69+
async (value) => {
5970
deleteDialog.value = value;
71+
const submodelRefs = await getSubmodelRefsById(props.aas.id);
72+
submodelIds.value = [];
73+
selected.value = [];
74+
for (const submodelRef of submodelRefs) {
75+
const submodel = await fetchSmById(submodelRef.keys[0].value);
76+
submodelIds.value.push({ smId: submodelRef.keys[0].value, smIdShort: submodel.idShort, submodel });
77+
selected.value.push(submodelRef.keys[0].value);
78+
}
6079
}
6180
);
6281
@@ -67,39 +86,34 @@
6786
}
6887
);
6988
89+
function updateSelectedSubmodels(value: string[]): void {
90+
selected.value = value;
91+
}
92+
7093
async function confirmDelete() {
7194
deleteLoading.value = true;
7295
let error = false;
7396
try {
7497
if (deleteSubmodels.value) {
75-
const aasEndpopint = extractEndpointHref(props.aas, 'AAS-3.0');
76-
const aasRepoPath = aasEndpopint + '/submodel-refs';
77-
const aasRepoContext = 'retrieving Submodel References';
98+
// Extract all references in an array called submodelIds from each keys[0].value
99+
const submodelIds = selected.value;
78100
const disableMessage = false;
79-
const aasRepoResponse = await getRequest(aasRepoPath, aasRepoContext, disableMessage);
80-
if (aasRepoResponse.success) {
81-
const submodelRefs = aasRepoResponse.data.result;
82-
// Extract all references in an array called submodelIds from each keys[0].value
83-
const submodelIds = submodelRefs.map((ref: any) => ref.keys[0].value);
84-
await removeAAS(props.aas);
85-
// Remove each submodel
86-
for (const submodelId of submodelIds) {
87-
const submodelRegistryPath = `${submodelRegistryURL.value}/${base64Encode(submodelId)}`;
88-
const submodelRegistryResponse = await getRequest(
89-
submodelRegistryPath,
90-
'Removing Submodels',
91-
disableMessage
92-
);
93-
if (submodelRegistryResponse.success) {
94-
const submodelHref = extractEndpointHref(submodelRegistryResponse.data, 'SUBMODEL-3.0');
95-
const deletePath = submodelHref;
96-
await deleteRequest(deletePath, 'removing Submodel', disableMessage);
97-
} else {
98-
error = true;
99-
}
101+
await removeAAS(props.aas);
102+
// Remove each submodel
103+
for (const submodelId of submodelIds) {
104+
const submodelRegistryPath = `${submodelRegistryURL.value}/${base64Encode(submodelId)}`;
105+
const submodelRegistryResponse = await getRequest(
106+
submodelRegistryPath,
107+
'Removing Submodels',
108+
disableMessage
109+
);
110+
if (submodelRegistryResponse.success) {
111+
const submodelHref = extractEndpointHref(submodelRegistryResponse.data, 'SUBMODEL-3.0');
112+
const deletePath = submodelHref;
113+
await deleteRequest(deletePath, 'removing Submodel', disableMessage);
114+
} else {
115+
error = true;
100116
}
101-
} else {
102-
error = true;
103117
}
104118
} else {
105119
await removeAAS(props.aas);

aas-web-ui/src/components/AppNavigation/DownloadAAS.vue

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,10 @@
77
<div>You selected the AAS with the ID</div>
88
<span class="text-primary font-weight-bold">{{ aas.id }}</span>
99
<span> for download.</span><br />
10-
<v-sheet border rounded class="mt-4">
11-
<v-data-table-virtual
12-
v-model="selected"
13-
density="compact"
14-
:headers="headers"
15-
:items="submodelIds"
16-
style="overflow-y: auto; max-height: 300px"
17-
item-value="smId"
18-
fixed-header
19-
show-select>
20-
<template #[`header.smId`]>
21-
<div class="font-weight-bold">Submodel</div>
22-
</template>
23-
<template #[`item.smId`]="{ item }">
24-
<div>
25-
{{ nameToDisplay(item.submodel) }}
26-
</div>
27-
<div class="text-medium-emphasis">
28-
{{ item.smId }}
29-
</div>
30-
</template>
31-
</v-data-table-virtual>
32-
</v-sheet>
10+
<SubmodelSelection
11+
:selected="selected"
12+
:submodel-ids="submodelIds"
13+
@update:selected="updateSelectedSubmodels" />
3314
<v-checkbox v-model="downloadCDs" label="Also download Concept Descriptions" hide-details></v-checkbox>
3415
</v-card-text>
3516
<v-divider></v-divider>
@@ -44,7 +25,6 @@
4425

4526
<script lang="ts" setup>
4627
import { ref, watch } from 'vue';
47-
import { useReferableUtils } from '@/composables/AAS/ReferableUtils';
4828
import { useAASRepositoryClient } from '@/composables/Client/AASRepositoryClient';
4929
import { useSMRepositoryClient } from '@/composables/Client/SMRepositoryClient';
5030
import { useIDUtils } from '@/composables/IDUtils';
@@ -55,7 +35,6 @@
5535
const { getSubmodelRefsById } = useAASRepositoryClient();
5636
const { fetchSmById } = useSMRepositoryClient();
5737
const { generateUUIDFromString } = useIDUtils();
58-
const { nameToDisplay } = useReferableUtils();
5938
6039
const { getRequest } = useRequestHandling();
6140
@@ -71,8 +50,6 @@
7150
const downloadDialog = ref(false);
7251
const downloadLoading = ref(false);
7352
74-
const headers = [{ title: 'Submodel', align: 'start', sortable: false, key: 'smId' }] as any;
75-
7653
const selected = ref<string[]>([]);
7754
const submodelIds = ref<any[]>([]);
7855
const downloadEndpoint = ref<string>('');
@@ -105,6 +82,10 @@
10582
}
10683
);
10784
85+
function updateSelectedSubmodels(value: string[]): void {
86+
selected.value = value;
87+
}
88+
10889
async function download(): Promise<void> {
10990
downloadLoading.value = true;
11091
let aasSerializationPath = downloadEndpoint.value;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<template>
2+
<v-sheet border rounded class="mt-4">
3+
<v-data-table-virtual
4+
v-model="selectedSubmodels"
5+
density="compact"
6+
:headers="headers"
7+
:items="submodelIds"
8+
style="overflow-y: auto; max-height: 300px"
9+
item-value="smId"
10+
fixed-header
11+
show-select>
12+
<template #[`header.smId`]>
13+
<div class="font-weight-bold">Submodel</div>
14+
</template>
15+
<template #[`item.smId`]="{ item }">
16+
<div>
17+
{{ nameToDisplay(item.submodel) }}
18+
</div>
19+
<div class="text-medium-emphasis">
20+
{{ item.smId }}
21+
</div>
22+
</template>
23+
</v-data-table-virtual>
24+
</v-sheet>
25+
</template>
26+
27+
<script setup lang="ts">
28+
import { ref, watch } from 'vue';
29+
import { useReferableUtils } from '@/composables/AAS/ReferableUtils';
30+
31+
const { nameToDisplay } = useReferableUtils();
32+
33+
const props = defineProps<{
34+
selected: string[];
35+
submodelIds: any[];
36+
}>();
37+
38+
const selectedSubmodels = ref<string[]>([]);
39+
const headers = [{ title: 'Submodel', align: 'start', sortable: false, key: 'smId' }] as any;
40+
41+
watch(
42+
() => selectedSubmodels.value,
43+
(value) => {
44+
emit('update:selected', value);
45+
}
46+
);
47+
48+
watch(
49+
() => props.selected,
50+
(value) => {
51+
selectedSubmodels.value = value;
52+
},
53+
{ immediate: true }
54+
);
55+
56+
const emit = defineEmits<{
57+
(event: 'update:selected', value: string[]): void;
58+
}>();
59+
</script>

0 commit comments

Comments
 (0)