@dative-gpi/foundation-shared-components 1.0.57 → 1.0.58-groupings

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 (297) hide show
  1. package/assets/images/map/snow.png +0 -0
  2. package/components/FSAccordionPanel.vue +40 -21
  3. package/components/FSBreadcrumbs.vue +21 -12
  4. package/components/FSButton.vue +16 -16
  5. package/components/FSCalendar.vue +50 -12
  6. package/components/FSCalendarTwin.vue +95 -43
  7. package/components/FSCard.vue +61 -9
  8. package/components/FSCardPlaceholder.vue +8 -5
  9. package/components/FSCheckbox.vue +5 -4
  10. package/components/FSChip.vue +73 -45
  11. package/components/FSChipGroup.vue +69 -0
  12. package/components/FSClickable.vue +11 -9
  13. package/components/FSClock.vue +30 -12
  14. package/components/FSCol.vue +11 -5
  15. package/components/FSColorIcon.vue +23 -5
  16. package/components/FSDialog.vue +2 -1
  17. package/components/FSDialogContent.vue +12 -11
  18. package/components/FSDialogForm.vue +22 -2
  19. package/components/FSDialogFormBody.vue +50 -31
  20. package/components/FSDialogMenu.vue +17 -8
  21. package/components/FSDialogMultiFormBody.vue +23 -13
  22. package/components/FSDialogRemove.vue +7 -8
  23. package/components/FSDialogSubmit.vue +20 -11
  24. package/components/FSEditImage.vue +1 -1
  25. package/components/FSEditImageUI.vue +20 -10
  26. package/components/FSFadeOut.vue +53 -21
  27. package/components/FSForm.vue +10 -8
  28. package/components/FSGrid.vue +1 -1
  29. package/components/FSIcon.vue +4 -3
  30. package/components/FSIconCard.vue +68 -12
  31. package/components/FSImage.vue +9 -2
  32. package/components/FSImageUI.vue +8 -15
  33. package/components/FSInformationsMenu.vue +142 -0
  34. package/components/FSInstantPicker.vue +269 -0
  35. package/components/FSLink.vue +25 -9
  36. package/components/FSLoader.vue +28 -10
  37. package/components/FSMenu.vue +47 -0
  38. package/components/FSOptionGroup.vue +57 -9
  39. package/components/FSOptionItem.vue +4 -4
  40. package/components/FSPagination.vue +1 -1
  41. package/components/FSPlayButtons.vue +72 -0
  42. package/components/FSProgressBar.vue +94 -0
  43. package/components/FSRadio.vue +5 -4
  44. package/components/FSRadioGroup.vue +3 -3
  45. package/components/FSRouterLink.vue +42 -0
  46. package/components/FSSlideGroup.vue +19 -5
  47. package/components/FSSlider.vue +6 -5
  48. package/components/FSSpan.vue +12 -7
  49. package/components/FSSwitch.vue +47 -21
  50. package/components/FSTab.vue +15 -13
  51. package/components/FSTabs.vue +32 -7
  52. package/components/FSTag.vue +16 -5
  53. package/components/FSTagGroup.vue +4 -4
  54. package/components/FSText.vue +11 -7
  55. package/components/FSToggleSet.vue +7 -7
  56. package/components/FSWindow.vue +122 -5
  57. package/components/FSWrapGroup.vue +13 -1
  58. package/components/agenda/FSAgenda.vue +26 -7
  59. package/components/agenda/FSAgendaDialogCalendar.vue +2 -2
  60. package/components/agenda/FSAgendaHeader.vue +35 -10
  61. package/components/agenda/FSAgendaHorizontalEvent.vue +18 -6
  62. package/components/agenda/FSAgendaHoursRow.vue +48 -8
  63. package/components/agenda/FSAgendaVerticalEvent.vue +1 -1
  64. package/components/agenda/FSDayAgenda.vue +1 -2
  65. package/components/agenda/FSMonthAgenda.vue +3 -9
  66. package/components/agenda/FSSelectAgendaMode.vue +2 -2
  67. package/components/agenda/FSWeekAgenda.vue +7 -13
  68. package/components/autocompletes/FSAutoCompleteAddress.vue +25 -20
  69. package/components/autocompletes/FSAutocompleteLanguage.vue +7 -1
  70. package/components/autocompletes/FSAutocompleteTimeZone.vue +7 -1
  71. package/components/buttons/FSButtonAdd.vue +1 -1
  72. package/components/buttons/FSButtonAddLabel.vue +1 -1
  73. package/components/buttons/FSButtonCancel.vue +1 -1
  74. package/components/buttons/FSButtonCancelLabel.vue +1 -1
  75. package/components/buttons/FSButtonCheckbox.vue +4 -4
  76. package/components/buttons/FSButtonCopy.vue +1 -1
  77. package/components/buttons/FSButtonCopyLabel.vue +1 -1
  78. package/components/buttons/FSButtonDuplicate.vue +1 -1
  79. package/components/buttons/FSButtonDuplicateLabel.vue +1 -1
  80. package/components/buttons/FSButtonEdit.vue +1 -1
  81. package/components/buttons/FSButtonEditLabel.vue +1 -1
  82. package/components/buttons/FSButtonFile.vue +1 -1
  83. package/components/buttons/FSButtonFileLabel.vue +1 -1
  84. package/components/buttons/FSButtonNext.vue +1 -1
  85. package/components/buttons/FSButtonNextLabel.vue +1 -1
  86. package/components/buttons/FSButtonPrevious.vue +1 -1
  87. package/components/buttons/FSButtonPreviousLabel.vue +1 -1
  88. package/components/buttons/FSButtonRedo.vue +1 -1
  89. package/components/buttons/FSButtonRedoLabel.vue +1 -1
  90. package/components/buttons/FSButtonRemove.vue +1 -1
  91. package/components/buttons/FSButtonRemoveLabel.vue +1 -1
  92. package/components/buttons/FSButtonSave.vue +1 -1
  93. package/components/buttons/FSButtonSaveLabel.vue +1 -1
  94. package/components/buttons/FSButtonSearch.vue +1 -1
  95. package/components/buttons/FSButtonSearchLabel.vue +1 -1
  96. package/components/buttons/FSButtonUndo.vue +1 -1
  97. package/components/buttons/FSButtonUndoLabel.vue +1 -1
  98. package/components/buttons/FSButtonUpdate.vue +1 -1
  99. package/components/buttons/FSButtonUpdateLabel.vue +1 -1
  100. package/components/buttons/FSButtonValidate.vue +1 -1
  101. package/components/buttons/FSButtonValidateLabel.vue +1 -1
  102. package/components/calendar/FSSimpleCalendar.vue +145 -0
  103. package/components/calendar/FSSimpleCalendarHeader.vue +60 -0
  104. package/components/calendar/FSSimpleMonthSelector.vue +138 -0
  105. package/components/deviceOrganisations/FSConnectivity.vue +16 -4
  106. package/components/deviceOrganisations/FSConnectivityCard.vue +17 -45
  107. package/components/deviceOrganisations/FSStatus.vue +16 -4
  108. package/components/deviceOrganisations/FSStatusCard.vue +33 -59
  109. package/components/deviceOrganisations/FSStatusRichCard.vue +171 -0
  110. package/components/deviceOrganisations/FSStatusesCarousel.vue +1 -0
  111. package/components/deviceOrganisations/FSStatusesRow.vue +8 -2
  112. package/components/deviceOrganisations/FSWorstAlert.vue +37 -42
  113. package/components/deviceOrganisations/FSWorstAlertCard.vue +35 -84
  114. package/components/fields/FSAutocompleteField.vue +85 -82
  115. package/components/fields/FSAutocompleteTag.vue +1 -1
  116. package/components/fields/FSBaseField.vue +54 -30
  117. package/components/fields/FSClosableSearchField.vue +83 -0
  118. package/components/fields/FSColorField.vue +48 -44
  119. package/components/fields/FSCommentField.vue +28 -16
  120. package/components/fields/FSDateField.vue +13 -10
  121. package/components/fields/FSDateRangeField.vue +6 -5
  122. package/components/fields/FSDateTimeField.vue +14 -11
  123. package/components/fields/FSDateTimeRangeDialog.vue +160 -0
  124. package/components/fields/FSDateTimeRangeField.vue +23 -115
  125. package/components/fields/FSEntityFieldUI.vue +36 -19
  126. package/components/fields/FSGradientField.vue +5 -5
  127. package/components/fields/FSIconField.vue +16 -9
  128. package/components/fields/FSMagicConfigField.vue +15 -7
  129. package/components/fields/FSMagicField.vue +7 -2
  130. package/components/fields/FSNumberField.vue +9 -4
  131. package/components/fields/FSPasswordField.vue +7 -7
  132. package/components/fields/FSRichTextField.vue +78 -58
  133. package/components/fields/FSSearchField.vue +9 -115
  134. package/components/fields/FSSelectField.vue +69 -71
  135. package/components/fields/FSTagField.vue +10 -10
  136. package/components/fields/FSTermField.vue +72 -47
  137. package/components/fields/FSTextArea.vue +17 -11
  138. package/components/fields/FSTextField.vue +15 -10
  139. package/components/fields/FSTimeField.vue +14 -10
  140. package/components/fields/FSTimeRangeField.vue +310 -0
  141. package/components/fields/FSTimeStepField.vue +5 -5
  142. package/components/fields/FSTranslateField.vue +10 -10
  143. package/components/fields/FSTranslateRichTextField.vue +41 -20
  144. package/components/fields/FSTranslateTextArea.vue +10 -10
  145. package/components/fields/FSTreeViewField.vue +15 -13
  146. package/components/fields/periodicField/FSPeriodicDailyField.vue +7 -7
  147. package/components/fields/periodicField/FSPeriodicField.vue +15 -15
  148. package/components/fields/periodicField/FSPeriodicMonthlyField.vue +16 -16
  149. package/components/fields/periodicField/FSPeriodicWeeklyField.vue +28 -18
  150. package/components/fields/periodicField/FSPeriodicYearlyField.vue +12 -12
  151. package/components/lists/FSDataIteratorItem.vue +23 -67
  152. package/components/lists/FSDataTableUI.vue +220 -137
  153. package/components/lists/FSDraggable.vue +2 -2
  154. package/components/lists/FSFilterButton.vue +14 -16
  155. package/components/lists/FSHeaderButton.vue +11 -9
  156. package/components/lists/FSHiddenButton.vue +9 -9
  157. package/components/lists/FSLoadDataTable.vue +10 -7
  158. package/components/lists/FSSimpleList.vue +95 -82
  159. package/components/lists/FSSimpleListItem.vue +131 -0
  160. package/components/map/FSMap.vue +146 -158
  161. package/components/map/FSMapFeatureGroup.vue +7 -1
  162. package/components/map/FSMapLayerButton.vue +4 -3
  163. package/components/map/FSMapMarker.vue +70 -48
  164. package/components/map/FSMapMarkerClusterGroup.vue +32 -7
  165. package/components/map/FSMapOverlay.vue +44 -24
  166. package/components/map/FSMapPolygon.vue +16 -4
  167. package/components/map/FSMapTileLayer.vue +26 -9
  168. package/components/map/layers.ts +0 -0
  169. package/components/selects/FSSelectAutoRefresh.vue +8 -8
  170. package/components/selects/FSSelectDashboardVariableType.vue +4 -3
  171. package/components/selects/FSSelectDateSetting.vue +2 -2
  172. package/components/selects/FSSelectDays.vue +8 -8
  173. package/components/selects/FSSelectListMode.vue +2 -2
  174. package/components/selects/FSSelectMapLayer.vue +68 -0
  175. package/components/selects/FSSelectMonths.vue +13 -13
  176. package/components/selects/chartSelectors/FSAggregationSelector.vue +52 -0
  177. package/components/selects/chartSelectors/FSAxisTypeSelector.vue +49 -0
  178. package/components/selects/chartSelectors/FSDisplayAsSelector.vue +53 -0
  179. package/components/selects/chartSelectors/FSFilterTypeSelector.vue +54 -0
  180. package/components/selects/chartSelectors/FSHeatmapRuleSelector.vue +54 -0
  181. package/components/selects/chartSelectors/FSOperationOnSelector.vue +53 -0
  182. package/components/selects/chartSelectors/FSPlanningTypeSelector.vue +53 -0
  183. package/components/selects/chartSelectors/FSPlotPerSelector.vue +52 -0
  184. package/components/selects/chartSelectors/FSSelectEntityType.vue +59 -0
  185. package/components/selects/chartSelectors/FSSerieTypeSelector.vue +53 -0
  186. package/components/tiles/FSAlertTileUI.vue +90 -0
  187. package/components/tiles/FSChartTileUI.vue +61 -52
  188. package/components/tiles/FSCommentTileUI.vue +38 -13
  189. package/components/tiles/FSDashboardOrganisationTypeTileUI.vue +14 -2
  190. package/components/tiles/FSDashboardShallowTileUI.vue +14 -2
  191. package/components/tiles/FSDeviceOrganisationTileUI.vue +6 -6
  192. package/components/tiles/FSGroupTileUI.vue +58 -110
  193. package/components/tiles/FSGroupingTileUI.vue +115 -0
  194. package/components/tiles/FSLoadTile.vue +16 -10
  195. package/components/tiles/FSLocationTileUI.vue +63 -55
  196. package/components/tiles/FSModelTileUI.vue +5 -46
  197. package/components/tiles/FSServiceAccountOrganisationTileUI.vue +0 -6
  198. package/components/tiles/FSSimpleTileUI.vue +34 -29
  199. package/components/tiles/FSTile.vue +46 -39
  200. package/components/tiles/FSUserOrganisationTileUI.vue +1 -7
  201. package/components/toggleSets/FSToggleSetPosition.vue +1 -1
  202. package/components/views/FSBaseView.vue +64 -0
  203. package/components/views/FSEntityView.vue +12 -140
  204. package/components/views/FSSimpleView.vue +29 -0
  205. package/components/views/desktop/FSBaseDefaultDesktopView.vue +135 -0
  206. package/components/views/desktop/FSBaseDesktopView.vue +53 -0
  207. package/components/views/desktop/FSBaseEntityDesktopView.vue +211 -0
  208. package/components/views/mobile/FSBaseDefaultMobileView.vue +133 -0
  209. package/components/views/mobile/FSBaseEntityMobileView.vue +206 -0
  210. package/components/views/mobile/FSBaseMobileView.vue +53 -0
  211. package/composables/index.ts +1 -0
  212. package/composables/useAddress.ts +40 -8
  213. package/composables/useBreakpoints.ts +40 -4
  214. package/composables/useColors.ts +16 -7
  215. package/composables/useMagicFieldProvider.ts +1 -0
  216. package/composables/useMapLayers.ts +62 -0
  217. package/composables/useSlots.ts +2 -1
  218. package/models/colors.ts +2 -1
  219. package/models/deviceAlerts.ts +1 -0
  220. package/models/magicFields.ts +1 -0
  221. package/models/map.ts +12 -10
  222. package/models/rules.ts +6 -3
  223. package/models/tables.ts +5 -2
  224. package/models/variableNode.ts +8 -5
  225. package/package.json +5 -5
  226. package/styles/components/fs_agenda.scss +4 -0
  227. package/styles/components/fs_agenda_event.scss +1 -1
  228. package/styles/components/fs_agenda_hours_row.scss +0 -8
  229. package/styles/components/fs_autocomplete_field.scss +0 -13
  230. package/styles/components/fs_breadcrumbs.scss +18 -36
  231. package/styles/components/fs_button.scss +7 -5
  232. package/styles/components/fs_calendar.scss +1 -0
  233. package/styles/components/fs_card.scss +9 -0
  234. package/styles/components/fs_chip.scss +13 -7
  235. package/styles/components/fs_clickable.scss +16 -23
  236. package/styles/components/fs_clock.scss +0 -10
  237. package/styles/components/fs_col.scss +1 -1
  238. package/styles/components/fs_color_field.scss +1 -4
  239. package/styles/components/fs_data_table.scss +6 -9
  240. package/styles/components/fs_dialog.scss +4 -10
  241. package/styles/components/fs_dialog_menu.scss +4 -2
  242. package/styles/components/fs_draggable.scss +0 -5
  243. package/styles/components/fs_edit_image.scss +8 -0
  244. package/styles/components/fs_fade_out.scss +10 -2
  245. package/styles/components/fs_filter_button.scss +1 -6
  246. package/styles/components/fs_hidden_button.scss +2 -7
  247. package/styles/components/fs_image_card.scss +6 -4
  248. package/styles/components/fs_magic_config_field.scss +1 -2
  249. package/styles/components/fs_map.scss +57 -17
  250. package/styles/components/fs_meta_field.scss +3 -5
  251. package/styles/components/fs_option_group.scss +15 -5
  252. package/styles/components/fs_password_field.scss +4 -2
  253. package/styles/components/fs_progress_bar.scss +14 -0
  254. package/styles/components/fs_radio.scss +0 -11
  255. package/styles/components/fs_rich_text_field.scss +1 -10
  256. package/styles/components/fs_select_field.scss +4 -13
  257. package/styles/components/fs_slide_group.scss +7 -0
  258. package/styles/components/fs_span.scss +13 -5
  259. package/styles/components/fs_status_rich_card.scss +6 -0
  260. package/styles/components/fs_switch.scss +1 -0
  261. package/styles/components/fs_tabs.scss +19 -34
  262. package/styles/components/fs_tag.scss +8 -22
  263. package/styles/components/fs_text_area.scss +2 -21
  264. package/styles/components/fs_tile.scss +0 -19
  265. package/styles/components/fs_window.scss +3 -1
  266. package/styles/components/fs_wrap_group.scss +7 -0
  267. package/styles/components/index.scss +2 -6
  268. package/styles/globals/index.scss +1 -5
  269. package/styles/globals/overrides.scss +28 -61
  270. package/styles/globals/scrollbars.scss +8 -0
  271. package/styles/globals/text_fonts.scss +18 -66
  272. package/styles/globals/touchscreen.scss +2 -2
  273. package/tools/alertsTools.ts +87 -12
  274. package/tools/chartsTools.ts +143 -16
  275. package/tools/index.ts +3 -1
  276. package/tools/reportsTools.ts +38 -0
  277. package/tools/timeRangeTools.ts +125 -0
  278. package/utils/badge.ts +9 -5
  279. package/utils/filter.ts +7 -4
  280. package/utils/index.ts +1 -0
  281. package/utils/leafletMarkers.ts +4 -4
  282. package/utils/operations.ts +108 -0
  283. package/utils/sort.ts +2 -2
  284. package/utils/time.ts +16 -16
  285. package/components/fields/FSTimeSlotField.vue +0 -250
  286. package/components/views/FSEntityHeader.vue +0 -350
  287. package/components/views/FSListHeader.vue +0 -83
  288. package/components/views/FSListView.vue +0 -83
  289. package/components/views/FSSkeletonView.vue +0 -100
  290. package/styles/components/fs_data_iterator_item.scss +0 -33
  291. package/styles/components/fs_icon_field.scss +0 -12
  292. package/styles/components/fs_search_field.scss +0 -3
  293. package/styles/components/fs_tag_field.scss +0 -8
  294. package/styles/components/fs_time_field.scss +0 -12
  295. package/styles/components/fs_timeslot_field.scss +0 -12
  296. package/styles/globals/breakpoints.scss +0 -20
  297. package/styles/globals/fixes.scss +0 -5
