@dative-gpi/foundation-shared-components 1.0.65 → 1.0.67-map-edit

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 (294) 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 +11 -9
  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/FSDialog.vue +2 -1
  16. package/components/FSDialogContent.vue +12 -11
  17. package/components/FSDialogForm.vue +22 -2
  18. package/components/FSDialogFormBody.vue +50 -31
  19. package/components/FSDialogMenu.vue +17 -8
  20. package/components/FSDialogMultiFormBody.vue +23 -13
  21. package/components/FSDialogRemove.vue +7 -8
  22. package/components/FSDialogSubmit.vue +20 -11
  23. package/components/FSEditImageUI.vue +13 -5
  24. package/components/FSFadeOut.vue +53 -21
  25. package/components/FSForm.vue +10 -8
  26. package/components/FSGrid.vue +0 -1
  27. package/components/FSIcon.vue +2 -2
  28. package/components/FSIconCard.vue +68 -12
  29. package/components/FSInformationsMenu.vue +142 -0
  30. package/components/FSInstantPicker.vue +268 -0
  31. package/components/FSLink.vue +25 -9
  32. package/components/FSLoader.vue +28 -10
  33. package/components/FSMenu.vue +47 -0
  34. package/components/FSOptionGroup.vue +8 -8
  35. package/components/FSOptionItem.vue +4 -4
  36. package/components/FSOptionsMenu.vue +165 -0
  37. package/components/FSPagination.vue +1 -1
  38. package/components/FSPlayButtons.vue +72 -0
  39. package/components/FSProgressBar.vue +94 -0
  40. package/components/FSRadio.vue +5 -4
  41. package/components/FSRadioGroup.vue +3 -3
  42. package/components/FSRangePicker.vue +275 -0
  43. package/components/FSRangeSlider.vue +84 -0
  44. package/components/FSRouterLink.vue +42 -0
  45. package/components/FSSlideGroup.vue +19 -5
  46. package/components/FSSlider.vue +44 -79
  47. package/components/FSSpan.vue +12 -7
  48. package/components/FSSwitch.vue +44 -48
  49. package/components/FSTab.vue +15 -13
  50. package/components/FSTabs.vue +32 -7
  51. package/components/FSTag.vue +3 -3
  52. package/components/FSTagGroup.vue +6 -4
  53. package/components/FSText.vue +11 -7
  54. package/components/FSToggleSet.vue +7 -7
  55. package/components/FSWindow.vue +122 -5
  56. package/components/FSWrapGroup.vue +13 -1
  57. package/components/agenda/FSAgenda.vue +26 -7
  58. package/components/agenda/FSAgendaDialogCalendar.vue +2 -2
  59. package/components/agenda/FSAgendaHeader.vue +35 -10
  60. package/components/agenda/FSAgendaHorizontalEvent.vue +18 -6
  61. package/components/agenda/FSAgendaHoursRow.vue +48 -8
  62. package/components/agenda/FSAgendaVerticalEvent.vue +1 -1
  63. package/components/agenda/FSDayAgenda.vue +0 -1
  64. package/components/agenda/FSMonthAgenda.vue +1 -6
  65. package/components/agenda/FSSelectAgendaMode.vue +2 -2
  66. package/components/agenda/FSWeekAgenda.vue +5 -10
  67. package/components/autocompletes/FSAutoCompleteAddress.vue +25 -20
  68. package/components/autocompletes/FSAutocompleteLanguage.vue +7 -1
  69. package/components/autocompletes/FSAutocompleteTimeZone.vue +7 -1
  70. package/components/buttons/FSButtonAdd.vue +1 -1
  71. package/components/buttons/FSButtonAddLabel.vue +1 -1
  72. package/components/buttons/FSButtonCancel.vue +1 -1
  73. package/components/buttons/FSButtonCancelLabel.vue +1 -1
  74. package/components/buttons/FSButtonCheckbox.vue +4 -4
  75. package/components/buttons/FSButtonCopy.vue +1 -1
  76. package/components/buttons/FSButtonCopyLabel.vue +1 -1
  77. package/components/buttons/FSButtonDuplicate.vue +1 -1
  78. package/components/buttons/FSButtonDuplicateLabel.vue +1 -1
  79. package/components/buttons/FSButtonEdit.vue +1 -1
  80. package/components/buttons/FSButtonEditLabel.vue +1 -1
  81. package/components/buttons/FSButtonFile.vue +1 -1
  82. package/components/buttons/FSButtonFileLabel.vue +1 -1
  83. package/components/buttons/FSButtonNext.vue +1 -1
  84. package/components/buttons/FSButtonNextLabel.vue +1 -1
  85. package/components/buttons/FSButtonPrevious.vue +1 -1
  86. package/components/buttons/FSButtonPreviousLabel.vue +1 -1
  87. package/components/buttons/FSButtonRedo.vue +1 -1
  88. package/components/buttons/FSButtonRedoLabel.vue +1 -1
  89. package/components/buttons/FSButtonRemove.vue +1 -1
  90. package/components/buttons/FSButtonRemoveLabel.vue +1 -1
  91. package/components/buttons/FSButtonSave.vue +1 -1
  92. package/components/buttons/FSButtonSaveLabel.vue +1 -1
  93. package/components/buttons/FSButtonSearch.vue +1 -1
  94. package/components/buttons/FSButtonSearchLabel.vue +1 -1
  95. package/components/buttons/FSButtonUndo.vue +1 -1
  96. package/components/buttons/FSButtonUndoLabel.vue +1 -1
  97. package/components/buttons/FSButtonUpdate.vue +1 -1
  98. package/components/buttons/FSButtonUpdateLabel.vue +1 -1
  99. package/components/buttons/FSButtonValidate.vue +1 -1
  100. package/components/buttons/FSButtonValidateLabel.vue +1 -1
  101. package/components/calendar/FSSimpleCalendar.vue +145 -0
  102. package/components/calendar/FSSimpleCalendarHeader.vue +60 -0
  103. package/components/calendar/FSSimpleMonthSelector.vue +138 -0
  104. package/components/deviceOrganisations/FSConnectivity.vue +5 -3
  105. package/components/deviceOrganisations/FSStatus.vue +5 -3
  106. package/components/deviceOrganisations/FSStatusCard.vue +7 -9
  107. package/components/deviceOrganisations/FSStatusRichCard.vue +171 -0
  108. package/components/deviceOrganisations/FSWorstAlert.vue +24 -36
  109. package/components/deviceOrganisations/FSWorstAlertCard.vue +8 -47
  110. package/components/fields/FSAutocompleteField.vue +85 -82
  111. package/components/fields/FSAutocompleteTag.vue +1 -1
  112. package/components/fields/FSBaseField.vue +42 -25
  113. package/components/fields/FSClosableSearchField.vue +83 -0
  114. package/components/fields/FSColorField.vue +12 -10
  115. package/components/fields/FSCommentField.vue +28 -16
  116. package/components/fields/FSDateField.vue +13 -10
  117. package/components/fields/FSDateRangeField.vue +6 -5
  118. package/components/fields/FSDateTimeField.vue +14 -11
  119. package/components/fields/FSDateTimeRangeDialog.vue +160 -0
  120. package/components/fields/FSDateTimeRangeField.vue +23 -115
  121. package/components/fields/FSEntityFieldUI.vue +19 -16
  122. package/components/fields/FSGradientField.vue +5 -5
  123. package/components/fields/FSIconField.vue +16 -9
  124. package/components/fields/FSMagicConfigField.vue +15 -7
  125. package/components/fields/FSMagicField.vue +7 -2
  126. package/components/fields/FSNumberField.vue +8 -4
  127. package/components/fields/FSPasswordField.vue +7 -7
  128. package/components/fields/FSRichTextField.vue +78 -58
  129. package/components/fields/FSSearchField.vue +9 -115
  130. package/components/fields/FSSelectField.vue +69 -71
  131. package/components/fields/FSTagField.vue +9 -9
  132. package/components/fields/FSTermField.vue +69 -46
  133. package/components/fields/FSTextArea.vue +17 -11
  134. package/components/fields/FSTextField.vue +15 -10
  135. package/components/fields/FSTimeField.vue +14 -10
  136. package/components/fields/FSTimeRangeField.vue +310 -0
  137. package/components/fields/FSTimeStepField.vue +5 -5
  138. package/components/fields/FSTranslateField.vue +10 -10
  139. package/components/fields/FSTranslateRichTextField.vue +41 -20
  140. package/components/fields/FSTranslateTextArea.vue +10 -10
  141. package/components/fields/FSTreeViewField.vue +15 -13
  142. package/components/fields/periodicField/FSPeriodicDailyField.vue +7 -7
  143. package/components/fields/periodicField/FSPeriodicField.vue +15 -15
  144. package/components/fields/periodicField/FSPeriodicMonthlyField.vue +16 -16
  145. package/components/fields/periodicField/FSPeriodicWeeklyField.vue +28 -18
  146. package/components/fields/periodicField/FSPeriodicYearlyField.vue +12 -12
  147. package/components/lists/FSDataIteratorItem.vue +23 -67
  148. package/components/lists/FSDataTableUI.vue +198 -123
  149. package/components/lists/FSDraggable.vue +2 -2
  150. package/components/lists/FSFilterButton.vue +14 -16
  151. package/components/lists/FSHeaderButton.vue +11 -9
  152. package/components/lists/FSHiddenButton.vue +9 -9
  153. package/components/lists/FSLoadDataTable.vue +10 -7
  154. package/components/lists/FSSimpleList.vue +95 -88
  155. package/components/lists/FSSimpleListItem.vue +131 -0
  156. package/components/map/FSMap.vue +144 -158
  157. package/components/map/FSMapEditLocationAddress.vue +189 -0
  158. package/components/map/FSMapFeatureGroup.vue +7 -1
  159. package/components/map/FSMapLayerButton.vue +4 -3
  160. package/components/map/FSMapMarker.vue +103 -42
  161. package/components/map/FSMapMarkerClusterGroup.vue +32 -7
  162. package/components/map/FSMapOverlay.vue +44 -24
  163. package/components/map/FSMapPolygon.vue +16 -4
  164. package/components/map/FSMapTileLayer.vue +26 -9
  165. package/components/map/layers.ts +0 -0
  166. package/components/selects/FSSelectAutoRefresh.vue +8 -8
  167. package/components/selects/FSSelectDashboardVariableType.vue +4 -3
  168. package/components/selects/FSSelectDateSetting.vue +2 -2
  169. package/components/selects/FSSelectDays.vue +8 -8
  170. package/components/selects/FSSelectListMode.vue +2 -2
  171. package/components/selects/FSSelectMapLayer.vue +68 -0
  172. package/components/selects/FSSelectMonths.vue +13 -13
  173. package/components/selects/chartSelectors/FSAggregationSelector.vue +52 -0
  174. package/components/selects/chartSelectors/FSAxisTypeSelector.vue +49 -0
  175. package/components/selects/chartSelectors/FSDisplayAsSelector.vue +53 -0
  176. package/components/selects/chartSelectors/FSFilterTypeSelector.vue +54 -0
  177. package/components/selects/chartSelectors/FSHeatmapRuleSelector.vue +54 -0
  178. package/components/selects/chartSelectors/FSOperationOnSelector.vue +53 -0
  179. package/components/selects/chartSelectors/FSPlanningTypeSelector.vue +53 -0
  180. package/components/selects/chartSelectors/FSPlotPerSelector.vue +52 -0
  181. package/components/selects/chartSelectors/FSSelectEntityType.vue +59 -0
  182. package/components/selects/chartSelectors/FSSerieTypeSelector.vue +53 -0
  183. package/components/tiles/FSAlertTileUI.vue +90 -0
  184. package/components/tiles/FSChartTileUI.vue +61 -52
  185. package/components/tiles/FSCommentTileUI.vue +38 -13
  186. package/components/tiles/FSDashboardOrganisationTypeTileUI.vue +14 -2
  187. package/components/tiles/FSDashboardShallowTileUI.vue +14 -2
  188. package/components/tiles/FSDeviceOrganisationTileUI.vue +0 -6
  189. package/components/tiles/FSEntityCountBadge.vue +72 -0
  190. package/components/tiles/FSFolderTileUI.vue +38 -4
  191. package/components/tiles/FSGroupTileUI.vue +32 -136
  192. package/components/tiles/FSLoadTile.vue +16 -10
  193. package/components/tiles/FSLocationTileUI.vue +45 -63
  194. package/components/tiles/FSServiceAccountOrganisationTileUI.vue +0 -6
  195. package/components/tiles/FSSimpleTileUI.vue +30 -24
  196. package/components/tiles/FSTile.vue +46 -39
  197. package/components/tiles/FSUserOrganisationTileUI.vue +1 -7
  198. package/components/tiles/FSUserTileUI.vue +119 -0
  199. package/components/toggleSets/FSToggleSetPosition.vue +1 -1
  200. package/components/views/FSBaseView.vue +64 -0
  201. package/components/views/FSEntityView.vue +12 -146
  202. package/components/views/FSSimpleView.vue +29 -0
  203. package/components/views/desktop/FSBaseDefaultDesktopView.vue +135 -0
  204. package/components/views/desktop/FSBaseDesktopView.vue +53 -0
  205. package/components/views/desktop/FSBaseEntityDesktopView.vue +211 -0
  206. package/components/views/mobile/FSBaseDefaultMobileView.vue +133 -0
  207. package/components/views/mobile/FSBaseEntityMobileView.vue +206 -0
  208. package/components/views/mobile/FSBaseMobileView.vue +53 -0
  209. package/composables/index.ts +1 -0
  210. package/composables/useAddress.ts +40 -8
  211. package/composables/useBreakpoints.ts +40 -4
  212. package/composables/useColors.ts +16 -7
  213. package/composables/useMagicFieldProvider.ts +1 -0
  214. package/composables/useMapLayers.ts +69 -0
  215. package/composables/useSlots.ts +2 -1
  216. package/models/colors.ts +2 -1
  217. package/models/deviceAlerts.ts +1 -0
  218. package/models/magicFields.ts +1 -0
  219. package/models/map.ts +12 -10
  220. package/models/rules.ts +5 -2
  221. package/models/tables.ts +2 -1
  222. package/models/variableNode.ts +8 -5
  223. package/package.json +5 -5
  224. package/styles/components/fs_agenda.scss +4 -0
  225. package/styles/components/fs_agenda_event.scss +1 -1
  226. package/styles/components/fs_agenda_hours_row.scss +0 -8
  227. package/styles/components/fs_autocomplete_field.scss +0 -13
  228. package/styles/components/fs_breadcrumbs.scss +18 -36
  229. package/styles/components/fs_button.scss +7 -5
  230. package/styles/components/fs_calendar.scss +1 -0
  231. package/styles/components/fs_card.scss +9 -0
  232. package/styles/components/fs_chip.scss +13 -7
  233. package/styles/components/fs_clickable.scss +16 -23
  234. package/styles/components/fs_clock.scss +0 -10
  235. package/styles/components/fs_col.scss +1 -1
  236. package/styles/components/fs_color_field.scss +0 -4
  237. package/styles/components/fs_data_table.scss +6 -9
  238. package/styles/components/fs_dialog.scss +4 -10
  239. package/styles/components/fs_dialog_menu.scss +4 -2
  240. package/styles/components/fs_draggable.scss +0 -5
  241. package/styles/components/fs_fade_out.scss +10 -2
  242. package/styles/components/fs_filter_button.scss +1 -1
  243. package/styles/components/fs_hidden_button.scss +2 -7
  244. package/styles/components/fs_image_card.scss +6 -4
  245. package/styles/components/fs_magic_config_field.scss +1 -2
  246. package/styles/components/fs_map.scss +57 -17
  247. package/styles/components/fs_meta_field.scss +3 -5
  248. package/styles/components/fs_password_field.scss +4 -2
  249. package/styles/components/fs_progress_bar.scss +14 -0
  250. package/styles/components/fs_radio.scss +0 -11
  251. package/styles/components/fs_rich_text_field.scss +1 -10
  252. package/styles/components/fs_select_field.scss +4 -13
  253. package/styles/components/fs_slide_group.scss +7 -0
  254. package/styles/components/fs_slider.scss +0 -40
  255. package/styles/components/fs_span.scss +13 -5
  256. package/styles/components/fs_status_rich_card.scss +6 -0
  257. package/styles/components/fs_tabs.scss +18 -37
  258. package/styles/components/fs_tag.scss +8 -22
  259. package/styles/components/fs_text_area.scss +2 -21
  260. package/styles/components/fs_tile.scss +0 -19
  261. package/styles/components/fs_window.scss +3 -1
  262. package/styles/components/fs_wrap_group.scss +7 -0
  263. package/styles/components/index.scss +2 -6
  264. package/styles/globals/index.scss +1 -5
  265. package/styles/globals/overrides.scss +26 -54
  266. package/styles/globals/scrollbars.scss +8 -0
  267. package/styles/globals/text_fonts.scss +18 -66
  268. package/styles/globals/touchscreen.scss +2 -2
  269. package/tools/alertsTools.ts +94 -18
  270. package/tools/chartsTools.ts +155 -16
  271. package/tools/index.ts +3 -1
  272. package/tools/reportsTools.ts +38 -0
  273. package/tools/timeRangeTools.ts +125 -0
  274. package/utils/badge.ts +9 -5
  275. package/utils/filter.ts +4 -1
  276. package/utils/index.ts +2 -0
  277. package/utils/leafletMarkers.ts +4 -4
  278. package/utils/operations.ts +108 -0
  279. package/utils/picker.ts +40 -0
  280. package/utils/sort.ts +2 -2
  281. package/utils/time.ts +13 -13
  282. package/components/fields/FSTimeSlotField.vue +0 -250
  283. package/components/views/FSEntityHeader.vue +0 -343
  284. package/components/views/FSListHeader.vue +0 -83
  285. package/components/views/FSListView.vue +0 -83
  286. package/components/views/FSSkeletonView.vue +0 -100
  287. package/styles/components/fs_data_iterator_item.scss +0 -33
  288. package/styles/components/fs_icon_field.scss +0 -12
  289. package/styles/components/fs_search_field.scss +0 -3
  290. package/styles/components/fs_tag_field.scss +0 -8
  291. package/styles/components/fs_time_field.scss +0 -12
  292. package/styles/components/fs_timeslot_field.scss +0 -12
  293. package/styles/globals/breakpoints.scss +0 -20
  294. package/styles/globals/fixes.scss +0 -5
