@dative-gpi/foundation-shared-components 1.0.70 → 1.0.71-groupings-2

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 (296) 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 +9 -7
  46. package/components/FSSlider.vue +44 -79
  47. package/components/FSSpan.vue +22 -8
  48. package/components/FSSwitch.vue +44 -48
  49. package/components/FSTab.vue +15 -13
  50. package/components/FSTabs.vue +5 -2
  51. package/components/FSTag.vue +3 -3
  52. package/components/FSTagGroup.vue +6 -4
  53. package/components/FSText.vue +21 -8
  54. package/components/FSToggleSet.vue +7 -7
  55. package/components/FSTreeView.vue +107 -0
  56. package/components/FSWindow.vue +122 -5
  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/carousels/FSCarousel.vue +23 -0
  105. package/components/carousels/FSCarouselItem.vue +14 -0
  106. package/components/deviceOrganisations/FSConnectivity.vue +5 -3
  107. package/components/deviceOrganisations/FSStatus.vue +5 -3
  108. package/components/deviceOrganisations/FSStatusCard.vue +7 -9
  109. package/components/deviceOrganisations/FSStatusRichCard.vue +171 -0
  110. package/components/deviceOrganisations/FSWorstAlert.vue +24 -36
  111. package/components/deviceOrganisations/FSWorstAlertCard.vue +8 -47
  112. package/components/fields/FSAutocompleteField.vue +85 -82
  113. package/components/fields/FSAutocompleteTag.vue +1 -1
  114. package/components/fields/FSBaseField.vue +42 -25
  115. package/components/fields/FSClosableSearchField.vue +83 -0
  116. package/components/fields/FSColorField.vue +12 -10
  117. package/components/fields/FSCommentField.vue +28 -16
  118. package/components/fields/FSDateField.vue +13 -10
  119. package/components/fields/FSDateRangeField.vue +6 -5
  120. package/components/fields/FSDateTimeField.vue +14 -11
  121. package/components/fields/FSDateTimeRangeDialog.vue +160 -0
  122. package/components/fields/FSDateTimeRangeField.vue +23 -115
  123. package/components/fields/FSEntityFieldUI.vue +19 -16
  124. package/components/fields/FSGradientField.vue +5 -5
  125. package/components/fields/FSIconField.vue +16 -9
  126. package/components/fields/FSMapAddressField.vue +187 -0
  127. package/components/fields/FSNumberField.vue +8 -4
  128. package/components/fields/FSPasswordField.vue +7 -7
  129. package/components/fields/FSPoliciesValidationField.vue +101 -0
  130. package/components/fields/FSRichTextField.vue +78 -58
  131. package/components/fields/FSSearchField.vue +9 -115
  132. package/components/fields/FSSelectField.vue +69 -71
  133. package/components/fields/FSTagField.vue +9 -9
  134. package/components/fields/FSTermField.vue +69 -46
  135. package/components/fields/FSTextArea.vue +17 -11
  136. package/components/fields/FSTextField.vue +15 -10
  137. package/components/fields/FSTimeField.vue +14 -10
  138. package/components/fields/FSTimeRangeField.vue +117 -187
  139. package/components/fields/FSTimeStepField.vue +5 -5
  140. package/components/fields/FSTranslateField.vue +10 -10
  141. package/components/fields/FSTranslateRichTextField.vue +41 -20
  142. package/components/fields/FSTranslateTextArea.vue +10 -10
  143. package/components/fields/FSTreeViewField.vue +21 -19
  144. package/components/fields/periodicField/FSPeriodicDailyField.vue +7 -7
  145. package/components/fields/periodicField/FSPeriodicField.vue +15 -15
  146. package/components/fields/periodicField/FSPeriodicMonthlyField.vue +16 -16
  147. package/components/fields/periodicField/FSPeriodicWeeklyField.vue +28 -18
  148. package/components/fields/periodicField/FSPeriodicYearlyField.vue +12 -12
  149. package/components/lists/FSDataIteratorItem.vue +23 -67
  150. package/components/lists/FSDataTableUI.vue +194 -119
  151. package/components/lists/FSFilterButton.vue +14 -16
  152. package/components/lists/FSHeaderButton.vue +11 -9
  153. package/components/lists/FSHiddenButton.vue +9 -9
  154. package/components/lists/FSLoadDataTable.vue +10 -7
  155. package/components/lists/FSSimpleList.vue +95 -88
  156. package/components/lists/FSSimpleListItem.vue +131 -0
  157. package/components/map/FSMap.vue +144 -158
  158. package/components/map/FSMapFeatureGroup.vue +7 -1
  159. package/components/map/FSMapLayerButton.vue +3 -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/FSSelectEntityType.vue +59 -0
  181. package/components/selects/chartSelectors/FSSerieTypeSelector.vue +53 -0
  182. package/components/tiles/FSAlertTileUI.vue +90 -0
  183. package/components/tiles/FSChartTileUI.vue +61 -52
  184. package/components/tiles/FSCommentTileUI.vue +38 -13
  185. package/components/tiles/FSDashboardOrganisationTypeTileUI.vue +14 -2
  186. package/components/tiles/FSDashboardShallowTileUI.vue +14 -2
  187. package/components/tiles/FSDeviceOrganisationTileUI.vue +0 -6
  188. package/components/tiles/FSEntityCountBadge.vue +83 -0
  189. package/components/tiles/FSFolderTileUI.vue +38 -4
  190. package/components/tiles/FSGroupTileUI.vue +32 -136
  191. package/components/tiles/FSGroupingTileUI.vue +52 -0
  192. package/components/tiles/FSLoadTile.vue +16 -10
  193. package/components/tiles/FSLocationTileUI.vue +50 -80
  194. package/components/tiles/FSServiceAccountOrganisationTileUI.vue +0 -6
  195. package/components/tiles/FSSimpleTileUI.vue +32 -27
  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 -1
  210. package/composables/useAddress.ts +40 -8
  211. package/composables/useBreakpoints.ts +40 -4
  212. package/composables/useColors.ts +16 -7
  213. package/composables/useMapLayers.ts +69 -0
  214. package/composables/useSlots.ts +2 -1
  215. package/models/colors.ts +2 -1
  216. package/models/deviceAlerts.ts +1 -0
  217. package/models/index.ts +0 -1
  218. package/models/map.ts +12 -10
  219. package/models/rules.ts +5 -2
  220. package/models/tables.ts +2 -1
  221. package/models/variableNode.ts +8 -5
  222. package/package.json +5 -5
  223. package/styles/components/fs_agenda.scss +4 -0
  224. package/styles/components/fs_agenda_event.scss +1 -1
  225. package/styles/components/fs_agenda_hours_row.scss +0 -8
  226. package/styles/components/fs_autocomplete_field.scss +0 -13
  227. package/styles/components/fs_breadcrumbs.scss +18 -36
  228. package/styles/components/fs_button.scss +7 -5
  229. package/styles/components/fs_calendar.scss +1 -0
  230. package/styles/components/fs_card.scss +9 -0
  231. package/styles/components/fs_chip.scss +13 -7
  232. package/styles/components/fs_clickable.scss +16 -23
  233. package/styles/components/fs_clock.scss +0 -10
  234. package/styles/components/fs_col.scss +1 -1
  235. package/styles/components/fs_color_field.scss +0 -4
  236. package/styles/components/fs_data_table.scss +6 -9
  237. package/styles/components/fs_dialog.scss +4 -10
  238. package/styles/components/fs_dialog_menu.scss +4 -2
  239. package/styles/components/fs_draggable.scss +0 -5
  240. package/styles/components/fs_fade_out.scss +10 -2
  241. package/styles/components/fs_filter_button.scss +1 -1
  242. package/styles/components/fs_hidden_button.scss +2 -7
  243. package/styles/components/fs_image_card.scss +6 -4
  244. package/styles/components/fs_magic_config_field.scss +1 -2
  245. package/styles/components/fs_map.scss +57 -17
  246. package/styles/components/fs_meta_field.scss +3 -5
  247. package/styles/components/fs_password_field.scss +4 -2
  248. package/styles/components/fs_progress_bar.scss +14 -0
  249. package/styles/components/fs_radio.scss +0 -11
  250. package/styles/components/fs_rich_text_field.scss +1 -10
  251. package/styles/components/fs_select_field.scss +4 -13
  252. package/styles/components/fs_slide_group.scss +3 -1
  253. package/styles/components/fs_slider.scss +0 -40
  254. package/styles/components/fs_span.scss +17 -5
  255. package/styles/components/fs_status_rich_card.scss +6 -0
  256. package/styles/components/fs_tabs.scss +18 -37
  257. package/styles/components/fs_tag.scss +8 -22
  258. package/styles/components/fs_text_area.scss +2 -21
  259. package/styles/components/fs_tile.scss +0 -19
  260. package/styles/components/fs_window.scss +3 -1
  261. package/styles/components/fs_wrap_group.scss +3 -0
  262. package/styles/components/index.scss +2 -6
  263. package/styles/globals/index.scss +1 -5
  264. package/styles/globals/overrides.scss +26 -44
  265. package/styles/globals/scrollbars.scss +8 -0
  266. package/styles/globals/text_fonts.scss +18 -66
  267. package/styles/globals/touchscreen.scss +2 -2
  268. package/tools/alertsTools.ts +94 -18
  269. package/tools/chartsTools.ts +156 -16
  270. package/tools/index.ts +1 -0
  271. package/tools/reportsTools.ts +38 -0
  272. package/tools/timeRangeTools.ts +99 -40
  273. package/utils/badge.ts +9 -5
  274. package/utils/index.ts +2 -0
  275. package/utils/leafletMarkers.ts +4 -4
  276. package/utils/operations.ts +108 -0
  277. package/utils/picker.ts +40 -0
  278. package/utils/sort.ts +2 -2
  279. package/utils/time.ts +13 -13
  280. package/components/fields/FSMagicConfigField.vue +0 -163
  281. package/components/fields/FSMagicField.vue +0 -193
  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/composables/useMagicFieldProvider.ts +0 -23
  288. package/models/magicFields.ts +0 -10
  289. package/styles/components/fs_data_iterator_item.scss +0 -33
  290. package/styles/components/fs_icon_field.scss +0 -12
  291. package/styles/components/fs_search_field.scss +0 -3
  292. package/styles/components/fs_tag_field.scss +0 -8
  293. package/styles/components/fs_time_field.scss +0 -12
  294. package/styles/components/fs_timeslot_field.scss +0 -12
  295. package/styles/globals/breakpoints.scss +0 -20
  296. package/styles/globals/fixes.scss +0 -5