@@ -1,12 +1,13 @@
1
1
  <template>
2
2
  <FSCol
3
- width="hug"
3
+ padding="8px 0px"
4
4
  >
5
5
  <FSRow
6
- width="hug"
7
- align="center-left"
6
+ gap="16px"
7
+ :wrap="false"
8
8
  >
9
9
  <v-switch
10
+ v-if="variant == 'left'"
10
11
  class="fs-switch"
11
12
  hide-details
12
13
  inset
@@ -14,11 +15,12 @@
14
15
  :rules="$props.rules"
15
16
  :ripple="false"
16
17
  :style="style"
18
+ :disabled="$props.disabled"
17
19
  :modelValue="$props.modelValue"
18
20
  @update:modelValue="onToggle"
19
21
  v-bind="$attrs"
20
22
  />
21
- <slot>
23
+ <FSCol>
22
24
  <FSSpan
23
25
  v-if="$props.label"
24
26
  class="fs-switch-label"
@@ -28,20 +30,39 @@
28
30
  >
29
31
  {{ $props.label }}
30
32
  </FSSpan>
31
- </slot>
32
- </FSRow>
33
- <slot
34
- name="description"
35
- >
36
- <FSSpan
37
- v-if="$props.description"
38
- class="fs-switch-description"
39
- font="text-overline"
40
- :style="style"
33
+ <slot
34
+ name="description"
35
+ >
36
+ <FSSpan
37
+ v-if="$props.description"
38
+ class="fs-switch-description"
39
+ font="text-overline"
40
+ :style="style"
41
+ :lineClamp="2"
42
+ >
43
+ {{ $props.description }}
44
+ </FSSpan>
45
+ </slot>
46
+ </FSCol>
47
+ <FSRow
48
+ v-if="variant == 'right'"
49
+ align="center-right"
41
50
  >
