@dative-gpi/foundation-shared-components 1.0.36 → 1.0.37-report-v1

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 (271) hide show
  1. package/components/FSBreadcrumbs.vue +21 -12
  2. package/components/FSButton.vue +10 -10
  3. package/components/FSCalendar.vue +52 -14
  4. package/components/FSCalendarTwin.vue +96 -40
  5. package/components/FSCard.vue +28 -7
  6. package/components/FSCardPlaceholder.vue +8 -5
  7. package/components/FSChip.vue +12 -2
  8. package/components/FSClickable.vue +12 -13
  9. package/components/FSClock.vue +16 -7
  10. package/components/FSColorIcon.vue +23 -5
  11. package/components/FSDialog.vue +2 -1
  12. package/components/FSDialogContent.vue +12 -11
  13. package/components/FSDialogForm.vue +22 -2
  14. package/components/FSDialogFormBody.vue +47 -28
  15. package/components/FSDialogMenu.vue +17 -8
  16. package/components/FSDialogMultiFormBody.vue +77 -54
  17. package/components/FSDialogRemove.vue +8 -8
  18. package/components/FSDialogSubmit.vue +17 -8
  19. package/components/FSEditImage.vue +1 -1
  20. package/components/FSEditImageUI.vue +20 -10
  21. package/components/FSFadeOut.vue +53 -21
  22. package/components/FSForm.vue +10 -8
  23. package/components/FSGrid.vue +1 -1
  24. package/components/FSIcon.vue +2 -1
  25. package/components/FSIconCard.vue +47 -7
  26. package/components/FSImage.vue +12 -4
  27. package/components/FSImageUI.vue +8 -15
  28. package/components/FSInstantPicker.vue +266 -0
  29. package/components/FSLink.vue +25 -9
  30. package/components/FSLoader.vue +28 -11
  31. package/components/FSOptionGroup.vue +51 -3
  32. package/components/FSPlayButtons.vue +72 -0
  33. package/components/FSProgressBar.vue +94 -0
  34. package/components/FSRouterLink.vue +42 -0
  35. package/components/FSSlideGroup.vue +19 -5
  36. package/components/FSSpan.vue +17 -7
  37. package/components/FSSwitch.vue +57 -27
  38. package/components/FSTab.vue +15 -13
  39. package/components/FSTabs.vue +32 -7
  40. package/components/FSTag.vue +14 -3
  41. package/components/FSTagGroup.vue +1 -1
  42. package/components/FSText.vue +11 -7
  43. package/components/FSWindow.vue +128 -4
  44. package/components/FSWrapGroup.vue +13 -1
  45. package/components/agenda/FSAgenda.vue +223 -0
  46. package/components/agenda/FSAgendaDialogCalendar.vue +76 -0
  47. package/components/agenda/FSAgendaHeader.vue +215 -0
  48. package/components/agenda/FSAgendaHorizontalEvent.vue +174 -0
  49. package/components/agenda/FSAgendaHorizontalTimeLineMarker.vue +46 -0
  50. package/components/agenda/FSAgendaHoursCol.vue +103 -0
  51. package/components/agenda/FSAgendaHoursRow.vue +164 -0
  52. package/components/agenda/FSAgendaVerticalEvent.vue +160 -0
  53. package/components/agenda/FSAgendaVerticalTimeLineMarker.vue +46 -0
  54. package/components/agenda/FSDayAgenda.vue +199 -0
  55. package/components/agenda/FSMonthAgenda.vue +252 -0
  56. package/components/agenda/FSSelectAgendaMode.vue +54 -0
  57. package/components/agenda/FSWeekAgenda.vue +323 -0
  58. package/components/autocompletes/FSAutoCompleteAddress.vue +22 -20
  59. package/components/autocompletes/FSAutocompleteLanguage.vue +7 -1
  60. package/components/autocompletes/FSAutocompleteTimeZone.vue +7 -1
  61. package/components/buttons/FSButtonAdd.vue +1 -1
  62. package/components/buttons/FSButtonAddLabel.vue +1 -1
  63. package/components/buttons/FSButtonCancel.vue +1 -1
  64. package/components/buttons/FSButtonCancelLabel.vue +1 -1
  65. package/components/buttons/FSButtonCopy.vue +1 -1
  66. package/components/buttons/FSButtonCopyLabel.vue +1 -1
  67. package/components/buttons/FSButtonDragIcon.vue +27 -0
  68. package/components/buttons/FSButtonDuplicate.vue +1 -1
  69. package/components/buttons/FSButtonDuplicateLabel.vue +1 -1
  70. package/components/buttons/FSButtonEdit.vue +1 -1
  71. package/components/buttons/FSButtonEditLabel.vue +1 -1
  72. package/components/buttons/FSButtonFile.vue +1 -1
  73. package/components/buttons/FSButtonFileLabel.vue +1 -1
  74. package/components/buttons/FSButtonNext.vue +1 -1
  75. package/components/buttons/FSButtonNextLabel.vue +1 -1
  76. package/components/buttons/FSButtonPrevious.vue +1 -1
  77. package/components/buttons/FSButtonPreviousLabel.vue +1 -1
  78. package/components/buttons/FSButtonRedo.vue +1 -1
  79. package/components/buttons/FSButtonRedoLabel.vue +1 -1
  80. package/components/buttons/FSButtonRemove.vue +1 -1
  81. package/components/buttons/FSButtonRemoveLabel.vue +1 -1
  82. package/components/buttons/FSButtonSave.vue +1 -1
  83. package/components/buttons/FSButtonSaveLabel.vue +1 -1
  84. package/components/buttons/FSButtonSearch.vue +1 -1
  85. package/components/buttons/FSButtonSearchLabel.vue +1 -1
  86. package/components/buttons/FSButtonUndo.vue +1 -1
  87. package/components/buttons/FSButtonUndoLabel.vue +1 -1
  88. package/components/buttons/FSButtonUpdate.vue +1 -1
  89. package/components/buttons/FSButtonUpdateLabel.vue +1 -1
  90. package/components/buttons/FSButtonValidate.vue +1 -1
  91. package/components/buttons/FSButtonValidateLabel.vue +1 -1
  92. package/components/calendar/FSSimpleCalendar.vue +145 -0
  93. package/components/calendar/FSSimpleCalendarHeader.vue +60 -0
  94. package/components/calendar/FSSimpleMonthSelector.vue +138 -0
  95. package/components/deviceOrganisations/FSConnectivity.vue +11 -1
  96. package/components/deviceOrganisations/FSConnectivityCard.vue +19 -47
  97. package/components/deviceOrganisations/FSStatus.vue +11 -1
  98. package/components/deviceOrganisations/FSStatusCard.vue +35 -61
  99. package/components/deviceOrganisations/FSStatusesCarousel.vue +1 -0
  100. package/components/deviceOrganisations/FSStatusesRow.vue +9 -3
  101. package/components/deviceOrganisations/FSWorstAlert.vue +30 -37
  102. package/components/deviceOrganisations/FSWorstAlertCard.vue +36 -85
  103. package/components/fields/FSAutocompleteField.vue +445 -463
  104. package/components/fields/FSAutocompleteTag.vue +1 -1
  105. package/components/fields/FSBaseField.vue +44 -27
  106. package/components/fields/FSColorField.vue +42 -39
  107. package/components/fields/FSCommentField.vue +105 -0
  108. package/components/fields/FSDateField.vue +3 -2
  109. package/components/fields/FSDateRangeField.vue +3 -2
  110. package/components/fields/FSDateTimeField.vue +4 -3
  111. package/components/fields/FSDateTimeRangeField.vue +8 -6
  112. package/components/fields/FSEntityFieldUI.vue +271 -0
  113. package/components/fields/FSGradientField.vue +27 -33
  114. package/components/fields/FSIconField.vue +0 -1
  115. package/components/fields/FSMagicConfigField.vue +10 -3
  116. package/components/fields/FSMagicField.vue +9 -4
  117. package/components/fields/FSNumberField.vue +6 -1
  118. package/components/fields/FSRichTextField.vue +102 -52
  119. package/components/fields/FSSearchField.vue +9 -115
  120. package/components/fields/FSSelectField.vue +477 -252
  121. package/components/fields/FSTagField.vue +1 -1
  122. package/components/fields/FSTermField.vue +42 -17
  123. package/components/fields/FSTextArea.vue +26 -7
  124. package/components/fields/FSTextField.vue +8 -3
  125. package/components/fields/FSTimeRangeField.vue +304 -0
  126. package/components/fields/FSTimeStepField.vue +3 -3
  127. package/components/fields/FSTranslateField.vue +4 -3
  128. package/components/fields/FSTranslateRichTextField.vue +32 -12
  129. package/components/fields/FSTranslateTextArea.vue +233 -0
  130. package/components/fields/periodicField/FSPeriodicDailyField.vue +2 -2
  131. package/components/fields/periodicField/FSPeriodicField.vue +8 -8
  132. package/components/fields/periodicField/FSPeriodicMonthlyField.vue +8 -8
  133. package/components/fields/periodicField/FSPeriodicWeeklyField.vue +23 -13
  134. package/components/fields/periodicField/FSPeriodicYearlyField.vue +6 -6
  135. package/components/lists/FSDataTableUI.vue +173 -103
  136. package/components/lists/FSDraggable.vue +2 -2
  137. package/components/lists/FSFilterButton.vue +7 -11
  138. package/components/lists/FSHeaderButton.vue +4 -4
  139. package/components/lists/FSHiddenButton.vue +3 -5
  140. package/components/lists/FSLoadDataTable.vue +10 -7
  141. package/components/lists/FSSimpleList.vue +234 -0
  142. package/components/lists/FSSimpleListItem.vue +132 -0
  143. package/components/map/FSMap.vue +83 -33
  144. package/components/map/FSMapFeatureGroup.vue +2 -2
  145. package/components/map/FSMapLayerButton.vue +3 -3
  146. package/components/map/FSMapMarker.vue +11 -7
  147. package/components/map/FSMapMarkerClusterGroup.vue +8 -3
  148. package/components/map/FSMapOverlay.vue +37 -20
  149. package/components/map/FSMapPolygon.vue +5 -5
  150. package/components/map/FSMapTileLayer.vue +2 -2
  151. package/components/map/keys.ts +3 -3
  152. package/components/selects/FSSelectAutoRefresh.vue +9 -9
  153. package/components/selects/FSSelectDashboardVariableType.vue +5 -4
  154. package/components/selects/FSSelectDateSetting.vue +3 -2
  155. package/components/selects/FSSelectDays.vue +9 -9
  156. package/components/selects/FSSelectListMode.vue +51 -0
  157. package/components/selects/FSSelectMonths.vue +14 -14
  158. package/components/selects/chartSelectors/FSAggregationSelector.vue +52 -0
  159. package/components/selects/chartSelectors/FSAxisTypeSelector.vue +49 -0
  160. package/components/selects/chartSelectors/FSDisplayAsSelector.vue +53 -0
  161. package/components/selects/chartSelectors/FSFilterTypeSelector.vue +54 -0
  162. package/components/selects/chartSelectors/FSHeatmapRuleSelector.vue +54 -0
  163. package/components/selects/chartSelectors/FSOperationOnSelector.vue +53 -0
  164. package/components/selects/chartSelectors/FSPlanningTypeSelector.vue +53 -0
  165. package/components/selects/chartSelectors/FSPlotPerSelector.vue +52 -0
  166. package/components/selects/chartSelectors/FSSelectEntityType.vue +59 -0
  167. package/components/selects/chartSelectors/FSSerieTypeSelector.vue +53 -0
  168. package/components/tiles/FSAlertTileUI.vue +90 -0
  169. package/components/tiles/FSChartTileUI.vue +111 -0
  170. package/components/tiles/FSCommentTileUI.vue +174 -0
  171. package/components/tiles/FSDeviceOrganisationTileUI.vue +6 -0
  172. package/components/tiles/FSGroupTileUI.vue +2 -2
  173. package/components/tiles/FSLoadTile.vue +2 -0
  174. package/components/tiles/FSLocationTileUI.vue +192 -0
  175. package/components/tiles/FSModelTileUI.vue +18 -0
  176. package/components/tiles/FSSimpleTileUI.vue +9 -4
  177. package/components/tiles/FSTile.vue +93 -74
  178. package/components/tiles/FSUserOrganisationTileUI.vue +1 -1
  179. package/components/toggleSets/FSToggleSetPosition.vue +2 -2
  180. package/components/views/FSBaseView.vue +64 -0
  181. package/components/views/FSEntityView.vue +12 -140
  182. package/components/views/FSSimpleView.vue +29 -0
  183. package/components/views/desktop/FSBaseDefaultDesktopView.vue +135 -0
  184. package/components/views/desktop/FSBaseDesktopView.vue +53 -0
  185. package/components/views/desktop/FSBaseEntityDesktopView.vue +209 -0
  186. package/components/views/mobile/FSBaseDefaultMobileView.vue +133 -0
  187. package/components/views/mobile/FSBaseEntityMobileView.vue +199 -0
  188. package/components/views/mobile/FSBaseMobileView.vue +53 -0
  189. package/composables/useBreakpoints.ts +39 -3
  190. package/composables/useColors.ts +3 -2
  191. package/composables/useMagicFieldProvider.ts +1 -0
  192. package/composables/useSlots.ts +2 -1
  193. package/models/agenda.ts +9 -0
  194. package/models/deviceAlerts.ts +1 -1
  195. package/models/deviceConnectivities.ts +1 -1
  196. package/models/index.ts +1 -0
  197. package/models/magicFields.ts +1 -0
  198. package/models/map.ts +2 -2
  199. package/models/rules.ts +8 -5
  200. package/models/tables.ts +5 -2
  201. package/models/variableNode.ts +8 -5
  202. package/package.json +5 -5
  203. package/styles/components/fs_agenda.scss +36 -0
  204. package/styles/components/fs_agenda_event.scss +41 -0
  205. package/styles/components/fs_agenda_hours_col.scss +4 -0
  206. package/styles/components/fs_agenda_hours_row.scss +5 -0
  207. package/styles/components/fs_agenda_time_line_marker.scss +19 -0
  208. package/styles/components/fs_autocomplete_field.scss +0 -13
  209. package/styles/components/fs_breadcrumbs.scss +18 -36
  210. package/styles/components/fs_button.scss +7 -5
  211. package/styles/components/fs_chip.scss +8 -6
  212. package/styles/components/fs_clickable.scss +18 -23
  213. package/styles/components/fs_clock.scss +0 -10
  214. package/styles/components/fs_color_field.scss +1 -4
  215. package/styles/components/fs_data_iterator_item.scss +12 -10
  216. package/styles/components/fs_data_table.scss +6 -9
  217. package/styles/components/fs_dialog.scss +7 -17
  218. package/styles/components/fs_dialog_menu.scss +4 -2
  219. package/styles/components/fs_edit_image.scss +8 -0
  220. package/styles/components/fs_fade_out.scss +10 -2
  221. package/styles/components/fs_filter_button.scss +1 -6
  222. package/styles/components/fs_gradient_field.scss +11 -11
  223. package/styles/components/fs_hidden_button.scss +2 -7
  224. package/styles/components/fs_image_card.scss +6 -4
  225. package/styles/components/fs_magic_config_field.scss +1 -2
  226. package/styles/components/fs_map.scss +11 -7
  227. package/styles/components/fs_meta_field.scss +3 -5
  228. package/styles/components/fs_option_group.scss +15 -5
  229. package/styles/components/fs_password_field.scss +4 -2
  230. package/styles/components/fs_progress_bar.scss +14 -0
  231. package/styles/components/fs_radio.scss +0 -11
  232. package/styles/components/fs_rich_text_field.scss +1 -9
  233. package/styles/components/fs_select_date_settings.scss +3 -0
  234. package/styles/components/fs_select_field.scss +4 -13
  235. package/styles/components/fs_slide_group.scss +7 -0
  236. package/styles/components/fs_span.scss +13 -4
  237. package/styles/components/fs_switch.scss +1 -0
  238. package/styles/components/fs_tabs.scss +19 -33
  239. package/styles/components/fs_tag.scss +8 -22
  240. package/styles/components/fs_text_area.scss +13 -17
  241. package/styles/components/fs_tile.scss +21 -15
  242. package/styles/components/fs_window.scss +7 -0
  243. package/styles/components/fs_wrap_group.scss +7 -0
  244. package/styles/components/index.scss +6 -4
  245. package/styles/globals/index.scss +1 -5
  246. package/styles/globals/overrides.scss +28 -61
  247. package/styles/globals/scrollbars.scss +10 -0
  248. package/styles/globals/text_fonts.scss +18 -66
  249. package/tools/alertsTools.ts +69 -0
  250. package/tools/chartsTools.ts +427 -0
  251. package/tools/index.ts +4 -0
  252. package/tools/reportsTools.ts +38 -0
  253. package/tools/timeRangeTools.ts +125 -0
  254. package/utils/filter.ts +18 -0
  255. package/utils/index.ts +2 -0
  256. package/utils/leafletMarkers.ts +4 -4
  257. package/utils/operations.ts +69 -0
  258. package/utils/sort.ts +2 -2
  259. package/utils/statuses.ts +1 -1
  260. package/utils/time.ts +17 -17
  261. package/components/fields/FSTimeSlotField.vue +0 -250
  262. package/components/views/FSEntityHeader.vue +0 -350
  263. package/components/views/FSListHeader.vue +0 -83
  264. package/components/views/FSListView.vue +0 -83
  265. package/components/views/FSSkeletonView.vue +0 -100
  266. package/styles/components/fs_icon_field.scss +0 -12
  267. package/styles/components/fs_tag_field.scss +0 -8
  268. package/styles/components/fs_time_field.scss +0 -12
  269. package/styles/components/fs_timeslot_field.scss +0 -12
  270. package/styles/globals/breakpoints.scss +0 -20
  271. package/styles/globals/fixes.scss +0 -5
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <v-breadcrumbs
3
- :items="$props.items"
3
+ class="fs-breadcrumbs"
4
+ :items="items"
4
5
  :style="style"
