@dative-gpi/foundation-shared-components 1.0.27 → 1.0.28-remove-deprecated2

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 (265) hide show
  1. package/components/FSBreadcrumbs.vue +1 -0
  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 +20 -12
  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 +51 -32
  15. package/components/FSDialogMultiFormBody.vue +79 -56
  16. package/components/FSDialogRemove.vue +7 -7
  17. package/components/FSDialogSubmit.vue +20 -11
  18. package/components/FSEditImage.vue +1 -1
  19. package/components/FSEditImageUI.vue +20 -10
  20. package/components/FSFadeOut.vue +44 -18
  21. package/components/FSForm.vue +10 -8
  22. package/components/FSGrid.vue +1 -1
  23. package/components/FSIcon.vue +2 -1
  24. package/components/FSIconCard.vue +21 -4
  25. package/components/FSImage.vue +12 -4
  26. package/components/FSImageUI.vue +8 -15
  27. package/components/FSLink.vue +25 -9
  28. package/components/FSLoader.vue +28 -11
  29. package/components/FSOptionGroup.vue +51 -3
  30. package/components/FSRouterLink.vue +42 -0
  31. package/components/FSSlideGroup.vue +19 -5
  32. package/components/FSSpan.vue +9 -2
  33. package/components/FSSwitch.vue +57 -27
  34. package/components/FSTab.vue +15 -13
  35. package/components/FSTabs.vue +32 -7
  36. package/components/FSTag.vue +14 -3
  37. package/components/FSTagGroup.vue +1 -1
  38. package/components/FSText.vue +4 -2
  39. package/components/FSWindow.vue +128 -4
  40. package/components/FSWrapGroup.vue +13 -1
  41. package/components/agenda/FSAgenda.vue +223 -0
  42. package/components/agenda/FSAgendaDialogCalendar.vue +76 -0
  43. package/components/agenda/FSAgendaHeader.vue +215 -0
  44. package/components/agenda/FSAgendaHorizontalEvent.vue +174 -0
  45. package/components/agenda/FSAgendaHorizontalTimeLineMarker.vue +46 -0
  46. package/components/agenda/FSAgendaHoursCol.vue +103 -0
  47. package/components/agenda/FSAgendaHoursRow.vue +164 -0
  48. package/components/agenda/FSAgendaVerticalEvent.vue +160 -0
  49. package/components/agenda/FSAgendaVerticalTimeLineMarker.vue +46 -0
  50. package/components/agenda/FSDayAgenda.vue +199 -0
  51. package/components/agenda/FSMonthAgenda.vue +252 -0
  52. package/components/agenda/FSSelectAgendaMode.vue +54 -0
  53. package/components/agenda/FSWeekAgenda.vue +323 -0
  54. package/components/autocompletes/FSAutoCompleteAddress.vue +22 -20
  55. package/components/autocompletes/FSAutocompleteLanguage.vue +24 -39
  56. package/components/autocompletes/FSAutocompleteTimeZone.vue +26 -38
  57. package/components/buttons/FSButtonAdd.vue +1 -1
  58. package/components/buttons/FSButtonAddLabel.vue +1 -1
  59. package/components/buttons/FSButtonCancel.vue +1 -1
  60. package/components/buttons/FSButtonCancelLabel.vue +1 -1
  61. package/components/buttons/FSButtonCopy.vue +28 -0
  62. package/components/buttons/FSButtonCopyIcon.vue +28 -0
  63. package/components/buttons/FSButtonCopyLabel.vue +27 -0
  64. package/components/buttons/FSButtonCopyMini.vue +28 -0
  65. package/components/buttons/FSButtonDragIcon.vue +27 -0
  66. package/components/buttons/FSButtonDuplicate.vue +1 -1
  67. package/components/buttons/FSButtonDuplicateLabel.vue +1 -1
  68. package/components/buttons/FSButtonEdit.vue +1 -1
  69. package/components/buttons/FSButtonEditLabel.vue +1 -1
  70. package/components/buttons/FSButtonFile.vue +1 -1
  71. package/components/buttons/FSButtonFileLabel.vue +1 -1
  72. package/components/buttons/FSButtonNext.vue +1 -1
  73. package/components/buttons/FSButtonNextLabel.vue +1 -1
  74. package/components/buttons/FSButtonPrevious.vue +1 -1
  75. package/components/buttons/FSButtonPreviousLabel.vue +1 -1
  76. package/components/buttons/FSButtonRedo.vue +1 -1
  77. package/components/buttons/FSButtonRedoLabel.vue +1 -1
  78. package/components/buttons/FSButtonRemove.vue +1 -1
  79. package/components/buttons/FSButtonRemoveLabel.vue +1 -1
  80. package/components/buttons/FSButtonSave.vue +1 -1
  81. package/components/buttons/FSButtonSaveLabel.vue +1 -1
  82. package/components/buttons/FSButtonSearch.vue +1 -1
  83. package/components/buttons/FSButtonSearchLabel.vue +1 -1
  84. package/components/buttons/FSButtonUndo.vue +1 -1
  85. package/components/buttons/FSButtonUndoLabel.vue +1 -1
  86. package/components/buttons/FSButtonUpdate.vue +1 -1
  87. package/components/buttons/FSButtonUpdateLabel.vue +1 -1
  88. package/components/buttons/FSButtonValidate.vue +1 -1
  89. package/components/buttons/FSButtonValidateLabel.vue +1 -1
  90. package/components/calendar/FSSimpleCalendar.vue +145 -0
  91. package/components/calendar/FSSimpleCalendarHeader.vue +60 -0
  92. package/components/calendar/FSSimpleMonthSelector.vue +138 -0
  93. package/components/deviceOrganisations/FSConnectivity.vue +11 -1
  94. package/components/deviceOrganisations/FSConnectivityCard.vue +19 -47
  95. package/components/deviceOrganisations/FSStatus.vue +11 -1
  96. package/components/deviceOrganisations/FSStatusCard.vue +35 -61
  97. package/components/deviceOrganisations/FSStatusesCarousel.vue +1 -0
  98. package/components/deviceOrganisations/FSStatusesRow.vue +9 -3
  99. package/components/deviceOrganisations/FSWorstAlert.vue +30 -37
  100. package/components/deviceOrganisations/FSWorstAlertCard.vue +36 -85
  101. package/components/fields/FSAutocompleteField.vue +516 -341
  102. package/components/fields/FSAutocompleteTag.vue +100 -0
  103. package/components/fields/FSBaseField.vue +44 -27
  104. package/components/fields/FSColorField.vue +42 -39
  105. package/components/fields/FSCommentField.vue +105 -0
  106. package/components/fields/FSDateField.vue +2 -2
  107. package/components/fields/FSDateRangeField.vue +3 -2
  108. package/components/fields/FSDateTimeField.vue +4 -3
  109. package/components/fields/FSDateTimeRangeField.vue +8 -6
  110. package/components/fields/FSEntityFieldUI.vue +271 -0
  111. package/components/fields/FSGradientField.vue +27 -33
  112. package/components/fields/FSIconField.vue +0 -1
  113. package/components/fields/FSMagicConfigField.vue +15 -7
  114. package/components/fields/FSMagicField.vue +9 -4
  115. package/components/fields/FSNumberField.vue +13 -6
  116. package/components/fields/FSRichTextField.vue +102 -52
  117. package/components/fields/FSSearchField.vue +9 -115
  118. package/components/fields/FSSelectField.vue +489 -252
  119. package/components/fields/FSTagField.vue +1 -1
  120. package/components/fields/FSTermField.vue +33 -11
  121. package/components/fields/FSTextArea.vue +26 -7
  122. package/components/fields/FSTextField.vue +19 -10
  123. package/components/fields/FSTimeRangeField.vue +304 -0
  124. package/components/fields/FSTimeStepField.vue +3 -3
  125. package/components/fields/FSTranslateField.vue +4 -3
  126. package/components/fields/FSTranslateRichTextField.vue +15 -10
  127. package/components/fields/FSTranslateTextArea.vue +233 -0
  128. package/components/fields/FSTreeViewField.vue +3 -3
  129. package/components/fields/periodicField/FSPeriodicDailyField.vue +120 -0
  130. package/components/fields/periodicField/FSPeriodicField.vue +131 -0
  131. package/components/fields/periodicField/FSPeriodicMonthlyField.vue +222 -0
  132. package/components/fields/periodicField/FSPeriodicWeeklyField.vue +120 -0
  133. package/components/fields/periodicField/FSPeriodicYearlyField.vue +144 -0
  134. package/components/lists/FSDataTableUI.vue +148 -89
  135. package/components/lists/FSDraggable.vue +2 -2
  136. package/components/lists/FSFilterButton.vue +23 -28
  137. package/components/lists/FSHeaderButton.vue +4 -4
  138. package/components/lists/FSHiddenButton.vue +11 -15
  139. package/components/lists/FSLoadDataTable.vue +10 -7
  140. package/components/lists/FSSimpleList.vue +234 -0
  141. package/components/lists/FSSimpleListItem.vue +132 -0
  142. package/components/map/FSMap.vue +280 -399
  143. package/components/map/FSMapFeatureGroup.vue +51 -0
  144. package/components/map/FSMapLayerButton.vue +5 -5
  145. package/components/map/FSMapMarker.vue +120 -0
  146. package/components/map/FSMapMarkerClusterGroup.vue +72 -0
  147. package/components/map/FSMapOverlay.vue +70 -82
  148. package/components/map/FSMapPolygon.vue +81 -0
  149. package/components/map/FSMapTileLayer.vue +50 -0
  150. package/components/map/keys.ts +4 -0
  151. package/components/selects/FSSelectAutoRefresh.vue +9 -9
  152. package/components/selects/FSSelectDashboardVariableType.vue +5 -4
  153. package/components/selects/FSSelectDateSetting.vue +3 -2
  154. package/components/selects/FSSelectDays.vue +9 -9
  155. package/components/selects/FSSelectListMode.vue +51 -0
  156. package/components/selects/FSSelectMonths.vue +67 -0
  157. package/components/selects/chartSelectors/FSAggregationSelector.vue +52 -0
  158. package/components/selects/chartSelectors/FSAxisTypeSelector.vue +49 -0
  159. package/components/selects/chartSelectors/FSDisplayAsSelector.vue +53 -0
  160. package/components/selects/chartSelectors/FSFilterTypeSelector.vue +54 -0
  161. package/components/selects/chartSelectors/FSHeatmapRuleSelector.vue +54 -0
  162. package/components/selects/chartSelectors/FSOperationOnSelector.vue +53 -0
  163. package/components/selects/chartSelectors/FSPlanningTypeSelector.vue +53 -0
  164. package/components/selects/chartSelectors/FSPlotPerSelector.vue +52 -0
  165. package/components/selects/chartSelectors/FSSelectEntityType.vue +59 -0
  166. package/components/selects/chartSelectors/FSSerieTypeSelector.vue +53 -0
  167. package/components/tiles/FSAlertTileUI.vue +90 -0
  168. package/components/tiles/FSChartTile.vue +73 -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 +134 -0
  184. package/components/views/desktop/FSBaseDesktopView.vue +53 -0
  185. package/components/views/desktop/FSBaseEntityDesktopView.vue +208 -0
  186. package/components/views/mobile/FSBaseDefaultMobileView.vue +132 -0
  187. package/components/views/mobile/FSBaseEntityMobileView.vue +198 -0
  188. package/components/views/mobile/FSBaseMobileView.vue +53 -0
  189. package/composables/useAddress.ts +2 -2
  190. package/composables/useBreakpoints.ts +39 -3
  191. package/composables/useColors.ts +3 -2
  192. package/composables/useMagicFieldProvider.ts +1 -0
  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 +5 -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 +6 -12
  210. package/styles/components/fs_card.scss +0 -1
  211. package/styles/components/fs_clickable.scss +7 -14
  212. package/styles/components/fs_clock.scss +0 -10
  213. package/styles/components/fs_color_field.scss +1 -4
  214. package/styles/components/fs_data_table.scss +6 -9
  215. package/styles/components/fs_dialog.scss +7 -17
  216. package/styles/components/fs_edit_image.scss +8 -0
  217. package/styles/components/fs_fade_out.scss +11 -2
  218. package/styles/components/fs_filter_button.scss +1 -6
  219. package/styles/components/fs_gradient_field.scss +11 -11
  220. package/styles/components/fs_hidden_button.scss +2 -7
  221. package/styles/components/fs_image_card.scss +1 -1
  222. package/styles/components/fs_magic_config_field.scss +1 -2
  223. package/styles/components/fs_map.scss +36 -30
  224. package/styles/components/fs_meta_field.scss +3 -5
  225. package/styles/components/fs_option_group.scss +15 -5
  226. package/styles/components/fs_rich_text_field.scss +1 -9
  227. package/styles/components/fs_select_date_settings.scss +3 -0
  228. package/styles/components/fs_select_field.scss +0 -13
  229. package/styles/components/fs_slide_group.scss +7 -0
  230. package/styles/components/fs_span.scss +2 -1
  231. package/styles/components/fs_switch.scss +1 -0
  232. package/styles/components/fs_tabs.scss +10 -24
  233. package/styles/components/fs_tag.scss +3 -19
  234. package/styles/components/fs_text_area.scss +13 -17
  235. package/styles/components/fs_tile.scss +21 -15
  236. package/styles/components/fs_window.scss +7 -0
  237. package/styles/components/fs_wrap_group.scss +7 -0
  238. package/styles/components/index.scss +5 -5
  239. package/styles/globals/index.scss +1 -5
  240. package/styles/globals/overrides.scss +17 -57
  241. package/styles/globals/text_fonts.scss +18 -66
  242. package/tools/alertsTools.ts +69 -0
  243. package/tools/chartsTools.ts +427 -0
  244. package/tools/index.ts +3 -0
  245. package/tools/timeRangeTools.ts +125 -0
  246. package/utils/filter.ts +18 -0
  247. package/utils/index.ts +1 -0
  248. package/utils/leafletMarkers.ts +9 -3
  249. package/utils/sort.ts +2 -2
  250. package/utils/statuses.ts +1 -1
  251. package/utils/time.ts +17 -17
  252. package/components/autocompletes/FSAutocompleteTag.vue +0 -138
  253. package/components/fields/FSTimeSlotField.vue +0 -250
  254. package/components/map/FSMapEditPointAddressOverlay.vue +0 -164
  255. package/components/views/FSEntityHeader.vue +0 -350
  256. package/components/views/FSListHeader.vue +0 -83
  257. package/components/views/FSListView.vue +0 -83
  258. package/components/views/FSSkeletonView.vue +0 -100
  259. package/styles/components/fs_icon_field.scss +0 -12
  260. package/styles/components/fs_map_overlay.scss +0 -38
  261. package/styles/components/fs_tag_field.scss +0 -8
  262. package/styles/components/fs_time_field.scss +0 -12
  263. package/styles/components/fs_timeslot_field.scss +0 -12
  264. package/styles/globals/breakpoints.scss +0 -20
  265. package/styles/globals/fixes.scss +0 -5
