@dative-gpi/foundation-shared-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 (228) hide show
  1. package/components/FSAccordionPanel.vue +8 -10
  2. package/components/FSBadge.vue +2 -4
  3. package/components/FSBreadcrumbs.vue +9 -10
  4. package/components/FSButton.vue +81 -31
  5. package/components/FSCalendar.vue +35 -33
  6. package/components/FSCalendarTwin.vue +77 -84
  7. package/components/FSCard.vue +29 -16
  8. package/components/FSCardPlaceholder.vue +1 -2
  9. package/components/FSCheckbox.vue +5 -7
  10. package/components/FSChip.vue +9 -11
  11. package/components/FSClickable.vue +67 -57
  12. package/components/FSClock.vue +4 -4
  13. package/components/FSCol.vue +2 -3
  14. package/components/FSColor.vue +13 -31
  15. package/components/FSColorIcon.vue +25 -9
  16. package/components/FSDialog.vue +1 -2
  17. package/components/FSDialogFormBody.vue +4 -4
  18. package/components/FSDialogMenu.vue +2 -4
  19. package/components/FSDialogMultiFormBody.vue +63 -50
  20. package/components/FSDialogRemove.vue +1 -0
  21. package/components/FSDialogSubmit.vue +5 -7
  22. package/components/FSDivider.vue +7 -9
  23. package/components/FSEditImage.vue +27 -274
  24. package/components/FSEditImageUI.vue +303 -0
  25. package/components/FSErrorToast.vue +3 -4
  26. package/components/FSFadeOut.vue +18 -13
  27. package/components/FSGrid.vue +6 -9
  28. package/components/FSGridMosaic.vue +1 -2
  29. package/components/FSIcon.vue +7 -8
  30. package/components/FSIconCard.vue +23 -30
  31. package/components/FSIconCheck.vue +1 -2
  32. package/components/FSImage.vue +21 -193
  33. package/components/FSImageCard.vue +2 -2
  34. package/components/FSImageUI.vue +212 -0
  35. package/components/FSLabel.vue +18 -20
  36. package/components/FSLink.vue +19 -21
  37. package/components/FSLoader.vue +10 -14
  38. package/components/FSOptionGroup.vue +58 -12
  39. package/components/FSPagination.vue +3 -5
  40. package/components/FSRadio.vue +5 -7
  41. package/components/FSRadioGroup.vue +2 -4
  42. package/components/FSRow.vue +3 -4
  43. package/components/FSSlideGroup.vue +15 -4
  44. package/components/FSSlider.vue +9 -11
  45. package/components/FSSpan.vue +11 -9
  46. package/components/FSSwitch.vue +65 -37
  47. package/components/FSTab.vue +2 -4
  48. package/components/FSTabs.vue +36 -16
  49. package/components/FSTag.vue +23 -14
  50. package/components/FSTagGroup.vue +3 -5
  51. package/components/FSText.vue +8 -12
  52. package/components/FSWindow.vue +11 -5
  53. package/components/FSWrapGroup.vue +15 -4
  54. package/components/agenda/FSAgenda.vue +204 -0
  55. package/components/agenda/FSAgendaDialogCalendar.vue +76 -0
  56. package/components/agenda/FSAgendaHeader.vue +190 -0
  57. package/components/agenda/FSAgendaHorizontalEvent.vue +162 -0
  58. package/components/agenda/FSAgendaHorizontalTimeLineMarker.vue +46 -0
  59. package/components/agenda/FSAgendaHoursCol.vue +103 -0
  60. package/components/agenda/FSAgendaHoursRow.vue +124 -0
  61. package/components/agenda/FSAgendaVerticalEvent.vue +160 -0
  62. package/components/agenda/FSAgendaVerticalTimeLineMarker.vue +46 -0
  63. package/components/agenda/FSDayAgenda.vue +200 -0
  64. package/components/agenda/FSMonthAgenda.vue +257 -0
  65. package/components/agenda/FSSelectAgendaMode.vue +54 -0
  66. package/components/agenda/FSWeekAgenda.vue +328 -0
  67. package/components/autocompletes/FSAutocompleteLanguage.vue +18 -39
  68. package/components/autocompletes/FSAutocompleteTimeZone.vue +20 -38
  69. package/components/buttons/FSButtonCancelMini.vue +1 -0
  70. package/components/buttons/FSButtonCopy.vue +28 -0
  71. package/components/buttons/FSButtonCopyIcon.vue +28 -0
  72. package/components/buttons/FSButtonCopyLabel.vue +27 -0
  73. package/components/buttons/FSButtonCopyMini.vue +28 -0
  74. package/components/buttons/FSButtonDragIcon.vue +27 -0
  75. package/components/buttons/FSButtonDuplicateMini.vue +1 -0
  76. package/components/buttons/FSButtonEditMini.vue +1 -0
  77. package/components/buttons/FSButtonFileMini.vue +1 -0
  78. package/components/buttons/FSButtonNextMini.vue +1 -0
  79. package/components/buttons/FSButtonPreviousMini.vue +1 -0
  80. package/components/buttons/FSButtonRedoMini.vue +1 -0
  81. package/components/buttons/FSButtonRemoveMini.vue +1 -0
  82. package/components/buttons/FSButtonSaveMini.vue +1 -0
  83. package/components/buttons/FSButtonSearchMini.vue +1 -0
  84. package/components/buttons/FSButtonUndoMini.vue +1 -0
  85. package/components/buttons/FSButtonUpdateMini.vue +1 -0
  86. package/components/buttons/FSButtonValidateMini.vue +1 -0
  87. package/components/deviceOrganisations/FSConnectivity.vue +11 -1
  88. package/components/deviceOrganisations/FSConnectivityCard.vue +20 -49
  89. package/components/deviceOrganisations/FSStatus.vue +11 -1
  90. package/components/deviceOrganisations/FSStatusCard.vue +40 -60
  91. package/components/deviceOrganisations/FSStatusesCarousel.vue +1 -0
  92. package/components/deviceOrganisations/FSStatusesRow.vue +10 -5
  93. package/components/deviceOrganisations/FSWorstAlert.vue +19 -13
  94. package/components/deviceOrganisations/FSWorstAlertCard.vue +36 -47
  95. package/components/fields/FSAutocompleteField.vue +501 -323
  96. package/components/fields/FSAutocompleteTag.vue +100 -0
  97. package/components/fields/FSBaseField.vue +26 -16
  98. package/components/fields/FSColorField.vue +63 -55
  99. package/components/fields/FSCommentField.vue +93 -0
  100. package/components/fields/FSDateField.vue +2 -2
  101. package/components/fields/FSDateRangeField.vue +2 -2
  102. package/components/fields/FSDateTimeField.vue +4 -3
  103. package/components/fields/FSDateTimeRangeField.vue +7 -6
  104. package/components/fields/FSEntityFieldUI.vue +271 -0
  105. package/components/fields/FSGradientField.vue +27 -33
  106. package/components/fields/FSIconField.vue +2 -3
  107. package/components/fields/FSMagicConfigField.vue +28 -19
  108. package/components/fields/FSMagicField.vue +25 -17
  109. package/components/fields/FSNumberField.vue +9 -7
  110. package/components/fields/FSPasswordField.vue +2 -3
  111. package/components/fields/FSRichTextField.vue +32 -5
  112. package/components/fields/FSSearchField.vue +2 -2
  113. package/components/fields/FSSelectField.vue +483 -251
  114. package/components/fields/FSTagField.vue +4 -6
  115. package/components/fields/FSTermField.vue +25 -13
  116. package/components/fields/FSTextArea.vue +18 -6
  117. package/components/fields/FSTextField.vue +13 -10
  118. package/components/fields/FSTimeField.vue +1 -1
  119. package/components/fields/FSTimeSlotField.vue +3 -4
  120. package/components/fields/FSTimeStepField.vue +157 -0
  121. package/components/fields/FSTranslateField.vue +3 -2
  122. package/components/fields/FSTranslateRichTextField.vue +4 -3
  123. package/components/fields/FSTranslateTextArea.vue +233 -0
  124. package/components/fields/FSTreeViewField.vue +7 -9
  125. package/components/fields/periodicField/FSPeriodicDailyField.vue +120 -0
  126. package/components/fields/periodicField/FSPeriodicField.vue +131 -0
  127. package/components/fields/periodicField/FSPeriodicMonthlyField.vue +222 -0
  128. package/components/fields/periodicField/FSPeriodicWeeklyField.vue +120 -0
  129. package/components/fields/periodicField/FSPeriodicYearlyField.vue +144 -0
  130. package/components/lists/FSDataIteratorItem.vue +8 -10
  131. package/components/lists/FSDataTableUI.vue +47 -39
  132. package/components/lists/FSFilterButton.vue +20 -22
  133. package/components/lists/FSHiddenButton.vue +10 -12
  134. package/components/lists/FSLoadDataTable.vue +4 -6
  135. package/components/lists/FSSimpleList.vue +229 -0
  136. package/components/map/FSMap.vue +256 -405
  137. package/components/map/FSMapFeatureGroup.vue +51 -0
  138. package/components/map/FSMapLayerButton.vue +6 -3
  139. package/components/map/FSMapMarker.vue +116 -0
  140. package/components/map/FSMapMarkerClusterGroup.vue +72 -0
  141. package/components/map/FSMapOverlay.vue +69 -83
  142. package/components/map/FSMapPolygon.vue +81 -0
  143. package/components/map/FSMapTileLayer.vue +50 -0
  144. package/components/map/keys.ts +4 -0
  145. package/components/selects/FSSelectAutoRefresh.vue +1 -1
  146. package/components/selects/FSSelectDashboardVariableType.vue +1 -1
  147. package/components/selects/FSSelectDateSetting.vue +3 -3
  148. package/components/selects/FSSelectDays.vue +1 -1
  149. package/components/selects/FSSelectListMode.vue +51 -0
  150. package/components/selects/FSSelectMonths.vue +67 -0
  151. package/components/tiles/FSChartTileUI.vue +116 -0
  152. package/components/tiles/FSCommentTileUI.vue +149 -0
  153. package/components/tiles/FSDashboardOrganisationTileUI.vue +6 -8
  154. package/components/tiles/FSDashboardOrganisationTypeTileUI.vue +6 -8
  155. package/components/tiles/FSDashboardShallowTileUI.vue +6 -8
  156. package/components/tiles/FSDeviceOrganisationTileUI.vue +30 -18
  157. package/components/tiles/FSFolderTileUI.vue +6 -6
  158. package/components/tiles/FSGroupTileUI.vue +31 -22
  159. package/components/tiles/FSLoadTile.vue +5 -7
  160. package/components/tiles/FSLocationTileUI.vue +157 -0
  161. package/components/tiles/FSModelTileUI.vue +18 -0
  162. package/components/tiles/FSServiceAccountOrganisationTileUI.vue +142 -0
  163. package/components/tiles/FSSimpleTileUI.vue +57 -36
  164. package/components/tiles/FSTile.vue +115 -55
  165. package/components/tiles/FSUserOrganisationTileUI.vue +25 -35
  166. package/components/toggleSets/FSToggleSetPosition.vue +1 -1
  167. package/components/views/FSEntityHeader.vue +343 -0
  168. package/components/views/FSEntityView.vue +163 -0
  169. package/components/views/FSListHeader.vue +83 -0
  170. package/components/views/FSListView.vue +83 -0
  171. package/components/views/FSSkeletonView.vue +100 -0
  172. package/composables/useAddress.ts +2 -2
  173. package/composables/useColors.ts +15 -5
  174. package/composables/useMagicFieldProvider.ts +7 -6
  175. package/composables/useSlots.ts +51 -28
  176. package/models/agenda.ts +9 -0
  177. package/models/deviceAlerts.ts +1 -1
  178. package/models/deviceConnectivities.ts +1 -1
  179. package/models/index.ts +1 -0
  180. package/models/magicFields.ts +1 -0
  181. package/models/map.ts +2 -2
  182. package/models/rules.ts +10 -5
  183. package/models/tables.ts +3 -1
  184. package/package.json +4 -4
  185. package/styles/components/fs_agenda.scss +32 -0
  186. package/styles/components/fs_agenda_event.scss +41 -0
  187. package/styles/components/fs_agenda_hours_col.scss +4 -0
  188. package/styles/components/fs_agenda_hours_row.scss +13 -0
  189. package/styles/components/fs_agenda_time_line_marker.scss +19 -0
  190. package/styles/components/fs_card.scss +0 -1
  191. package/styles/components/fs_clickable.scss +5 -3
  192. package/styles/components/fs_color_field.scss +1 -0
  193. package/styles/components/fs_data_table.scss +2 -0
  194. package/styles/components/fs_dialog.scss +11 -15
  195. package/styles/components/fs_edit_image.scss +8 -0
  196. package/styles/components/fs_fade_out.scss +2 -1
  197. package/styles/components/fs_filter_button.scss +1 -6
  198. package/styles/components/fs_gradient_field.scss +11 -11
  199. package/styles/components/fs_magic_config_field.scss +2 -2
  200. package/styles/components/fs_map.scss +36 -30
  201. package/styles/components/fs_option_group.scss +15 -5
  202. package/styles/components/fs_radio.scss +11 -0
  203. package/styles/components/fs_rich_text_field.scss +2 -1
  204. package/styles/components/fs_search_field.scss +3 -0
  205. package/styles/components/fs_select_date_settings.scss +3 -0
  206. package/styles/components/fs_slide_group.scss +5 -0
  207. package/styles/components/fs_span.scss +2 -1
  208. package/styles/components/fs_switch.scss +1 -0
  209. package/styles/components/fs_tabs.scss +9 -0
  210. package/styles/components/fs_text_area.scss +15 -1
  211. package/styles/components/fs_tile.scss +22 -6
  212. package/styles/components/fs_window.scss +5 -0
  213. package/styles/components/fs_wrap_group.scss +4 -0
  214. package/styles/components/index.scss +6 -1
  215. package/styles/globals/overrides.scss +22 -19
  216. package/styles/globals/text_fonts.scss +17 -55
  217. package/tools/alertsTools.ts +54 -0
  218. package/tools/chartsTools.ts +300 -0
  219. package/tools/index.ts +2 -0
  220. package/utils/badge.ts +9 -0
  221. package/utils/filter.ts +18 -0
  222. package/utils/index.ts +2 -0
  223. package/utils/leafletMarkers.ts +8 -2
  224. package/utils/statuses.ts +1 -1
  225. package/utils/time.ts +27 -1
  226. package/components/autocompletes/FSAutocompleteTag.vue +0 -138
  227. package/components/map/FSMapEditPointAddressOverlay.vue +0 -164
  228. package/styles/components/fs_map_overlay.scss +0 -38