@@ -1,66 +1,90 @@
1
1
  <template>
2
2
  <FSCol
3
3
  gap="16px"
4
+ style="position: relative;"
4
5
  >
5
6
  <FSRow
6
- align="bottom-left"
7
- :wrap="isExtraSmall ? false : true"
7
+ v-if="$props.showSearch || (!isMobileSized && ($slots['prepend-toolbar'] || $slots['toolbar'] || $slots['append-toolbar'])) || (!$props.disableTable && !$props.disableIterator)"
8
+ align="top-left"
9
+ :wrap="isMobileSized ? false : true"
8
10
  width="fill"
9
11
  >
10
12
  <slot
11
- v-if="!isExtraSmall"
13
+ v-if="!isMobileSized"
12
14
  name="prepend-toolbar"
13
15
  />
14
- <template
15
- v-if="$props.showSearch"
16
+ <FSRow
17
+ align="top-left"
16
18
  >
17
- <FSSearchField
18
- prependInnerIcon="mdi-magnify"
19
- :hideHeader="true"
20
- v-model="innerSearch"
21
- />
22
- <FSButton
23
- v-if="filterableHeaders.length > 0"
24
- prependIcon="mdi-filter-variant"
25
- :variant="showFilters ? 'full' : 'standard'"
26
- @click="showFilters = !showFilters"
19
+ <FSRow
20
+ v-if="$props.showSearch || $slots['toolbar']"
21
+ align="bottom-left"
22
+ >
23
+ <template
24
+ v-if="$props.showSearch"
25
+ >
26
+ <FSSearchField
27
+ v-if="$props.showSearch"
28
+ :hideHeader="true"
29
+ v-model="innerSearch"
30
+ />
31
+ <FSButton
32
+ v-if="filterableHeaders.length > 0"
33
+ prependIcon="mdi-filter-variant"
34
+ :variant="innerShowFilters ? 'full' : 'standard'"
35
+ @click="innerShowFilters = !innerShowFilters"
36
+ />
37
+ </template>
38
+ <slot
39
+ v-if="!isMobileSized"
40
+ name="toolbar"
41
+ />
42
+ </FSRow>
43
+ <slot
44
+ v-if="!isMobileSized"
45
+ name="append-toolbar"
27
46
  />
