@dative-gpi/foundation-core-components 0.0.229 → 0.1.68

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 (84) hide show
  1. package/components/autocompletes/FSAutocompleteChart.vue +46 -53
  2. package/components/autocompletes/FSAutocompleteDashboard.vue +46 -53
  3. package/components/autocompletes/FSAutocompleteDashboardOrganisation.vue +24 -39
  4. package/components/autocompletes/FSAutocompleteDataCategory.vue +46 -38
  5. package/components/autocompletes/FSAutocompleteDataDefinition.vue +19 -39
  6. package/components/autocompletes/FSAutocompleteGroup.vue +17 -38
  7. package/components/autocompletes/FSAutocompleteLocation.vue +17 -38
  8. package/components/autocompletes/FSAutocompleteManufacturer.vue +57 -2
  9. package/components/autocompletes/FSAutocompleteModel.vue +58 -3
  10. package/components/autocompletes/FSAutocompleteOrganisationType.vue +17 -0
  11. package/components/autocompletes/FSAutocompleteRole.vue +46 -53
  12. package/components/autocompletes/FSAutocompleteServiceAccountRoleOrganisation.vue +99 -0
  13. package/components/autocompletes/FSAutocompleteUserOrganisation.vue +24 -57
  14. package/components/customProperties/FSMetaField.vue +5 -6
  15. package/components/customProperties/FSMetaFormContent.vue +4 -5
  16. package/components/customProperties/FSMetaGrid.vue +3 -4
  17. package/components/customProperties/FSMetaHistory.vue +16 -15
  18. package/components/customProperties/FSMetaValue.vue +67 -36
  19. package/components/customProperties/helpers.ts +5 -4
  20. package/components/entities/FSBaseEntitiesList.vue +50 -0
  21. package/components/entities/FSDialogSelectEntities.vue +76 -0
  22. package/components/entities/FSEntityField.vue +149 -0
  23. package/components/entities/FSSelectEntitiesList.vue +192 -0
  24. package/components/entities/FSSimpleEntitiesList.vue +100 -0
  25. package/components/explorers/FSBaseFoldersExplorer.vue +258 -0
  26. package/components/lists/FSDataTable.vue +4 -8
  27. package/components/lists/alerts/FSBaseAlertsList.vue +357 -0
  28. package/components/lists/alerts/FSButtonAcknowledgeAlert.vue +101 -0
  29. package/components/lists/authTokens/FSBaseAuthTokensList.vue +78 -0
  30. package/components/lists/chartOrganisationTypes/FSBaseChartOrganisationTypesList.vue +159 -0
  31. package/components/lists/chartOrganisations/FSBaseChartOrganisationsList.vue +159 -0
  32. package/components/lists/charts/FSBaseChartsList.vue +218 -0
  33. package/components/lists/comments/FSBaseCommentsList.vue +127 -0
  34. package/components/lists/dashboardOrganisationTypes/FSBaseDashboardOrganisationTypesList.vue +164 -0
  35. package/components/lists/dashboards/FSBaseDashboardsList.vue +222 -0
  36. package/components/lists/dashboards/FSSimpleDashboardsList.vue +63 -0
  37. package/components/lists/dataCategories/FSBaseDataCategoriesList.vue +154 -0
  38. package/components/lists/dataDefinitions/FSBaseDataDefinitionsList.vue +128 -0
  39. package/components/lists/deviceOrganisations/FSBaseDeviceOrganisationsList.vue +354 -0
  40. package/components/lists/deviceOrganisations/FSSimpleDeviceOrganisationsList.vue +44 -0
  41. package/components/lists/folders/FSBaseFoldersList.vue +116 -0
  42. package/components/lists/folders/FSSimpleFoldersList.vue +44 -0
  43. package/components/lists/groups/FSBaseGroupsList.vue +133 -0
  44. package/components/lists/groups/FSSimpleGroupsList.vue +44 -0
  45. package/components/lists/locations/FSBaseLocationsList.vue +115 -0
  46. package/components/lists/locations/FSSimpleLocationsList.vue +44 -0
  47. package/components/lists/models/FSBaseModelsList.vue +152 -0
  48. package/components/lists/models/FSSimpleModelsList.vue +44 -0
  49. package/components/lists/roleOrganisationTypes/FSBaseRoleOrganisationTypesList.vue +127 -0
  50. package/components/lists/roleOrganisations/FSBaseRoleOrganisationsList.vue +127 -0
  51. package/components/lists/scenarioOrganisationTypes/FSBaseScenarioOrganisationTypesList.vue +120 -0
  52. package/components/lists/scenarioOrganisations/FSBaseScenarioOrganisationsList.vue +107 -0
  53. package/components/lists/scenarios/FSBaseScenariosList.vue +206 -0
  54. package/components/lists/serviceAccountOrganisations/FSBaseServiceAccountOrganisationsList.vue +153 -0
  55. package/components/lists/serviceAccountRoleOrganisations/FSBaseServiceAccountRoleOrganisations.vue +127 -0
  56. package/components/lists/userOrganisations/FSBaseUserOrganisationsList.vue +169 -0
  57. package/components/lists/userOrganisations/FSSimpleUserOrganisationsList.vue +45 -0
  58. package/components/selects/FSAggregationSelector.vue +5 -5
  59. package/components/selects/FSAxisTypeSelector.vue +1 -1
  60. package/components/selects/FSDisplayAsSelector.vue +5 -5
  61. package/components/selects/FSFilterTypeSelector.vue +2 -2
  62. package/components/selects/FSHeatmapRuleSelector.vue +5 -5
  63. package/components/selects/FSOperationOnSelector.vue +5 -5
  64. package/components/selects/FSPlanningTypeSelector.vue +6 -5
  65. package/components/selects/FSPlotPerSelector.vue +5 -5
  66. package/components/selects/{FSSelectSelectedEntities.vue → FSSelectEntityType.vue} +12 -12
  67. package/components/selects/FSSerieTypeSelector.vue +5 -5
  68. package/components/tiles/FSDeviceOrganisationTile.vue +9 -2
  69. package/components/tiles/FSLocationTile.vue +65 -0
  70. package/components/tiles/FSServiceAccountOrganisationTile.vue +68 -0
  71. package/components/tiles/FSUserOrganisationTile.vue +0 -2
  72. package/components/treeviews/FSTreeViewFolder.vue +15 -3
  73. package/components/treeviews/FSTreeViewGroup.vue +15 -3
  74. package/package.json +7 -7
  75. package/utils/charts.ts +2 -1
  76. package/utils/dashboards.ts +31 -4
  77. package/utils/index.ts +2 -1
  78. package/utils/permissions.ts +80 -0
  79. package/utils/roles.ts +2 -3
  80. package/utils/tables.ts +41 -0
  81. package/utils/users.ts +4 -1
  82. package/components/selects/FSDataCategorySelector.vue +0 -62
  83. package/components/selects/FSDataDefinitionSelector.vue +0 -66
  84. package/components/selects/FSModelSelector.vue +0 -56