@@ -0,0 +1,271 @@
1
+ <template>
2
+ <FSBaseField
3
+ :description="$props.description"
4
+ :hideHeader="$props.hideHeader"
5
+ :required="$props.required"
6
+ :editable="$props.editable"
7
+ :label="$props.label"
8
+ :messages="messages"
9
+ >
10
+ <FSCol
11
+ gap="12px"
12
+ >
13
+ <FSRow
14
+ :wrap="false"
15
+ >
16
+ <FSSelectField
17
+ :hideHeader="true"
18
+ :modelValue="$props.entityType"
19
+ @update:modelValue="$emit('update:entityType', $event)"
20
+ :items="actualEntityTypes"
21
+ :clearable="false"
22
+ />
23
+ <template
24
+ v-if="itemsCount > 0"
25
+ >
26
+ <FSButton
27
+ :label="$tr('ui.entity-field.edit', 'Edit')"
28
+ icon="mdi-pencil"
29
+ @click="$emit('click:select')"
30
+ />
31
+ </template>
32
+ <template
33
+ v-else
34
+ >
35
+ <FSButton
36
+ :label="$tr('ui.entity-field.select', 'Select')"
37
+ icon="mdi-plus-circle-multiple-outline"
38
+ @click="$emit('click:select')"
39
+ />
40
+ </template>
41
+ </FSRow>
42
+ <FSRow
43
+ v-if="$props.showCount"
44
+ >
45
+ <template
46
+ v-if="itemsCount > 0"
47
+ >
48
+ <FSColor
49
+ :color="ColorEnum.Primary"
50
+ :border="false"
51
+ width="100%"
52
+ >
53
+ <FSRow
54
+ padding="4px"
55
+ align="center-center"
56
+ >
57
+ <FSIcon
58
+ :icon="entityIcon"
59
+ />
60
+ <FSSpan
61
+ font="text-overline"
62
+ >
63
+ {{ $tr('ui.entity-field.selected', '{0} selected(s)', itemsCount) }}
64
+ </FSSpan>
65
+ </FSRow>
66
+ </FSColor>
67
+ </template>
68
+
69
+ <template
70
+ v-else
71
+ >
72
+ <FSColor
73
+ :color="ColorEnum.Light"
74
+ :border="false"
75
+ width="100%"
76
+ >
77
+ <FSRow
78
+ padding="4px"
79
+ align="center-center"
80
+ >
81
+ <FSIcon
82
+ :icon="entityIcon"
83
+ />
84
+ <FSSpan
85
+ font="text-overline"
86
+ >
87
+ {{ $tr('ui.entity-field.no-entity-selected', 'No entity selected') }}
88
+ </FSSpan>
89
+ </FSRow>
90
+ </FSColor>
91
+ </template>
92
+ </FSRow>
93
+
94
+ <FSFadeOut
95
+ v-if="$props.showEntities && itemsCount > 0"
96
+ :maxHeight="$props.listMaxHeight"
97
+ width="100%"
98
+ >
99
+ <slot
100
+ name="items"
101
+ />
102
+ </FSFadeOut>
103
+ </FSCol>
104
+ </FSBaseField>
105
+ </template>
106
+
107
+
108
+ <script lang="ts">
109
+ import { computed, defineComponent, type PropType } from "vue";
110
+
111
+ import { EntityType } from "@dative-gpi/foundation-shared-domain/enums";
112
+ import { ColorEnum } from "../../models";
113
+ import { useTranslations } from "@dative-gpi/bones-ui";
114
+
115
+ import FSRow from "../FSRow.vue";
116
+ import FSCol from "../FSCol.vue";
117
+ import FSBaseField from "./FSBaseField.vue";
118
+ import FSSelectField from "./FSSelectField.vue";
119
+ import FSButton from "../FSButton.vue";
120
+ import FSIcon from "../FSIcon.vue";
121
+ import FSColor from "../FSColor.vue";
122
+
123
+ export default defineComponent({
124
+ name: "FSEntityFieldUI",
125
+ components: {
126
+ FSBaseField,
127
+ FSSelectField,
128
+ FSButton,
129
+ FSIcon,
130
+ FSColor,
131
+ FSRow,
132
+ FSCol
133
+ },
134
+ props: {
135
+ label: {
136
+ type: String as PropType<string | null>,
137
+ required: false,
138
+ default: null
139
+ },
140
+ description: {
141
+ type: String as PropType<string | null>,
142
+ required: false,
143
+ default: null
144
+ },
145
+ itemsCount: {
146
+ type: Number,
147
+ required: false,
148
+ default: 0
149
+ },
150
+ hideHeader: {
151
+ type: Boolean,
152
+ required: false,
153
+ default: false
154
+ },
155
+ required: {
156
+ type: Boolean,
157
+ required: false,
158
+ default: false
159
+ },
160
+ rules: {
161
+ type: Array as PropType<any[]>,
162
+ required: false,
163
+ default: () => []
164
+ },
165
+ messages: {
166
+ type: Array as PropType<string[]>,
167
+ required: false,
168
+ default: null
169
+ },
170
+ editable: {
171
+ type: Boolean,
172
+ required: false,
173
+ default: true
174
+ },
175
+ entityType: {
176
+ type: Number as PropType<EntityType>,
177
+ required: true
178
+ },
179
+ allowedEntityTypes: {
180
+ type: Array as PropType<EntityType[]>,
181
+ required: false,
182
+ default: () => []
183
+ },
184
+ showEntities: {
185
+ type: Boolean,
186
+ required: false,
187
+ default: true
188
+ },
189
+ showCount: {
190
+ type: Boolean,
191
+ required: false,
192
+ default: true
193
+ },
194
+ listMaxHeight: {
195
+ type: String as PropType<string | null>,
196
+ required: false,
197
+ default: "220px"
198
+ }
199
+ },
200
+ emits: ["update:entityType", "click:select"],
201
+ setup(props) {
202
+ const { $tr } = useTranslations();
203
+
204
+ const actualEntityTypes = computed(() => {
205
+ const items = [
206
+ {
207
+ id: EntityType.Model,
208
+ label: $tr("ui.entity-type.models", "Models")
209
+ },
210
+ {
211
+ id: EntityType.Group,
212
+ label: $tr("ui.entity-type.groups", "Groups")
213
+ },
214
+ {
215
+ id: EntityType.Location,
216
+ label: $tr("ui.entity-type.locations", "Locations")
217
+ },
218
+ {
219
+ id: EntityType.Device,
220
+ label: $tr("ui.entity-type.devices", "Devices")
221
+ },
222
+ {
223
+ id: EntityType.User,
224
+ label: $tr("ui.entity-type.users", "Users")
225
+ },
226
+ {
227
+ id: EntityType.Dashboard,
228
+ label: $tr("ui.entity-type.dashboards", "Dashboards")
229
+ },
230
+ {
231
+ id: EntityType.Folder,
232
+ label: $tr("ui.entity-type.folders", "Folders")
233
+ }
234
+ ];
235
+
236
+ if(props.allowedEntityTypes.length) {
237
+ return items.filter(item => props.allowedEntityTypes.includes(item.id));
238
+ } else {
239
+ return items;
240
+ }
241
+ });
242
+
243
+ const entityIcon = computed(() => {
244
+ switch(props.entityType) {
245
+ case EntityType.Model:
246
+ return "mdi-cube";
247
+ case EntityType.Group:
248
+ return "mdi-account-group";
249
+ case EntityType.Location:
250
+ return "mdi-map-marker";
251
+ case EntityType.Device:
252
+ return "mdi-cellphone";
253
+ case EntityType.User:
254
+ return "mdi-account";
255
+ case EntityType.Dashboard:
256
+ return "mdi-view-dashboard";
257
+ case EntityType.Folder:
258
+ return "mdi-folder";
259
+ default:
260
+ return "mdi-cube";
261
+ }
262
+ });
263
+
264
+ return {
265
+ ColorEnum,
266
+ entityIcon,
267
+ actualEntityTypes
268
+ };
269
+ }
270
+ });
271
+ </script>
@@ -21,44 +21,25 @@
21
21
  />