28
- </template>
29
- <slot
30
- v-if="!isExtraSmall"
31
- name="toolbar"
32
- />
47
+ </FSRow>
33
48
  <template
34
- v-if="!$props.disableTable && !$props.disableIterator"
49
+ v-if="(!$props.disableTable && !$props.disableIterator)"
35
50
  >
36
- <v-spacer />
37
51
  <FSRow
38
- align="center-right"
52
+ align="top-right"
53
+ width="hug"
54
+ :wrap="false"
39
55
  >
40
56
  <FSOptionGroup
57
+ v-if="!$props.disableTable && !$props.disableIterator"
41
58
  :values="modeOptions"
42
59
  :singleColor="true"
43
60
  :required="true"
61
+ variant="slide"
44
62
  v-model="innerMode"
45
63
  />
46
64
  </FSRow>
47
65
  </template>
48
66
  </FSRow>
49
67
  <FSRow
50
- v-if="isExtraSmall && hasToolbar"
68
+ v-if="isMobileSized && ($slots['prepend-toolbar'] || $slots['toolbar'] || $slots['append-toolbar'])"
51
69
  >
52
- <FSWrapGroup>
70
+ <FSSlideGroup>
71
+ <slot
72
+ name="prepend-toolbar"
73
+ />
53
74
  <slot