@@ -1,9 +1,11 @@
1
1
  <template>
2
2
  <FSCol
3
3
  gap="16px"
4
+ style="position: relative;"
4
5
  >
5
6
  <FSRow
6
- align="bottom-center"
7
+ v-if="$props.showSearch || (!isExtraSmall && ($slots.prependToolbar || $slots.toolbar )) || (!$props.disableTable && !$props.disableIterator)"
8
+ align="bottom-left"
7
9
  :wrap="isExtraSmall ? false : true"
8
10
  width="fill"
9
11
  >
@@ -15,16 +17,14 @@
15
17
  v-if="$props.showSearch"
16
18
  >
17
19
  <FSSearchField
18
- prependInnerIcon="mdi-magnify"
19
20
  :hideHeader="true"
20
21
  v-model="innerSearch"
21
22
  />
22
23
  <FSButton
23
24
  v-if="filterableHeaders.length > 0"
24
25
  prependIcon="mdi-filter-variant"
25
- padding="0 7px"
26
- :variant="showFilters ? 'full' : 'standard'"
27
- @click="showFilters = !showFilters"
26
+ :variant="innerShowFilters ? 'full' : 'standard'"
27
+ @click="innerShowFilters = !innerShowFilters"
28
28
  />
29
29
  </template>
30
30
  <slot
