@dative-gpi/foundation-core-components 1.0.56 → 1.0.58-groupings

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/components/autocompletes/FSAutocompleteChart.vue +15 -8
  2. package/components/autocompletes/FSAutocompleteDashboard.vue +14 -6
  3. package/components/autocompletes/FSAutocompleteDashboardOrganisation.vue +7 -1
  4. package/components/autocompletes/FSAutocompleteDataCategory.vue +11 -5
  5. package/components/autocompletes/FSAutocompleteDataDefinition.vue +7 -1
  6. package/components/autocompletes/FSAutocompleteGroup.vue +7 -1
  7. package/components/autocompletes/FSAutocompleteLocation.vue +6 -0
  8. package/components/autocompletes/FSAutocompleteManufacturer.vue +8 -0
  9. package/components/autocompletes/FSAutocompleteModel.vue +9 -1
  10. package/components/autocompletes/FSAutocompleteOrganisationType.vue +7 -1
  11. package/components/autocompletes/FSAutocompleteRole.vue +14 -6
  12. package/components/autocompletes/FSAutocompleteServiceAccountRoleOrganisation.vue +7 -1
  13. package/components/autocompletes/FSAutocompleteUserOrganisation.vue +9 -1
  14. package/components/customProperties/FSMetaField.vue +35 -40
  15. package/components/customProperties/FSMetaFormContent.vue +4 -3
  16. package/components/customProperties/FSMetaHistory.vue +2 -2
  17. package/components/customProperties/FSMetaValue.vue +63 -31
  18. package/components/customProperties/helpers.ts +57 -165
  19. package/components/entities/FSBaseEntitiesList.vue +14 -4
  20. package/components/entities/FSDialogSelectEntities.vue +28 -106
  21. package/components/entities/FSEntityField.vue +75 -14
  22. package/components/entities/FSSelectEntitiesList.vue +225 -0
  23. package/components/explorers/FSBaseDevicesExplorer.vue +312 -0
  24. package/components/explorers/FSBaseFoldersExplorer.vue +286 -0
  25. package/components/lists/FSDataTable.vue +23 -21
  26. package/components/lists/alerts/FSBaseAlertsList.vue +95 -97
  27. package/components/lists/alerts/FSButtonAcknowledgeAlert.vue +4 -4
  28. package/components/lists/authTokens/FSBaseAuthTokensList.vue +6 -4
  29. package/components/lists/chartOrganisationTypes/FSBaseChartOrganisationTypesList.vue +103 -38
  30. package/components/lists/chartOrganisations/FSBaseChartOrganisationsList.vue +104 -39
  31. package/components/lists/charts/FSBaseChartsList.vue +147 -66
  32. package/components/lists/comments/FSBaseCommentsList.vue +39 -23
  33. package/components/lists/connectivityScenarios/FSBaseConnectivityScenariosList.vue +128 -0
  34. package/components/lists/dashboardOrganisationTypes/FSBaseDashboardOrganisationTypesList.vue +39 -7
  35. package/components/lists/dashboards/FSBaseDashboardsList.vue +44 -13
  36. package/components/lists/dashboards/FSSimpleDashboardsList.vue +33 -7
  37. package/components/lists/dataCategories/FSBaseDataCategoriesList.vue +6 -5
  38. package/components/lists/dataDefinitions/FSBaseDataDefinitionsList.vue +6 -4
  39. package/components/lists/deviceOrganisations/FSBaseDeviceOrganisationsList.vue +179 -61
  40. package/components/lists/folders/FSBaseFoldersList.vue +37 -146
  41. package/components/lists/groupings/FSBaseGroupingsList.vue +117 -0
  42. package/components/lists/groups/FSBaseGroupsList.vue +24 -7
  43. package/components/lists/locations/FSBaseLocationsList.vue +52 -13
  44. package/components/lists/models/FSBaseModelsList.vue +45 -15
  45. package/components/lists/roleOrganisationTypes/FSBaseRoleOrganisationTypesList.vue +17 -10
  46. package/components/lists/roleOrganisations/FSBaseRoleOrganisationsList.vue +28 -21
  47. package/components/lists/scenarioOrganisationTypes/FSBaseScenarioOrganisationTypesList.vue +56 -13
  48. package/components/lists/scenarioOrganisations/FSBaseScenarioOrganisationsList.vue +56 -12
  49. package/components/lists/scenarios/FSBaseScenariosList.vue +122 -81
  50. package/components/lists/serviceAccountOrganisations/FSBaseServiceAccountOrganisationsList.vue +31 -18
  51. package/components/lists/serviceAccountRoleOrganisations/FSBaseServiceAccountRoleOrganisationsList.vue +128 -0
  52. package/components/lists/userOrganisations/FSBaseUserOrganisationsList.vue +30 -19
  53. package/components/lists/userOrganisations/FSChipUserOrganisationsList.vue +61 -0
  54. package/components/tiles/FSChartTile.vue +71 -0
  55. package/components/tiles/FSDashboardOrganisationTile.vue +3 -3
  56. package/components/tiles/FSDashboardOrganisationTypeTile.vue +3 -3
  57. package/components/tiles/FSDashboardShallowTile.vue +3 -3
  58. package/components/tiles/FSDeviceOrganisationTile.vue +12 -5
  59. package/components/tiles/FSFolderTile.vue +3 -3
  60. package/components/tiles/FSGroupTile.vue +3 -3
  61. package/components/tiles/FSLocationTile.vue +5 -3
  62. package/components/tiles/FSModelTile.vue +64 -0
  63. package/components/tiles/FSServiceAccountOrganisationTile.vue +3 -3
  64. package/components/tiles/FSUserOrganisationTile.vue +3 -3
  65. package/components/treeviews/FSTreeViewFolder.vue +15 -3
  66. package/components/treeviews/FSTreeViewGroup.vue +22 -4
  67. package/package.json +9 -9
  68. package/utils/dashboards.ts +3 -3
  69. package/utils/index.ts +0 -1
  70. package/utils/roles.ts +3 -3
  71. package/utils/users.ts +3 -3
  72. package/components/selects/FSAggregationSelector.vue +0 -51
  73. package/components/selects/FSAxisTypeSelector.vue +0 -48
  74. package/components/selects/FSDisplayAsSelector.vue +0 -52
  75. package/components/selects/FSFilterTypeSelector.vue +0 -53
  76. package/components/selects/FSHeatmapRuleSelector.vue +0 -52
  77. package/components/selects/FSOperationOnSelector.vue +0 -51
  78. package/components/selects/FSPlanningTypeSelector.vue +0 -51
  79. package/components/selects/FSPlotPerSelector.vue +0 -51
  80. package/components/selects/FSSelectEntityType.vue +0 -59
  81. package/components/selects/FSSerieTypeSelector.vue +0 -51
  82. package/utils/charts.ts +0 -137