54
75
  name="toolbar"
55
76
  />
56
- </FSWrapGroup>
77
+ <slot
78
+ name="append-toolbar"
79
+ />
80
+ </FSSlideGroup>
57
81
  </FSRow>
58
82
  <FSRow
59
83
  v-if="showFiltersRow"
60
84
  gap="16px"
61
85
  >
62
86
  <FSCol
63
- v-if="showFilters && hasVisibleFilters"
87
+ v-if="innerShowFilters && hasVisibleFilters"
64
88
  width="hug"
65
89
  >
66
90
  <FSRow
@@ -94,12 +118,12 @@
94
118
  gap="8px"
95
119
  >
96
120
  <FSChip
97
- v-if="showFilters && resetable"
121
+ v-if="innerShowFilters && resetable"
98
122
  variant="standard"
99
- :label="$tr('ui.data-table.reset-filters', 'Reset')"
123
+ :label="$tr('data-table.reset-filters', 'Reset')"
100
124
  :height="['30px', '24px']"
101
125
  :color="ColorEnum.Error"
102
- :editable="true"
126
+ :clickable="true"
103
127
  @click="resetFilter"
104
128
  />
105
129
  <FSHiddenButton
@@ -122,7 +146,7 @@
122
146
  :headers="extraHeaders.concat(innerHeaders)"
123
147
  :sortBy="innerSortBy ? [innerSortBy] : []"
124
148
  :itemsPerPage="innerRowsPerPage"
125
- :showSelect="$props.showSelect"
149
+ :selectable="$props.selectable"
126
150
  :hover="!$props.sortDraggable"
127
151
  :itemValue="$props.itemValue"
128
152
  :loading="$props.loading"
@@ -148,7 +172,7 @@
148
172
  <FSText
149
173
  font="text-overline"
150
174
  >
151
- {{ $tr("ui.data-table.empty", "No data") }}
175
+ {{ $tr("ui.common.no-data", "No data") }}
152
176
  </FSText>
153
177
  </template>
154
178
  <template
@@ -245,7 +269,7 @@
245
269
  width="hug"
246
270
  >