@@ -34,7 +34,6 @@
34
34
  <template
35
35
  v-if="!$props.disableTable && !$props.disableIterator"
36
36
  >
37
- <v-spacer />
38
37
  <FSRow
39
38
  align="center-right"
40
39
  >
@@ -42,6 +41,7 @@
42
41
  :values="modeOptions"
43
42
  :singleColor="true"
44
43
  :required="true"
44
+ variant="slide"
45
45
  v-model="innerMode"
46
46
  />
47
47
  </FSRow>
@@ -61,7 +61,7 @@
61
61
  gap="16px"
62
62
  >
63
63
  <FSCol
64
- v-if="showFilters && hasVisibleFilters"
64
+ v-if="innerShowFilters && hasVisibleFilters"
65
65
  width="hug"
66
66
  >
67
67
  <FSRow
@@ -95,9 +95,9 @@
95
95
  gap="8px"
96
96
  >
97
97
  <FSChip
98
- v-if="showFilters && resetable"
98
+ v-if="innerShowFilters && resetable"
99
99
  variant="standard"
100
- :label="$tr('ui.data-table.reset-filters', 'Reset')"
100
+ :label="$tr('data-table.reset-filters', 'Reset')"
101
101
  :height="['30px', '24px']"
102
102
  :color="ColorEnum.Error"