22
22
  </FSRow>
23
23
  <FSSelectField
24
- class="fs-gradient-select-field"
25
- :clearable="false"
24
+ class="fs-gradient-field-select"
26
25
  :editable="$props.editable"
26
+ :clearable="false"
27
27
  :items="items"
28
- :modelValue="JSON.stringify($props.modelValue)"
29
- @update:modelValue="$emit('update:modelValue', presetGradients[$event])"
28
+ modelValue="custom"
29
+ @update:modelValue="$emit('update:modelValue', allGradients[$event])"
30
30
  >
31
31
  <template
32
- v-slot:selection="{ item }"
32
+ #item-prepend="{ item }"
33
33
  >
34
34
  <FSRow
35
35
  class="fs-gradient-field-preview"
36
- height="fill"
36
+ align="center-center"
37
+ height="12px"
37
38
  width="100%"
38
- :style="{ '--fs-gradient-field-background': `linear-gradient(to right, ${encodeGradientCssColors(JSON.parse(item.value))})` }"
39
- >
40
- <span />
41
- </FSRow>
42
- </template>
43
- <template
44
- v-slot:item="{ item, props }"
45
- >
46
- <v-list-item
47
- v-bind="props"
48
- >
49
- <template
50
- #title
51
- >
52
- <FSRow
53
- class="fs-gradient-field-preview"
54
- height="fill"
55
- width="100%"
56
- :style="{ '--fs-gradient-field-background': `linear-gradient(to right, ${encodeGradientCssColors(presetGradients[item.value])})` }"
57
- >
58
- <span />
59
- </FSRow>
60
- </template>
61
- </v-list-item>
39
+ :style="{
40
+ '--fs-gradient-field-background': `linear-gradient(to right, ${encodeGradientCssColors(allGradients[item.id])})`
41
+ }"
42
+ />
62
43
  </template>