247
271
  <FSCheckbox
248
- v-if="$props.showSelect"
272
+ v-if="$props.selectable"
249
273
  :modelValue="props.item.items.every((item) => $props.modelValue.includes(item.key))"
250
274
  :indeterminate="$props.modelValue.some((id) => props.item.items.some((item) => item.key === id)) && !props.item.items.every((item) => $props.modelValue.includes(item.key))"
251
275
  @update:modelValue="toggleSelectGroup(props.item)"
@@ -290,25 +314,29 @@
290
314
  <slot
291
315
  :name="`${header.slotName}-append`"
292
316
  />
293
- <v-spacer />
294
- <slot
295
- :name="`${header.slotName}-configuration`"
317
+ <FSRow
318
+ align="center-right"
319
+ :wrap="false"
296
320
  >
297
- <FSHeaderButton
298
- :first="index === 0"
299
- :last="index === headersSlots.length - 1"
300
- @update:hide="updateHeader(header, 'hidden', !header.hidden)"
301
- @update:left="updateHeader(header, 'index', -1)"
302
- @update:right="updateHeader(header, 'index', 1)"
303
- />
304
- <FSButton
305
- v-if="header.sortable"
306
- variant="icon"
307
- :color="sortColor(header, props)"
308
- :icon="sortIcon(header, props)"
309
- @click="toggleSort(header)"
310
- />
311
- </slot>
321
+ <slot
322
+ :name="`${header.slotName}-configuration`"
323
+ >
324
+ <FSHeaderButton
325
+ :first="index === 0"
326
+ :last="index === headersSlots.length - 1"
327
+ @update:hide="updateHeader(header, 'hidden', !header.hidden)"
328
+ @update:left="updateHeader(header, 'index', -1)"
329
+ @update:right="updateHeader(header, 'index', 1)"
330
+ />
331
+ <FSButton
332
+ v-if="header.sortable"
333
+ variant="icon"
334
+ :color="sortColor(header, props)"
335
+ :icon="sortIcon(header, props)"
336
+ @click="toggleSort(header)"
337
+ />
338
+ </slot>
339
+ </FSRow>
312
340
  </FSRow>
313
341
  </slot>
314
342
  </template>
@@ -356,22 +384,23 @@
356
384
  <FSText
357
385
  font="text-button"
358
386
  >
359
- {{ $tr("ui.data-table.all-selected-bold", "Warning:") }}
387
+ {{ $tr("data-table.all-selected-bold", "Warning:") }}
360
388
  </FSText>
361
389
  <FSText>
362
- {{ $tr("ui.data-table.all-selected-regular", "All elements selected") }}
390
+ {{ $tr("data-table.all-selected-regular", "All elements selected") }}
363
391
  </FSText>
364
392
  </FSRow>
365
393
  </template>
366
394
  <template
367
395
  v-else
368
396
  >
369
- <FSText>
370
- {{ $tr("ui.data-table.some-selected", "{0} element(s) selected", $props.modelValue.length.toString()) }}
371
- </FSText>
397
+ <FSRow>
398
+ <FSText>
399
+ {{ $tr("data-table.some-selected", "{0} element(s) selected", $props.modelValue.length.toString()) }}
400
+ </FSText>
401
+ </FSRow>
372
402
  </template>
373
403
  </template>
374
- <v-spacer />
375
404
  <FSRow
376
405
  align="center-right"
377
406
  width="hug"
@@ -380,7 +409,7 @@
380
409
  <FSText
381
410
  font="text-overline"
382
411
  >
383
- {{ $tr("ui.data-table.rows-per-page", "Rows per page") }}
412
+ {{ $tr("data-table.rows-per-page", "Rows per page") }}
384
413
  </FSText>
385
414
  <FSSelectField
386
415
  class="fs-data-table-rows-per-page fs-small-input"
@@ -432,7 +461,7 @@
432
461
  <FSText
433
462
  font="text-overline"
434
463
  >
435
- {{ $tr("ui.data-table.empty", "No data") }}
464
+ {{ $tr("ui.common.no-data", "No data") }}
436
465
  </FSText>
437
466
  </template>
438
467
  <template
@@ -446,7 +475,7 @@
446
475
  v-for="(item, index) in items"
447
476
  elementSelector=".fs-draggable-item"
448
477
  :disabled="draggableDisabled"
449
- :item="item"
478
+ :item="{ ...item, index }"
450
479
  :key="index"
451
480
  @update:dragend="(event, dragged) => onDragEnd(event, dragged, '.fs-data-iterator-container')"
452
481
  @dragover="(event) => onDragOver(event, '.fs-draggable-item', '.fs-data-iterator-container')"
@@ -460,18 +489,20 @@
460
489
  >
461
490
  <FSDataIteratorItem
462
491
  v-if="item.type === 'item'"
463
- :itemColor="$props.rowColor ? $props.rowColor(item.raw) : ColorEnum.Background"
492
+ :leftColor="$props.rowColor ? $props.rowColor(item.raw) : null"
464
493
  :headers="innerHeaders.filter(h => !$props.sneakyHeaders.includes(h.value))"
465
- :clickable="onClickLibrary.clickable"
466
- :showSelect="$props.showSelect"
467
- :itemTo="$props.itemTo"
468
- :color="$props.color"
494
+ :selectable="$props.selectable"
495
+ :singleSelect="$props.singleSelect"
496
+ :to="$props.itemTo"
497
+ :bottomColor="$props.color"
469
498
  :item="item.raw"
470
499
  :key="index"
471
- :modelValue="$props.modelValue.includes(item.raw[$props.itemValue])"
472
- @update:modelValue="toggleSelect"
473
- @auxclick="() => onClickLibrary.mobile($event, item)"
474
- @click="() => onClickLibrary.mobile($event, item)"
500
+ :modelValue="$props.modelValue?.includes(item.raw[$props.itemValue])"
501
+ @update:modelValue="toggleSelect(item.raw)"
502
+ v-bind="onClickLibrary.clickable ? {
503
+ onClick: (event) => onClickLibrary.mobile(event, item),
504
+ onAuxclick: (event) => onClickLibrary.mobile(event, item)
505
+ } : {}"
475
506
  >