103
103
  :editable="true"
@@ -149,7 +149,7 @@
149
149
  <FSText
150
150
  font="text-overline"
151
151
  >
152
- {{ $tr("ui.data-table.empty", "No data") }}
152
+ {{ $tr("ui.common.no-data", "No data") }}
153
153
  </FSText>
154
154
  </template>
155
155
  <template
@@ -291,25 +291,29 @@
291
291
  <slot
292
292
  :name="`${header.slotName}-append`"
293
293
  />
294
- <v-spacer />
295
- <slot
296
- :name="`${header.slotName}-configuration`"
294
+ <FSRow
295
+ align="center-right"
296
+ :wrap="false"
297
297
  >
298
- <FSHeaderButton
299
- :first="index === 0"
300
- :last="index === headersSlots.length - 1"
301
- @update:hide="updateHeader(header, 'hidden', !header.hidden)"
302
- @update:left="updateHeader(header, 'index', -1)"
303
- @update:right="updateHeader(header, 'index', 1)"
304
- />
305
- <FSButton
306
- v-if="header.sortable"
307
- variant="icon"
308
- :color="sortColor(header, props)"
309
- :icon="sortIcon(header, props)"
310
- @click="toggleSort(header)"
311
- />
312
- </slot>
298
+ <slot
299
+ :name="`${header.slotName}-configuration`"
300
+ >
301
+ <FSHeaderButton
302
+ :first="index === 0"
303
+ :last="index === headersSlots.length - 1"
304
+ @update:hide="updateHeader(header, 'hidden', !header.hidden)"
305
+ @update:left="updateHeader(header, 'index', -1)"
306
+ @update:right="updateHeader(header, 'index', 1)"
307
+ />
308
+ <FSButton
309
+ v-if="header.sortable"
310
+ variant="icon"
311
+ :color="sortColor(header, props)"
312
+ :icon="sortIcon(header, props)"
313
+ @click="toggleSort(header)"
314
+ />
315
+ </slot>
316
+ </FSRow>
313
317
  </FSRow>
314
318
  </slot>
315
319
  </template>
@@ -357,22 +361,23 @@
357
361
  <FSText
358
362
  font="text-button"
359
363
  >
360
- {{ $tr("ui.data-table.all-selected-bold", "Warning:") }}
364
+ {{ $tr("data-table.all-selected-bold", "Warning:") }}
361
365
  </FSText>
362
366
  <FSText>
363
- {{ $tr("ui.data-table.all-selected-regular", "All elements selected") }}
367
+ {{ $tr("data-table.all-selected-regular", "All elements selected") }}
364
368
  </FSText>
365
369
  </FSRow>
366
370
  </template>
367
371
  <template
368
372
  v-else
369
373
  >
370
- <FSText>
371
- {{ $tr("ui.data-table.some-selected", "{0} element(s) selected", $props.modelValue.length.toString()) }}
372
- </FSText>
374
+ <FSRow>
375
+ <FSText>
376
+ {{ $tr("data-table.some-selected", "{0} element(s) selected", $props.modelValue.length.toString()) }}
377
+ </FSText>
378
+ </FSRow>
373
379
  </template>
374
380
  </template>
375
- <v-spacer />
376
381
  <FSRow
377
382
  align="center-right"
378
383
  width="hug"
@@ -381,7 +386,7 @@
381
386
  <FSText
382
387
  font="text-overline"
383
388
  >
384
- {{ $tr("ui.data-table.rows-per-page", "Rows per page") }}
389
+ {{ $tr("data-table.rows-per-page", "Rows per page") }}
385
390
  </FSText>
386
391
  <FSSelectField
387
392
  class="fs-data-table-rows-per-page fs-small-input"
@@ -433,7 +438,7 @@
433
438
  <FSText
434
439
  font="text-overline"
435
440
  >
436
- {{ $tr("ui.data-table.empty", "No data") }}
441
+ {{ $tr("ui.common.no-data", "No data") }}
437
442
  </FSText>
438
443
  </template>
439
444
  <template
@@ -447,7 +452,7 @@
447
452
  v-for="(item, index) in items"
448
453
  elementSelector=".fs-draggable-item"
449
454
  :disabled="draggableDisabled"
450
- :item="item"
455
+ :item="{ ...item, index }"
451
456
  :key="index"
452
457
  @update:dragend="(event, dragged) => onDragEnd(event, dragged, '.fs-data-iterator-container')"
453
458
  @dragover="(event) => onDragOver(event, '.fs-draggable-item', '.fs-data-iterator-container')"
@@ -531,22 +536,23 @@
531
536
  <FSText
532
537
  font="text-button"
533
538
  >
534
- {{ $tr("ui.data-table.all-selected-bold", "Warning:") }}
539
+ {{ $tr("data-table.all-selected-bold", "Warning:") }}
535
540
  </FSText>