5
6
  v-bind="$attrs"
6
7
  >
@@ -8,7 +9,7 @@
8
9
  #title="{ item }"
9
10
  >
10
11
  <FSSpan
11
- :class="classes(item)"
12
+ class="fs-breadcrumbs-label"
12
13
  >
13
14
  {{ item.title }}
14
15
  </FSSpan>
@@ -30,7 +31,9 @@
30
31
  import { computed, defineComponent, type PropType, type StyleValue } from "vue";
31
32
 
32
33
  import { ColorEnum, type FSBreadcrumbItem } from "@dative-gpi/foundation-shared-components/models";
33
- import { useColors } from "@dative-gpi/foundation-shared-components/composables";
34
+ import { useBreakpoints, useColors } from "@dative-gpi/foundation-shared-components/composables";
35
+
36
+ import { sizeToVar } from "../utils";
34
37
 
35
38
  import FSSpan from "./FSSpan.vue";
36
39
  import FSIcon from "./FSIcon.vue";
@@ -48,28 +51,34 @@ export default defineComponent({
48
51
  default: () => []
49
52
  }
50
53
  },
51
- setup() {
54
+ setup(props) {
55
+ const { isExtraSmall } = useBreakpoints();
52
56
  const { getColors } = useColors();
53
57
 
54
58
  const darks = getColors(ColorEnum.Dark);
55
59
 
56
60
  const style = computed((): StyleValue => ({
61
+ "--fs-breadcrumbs-height" : sizeToVar(["20px", "16px"]),
57
62
  "--fs-breadcrumbs-color" : darks.dark,
58
63
  "--fs-breadcrumbs-active-color" : darks.base,
59
64
  "--fs-breadcrumbs-disabled-color": darks.soft
60
65
  }));
61
66
 
62
- const classes = (item: FSBreadcrumbItem): string[] => {
63
- const classNames = ["fs-breadcrumbs-label"];
64
- if (item.disabled) {
65
- classNames.push("fs-breadcrumbs-label-disabled");
67
+ const items = computed((): FSBreadcrumbItem[] => {
68
+ if (isExtraSmall.value && props.items.length > 3) {
69
+ const mobileItems: FSBreadcrumbItem[] = [0, -2, -1].map((index) => props.items.at(index)!)
70
+ mobileItems.splice(1, 0, {
71
+ title : "...",
72
+ disabled : true
73
+ });
74
+ return mobileItems;
66
75
  }
67
- return classNames;
68
- };
76
+ return props.items;
77
+ });
69
78
 
70
79
  return {
71
- style,
72
- classes
80
+ items,
81
+ style
73
82
  };
74
83
  }
75
84
  });