476
507
  <template
477
508
  #item.top="props"
@@ -530,22 +561,23 @@
530
561
  <FSText
531
562
  font="text-button"
532
563
  >
533
- {{ $tr("ui.data-table.all-selected-bold", "Warning:") }}
564
+ {{ $tr("data-table.all-selected-bold", "Warning:") }}
534
565
  </FSText>
535
566
  <FSText>
536
- {{ $tr("ui.data-table.all-selected-regular", "All elements selected") }}
567
+ {{ $tr("data-table.all-selected-regular", "All elements selected") }}
537
568
  </FSText>
538
569
  </FSRow>
539
570
  </template>
540
571
  <template
541
572
  v-else
542
573
  >
543
- <FSText>
544
- {{ $tr("ui.data-table.some-selected", "{0} element(s) selected", $props.modelValue.length.toString()) }}
545
- </FSText>
574
+ <FSRow>
575
+ <FSText>
576
+ {{ $tr("data-table.some-selected", "{0} element(s) selected", $props.modelValue.length.toString()) }}
577
+ </FSText>
578
+ </FSRow>
546
579
  </template>
547
580
  </template>
548
- <v-spacer />
549
581
  <FSRow
550
582
  align="center-right"
551
583
  :wrap="false"
@@ -553,7 +585,7 @@
553
585
  <FSText
554
586
  font="text-overline"
555
587
  >
556
- {{ $tr("ui.data-table.rows-per-page", "Rows per page") }}
588
+ {{ $tr("data-table.rows-per-page", "Rows per page") }}
557
589
  </FSText>
558
590
  <FSRow
559
591
  width="120px"
@@ -602,7 +634,7 @@
602
634
  <FSText
603
635
  font="text-overline"
604
636
  >
605
- {{ $tr("ui.data-table.empty", "No data") }}
637
+ {{ $tr("ui.common.no-data", "No data") }}
606
638
  </FSText>
607
639
  </template>
608
640
  <template
@@ -617,7 +649,7 @@
617
649
  v-for="(item, index) in items.filter((item) => item.type === 'item')"
618
650
  elementSelector=".fs-draggable-item"
619
651
  :disabled="draggableDisabled"
620
- :item="item"
652
+ :item="{ ...item, index }"
621
653
  :key="index"
622
654
  @update:dragend="(event, dragged) => onDragEnd(event, dragged, '.fs-data-iterator-container')"
623
655
  @dragover="(event) => onDragOver(event, '.fs-draggable-item', '.fs-data-iterator-container')"
@@ -630,18 +662,20 @@
630
662
  v-bind="{ index, item: item.raw, toggleSelect }"
631
663
  >
632
664
  <FSDataIteratorItem
633
- :itemColor="$props.rowColor ? $props.rowColor(item.raw) : ColorEnum.Background"
665
+ :leftColor="$props.rowColor ? $props.rowColor(item.raw) : null"
634
666
  :headers="innerHeaders.filter(h => !$props.sneakyHeaders.includes(h.value))"
635
- :clickable="onClickLibrary.clickable"
636
- :showSelect="$props.showSelect"
637
- :itemTo="$props.itemTo"
638
- :color="$props.color"
667
+ :selectable="$props.selectable"
668
+ :singleSelect="$props.singleSelect"
669
+ :to="$props.itemTo"
670
+ :bottomColor="$props.color"
639
671
  :item="item.raw"
640
672
  :key="index"
641
- :modelValue="$props.modelValue.includes(item.raw[$props.itemValue])"
642
- @update:modelValue="toggleSelect"
643
- @auxclick="() => onClickLibrary.mobile($event, item)"
644
- @click="() => onClickLibrary.mobile($event, item)"
673
+ :modelValue="$props.modelValue?.includes(item.raw[$props.itemValue])"
674
+ @update:modelValue="toggleSelect(item.raw)"
675
+ v-bind="onClickLibrary.clickable ? {
676
+ onClick: (event) => onClickLibrary.mobile(event, item),
677
+ onAuxclick: (event) => onClickLibrary.mobile(event, item)
678
+ } : {}"
645
679
  >
646
680
  <template
647
681
  #item.top="props"
@@ -684,7 +718,7 @@
684
718
  <div
685
719
  class="fs-data-table-intersection"
686
720
  :id="elementId"
687
- />
721
+ />
688
722
  </FSCol>
689
723
  </template>
690
724
 
@@ -695,6 +729,7 @@ import { useRouter } from "vue-router";
695
729
  import { ColorEnum, type FSDataTableColumn, type FSDataTableFilter, type FSDataTableOrder, type FSToggle } from "@dative-gpi/foundation-shared-components/models";