@@ -0,0 +1,312 @@
1
+ <template>
2
+ <FSDataTable
3
+ defaultMode="iterator"
4
+ :loading="fetchingDeviceExplorerElements"
5
+ :singleSelect="$props.singleSelect"
6
+ :items="deviceExplorerElements"
7
+ :selectable="$props.selectable"
8
+ :tableCode="$props.tableCode"
9
+ :itemTo="$props.itemTo"
10
+ :noSearch="$props.recursiveSearch"
11
+ :modelValue="$props.modelValue"
12
+ @update:modelValue="onUpdate"
13
+ v-model:search="search"
14
+ v-bind="$attrs"
15
+ >
16
+ <template
17
+ v-for="(_, name) in $slots"
18
+ v-slot:[name]="slotData"
19
+ >
20
+ <slot
21
+ :name="name"
22
+ v-bind="slotData"
23
+ />
24
+ </template>
25
+ <template
26
+ #header.imageId-title
27
+ >
28
+ <FSIcon>
29
+ mdi-panorama-variant-outline
30
+ </FSIcon>
31
+ </template>
32
+ <template
33
+ #header.connectivity-title
34
+ >
35
+ <FSIcon>
36
+ mdi-wifi
37
+ </FSIcon>
38
+ </template>
39
+ <template
40
+ #item.imageId="{ item }"
41
+ >
42
+ <FSImage
43
+ v-if="item.imageId"
44
+ height="32px"
45
+ width="32px"
46
+ :imageId="item.imageId"
47
+ :thumbnail="true"
48
+ />
49
+ </template>
50
+ <template
51
+ #item.tags="{ item }"
52
+ >
53
+ <FSTagGroup
54
+ variant="slide"
55
+ :showRemove="false"
56
+ :tags="item.tags"
57
+ />
58
+ </template>
59
+ <template
60
+ #item.type="{ item }"
61
+ >
62
+ <FSIcon
63
+ v-if="item.type === DeviceExplorerElementType.Group"
64
+ >
65
+ mdi-folder-outline
66
+ </FSIcon>
67
+ <FSIcon
68
+ v-else
69
+ >
70
+ mdi-widgets-outline
71
+ </FSIcon>
72
+ </template>
73
+
74
+ <template
75
+ #item.icon="{ item }"
76
+ >
77
+ <FSIcon
78
+ v-if="item.type === DeviceExplorerElementType.Group"
79
+ >
80
+ {{ item.icon }}
81
+ </FSIcon>
82
+ </template>
83
+ <template
84
+ #item.connectivity="{ item }"
85
+ >
86
+ <FSCol
87
+ v-if="item.type === DeviceExplorerElementType.DeviceOrganisation"
88
+ >
89
+ <FSConnectivity
90
+ v-if="item.connectivity.status != ConnectivityStatus.None"
91
+ :deviceConnectivity="item.connectivity"
92
+ />
93
+ </FSCol>
94
+ </template>
95
+ <template
96
+ #item.worstAlert="{ item }"
97
+ >
98
+ <FSWorstAlert
99
+ v-if="item.worstAlert"
100
+ :deviceWorstAlert="item.worstAlert"
101
+ :deviceAlerts="item.alerts"
102
+ :alertTo="$props.alertTo"
103
+ />
104
+ <div
105
+ v-else
106
+ />
107
+ </template>
108
+ <template
109
+ #item.alerts="{ item }"
110
+ >
111
+ <FSWorstAlert
112
+ v-if="item.worstAlert"
113
+ :deviceWorstAlert="item.worstAlert"
114
+ :deviceAlerts="item.alerts"
115
+ :alertTo="$props.alertTo"
116
+ />
117
+ <div
118
+ v-else
119
+ />
120
+ </template>
121
+ <template
122
+ #item.status="{ item }"
123
+ >
124
+ <FSStatusesCarousel
125
+ v-if="item.type === DeviceExplorerElementType.DeviceOrganisation"
126
+ :modelStatuses="item.modelStatuses"
127
+ :deviceStatuses="item.status.statuses"
128
+ />
129
+ </template>
130
+
131
+ <template
132
+ #item.tile="{ item, toggleSelect }"
133
+ >
134
+ <FSGroupTileUI
135
+ v-if="item.type === DeviceExplorerElementType.Group"
136
+ :to="$props.itemTo && $props.itemTo(item)"
137
+ :modelValue="isSelected(item.id)"
138
+ :selectable="$props.selectable"
139
+ @update:modelValue="toggleSelect(item)"
140
+ v-bind="item"
141
+ />
142
+ <FSDeviceOrganisationTileUI
143
+ v-if="item.type === DeviceExplorerElementType.DeviceOrganisation"
144
+ :to="$props.itemTo && $props.itemTo(item)"
145
+ :deviceConnectivity="item.connectivity"
146
+ :deviceStatuses="item.status.statuses"
147
+ :deviceWorstAlert="item.worstAlert"
148
+ :deviceAlerts="item.alerts"
149
+ :alertTo="$props.alertTo"
150
+ :modelValue="isSelected(item.id)"
151
+ :selectable="$props.selectable"
152
+ @update:modelValue="toggleSelect(item)"
153
+ v-bind="item"
154
+ />
155
+ </template>
156
+ </FSDataTable>
157
+ </template>
158
+
159
+ <script lang="ts">
160
+ import { computed, defineComponent, type PropType, ref, watch } from "vue";
161
+ import { type RouteLocation } from "vue-router";
162
+ import _ from "lodash";
163
+
164
+ import { ConnectivityStatus, DeviceExplorerElementType } from "@dative-gpi/foundation-shared-domain/enums";
165
+ import { useDeviceExplorerElements } from "@dative-gpi/foundation-core-services/composables";
166
+ import { type DeviceExplorerElementInfos} from "@dative-gpi/foundation-core-domain/models";
167
+ import { useDebounce } from "@dative-gpi/foundation-shared-components/composables";
168
+
169
+ import FSDeviceOrganisationTileUI from "@dative-gpi/foundation-shared-components/components/tiles/FSDeviceOrganisationTileUI.vue";
170
+ import FSStatusesCarousel from "@dative-gpi/foundation-shared-components/components/deviceOrganisations/FSStatusesCarousel.vue";
171
+ import FSConnectivity from "@dative-gpi/foundation-shared-components/components/deviceOrganisations/FSConnectivity.vue";
172
+ import FSWorstAlert from "@dative-gpi/foundation-shared-components/components/deviceOrganisations/FSWorstAlert.vue";
173
+ import FSGroupTileUI from "@dative-gpi/foundation-shared-components/components/tiles/FSGroupTileUI.vue";
174
+ import FSTagGroup from "@dative-gpi/foundation-shared-components/components/FSTagGroup.vue";
175
+ import FSImage from "@dative-gpi/foundation-shared-components/components/FSImage.vue";
176
+
177
+ import FSDataTable from "../lists/FSDataTable.vue";
178
+
179
+ export default defineComponent({
180
+ name: "FSBaseDevicesExplorer",
181
+ components: {
182
+ FSDeviceOrganisationTileUI,
183
+ FSStatusesCarousel,
184
+ FSConnectivity,
185
+ FSGroupTileUI,
186
+ FSWorstAlert,
187
+ FSDataTable,
188
+ FSTagGroup,
189
+ FSImage
190
+ },
191
+ props: {
192
+ tableCode: {
193
+ type: String as PropType<string | null>,
194
+ required: false,
195
+ default: null
196
+ },
197
+ recursiveSearch: {
198
+ type: Boolean,
199
+ required: false,
200
+ default: true
201
+ },
202
+ parentId: {
203
+ type: String as PropType<string | null>,
204
+ required: false,
205
+ default: null
206
+ },
207
+ root: {
208
+ type: Boolean,
209
+ required: false,
210
+ default: true
211
+ },
212
+ connectedOnly: {
213
+ type: Boolean,
214
+ required: false,
215
+ default: false
216
+ },
217
+ itemTo: {
218
+ type: Function as PropType<(item: DeviceExplorerElementInfos) => Partial<RouteLocation>>,
219
+ required: false
220
+ },
221
+ alertTo: {
222
+ type: Function,
223
+ required: false,
224
+ default: null
225
+ },
226
+ selectable: {
227
+ type: Boolean,
228
+ required: false,
229
+ default: true
230
+ },
231
+ singleSelect: {
232
+ type: Boolean,
233
+ required: false,
234
+ default: false
235
+ },
236
+ modelValue: {
237
+ type: Array as PropType<string[]>,
238
+ default: () => [],
239
+ required: false
240
+ }
241
+ },
242
+ emits: ["update:modelValue", "update:types"],
243
+ setup(props, { emit }) {
244
+ const { entities, fetching: fetchingDeviceExplorerElements, getMany: getManyDeviceExplorerElements } = useDeviceExplorerElements();
245
+ const { debounce } = useDebounce();
246
+
247
+ const search = ref("");
248
+
249
+ const deviceExplorerElements = computed((): DeviceExplorerElementInfos[] => {
250
+ let elements = entities.value.slice();
251
+ if (props.connectedOnly) {
252
+ elements = elements.filter(dee =>
253
+ dee.type === DeviceExplorerElementType.Group ||
254
+ (dee.connectivity != null && dee.connectivity.status != ConnectivityStatus.None)
255
+ );
256
+ }
257
+ return elements.sort((a, b) => a.type - b.type);
258
+ });
259
+
260
+ const isSelected = (id: string): boolean => {
261
+ return props.modelValue.includes(id);
262
+ };
263
+
264
+ const onUpdate = (value: string[]): void => {
265
+ const types = value.map(id => entities.value.find(dee => dee.id === id)?.type);
266
+ emit("update:types", types);
267
+
268
+ emit("update:modelValue", value);
269
+ }
270
+
271
+ const fetch = () => {
272
+ if (props.recursiveSearch && search.value) {
273
+ getManyDeviceExplorerElements({
274
+ ancestorId: props.parentId,
275
+ search: search.value
276
+ });
277
+ }
278
+ else {
279
+ getManyDeviceExplorerElements({
280
+ parentId: props.parentId,
281
+ root: props.root
282
+ });
283
+ }
284
+ }
285
+
286
+ // Delay to wait before fetching after a search change
287
+ const debounceFetch = (): void => debounce(fetch, 1000);
288
+
289
+ watch([() => props.parentId, () => props.root], (next, previous) => {
290
+ if ((!next && !previous) || !_.isEqual(next, previous)) {
291
+ fetch();
292
+ }
293
+ }, { immediate: true });
294
+
295
+ watch(search, (next, previous) => {
296
+ if (props.recursiveSearch && next !== previous) {
297
+ debounceFetch();
298
+ }
299
+ });
300
+
301
+ return {
302
+ fetchingDeviceExplorerElements,
303
+ DeviceExplorerElementType,
304
+ deviceExplorerElements,
305
+ ConnectivityStatus,
306
+ search,
307
+ isSelected,
308
+ onUpdate
309
+ };
310
+ }
311
+ });
312
+ </script>
@@ -0,0 +1,286 @@
1
+ <template>
2
+ <FSDataTable
3
+ defaultMode="iterator"
4
+ :items="items"
5
+ :item-to="$props.itemTo"
6
+ :loading="fetchingFolders || fetchingDashboardOrganisations || fetchingDashboardShallows"
7
+ :tableCode="$props.tableCode"
8
+ :modelValue="selecteds"
9
+ :selectable="$props.selectable"
10
+ @update:modelValue="onSelect"
11
+ v-bind="$attrs"
12
+ >
13
+ <template
14
+ v-for="(_, name) in $slots"
15
+ v-slot:[name]="slotData"
16
+ >
17
+ <slot
18
+ :name="name"
19
+ v-bind="slotData"
20
+ />
21
+ </template>
22
+ <template
23
+ #header.imageId-title
24
+ >
25
+ <FSIcon>
26
+ mdi-panorama-variant-outline
27
+ </FSIcon>
28
+ </template>
29
+ <template
30
+ #item.imageId="{ item }"
31
+ >
32
+ <FSImage
33
+ v-if="item.imageId"
34
+ height="32px"
35
+ width="32px"
36
+ :imageId="item.imageId"
37
+ :thumbnail="true"
38
+ />
39
+ </template>
40
+ <template
41
+ #item.icon="{ item }"
42
+ >
43
+ <FSIcon>
44
+ {{ item.icon }}
45
+ </FSIcon>
46
+ </template>
47
+ <template
48
+ #item.main="{ item }"
49
+ >
50
+ <FSIcon
51
+ v-if="item.id === mainOrganisationDashboardId"
52
+ >
53
+ mdi-account-group-outline
54
+ </FSIcon>
55
+ <FSIcon
56
+ v-if="item.id === mainUserDashboardId"
57
+ >
58
+ mdi-home
59
+ </FSIcon>
60
+ </template>
61
+ <template
62
+ #item.locked="{ item }"
63
+ >
64
+ <FSIconCheck
65
+ :value="item.locked"
66
+ />
67
+ </template>
68
+ <template
69
+ #item.tags="{ item }"
70
+ >
71
+ <FSTagGroup
72
+ variant="slide"
73
+ :showRemove="false"
74
+ :tags="item.tags"
75
+ />
76
+ </template>
77
+ <template
78
+ #item.tile="{ item, toggleSelect }"
79
+ >
80
+ <FSFolderTileUI
81
+ v-if="item.type == FoldersListType.Folder"
82
+ :bottomColor="item.colors"
83
+ v-bind="item"
84
+ :selectable="$props.selectable"
85
+ :modelValue="isSelected(item.id)"
86
+ @update:modelValue="toggleSelect(item)"
87
+ :to="$props.itemTo && $props.itemTo(item)"
88
+ />
89
+ <FSDashboardOrganisationTileUI
90
+ v-if="item.type == FoldersListType.Dashboard && item.dashboardType == DashboardType.Organisation"
91
+ :bottomColor="item.colors"
92
+ :selectable="$props.selectable"
93
+ :modelValue="isSelected(item.id)"
94
+ @update:modelValue="toggleSelect(item)"
95
+ :to="$props.itemTo && $props.itemTo(item)"
96
+ v-bind="item"
97
+ />
98
+ <FSDashboardShallowTileUI
99
+ v-if="item.type == FoldersListType.Dashboard && item.dashboardType == DashboardType.Shallow"
100
+ :bottomColor="item.colors"
101
+ :selectable="$props.selectable"
102
+ :modelValue="isSelected(item.id)"
103
+ @update:modelValue="toggleSelect(item)"
104
+ :to="$props.itemTo && $props.itemTo(item)"
105
+ v-bind="item"
106
+ />
107
+ </template>
108
+ </FSDataTable>
109
+ </template>
110
+
111
+ <script lang="ts">
112
+ import _ from "lodash";
113
+ import type { RouteLocation } from "vue-router";
114
+ import { computed, defineComponent, onMounted, type PropType, ref, watch } from "vue";
115
+
116
+ import { useOrganisation } from "@dative-gpi/foundation-shared-services/composables";
117
+ import { useDashboardOrganisations, useFolders, useDashboardShallows, useAppOrganisationId, useCurrentUserOrganisation } from "@dative-gpi/foundation-core-services/composables";
118
+
119
+ import { DashboardType } from "@dative-gpi/foundation-shared-domain/enums";
120
+ import { FoldersListType, type FoldersListItem } from "@dative-gpi/foundation-core-components/utils";
121
+ import type { FolderFilters, DashboardOrganisationFilters, DashboardShallowFilters, DashboardInfos } from "@dative-gpi/foundation-core-domain/models";
122
+
123
+ import FSIcon from "@dative-gpi/foundation-shared-components/components/FSIcon.vue";
124
+ import FSImage from "@dative-gpi/foundation-shared-components/components/FSImage.vue";
125
+ import FSTagGroup from "@dative-gpi/foundation-shared-components/components/FSTagGroup.vue";
126
+ import FSIconCheck from "@dative-gpi/foundation-shared-components/components/FSIconCheck.vue";
127
+ import FSFolderTileUI from "@dative-gpi/foundation-shared-components/components/tiles/FSFolderTileUI.vue";
128
+ import FSDashboardShallowTileUI from "@dative-gpi/foundation-shared-components/components/tiles/FSDashboardShallowTileUI.vue";
129
+ import FSDashboardOrganisationTileUI from "@dative-gpi/foundation-shared-components/components/tiles/FSDashboardOrganisationTileUI.vue";
130
+
131
+ import FSDataTable from "../lists/FSDataTable.vue";
132
+
133
+ export default defineComponent({
134
+ name: "FSBaseFoldersExplorer",
135
+ components: {
136
+ FSDashboardOrganisationTileUI,
137
+ FSDashboardShallowTileUI,
138
+ FSFolderTileUI,
139
+ FSDataTable,
140
+ FSIconCheck,
141
+ FSTagGroup,
142
+ FSImage,
143
+ FSIcon
144
+ },
145
+ props: {
146
+ foldersFilters: {
147
+ type: Object as PropType<FolderFilters>,
148
+ default: undefined,
149
+ required: false
150
+ },
151
+ dashboardOrganisationsFilters: {
152
+ type: Object as PropType<DashboardOrganisationFilters>,
153
+ default: undefined,
154
+ required: false
155
+ },
156
+ dashboardShallowsFilters: {
157
+ type: Object as PropType<DashboardShallowFilters>,
158
+ default: undefined,
159
+ required: false
160
+ },
161
+ modelValue: {
162
+ type: Array as PropType<string[]>,
163
+ required: false,
164
+ default: () => []
165
+ },
166
+ itemTo: {
167
+ type: Function as PropType<(item: DashboardInfos) => Partial<RouteLocation>>,
168
+ required: false
169
+ },
170
+ tableCode: {
171
+ type: String,
172
+ required: true
173
+ },
174
+ selectable: {
175
+ type: Boolean,
176
+ required: false,
177
+ default: true
178
+ }
179
+ },
180
+ emits: ["update", "update:modelValue", "update:type", "update:dashboard-type"],
181
+ setup(props, { emit }) {
182
+
183
+ const { fetch: fetchUserOrganisation, entity: userOrganisation } = useCurrentUserOrganisation();
184
+ const { entity: organisation, get: getOrganisation } = useOrganisation();
185
+ const { organisationId } = useAppOrganisationId();
186
+
187
+ const { entities: dashboardOrganisations, fetching: fetchingDashboardOrganisations, getMany: getManyDashboardOrganisations } = useDashboardOrganisations();
188
+ const { entities: dashboardShallows, fetching: fetchingDashboardShallows, getMany: getManyDashboardShallows } = useDashboardShallows();
189
+ const { entities: folders, fetching: fetchingFolders, getMany: getManyFolders } = useFolders();
190
+
191
+ const selecteds = ref<string[]>([]);
192
+
193
+ const mainUserDashboardId = computed(() => {
194
+ return userOrganisation.value?.mainDashboardId;
195
+ });
196
+
197
+ const mainOrganisationDashboardId = computed(() => {
198
+ return organisation.value?.mainDashboardId;
199
+ });
200
+
201
+ const items = computed((): FoldersListItem[] => {
202
+ return [
203
+ ...folders.value.map(g => ({
204
+ ...g,
205
+ type: FoldersListType.Folder,
206
+ dashboardType: DashboardType.None
207
+ })) as FoldersListItem[],
208
+ ..._.sortBy([
209
+ ...dashboardOrganisations.value.map(d => ({
210
+ ...d,
211
+ type: FoldersListType.Dashboard,
212
+ dashboardType: DashboardType.Organisation
213
+ })) as FoldersListItem[],
214
+ ...dashboardShallows.value.map(d => ({
215
+ ...d,
216
+ type: FoldersListType.Dashboard,
217
+ dashboardType: DashboardType.Shallow
218
+ })) as FoldersListItem[]
219
+ ], d => d.label)
220
+ ]
221
+ })
222
+
223
+ const onSelect = (values: string[]) => {
224
+ selecteds.value = values;
225
+ const selectedItems = items.value.filter(i => selecteds.value!.includes(i.id));
226
+ const newDashboardType = selectedItems.map(i => i.dashboardType);
227
+ const newModelValue = selectedItems.map(i => i.id);
228
+ const newType = selectedItems.map(i => i.type);
229
+ emit("update:dashboard-type", newDashboardType);
230
+ emit("update:modelValue", newModelValue);
231
+ emit("update:type", newType);
232
+ emit("update", { dashboardType: newDashboardType, modelValue: newModelValue, type: newType });
233
+ };
234
+
235
+ const isSelected = (id: string) => {
236
+ return selecteds.value?.includes(id);
237
+ };
238
+
239
+ onMounted(() => {
240
+ fetchUserOrganisation();
241
+ })
242
+
243
+ watch(() => organisationId.value, () => {
244
+ if (organisationId.value) {
245
+ getOrganisation(organisationId.value);
246
+ }
247
+ }, { immediate: true });
248
+
249
+ watch(() => props.foldersFilters, (next, previous) => {
250
+ if ((!next && !previous) || !_.isEqual(next, previous)) {
251
+ getManyFolders(props.foldersFilters, f => f.parentId == props.foldersFilters?.parentId);
252
+ }
253
+ }, { immediate: true });
254
+
255
+ watch(() => props.dashboardOrganisationsFilters, (next, previous) => {
256
+ if ((!next && !previous) || !_.isEqual(next, previous)) {
257
+ getManyDashboardOrganisations(props.dashboardOrganisationsFilters, f => f.folderId == props.foldersFilters?.parentId);
258
+ }
259
+ }, { immediate: true });
260
+
261
+ watch(() => props.dashboardShallowsFilters, (next, previous) => {
262
+ if ((!next && !previous) || !_.isEqual(next, previous)) {
263
+ getManyDashboardShallows(props.dashboardShallowsFilters, f => f.folderId == props.foldersFilters?.parentId);
264
+ }
265
+ }, { immediate: true });
266
+
267
+ watch(() => props.modelValue, (next) => {
268
+ selecteds.value = next;
269
+ }, { immediate: true });
270
+
271
+ return {
272
+ fetchingDashboardOrganisations,
273
+ fetchingDashboardShallows,
274
+ fetchingFolders,
275
+ mainOrganisationDashboardId,
276
+ mainUserDashboardId,
277
+ selecteds,
278
+ items,
279
+ onSelect,
280
+ isSelected,
281
+ FoldersListType,
282
+ DashboardType
283
+ };
284
+ }
285
+ });
286
+ </script>
@@ -1,10 +1,11 @@
1
1
  <template>