@@ -6,7 +6,7 @@
6
6
  :color="$props.color"
7
7
  :hideHeader="$props.hideHeader"
8
8
  :required="$props.required"
9
- :editable="$props.editable"
9
+ :disabled="$props.disabled"
10
10
  :readonly="true"
11
11
  :rules="$props.rules"
12
12
  :messages="messages"
@@ -15,6 +15,7 @@
15
15
  :modelValue="toShortTimeFormat"
16
16
  @click="onClick"
17
17
  @update:modelValue="onClear"
18
+ v-bind="$attrs"
18
19
  >
19
20
  <template
20
21
  #prepend-inner
@@ -25,7 +26,7 @@
25
26
  <FSButton
26
27
  variant="icon"
27
28
  icon="mdi-calendar"
28
- :editable="$props.editable"
29
+ :disabled="$props.disabled"
29
30
  :color="ColorEnum.Dark"
30
31
  />
31
32
  </slot>
@@ -40,66 +41,34 @@
40
41
  />
41
42
  </template>
42
43
  </FSTextField>
43
- <FSDialogSubmit
44
+ <FSDateTimeRangeDialog
44
45
  :title="$props.label"
45
46
  :submitButtonColor="$props.color"
46
- @click:submitButton="onSubmit"
47
- v-model="dialog"
48
- >
49
- <template
50
- #body
51
- >
52
- <FSCol>
53
- <FSCalendarTwin
54
- :color="$props.color"
55
- v-model="innerDateRange"
56
- />
57
- <FSRow>
58
- <FSCol>
59
- <FSClock
60
- :color="$props.color"
61
- :date="innerDateLeft"
62
- v-model="innerTimeLeft"
63
- />
64
- </FSCol>
65
- <FSCol>
66
- <FSClock
67
- :color="$props.color"
68
- :date="innerDateRight"
69
- v-model="innerTimeRight"
70
- />
71
- </FSCol>
72
- </FSRow>
73
- </FSCol>
74
- </template>
75
- </FSDialogSubmit>
47
+ :dialog="dialog"
48
+ :modelValue="$props.modelValue"
49
+ :color="$props.color"
50
+ @cancel="dialog = false"
51
+ @update:modelValue="onSubmit($event)"
52
+ />
76
53
  </template>
