@dative-gpi/foundation-core-components 1.0.69 → 1.0.71-groupings-2

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 +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/FSAutocompleteGrouping.vue +105 -0
  8. package/components/autocompletes/FSAutocompleteLocation.vue +6 -0
  9. package/components/autocompletes/FSAutocompleteManufacturer.vue +8 -0
  10. package/components/autocompletes/FSAutocompleteModel.vue +9 -1
  11. package/components/autocompletes/FSAutocompleteOrganisationType.vue +7 -1
  12. package/components/autocompletes/FSAutocompleteRole.vue +14 -6
  13. package/components/autocompletes/FSAutocompleteServiceAccountRoleOrganisation.vue +7 -1
  14. package/components/autocompletes/FSAutocompleteUserOrganisation.vue +9 -1
  15. package/components/customProperties/FSMetaField.vue +35 -40
  16. package/components/customProperties/FSMetaFormContent.vue +4 -3
  17. package/components/customProperties/FSMetaHistory.vue +2 -2
  18. package/components/customProperties/helpers.ts +57 -165
  19. package/components/entities/FSBaseEntitiesList.vue +12 -2
  20. package/components/entities/FSDialogSelectEntities.vue +19 -2
  21. package/components/entities/FSEntityField.vue +68 -13
  22. package/components/entities/FSSelectEntitiesList.vue +40 -7
  23. package/components/explorers/FSBaseDevicesExplorer.vue +322 -0
  24. package/components/explorers/FSBaseFoldersExplorer.vue +99 -20
  25. package/components/fields/FSMagicConfigField.vue +171 -0
  26. package/components/fields/FSMagicField.vue +214 -0
  27. package/components/lists/FSDataTable.vue +22 -16
  28. package/components/lists/alerts/FSBaseAlertsList.vue +96 -106
  29. package/components/lists/alerts/FSButtonAcknowledgeAlert.vue +4 -4
  30. package/components/lists/authTokens/FSBaseAuthTokensList.vue +6 -4
  31. package/components/lists/chartOrganisationTypes/FSBaseChartOrganisationTypesList.vue +97 -34
  32. package/components/lists/chartOrganisations/FSBaseChartOrganisationsList.vue +98 -34
  33. package/components/lists/charts/FSBaseChartsList.vue +153 -64
  34. package/components/lists/comments/FSBaseCommentsList.vue +39 -23
  35. package/components/lists/connectivityScenarios/FSBaseConnectivityScenariosList.vue +128 -0
  36. package/components/lists/dashboardOrganisationTypes/FSBaseDashboardOrganisationTypesList.vue +41 -8
  37. package/components/lists/dashboards/FSBaseDashboardsList.vue +76 -16
  38. package/components/lists/dashboards/FSSimpleDashboardsList.vue +33 -7
  39. package/components/lists/dataCategories/FSBaseDataCategoriesList.vue +8 -6
  40. package/components/lists/dataDefinitions/FSBaseDataDefinitionsList.vue +8 -5
  41. package/components/lists/deviceOrganisations/FSBaseDeviceOrganisationsList.vue +70 -44
  42. package/components/lists/folders/FSBaseFoldersList.vue +27 -15
  43. package/components/lists/groupings/FSBaseGroupingsList.vue +125 -0
  44. package/components/lists/groups/FSBaseGroupsList.vue +13 -9
  45. package/components/lists/locations/FSBaseLocationsList.vue +17 -13
  46. package/components/lists/models/FSBaseModelsList.vue +10 -5
  47. package/components/lists/playlists/FSSimplePlaylistsList.vue +44 -0
  48. package/components/lists/roleOrganisationTypes/FSBaseRoleOrganisationTypesList.vue +6 -5
  49. package/components/lists/roleOrganisations/FSBaseRoleOrganisationsList.vue +6 -5
  50. package/components/lists/scenarioOrganisationTypes/FSBaseScenarioOrganisationTypesList.vue +45 -8
  51. package/components/lists/scenarioOrganisations/FSBaseScenarioOrganisationsList.vue +45 -7
  52. package/components/lists/scenarios/FSBaseScenariosList.vue +121 -86
  53. package/components/lists/serviceAccountOrganisations/FSBaseServiceAccountOrganisationsList.vue +10 -7
  54. package/components/lists/serviceAccountRoleOrganisations/{FSBaseServiceAccountRoleOrganisations.vue → FSBaseServiceAccountRoleOrganisationsList.vue} +6 -5
  55. package/components/lists/userOrganisations/FSBaseUserOrganisationsList.vue +10 -7
  56. package/components/lists/userOrganisations/FSChipUserOrganisationsList.vue +61 -0
  57. package/components/selects/FSPlotPerSelector.vue +94 -16
  58. package/components/tiles/FSChartTile.vue +71 -0
  59. package/components/tiles/FSDashboardOrganisationTile.vue +3 -3
  60. package/components/tiles/FSDashboardOrganisationTypeTile.vue +3 -3
  61. package/components/tiles/FSDashboardShallowTile.vue +3 -3
  62. package/components/tiles/FSDeviceOrganisationTile.vue +3 -3
  63. package/components/tiles/FSFolderTile.vue +7 -5
  64. package/components/tiles/FSGroupTile.vue +3 -3
  65. package/components/tiles/FSLocationTile.vue +5 -3
  66. package/components/tiles/FSModelTile.vue +64 -0
  67. package/components/tiles/FSServiceAccountOrganisationTile.vue +3 -3
  68. package/components/tiles/FSUserOrganisationTile.vue +3 -3
  69. package/components/treeviews/FSTreeViewGroup.vue +7 -1
  70. package/package.json +9 -9
  71. package/utils/dashboards.ts +4 -4
  72. package/utils/index.ts +0 -1
  73. package/utils/roles.ts +3 -3
  74. package/utils/users.ts +3 -3
  75. package/components/selects/FSAggregationSelector.vue +0 -51
  76. package/components/selects/FSAxisTypeSelector.vue +0 -48
  77. package/components/selects/FSDisplayAsSelector.vue +0 -52
  78. package/components/selects/FSFilterTypeSelector.vue +0 -53
  79. package/components/selects/FSHeatmapRuleSelector.vue +0 -52
  80. package/components/selects/FSOperationOnSelector.vue +0 -51
  81. package/components/selects/FSPlanningTypeSelector.vue +0 -51
  82. package/components/selects/FSSelectEntityType.vue +0 -59
  83. package/components/selects/FSSerieTypeSelector.vue +0 -51
  84. package/utils/charts.ts +0 -137