536
541
  <FSText>
537
- {{ $tr("ui.data-table.all-selected-regular", "All elements selected") }}
542
+ {{ $tr("data-table.all-selected-regular", "All elements selected") }}
538
543
  </FSText>
539
544
  </FSRow>
540
545
  </template>
541
546
  <template
542
547
  v-else
543
548
  >
544
- <FSText>
545
- {{ $tr("ui.data-table.some-selected", "{0} element(s) selected", $props.modelValue.length.toString()) }}
546
- </FSText>
549
+ <FSRow>
550
+ <FSText>
551
+ {{ $tr("data-table.some-selected", "{0} element(s) selected", $props.modelValue.length.toString()) }}
552
+ </FSText>
553
+ </FSRow>
547
554
  </template>
548
555
  </template>
549
- <v-spacer />
550
556
  <FSRow
551
557
  align="center-right"
552
558
  :wrap="false"
@@ -554,7 +560,7 @@
554
560
  <FSText
555
561
  font="text-overline"
556
562
  >
557
- {{ $tr("ui.data-table.rows-per-page", "Rows per page") }}
563
+ {{ $tr("data-table.rows-per-page", "Rows per page") }}
558
564
  </FSText>
559
565
  <FSRow
560
566
  width="120px"
@@ -603,7 +609,7 @@
603
609
  <FSText
604
610
  font="text-overline"
605
611
  >
606
- {{ $tr("ui.data-table.empty", "No data") }}
612
+ {{ $tr("ui.common.no-data", "No data") }}
607
613
  </FSText>
608
614
  </template>
609
615
  <template
@@ -618,7 +624,7 @@
618
624
  v-for="(item, index) in items.filter((item) => item.type === 'item')"
619
625
  elementSelector=".fs-draggable-item"
620
626
  :disabled="draggableDisabled"
621
- :item="item"
627
+ :item="{ ...item, index }"
622
628
  :key="index"
623
629
  @update:dragend="(event, dragged) => onDragEnd(event, dragged, '.fs-data-iterator-container')"
624
630
  @dragover="(event) => onDragOver(event, '.fs-draggable-item', '.fs-data-iterator-container')"
@@ -685,7 +691,7 @@
685
691
  <div
686
692
  class="fs-data-table-intersection"
687
693
  :id="elementId"
688
- />
694
+ />
689
695
  </FSCol>
690
696
  </template>
691
697
 
@@ -696,9 +702,10 @@ import { useRouter } from "vue-router";
696
702
  import { ColorEnum, type FSDataTableColumn, type FSDataTableFilter, type FSDataTableOrder, type FSToggle } from "@dative-gpi/foundation-shared-components/models";