77
54
 
78
55
  <script lang="ts">
79
- import { computed, defineComponent, type PropType, ref, watch } from "vue";
56
+ import { computed, defineComponent, type PropType, ref } from "vue";
80
57
 
81
58
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
82
- import { useAppTimeZone, useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
59
+ import { useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
83
60
  import { useRules } from "@dative-gpi/foundation-shared-components/composables";
84
61
 
85
- import FSDialogSubmit from "../FSDialogSubmit.vue";
86
- import FSCalendarTwin from "../FSCalendarTwin.vue";
62
+ import FSDateTimeRangeDialog from "./FSDateTimeRangeDialog.vue";
87
63
  import FSTextField from "./FSTextField.vue";
88
64
  import FSButton from "../FSButton.vue";
89
- import FSClock from "../FSClock.vue";
90
- import FSCol from "../FSCol.vue";
91
- import FSRow from "../FSRow.vue";
92
65
 
93
66
  export default defineComponent({
94
67
  name: "FSDateTimeRangeField",
95
68
  components: {
96
- FSDialogSubmit,
97
- FSCalendarTwin,
69
+ FSDateTimeRangeDialog,
98
70
  FSTextField,
99
- FSButton,
100
- FSClock,
101
- FSCol,
102
- FSRow
71
+ FSButton
103
72
  },
104
73
  props: {
105
74
  label: {
@@ -137,24 +106,19 @@ export default defineComponent({
137
106
  required: false,
138
107
  default: () => []
139
108
  },
140
- editable: {
109
+ disabled: {
141
110
  type: Boolean,
142
111
  required: false,
143
- default: true
112
+ default: false
144
113
  }
145
114
  },
146
115
  emits: ["update:modelValue"],
147
116
  setup(props, { emit }) {
148
- const { getUserOffset } = useAppTimeZone();
149
117
  const { epochToShortTimeFormat } = useDateFormat();
150
118
  const { validateOn, getMessages } = useRules();
151
119
 
152
120
  const dialog = ref(false);
153
121
 
154
- const innerDateRange = ref<number[] | null>(null);
155
- const innerTimeRight = ref(0);
156
- const innerTimeLeft = ref(0);
157
-
158
122
  const toShortTimeFormat = computed((): string => {
159
123
  if (!props.modelValue || !Array.isArray(props.modelValue) || !props.modelValue.length) {
160
124
  return "";
@@ -162,88 +126,32 @@ export default defineComponent({
162
126
  return props.modelValue.map((epoch) => epochToShortTimeFormat(epoch)).join(" - ");
163
127
  });
164
128
 
165
- const innerDateLeft = computed((): number | null => {
166
- if (innerDateRange.value && Array.isArray(innerDateRange.value) && innerDateRange.value.length) {
167
- return innerDateRange.value[0];
168
- }
169
- return null;
170
- });
171
-
172
- const innerDateRight= computed((): number | null => {
173
- if (innerDateRange.value && Array.isArray(innerDateRange.value) && innerDateRange.value.length > 1) {
174
- return innerDateRange.value[1];
175
- }
176
- return null;
177
- });
178
-
179
129
  const messages = computed((): string[] => getMessages(props.modelValue, props.rules, true));
180
130
 
181
131
  const onClick = (): void => {
182
- if (props.editable) {
132
+ if (!props.disabled) {
183
133
  dialog.value = true;
184
134
  }
185
135
  };
186
136
 
187
- const onClear = (): void => {
188
- emit("update:modelValue", null);
189
- innerTimeLeft.value = 0;
190
- innerTimeRight.value = 0;
191
- innerDateRange.value = null;
192
- };
193
-
194
- const onSubmit = (): void => {
195
- if (innerDateRange.value && Array.isArray(innerDateRange.value) && innerDateRange.value.length > 1) {
196
- emit("update:modelValue", [innerDateRange.value[0] + innerTimeLeft.value, innerDateRange.value[1] + innerTimeRight.value]);
197
- }
137
+ const onSubmit = (value: number[]): void => {
138
+ emit("update:modelValue", value);
198
139
  dialog.value = false;
199
140
  };
200
141
 
201
- const reset = (): void => {
202
- if (props.modelValue && Array.isArray(props.modelValue)) {
203
- // FSClock just gives two numbers without consideration for the time zone
204
- // We must adjust the time to the user's time zone
205
- switch (props.modelValue.length) {
206
- case 0: {
207
- break;
208
- }
209
- case 1: {
210
- innerTimeLeft.value = Math.floor((props.modelValue[0] + getUserOffset()) % (24 * 60 * 60 * 1000));
211
- innerDateRange.value = [props.modelValue[0] - innerTimeLeft.value];
212
- break;
213
- }
214
- default: {
215
- innerTimeLeft.value = Math.floor((props.modelValue[0] + getUserOffset()) % (24 * 60 * 60 * 1000));
216
- innerTimeRight.value = Math.floor((props.modelValue[1] + getUserOffset()) % (24 * 60 * 60 * 1000));
217
- innerDateRange.value = [props.modelValue[0] - innerTimeLeft.value, props.modelValue[1] - innerTimeRight.value];
218
- break;
219
- }
220
- }
221
- }
222
- else {
223
- innerDateRange.value = null;
224
- innerTimeLeft.value = 0;
225
- innerTimeRight.value = 0;
226
- }
142
+ const onClear = (): void => {
143
+ emit("update:modelValue", null);
227
144
  };
228
145
 
229
- watch(() => props.modelValue, () => {
230
- reset();
231
- }, { immediate: true });
232
-
233
146
  return {
234
147
  toShortTimeFormat,
235
- innerDateLeft,
236
- innerTimeLeft,
237
- innerDateRight,
238
- innerTimeRight,
239
- innerDateRange,
240
148
  validateOn,
241
149
  ColorEnum,
242
150
  messages,
243
151
  dialog,
244
152
  onSubmit,
245
153
  onClear,
246
- onClick
154
+ onClick,
247
155
  };
248
156
  }
249
157
  });
@@ -3,7 +3,7 @@
3
3
  :description="$props.description"
4
4
  :hideHeader="$props.hideHeader"
5
5
  :required="$props.required"
6
- :editable="$props.editable"
6
+ :disabled="$props.disabled"
7
7
  :label="$props.label"
8
8
  :messages="messages"
9
9
  >
@@ -14,18 +14,20 @@
14
14
  :wrap="false"
15
15
  >
16
16
  <FSSelectField
17
+ :disabled="$props.disabled"
18
+ :items="actualEntityTypes"
17
19
  :hideHeader="true"
20
+ :clearable="false"
18
21
  :modelValue="$props.entityType"
19
22
  @update:modelValue="$emit('update:entityType', $event)"
20
- :items="actualEntityTypes"
21
- :clearable="false"
22
23
  />
23
24
  <template
24
25
  v-if="itemsCount > 0"
25
26
  >
26
27
  <FSButton
27
- :label="$tr('ui.entity-field.edit', 'Edit')"
28
28
  icon="mdi-pencil"
29
+ :label="$tr('ui.common.edit', 'Edit')"
30
+ :disabled="$props.disabled"
29
31
  @click="$emit('click:select')"
30
32
  />
31
33
  </template>
@@ -33,8 +35,9 @@
33
35
  v-else
34
36
  >
35
37
  <FSButton
36
- :label="$tr('ui.entity-field.select', 'Select')"
37
38
  icon="mdi-plus-circle-multiple-outline"
39
+ :label="$tr('ui.common.select', 'Select')"
40
+ :disabled="$props.disabled"
38
41
  @click="$emit('click:select')"
39
42
  />
40
43
  </template>
@@ -60,7 +63,7 @@
60
63
  <FSSpan
61
64
  font="text-overline"
62
65
  >
63
- {{ $tr('ui.entity-field.selected', '{0} selected(s)', itemsCount) }}
66
+ {{ $tr('entity-field.selected', '{0} selected(s)', itemsCount) }}
64
67
  </FSSpan>
65
68
  </FSRow>
66
69
  </FSColor>
@@ -84,7 +87,7 @@
84
87
  <FSSpan
85
88
  font="text-overline"
86
89
  >
87
- {{ $tr('ui.entity-field.no-entity-selected', 'No entity selected') }}
90
+ {{ $tr('entity-field.no-entity-selected', 'No entity selected') }}
88
91
  </FSSpan>
89
92
  </FSRow>
90
93
  </FSColor>
@@ -167,10 +170,10 @@ export default defineComponent({
167
170
  required: false,
168
171
  default: null
169
172
  },
170
- editable: {
173
+ disabled: {
171
174
  type: Boolean,
172
175
  required: false,
173
- default: true
176
+ default: false
174
177
  },
175
178
  entityType: {
176
179
  type: Number as PropType<EntityType>,
@@ -205,31 +208,31 @@ export default defineComponent({
205
208
  const items = [
206
209
  {
207
210
  id: EntityType.Model,
208
- label: $tr("ui.entity-type.models", "Models")
211
+ label: $tr("ui.common.models", "Model(s)")
209
212
  },
210
213
  {
211
214
  id: EntityType.Group,
212
- label: $tr("ui.entity-type.groups", "Groups")
215
+ label: $tr("ui.common.groups", "Groups")
213
216
  },
214
217
  {
215
218
  id: EntityType.Location,
216
- label: $tr("ui.entity-type.locations", "Locations")
219
+ label: $tr("ui.common.locations", "Locations")
217
220
  },
218
221
  {
219
222
  id: EntityType.Device,
220
- label: $tr("ui.entity-type.devices", "Devices")
223
+ label: $tr("ui.common.devices", "Devices")
221
224
  },
222
225
  {
223
226
  id: EntityType.User,
224
- label: $tr("ui.entity-type.users", "Users")
227
+ label: $tr("ui.common.users", "Users")
225
228
  },
226
229
  {
227
230
  id: EntityType.Dashboard,
228
- label: $tr("ui.entity-type.dashboards", "Dashboards")
231
+ label: $tr("ui.common.dashboards", "Dashboards")
229
232
  },
230
233
  {
231
234
  id: EntityType.Folder,
232
- label: $tr("ui.entity-type.folders", "Folders")
235
+ label: $tr("ui.common.folders", "Folders")
233
236
  }
234
237
  ];
235
238
 
@@ -6,7 +6,7 @@
6
6
  :label="$props.label"
7
7
  :description="$props.description"
8
8
  :required="$props.required"
9
- :editable="$props.editable"
9
+ :disabled="$props.disabled"
10
10
  v-bind="$attrs"
11
11
  >
12
12
  <FSRow>
@@ -15,14 +15,14 @@
15
15
  :allowOpacity="$props.allowOpacity"
16
16
  :modelValue="$props.modelValue[colorIndex - 1]"
17
17
  :required="$props.required"
18
- :editable="$props.editable"
18
+ :disabled="$props.disabled"
19
19
  :key="colorIndex"
20
20
  @update:modelValue="$emit('update:modelValue', $props.modelValue.map((color, i) => colorIndex === i + 1 ? $event : color))"
21
21
  />
22
22
  </FSRow>
23
23
  <FSSelectField
24
24
  class="fs-gradient-field-select"
25
- :editable="$props.editable"
25
+ :disabled="$props.disabled"
26
26
  :clearable="false"
27
27
  :items="items"
28
28
  modelValue="custom"
@@ -92,10 +92,10 @@ export default defineComponent({
92
92
  required: false,
93
93
  default: false
94
94
  },
95
- editable: {
95
+ disabled: {
96
96
  type: Boolean,
97
97
  required: false,
98
- default: true
98
+ default: false
99
99
  },
100
100
  allowOpacity: {
101
101
  type: Boolean,
@@ -1,15 +1,18 @@
1
1
  <template>
2
- <FSCol>
2
+ <FSCol
3
+ :maxWidth="$props.maxWidth"
4
+ >
3
5
  <FSTextField
4
6
  :label="$props.label"
5
7
  :description="$props.description"
6
8
  :hideHeader="$props.hideHeader"
7
9
  :required="$props.required"
8
- :editable="$props.editable"
10
+ :disabled="$props.disabled"
9
11
  :rules="$props.rules"
10
12
  :messages="messages"
11
13
  :validateOn="validateOn"
12
14
  :validationValue="$props.modelValue"
15
+ :maxWidth="null"
13
16
  v-model="innerValue"
14
17
  v-bind="$attrs"
15
18
  >
@@ -28,14 +31,13 @@
28
31
  </template>
29
32
  </FSTextField>
30
33
  <FSToggleSet
31
- class="fs-icon-field-set"
32
34
  ref="toggleSetRef"
33
35
  variant="slide"
34
36
  :buttonColor="$props.buttonColor"
35
37
  :activeColor="$props.activeColor"
36
38
  :modelValue="$props.modelValue"
37
39
  :required="$props.required"
38
- :editable="$props.editable"
40
+ :disabled="$props.disabled"
39
41
  :values="icons"
40
42
  @update:modelValue="$emit('update:modelValue', $event)"
41
43
  />
@@ -43,7 +45,7 @@
43
45
  </template>
44
46
 
45
47
  <script lang="ts">
46
- import type { PropType} from "vue";
48
+ import type { PropType, StyleValue } from "vue";
47
49
  import { computed, defineComponent, ref, watch } from "vue";
48
50
 
49
51
  import { Icons, sortByLevenshteinDistance } from "@dative-gpi/foundation-shared-components/utils";
@@ -120,11 +122,16 @@ export default defineComponent({
120
122
  required: false,
121
123
  default: () => []
122
124
  },
123
- editable: {
125
+ disabled: {
124
126
  type: Boolean,
125
127
  required: false,
126
- default: true
127
- }
128
+ default: false
129
+ },
130
+ maxWidth: {
131
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
132
+ required: false,
133
+ default: "600px"
134
+ },
128
135
  },
129
136
  emits: ["update:modelValue"],
130
137
  setup(props) {
@@ -139,7 +146,7 @@ export default defineComponent({
139
146
  const innerValue = ref<string | null>(null);
140
147
 
141
148
  const style = computed((): StyleValue => {
142
- if (!props.editable) {
149
+ if (props.disabled) {
143
150
  return {
144
151
  "--fs-icon-field-color": lights.dark
145
152
  };
@@ -0,0 +1,187 @@
1
+ <template>
2
+ <FSCol>
3
+ <FSMap
4
+ :lockZoomOnFlyTo="true"
5
+ v-model:center="center"
6
+ :enableScrollWheelZoom="true"
7
+ :showMyLocation="true"
8
+ :zoom="5"
9
+ v-model:currentLayer="mapLayer"
10
+ @click:latlng="(latlng: any) => onNewLatLng(latlng.lat, latlng.lng, false)"
11
+ v-bind="$attrs"
12
+ >
13
+ <FSMapMarker
14
+ v-if="actualLatitude && actualLongitude"
15
+ :label="$props.label"
16
+ :icon="$props.icon"
17
+ :latlng="{ lat: actualLatitude, lng: actualLongitude }"
18
+ :selected="true"
19
+ />
20
+ </FSMap>
21
+ <FSCol>
22
+ <FSAutoCompleteAddress
23
+ :maxWidth="null"
24
+ :modelValue="$props.modelValue"
25
+ @update:modelValue="$emit('update:modelValue', $event)"
26
+ />
27
+ <FSRow>
28
+ <FSNumberField
29
+ :label="$tr('ui.location.latitude', 'Latitude')"
30
+ :modelValue="actualLatitude"
31
+ :clearable="false"
32
+ :rules="[NumberRules.max(90), NumberRules.min(-90), NumberRules.required()]"
33
+ @update:modelValue="onNewLatLng($event, actualLongitude ?? 0, true)"
34
+ />
35
+ <FSNumberField
36
+ :label="$tr('ui.location.longitude', 'Longitude')"
37
+ :modelValue="actualLongitude"
38
+ :clearable="false"
39
+ :rules="[NumberRules.max(180), NumberRules.min(-180), NumberRules.required()]"
40
+ @update:modelValue="onNewLatLng(actualLatitude ?? 0, $event, true)"
41
+ />
42
+ </FSRow>
43
+ </FSCol>
44
+ </FSCol>
45
+ </template>
46
+
47
+ <script lang="ts">
48
+ import { computed, defineComponent, ref, watch, type PropType } from "vue";
49
+
50
+ import type { Address } from "@dative-gpi/foundation-shared-domain";
51
+ import { useAddress } from "@dative-gpi/foundation-shared-components/composables";
52
+ import { MapLayers, NumberRules } from '@dative-gpi/foundation-shared-components/models';
53
+
54
+ import FSAutoCompleteAddress from '@dative-gpi/foundation-shared-components/components/autocompletes/FSAutoCompleteAddress.vue';
55
+ import FSNumberField from "@dative-gpi/foundation-shared-components/components/fields/FSNumberField.vue"
56
+ import FSMapMarker from '@dative-gpi/foundation-shared-components/components/map/FSMapMarker.vue';
57
+ import FSMap from "@dative-gpi/foundation-shared-components/components/map/FSMap.vue";
58
+ import FSRow from '@dative-gpi/foundation-shared-components/components/FSRow.vue';
59
+ import FSCol from '@dative-gpi/foundation-shared-components/components/FSCol.vue';
60
+
61
+
62
+ export function debounceAsync<T, U extends any[]>(
63
+ callback: (...args: U) => Promise<T>,
64
+ wait: number,
65
+ ): (...args: U) => Promise<T> {
66
+ let timeoutId: number | null = null;
67
+ let rejectPromise: (((reason?: any) => void) | null) = null;
68
+
69
+ return (...args: U) => {
70
+ if (timeoutId) {
71
+ clearTimeout(timeoutId);
72
+ timeoutId = null;
73
+ }
74
+ if (rejectPromise) {
75
+ rejectPromise("debounced");
76
+ rejectPromise = null;
77
+ }
78
+
79
+ return new Promise<T>((resolve) => {
80
+ const timeoutPromise = new Promise<void>((resolve, reject) => {
81
+ timeoutId = setTimeout(resolve, wait);
82
+ rejectPromise = reject;
83
+ });
84
+ timeoutPromise.then(async () => {
85
+ resolve(await callback(...args));
86
+ });
87
+ });
88
+ };
89
+ }
90
+
91
+ export default defineComponent({
92
+ name: "FSMapAddressField",
93
+ components: {
94
+ FSAutoCompleteAddress,
95
+ FSNumberField,
96
+ FSMapMarker,
97
+ FSMap,
98
+ FSRow,
99
+ FSCol
100
+ },
101
+ emits: ["update:modelValue"],
102
+ props: {
103
+ label: {
104
+ type: String,
105
+ required: true,
106
+ },
107
+ icon: {
108
+ type: String,
109
+ required: true,
110
+ },
111
+ modelValue: {
112
+ type: Object as PropType<Address | null>,
113
+ required: false,
114
+ }
115
+ },
116
+ setup(props, { emit }) {
117
+ const { reverseSearch } = useAddress();
118
+
119
+ const loading = ref(false);
120
+ const actualLatitude = ref<number | null>(null);
121
+ const actualLongitude = ref<number | null>(null);
122
+ const mapLayer = ref(MapLayers.Map);
123
+
124
+ const center = computed(() => {
125
+ return props.modelValue ? [props.modelValue.latitude, props.modelValue.longitude] : null;
126
+ });
127
+
128
+ const reverseSearchDebounced = debounceAsync(reverseSearch, 500);
129
+
130
+ const onNewLatLng = async (lat: number|string, lng: number|string, debounced: boolean) => {
131
+ if(typeof lat === 'string') {
132
+ lat = parseFloat(lat);
133
+ if(isNaN(lat)) {
134
+ return;
135
+ }
136
+ }
137
+
138
+ if(typeof lng === 'string') {
139
+ lng = parseFloat(lng);
140
+ if(isNaN(lng)) {
141
+ return;
142
+ }
143
+ }
144
+
145
+ actualLatitude.value = lat;
146
+ actualLongitude.value = lng;
147
+
148
+ let fullAddress;
149
+ loading.value = true;
150
+ if(debounced) {
151
+ try {
152
+ fullAddress = await reverseSearchDebounced(lat, lng);
153
+ } catch {
154
+ return;
155
+ }
156
+ } else {
157
+ fullAddress = await reverseSearch(lat, lng);
158
+ }
159
+
160
+ emit("update:modelValue", {
161
+ ...fullAddress,
162
+ latitude: actualLatitude.value,
163
+ longitude: actualLongitude.value,
164
+ });
165
+ loading.value = false;
166
+ }
167
+
168
+ watch(() => props.modelValue, (newValue) => {
169
+ if(newValue) {
170
+ actualLatitude.value = newValue.latitude;
171
+ actualLongitude.value = newValue.longitude;
172
+ }
173
+ }, { immediate: true });
174
+
175
+ return {
176
+ center,
177
+ mapLayer,
178
+ NumberRules,
179
+ actualLatitude,
180
+ actualLongitude,
181
+ onNewLatLng
182
+ };
183
+ }
184
+ });
185
+
186
+
187
+ </script>
@@ -2,7 +2,7 @@
2
2
  <FSTextField
3
3
  class="fs-number-field"
4
4
  minWidth="80px"
5
- :editable="$props.editable"
5
+ :disabled="$props.disabled"
6
6
  :modelValue="$props.modelValue?.toString()"
7
7
  @update:modelValue="onUpdate"
8
8
  v-bind="$attrs"
@@ -35,18 +35,22 @@ export default defineComponent({
35
35
  required: false,
36
36
  default: null
37
37
  },
38
- editable: {
38
+ disabled: {
39
39
  type: Boolean,
40
40
  required: false,
41
- default: true
41
+ default: false
42
42
  }
43
43
  },
44
44
  emits: ["update:modelValue"],
45
45
  setup(_, { emit }) {
46
- const onUpdate = (value: string) => {
46
+ const onUpdate = (value: string | null | undefined) => {
47
47
  if (value === "-") {
48
48
  return;
49
49
  }
50
+ if(value === null || value === undefined) {
51
+ emit("update:modelValue", null);
52
+ return;
53
+ }
50
54
  const match = /[-]?([0-9 ]*[,.]?)?[0-9]*/.exec(value);
51
55
  if (match != null && !isNaN(parseFloat(match[0].replace(",", ".").replace(" ", "")))) {
52
56
  emit("update:modelValue", parseFloat(match[0].replace(",", ".").replace(" ", "")));