2
2
  <FSLoadDataTable
3
- v-if="!initialized || gettingUserOrganisationTable"
3
+ v-if="($props.tableCode && !initialized) || gettingUserOrganisationTable || !table"
4
4
  />
5
5
  <FSDataTableUI
6
6
  v-else
7
7
  @update:rowsPerPage="table.rowsPerPage = $event"
8
+ @update:showFilters="table.showFilters = $event"
8
9
  @update:filters="table.filters = $event"
9
10
  @update:headers="table.headers = $event"
10
11
  @update:sortBy="table.sortBy = $event"
@@ -29,6 +30,7 @@ import { computed, defineComponent, onUnmounted, type PropType, watch } from "vu
29
30
 
30
31
  import { useUserOrganisationTable, useUpdateUserOrganisationTable, useDataTables } from "@dative-gpi/foundation-core-services/composables";
31
32
  import { useDebounce, useTables } from "@dative-gpi/foundation-shared-components/composables";
33
+ import { type FSDataTableColumn } from "@dative-gpi/foundation-shared-components/models";
32
34
 
33
35
  import FSLoadDataTable from "@dative-gpi/foundation-shared-components/components/lists/FSLoadDataTable.vue";
34
36
  import FSDataTableUI from "@dative-gpi/foundation-shared-components/components/lists/FSDataTableUI.vue";
