@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,233 @@
1
+ <template>
2
+ <FSTextArea
3
+ :editable="$props.editable"
4
+ :modelValue="$props.modelValue"
5
+ @update:modelValue="$emit('update:modelValue', $event)"
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
+ #append
19
+ >
20
+ <FSButton
21
+ height="100%"
22
+ style=""
23
+ :prependIcon="$props.buttonPrependIcon"
24
+ :appendIcon="$props.buttonAppendIcon"
25
+ :variant="$props.buttonVariant"
26
+ :color="$props.buttonColor"
27
+ @click="dialog = true"
28
+ />
29
+ <slot
30
+ name="append"
31
+ />
32
+ </template>
33
+ </FSTextArea>
34
+ <FSDialogSubmit
35
+ :title="$tr('ui.translate-text-area.title', 'Handle translations')"
36
+ :submitButtonColor="$props.buttonColor"
37
+ @click:submitButton="onSubmit"
38
+ v-model="dialog"
39
+ >
40
+ <template
41
+ #body
42
+ >
43
+ <FSCol
44
+ gap="32px"
45
+ >
46
+ <FSTextArea
47
+ :label="$tr('ui.translate-text-area.default-value', 'Default value')"
48
+ :editable="false"
49
+ :rows="($attrs.rows as number)"
50
+ :modelValue="$props.modelValue"
51
+ />
52
+ <FSCol
53
+ gap="20px"
54
+ >
55
+ <FSTextArea
56
+ v-for="(language, index) in languages"
57
+ :editable="$props.editable"
58
+ :key="index"
59
+ :modelValue="getTranslation(language.code)"
60
+ :rows="($attrs.rows as number)"
61
+ @update:modelValue="setTranslation(language.code, $event)"
62
+ >
63
+ <template
64
+ #label
65
+ >
66
+ <FSRow
67
+ :wrap="false"
68
+ align="center-left"
69
+ >
70
+ <FSSpan
71
+ font="text-overline"
72
+ :style="style"
73
+ >
74
+ {{ $tr("ui.translate-field.translate-in", "Translate in {0}", language.label) }}
75
+ </FSSpan>
76
+ <FSIcon>
77
+ {{ language.icon }}
78
+ </FSIcon>
79
+ </FSRow>
80
+ </template>
81
+ </FSTextArea>
82
+ </FSCol>
83
+ </FSCol>
84
+ </template>
85
+ </FSDialogSubmit>
86
+ </template>
87
+
88
+ <script lang="ts">
89
+ import { computed, defineComponent, type PropType, ref, type StyleValue } from "vue";
90
+
91
+ import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
92
+ import { useAppLanguages } from "@dative-gpi/foundation-shared-services/composables";
93
+
94
+ import { useColors } from "../../composables";
95
+
96
+ import FSDialogSubmit from "../FSDialogSubmit.vue";
97
+ import FSTextArea from "./FSTextArea.vue";
98
+ import FSButton from "../FSButton.vue";
99
+ import FSIcon from "../FSIcon.vue";
100
+ import FSSpan from "../FSSpan.vue";
101
+ import FSRow from "../FSRow.vue";
102
+
103
+ export default defineComponent({
104
+ name: "FSTranslateTextArea",
105
+ components: {
106
+ FSDialogSubmit,
107
+ FSTextArea,
108
+ FSButton,
109
+ FSIcon,
110
+ FSSpan,
111
+ FSRow
112
+ },
113
+ props: {
114
+ buttonPrependIcon: {
115
+ type: String as PropType<string | null>,
116
+ required: false,
117
+ default: "mdi-translate"
118
+ },
119
+ buttonLabel: {
120
+ type: String as PropType<string | null>,
121
+ required: false,
122
+ default: null
123
+ },
124
+ buttonAppendIcon: {
125
+ type: String as PropType<string | null>,
126
+ required: false,
127
+ default: null
128
+ },
129
+ buttonVariant: {
130
+ type: String as PropType<"standard" | "full" | "icon">,
131
+ required: false,
132
+ default: "standard"
133
+ },
134
+ modelValue: {
135
+ type: String as PropType<string | null>,
136
+ required: false,
137
+ default: null
138
+ },
139
+ property: {
140
+ type: String as PropType<string>,
141
+ required: false,
142
+ default: "label"
143
+ },
144
+ translations: {
145
+ type: Array as PropType<{ languageCode: string; [key: string]: string }[]>,
146
+ required: false,
147
+ default: () => []
148
+ },
149
+ buttonColor: {
150
+ type: String as PropType<ColorBase>,
151
+ required: false,
152
+ default: ColorEnum.Primary
153
+ },
154
+ editable: {
155
+ type: Boolean,
156
+ required: false,
157
+ default: true
158
+ }
159
+ },
160
+ emits: ["update:modelValue", "update:translations"],
161
+ setup(props, { emit }) {
162
+ const { languages } = useAppLanguages();
163
+ const { getColors } = useColors();
164
+
165
+ const dialog = ref(false);
166
+
167
+ const innerTranslations = ref(props.translations);
168
+
169
+ const lights = getColors(ColorEnum.Light);
170
+ const darks = getColors(ColorEnum.Dark);
171
+
172
+ const style = computed((): StyleValue => {
173
+ if (!props.editable) {
174
+ return {
175
+ "--fs-translate-field-color": lights.dark
176
+ };
177
+ }
178
+ return {
179
+ "--fs-translate-field-color": darks.base
180
+ };
181
+ });
182
+
183
+ const getTranslation = (languageCode: string): string => {
184
+ if (!innerTranslations.value) {
185
+ return "";
186
+ }
187
+ const translation = innerTranslations.value.find((t) => t.languageCode === languageCode);
188
+ if (!translation || !translation[props.property]) {
189
+ return "";
190
+ }
191
+ return translation[props.property];
192
+ };
193
+
194
+ const setTranslation = (languageCode: string, value: string): void => {
195
+ if (!innerTranslations.value) {
196
+ innerTranslations.value = [{
197
+ languageCode,
198
+ [props.property]: value
199
+ }]
200
+ return;
201
+ }
202
+ const translation = innerTranslations.value.find((t) => t.languageCode === languageCode);
203
+ if (translation) {
204
+ translation[props.property] = value;
205
+ }
206
+ else {
207
+ innerTranslations.value.push({
208
+ languageCode,
209
+ [props.property]: value
210
+ });
211
+ }
212
+ };
213
+
214
+ const onSubmit = (): void => {
215
+ dialog.value = false;
216
+ if (props.editable) {
217
+ emit("update:translations", innerTranslations.value);
218
+ }
219
+ };
220
+
221
+ return {
222
+ innerTranslations,
223
+ ColorEnum,
224
+ languages,
225
+ dialog,
226
+ style,
227
+ getTranslation,
228
+ setTranslation,
229
+ onSubmit
230
+ };
231
+ }
232
+ });
233
+ </script>
@@ -57,7 +57,7 @@
57
57
  #body