63
44
  </FSSelectField>
64
45
  </FSBaseField>
@@ -66,7 +47,7 @@
66
47
  </template>
67
48
 
68
49
  <script lang="ts">
69
- import { type PropType, defineComponent } from "vue";
50
+ import { type PropType, defineComponent, computed } from "vue";
70
51
 
71
52
  import { groupedGradients } from "../../utils";
72
53
  import { useColors } from "../../composables";
@@ -127,14 +108,27 @@ export default defineComponent({
127
108
  const { getColors } = useColors();
128
109
 
129
110
  const presetGradients = groupedGradients[props.colorCount];
130
- const items = Object.keys(presetGradients)
111
+
112
+ const allGradients = computed<Record<string, string[]>>(() => {
113
+ return {
114
+ 'custom': [
115
+ ...props.modelValue
116
+ ],
117
+ ...presetGradients
118
+ }
119
+ });
120
+
121
+ const items = Object.keys(allGradients.value).map((key) => ({
122
+ id: key,
123
+ label: null
124
+ }));
131
125
 
132
126
  const encodeGradientCssColors = (colors: string[]) => {
133
127
  return colors.map((color) => getColors(color).base).join(", ");
134
128
  };
135
129
 
136
130
  return {
137
- presetGradients,
131
+ allGradients,
138
132
  items,
139
133
  encodeGradientCssColors
140
134
  };
@@ -48,8 +48,7 @@ import { computed, defineComponent, ref, watch } from "vue";
48
48
 
49
49
  import { Icons, sortByLevenshteinDistance } from "@dative-gpi/foundation-shared-components/utils";
50
50
  import { useColors, useRules } from "@dative-gpi/foundation-shared-components/composables";
51
- import type { ColorBase} from "@dative-gpi/foundation-shared-components/models";
52
- import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
51
+ import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
53
52
  import type { FSToggle } from "@dative-gpi/foundation-shared-components/models";
54
53
 
55
54
  import FSToggleSet from "../FSToggleSet.vue";
@@ -139,7 +138,7 @@ export default defineComponent({
139
138
  const toggleSetRef = ref<HTMLElement | null>(null);
140
139
  const innerValue = ref<string | null>(null);
141
140
 
142
- const style = computed((): { [key: string] : string | null | undefined } => {
141
+ const style = computed((): StyleValue => {
143
142
  if (!props.editable) {
144
143
  return {
145
144
  "--fs-icon-field-color": lights.dark
@@ -1,5 +1,7 @@
1
1
  <template>
2
- <FSRow>
2
+ <FSRow
3
+ class="fs-magic-config-field"
4
+ >
3
5
  <component
4
6
  class="fs-magic-config-field-value"
5
7
  :is="get($props.type)"
@@ -38,10 +40,9 @@
38
40
  </template>
39
41
 
40
42
  <script lang="ts">
41
- import type { PropType } from "vue";
42
- import { computed, defineComponent } from "vue";
43
+ import { computed, defineComponent, type PropType } from "vue";
43
44
 
44
- import { DateRules, IconRules, NumberRules, TextRules, TimeRules } from "../../models";
45
+ import { DateRules, IconRules, NumberRules, TextRules, TimeRules, TimeStepRules } from "../../models";
45
46
  import { useMagicFieldProvider } from "../../composables";
46
47
  import { MagicFieldType } from "../../models/magicFields";
47
48
 
@@ -69,7 +70,7 @@ export default defineComponent({
69
70
  required: false,
70
71
  default: null
71
72
  },
72
- value: {
73
+ modelValue: {
73
74
  type: String as PropType<string | null>,
74
75
  required: false,
75
76
  default: null
@@ -85,7 +86,7 @@ export default defineComponent({
85
86
  default: true
86
87
  }
87
88
  },
88
- emits: ["click:remove", "click:add", "update:value", "update:labelDefault", "update:translations"],
89
+ emits: ["click:remove", "click:add", "update:modelValue", "update:labelDefault", "update:translations"],
89
90
  setup(props, { emit }) {
90
91
  const { get } = useMagicFieldProvider();
91
92
 
@@ -101,43 +102,51 @@ export default defineComponent({
101
102
  return [IconRules.required()];
102
103
  case MagicFieldType.TimeField:
103
104
  return [TimeRules.required()];
105
+ case MagicFieldType.TimeStepField:
106
+ return [TimeStepRules.required()];
104
107
  }
105
108
  return [];
106
109
  });
107
110
 
108
111
  const valueToInput = computed((): any => {
112
+ if (!props.modelValue) {
113
+ return null;
114
+ }
115
+
109
116
  switch (props.type) {
110
117
  case MagicFieldType.NumberField:
111
118
  case MagicFieldType.DateTimeField:
112
119
  case MagicFieldType.TimeField:
113
- if (props.value == null || isNaN(parseFloat(props.value))) {
120
+ if (isNaN(parseFloat(props.modelValue))) {
114
121
  return null;
115
122
  }
116
- return parseFloat(props.value);
123
+ return parseFloat(props.modelValue);
117
124
  case MagicFieldType.Switch:
118
- if (props.value == null) {
119
- return null;
120
- }
121
- return props.value === "true";
125
+ return props.modelValue === "true";
126
+ case MagicFieldType.TimeStepField:
127
+ return JSON.parse(props.modelValue);
122
128
  default:
123
- return props.value;
129
+ return props.modelValue;
124
130
  }
125
131
  });
126
132
 
127
133
  const inputToValue = (value: any) => {
134
+ if (!value) {
135
+ emit("update:modelValue", null);
136
+ }
137
+
128
138
  switch (props.type) {
129
139
  case MagicFieldType.NumberField:
130
140
  case MagicFieldType.Switch:
131
141
  case MagicFieldType.DateTimeField:
132
142
  case MagicFieldType.TimeField:
133
- if (value == null) {
134
- emit("update:value", null);
135
- break;
136
- }
137
- emit("update:value", value.toString());
143
+ emit("update:modelValue", value.toString());
144
+ break;
145
+ case MagicFieldType.TimeStepField:
146
+ emit("update:modelValue", JSON.stringify(value));
138
147
  break;
139
148
  default:
140
- emit("update:value", value);
149
+ emit("update:modelValue", value);
141
150
  break;
142
151
  }
143
152
  };
@@ -58,16 +58,15 @@
58
58
  </template>
59
59
 
60
60
  <script lang="ts">
61
- import type { PropType } from "vue";
62
- import { computed, defineComponent } from "vue";
61
+ import { computed, defineComponent, type PropType } from "vue";
63
62
 
64
63
  import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
65
64
 
66
- import { useAppTimeZone } from "@dative-gpi/foundation-shared-services/composables";
65
+ import { useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
67
66
 
68
67
  import { useMagicFieldProvider } from "../../composables";
69
68
  import { MagicFieldType } from "../../models/magicFields";
70
- import { getTimeBestString } from "../../utils";
69
+ import { getTimeBestString, timeStepToString } from "../../utils";
71
70
 
72
71
  import FSSelectField from "./FSSelectField.vue";
73
72
  import FSIcon from "../FSIcon.vue";
@@ -106,7 +105,7 @@ export default defineComponent({
106
105
  },
107
106
  emits: ["update:modelValue"],
108
107
  setup(props, { emit }) {
109
- const { epochToShortTimeFormat } = useAppTimeZone();
108
+ const { epochToShortTimeFormat } = useDateFormat();
110
109
  const { $tr } = useTranslationsProvider();
111
110
  const { get } = useMagicFieldProvider();
112
111
 
@@ -116,28 +115,32 @@ export default defineComponent({
116
115
  })));
117
116
 
118
117
  const valueToInput = computed((): any => {
118
+ if (props.modelValue == null) {
119
+ return null;
120
+ }
121
+
119
122
  switch (props.type) {
120
123
  case MagicFieldType.NumberField:
121
124
  case MagicFieldType.DateTimeField:
122
125
  case MagicFieldType.TimeField:
123
- if (props.modelValue == null || isNaN(parseFloat(props.modelValue))) {
126
+ if (isNaN(parseFloat(props.modelValue))) {
124
127
  return null;
125
128
  }
126
129
  return parseFloat(props.modelValue);
127
130
  case MagicFieldType.Switch:
128
- if (props.modelValue == null) {
129
- return null;
130
- }
131
131
  return props.modelValue === "true";
132
+ case MagicFieldType.TimeStepField:
133
+ return JSON.parse(props.modelValue);
132
134
  default:
133
135
  return props.modelValue;
134
136
  }
135
137
  });
136
138
 
137
- const asString = (value: any): string | null => {
139
+ const asString = (value: string): string | null => {
138
140
  if (value == null) {
139
- return null;
141
+ return "";
140
142
  }
143
+
141
144
  switch (props.type) {
142
145
  case MagicFieldType.NumberField:
143
146
  return value.toString();
@@ -147,26 +150,31 @@ export default defineComponent({
147
150
  }
148
151
  return $tr("ui.magic-field.false", "False");
149
152
  case MagicFieldType.DateTimeField:
150
- return epochToShortTimeFormat(value);
153
+ return epochToShortTimeFormat(parseFloat(value));
151
154
  case MagicFieldType.TimeField:
152
- return getTimeBestString(value);
155
+ return getTimeBestString(parseFloat(value));
156
+ case MagicFieldType.TimeStepField:
157
+ return timeStepToString(JSON.parse(value));
153
158
  default:
154
159
  return value;
155
160
  }
156
161
  }
157
162
 
158
163
  const inputToValue = (value: any) => {
164
+ if (value == null) {
165
+ emit("update:modelValue", null);
166
+ }
167
+
159
168
  switch (props.type) {
160
169
  case MagicFieldType.NumberField:
161
170
  case MagicFieldType.Switch:
162
171
  case MagicFieldType.DateTimeField:
163
172
  case MagicFieldType.TimeField:
164
- if (value == null) {
165
- emit("update:modelValue", null);
166
- break;
167
- }
168
173
  emit("update:modelValue", value.toString());
169
174
  break;
175
+ case MagicFieldType.TimeStepField:
176
+ emit("update:modelValue", JSON.stringify(value));
177
+ break;
170
178
  default:
171
179
  emit("update:modelValue", value);
172
180
  break;
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <FSTextField
3
3
  class="fs-number-field"
4
+ minWidth="80px"
4
5
  :editable="$props.editable"
5
6
  :modelValue="$props.modelValue?.toString()"
6
7
  @update:modelValue="onUpdate"
@@ -19,8 +20,7 @@
19
20
  </template>
20
21
 
21
22
  <script lang="ts">
22
- import type { PropType } from "vue";
23
- import { defineComponent } from "vue";
23
+ import { defineComponent, type PropType } from "vue";
24
24
 
25
25
  import FSTextField from "./FSTextField.vue";
26
26
 
@@ -44,13 +44,15 @@ export default defineComponent({
44
44
  emits: ["update:modelValue"],
45
45
  setup(_, { emit }) {
46
46
  const onUpdate = (value: string) => {
47
- const match = /([0-9 ]*[,.]?)?[0-9]+/.exec(value);
48
- if (match && !isNaN(parseFloat(match[0].replace(",", ".").replace(" ", "")))) {
49
- emit("update:modelValue", parseFloat(match[0].replace(",", ".").replace(" ", "")));
47
+ if (value === "-") {
48
+ return;
50
49
  }
51
- else {
52
- emit("update:modelValue", 0);
50
+ const match = /[-]?([0-9 ]*[,.]?)?[0-9]*/.exec(value);
51
+ if (match != null && !isNaN(parseFloat(match[0].replace(",", ".").replace(" ", "")))) {
52
+ emit("update:modelValue", parseFloat(match[0].replace(",", ".").replace(" ", "")));
53
+ return;
53
54
  }
55
+ emit("update:modelValue", 0);
54
56
  };
55
57
 
56
58
  return {
@@ -33,8 +33,7 @@
33
33
  </template>
34
34
 
35
35
  <script lang="ts">
36
- import type { PropType} from "vue";
37
- import { computed, defineComponent, ref } from "vue";
36
+ import { computed, defineComponent, type PropType, ref } from "vue";
38
37
 
39
38
  import { useColors } from "@dative-gpi/foundation-shared-components/composables";
40
39
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
@@ -69,7 +68,7 @@ export default defineComponent({
69
68
 
70
69
  const stars = ref(true);
71
70
 
72
- const style = computed((): { [key: string] : string | null | undefined } => {
71
+ const style = computed((): StyleValue => {
73
72
  if (!props.editable) {
74
73
  return {
75
74
  "--fs-password-field-cursor" : "default",