@@ -40,22 +42,28 @@ export default defineComponent({
40
42
  FSDataTableUI
41
43
  },
42
44
  props: {
45
+ defaultMode: {
46
+ type: String as PropType<"table" | "iterator">,
47
+ required: false,
48
+ default: "table"
49
+ },
43
50
  tableCode: {
44
- type: String,
45
- required: true
51
+ type: String as PropType<string | null>,
52
+ required: false,
53
+ default: null
46
54
  },
47
55
  debounceTime: {
48
56
  type: Number,
49
57
  required: false,
50
58
  default: 1000
51
59
  },
52
- customSorts: {
53
- type: Object as PropType<{ [key: string]: any }>,
60
+ extraHeaders: {
61
+ type: Array as PropType<FSDataTableColumn[]>,
54
62
  required: false,
55
- default: () => ({})
63
+ default: () => []
56
64
  },
57
- customSortRaws: {
58
- type: Object as PropType<{ [key: string]: any }>,
65
+ headersOptions: {
66
+ type: Object as PropType<{ [key: string]: Partial<FSDataTableColumn> }>,
59
67
  required: false,
60
68
  default: () => ({})
61
69
  }
@@ -67,7 +75,7 @@ export default defineComponent({
67
75
  const { getTable, setTable } = useTables();
68
76
  const { debounce, cancel } = useDebounce();
69
77
 
70
- const computedTable = computed(() => computeTable(props.customSorts, props.customSortRaws));
78
+ const computedTable = computed(() => computeTable(props.headersOptions, props.defaultMode, props.extraHeaders));
71
79
 
72
80
  onUnmounted(() => {
73
81
  cancel();
@@ -75,23 +83,17 @@ export default defineComponent({
75
83
  });
76
84
 
77
85
  const update = () => {
78
- updateTable(
79
- updateUserOrganisationTable,
80
- setTable,
81
- props.tableCode
82
- );
86
+ if (props.tableCode) {
87
+ updateTable(updateUserOrganisationTable, setTable, props.tableCode, props.defaultMode);
88
+ }
83
89
  }
84
90
 
85
91
  watch(() => props.tableCode, async (): Promise<void> => {
86
- onTableCodeChange(
87
- getUserOrganisationTable,
88
- getTable,
89
- props.tableCode
90
- );
92
+ onTableCodeChange(getUserOrganisationTable, getTable, props.tableCode, props.defaultMode);
91
93
  }, { immediate: true });
92
94
 
93
- watch(() => table.value, () => {
94
- if (table.value && initialized.value) {
95
+ watch(() => (table.value ? { ...table.value } : null), (_, former) => {
96
+ if (table.value && former && initialized.value) {
95
97
  debounce(update, props.debounceTime);
96
98
  }
97
99
  }, { deep: true });