@@ -129,7 +129,7 @@
129
129
  <template
130
130
  v-else-if="$props.to"
131
131
  >
132
- <router-link
132
+ <FSRouterLink
133
133
  :to="$props.to"
134
134
  >
135
135
  <FSIcon
@@ -143,7 +143,7 @@
143
143
  >
144
144
  {{ $props.label }}
145
145
  </FSSpan>
146
- </router-link>
146
+ </FSRouterLink>
147
147
  </template>
148
148
  <template
149
149
  v-else
@@ -170,6 +170,7 @@ import { type RouteLocation } from "vue-router";
170
170
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
171
171
  import { useColors } from "@dative-gpi/foundation-shared-components/composables";
172
172
 
173
+ import FSRouterLink from "./FSRouterLink.vue";
173
174
  import FSClickable from "./FSClickable.vue";
174
175
  import FSSpan from "./FSSpan.vue";
175
176
  import FSIcon from "./FSIcon.vue";
@@ -185,6 +186,7 @@ const DEFAULT_PADDING = PADDING_ICON_LABEL;
185
186
  export default defineComponent({
186
187
  name: "FSButton",
187
188
  components: {
189
+ FSRouterLink,
188
190
  FSClickable,
189
191
  FSSpan,
190
192
  FSIcon,
@@ -198,7 +200,7 @@ export default defineComponent({
198
200
  default: DEFAULT_PADDING
199
201
  },
200
202
  to: {
201
- type: [String, Object] as PropType<string | RouteLocation | null>,
203
+ type: Object as PropType<RouteLocation | null>,
202
204
  required: false,
203
205
  default: null
204
206
  },
@@ -230,7 +232,7 @@ export default defineComponent({
230
232
  iconSize: {
231
233
  type: [Array, String, Number] as PropType<"s" | "m" | "l" | string[] | number[] | string | number | null>,
232
234
  required: false,
233
- default: () => ["24", "20"]
235
+ default: () => ["24px", "20px"]
234
236
  },
235
237
  variant: {
236
238
  type: String as PropType<"standard" | "full" | "icon">,
@@ -310,7 +312,7 @@ export default defineComponent({
310
312
  });
311
313
 
312
314
  const padding = computed(() => {
313
- if(props.padding !== DEFAULT_PADDING){
315
+ if (props.padding !== DEFAULT_PADDING) {
314
316
  return props.padding;
315
317
  }
316
318
 
@@ -319,16 +321,14 @@ export default defineComponent({
319
321
 
320
322
  const hasLabel = props.label || !!slots.default;
321
323
 
322
- if(!hasLabel && hasIcon){
324
+ if (!hasLabel && hasIcon) {
323
325
  return PADDING_ICON_ONLY;
324
326
  }
325
- else if(hasLabel && !hasIcon)
326
- {
327
+ else if (hasLabel && !hasIcon) {
327
328
  return PADDING_LABEL_ONLY;
328
329
  }
329
-
330
330
  return DEFAULT_PADDING;
331
- })
331
+ });
332
332
 
333
333
  const onClick = (event: MouseEvent) => {
334
334
  if (!props.to && !props.href && props.editable && !props.load) {
@@ -3,13 +3,20 @@
3
3
  width="hug"
4
4
  >
5
5
  <FSRow>
6
- <FSSpan
7
- v-if="$props.label"
8
- class="fs-calendar-label"
9
- font="text-overline"
6
+ <FSSelectField
7
+ :hideHeader="true"
8
+ :clearable="false"
9
+ :items="years"
10
+ v-model="innerYear"
11
+ />
12
+ <FSRow
13
+ align="center-right"
10
14
  >
11
- {{ $props.label }}
12
- </FSSpan>
15
+ <FSButton
16
+ :label="$tr('ui.common.today', 'Today')"
17
+ @click="onClickToday"
18
+ />
19
+ </FSRow>
13
20
  </FSRow>
14
21
  <FSCol
15
22
  class="fs-calendar"
@@ -67,10 +74,11 @@
67
74
  <script lang="ts">
68
75
  import { computed, defineComponent, onMounted, type PropType, ref, type StyleValue } from "vue";
69
76
 
70
- import { useAppTimeZone, useAppLanguageCode } from "@dative-gpi/foundation-shared-services/composables";
77
+ import { useDateFormat, useAppLanguageCode } from "@dative-gpi/foundation-shared-services/composables";
71
78
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
72
79
  import { useColors } from "@dative-gpi/foundation-shared-components/composables";
73
80
 
81
+ import FSSelectField from "./fields/FSSelectField.vue";
74
82
  import FSButton from "./FSButton.vue";
75
83
  import FSSpan from "./FSSpan.vue";
76
84
  import FSCol from "./FSCol.vue";
@@ -79,17 +87,13 @@ import FSRow from "./FSRow.vue";
79
87
  export default defineComponent({
80
88
  name: "FSCalendar",
81
89
  components: {
90
+ FSSelectField,
82
91
  FSButton,
83
92
  FSSpan,
84
93
  FSCol,
85
94
  FSRow
86
95
  },
87
96
  props: {
88
- label: {
89
- type: String as PropType<string | null>,
90
- required: false,
91
- default: null
92
- },
93
97
  modelValue: {
94
98
  type: Number as PropType<number | null>,
95
99
  required: false,
@@ -108,7 +112,7 @@ export default defineComponent({
108
112
  },
109
113
  emits: ["update:modelValue"],
110
114
  setup(props, { emit }) {
111
- const { epochToPicker, pickerToEpoch, todayToEpoch } = useAppTimeZone();
115
+ const { epochToPicker, pickerToEpoch, todayToEpoch } = useDateFormat();
112
116
  const { languageCode } = useAppLanguageCode();
113
117
  const { getColors } = useColors();
114
118
 
@@ -117,13 +121,14 @@ export default defineComponent({
117
121
 
118
122
  const colors = computed(() => getColors(props.color));
119
123
  const backgrounds = getColors(ColorEnum.Background);
124
+ const lights = getColors(ColorEnum.Light);
120
125
  const darks = getColors(ColorEnum.Dark);
121
126
 
122
127
  const style = computed((): StyleValue => ({
123
128
  "--fs-calendar-background-color" : backgrounds.base,
124
129
  "--fs-calendar-hover-background-color" : colors.value.light,
125
130
  "--fs-calendar-active-background-color": colors.value.base,
126
- "--fs-calendar-border-color" : darks.base,
131
+ "--fs-calendar-border-color" : lights.dark,
127
132
  "--fs-calendar-hover-border-color" : colors.value.base,
128
133
  "--fs-calendar-active-border-color" : colors.value.base,
129
134
  "--fs-calendar-color" : darks.base,
@@ -138,6 +143,28 @@ export default defineComponent({
138
143
  return new Intl.DateTimeFormat(languageCode.value, { month: "long", year: "numeric" }).format(date);
139
144
  });
140
145
 
146
+ const years = computed((): any[] => {
147
+ const years = [];
148
+ switch (props.limit) {
149
+ case "past":
150
+ for (let i = 1900; i < new Date().getFullYear(); i++) {
151
+ years.push({ label: i.toString(), id: i });
152
+ }
153
+ break;
154
+ case "future":
155
+ for (let i = new Date().getFullYear(); i < 2100; i++) {
156
+ years.push({ label: i.toString(), id: i });
157
+ }
158
+ break;
159
+ default:
160
+ for (let i = 1900; i < 2100; i++) {
161
+ years.push({ label: i.toString(), id: i });
162
+ }
163
+ break;
164
+ }
165
+ return years;
166
+ });
167
+
141
168
  const onClickPrevious = (): void => {
142
169
  if (innerMonth.value > 0) {
143
170
  innerMonth.value--;
@@ -165,6 +192,15 @@ export default defineComponent({
165
192
  emit("update:modelValue", pickerToEpoch(value[0]));
166
193
  };
167
194
 
195
+ const onClickToday = (): void => {
196
+ const today = new Date();
197
+ innerMonth.value = today.getMonth();
198
+ innerYear.value = today.getFullYear();
199
+
200
+ today.setHours(0, 0, 0, 0);
201
+ emit("update:modelValue", pickerToEpoch(today));
202
+ };
203
+
168
204
  const allowedDates = (value: unknown): boolean => {
169
205
  if (!(value instanceof Date)) {
170
206
  return false;
@@ -190,11 +226,13 @@ export default defineComponent({
190
226
  text,
191
227
  innerMonth,
192
228
  innerYear,
229
+ years,
193
230
  epochToPicker,
194
231
  pickerToEpoch,
195
232
  onClickPrevious,
196
233
  onClickNext,
197
234
  onClickDate,
235
+ onClickToday,
198
236
  allowedDates
199
237
  };
200
238
  }
@@ -2,15 +2,22 @@
2
2
  <FSCol
3
3
  width="hug"
4
4
  >
5
- <FSRow
6
- v-if="$props.label"
7
- >
8
- <FSSpan
9
- class="fs-calendar-label"
10
- font="text-overline"
5
+ <FSRow>
6
+ <FSSelectField
7
+ :hideHeader="true"
8
+ :clearable="false"
9
+ :items="years"
10
+ :modelValue="innerLeftYear"
11
+ @update:modelValue="onChangeYear"
12
+ />
13
+ <FSRow
14
+ align="center-right"
11
15
  >
12
- {{ $props.label }}
13
- </FSSpan>
16
+ <FSButton
17
+ :label="$tr('ui.common.today', 'Today')"
18
+ @click="onClickToday"
19
+ />
20
+ </FSRow>
14
21
  </FSRow>
15
22
  <FSRow
16
23
  class="fs-calendar-twin"
@@ -114,10 +121,11 @@
114
121
  <script lang="ts">
115
122
  import { computed, defineComponent, onMounted, type PropType, ref, type StyleValue } from "vue";
116
123
 
117
- import { useAppTimeZone, useAppLanguageCode } from "@dative-gpi/foundation-shared-services/composables";
124
+ import { useDateFormat, useAppLanguageCode } from "@dative-gpi/foundation-shared-services/composables";
118
125
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
119
126
  import { useColors } from "@dative-gpi/foundation-shared-components/composables";
120
127
 
128
+ import FSSelectField from "./fields/FSSelectField.vue";
121
129
  import FSButton from "./FSButton.vue";
122
130
  import FSSpan from "./FSSpan.vue";
123
131
  import FSCol from "./FSCol.vue";
@@ -126,17 +134,13 @@ import FSRow from "./FSRow.vue";
126
134
  export default defineComponent({
127
135
  name: "FSCalendarTwin",
128
136
  components: {
137
+ FSSelectField,
129
138
  FSButton,
130
139
  FSSpan,
131
140
  FSCol,
132
141
  FSRow
133
142
  },
134
143
  props: {
135
- label: {
136
- type: String as PropType<string | null>,
137
- required: false,
138
- default: null
139
- },
140
144
  modelValue: {
141
145
  type: Array as PropType<number[] | null>,
142
146
  required: false,
@@ -155,7 +159,7 @@ export default defineComponent({
155
159
  },
156
160
  emits: ["update:modelValue"],
157
161
  setup(props, { emit }) {
158
- const { epochToPicker, epochToPickerHeader, pickerToEpoch, todayToEpoch } = useAppTimeZone();
162
+ const { epochToPicker, epochToPickerHeader, pickerToEpoch, todayToEpoch } = useDateFormat();
159
163
  const { languageCode } = useAppLanguageCode();
160
164
  const { getColors } = useColors();
161
165
 
@@ -165,17 +169,16 @@ export default defineComponent({
165
169
  const innerRightMonth = ref(new Date().getMonth());
166
170
  const innerRightYear = ref(new Date().getFullYear());
167
171
 
168
- const toggle = ref((props.modelValue?.length ?? 0) % 2);
169
-
170
172
  const colors = computed(() => getColors(props.color));
171
173
  const backgrounds = getColors(ColorEnum.Background);
174
+ const lights = getColors(ColorEnum.Light);
172
175
  const darks = getColors(ColorEnum.Dark);
173
176
 
174
177
  const style = computed((): StyleValue => ({
175
178
  "--fs-calendar-background-color" : backgrounds.base,
176
179
  "--fs-calendar-hover-background-color" : colors.value.light,
177
180
  "--fs-calendar-active-background-color": colors.value.base,
178
- "--fs-calendar-border-color" : darks.base,
181
+ "--fs-calendar-border-color" : lights.dark,
179
182
  "--fs-calendar-hover-border-color" : colors.value.base,
180
183
  "--fs-calendar-active-border-color" : colors.value.base,
181
184
  "--fs-calendar-color" : darks.base,
@@ -261,6 +264,28 @@ export default defineComponent({
261
264
  return classNames;
262
265
  });
263
266
 
267
+ const years = computed((): any[] => {
268
+ const years = [];
269
+ switch (props.limit) {
270
+ case "past":
271
+ for (let i = 1900; i < new Date().getFullYear(); i++) {
272
+ years.push({ label: i.toString(), id: i });
273
+ }
274
+ break;
275
+ case "future":
276
+ for (let i = new Date().getFullYear(); i < 2100; i++) {
277
+ years.push({ label: i.toString(), id: i });
278
+ }
279
+ break;
280
+ default:
281
+ for (let i = 1900; i < 2100; i++) {
282
+ years.push({ label: i.toString(), id: i });
283
+ }
284
+ break;
285
+ }
286
+ return years;
287
+ });
288
+
264
289
  const compare = (operator: "before" | "during" | "after", side: "left" | "right", date: { d: number, m: number, y: number }): boolean => {
265
290
  switch (operator) {
266
291
  case "before":
@@ -323,45 +348,73 @@ export default defineComponent({
323
348
 
324
349
  const onClickLeft = (value: unknown): void => {
325
350
  const dates = value as Date[];
326
- const clicked = pickerToEpoch(dates[dates.length - 1]);
327
- if (!props.modelValue || !props.modelValue.length) {
328
- emit("update:modelValue", [clicked, clicked]);
351
+
352
+ // Click on the same date while only one date is selected on the left calendar
353
+ if (dates.length === 0) {
354
+ if (props.modelValue && props.modelValue.length > 0) {
355
+ emit("update:modelValue", [props.modelValue[0], props.modelValue[0]]);
356
+ }
357
+ return;
329
358
  }
330
- else if (props.modelValue.length === 1) {
359
+
360
+ const clicked = pickerToEpoch(dates[dates.length - 1]);
361
+ if (props.modelValue && props.modelValue[0] === props.modelValue[1]) {
331
362
  emit("update:modelValue", [props.modelValue[0], clicked].sort());
332
363
  }
333
364
  else {
334
- if (innerLeftValue.value.length === 0) {
335
- emit("update:modelValue", [clicked, props.modelValue[1]]);
336
- }
337
- else {
338
- emit("update:modelValue", [clicked, props.modelValue[toggle.value]].sort());
339
- toggle.value = (++toggle.value) % 2;
340
- }
365
+ emit("update:modelValue", [clicked, clicked]);
341
366
  }
342
367
  };
343
368
 
344
369
  const onClickRight = (value: unknown): void => {
345
370
  const dates = value as Date[];
371
+
372
+ // Click on the same date while only one date is selected on the right calendar
373
+ if (dates.length === 0) {
374
+ if (props.modelValue && props.modelValue.length > 0) {
375
+ emit("update:modelValue", [props.modelValue[props.modelValue.length - 1], props.modelValue[props.modelValue.length - 1]]);
376
+ }
377
+ return;
378
+ }
379
+
346
380
  const clicked = pickerToEpoch(dates[dates.length - 1]);
347
- if (!props.modelValue || !props.modelValue.length) {
381
+ if (props.modelValue && props.modelValue[0] === props.modelValue[1]) {
382
+ emit("update:modelValue", [props.modelValue[0], clicked].sort());
383
+ }
384
+ else {
348
385
  emit("update:modelValue", [clicked, clicked]);
349
386
  }
350
- else if (props.modelValue.length === 1) {
351
- emit("update:modelValue", [props.modelValue[0], clicked].sort());
387
+ };
388
+
389
+ const onClickToday = (): void => {
390
+ const today = new Date();
391
+ innerLeftMonth.value = today.getMonth();
392
+ innerLeftYear.value = today.getFullYear();
393
+
394
+ if (innerLeftMonth.value === 11) {
395
+ innerRightMonth.value = 0;
396
+ innerRightYear.value = innerLeftYear.value + 1;
352
397
  }
353
398
  else {
354
- if (innerRightValue.value.length === 0) {
355
- emit("update:modelValue", [props.modelValue[0], clicked]);
356
- }
357
- else {
358
- emit("update:modelValue", [clicked, props.modelValue[toggle.value]].sort());
359
- toggle.value = (++toggle.value) % 2;
360
- }
399
+ innerRightMonth.value = innerLeftMonth.value + 1;
400
+ innerRightYear.value = innerLeftYear.value;
361
401
  }
362
- toggle.value = (++toggle.value) % 2;
402
+
403
+ today.setHours(0, 0, 0, 0);
404
+ emit("update:modelValue", [pickerToEpoch(today), pickerToEpoch(today)]);
363
405
  };
364
406
 
407
+ const onChangeYear = (value: number): void => {
408
+ if (innerRightYear.value !== innerLeftYear.value) {
409
+ innerLeftYear.value = value;
410
+ innerRightYear.value = value + 1;
411
+ }
412
+ else {
413
+ innerLeftYear.value = value;
414
+ innerRightYear.value = value;
415
+ }
416
+ }
417
+
365
418
  const allowedDates = (value: unknown): boolean => {
366
419
  if (!(value instanceof Date)) {
367
420
  return false;
@@ -414,11 +467,14 @@ export default defineComponent({
414
467
  innerRightMonth,
415
468
  innerRightYear,
416
469
  innerRightValue,
470
+ years,
417
471
  epochToPicker,
418
472
  onClickPrevious,
419
473
  onClickNext,
420
474
  onClickLeft,
421
475
  onClickRight,
476
+ onClickToday,
477
+ onChangeYear,
422
478
  allowedDates
423
479
  };
424
480
  }
@@ -105,7 +105,7 @@ export default defineComponent({
105
105
  const { getColors, getGradients } = useColors();
106
106
 
107
107
  const colors = computed(() => {
108
- if(Array.isArray(props.color)) {
108
+ if (Array.isArray(props.color)) {
109
109
  return getColors(props.color[0]);
110
110
  }
111
111
  return getColors(props.color);
@@ -115,6 +115,23 @@ export default defineComponent({
115
115
  const lights = getColors(ColorEnum.Light);
116
116
  const darks = getColors(ColorEnum.Dark);
117
117
 
118
+ const borderColor = computed((): ColorBase => {
119
+ switch (props.variant) {
120
+ case "background":
121
+ return lights.dark;
122
+ case "standard" :
123
+ if (Array.isArray(props.color)) {
124
+ return colors.value.lightContrast!;
125
+ }
126
+ if (([ColorEnum.Background, ColorEnum.Light, ColorEnum.Dark] as ColorBase[]).includes(props.color)) {
127
+ return lights.dark;
128
+ }
129
+ return colors.value.lightContrast!;
130
+ case "full" : return colors.value.base;
131
+ case "gradient" : return colors.value.lightContrast!;
132
+ }
133
+ });
134
+
118
135
  const style = computed((): StyleValue => {
119
136
  switch (props.variant) {
120
137
  case "background": return {
@@ -125,7 +142,7 @@ export default defineComponent({
125
142
  "--fs-card-height" : sizeToVar(props.height),
126
143
  "--fs-card-width" : sizeToVar(props.width),
127
144
  "--fs-card-background-color": backgrounds.base,
128
- "--fs-card-border-color" : lights.dark,
145
+ "--fs-card-border-color" : borderColor.value,
129
146
  "--fs-card-color" : darks.base
130
147
  }
131
148
  case "standard": return {
@@ -136,7 +153,7 @@ export default defineComponent({
136
153
  "--fs-card-height" : sizeToVar(props.height),
137
154
  "--fs-card-width" : sizeToVar(props.width),
138
155
  "--fs-card-background-color": colors.value.light,
139
- "--fs-card-border-color" : colors.value.lightContrast!,
156
+ "--fs-card-border-color" : borderColor.value,
140
157
  "--fs-card-color" : colors.value.lightContrast!
141
158
  }
142
159
  case "full": return {
@@ -147,7 +164,7 @@ export default defineComponent({
147
164
  "--fs-card-height" : sizeToVar(props.height),
148
165
  "--fs-card-width" : sizeToVar(props.width),
149
166
  "--fs-card-background-color": colors.value.base,
150
- "--fs-card-border-color" : colors.value.base,
167
+ "--fs-card-border-color" : borderColor.value,
151
168
  "--fs-card-color" : colors.value.baseContrast!
152
169
  }
153
170
  case "gradient": return {
@@ -158,19 +175,23 @@ export default defineComponent({
158
175
  "--fs-card-height" : sizeToVar(props.height),
159
176
  "--fs-card-width" : sizeToVar(props.width),
160
177
  "--fs-card-background-color": gradients.value.base,
161
- "--fs-card-border-color" : colors.value.lightContrast!,
178
+ "--fs-card-border-color" : borderColor.value,
162
179
  "--fs-card-color" : colors.value.lightContrast!
163
180
  }
164
181
  }
165
182
  });
166
183
 
167
184
  const classes = computed((): string[] => {
168
- const classNames = ["fs-card", "fs-background"];
185
+ const classNames = ["fs-card"];
169
186
  switch(props.variant) {
170
187
  case "gradient":
171
188
  classNames.push("fs-card-gradient");
172
189
  break;
173
- default:
190
+ case "background":
191
+ classNames.push("fs-card-background");
192
+ classNames.push("fs-card-clickable");
193
+ break;
194
+ default:
174
195
  classNames.push("fs-card-background");
175
196
  break;
176
197
  }
@@ -1,11 +1,11 @@
1
1
  <template>
2
- <FSClickable
2
+ <component
3
+ :is="$attrs.onClick ? FSClickable : FSCard"
3
4
  borderStyle="dashed"
4
5
  padding="24px"
5
6
  :height="$props.height"
6
7
  :width="$props.width"
7
8
  :border="true"
8
- @click="$emit('click')"
9
9
  v-bind="$attrs"
10
10
  >
11
11
  <FSRow
@@ -26,7 +26,7 @@
26
26
  {{ $props.label }}
27
27
  </FSText>
28
28
  </FSRow>
29
- </FSClickable>
29
+ </component>
30
30
  </template>
31
31
 
32
32
  <script lang="ts">
@@ -35,6 +35,7 @@ import { defineComponent, type PropType } from "vue";
35
35
  import { ColorEnum } from "../models";
36
36
 
37
37
  import FSClickable from "./FSClickable.vue";
38
+ import FSCard from "./FSCard.vue";
38
39
  import FSIcon from "./FSIcon.vue";
39
40
  import FSText from "./FSText.vue";
40
41
  import FSRow from "./FSRow.vue";
@@ -43,6 +44,7 @@ export default defineComponent({
43
44
  name: "FSCardPlaceholder",
44
45
  components: {
45
46
  FSClickable,
47
+ FSCard,
46
48
  FSIcon,
47
49
  FSText,
48
50
  FSRow
@@ -69,10 +71,11 @@ export default defineComponent({
69
71
  default: null
70
72
  }
71
73
  },
72
- emits: ["click"],
73
74
  setup() {
74
75
  return {
75
- ColorEnum
76
+ ColorEnum,
77
+ FSClickable,
78
+ FSCard,
76
79
  };
77
80
  }
78
81
  });