697
703
  import { useBreakpoints, useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
698
704
  import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
705
+ import { useRouting } from "@dative-gpi/foundation-shared-services/composables";
699
706
  import { uuidv4 } from "@dative-gpi/bones-ui/tools/uuid"
700
707
 
701
- import { alphanumericSort, sizeToVar } from "../../utils";
708
+ import { alphanumericSort, containsSearchTerm, sizeToVar } from "../../utils";
702
709
 
703
710
  import FSDataIteratorItem from "./FSDataIteratorItem.vue";
704
711
  import FSSearchField from "../fields/FSSearchField.vue";
@@ -746,6 +753,11 @@ export default defineComponent({
746
753
  type: Array as PropType<FSDataTableColumn[]>,
747
754
  required: true
748
755
  },
756
+ showFilters: {
757
+ type: Boolean,
758
+ required: false,
759
+ default: false
760
+ },
749
761
  filters: {
750
762
  type: Object as PropType<{ [key: string]: FSDataTableFilter[] }>,
751
763
  required: false,
@@ -815,6 +827,11 @@ export default defineComponent({
815
827
  required: false,
816
828
  default: true
817
829
  },
830
+ noSearch: {
831
+ type: Boolean,
832
+ required: false,
833
+ default: false
834
+ },
818
835
  singleSelect: {
819
836
  type: Boolean,
820
837
  required: false,
@@ -881,8 +898,9 @@ export default defineComponent({
881
898
  default: "12px"
882
899
  },
883
900
  },
884
- emits: ["update:modelValue", "update:headers", "update:filters", "update:mode", "update:sortBy", "update:rowsPerPage", "update:page", "update:include", "update:items", "click:row"],
901
+ 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"],
885
902
  setup(props, { emit }) {
903
+ const { handleRoutingEvent } = useRouting();
886
904
  const { isExtraSmall } = useBreakpoints();
887
905
  const { $tr } = useTranslationsProvider();
888
906
  const { getColors } = useColors();
@@ -895,9 +913,9 @@ export default defineComponent({
895
913
  const innerSearch: Ref<string | null> = ref(null);
896
914
  const innerRowsPerPage = ref(props.rowsPerPage);
897
915
  const innerSortBy = ref(props.sortBy);
898
- const innerMode = ref(props.mode);
916
+ const innerMode = ref(props.disableTable ? "iterator" : props.disableIterator ? "table" : props.mode);
899
917
  const innerPage = ref(props.page);
900
- const showFilters = ref(true);
918
+ const innerShowFilters = ref(props.showFilters);
901
919
  const resetable = ref(false);
902
920
 
903
921
  const intersectionObserver = ref<IntersectionObserver | null>(null);
@@ -906,19 +924,26 @@ export default defineComponent({
906
924
  const elementId = `id${uuidv4()}`;
907
925
 
908
926
  const modeOptions: FSToggle[] = [
909
- { id: "table", prependIcon: "mdi-table" },
910
- { id: "iterator", prependIcon: "mdi-apps" }
927
+ { id: "iterator", prependIcon: "mdi-view-grid-outline" },
928
+ { id: "table", prependIcon: "mdi-format-list-bulleted" }
911
929
  ];
912
930
 
913
931
  const rowsPerPageOptions: { id: number, label: string }[] = [
914
932
  { id: 5, label: "5" },
915
933
  { id: 10, label: "10" },
916
934
  { id: 30, label: "30" },
917
- { id: -1, label: $tr("ui.data-table.all-rows", "All") }
935
+ { id: -1, label: $tr("ui.common.all", "All") }
918
936
  ];
919
937
 
920
938
  const showFiltersRow = computed((): boolean => {
921
- return (props.showSearch && showFilters.value && filterableHeaders.value.length > 0) || hiddenHeaders.value.length > 0;
939
+ switch (innerMode.value) {
940
+ case "iterator": {
941
+ return (props.showSearch && innerShowFilters.value && filterableHeaders.value.length > 0);
942
+ }
943
+ case "table": {
944
+ return (props.showSearch && innerShowFilters.value && filterableHeaders.value.length > 0) || hiddenHeaders.value.length > 0;
945
+ }
946
+ }
922
947
  });
923
948
 
924
949
  const hasVisibleFilters = computed((): boolean => {
@@ -926,7 +951,15 @@ export default defineComponent({
926
951
  });
927
952
 
928
953
  const showFiltersDivider = computed((): boolean => {
929
- return resetable.value || (hiddenHeaders.value.length > 0 && hasVisibleFilters.value);
954
+ switch (innerMode.value) {
955
+ case "iterator": {
956
+ return resetable.value;
957
+ }
958
+ case "table": {
959
+ return resetable.value || (hiddenHeaders.value.length > 0 && hasVisibleFilters.value);
960
+ }
961
+ }
962
+
930
963
  });
931
964
 
932
965
  const hasToolbar = computed((): boolean => {
@@ -1021,21 +1054,24 @@ export default defineComponent({
1021
1054
  });
1022
1055
 
1023
1056
  const innerItems = computed((): any[] => {
1024
- const activeFilters: { key: string, filter: FSDataTableFilter }[] = Object.keys(filters.value).reduce((acc, key) => {
1025
- return acc.concat(filters.value[key].filter((filter) => filter.hidden).map((filter) => ({ key, filter })));
1026
- }, [] as { key: string, filter: FSDataTableFilter }[]);
1057
+ const activeFilters: { [key: string]: FSDataTableFilter[] } = {};
1058
+ for (const property in filters.value) {
1059
+ activeFilters[property] = filters.value[property].filter((filter) => !filter.hidden);
1060
+ }
1061
+
1027
1062
  if (props.items && props.items.length) {
1063
+ const innerSearchFormatted = innerSearch.value ? innerSearch.value.toLowerCase() : null;
1028
1064
  return props.items.filter((item) => {
1029
1065
  if (props.selectedOnly && !props.modelValue.includes(item[props.itemValue])) {
1030
1066
  return false;
1031
1067
  }
1032
- if (innerSearch.value) {
1033
- if (!JSON.stringify(item).toLowerCase().includes(innerSearch.value.toString().toLowerCase())) {
1068
+ for (const property in activeFilters) {
1069
+ if (!activeFilters[property].some((filter) => filter.filter && filter.filter(filter.value, item[property], item))) {
1034
1070
  return false;
1035
1071
  }
1036
1072
  }
1037
- if (activeFilters.some(af => af.filter.filter && af.filter.filter(af.filter.value, item[af.key], item))) {
1038
- return false;
1073
+ if (!props.noSearch && innerSearchFormatted) {
1074
+ return containsSearchTerm(item, innerSearchFormatted);
1039
1075
  }
1040
1076
  return true;
1041
1077
  });
@@ -1084,12 +1120,7 @@ export default defineComponent({
1084
1120
  clickable: true,
1085
1121
  row: (event: PointerEvent, row: any) => {
1086
1122
  if (props.itemTo && router) {
1087
- if (event.metaKey || event.ctrlKey || event.button === 1) {
1088
- window.open(router.resolve(props.itemTo(row.item)).href, "_blank");
1089
- }
1090
- else {
1091
- router.push(props.itemTo(row.item));
1092
- }
1123
+ handleRoutingEvent(event, props.itemTo(row.item), true);
1093
1124
  }
1094
1125
  else {
1095
1126
  emit("click:row", row.item);
@@ -1214,39 +1245,52 @@ export default defineComponent({
1214
1245
  const key = header.value!;
1215
1246
  const currentFilters = filters.value[key];
1216
1247
 
1248
+ const getPath = (object: any, keys: string[]) => keys.reduce((acc, key) => acc[key] ?? null, object);
1249
+
1217
1250
  let value: FSDataTableFilter[] = [];
1218
1251
 
1219
1252
  if (header.fixedFilters) {
1220
1253
  value = header.fixedFilters.map((ff): FSDataTableFilter => ({
1221
1254
  hidden: currentFilters?.find((cf) => cf.value == (ff.value || null))?.hidden ?? false,
1222
1255
  text: ff.text?.toString() ?? "—",
1223
- value: ff.value || null,
1224
- filter: header.methodFilter ?? ((value, property) => {
1225
- property = [property].flat();
1226
- return Array.isArray(property) ? property.includes(value) || (!value && property.length == 0) : (!value && !property) || value == property;
1256
+ value: ff.value ?? null,
1257
+ filter: header.methodFilter ?? ((_, property, item) => {
1258
+ if (header.methodFilterRaw) {
1259
+ return header.methodFilterRaw(ff.value, item);
1260
+ }
1261
+ const flat = property = [property].flat();
1262
+ return (!ff.value && flat.length == 0) || flat.some(f => f == ff.value);
1227
1263
  })
1228
1264
  }));
1265
+ filterDictionary[key] = value;
1229
1266
  }
1230
1267
  else {
1231
1268
  if (props.items && props.items.length) {
1232
1269
  const mapToInnerValue = header.innerValue ? header.innerValue : (i: any) => i;
1233
- const itemValues = props.items.flatMap((item) => Array.isArray(item[key]) && item[key].length == 0 ? undefined : item[key]).map(mapToInnerValue);
1270
+ const itemValues = props.items.flatMap((item) => {
1271
+ return Array.isArray(getPath(item, key.split("."))) && getPath(item, key.split(".")).length == 0 ? undefined : getPath(item, key.split("."))
1272
+ }).map(mapToInnerValue);
1234
1273
  const distinctValues = [...new Set(itemValues)];
1235
1274
 
1236
- value = distinctValues.map((dv): FSDataTableFilter => ({
1237
- hidden: currentFilters?.find((cf) => cf.value == (dv || null))?.hidden ?? false,
1238
- text: dv?.toString() ?? "—",
1239
- value: dv || null,
1240
- filter: header.methodFilter ?? ((_, property) => {
1241
- property = [property].flat().map(mapToInnerValue);
1242
- return Array.isArray(property) ? property.includes(dv) || (!dv && property.length == 0) : (!dv && !property) || dv == property;
1243
- })
1244
- }));
1275
+ value = distinctValues.map((dv): FSDataTableFilter => {
1276
+ return {
1277
+ hidden: currentFilters?.find((cf) => cf.value == (dv || null))?.hidden ?? false,
1278
+ text: dv?.toString() ?? "—",
1279
+ value: dv || null,
1280
+ filter: header.methodFilter ?? ((_, property, item) => {
1281
+ if (header.methodFilterRaw) {
1282
+ return header.methodFilterRaw(dv, item);
1283
+ }
1284
+ const flat = [property].flat().map(mapToInnerValue);
1285
+ return (!dv && flat.length == 0) || flat.some(f => f == dv);
1286
+ })
1287
+ }
1288
+ });
1245
1289
  }
1290
+ filterDictionary[key] = value.sort((v1, v2) => {
1291
+ return v1.text.localeCompare(v2.text, undefined, { numeric: true });
1292
+ });
1246
1293
  }
1247
- filterDictionary[key] = value.sort((v1, v2) => {
1248
- return v1.text.localeCompare(v2.text, undefined, { numeric: true });
1249
- });
1250
1294
  }
1251
1295
  for (const [key, filters] of Object.entries(props.filters)) {
1252
1296
  for (const filter of filters) {
@@ -1313,6 +1357,7 @@ export default defineComponent({
1313
1357
  }, { threshold: [0.9] });
1314
1358
  }
1315
1359
  if (document.querySelector(`#${elementId}`)) {
1360
+ intersectionObserver.value.unobserve(document.querySelector(`#${elementId}`)!);
1316
1361
  intersectionObserver.value.observe(document.querySelector(`#${elementId}`)!);
1317
1362
  }
1318
1363
  return;
@@ -1349,10 +1394,10 @@ export default defineComponent({
1349
1394
  };
1350
1395
 
1351
1396
  const resetRowIndex = (initialIndex: number, currentIndex: number, draggedElement: HTMLElement, tbodyElement: HTMLElement) => {
1352
- if (initialIndex > currentIndex) {
1397
+ if (initialIndex > currentIndex && tbodyElement.children[initialIndex]) {
1353
1398
  tbodyElement.children[initialIndex].insertAdjacentElement("afterend", draggedElement);
1354
1399
  }
1355
- else {
1400
+ else if(tbodyElement.children[initialIndex]) {
1356
1401
  tbodyElement.children[initialIndex].insertAdjacentElement("beforebegin", draggedElement);
1357
1402
  }
1358
1403
  };
@@ -1468,8 +1513,17 @@ export default defineComponent({
1468
1513
  }
1469
1514
  });
1470
1515
 
1516
+ watch(() => props.showFilters, () => {
1517
+ innerShowFilters.value = props.showFilters;
1518
+ });
1519
+
1471
1520
  watch(innerSearch, () => {
1472
1521
  innerPage.value = 1;
1522
+ emit("update:search", innerSearch.value);
1523
+ });
1524
+
1525
+ watch(innerShowFilters, () => {
1526
+ emit("update:showFilters", innerShowFilters.value);
1473
1527
  });
1474
1528
 
1475
1529
  watch(filters, () => {
@@ -1477,6 +1531,10 @@ export default defineComponent({
1477
1531
  .some((key) => filters.value[key].some((filter) => filter.hidden));
1478
1532
  }, { deep: true });
1479
1533
 
1534
+ watch(size, () => {
1535
+ observeIntersection();
1536
+ });
1537
+
1480
1538
  watch(innerMode, () => {
1481
1539
  emit("update:mode", innerMode.value);
1482
1540
  size.value = props.sizeIterator;
@@ -1501,6 +1559,7 @@ export default defineComponent({
1501
1559
 
1502
1560
  watch(() => props.items, async () => {
1503
1561
  computeFilters();
1562
+ observeIntersection();
1504
1563
  if (innerPage.value !== 1) {
1505
1564
  const formerPage = innerPage.value;
1506
1565
  innerPage.value = 1;
@@ -1520,7 +1579,7 @@ export default defineComponent({
1520
1579
  innerPage,
1521
1580
  hasToolbar,
1522
1581
  pageOptions,
1523
- showFilters,
1582
+ innerShowFilters,
1524
1583
  showFiltersRow,
1525
1584
  showFiltersDivider,
1526
1585
  hasVisibleFilters,
@@ -74,7 +74,7 @@ export default defineComponent({
74
74
  const dragged = (event.target as HTMLElement)?.closest(props.elementSelector) as HTMLElement;
75
75
  dragged.classList.add("fs-draggable-dragging");
76
76
  dragged.classList.add("fs-draggable-dragging-grabbegin");
77
- dragged.dataset.initialIndex = props.item?.index ?? props.item?.value;
77
+ dragged.dataset.initialIndex = props.item.index;
78
78
  event.preventDefault();
79
79
  }
80
80
  }, mobileGrabThreshold);
@@ -171,7 +171,7 @@ export default defineComponent({
171
171
  return;
172
172
  }
173
173
  const dragged = (event.target as HTMLElement)?.closest(props.elementSelector) as HTMLElement;
174
- dragged.dataset.initialIndex = props.item?.index ?? props.item?.value;
174
+ dragged.dataset.initialIndex = props.item.index;
175
175
  event.dataTransfer?.setDragImage(dragged, 25, 25);
176
176
 
177
177
  if (event.dataTransfer) {
@@ -7,10 +7,10 @@
7
7
  #activator="{ props }"
8
8
  >
9
9
  <FSChip
10
+ prependIcon="mdi-filter-variant"
10
11
  class="fs-filter-button"
11
12
  variant="standard"
12
- prependIcon="mdi-filter-variant"
13
- :height="[30, 24]"
13
+ :height="['30px', '24px']"
14
14
  :color="ColorEnum.Dark"
15
15
  :editable="true"
16
16
  :label="label"
@@ -23,39 +23,35 @@
23
23
  :border="false"
24
24
  >
25
25
  <FSCol
26
+ padding="20px"
26
27
  gap="12px"
27
- padding="16px 0 24px 16px"
28
28
  >
29
29
  <FSCol
30
30
  gap="12px"
31
- padding="0 16px 0 0"
32
31
  >
33
32
  <FSSpan
34
33
  font="text-overline"
35
34
  >
36
- {{ $tr("ui.data-table.filter", "Filter") }}
35
+ {{ $tr("ui.common.filter", "Filter") }}
37
36
  </FSSpan>
38
37
  <FSChip
39
38
  class="fs-filter-button-chip"
40
- :height="[30, 24]"
41
- :editable="true"
42
- :color="$props.color"
39
+ :label="$tr('ui.common.all-values', 'All values')"
40
+ :height="['30px', '24px']"
43
41
  :variant="getAllVariant()"
44
- :label="$tr('ui.data-table.all-values', 'All values')"
42
+ :color="$props.color"
43
+ :editable="true"
45
44
  @click="onToggleAll"
46
45
  />
47
- <FSDivider
48
- padding="0 8px 0 0"
49
- />
46
+ <FSDivider />
50
47
  <FSSearchField
48
+ :hideHeader="true"
51
49
  class="fs-filter-button-search"
52
- prependInnerIcon="mdi-magnify"
53
50
  v-model="search"
54
51
  />
55
52
  </FSCol>
56
53
  <FSFadeOut
57
- padding="0 8px 0 0"
58
- height="360px"
54
+ maxHeight="360px"
59
55
  >
60
56
  <FSCol
61
57
  gap="6px"
@@ -63,12 +59,12 @@
63
59
  <FSChip
64
60
  v-for="(filter, index) in searchedFilters"
65
61
  class="fs-filter-button-chip"
66
- :height="[30, 24]"
67
- :key="index"
68
- :editable="true"
69
- :label="filter.text"
70
- :color="$props.color"
71
62
  :variant="getVariant(filter)"
63
+ :height="['30px', '24px']"
64
+ :color="$props.color"
65
+ :label="filter.text"
66
+ :editable="true"
67
+ :key="index"
72
68
  @click="() => onToggle(filter)"
73
69
  >
74
70
  <template
@@ -89,8 +85,7 @@
89
85
  <script lang="ts">
90
86
  import { computed, defineComponent, type PropType, ref } from "vue";
91
87
 
92
- import type { ColorBase, FSDataTableColumn, FSDataTableFilter } from "@dative-gpi/foundation-shared-components/models";
93
- import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
88
+ import { type ColorBase, ColorEnum, type FSDataTableColumn, type FSDataTableFilter } from "@dative-gpi/foundation-shared-components/models";
94
89
  import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
95
90
 
96
91
  import FSSearchField from "../fields/FSSearchField.vue";
@@ -141,10 +136,10 @@ export default defineComponent({
141
136
  if (props.filters) {
142
137
  const hidden = props.filters.filter(f => f.hidden).length;
143
138
  if (hidden > 0) {
144
- return $tr("ui.data-table.some-filters-visible", "{0}: {1} visible", props.header.text, (props.filters.length - hidden).toString());
139
+ return $tr("filter-button.some-filters-visible", "{0}: {1} visible", props.header.text, (props.filters.length - hidden).toString());
145
140
  }
146
141
  }
147
- return $tr("ui.data-table.all-filters-visible", "{0}: All visible", props.header.text);
142
+ return $tr("filter-button.all-filters-visible", "{0}: All visible", props.header.text);
148
143
  }
149
144
  return null;
150
145
  });
@@ -195,15 +190,15 @@ export default defineComponent({
195
190
 
196
191
  return {
197
192
  searchedFilters,
193
+ singlePick,
198
194
  ColorEnum,
199
195
  expanded,
200
196
  search,
201
197
  label,
202
- singlePick,
203
- getVariant,
204
198
  getAllVariant,
205
- onToggle,
206
- onToggleAll
199
+ onToggleAll,
200
+ getVariant,
201
+ onToggle
207
202
  };
208
203
  }
209
204
  });