696
730
  import { useBreakpoints, useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
697
731
  import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
732
+ import { useRouting } from "@dative-gpi/foundation-shared-services/composables";
698
733
  import { uuidv4 } from "@dative-gpi/bones-ui/tools/uuid"
699
734
 
700
735
  import { alphanumericSort, containsSearchTerm, sizeToVar } from "../../utils";
@@ -745,6 +780,11 @@ export default defineComponent({
745
780
  type: Array as PropType<FSDataTableColumn[]>,
746
781
  required: true
747
782
  },
783
+ showFilters: {
784
+ type: Boolean,
785
+ required: false,
786
+ default: false
787
+ },
748
788
  filters: {
749
789
  type: Object as PropType<{ [key: string]: FSDataTableFilter[] }>,
750
790
  required: false,
@@ -804,7 +844,7 @@ export default defineComponent({
804
844
  required: false,
805
845
  default: ColorEnum.Primary
806
846
  },
807
- showSelect: {
847
+ selectable: {
808
848
  type: Boolean,
809
849
  required: false,
810
850
  default: true
@@ -814,6 +854,11 @@ export default defineComponent({
814
854
  required: false,
815
855
  default: true
816
856
  },
857
+ noSearch: {
858
+ type: Boolean,
859
+ required: false,
860
+ default: false
861
+ },
817
862
  singleSelect: {
818
863
  type: Boolean,
819
864
  required: false,
@@ -832,7 +877,7 @@ export default defineComponent({
832
877
  mode: {
833
878
  type: String as PropType<"table" | "iterator">,
834
879
  required: false,
835
- default: "iterator"
880
+ default: "table"
836
881
  },
837
882
  disableTable: {
838
883
  type: Boolean,
@@ -880,9 +925,10 @@ export default defineComponent({
880
925
  default: "12px"
881
926
  },
882
927
  },
883
- emits: ["update:modelValue", "update:headers", "update:filters", "update:mode", "update:sortBy", "update:rowsPerPage", "update:page", "update:include", "update:items", "click:row"],
928
+ emits: ["update:modelValue", "update:headers", "update:search", "update:showFilters", "update:filters", "update:mode", "update:sortBy", "update:rowsPerPage", "update:page", "update:include", "update:items", "click:row"],
884
929
  setup(props, { emit }) {
885
- const { isExtraSmall } = useBreakpoints();
930
+ const { isExtraSmall, isMobileSized } = useBreakpoints();
931
+ const { handleRoutingEvent } = useRouting();
886
932
  const { $tr } = useTranslationsProvider();
887
933
  const { getColors } = useColors();
888
934
  const router = useRouter();
@@ -894,9 +940,9 @@ export default defineComponent({
894
940
  const innerSearch: Ref<string | null> = ref(null);
895
941
  const innerRowsPerPage = ref(props.rowsPerPage);
896
942
  const innerSortBy = ref(props.sortBy);
897
- const innerMode = ref(props.mode);
943
+ const innerMode = ref(props.disableTable ? "iterator" : props.disableIterator ? "table" : props.mode);
898
944
  const innerPage = ref(props.page);
899
- const showFilters = ref(false);
945
+ const innerShowFilters = ref(props.showFilters);
900
946
  const resetable = ref(false);
901
947
 
902
948
  const intersectionObserver = ref<IntersectionObserver | null>(null);
@@ -913,11 +959,18 @@ export default defineComponent({
913
959
  { id: 5, label: "5" },
914
960
  { id: 10, label: "10" },
915
961
  { id: 30, label: "30" },
916
- { id: -1, label: $tr("ui.data-table.all-rows", "All") }
962
+ { id: -1, label: $tr("ui.common.all", "All") }
917
963
  ];
918
964
 
919
965
  const showFiltersRow = computed((): boolean => {
920
- return (props.showSearch && showFilters.value && filterableHeaders.value.length > 0) || hiddenHeaders.value.length > 0;
966
+ switch (innerMode.value) {
967
+ case "iterator": {
968
+ return (props.showSearch && innerShowFilters.value && filterableHeaders.value.length > 0);
969
+ }
970
+ case "table": {
971
+ return (props.showSearch && innerShowFilters.value && filterableHeaders.value.length > 0) || hiddenHeaders.value.length > 0;
972
+ }
973
+ }
921
974
  });
922
975
 
923
976
  const hasVisibleFilters = computed((): boolean => {
@@ -925,11 +978,15 @@ export default defineComponent({
925
978
  });
926
979
 
927
980
  const showFiltersDivider = computed((): boolean => {
928
- return resetable.value || (hiddenHeaders.value.length > 0 && hasVisibleFilters.value);
929
- });
930
-
931
- const hasToolbar = computed((): boolean => {
932
- return !!useSlots().slots["toolbar"];
981
+ switch (innerMode.value) {
982
+ case "iterator": {
983
+ return resetable.value;
984
+ }
985
+ case "table": {
986
+ return resetable.value || (hiddenHeaders.value.length > 0 && hasVisibleFilters.value);
987
+ }
988
+ }
989
+
933
990
  });
934
991
 
935
992
  const innerSlots = computed((): { [label: string]: Slot<any> } => {
@@ -989,7 +1046,7 @@ export default defineComponent({
989
1046
  width: "0%"
990
1047
  });
991
1048
  }
992
- if (props.showSelect) {
1049
+ if (props.selectable) {
993
1050
  extra.push({
994
1051
  key: "data-table-select",
995
1052
  width: "0%"
@@ -1020,20 +1077,27 @@ export default defineComponent({
1020
1077
  });
1021
1078
 
1022
1079
  const innerItems = computed((): any[] => {
1023
- const activeFilters: { key: string, filter: FSDataTableFilter }[] = Object.keys(filters.value).reduce((acc, key) => {
1024
- return acc.concat(filters.value[key].filter((filter) => filter.hidden).map((filter) => ({ key, filter })));
1025
- }, [] as { key: string, filter: FSDataTableFilter }[]);
1080
+ // Select only the filters where a value is hidden, for others, accept all values
1081
+ const activeFilters: { [key: string]: FSDataTableFilter[] } = Object.keys(filters.value).reduce((acc, key) => {
1082
+ if (filters.value[key].some((filter) => filter.hidden)) {
1083
+ acc[key] = filters.value[key].filter((filter) => !filter.hidden);
1084
+ }
1085
+ return acc;
1086
+ }, {} as { [key: string]: FSDataTableFilter[] });
1087
+
1026
1088
  if (props.items && props.items.length) {
1027
1089
  const innerSearchFormatted = innerSearch.value ? innerSearch.value.toLowerCase() : null;
1028
1090
  return props.items.filter((item) => {
1029
1091
  if (props.selectedOnly && !props.modelValue.includes(item[props.itemValue])) {
1030
1092
  return false;
1031
1093
  }
1032
- if (innerSearchFormatted) {
1033
- return containsSearchTerm(item, innerSearchFormatted);
1094
+ for (const property in activeFilters) {
1095
+ if (!activeFilters[property].some((filter) => filter.filter && filter.filter(filter.value, item[property], item))) {
1096
+ return false;
1097
+ }
1034
1098
  }
1035
- if (activeFilters.some(af => af.filter.filter && af.filter.filter(af.filter.value, item[af.key], item))) {
1036
- return false;
1099
+ if (!props.noSearch && innerSearchFormatted) {
1100
+ return containsSearchTerm(item, innerSearchFormatted);
1037
1101
  }
1038
1102
  return true;
1039
1103
  });
@@ -1077,17 +1141,13 @@ export default defineComponent({
1077
1141
  });
1078
1142
 
1079
1143
  const onClickLibrary = computed((): { [key: string]: Function | boolean } => {
1144
+ console.log(props["onClick:row"]);
1080
1145
  if (props["onClick:row"] || props.itemTo) {
1081
1146
  return {
1082
1147
  clickable: true,
1083
1148
  row: (event: PointerEvent, row: any) => {
1084
1149
  if (props.itemTo && router) {
1085
- if (event.metaKey || event.ctrlKey || event.button === 1) {
1086
- window.open(router.resolve(props.itemTo(row.item)).href, "_blank");
1087
- }
1088
- else {
1089
- router.push(props.itemTo(row.item));
1090
- }
1150
+ handleRoutingEvent(event, props.itemTo(row.item), true);
1091
1151
  }
1092
1152
  else {
1093
1153
  emit("click:row", row.item);
@@ -1220,13 +1280,13 @@ export default defineComponent({
1220
1280
  value = header.fixedFilters.map((ff): FSDataTableFilter => ({
1221
1281
  hidden: currentFilters?.find((cf) => cf.value == (ff.value || null))?.hidden ?? false,
1222
1282
  text: ff.text?.toString() ?? "—",
1223
- value: ff.value || null,
1283
+ value: ff.value ?? null,
1224
1284
  filter: header.methodFilter ?? ((_, property, item) => {
1225
1285
  if (header.methodFilterRaw) {
1226
1286
  return header.methodFilterRaw(ff.value, item);
1227
1287
  }
1228
1288
  const flat = property = [property].flat();
1229
- return Array.isArray(flat) ? flat.includes(ff.value) || (!ff.value && flat.length == 0) : (!ff.value && !flat) || ff.value == flat;
1289
+ return (!ff.value && flat.length == 0) || flat.some(f => f == ff.value);
1230
1290
  })
1231
1291
  }));
1232
1292
  filterDictionary[key] = value;
@@ -1249,7 +1309,7 @@ export default defineComponent({
1249
1309
  return header.methodFilterRaw(dv, item);
1250
1310
  }
1251
1311
  const flat = [property].flat().map(mapToInnerValue);
1252
- return Array.isArray(flat) ? flat.includes(dv) || (!dv && flat.length == 0) : (!dv && !flat) || dv == flat;
1312
+ return (!dv && flat.length == 0) || flat.some(f => f == dv);
1253
1313
  })
1254
1314
  }
1255
1315
  });
@@ -1324,6 +1384,7 @@ export default defineComponent({
1324
1384
  }, { threshold: [0.9] });
1325
1385
  }
1326
1386
  if (document.querySelector(`#${elementId}`)) {
1387
+ intersectionObserver.value.unobserve(document.querySelector(`#${elementId}`)!);
1327
1388
  intersectionObserver.value.observe(document.querySelector(`#${elementId}`)!);
1328
1389
  }
1329
1390
  return;
@@ -1360,10 +1421,10 @@ export default defineComponent({
1360
1421
  };
1361
1422
 
1362
1423
  const resetRowIndex = (initialIndex: number, currentIndex: number, draggedElement: HTMLElement, tbodyElement: HTMLElement) => {
1363
- if (initialIndex > currentIndex) {
1424
+ if (initialIndex > currentIndex && tbodyElement.children[initialIndex]) {
1364
1425
  tbodyElement.children[initialIndex].insertAdjacentElement("afterend", draggedElement);
1365
1426
  }
1366
- else {
1427
+ else if(tbodyElement.children[initialIndex]) {
1367
1428
  tbodyElement.children[initialIndex].insertAdjacentElement("beforebegin", draggedElement);
1368
1429
  }
1369
1430
  };
@@ -1479,8 +1540,17 @@ export default defineComponent({
1479
1540
  }
1480
1541
  });
1481
1542
 
1543
+ watch(() => props.showFilters, () => {
1544
+ innerShowFilters.value = props.showFilters;
1545
+ });
1546
+
1482
1547
  watch(innerSearch, () => {
1483
1548
  innerPage.value = 1;
1549
+ emit("update:search", innerSearch.value);
1550
+ });
1551
+
1552
+ watch(innerShowFilters, () => {
1553
+ emit("update:showFilters", innerShowFilters.value);
1484
1554
  });
1485
1555
 
1486
1556
  watch(filters, () => {
@@ -1488,6 +1558,10 @@ export default defineComponent({
1488
1558
  .some((key) => filters.value[key].some((filter) => filter.hidden));
1489
1559
  }, { deep: true });
1490
1560
 
1561
+ watch(size, () => {
1562
+ observeIntersection();
1563
+ });
1564
+
1491
1565
  watch(innerMode, () => {
1492
1566
  emit("update:mode", innerMode.value);
1493
1567
  size.value = props.sizeIterator;
@@ -1512,13 +1586,14 @@ export default defineComponent({
1512
1586
 
1513
1587
  watch(() => props.items, async () => {
1514
1588
  computeFilters();
1589
+ observeIntersection();
1515
1590
  if (innerPage.value !== 1) {
1516
1591
  const formerPage = innerPage.value;
1517
1592
  innerPage.value = 1;
1518
1593
  await nextTick();
1519
1594
  innerPage.value = formerPage;
1520
1595
  }
1521
- });
1596
+ }, { deep: true });
1522
1597
 
1523
1598
  return {
1524
1599
  ColorEnum,
@@ -1529,9 +1604,8 @@ export default defineComponent({
1529
1604
  innerMode,
1530
1605
  modeOptions,
1531
1606
  innerPage,
1532
- hasToolbar,
1533
1607
  pageOptions,
1534
- showFilters,
1608
+ innerShowFilters,
1535
1609
  showFiltersRow,
1536
1610
  showFiltersDivider,
1537
1611
  hasVisibleFilters,
@@ -1548,6 +1622,7 @@ export default defineComponent({
1548
1622
  classes,
1549
1623
  style,
1550
1624
  size,
1625
+ isMobileSized,
1551
1626
  isExtraSmall,
1552
1627
  draggableDisabled,
1553
1628
  elementId,