58
58
  >
59
59
  <FSFadeOut
60
- :height="height"
60
+ :maxHeight="maxHeight"
61
61
  >
62
62
  <v-treeview
63
63
  :itemTitle="$props.itemTitle"
@@ -240,14 +240,12 @@
240
240
  </template>
241
241
 
242
242
  <script lang="ts">
243
- import type { PropType} from "vue";
244
- import { computed, defineComponent, ref } from "vue";
243
+ import { computed, defineComponent, type PropType, ref, type StyleValue } from "vue";
244
+ import { VTreeview } from "vuetify/labs/VTreeview";
245
245
 
246
246
  import { useBreakpoints, useColors, useRules, useSlots } from "@dative-gpi/foundation-shared-components/composables";
247
247
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
248
248
 
249
- import { VTreeview } from "vuetify/labs/VTreeview";
250
-
251
249
  import FSDialogMenu from "../FSDialogMenu.vue";
252
250
  import FSTextField from "./FSTextField.vue";
253
251
  import FSCheckbox from "../FSCheckbox.vue";
@@ -367,7 +365,7 @@ export default defineComponent({
367
365
  const dialog = ref(false);
368
366
  const menu = ref(false);
369
367
 
370
- const style = computed((): { [key: string]: string | undefined | null } => {
368
+ const style = computed((): StyleValue => {
371
369
  if (!props.editable) {
372
370
  return {
373
371
  "--fs-tree-view-field-cursor": "default"
@@ -383,7 +381,7 @@ export default defineComponent({
383
381
 
384
382
  const messages = computed((): string[] => props.messages ?? getMessages(props.modelValue, props.rules));
385
383
 
386
- const height = computed(() => {
384
+ const maxHeight = computed(() => {
387
385
  const other = 8 + 8; // Paddings
388
386
  return `calc(100vh - 40px - ${other}px)`;
389
387
  });
@@ -431,7 +429,7 @@ export default defineComponent({
431
429
  return item[props.itemParent] == parentId;
432
430
  });
433
431
  });
434
- const process = ((item: any) => {
432
+ const process = ((item: any): any => {
435
433
  if (props.items.some((child: any) => child[props.itemParent] === item[props.itemValue])) {
436
434
  return {
437
435
  ...item,
@@ -503,11 +501,11 @@ export default defineComponent({
503
501
  innerValue,
504
502
  fieldSlots,
505
503
  validateOn,
504
+ maxHeight,
506
505
  menuSlots,
507
506
  treeItems,
508
507
  messages,
509
508
  dialog,
510
- height,
511
509
  style,
512
510
  menu,
513
511
  openMobileOverlay,
@@ -0,0 +1,120 @@
1
+ <template>
2
+ <FSRadioGroup
3
+ :values="availableConfigurations"
4
+ :editable="$props.editable"
5
+ v-model="selectedConfiguration"
6
+ >
7
+ <template
8
+ #label="{ item, font }"
9
+ >
10
+ <FSRow
11
+ v-if="item.value === 'custom'"
12
+ align="center-left"
13
+ >
14
+ <FSSpan
15
+ :font="font"
16
+ >
17
+ {{ $tr('ui.periodicfield.daily.every', 'Every') }}
18
+ </FSSpan>
19
+ <FSNumberField
20
+ :editable="$props.editable"
21
+ :modelValue="days"
22
+ :hideHeader="true"
23
+ :clearable="false"
24
+ @update:modelValue="onUpdateDays($event)"
25
+ />
26
+ <FSSpan
27
+ :font="font"
28
+ >
29
+ {{ $tr('ui.periodicfield.daily.daysat', 'day(s) at') }}
30
+ </FSSpan>
31
+ <FSClock
32
+ :editable="$props.editable"
33
+ :color="ColorEnum.Light"
34
+ :modelValue="time"
35
+ :hideHeader="true"
36
+ :slider="false"
37
+ @update:modelValue="onUpdateHours($event)"
38
+ />
39
+ </FSRow>
40
+ </template>
41
+ </FSRadioGroup>
42
+ </template>
43
+
44
+ <script lang="ts">
45
+ import { ref, defineComponent, computed } from "vue";
46
+
47
+ import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
48
+
49
+ import FSRadioGroup from "../../FSRadioGroup.vue";
50
+ import FSNumberField from "../FSNumberField.vue";
51
+ import FSClock from "../../FSClock.vue";
52
+ import FSSpan from "../../FSSpan.vue";
53
+ import FSRow from "../../FSRow.vue";
54
+
55
+ export default defineComponent({
56
+ name: "FSPeriodicDailyField",
57
+ components: {
58
+ FSNumberField,
59
+ FSRadioGroup,
60
+ FSClock,
61
+ FSSpan,
62
+ FSRow
63
+ },
64
+ props: {
65
+ modelValue: {
66
+ type: Array<string>,
67
+ required: true
68
+ },
69
+ editable: {
70
+ type: Boolean,
71
+ required: false,
72
+ default: true
73
+ }
74
+ },
75
+ emits: ["update:modelValue"],
76
+ setup(props, { emit }) {
77
+ const availableConfigurations = [
78
+ { value: "custom", item: { value: "custom" } }
79
+ ];
80
+
81
+ const selectedConfiguration = ref("custom");
82
+
83
+ const days = computed((): number => {
84
+ if (isNaN(parseInt(props.modelValue[2].replace("*/", "")))) {
85
+ return 0
86
+ }
87
+ return parseInt(props.modelValue[2].replace("*/", ""));
88
+ });
89
+
90
+ const time = computed((): number => {
91
+ if (isNaN(parseInt(props.modelValue[0])) || isNaN(parseInt(props.modelValue[1]))) {
92
+ return 0;
93
+ }
94
+ return ((parseInt(props.modelValue[0])) + (parseInt(props.modelValue[1]) * 60)) * 60 * 1000;
95
+ });
96
+
97
+ const onUpdateDays = (value: number): void => {
98
+ const hours = Math.floor(value / (60 * 60 * 1000));
99
+ const minutes = Math.floor(value / (60 * 1000) % 60);
100
+ emit("update:modelValue", [`${minutes}`, `${hours}`, `*/${value}`, "*", "*"]);
101
+ };
102
+
103
+ const onUpdateHours = (value: number): void => {
104
+ const hours = Math.floor(value / (60 * 60 * 1000));
105
+ const minutes = Math.floor(value / (60 * 1000) % 60);
106
+ emit("update:modelValue", [`${minutes}`, `${hours}`, `*/${days.value}`, "*", "*"]);
107
+ };
108
+
109
+ return {
110
+ availableConfigurations,
111
+ selectedConfiguration,
112
+ ColorEnum,
113
+ days,
114
+ time,
115
+ onUpdateHours,
116
+ onUpdateDays
117
+ };
118
+ }
119
+ });
120
+ </script>
@@ -0,0 +1,131 @@
1
+ <template>
2
+ <FSRow
3
+ gap="12px"
4
+ :wrap="false"
5
+ >
6
+ <FSRadioGroup
7
+ :values="availablePeriod"
8
+ :editable="editable"
9
+ v-model="selectedPeriod"
10
+ />
11
+ <FSRow
12
+ align="center-left"
13
+ height="fill"
14
+ gap="12px"
15
+ :wrap="false"
16
+ >
17
+ <FSDivider
18
+ :vertical="true"
19
+ />
20
+ <FSPeriodicDailyField
21
+ v-if="selectedPeriod === 'daily'"
22
+ :editable="editable"
23
+ :modelValue="$props.modelValue.split(' ')"
24
+ @update:modelValue="$emit('update:modelValue', $event.join(' '))"
25
+ />
26
+ <FSPeriodicWeeklyField
27
+ v-else-if="selectedPeriod === 'weekly'"
28
+ :editable="editable"
29
+ :modelValue="$props.modelValue.split(' ')"
30
+ @update:modelValue="$emit('update:modelValue', $event.join(' '))"
31
+ />
32
+ <FSPeriodicMonthlyField
33
+ v-else-if="selectedPeriod === 'monthly'"
34
+ :editable="editable"
35
+ :modelValue="$props.modelValue.split(' ')"
36
+ @update:modelValue="$emit('update:modelValue', $event.join(' '))"
37
+ />
38
+ <FSPeriodicYearlyField
39
+ v-else-if="selectedPeriod === 'yearly'"
40
+ :editable="editable"
41
+ :modelValue="$props.modelValue.split(' ')"
42
+ @update:modelValue="$emit('update:modelValue', $event.join(' '))"
43
+ />
44
+ </FSRow>
45
+ </FSRow>
46
+ </template>
47
+
48
+ <script lang="ts">
49
+ import { ref, defineComponent, onMounted, type PropType, watch } from "vue";
50
+
51
+ import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui";
52
+
53
+ import FSPeriodicMonthlyField from "./FSPeriodicMonthlyField.vue";
54
+ import FSPeriodicWeeklyField from "./FSPeriodicWeeklyField.vue";
55
+ import FSPeriodicYearlyField from "./FSPeriodicYearlyField.vue";
56
+ import FSPeriodicDailyField from "./FSPeriodicDailyField.vue";
57
+ import FSRadioGroup from "../../FSRadioGroup.vue";
58
+ import FSDivider from "../../FSDivider.vue";
59
+ import FSRow from "../../FSRow.vue";
60
+
61
+ export default defineComponent({
62
+ name: "FSPeriodicField",
63
+ components: {
64
+ FSPeriodicMonthlyField,
65
+ FSPeriodicWeeklyField,
66
+ FSPeriodicYearlyField,
67
+ FSPeriodicDailyField,
68
+ FSRadioGroup,
69
+ FSDivider,
70
+ FSRow
71
+ },
72
+ props: {
73
+ modelValue: {
74
+ type: String as PropType<"daily" | "weekly" | "monthly" | "yearly">,
75
+ required: true
76
+ },
77
+ editable: {
78
+ type: Boolean,
79
+ required: false,
80
+ default: true
81
+ }
82
+ },
83
+ emits: ["update:modelValue"],
84
+ setup(props, { emit }) {
85
+ const { $tr } = useTranslationsProvider();
86
+
87
+ const availablePeriod = [
88
+ { label: $tr("ui.periodicField.daily", "Daily") , value: "daily" , item: { default : "0 12 */1 * *"} },
89
+ { label: $tr("ui.periodicField.weekly", "Weekly") , value: "weekly" , item: { default : "0 12 * * 1"} },
90
+ { label: $tr("ui.periodicField.monthly", "Monthly"), value: "monthly", item: { default : "0 12 1 * *"} },
91
+ { label: $tr("ui.periodicField.yearly", "Yearly") , value: "yearly" , item: { default : "0 12 1 1 *"} }
92
+ ];
93
+
94
+ const selectedPeriod = ref("daily");
95
+
96
+ const getPeriod = (value: string) => {
97
+ const cronArray = value.split(" ");
98
+ if (cronArray[3] !== "*") {
99
+ return "yearly";
100
+ }
101
+ else if(!cronArray[2].includes("*") || cronArray[2].includes("-")) {
102
+ return "monthly";
103
+ }
104
+ else if(cronArray[4] !== "*") {
105
+ return "weekly";
106
+ }
107
+ return "daily";
108
+ };
109
+
110
+ watch(() => selectedPeriod.value, () => {
111
+ if (getPeriod(props.modelValue) === selectedPeriod.value) {
112
+ return;
113
+ }
114
+ const period = availablePeriod.find((item) => item.value === selectedPeriod.value);
115
+ if (!period) {
116
+ return;
117
+ }
118
+ emit('update:modelValue', period.item.default);
119
+ });
120
+
121
+ onMounted(() => {
122
+ selectedPeriod.value = getPeriod(props.modelValue);
123
+ });
124
+
125
+ return {
126
+ availablePeriod,
127
+ selectedPeriod
128
+ };
129
+ }
130
+ });
131
+ </script>