@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
@@ -49,12 +49,10 @@
49
49
  </template>
50
50
 
51
51
  <script lang="ts">
52
- import type { PropType} from "vue";
53
- import { computed, defineComponent, ref } from "vue";
52
+ import { computed, defineComponent, type PropType, ref } from "vue";
54
53
 
55
54
  import { useColors, useRules, useSlots } from "@dative-gpi/foundation-shared-components/composables";
56
- import type { ColorBase} from "@dative-gpi/foundation-shared-components/models";
57
- import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
55
+ import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
58
56
 
59
57
  import FSTextField from "./FSTextField.vue";
60
58
  import FSTagGroup from "../FSTagGroup.vue";
@@ -93,7 +91,7 @@ export default defineComponent({
93
91
  tagColor: {
94
92
  type: String as PropType<ColorBase>,
95
93
  required: false,
96
- default: ColorEnum.Primary
94
+ default: ColorEnum.Light
97
95
  },
98
96
  hideHeader: {
99
97
  type: Boolean,
@@ -130,7 +128,7 @@ export default defineComponent({
130
128
 
131
129
  const innerValue = ref("");
132
130
 
133
- const style = computed((): { [key: string] : string | null | undefined } => {
131
+ const style = computed((): StyleValue => {
134
132
  if (!props.editable) {
135
133
  return {
136
134
  "--fs-tag-field-color": lights.dark
@@ -14,6 +14,7 @@
14
14
  :wrap="false"
15
15
  >
16
16
  <FSSelectDateSetting
17
+ minWidth="180px"
17
18
  :lastPeriod="$props.lastPeriod"
18
19
  :editable="$props.editable"
19
20
  :variant="$props.variant"
@@ -22,10 +23,12 @@
22
23
  @update:modelValue="innerDateSettingChange"
23
24
  />
24
25
  <FSNumberField
26
+ minWidth="60px"
25
27
  v-if="pastSettings.includes(innerDateSetting)"
26
28
  :rules="[NumberRules.required(), NumberRules.min(0)]"
27
29
  :editable="$props.editable"
28
30
  :hideHeader="true"
31
+ :clearable="false"
29
32
  :modelValue="innerDateValue"
30
33
  @update:modelValue="innerDateValueChange"
31
34
  />
@@ -68,7 +71,7 @@
68
71
  :rules="[DateRules.required()]"
69
72
  :editable="$props.editable"
70
73
  :hideHeader="true"
71
- :modelValue="[parseForPicker(innerStartDate)!, parseForPicker(innerEndDate)!]"
74
+ :modelValue="actualValue"
72
75
  @update:modelValue="onPickDates"
73
76
  />
74
77
  </FSRow>
@@ -81,9 +84,9 @@ import { computed, defineComponent, type PropType, ref, watch } from "vue";
81
84
  import _ from "lodash";
82
85
 
83
86
  import { DateRules, NumberRules, TextRules } from "@dative-gpi/foundation-shared-components/models";
84
- import { useAppTimeZone } from "@dative-gpi/foundation-shared-services/composables";
87
+ import { useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
85
88
  import { useRules } from "@dative-gpi/foundation-shared-components/composables";
86
- import { DateSetting } from "@dative-gpi/foundation-shared-domain/models";
89
+ import { DateSetting } from "@dative-gpi/foundation-shared-domain/enums";
87
90
 
88
91
  import FSSelectDateSetting from "../selects/FSSelectDateSetting.vue";
89
92
  import FSDateTimeRangeField from "./FSDateTimeRangeField.vue";
@@ -163,7 +166,7 @@ export default defineComponent({
163
166
  },
164
167
  emits: ["update:startDate", "update:endDate"],
165
168
  setup(props, { emit }) {
166
- const { parseForPicker,formatFromPicker, formatCurrentForPicker } = useAppTimeZone();
169
+ const { parseForPicker, epochToISO, todayToPicker, yesterdayToPicker } = useDateFormat();
167
170
  const { getMessages } = useRules();
168
171
 
169
172
  const innerDateSetting = ref<DateSetting>(DateSetting.PastDays);
@@ -181,6 +184,14 @@ export default defineComponent({
181
184
  ];
182
185
  });
183
186
 
187
+ const actualValue = computed(() => {
188
+ const dates = [parseForPicker(innerStartDate.value), parseForPicker(innerEndDate.value)]
189
+ if(dates.some(d => d == null)) {
190
+ return null;
191
+ }
192
+ return dates as [number, number];
193
+ })
194
+
184
195
  const messages = computed((): string[] => {
185
196
  return props.messages ??
186
197
  getMessages(props.startDate, props.rules).concat(getMessages(props.endDate, props.rules));
@@ -336,8 +347,8 @@ export default defineComponent({
336
347
  }
337
348
  break;
338
349
  case DateSetting.Pick:
339
- innerEndDate.value = formatCurrentForPicker(0);
340
- innerStartDate.value = formatCurrentForPicker(-1);
350
+ innerEndDate.value = todayToPicker();
351
+ innerStartDate.value = yesterdayToPicker();
341
352
  break;
342
353
  }
343
354
  emit("update:startDate", innerStartDate.value);
@@ -409,22 +420,22 @@ export default defineComponent({
409
420
 
410
421
  const onPickDates = (value: number[] | null) => {
411
422
  if (!value) {
412
- innerEndDate.value = formatCurrentForPicker(0);
413
- innerStartDate.value = formatCurrentForPicker(-1);
423
+ innerEndDate.value = todayToPicker();
424
+ innerStartDate.value = yesterdayToPicker();
414
425
  if (valid.value) {
415
426
  emit("update:startDate", innerStartDate.value);
416
427
  emit("update:endDate", innerEndDate.value);
417
428
  }
418
429
  }
419
430
  else {
420
- if (value && value[0] != null && formatFromPicker(value[0]) !== innerStartDate.value) {
421
- innerStartDate.value = formatFromPicker(value[0]);
431
+ if (value && value[0] != null && epochToISO(value[0]) !== innerStartDate.value) {
432
+ innerStartDate.value = epochToISO(value[0]);
422
433
  if (valid.value) {
423
434
  emit("update:startDate", innerStartDate.value);
424
435
  }
425
436
  }
426
- if (value && value[1] != null && formatFromPicker(value[1]) !== innerEndDate.value) {
427
- innerEndDate.value = formatFromPicker(value[1]);
437
+ if (value && value[1] != null && epochToISO(value[1]) !== innerEndDate.value) {
438
+ innerEndDate.value = epochToISO(value[1]);
428
439
  if (valid.value) {
429
440
  emit("update:endDate", innerEndDate.value);
430
441
  }
@@ -618,7 +629,7 @@ export default defineComponent({
618
629
  }
619
630
  }
620
631
 
621
- if (parseForPicker(props.endDate) != null && parseForPicker(props.startDate) != null) {
632
+ if (props.endDate && parseForPicker(props.endDate) != null && props.startDate && parseForPicker(props.startDate) != null) {
622
633
  innerDateSetting.value = DateSetting.Pick;
623
634
  innerDateValue.value = 1;
624
635
  return;
@@ -642,6 +653,7 @@ export default defineComponent({
642
653
  innerDateValue,
643
654
  innerStartDate,
644
655
  innerEndDate,
656
+ actualValue,
645
657
  pastSettings,
646
658
  DateSetting,
647
659
  NumberRules,
@@ -7,6 +7,15 @@
7
7
  :editable="$props.editable"
8
8
  :messages="messages"
9
9
  >
10
+ <template
11
+ v-if="$slots.label"
12
+ v-slot:label="slotData"
13
+ >
14
+ <slot
15
+ name="label"
16
+ v-bind="slotData"
17
+ />
18
+ </template>
10
19
  <v-textarea
11
20
  class="fs-text-area"
12
21
  variant="outlined"
@@ -26,7 +35,7 @@
26
35
  v-bind="$attrs"
27
36
  >
28
37
  <template
29
- v-for="(_, name) in $slots"
38
+ v-for="(_, name) in slots"
30
39
  v-slot:[name]="slotData"
31
40
  >
32
41
  <slot
@@ -54,10 +63,9 @@
54
63
  </template>
55
64
 
56
65
  <script lang="ts">
57
- import type { PropType } from "vue";
58
- import { computed, defineComponent } from "vue";
66
+ import { computed, defineComponent, type PropType, type StyleValue } from "vue";
59
67
 
60
- import { useColors, useBreakpoints, useRules } from "@dative-gpi/foundation-shared-components/composables";
68
+ import { useColors, useBreakpoints, useRules, useSlots } from "@dative-gpi/foundation-shared-components/composables";
61
69
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
62
70
 
63
71
  import FSBaseField from "./FSBaseField.vue";
@@ -131,12 +139,15 @@ export default defineComponent({
131
139
  const { validateOn, getMessages } = useRules();
132
140
  const { isMobileSized } = useBreakpoints();
133
141
  const { getColors } = useColors();
142
+ const { slots } = useSlots();
143
+
144
+ delete slots.label;
134
145
 
135
146
  const errors = getColors(ColorEnum.Error);
136
147
  const lights = getColors(ColorEnum.Light);
137
148
  const darks = getColors(ColorEnum.Dark);
138
149
 
139
- const style = computed((): { [key: string] : string | null | undefined } => {
150
+ const style = computed((): StyleValue => {
140
151
  let height: string | undefined = undefined;
141
152
  let fieldHeight: string | undefined = undefined;
142
153
  if (!props.autoGrow) {
@@ -186,7 +197,8 @@ export default defineComponent({
186
197
  ColorEnum,
187
198
  messages,
188
199
  classes,
189
- style
200
+ style,
201
+ slots
190
202
  };
191
203
  }
192
204
  });
@@ -52,21 +52,24 @@
52
52
  <template
53
53
  #clear
54
54
  >
55
- <FSButton
56
- v-if="$props.clearable && $props.editable && !!$props.modelValue"
57
- icon="mdi-close"
58
- variant="icon"
59
- :color="ColorEnum.Dark"
60
- @click="$emit('update:modelValue', null)"
61
- />
55
+ <slot
56
+ name="clear"
57
+ >
58
+ <FSButton
59
+ v-if="$props.clearable && $props.editable && !!$props.modelValue"
60
+ icon="mdi-close"
61
+ variant="icon"
62
+ :color="ColorEnum.Dark"
63
+ @click="$emit('update:modelValue', null)"
64
+ />
65
+ </slot>
62
66
  </template>
63
67
  </v-text-field>
64
68
  </FSBaseField>
65
69
  </template>
66
70
 
67
71
  <script lang="ts">
68
- import type { PropType } from "vue";
69
- import { computed, defineComponent } from "vue";
72
+ import { computed, defineComponent, type PropType, type StyleValue } from "vue";
70
73
 
71
74
  import { useColors, useRules, useSlots } from "@dative-gpi/foundation-shared-components/composables";
72
75
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
@@ -145,7 +148,7 @@ export default defineComponent({
145
148
  const lights = getColors(ColorEnum.Light);
146
149
  const darks = getColors(ColorEnum.Dark);
147
150
 
148
- const style = computed((): { [key: string] : string | null | undefined } => {
151
+ const style = computed((): StyleValue => {
149
152
  if (!props.editable) {
150
153
  return {
151
154
  "--fs-text-field-cursor" : "default",
@@ -130,7 +130,7 @@ export default defineComponent({
130
130
  const innerTime = ref(0);
131
131
  const selectedUnit = ref(timeScale[0]);
132
132
 
133
- const style = computed((): { [key: string] : string | null | undefined } => {
133
+ const style = computed((): StyleValue => {
134
134
  if (!props.editable) {
135
135
  return {
136
136
  "--fs-time-field-cursor" : "default",
@@ -61,12 +61,11 @@
61
61
  </template>
62
62
 
63
63
  <script lang="ts">
64
- import type { PropType } from "vue";
65
- import { computed, defineComponent } from "vue";
64
+ import { computed, defineComponent, type PropType, type StyleValue } from "vue";
66
65
 
67
66
  import { useColors, useRules } from "@dative-gpi/foundation-shared-components/composables";
68
67
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
69
- import { Days } from "@dative-gpi/foundation-shared-domain/models";
68
+ import { Days } from "@dative-gpi/foundation-shared-domain/enums";
70
69
 
71
70
  import FSSelectField from "./FSSelectField.vue";
72
71
  import FSBaseField from "./FSBaseField.vue";
@@ -142,7 +141,7 @@ export default defineComponent({
142
141
  return acc;
143
142
  }, [] as { id: number, label: string }[]);
144
143
 
145
- const style = computed((): { [key: string] : string | null | undefined } => {
144
+ const style = computed((): StyleValue => {
146
145
  if (!props.editable) {
147
146
  return {
148
147
  "--fs-time-slot-field-cursor" : "default",
@@ -0,0 +1,157 @@
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
+ <FSRow>
11
+ <FSNumberField
12
+ :validationValue="$props.modelValue"
13
+ :editable="$props.editable"
14
+ :validateOn="validateOn"
15
+ :rules="$props.rules"
16
+ :hideHeader="true"
17
+ :messages="messages"
18
+ :modelValue="$props.modelValue && $props.modelValue.value || 0"
19
+ @update:modelValue="$emit('update:modelValue', { value: $event, unit: $props.modelValue && $props.modelValue.unit || units[0].id })"
20
+ v-bind="$attrs"
21
+ >
22
+ <template
23
+ v-for="(_, name) in numberSlots"
24
+ v-slot:[name]="slotData"
25
+ >
26
+ <slot
27
+ :name="name"
28
+ v-bind="slotData"
29
+ />
30
+ </template>
31
+ </FSNumberField>
32
+ <FSSelectField
33
+ class="fs-time-field-select"
34
+ :editable="$props.editable"
35
+ :hideHeader="true"
36
+ :clearable="false"
37
+ :items="units"
38
+ :modelValue="$props.modelValue && $props.modelValue.unit || units[0].id"
39
+ @update:modelValue="$emit('update:modelValue', { value: $props.modelValue && $props.modelValue.value || 0, unit: $event })"
40
+ >
41
+ <template
42
+ v-for="(_, name) in selectSlots"
43
+ v-slot:[name]="slotData"
44
+ >
45
+ <slot
46
+ :name="name"
47
+ v-bind="slotData"
48
+ />
49
+ </template>
50
+ </FSSelectField>
51
+ </FSRow>
52
+ </FSBaseField>
53
+ </template>
54
+
55
+ <script lang="ts">
56
+ import { computed, defineComponent, type PropType } from "vue";
57
+
58
+ import type { TimeUnit } from "@dative-gpi/foundation-shared-domain/enums";
59
+
60
+ import { useRules, useSlots } from "@dative-gpi/foundation-shared-components/composables";
61
+ import { timeSteps } from "@dative-gpi/foundation-shared-components/utils";
62
+
63
+ import FSNumberField from "./FSNumberField.vue";
64
+ import FSSelectField from "./FSSelectField.vue";
65
+ import FSBaseField from "./FSBaseField.vue";
66
+ import FSRow from "../FSRow.vue";
67
+
68
+ export default defineComponent({
69
+ name: "FSTimeStepField",
70
+ components: {
71
+ FSNumberField,
72
+ FSSelectField,
73
+ FSBaseField,
74
+ FSRow
75
+ },
76
+ props: {
77
+ label: {
78
+ type: String as PropType<string | null>,
79
+ required: false,
80
+ default: null
81
+ },
82
+ description: {
83
+ type: String as PropType<string | null>,
84
+ required: false,
85
+ default: null
86
+ },
87
+ modelValue: {
88
+ type: Object as PropType<{ value: number, unit: TimeUnit } | null>,
89
+ required: true
90
+ },
91
+ allowedUnits: {
92
+ type: Array as PropType<TimeUnit[]>,
93
+ required: false,
94
+ default: () => []
95
+ },
96
+ hideHeader: {
97
+ type: Boolean,
98
+ required: false,
99
+ default: false
100
+ },
101
+ required: {
102
+ type: Boolean,
103
+ required: false,
104
+ default: false
105
+ },
106
+ rules: {
107
+ type: Array as PropType<any[]>,
108
+ required: false,
109
+ default: () => []
110
+ },
111
+ messages: {
112
+ type: Array as PropType<string[]>,
113
+ required: false,
114
+ default: null
115
+ },
116
+ editable: {
117
+ type: Boolean,
118
+ required: false,
119
+ default: true
120
+ }
121
+ },
122
+ emits: ["update:modelValue"],
123
+ setup(props) {
124
+ const { validateOn, getMessages } = useRules();
125
+ const { slots } = useSlots();
126
+
127
+ delete slots.label;
128
+ delete slots.description;
129
+
130
+ const numberSlots = computed((): any => {
131
+ return Object.keys(slots).filter(k => k.startsWith("number-")).reduce((acc, key) => {
132
+ acc[key.substring("number-".length)] = slots[key];
133
+ return acc;
134
+ }, {} as {[index: string]: any});
135
+ });
136
+
137
+ const selectSlots = computed((): any => {
138
+ return Object.keys(slots).filter(k => k.startsWith("select-")).reduce((acc, key) => {
139
+ acc[key.substring("select-".length)] = slots[key];
140
+ return acc;
141
+ }, {} as {[index: string]: any});
142
+ });
143
+
144
+ const messages = computed((): string[] => props.messages ?? getMessages(props.modelValue, props.rules));
145
+
146
+ const units = computed(() => props.allowedUnits && props.allowedUnits.length ? timeSteps.filter(t => props.allowedUnits.includes(t.id)) : timeSteps);
147
+
148
+ return {
149
+ numberSlots,
150
+ selectSlots,
151
+ validateOn,
152
+ messages,
153
+ units
154
+ };
155
+ }
156
+ });
157
+ </script>
@@ -62,6 +62,7 @@
62
62
  >
63
63
  <FSRow
64
64
  :wrap="false"
65
+ align="center-left"
65
66
  >
66
67
  <FSSpan
67
68
  class="fs-translate-field-label"
@@ -83,7 +84,7 @@
83
84
  </template>
84
85
 
85
86
  <script lang="ts">
86
- import { computed, defineComponent, type PropType, ref } from "vue";
87
+ import { computed, defineComponent, type PropType, ref, type StyleValue } from "vue";
87
88
 
88
89
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
89
90
  import { useAppLanguages } from "@dative-gpi/foundation-shared-services/composables";
@@ -169,7 +170,7 @@ export default defineComponent({
169
170
  const lights = getColors(ColorEnum.Light);
170
171
  const darks = getColors(ColorEnum.Dark);
171
172
 
172
- const style = computed((): { [key: string] : string | null | undefined } => {
173
+ const style = computed((): StyleValue => {
173
174
  if (!props.editable) {
174
175
  return {
175
176
  "--fs-translate-field-color": lights.dark
@@ -24,6 +24,7 @@
24
24
  >
25
25
  <FSRow
26
26
  :wrap="false"
27
+ align="center-left"
27
28
  >
28
29
  <FSSpan
29
30
  class="fs-translate-field-label"
@@ -41,16 +42,16 @@
41
42
  >
42
43
  <FSButton
43
44
  prependIcon="mdi-cancel"
45
+ width="100%"
44
46
  :label="$tr('ui.translateRichTextField.cancelButton.label', 'Cancel')"
45
- :fullWidth="true"
46
47
  @click="onCancelTranslations"
47
48
  />
48
49
  <FSButton
49
50
  v-if="$props.editable"
50
51
  prependIcon="mdi-check"
51
52
  color="primary"
53
+ width="100%"
52
54
  :label="$tr('ui.translateRichTextField.validateButton.label', 'Validate translations')"
53
- :fullWidth="true"
54
55
  @click="onSubmitTranslations"
55
56
  />
56
57
  </FSRow>
@@ -68,8 +69,8 @@
68
69
  <FSButton
69
70
  prependIcon="mdi-translate"
70
71
  color="primary"
72
+ width="100%"
71
73
  :label="$tr('ui.translateRichTextField.translateButton.label', 'Manage translations')"
72
- :fullWidth="true"
73
74
  @click="() => $emit('update:translationsExpanded', true)"
74
75
  />
75
76
  </template>