@@ -0,0 +1,357 @@
1
+ <template>
2
+ <FSDataTable
3
+ rowGap="6px"
4
+ :rowColor="criticityColor"
5
+ :itemTo="$props.itemTo"
6
+ :items="alertsOrdered"
7
+ :loading="fetchingAlerts"
8
+ :tableCode="$props.tableCode"
9
+ :modelValue="$props.modelValue"
10
+ @update:modelValue="$emit('update:modelValue', $event)"
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
+ #toolbar
24
+ >
25
+ <FSButtonCheckbox
26
+ :label="$tr('page.alerts.not-acknowledged-only', 'Not acknowledged only')"
27
+ :color="ColorEnum.Warning"
28
+ v-model="innerNotTreatedOnly"
29
+ />
30
+ <FSButtonCheckbox
31
+ :label="$tr('page.alerts.hide-pending', 'Hide pending')"
32
+ :color="ColorEnum.Light"
33
+ variant="full"
34
+ v-model="innerHidePending"
35
+ />
36
+ <FSRow
37
+ align="center-right"
38
+ >
39
+ <FSRow
40
+ width="hug"
41
+ >
42
+ <FSTermField
43
+ variant="default"
44
+ :editable="!innerNotTreatedOnly"
45
+ v-model:startDate="startDate"
46
+ v-model:endDate="endDate"
47
+ />
48
+ </FSRow>
49
+ </FSRow>
50
+ </template>
51
+ <template
52
+ #item.criticity="{ item }"
53
+ >
54
+ <FSRow
55
+ align="center-left"
56
+ gap="2px"
57
+ >
58
+ <FSIcon
59
+ :color="AlertTools.criticityColor(item.criticity)"
60
+ >
61
+ {{ AlertTools.criticityIcon(item.criticity) }}
62
+ </FSIcon>
63
+ <FSSpan>
64
+ {{ AlertTools.criticityLabel(item.criticity) }}
65
+ </FSSpan>
66
+ </FSRow>
67
+ </template>
68
+ <template
69
+ #item.icon="{ item }"
70
+ >
71
+ <FSIcon>
72
+ {{ item.icon }}
73
+ </FSIcon>
74
+ </template>
75
+ <template
76
+ #item.tags="{ item }"
77
+ >
78
+ <FSTagGroup
79
+ variant="slide"
80
+ :editable="false"
81
+ :tags="item.tags"
82
+ />
83
+ </template>
84
+ <template
85
+ #item.groupByValues="{ item }"
86
+ >
87
+ <FSTagGroup
88
+ variant="slide"
89
+ :tags="item.groupByValues.map((gbv: any) => `${gbv.label}: ${gbv.value}`)"
90
+ :editable="false"
91
+ />
92
+ </template>
93
+ <template
94
+ #item.deviceOrganisationImageId="{ item }"
95
+ >
96
+ <FSImage
97
+ v-if="item.deviceOrganisationImageId != null"
98
+ width="32px"
99
+ height="32px"
100
+ :imageId="item.deviceOrganisationImageId"
101
+ />
102
+ </template>
103
+ <template
104
+ #item.acknowledged="{ item }"
105
+ >
106
+ <FSSpan
107
+ v-if="item.acknowledged"
108
+ font="text-overline"
109
+ >
110
+ {{ $tr('entity.alert.acknowledged', 'Acknowledged') }}
111
+ </FSSpan>
112
+ <FSButtonAcknowledgeAlert
113
+ v-else-if="!item.acknowledged && $props.allowAcknowledge"
114
+ :alertId="item.id"
115
+ />
116
+ <FSSpan
117
+ v-else
118
+ font="text-overline"
119
+ >
120
+ {{ $tr('entity.alert.not-acknowledged', 'Not acknowledged') }}
121
+ </FSSpan>
122
+ </template>
123
+ <template
124
+ #item.acknowledgingUserImageId="{ item }"
125
+ >
126
+ <FSImage
127
+ v-if="item.acknowledged && item.acknowledgingUserImageId != null"
128
+ width="32px"
129
+ height="32px"
130
+ :imageId="item.acknowledgingUserImageId"
131
+ />
132
+ </template>
133
+ <template
134
+ #item.acknowledgingTimestamp="{ item }"
135
+ >
136
+ <FSSpan
137
+ font="text-overline"
138
+ >
139
+ {{ epochToShortTimeFormat(item.acknowledgingTimestamp) }}
140
+ </FSSpan>
141
+ </template>
142
+ <template
143
+ #item.history="{ item }"
144
+ >
145
+ <FSTagGroup
146
+ variant="slide"
147
+ :tags="item.history.map((h: any) => AlertTools.statusLabel(h.status))"
148
+ :editable="false"
149
+ />
150
+ </template>
151
+ <template
152
+ #item.initialState="{ item }"
153
+ >
154
+ <FSSpan
155
+ font="text-overline"
156
+ >
157
+ {{ AlertTools.statusLabel(item.initialState.status) }}
158
+ </FSSpan>
159
+ </template>
160
+ <template
161
+ #item.triggerSourceTimestamp="{ item }"
162
+ >
163
+ <FSSpan
164
+ font="text-overline"
165
+ >
166
+ {{ epochToShortTimeFormat(item.triggerSourceTimestamp) }}
167
+ </FSSpan>
168
+ </template>
169
+ <template
170
+ #item.triggerEnqueuedTimestamp="{ item }"
171
+ >
172
+ <FSSpan
173
+ font="text-overline"
174
+ >
175
+ {{ epochToShortTimeFormat(item.triggerEnqueuedTimestamp) }}
176
+ </FSSpan>
177
+ </template>
178
+ <template
179
+ #item.triggerProcessedTimestamp="{ item }"
180
+ >
181
+ <FSSpan
182
+ font="text-overline"
183
+ >
184
+ {{ epochToShortTimeFormat(item.triggerProcessedTimestamp) }}
185
+ </FSSpan>
186
+ </template>
187
+ <template
188
+ #item.lastState="{ item }"
189
+ >
190
+ <FSSpan
191
+ font="text-overline"
192
+ >
193
+ {{ AlertTools.statusLabel(item.lastState.status) }}
194
+ </FSSpan>
195
+ </template>
196
+ <template
197
+ #item.currentSourceTimestamp="{ item }"
198
+ >
199
+ <FSSpan
200
+ font="text-overline"
201
+ >
202
+ {{ epochToShortTimeFormat(item.currentSourceTimestamp) }}
203
+ </FSSpan>
204
+ </template>
205
+ <template
206
+ #item.currentEnqueuedTimestamp="{ item }"
207
+ >
208
+ <FSSpan
209
+ font="text-overline"
210
+ >
211
+ {{ epochToShortTimeFormat(item.currentEnqueuedTimestamp) }}
212
+ </FSSpan>
213
+ </template>
214
+ <template
215
+ #item.currentProcessedTimestamp="{ item }"
216
+ >
217
+ <FSSpan
218
+ font="text-overline"
219
+ >
220
+ {{ epochToShortTimeFormat(item.currentProcessedTimestamp) }}
221
+ </FSSpan>
222
+ </template>
223
+ </FSDataTable>
224
+ </template>
225
+
226
+ <script lang="ts">
227
+ import type { PropType} from "vue";
228
+ import type { RouteLocation } from "vue-router";
229
+ import { computed, defineComponent, ref, watch } from "vue";
230
+ import _ from "lodash";
231
+
232
+ import type { AlertFilters, AlertInfos } from "@dative-gpi/foundation-core-domain/models";
233
+ import { useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
234
+ import { useAlerts } from "@dative-gpi/foundation-core-services/composables";
235
+ import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
236
+ import { AlertStatus } from "@dative-gpi/foundation-shared-domain/enums";
237
+
238
+ import { AlertTools } from "@dative-gpi/foundation-shared-components/tools";
239
+
240
+ import FSDataTable from "../FSDataTable.vue";
241
+ import FSButtonAcknowledgeAlert from "./FSButtonAcknowledgeAlert.vue";
242
+ import FSRow from "@dative-gpi/foundation-shared-components/components/FSRow.vue";
243
+ import FSSpan from "@dative-gpi/foundation-shared-components/components/FSSpan.vue";
244
+ import FSIcon from "@dative-gpi/foundation-shared-components/components/FSIcon.vue";
245
+ import FSImage from "@dative-gpi/foundation-shared-components/components/FSImage.vue";
246
+ import FSTagGroup from "@dative-gpi/foundation-shared-components/components/FSTagGroup.vue";
247
+ import FSTermField from "@dative-gpi/foundation-shared-components/components/fields/FSTermField.vue";
248
+ import FSButtonCheckbox from "@dative-gpi/foundation-shared-components/components/buttons/FSButtonCheckbox.vue";
249
+
250
+ export default defineComponent({
251
+ name: "FSBaseAlertsList",
252
+ components: {
253
+ FSButtonAcknowledgeAlert,
254
+ FSButtonCheckbox,
255
+ FSDataTable,
256
+ FSIcon,
257
+ FSImage,
258
+ FSRow,
259
+ FSSpan,
260
+ FSTagGroup,
261
+ FSTermField,
262
+ },
263
+ props: {
264
+ alertFilters: {
265
+ type: Object as PropType<AlertFilters>,
266
+ required: false,
267
+ default: null
268
+ },
269
+ notAcknowledged:{
270
+ type: Boolean,
271
+ required: false,
272
+ },
273
+ hidePending:{
274
+ type: Boolean,
275
+ required: false,
276
+ },
277
+ modelValue: {
278
+ type: Array as PropType<string[]>,
279
+ required: false,
280
+ default: () => []
281
+ },
282
+ allowAcknowledge: {
283
+ type: Boolean,
284
+ required: false,
285
+ default: false
286
+ },
287
+ tableCode: {
288
+ type: String,
289
+ required: true
290
+ },
291
+ itemTo: {
292
+ type: Function as PropType<(item: AlertInfos) => Partial<RouteLocation>>,
293
+ required: false
294
+ }
295
+ },
296
+ emits: ["update:modelValue"],
297
+ setup(props) {
298
+ const { getMany: getManyAlerts, entities: alerts, fetching : fetchingAlerts } = useAlerts();
299
+ const { epochToShortTimeFormat } = useDateFormat();
300
+
301
+ const innerNotTreatedOnly = ref<boolean | undefined>(props.notAcknowledged);
302
+ const innerHidePending = ref<boolean | undefined>(props.hidePending);
303
+ const startDate = ref<string>("now - 1w");
304
+ const endDate = ref<string>("now");
305
+
306
+
307
+ const criticityColor = (row: any) => {
308
+ return AlertTools.criticityColor(row.criticity);
309
+ };
310
+
311
+ const alertsOrdered = computed(() => {
312
+ const als = [...alerts.value]
313
+ return als.sort((a: AlertInfos, b: AlertInfos) => {
314
+ return (a.acknowledged === b.acknowledged) ?
315
+ +b.currentSourceTimestamp! - +a.currentSourceTimestamp! : a.acknowledged ? 1 : -1
316
+ });
317
+ });
318
+
319
+ watch(() => [props.alertFilters, innerNotTreatedOnly.value,startDate.value, endDate.value,innerHidePending.value], (next, previous) => {
320
+ if (!_.isEqual(next, previous)) {
321
+ if(innerNotTreatedOnly.value){
322
+ getManyAlerts({
323
+ ...props.alertFilters,
324
+ acknowledged: false,
325
+ statuses: [AlertStatus.Unresolved, AlertStatus.Triggered],
326
+ });
327
+ }
328
+ else{
329
+ getManyAlerts({
330
+ ...props.alertFilters,
331
+ statuses: innerHidePending.value ?
332
+ [AlertStatus.Unresolved, AlertStatus.Resolved, AlertStatus.Triggered] : undefined,
333
+ startDate: startDate.value,
334
+ endDate: endDate.value
335
+ }); // TODO, gérer les conditions pour que les alertes s'affichent ici notamment lorsqu'elles sont acquittées
336
+ // la FilterFactory gère pas ces conditions correctement
337
+ }
338
+
339
+ }
340
+ }, { immediate: true });
341
+
342
+
343
+ return {
344
+ innerNotTreatedOnly,
345
+ AlertTools,
346
+ ColorEnum,
347
+ alertsOrdered,
348
+ fetchingAlerts,
349
+ startDate,
350
+ endDate,
351
+ innerHidePending,
352
+ epochToShortTimeFormat,
353
+ criticityColor
354
+ };
355
+ }
356
+ });
357
+ </script>
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <FSButton
3
+ prependIcon="mdi-checkbox-blank-outline"
4
+ :label="$tr('page.alert.acknowledge', 'Acknowledge')"
5
+ @click="dialog = true"
6
+ />
7
+ <FSDialogSubmit
8
+ :title="$tr('page.alert.acknowledge', 'Acknowledge')"
9
+ :load="acknowledgingAlert"
10
+ @click:submitButton="onAcknowledge"
11
+ v-model="dialog"
12
+ >
13
+ <template
14
+ #body
15
+ >
16
+ <FSCol
17
+ gap="16px"
18
+ >
19
+ <FSRow>
20
+ <FSIcon
21
+ :color="ColorEnum.Warning"
22
+ >
23
+ mdi-alert-outline
24
+ </FSIcon>
25
+ <FSRow
26
+ gap="2px"
27
+ >
28
+ <FSSpan>
29
+ {{ $tr("page.alert.acknowledge-warning", "Do you want to acknowledge this alert?") }}
30
+ </FSSpan>
31
+ </FSRow>
32
+ </FSRow>
33
+ <FSSpan>
34
+ {{ $tr("page.alert.acknowledge-final-warning", "This action is definitive") }}
35
+ </FSSpan>
36
+ <FSErrorToast
37
+ v-if="error"
38
+ :errorCode="error"
39
+ />
40
+ </FSCol>
41
+ </template>
42
+ </FSDialogSubmit>
43
+ </template>
44
+
45
+ <script lang="ts">
46
+ import { defineComponent, ref } from "vue";
47
+
48
+ import { useAcknowledgeAlert } from "@dative-gpi/foundation-core-services/composables";
49
+ import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
50
+ import FSCol from "@dative-gpi/foundation-shared-components/components/FSCol.vue";
51
+ import FSDialogSubmit from "@dative-gpi/foundation-shared-components/components/FSDialogSubmit.vue";
52
+ import FSSpan from "@dative-gpi/foundation-shared-components/components/FSSpan.vue";
53
+ import FSErrorToast from "@dative-gpi/foundation-shared-components/components/FSErrorToast.vue";
54
+ import FSRow from "@dative-gpi/foundation-shared-components/components/FSRow.vue";
55
+ import FSButton from "@dative-gpi/foundation-shared-components/components/FSButton.vue";
56
+ import FSIcon from "@dative-gpi/foundation-shared-components/components/FSIcon.vue";
57
+
58
+ export default defineComponent({
59
+ name: "FSButtonAcknowledgeAlert",
60
+ components: {
61
+ FSButton,
62
+ FSCol,
63
+ FSDialogSubmit,
64
+ FSErrorToast,
65
+ FSIcon,
66
+ FSRow,
67
+ FSSpan,
68
+ },
69
+ props: {
70
+ alertId: {
71
+ type: String,
72
+ required: true
73
+ }
74
+ },
75
+ setup(props) {
76
+ const { fetch: acknowledgeAlert, fetching: acknowledgingAlert } = useAcknowledgeAlert();
77
+
78
+ const error = ref<string | null>(null);
79
+ const dialog = ref(false);
80
+
81
+ const onAcknowledge = async (): Promise<void> => {
82
+ try {
83
+ error.value = null;
84
+ await acknowledgeAlert(props.alertId);
85
+ dialog.value = false;
86
+ }
87
+ catch (exception: any) {
88
+ error.value = exception.response.data;
89
+ }
90
+ };
91
+
92
+ return {
93
+ acknowledgingAlert,
94
+ ColorEnum,
95
+ dialog,
96
+ error,
97
+ onAcknowledge
98
+ };
99
+ }
100
+ })
101
+ </script>
@@ -0,0 +1,78 @@
1
+ <template>
2
+ <FSDataTable
3
+ :items="authTokens"
4
+ :loading="fetchingAuthTokens"
5
+ :tableCode="$props.tableCode"
6
+ v-bind="$attrs"
7
+ >
8
+ <template
9
+ v-for="(_, name) in $slots"
10
+ v-slot:[name]="slotData"
11
+ >
12
+ <slot
13
+ :name="name"
14
+ v-bind="slotData"
15
+ />
16
+ </template>
17
+ <template
18
+ #item.creationDate="{item}"
19
+ >
20
+ <FSText>
21
+ {{ epochToLongTimeFormat(item.creationDate) }}
22
+ </FSText>
23
+ </template>
24
+ <template
25
+ #item.dateMax="{item}"
26
+ >
27
+ <FSText>
28
+ {{ epochToLongTimeFormat(item.dateMax) }}
29
+ </FSText>
30
+ </template>
31
+ </FSDataTable>
32
+ </template>
33
+
34
+ <script lang="ts">
35
+ import { defineComponent, type PropType, watch } from "vue";
36
+ import _ from "lodash";
37
+
38
+ import { useDateFormat, useAuthTokens } from "@dative-gpi/foundation-shared-services/composables";
39
+ import { type AuthTokenFilters } from "@dative-gpi/foundation-shared-domain/models";
40
+
41
+ import FSDataTable from "../FSDataTable.vue";
42
+ import FSText from "@dative-gpi/foundation-shared-components/components/FSText.vue";
43
+
44
+ export default defineComponent({
45
+ name: "FSBaseAuthTokensList",
46
+ components: {
47
+ FSDataTable,
48
+ FSText
49
+ },
50
+ props: {
51
+ authTokensFilters: {
52
+ type: Object as PropType<AuthTokenFilters | null>,
53
+ required: false,
54
+ default: null
55
+ },
56
+ tableCode: {
57
+ type: String,
58
+ required: true
59
+ }
60
+ },
61
+ setup(props) {
62
+ const { getMany: fetchAuthTokens, entities: authTokens, fetching: fetchingAuthTokens } = useAuthTokens();
63
+ const { epochToLongTimeFormat } = useDateFormat();
64
+
65
+ watch(() => props.authTokensFilters, (next, previous) => {
66
+ if ((!next && !previous) || !_.isEqual(next, previous)) {
67
+ fetchAuthTokens(props.authTokensFilters ?? undefined);
68
+ }
69
+ }, { immediate: true });
70
+
71
+ return {
72
+ authTokens,
73
+ fetchingAuthTokens,
74
+ epochToLongTimeFormat
75
+ };
76
+ }
77
+ });
78
+ </script>
@@ -0,0 +1,159 @@
1
+ <template>
2
+ <FSDataTable
3
+ :items="chartOrganisationTypes"
4
+ :itemTo="$props.itemTo"
5
+ :loading="fetchingChartOrganisationTypes"
6
+ :tableCode="$props.tableCode"
7
+ :modelValue="$props.modelValue"
8
+ @update:modelValue="$emit('update:modelValue', $event)"
9
+ v-bind="$attrs"
10
+ >
11
+ <template
12
+ v-for="(_, name) in $slots"
13
+ v-slot:[name]="slotData"
14
+ >
15
+ <slot
16
+ :name="name"
17
+ v-bind="slotData"
18
+ />
19
+ </template>
20
+ <template
21
+ #header.imageId-title
22
+ >
23
+ <FSIcon>
24
+ mdi-panorama-variant-outline
25
+ </FSIcon>
26
+ </template>
27
+ <template
28
+ #item.icon="{ item }"
29
+ >
30
+ <FSIcon>
31
+ {{ item.icon }}
32
+ </FSIcon>
33
+ </template>
34
+ <template
35
+ #item.imageId="{ item }"
36
+ >
37
+ <FSImage
38
+ v-if="item.imageId"
39
+ height="32px"
40
+ width="32px"
41
+ :imageId="item.imageId"
42
+ />
43
+ </template>
44
+ <template
45
+ #item.tags="{ item }"
46
+ >
47
+ <FSTagGroup
48
+ variant="slide"
49
+ :editable="false"
50
+ :tags="item.tags"
51
+ />
52
+ </template>
53
+ <template
54
+ #item.modelsLabels="{ item }"
55
+ >
56
+ <FSTagGroup
57
+ :editable="false"
58
+ :tags="item.modelsLabels.map((d: any) => d.label)"
59
+ />
60
+ </template>
61
+ <template
62
+ #item.tile="{item}"
63
+ >
64
+ <FSChartTileUI
65
+ :label="item.label"
66
+ :category-label="item.chartCategoryLabel"
67
+ :icon="item.icon"
68
+ :imageId="item.imageId"
69
+ :type="item.chartType"
70
+ :to="$props.itemTo && $props.itemTo(item)"
71
+ />
72
+ </template>
73
+ </FSDataTable>
74
+ </template>
75
+
76
+ <script lang="ts">
77
+ import _ from "lodash";
78
+ import { defineComponent, type PropType, watch } from "vue";
79
+ import type { RouteLocation } from "vue-router";
80
+
81
+ import {ColorEnum} from "@dative-gpi/foundation-shared-components/models";
82
+
83
+ import type { ChartOrganisationFilters, ChartOrganisationTypeInfos } from "@dative-gpi/foundation-core-domain/models";
84
+ import { PlotPer } from "@dative-gpi/foundation-shared-domain/enums";
85
+
86
+ import { useChartOrganisationTypes } from "@dative-gpi/foundation-core-services/composables";
87
+
88
+ import FSChartTileUI from "@dative-gpi/foundation-shared-components/components/tiles/FSChartTileUI.vue";
89
+ import FSDataTable from "../FSDataTable.vue";
90
+ import FSTagGroup from "@dative-gpi/foundation-shared-components/components/FSTagGroup.vue";
91
+ import FSImage from "@dative-gpi/foundation-shared-components/components/FSImage.vue";
92
+ import FSIcon from "@dative-gpi/foundation-shared-components/components/FSIcon.vue";
93
+
94
+ export default defineComponent({
95
+ name: "FSBaseChartOrganisationTypesList",
96
+ components: {
97
+ FSChartTileUI,
98
+ FSDataTable,
99
+ FSTagGroup,
100
+ FSImage,
101
+ FSIcon
102
+ },
103
+ props: {
104
+ modelValue: {
105
+ type: Array as PropType<string[]>,
106
+ default: () => [],
107
+ required: false
108
+ },
109
+ chartOrganisationFilters: {
110
+ type: Object as PropType<ChartOrganisationFilters>,
111
+ required: false,
112
+ default: null
113
+ },
114
+ plotPer: {
115
+ type: Number as PropType<PlotPer>,
116
+ required: false,
117
+ default: PlotPer.None
118
+ },
119
+ tableCode: {
120
+ type: String,
121
+ required: true
122
+ },
123
+ itemTo: {
124
+ type: Function as PropType<(item: ChartOrganisationTypeInfos) => Partial<RouteLocation>>,
125
+ required: false
126
+ }
127
+ },
128
+ emits: ["update:modelValue"],
129
+ setup(props) {
130
+
131
+ const { entities: chartOrganisationTypes, fetching: fetchingChartOrganisationTypes, getMany: getManyChartOrganisationTypes } = useChartOrganisationTypes();
132
+
133
+ const isSelected = (id: string): boolean => {
134
+ return props.modelValue.includes(id);
135
+ };
136
+
137
+ const fetch = () =>{
138
+ if(props.plotPer === PlotPer.None) {
139
+ getManyChartOrganisationTypes(props.chartOrganisationFilters);
140
+ } else {
141
+ getManyChartOrganisationTypes({ ...props.chartOrganisationFilters, plotPer: props.plotPer });
142
+ }
143
+ };
144
+
145
+ watch(() => [props.chartOrganisationFilters, props.plotPer], (next, previous) => {
146
+ if ((!next && !previous) || !_.isEqual(next, previous)) {
147
+ fetch();
148
+ }
149
+ }, { immediate: true });
150
+
151
+ return {
152
+ ColorEnum,
153
+ fetchingChartOrganisationTypes,
154
+ chartOrganisationTypes,
155
+ isSelected
156
+ };
157
+ }
158
+ });
159
+ </script>