42
- {{ $props.description }}
43
- </FSSpan>
44
- </slot>
51
+ <v-switch
52
+ class="fs-switch"
53
+ hide-details
54
+ inset
55
+ :disabled="$props.disabled"
56
+ :validateOn="validateOn"
57
+ :rules="$props.rules"
58
+ :ripple="false"
59
+ :style="style"
60
+ :modelValue="$props.modelValue"
61
+ @update:modelValue="onToggle"
62
+ v-bind="$attrs"
63
+ />
64
+ </FSRow>
65
+ </FSRow>
45
66
  </FSCol>
46
67
  </template>
47
68
 
@@ -78,6 +99,11 @@ export default defineComponent({
78
99
  required: false,
79
100
  default: false
80
101
  },
102
+ variant: {
103
+ type: String as PropType<"left" | "right">,
104
+ required: false,
105
+ default: "left"
106
+ },
81
107
  color: {
82
108
  type: String as PropType<ColorBase>,
83
109
  required: false,
@@ -93,10 +119,10 @@ export default defineComponent({
93
119
  required: false,
94
120
  default: null
95
121
  },
96
- editable: {
122
+ disabled: {
97
123
  type: Boolean,
98
124
  required: false,
99
- default: true
125
+ default: false
100
126
  }
101
127
  },
102
128
  emits: ["update:modelValue"],
@@ -111,7 +137,7 @@ export default defineComponent({
111
137
  const darks = getColors(ColorEnum.Dark);
112
138
 
113
139
  const style = computed((): StyleValue => {
114
- if (!props.editable) {
140
+ if (props.disabled) {
115
141
  return {
116
142
  "--fs-switch-translate-x": props.modelValue ? "8px" : "-8px",
117
143
  "--fs-switch-cursor" : "default",
@@ -143,7 +169,7 @@ export default defineComponent({
143
169
  const messages = computed((): string[] => props.messages ?? getMessages(props.modelValue, props.rules));
144
170
 
145
171
  const onToggle = (): void => {
146
- if (!props.editable) {
172
+ if (props.disabled) {
147
173
  return;
148
174
  }
149
175
  emit("update:modelValue", !props.modelValue);
@@ -26,19 +26,6 @@
26
26
  {{ $props.label }}
27
27
  </FSSpan>
28
28
  </slot>
29
- <v-spacer
30
- v-if="$props.tag"
31
- />
32
- <slot
33
- name="tag"
34
- >
35
- <FSSpan
36
- v-if="$props.tag"
37
- class="fs-tab-tag"
38
- >
39
- {{ $props.tag }}
40
- </FSSpan>
41
- </slot>
42
29
  <slot
43
30
  name="append"
44
31
  >
@@ -49,6 +36,21 @@
49
36
  {{ $props.appendIcon }}
50
37
  </FSIcon>
51
38
  </slot>
39
+ <FSRow
40
+ align="center-right"
41
+ :wrap="false"
42
+ >
43
+ <slot
44
+ name="tag"
45
+ >
46
+ <FSSpan
47
+ v-if="$props.tag"
48
+ class="fs-tab-tag"
49
+ >
50
+ {{ $props.tag }}
51
+ </FSSpan>
52
+ </slot>
53
+ </FSRow>
52
54
  </FSRow>
53
55
  </slot>
54
56
  </v-tab>
@@ -7,7 +7,7 @@
7
7
  :style="style"
8
8
  :grow="true"
9
9
  :modelValue="$props.tab"
10
- @update:modelValue="$emit('update:tab', $event)"
10
+ @update:modelValue="onUpdateTab($event)"
11
11
  v-bind="$attrs"
12
12
  >
13
13
  <slot/>
@@ -15,16 +15,17 @@
15
15
  </template>
16
16
 
17
17
  <script lang="ts">
18
- import { computed, defineComponent, type PropType, type StyleValue } from "vue";
18
+ import { computed, defineComponent, onMounted, type PropType, type StyleValue } from "vue";
19
+ import { useRouter } from "vue-router";
19
20
 
21
+ import { useBreakpoints, useColors } from "@dative-gpi/foundation-shared-components/composables";
20
22
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
21
- import { useColors } from "@dative-gpi/foundation-shared-components/composables";
22
23
 
23
24
  export default defineComponent({
24
25
  name: "FSTabs",
25
26
  props: {
26
27
  tab: {
27
- type: Number,
28
+ type: [String, Number, Object] as PropType<any>,
28
29
  required: false,
29
30
  default: 0
30
31
  },
@@ -32,10 +33,18 @@ export default defineComponent({
32
33
  type: String as PropType<ColorBase>,
33
34
  required: false,
34
35
  default: ColorEnum.Primary
36
+ },
37
+ recordNavigation: {
38
+ type: Boolean,
39
+ required: false,
40
+ default: false
35
41
  }
36
42
  },
37
- setup(props) {
43
+ emits: ["update:tab"],
44
+ setup(props, { emit }) {
45
+ const { isMobileSized } = useBreakpoints();
38
46
  const { getColors } = useColors();
47
+ const router = useRouter();
39
48
 
40
49
  const colors = computed(() => getColors(props.color));
41
50
  const lights = getColors(ColorEnum.Light);
@@ -48,11 +57,27 @@ export default defineComponent({
48
57
  "--fs-tab-hover-border-color" : darks.dark,
49
58
  "--fs-tab-active-background-color": colors.value.light,
50
59
  "--fs-tab-tag-background-color" : colors.value.base,
51
- "--fs-tab-tag-color" : colors.value.baseContrast!
60
+ "--fs-tab-tag-color" : colors.value.baseContrast!,
61
+ "--fs-tab-height" : isMobileSized.value ? "40px" : "48px",
62
+ "--fs-tab-tag-size" : isMobileSized.value ? "24px" : "28px"
52
63
  }));
53
64
 
65
+ const onUpdateTab = (tab: number): void => {
66
+ if (props.recordNavigation) {
67
+ router.replace({ query: { tab: tab.toString() } });
68
+ }
69
+ emit("update:tab", tab);
70
+ }
71
+
72
+ onMounted((): void => {
73
+ if (props.recordNavigation && router.currentRoute.value.query.tab) {
74
+ emit("update:tab", router.currentRoute.value.query.tab);
75
+ }
76
+ });
77
+
54
78
  return {
55
- style
79
+ style,
80
+ onUpdateTab
56
81
  };
57
82
  }
58
83
  });
@@ -1,8 +1,9 @@
1
1
  <template>
2
2
  <FSRow
3
+ align="center-center"
3
4
  class="fs-tag"
4
- width="hug"
5
- align="center-left"
5
+ :height="$props.height"
6
+ :width="$props.width"
6
7
  :style="style"
7
8
  :wrap="false"
8
9
  v-bind="$attrs"
@@ -22,7 +23,7 @@
22
23
  v-bind="{ color: $props.color, colors }"
23
24
  >
24
25
  <v-btn
25
- v-if="$props.editable"
26
+ v-if="$props.showRemove"
26
27
  class="fs-tag-button"
27
28
  :ripple="false"
28
29
  @click="$emit('remove')"
@@ -55,6 +56,16 @@ export default defineComponent({
55
56
  FSRow
56
57
  },
57
58
  props: {
59
+ height: {
60
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
61
+ required: false,
62
+ default: () => ["28px", "24px"]
63
+ },
64
+ width: {
65
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
66
+ required: false,
67
+ default: "hug"
68
+ },
58
69
  label: {
59
70
  type: String as PropType<string | null>,
60
71
  required: false,
@@ -68,9 +79,9 @@ export default defineComponent({
68
79
  color: {
69
80
  type: String as PropType<ColorBase>,
70
81
  required: false,
71
- default: ColorEnum.Primary
82
+ default: ColorEnum.Light
72
83
  },
73
- editable: {
84
+ showRemove: {
74
85
  type: Boolean,
75
86
  required: false,
76
87
  default: true
@@ -6,7 +6,7 @@
6
6
  <FSTag
7
7
  v-for="(tag, index) in $props.tags"
8
8
  :variant="$props.tagVariant"
9
- :editable="$props.editable"
9
+ :showRemove="$props.showRemove"
10
10
  :color="$props.color"
11
11
  :label="tag"
12
12
  :key="index"
@@ -21,7 +21,7 @@
21
21
  <FSTag
22
22
  v-for="(tag, index) in $props.tags"
23
23
  :variant="$props.tagVariant"
24
- :editable="$props.editable"
24
+ :showRemove="$props.showRemove"
25
25
  :color="$props.color"
26
26
  :label="tag"
27
27
  :key="index"
@@ -64,9 +64,9 @@ export default defineComponent({
64
64
  color: {
65
65
  type: String as PropType<ColorBase>,
66
66
  required: false,
67
- default: ColorEnum.Primary
67
+ default: ColorEnum.Light
68
68
  },
69
- editable: {
69
+ showRemove: {
70
70
  type: Boolean,
71
71
  required: false,
72
72
  default: true
@@ -1,20 +1,22 @@
1
1
  <template>
2
- <span
2
+ <div
3
3
  :class="classes"
4
4
  :style="style"
5
5
  v-bind="$attrs"
6
6
  >
7
- <slot>
8
- {{ $props.label }}
9
- </slot>
10
- </span>
7
+ <span>
8
+ <slot>
9
+ {{ $props.label }}
10
+ </slot>
11
+ </span>
12
+ </div>
11
13
  </template>
12
14
 
13
15
  <script lang="ts">
14
16
  import { computed, defineComponent, type PropType, type StyleValue } from "vue";
15
17
 
18
+ import { useBreakpoints, useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
16
19
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
17
- import { useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
18
20
 
19
21
  export default defineComponent({
20
22
  name: "FSText",
@@ -51,6 +53,7 @@ export default defineComponent({
51
53
  }
52
54
  },
53
55
  setup(props) {
56
+ const { fontStyles } = useBreakpoints();
54
57
  const { getColors } = useColors();
55
58
  const { slots } = useSlots();
56
59
 
@@ -58,7 +61,8 @@ export default defineComponent({
58
61
 
59
62
  const style = computed((): StyleValue => ({
60
63
  "--fs-span-line-clamp": props.lineClamp.toString(),
61
- "--fs-text-color" : colors.value[props.variant]!
64
+ "--fs-text-color" : colors.value[props.variant]!,
65
+ ...fontStyles.value
62
66
  }));
63
67
 
64
68
  const classes = computed((): string[] => {
@@ -5,13 +5,13 @@
5
5
  :modelValue="$props.modelValue"
6
6
  >
7
7
  <FSWrapGroup
8
- v-if="['wrap'].includes($props.variant)"
8
+ v-if="$props.variant && ['wrap'].includes($props.variant)"
9
9
  ref="toggleSetRef"
10
10
  :padding="$props.padding"
11
11
  :gap="$props.gap"
12
12
  >
13
13
  <template
14
- v-if="$props.values.length"
14
+ v-if="$props.values && $props.values.length"
15
15
  >
16
16
  <template
17
17
  v-if="!$slots.item"
@@ -20,7 +20,7 @@
20
20
  v-for="(item, index) in $props.values"
21
21
  :prependIcon="item.prependIcon"
22
22
  :appendIcon="item.appendIcon"
23
- :editable="$props.editable"
23
+ :disabled="$props.disabled"
24
24
  :variant="getVariant(item)"
25
25
  :color="getColor(item)"
26
26
  :class="getClass(item)"
@@ -54,7 +54,7 @@
54
54
  :gap="$props.gap"
55
55
  >
56
56
  <template
57
- v-if="$props.values.length"
57
+ v-if="$props.values && $props.values.length"
58
58
  >
59
59
  <template
60
60
  v-if="!$slots.item"
@@ -63,7 +63,7 @@
63
63
  v-for="(item, index) in $props.values"
64
64
  :prependIcon="item.prependIcon"
65
65
  :appendIcon="item.appendIcon"
66
- :editable="$props.editable"
66
+ :disabled="$props.disabled"
67
67
  :variant="getVariant(item)"
68
68
  :color="getColor(item)"
69
69
  :class="getClass(item)"
@@ -197,10 +197,10 @@ export default defineComponent({
197
197
  required: false,
198
198
  default: false
199
199
  },
200
- editable: {
200
+ disabled: {
201
201
  type: Boolean,
202
202
  required: false,
203
- default: true
203
+ default: false
204
204
  }
205
205
  },
206
206
  emits: ["update:modelValue"],
@@ -1,8 +1,54 @@
1
1
  <template>
2
+ <template
3
+ v-if="showError"
4
+ >
5
+ <slot
6
+ name="error"
7
+ v-bind="{ goBack, width: $props.width, height: $props.height }"
8
+ >
9
+ <FSRow
10
+ padding="16px"
11
+ :width="$props.width"
12
+ >
13
+ <FSCol
14
+ align="center-center"
15
+ gap="16px"
16
+ >
17
+ <FSCol
18
+ align="center-center"
19
+ >
20
+ <FSIcon
21
+ size="42px"
22
+ :color="ColorEnum.Error"
23
+ >
24
+ mdi-alert-outline
25
+ </FSIcon>
26
+ <FSText
27
+ font="text-h3"
28
+ >
29
+ {{ $tr("window.no-access-title", "Nothing to see here") }}
30
+ </FSText>
31
+ </FSCol>
32
+ <FSText
33
+ :lineClamp="2"
34
+ >
35
+ {{ $tr("window.no-access-body", "It seems you either do not have access to this content, or there is nothing to display here") }}
36
+ </FSText>
37
+ <FSButton
38
+ :label="$tr('window.no-access-button', 'Go back')"
39
+ :color="ColorEnum.Primary"
40
+ @click="goBack"
41
+ />
42
+ </FSCol>
43
+ </FSRow>
44
+ </slot>
45
+ </template>
2
46
  <v-window
3
47
  class="fs-window"
4
- :style="style"
48
+ ref="windowRef"
5
49
  :touch="false"
50
+ :style="style"
51
+ :modelValue="$props.modelValue"
6
52
  v-bind="$attrs"
7
53
  >
8
54
  <template
@@ -28,13 +74,28 @@
28
74
  </template>
29
75
 
30
76
  <script lang="ts">
31
- import { computed, defineComponent, type PropType, type StyleValue, type VNode } from "vue";
77
+ import { computed, defineComponent, type PropType, ref, type StyleValue, type VNode, watch } from "vue";
32
78
 
33
79
  import { useSlots } from "@dative-gpi/foundation-shared-components/composables";
34
80
  import { sizeToVar } from "@dative-gpi/foundation-shared-components/utils";
35
81
 
82
+ import { ColorEnum } from "../models";
83
+
84
+ import FSButton from "./FSButton.vue";
85
+ import FSCard from "./FSCard.vue";
86
+ import FSIcon from "./FSIcon.vue";
87
+ import FSText from "./FSText.vue";
88
+ import FSRow from "./FSRow.vue";
89
+
36
90
  export default defineComponent({
37
91
  name: "FSWindow",
92
+ components: {
93
+ FSButton,
94
+ FSCard,
95
+ FSIcon,
96
+ FSText,
97
+ FSRow
98
+ },
38
99
  props: {
39
100
  width: {
40
101
  type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
@@ -45,26 +106,82 @@ export default defineComponent({
45
106
  type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
46
107
  required: false,
47
108
  default: null
109
+ },
110
+ modelValue: {
111
+ type: [String, Number, Object] as PropType<any>,
112
+ required: false,
113
+ default: 0
48
114
  }
49
115
  },
50
- setup(props) {
116
+ emits: ["update:modelValue", "error"],
117
+ setup(props, { emit }) {
51
118
  const { slots, getChildren } = useSlots();
52
119
 
53
120
  delete slots.default;
54
121
 
122
+ const windowRef = ref<any | null>(null);
123
+
124
+ const showOverflow = ref(true);
125
+ const overflowTimeout = ref<NodeJS.Timeout | null>(null);
126
+
55
127
  const style = computed((): StyleValue => ({
56
- "--fs-window-width": sizeToVar(props.width),
57
- "--fs-window-height": sizeToVar(props.height)
128
+ "--fs-window-overflow": showOverflow.value ? "visible" : "hidden",
129
+ "--fs-window-height" : sizeToVar(props.height),
130
+ "--fs-window-width" : sizeToVar(props.width)
58
131
  }));
59
132
 
60
133
  const value = (component: VNode, index: number): any => {
61
134
  return component?.props?.value ?? index;
62
135
  };
63
136
 
137
+ // Hide horizontal overflow when switching windows, otherwise let it visible for the FSFadeOut scrollbar
138
+ watch(() => props.modelValue, (): void => {
139
+ showOverflow.value = false;
140
+ if (overflowTimeout.value) {
141
+ clearTimeout(overflowTimeout.value);
142
+ }
143
+ overflowTimeout.value = setTimeout(() => {
144
+ showOverflow.value = true;
145
+ }, 560);
146
+ });
147
+
148
+ const showError = computed((): boolean => {
149
+ if (!windowRef.value) {
150
+ return false;
151
+ }
152
+
153
+ // https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/components/VWindow/VWindow.tsx
154
+ // https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/composables/group.ts#L161
155
+ const group = windowRef.value.group;
156
+
157
+ if (!group.items.value.length) {
158
+ return false;
159
+ }
160
+ return !group.items.value.find((item: any) => item.value === props.modelValue);
161
+ });
162
+
163
+ const goBack = (): void => {
164
+ if (!windowRef.value) {
165
+ emit("error");
166
+ return;
167
+ }
168
+
169
+ const group = windowRef.value.group;
170
+ if (!group.items.value.length) {
171
+ emit("error");
172
+ return;
173
+ }
174
+ emit("update:modelValue", group.items.value[0].value);
175
+ };
176
+
64
177
  return {
178
+ ColorEnum,
179
+ windowRef,
180
+ showError,
65
181
  slots,
66
182
  style,
67
183
  getChildren,
184
+ goBack,
68
185
  value
69
186
  };
70
187
  }
@@ -29,6 +29,16 @@ import { uuidv4 } from "@dative-gpi/bones-ui/tools/uuid";
29
29
  export default defineComponent({
30
30
  name: "FSWrapGroup",
31
31
  props: {
32
+ height: {
33
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
34
+ required: false,
35
+ default: "fit-content"
36
+ },
37
+ width: {
38
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
39
+ required: false,
40
+ default: "fit-content"
41
+ },
32
42
  padding: {
33
43
  type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
34
44
  required: false,
@@ -55,7 +65,9 @@ export default defineComponent({
55
65
  "--fs-group-padding" : sizeToVar(props.padding),
56
66
  "--fs-group-gap" : sizeToVar(props.gap),
57
67
  "--fs-group-color" : darks.soft,
58
- "--fs-group-hover-color": darks.dark
68
+ "--fs-group-hover-color": darks.dark,
69
+ "--fs-group-height" : sizeToVar(props.height),
70
+ "--fs-group-width" : sizeToVar(props.width)
59
71
  }));
60
72
 
61
73
  onMounted((): void => {
@@ -141,7 +141,7 @@ export default defineComponent({
141
141
  required: false
142
142
  }
143
143
  },
144
- emits: ['update:mode', 'click:eventId', 'update:start', 'update:end'],
144
+ emits: ['update', 'update:mode', 'click:eventId', 'update:start', 'update:end'],
145
145
  setup(props, { emit }) {
146
146
  const { todayToEpoch, epochToLocalDayStart, epochToLocalDayEnd } = useDateFormat();
147
147
  const { isExtraSmall } = useBreakpoints();
@@ -167,18 +167,27 @@ export default defineComponent({
167
167
  return;
168
168
  }
169
169
  if (props.mode === AgendaMode.Week) {
170
- emit("update:start", epochToLocalDayStart(now.value - (new Date(now.value).getDay() - 1) * 24 * 60 * 60 * 1000));
171
- emit("update:end", epochToLocalDayEnd(now.value + (7 - new Date(now.value).getDay()) * 24 * 60 * 60 * 1000));
170
+ const newStart = epochToLocalDayStart(now.value - (new Date(now.value).getDay() - 1) * 24 * 60 * 60 * 1000);
171
+ const newEnd = epochToLocalDayEnd(now.value + (7 - new Date(now.value).getDay()) * 24 * 60 * 60 * 1000);
172
+ emit("update:start", newStart);
173
+ emit("update:end", newEnd);
174
+ emit("update", { start: newStart, end: newEnd, mode: props.mode });
172
175
  return;
173
176
  }
174
177
  if (props.mode === AgendaMode.Month) {
175
178
  const lastDayOfMonth = new Date(new Date(now.value).getFullYear(), new Date(now.value).getMonth() + 1, 0);
176
- emit("update:start", epochToLocalDayStart(new Date(now.value).setDate(1)));
177
- emit("update:end", lastDayOfMonth.getTime());
179
+ const newStart = epochToLocalDayStart(new Date(now.value).setDate(1));
180
+ const newEnd = lastDayOfMonth.getTime()
181
+ emit("update:start", newStart);
182
+ emit("update:end", newEnd );
183
+ emit("update", { start: newStart, end: newEnd, mode: props.mode });
178
184
  return;
179
185
  }
180
- emit("update:start", epochToLocalDayStart(now.value));
181
- emit("update:end", epochToLocalDayEnd(now.value));
186
+ const newStart = epochToLocalDayStart(now.value);
187
+ const newEnd = epochToLocalDayEnd(now.value);
188
+ emit("update:start", newStart);
189
+ emit("update:end", newEnd);
190
+ emit("update", { start: newStart, end: newEnd, mode: props.mode });
182
191
  });
183
192
 
184
193
  onUnmounted(() => {
@@ -188,8 +197,18 @@ export default defineComponent({
188
197
  watch(isExtraSmall, (value) => {
189
198
  if (value && props.mode !== AgendaMode.Day) {
190
199
  emit('update:mode', AgendaMode.Day);
200
+ emit("update", {
201
+ start: props.start,
202
+ end: props.end,
203
+ mode: AgendaMode.Day
204
+ });
191
205
  } else if (!value && defaultMode.value !== AgendaMode.Day) {
192
206
  emit('update:mode', defaultMode.value);
207
+ emit("update", {
208
+ start: props.start,
209
+ end: props.end,
210
+ mode: defaultMode.value
211
+ });
193
212
  }
194
213
  });
195
214