@@ -0,0 +1,171 @@
1
+ <template>
2
+ <FSRow
3
+ class="fs-magic-config-field"
4
+ >
5
+ <component
6
+ v-if="$props.type"
7
+ class="fs-magic-config-field-value"
8
+ :is="get($props.type)"
9
+ :label="$tr('ui.common.value', 'Value')"
10
+ :disabled="$props.disabled"
11
+ :required="true"
12
+ :rules="rules"
13
+ :modelValue="valueToInput"
14
+ @update:modelValue="inputToValue"
15
+ />
16
+ <FSRow
17
+ gap="24px"
18
+ >
19
+ <FSTranslateField
20
+ :label="$tr('entity.common.label', 'Label')"
21
+ :disabled="$props.disabled"
22
+ :modelValue="$props.labelDefault"
23
+ :translations="$props.translations"
24
+ @update:modelValue="$emit('update:labelDefault', $event)"
25
+ @update:translations="$emit('update:translations', $event)"
26
+ />
27
+ <FSRow
28
+ class="fs-magic-config-field-actions"
29
+ width="hug"
30
+ :wrap="false"
31
+ >
32
+ <FSButtonRemoveIcon
33
+ @click="$emit('click:remove')"
34
+ />
35
+ <FSButtonAddIcon
36
+ @click="$emit('click:add')"
37
+ />
38
+ </FSRow>
39
+ </FSRow>
40
+ </FSRow>
41
+ </template>
42
+
43
+ <script lang="ts">
44
+ import { computed, defineComponent, type PropType } from "vue";
45
+
46
+ import { DateRules, IconRules, NumberRules, TextRules, TimeRules, TimeStepRules, AutocompleteRules } from "@dative-gpi/foundation-shared-components/models";
47
+ import { useMagicFieldProvider } from "@dative-gpi/foundation-core-services/composables";
48
+ import { MagicFieldType } from "@dative-gpi/foundation-shared-domain/enums";
49
+
50
+ import FSButtonRemoveIcon from "@dative-gpi/foundation-shared-components/components/buttons/FSButtonRemoveIcon.vue";
51
+ import FSButtonAddIcon from "@dative-gpi/foundation-shared-components/components/buttons/FSButtonAddIcon.vue";
52
+ import FSTranslateField from "@dative-gpi/foundation-shared-components/components/fields/FSTranslateField.vue";
53
+ import FSRow from "@dative-gpi/foundation-shared-components/components/FSRow.vue";
54
+
55
+ export default defineComponent({
56
+ name: "FSMagicConfigField",
57
+ components: {
58
+ FSButtonRemoveIcon,
59
+ FSTranslateField,
60
+ FSButtonAddIcon,
61
+ FSRow
62
+ },
63
+ props: {
64
+ type: {
65
+ type: Number as PropType<MagicFieldType>,
66
+ required: false,
67
+ default: MagicFieldType.TextField
68
+ },
69
+ labelDefault: {
70
+ type: String as PropType<string | null>,
71
+ required: false,
72
+ default: null
73
+ },
74
+ modelValue: {
75
+ type: String as PropType<string | null>,
76
+ required: false,
77
+ default: null
78
+ },
79
+ translations: {
80
+ type: Array as PropType<{ languageCode: string; label: string }[]>,
81
+ required: false,
82
+ default: () => []
83
+ },
84
+ disabled: {
85
+ type: Boolean,
86
+ required: false,
87
+ default: false
88
+ }
89
+ },
90
+ emits: ["click:remove", "click:add", "update:modelValue", "update:labelDefault", "update:translations"],
91
+ setup(props, { emit }) {
92
+ const { get } = useMagicFieldProvider();
93
+
94
+ const rules = computed((): Function[] => {
95
+ switch (props.type) {
96
+ case MagicFieldType.NumberField:
97
+ return [NumberRules.required()];
98
+ case MagicFieldType.TextField:
99
+ return [TextRules.required()];
100
+ case MagicFieldType.DateTimeField:
101
+ return [DateRules.required()];
102
+ case MagicFieldType.IconField:
103
+ return [IconRules.required()];
104
+ case MagicFieldType.TimeField:
105
+ return [TimeRules.required()];
106
+ case MagicFieldType.TimeStepField:
107
+ return [TimeStepRules.required()];
108
+ case MagicFieldType.PlotPerField:
109
+ return [AutocompleteRules.required()];
110
+ }
111
+ return [];
112
+ });
113
+
114
+ const valueToInput = computed((): any => {
115
+ if (!props.modelValue) {
116
+ return null;
117
+ }
118
+
119
+ switch (props.type) {
120
+ case MagicFieldType.NumberField:
121
+ case MagicFieldType.DateTimeField:
122
+ case MagicFieldType.TimeField:
123
+ if (isNaN(parseFloat(props.modelValue))) {
124
+ return null;
125
+ }
126
+ return parseFloat(props.modelValue);
127
+ case MagicFieldType.Switch:
128
+ return props.modelValue === "true";
129
+ case MagicFieldType.TimeStepField:
130
+ return JSON.parse(props.modelValue);
131
+ case MagicFieldType.PlotPerField:
132
+ return parseInt(props.modelValue);
133
+ default:
134
+ return props.modelValue;
135
+ }
136
+ });
137
+
138
+ const inputToValue = (value: any) => {
139
+ if (!value) {
140
+ emit("update:modelValue", null);
141
+ }
142
+
143
+ switch (props.type) {
144
+ case MagicFieldType.NumberField:
145
+ case MagicFieldType.Switch:
146
+ case MagicFieldType.DateTimeField:
147
+ case MagicFieldType.TimeField:
148
+ emit("update:modelValue", value.toString());
149
+ break;
150
+ case MagicFieldType.TimeStepField:
151
+ emit("update:modelValue", JSON.stringify(value));
152
+ break;
153
+ case MagicFieldType.PlotPerField:
154
+ emit("update:modelValue", value.toString());
155
+ break;
156
+ default:
157
+ emit("update:modelValue", value);
158
+ break;
159
+ }
160
+ };
161
+
162
+ return {
163
+ MagicFieldType,
164
+ valueToInput,
165
+ rules,
166
+ inputToValue,
167
+ get
168
+ };
169
+ },
170
+ });
171
+ </script>
@@ -0,0 +1,214 @@
1
+ <template>
2
+ <component
3
+ v-if="!$props.useOnlyAllowedValues"
4
+ :is="get($props.type)"
5
+ :modelValue="valueToInput"
6
+ @update:modelValue="inputToValue"
7
+ v-bind="{ ...$attrs, ...bindedProps }"
8
+ />
9
+ <FSSelectField
10
+ v-else
11
+ itemValue="value"
12
+ :items="items"
13
+ :modelValue="$props.modelValue"
14
+ @update:modelValue="$emit('update:modelValue', $event)"
15
+ v-bind="$attrs"
16
+ >
17
+ <template
18
+ v-if="$props.type === MagicFieldType.IconField"
19
+ #selection="{ item }"
20
+ >
21
+ <FSRow
22
+ align="center-center"
23
+ :wrap="false"
24
+ >
25
+ <FSIcon
26
+ v-if="item.raw.value"
27
+ >
28
+ {{ item.raw.value }}
29
+ </FSIcon>
30
+ <FSSpan
31
+ v-if="item.raw.value !== item.raw.label"
32
+ >
33
+ {{ item.raw.label }}
34
+ </FSSpan>
35
+ </FSRow>
36
+ </template>
37
+ <template
38
+ v-if="$props.type === MagicFieldType.IconField"
39
+ #item-label="{ item }"
40
+ >
41
+ <FSRow
42
+ align="center-center"
43
+ :wrap="false"
44
+ >
45
+ <FSIcon
46
+ v-if="item.raw.value"
47
+ >
48
+ {{ item.raw.value }}
49
+ </FSIcon>
50
+ <FSSpan
51
+ v-if="item.raw.value !== item.raw.label"
52
+ >
53
+ {{ item.raw.label }}
54
+ </FSSpan>
55
+ </FSRow>
56
+ </template>
57
+ </FSSelectField>
58
+ </template>
59
+
60
+ <script lang="ts">
61
+ import { computed, defineComponent, type PropType } from "vue";
62
+
63
+ import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
64
+
65
+ import { useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
66
+
67
+ import { useMagicFieldProvider } from "@dative-gpi/foundation-core-services/composables";
68
+ import { MagicFieldType } from "@dative-gpi/foundation-shared-domain/enums";
69
+ import { getTimeBestString, timeStepToString } from "@dative-gpi/foundation-shared-components/utils";
70
+
71
+ import FSSelectField from "@dative-gpi/foundation-shared-components/components/fields/FSSelectField.vue";
72
+ import FSIcon from "@dative-gpi/foundation-shared-components/components/FSIcon.vue";
73
+ import FSSpan from "@dative-gpi/foundation-shared-components/components/FSSpan.vue";
74
+ import FSRow from "@dative-gpi/foundation-shared-components/components/FSRow.vue";
75
+
76
+ export default defineComponent({
77
+ name: "FSMagicField",
78
+ components: {
79
+ FSSelectField,
80
+ FSIcon,
81
+ FSSpan,
82
+ FSRow
83
+ },
84
+ props: {
85
+ type: {
86
+ type: Number as PropType<MagicFieldType>,
87
+ required: false,
88
+ default: MagicFieldType.TextField
89
+ },
90
+ modelValue: {
91
+ type: String as PropType<string | null>,
92
+ required: false,
93
+ default: null
94
+ },
95
+ allowedValues: {
96
+ type: Array as PropType<{ value: string; label: string }[]>,
97
+ required: false,
98
+ default: () => []
99
+ },
100
+ useOnlyAllowedValues: {
101
+ type: Boolean,
102
+ required: false,
103
+ default: false
104
+ },
105
+ meta: {
106
+ type: Object as PropType<Record<string, any>>,
107
+ required: false,
108
+ default: () => ({})
109
+ }
110
+ },
111
+ emits: ["update:modelValue"],
112
+ setup(props, { emit }) {
113
+ const { epochToShortTimeFormat } = useDateFormat();
114
+ const { $tr } = useTranslationsProvider();
115
+ const { get } = useMagicFieldProvider();
116
+
117
+ const items = computed(() => props.allowedValues.map((av) => ({
118
+ value: av.value,
119
+ label: av.label || asString(av.value),
120
+ })));
121
+
122
+ const valueToInput = computed((): any => {
123
+ if (props.modelValue == null) {
124
+ return null;
125
+ }
126
+
127
+ switch (props.type) {
128
+ case MagicFieldType.NumberField:
129
+ case MagicFieldType.DateTimeField:
130
+ case MagicFieldType.TimeField:
131
+ if (isNaN(parseFloat(props.modelValue))) {
132
+ return null;
133
+ }
134
+ return parseFloat(props.modelValue);
135
+ case MagicFieldType.Switch:
136
+ return props.modelValue === "true";
137
+ case MagicFieldType.TimeStepField:
138
+ case MagicFieldType.PlotPerField:
139
+ return JSON.parse(props.modelValue);
140
+ default:
141
+ return props.modelValue;
142
+ }
143
+ });
144
+
145
+ const asString = (value: string): string | null => {
146
+ if (value == null) {
147
+ return "";
148
+ }
149
+
150
+ switch (props.type) {
151
+ case MagicFieldType.NumberField:
152
+ return value.toString();
153
+ case MagicFieldType.Switch:
154
+ if (value) {
155
+ return $tr("magic-field.true", "True");
156
+ }
157
+ return $tr("magic-field.false", "False");
158
+ case MagicFieldType.DateTimeField:
159
+ return epochToShortTimeFormat(parseFloat(value));
160
+ case MagicFieldType.TimeField:
161
+ return getTimeBestString(parseFloat(value));
162
+ case MagicFieldType.TimeStepField:
163
+ return timeStepToString(JSON.parse(value));
164
+ case MagicFieldType.PlotPerField:
165
+ return JSON.parse(value).plotPer;
166
+ default:
167
+ return value;
168
+ }
169
+ }
170
+
171
+ const inputToValue = (value: any) => {
172
+ if (value == null) {
173
+ emit("update:modelValue", null);
174
+ }
175
+
176
+ switch (props.type) {
177
+ case MagicFieldType.NumberField:
178
+ case MagicFieldType.Switch:
179
+ case MagicFieldType.DateTimeField:
180
+ case MagicFieldType.TimeField:
181
+ emit("update:modelValue", value.toString());
182
+ break;
183
+ case MagicFieldType.TimeStepField:
184
+ case MagicFieldType.PlotPerField:
185
+ emit("update:modelValue", JSON.stringify(value));
186
+ break;
187
+ default:
188
+ emit("update:modelValue", value);
189
+ break;
190
+ }
191
+ };
192
+
193
+ const bindedProps = computed(() => {
194
+ switch (props.type) {
195
+ case MagicFieldType.PlotPerField:
196
+ return {
197
+ showSelector: props.meta.showSelector ?? true
198
+ }
199
+ default:
200
+ return {};
201
+ }
202
+ });
203
+
204
+ return {
205
+ MagicFieldType,
206
+ valueToInput,
207
+ bindedProps,
208
+ items,
209
+ inputToValue,
210
+ get
211
+ };
212
+ },
213
+ });
214
+ </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"
@@ -41,15 +42,26 @@ export default defineComponent({
41
42
  FSDataTableUI
42
43
  },
43
44
  props: {
45
+ defaultMode: {
46
+ type: String as PropType<"table" | "iterator">,
47
+ required: false,
48
+ default: "table"
49
+ },
44
50
  tableCode: {
45
- type: String,
46
- required: true
51
+ type: String as PropType<string | null>,
52
+ required: false,
53
+ default: null
47
54
  },
48
55
  debounceTime: {
49
56
  type: Number,
50
57
  required: false,
51
58
  default: 1000
52
59
  },
60
+ extraHeaders: {
61
+ type: Array as PropType<FSDataTableColumn[]>,
62
+ required: false,
63
+ default: () => []
64
+ },
53
65
  headersOptions: {
54
66
  type: Object as PropType<{ [key: string]: Partial<FSDataTableColumn> }>,
55
67
  required: false,
@@ -63,7 +75,7 @@ export default defineComponent({
63
75
  const { getTable, setTable } = useTables();
64
76
  const { debounce, cancel } = useDebounce();
65
77
 
66
- const computedTable = computed(() => computeTable(props.headersOptions));
78
+ const computedTable = computed(() => computeTable(props.headersOptions, props.defaultMode, props.extraHeaders));
67
79
 
68
80
  onUnmounted(() => {
69
81
  cancel();
@@ -71,23 +83,17 @@ export default defineComponent({
71
83
  });
72
84
 
73
85
  const update = () => {
74
- updateTable(
75
- updateUserOrganisationTable,
76
- setTable,
77
- props.tableCode
78
- );
86
+ if (props.tableCode) {
87
+ updateTable(updateUserOrganisationTable, setTable, props.tableCode, props.defaultMode);
88
+ }
79
89
  }
80
90
 
81
91
  watch(() => props.tableCode, async (): Promise<void> => {
82
- onTableCodeChange(
83
- getUserOrganisationTable,
84
- getTable,
85
- props.tableCode
86
- );
92
+ onTableCodeChange(getUserOrganisationTable, getTable, props.tableCode, props.defaultMode);
87
93
  }, { immediate: true });
88
94
 
89
- watch(() => table.value, () => {
90
- if (table.value && initialized.value) {
95
+ watch(() => (table.value ? { ...table.value } : null), (_, former) => {
96
+ if (table.value && former && initialized.value) {
91
97
  debounce(update, props.debounceTime);
92
98
  }
93
99
  }, { deep: true });