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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/components/FSBreadcrumbs.vue +21 -12
  2. package/components/FSButton.vue +10 -10
  3. package/components/FSCalendar.vue +52 -14
  4. package/components/FSCalendarTwin.vue +96 -40
  5. package/components/FSCard.vue +28 -7
  6. package/components/FSCardPlaceholder.vue +8 -5
  7. package/components/FSChip.vue +12 -2
  8. package/components/FSClickable.vue +12 -13
  9. package/components/FSClock.vue +16 -7
  10. package/components/FSColorIcon.vue +23 -5
  11. package/components/FSDialog.vue +2 -1
  12. package/components/FSDialogContent.vue +12 -11
  13. package/components/FSDialogForm.vue +22 -2
  14. package/components/FSDialogFormBody.vue +47 -28
  15. package/components/FSDialogMenu.vue +17 -8
  16. package/components/FSDialogMultiFormBody.vue +77 -54
  17. package/components/FSDialogRemove.vue +8 -8
  18. package/components/FSDialogSubmit.vue +17 -8
  19. package/components/FSEditImage.vue +1 -1
  20. package/components/FSEditImageUI.vue +20 -10
  21. package/components/FSFadeOut.vue +53 -21
  22. package/components/FSForm.vue +10 -8
  23. package/components/FSGrid.vue +1 -1
  24. package/components/FSIcon.vue +2 -1
  25. package/components/FSIconCard.vue +47 -7
  26. package/components/FSImage.vue +12 -4
  27. package/components/FSImageUI.vue +8 -15
  28. package/components/FSInstantPicker.vue +266 -0
  29. package/components/FSLink.vue +25 -9
  30. package/components/FSLoader.vue +28 -11
  31. package/components/FSOptionGroup.vue +51 -3
  32. package/components/FSPlayButtons.vue +72 -0
  33. package/components/FSProgressBar.vue +94 -0
  34. package/components/FSRouterLink.vue +42 -0
  35. package/components/FSSlideGroup.vue +19 -5
  36. package/components/FSSpan.vue +17 -7
  37. package/components/FSSwitch.vue +57 -27
  38. package/components/FSTab.vue +15 -13
  39. package/components/FSTabs.vue +32 -7
  40. package/components/FSTag.vue +14 -3
  41. package/components/FSTagGroup.vue +1 -1
  42. package/components/FSText.vue +11 -7
  43. package/components/FSWindow.vue +128 -4
  44. package/components/FSWrapGroup.vue +13 -1
  45. package/components/agenda/FSAgenda.vue +223 -0
  46. package/components/agenda/FSAgendaDialogCalendar.vue +76 -0
  47. package/components/agenda/FSAgendaHeader.vue +215 -0
  48. package/components/agenda/FSAgendaHorizontalEvent.vue +174 -0
  49. package/components/agenda/FSAgendaHorizontalTimeLineMarker.vue +46 -0
  50. package/components/agenda/FSAgendaHoursCol.vue +103 -0
  51. package/components/agenda/FSAgendaHoursRow.vue +164 -0
  52. package/components/agenda/FSAgendaVerticalEvent.vue +160 -0
  53. package/components/agenda/FSAgendaVerticalTimeLineMarker.vue +46 -0
  54. package/components/agenda/FSDayAgenda.vue +199 -0
  55. package/components/agenda/FSMonthAgenda.vue +252 -0
  56. package/components/agenda/FSSelectAgendaMode.vue +54 -0
  57. package/components/agenda/FSWeekAgenda.vue +323 -0
  58. package/components/autocompletes/FSAutoCompleteAddress.vue +22 -20
  59. package/components/autocompletes/FSAutocompleteLanguage.vue +7 -1
  60. package/components/autocompletes/FSAutocompleteTimeZone.vue +7 -1
  61. package/components/buttons/FSButtonAdd.vue +1 -1
  62. package/components/buttons/FSButtonAddLabel.vue +1 -1
  63. package/components/buttons/FSButtonCancel.vue +1 -1
  64. package/components/buttons/FSButtonCancelLabel.vue +1 -1
  65. package/components/buttons/FSButtonCopy.vue +1 -1
  66. package/components/buttons/FSButtonCopyLabel.vue +1 -1
  67. package/components/buttons/FSButtonDragIcon.vue +27 -0
  68. package/components/buttons/FSButtonDuplicate.vue +1 -1
  69. package/components/buttons/FSButtonDuplicateLabel.vue +1 -1
  70. package/components/buttons/FSButtonEdit.vue +1 -1
  71. package/components/buttons/FSButtonEditLabel.vue +1 -1
  72. package/components/buttons/FSButtonFile.vue +1 -1
  73. package/components/buttons/FSButtonFileLabel.vue +1 -1
  74. package/components/buttons/FSButtonNext.vue +1 -1
  75. package/components/buttons/FSButtonNextLabel.vue +1 -1
  76. package/components/buttons/FSButtonPrevious.vue +1 -1
  77. package/components/buttons/FSButtonPreviousLabel.vue +1 -1
  78. package/components/buttons/FSButtonRedo.vue +1 -1
  79. package/components/buttons/FSButtonRedoLabel.vue +1 -1
  80. package/components/buttons/FSButtonRemove.vue +1 -1
  81. package/components/buttons/FSButtonRemoveLabel.vue +1 -1
  82. package/components/buttons/FSButtonSave.vue +1 -1
  83. package/components/buttons/FSButtonSaveLabel.vue +1 -1
  84. package/components/buttons/FSButtonSearch.vue +1 -1
  85. package/components/buttons/FSButtonSearchLabel.vue +1 -1
  86. package/components/buttons/FSButtonUndo.vue +1 -1
  87. package/components/buttons/FSButtonUndoLabel.vue +1 -1
  88. package/components/buttons/FSButtonUpdate.vue +1 -1
  89. package/components/buttons/FSButtonUpdateLabel.vue +1 -1
  90. package/components/buttons/FSButtonValidate.vue +1 -1
  91. package/components/buttons/FSButtonValidateLabel.vue +1 -1
  92. package/components/calendar/FSSimpleCalendar.vue +145 -0
  93. package/components/calendar/FSSimpleCalendarHeader.vue +60 -0
  94. package/components/calendar/FSSimpleMonthSelector.vue +138 -0
  95. package/components/deviceOrganisations/FSConnectivity.vue +11 -1
  96. package/components/deviceOrganisations/FSConnectivityCard.vue +19 -47
  97. package/components/deviceOrganisations/FSStatus.vue +11 -1
  98. package/components/deviceOrganisations/FSStatusCard.vue +35 -61
  99. package/components/deviceOrganisations/FSStatusesCarousel.vue +1 -0
  100. package/components/deviceOrganisations/FSStatusesRow.vue +9 -3
  101. package/components/deviceOrganisations/FSWorstAlert.vue +30 -37
  102. package/components/deviceOrganisations/FSWorstAlertCard.vue +36 -85
  103. package/components/fields/FSAutocompleteField.vue +445 -463
  104. package/components/fields/FSAutocompleteTag.vue +1 -1
  105. package/components/fields/FSBaseField.vue +44 -27
  106. package/components/fields/FSColorField.vue +42 -39
  107. package/components/fields/FSCommentField.vue +105 -0
  108. package/components/fields/FSDateField.vue +3 -2
  109. package/components/fields/FSDateRangeField.vue +3 -2
  110. package/components/fields/FSDateTimeField.vue +4 -3
  111. package/components/fields/FSDateTimeRangeField.vue +8 -6
  112. package/components/fields/FSEntityFieldUI.vue +271 -0
  113. package/components/fields/FSGradientField.vue +27 -33
  114. package/components/fields/FSIconField.vue +0 -1
  115. package/components/fields/FSMagicConfigField.vue +10 -3
  116. package/components/fields/FSMagicField.vue +9 -4
  117. package/components/fields/FSNumberField.vue +6 -1
  118. package/components/fields/FSRichTextField.vue +102 -52
  119. package/components/fields/FSSearchField.vue +9 -115
  120. package/components/fields/FSSelectField.vue +477 -252
  121. package/components/fields/FSTagField.vue +1 -1
  122. package/components/fields/FSTermField.vue +42 -17
  123. package/components/fields/FSTextArea.vue +26 -7
  124. package/components/fields/FSTextField.vue +8 -3
  125. package/components/fields/FSTimeRangeField.vue +304 -0
  126. package/components/fields/FSTimeStepField.vue +3 -3
  127. package/components/fields/FSTranslateField.vue +4 -3
  128. package/components/fields/FSTranslateRichTextField.vue +32 -12
  129. package/components/fields/FSTranslateTextArea.vue +233 -0
  130. package/components/fields/periodicField/FSPeriodicDailyField.vue +2 -2
  131. package/components/fields/periodicField/FSPeriodicField.vue +8 -8
  132. package/components/fields/periodicField/FSPeriodicMonthlyField.vue +8 -8
  133. package/components/fields/periodicField/FSPeriodicWeeklyField.vue +23 -13
  134. package/components/fields/periodicField/FSPeriodicYearlyField.vue +6 -6
  135. package/components/lists/FSDataTableUI.vue +173 -103
  136. package/components/lists/FSDraggable.vue +2 -2
  137. package/components/lists/FSFilterButton.vue +7 -11
  138. package/components/lists/FSHeaderButton.vue +4 -4
  139. package/components/lists/FSHiddenButton.vue +3 -5
  140. package/components/lists/FSLoadDataTable.vue +10 -7
  141. package/components/lists/FSSimpleList.vue +234 -0
  142. package/components/lists/FSSimpleListItem.vue +132 -0
  143. package/components/map/FSMap.vue +83 -33
  144. package/components/map/FSMapFeatureGroup.vue +2 -2
  145. package/components/map/FSMapLayerButton.vue +3 -3
  146. package/components/map/FSMapMarker.vue +11 -7
  147. package/components/map/FSMapMarkerClusterGroup.vue +8 -3
  148. package/components/map/FSMapOverlay.vue +37 -20
  149. package/components/map/FSMapPolygon.vue +5 -5
  150. package/components/map/FSMapTileLayer.vue +2 -2
  151. package/components/map/keys.ts +3 -3
  152. package/components/selects/FSSelectAutoRefresh.vue +9 -9
  153. package/components/selects/FSSelectDashboardVariableType.vue +5 -4
  154. package/components/selects/FSSelectDateSetting.vue +3 -2
  155. package/components/selects/FSSelectDays.vue +9 -9
  156. package/components/selects/FSSelectListMode.vue +51 -0
  157. package/components/selects/FSSelectMonths.vue +14 -14
  158. package/components/selects/chartSelectors/FSAggregationSelector.vue +52 -0
  159. package/components/selects/chartSelectors/FSAxisTypeSelector.vue +49 -0
  160. package/components/selects/chartSelectors/FSDisplayAsSelector.vue +53 -0
  161. package/components/selects/chartSelectors/FSFilterTypeSelector.vue +54 -0
  162. package/components/selects/chartSelectors/FSHeatmapRuleSelector.vue +54 -0
  163. package/components/selects/chartSelectors/FSOperationOnSelector.vue +53 -0
  164. package/components/selects/chartSelectors/FSPlanningTypeSelector.vue +53 -0
  165. package/components/selects/chartSelectors/FSPlotPerSelector.vue +52 -0
  166. package/components/selects/chartSelectors/FSSelectEntityType.vue +59 -0
  167. package/components/selects/chartSelectors/FSSerieTypeSelector.vue +53 -0
  168. package/components/tiles/FSAlertTileUI.vue +90 -0
  169. package/components/tiles/FSChartTileUI.vue +111 -0
  170. package/components/tiles/FSCommentTileUI.vue +174 -0
  171. package/components/tiles/FSDeviceOrganisationTileUI.vue +6 -0
  172. package/components/tiles/FSGroupTileUI.vue +2 -2
  173. package/components/tiles/FSLoadTile.vue +2 -0
  174. package/components/tiles/FSLocationTileUI.vue +192 -0
  175. package/components/tiles/FSModelTileUI.vue +18 -0
  176. package/components/tiles/FSSimpleTileUI.vue +9 -4
  177. package/components/tiles/FSTile.vue +93 -74
  178. package/components/tiles/FSUserOrganisationTileUI.vue +1 -1
  179. package/components/toggleSets/FSToggleSetPosition.vue +2 -2
  180. package/components/views/FSBaseView.vue +64 -0
  181. package/components/views/FSEntityView.vue +12 -140
  182. package/components/views/FSSimpleView.vue +29 -0
  183. package/components/views/desktop/FSBaseDefaultDesktopView.vue +135 -0
  184. package/components/views/desktop/FSBaseDesktopView.vue +53 -0
  185. package/components/views/desktop/FSBaseEntityDesktopView.vue +209 -0
  186. package/components/views/mobile/FSBaseDefaultMobileView.vue +133 -0
  187. package/components/views/mobile/FSBaseEntityMobileView.vue +199 -0
  188. package/components/views/mobile/FSBaseMobileView.vue +53 -0
  189. package/composables/useBreakpoints.ts +39 -3
  190. package/composables/useColors.ts +3 -2
  191. package/composables/useMagicFieldProvider.ts +1 -0
  192. package/composables/useSlots.ts +2 -1
  193. package/models/agenda.ts +9 -0
  194. package/models/deviceAlerts.ts +1 -1
  195. package/models/deviceConnectivities.ts +1 -1
  196. package/models/index.ts +1 -0
  197. package/models/magicFields.ts +1 -0
  198. package/models/map.ts +2 -2
  199. package/models/rules.ts +8 -5
  200. package/models/tables.ts +5 -2
  201. package/models/variableNode.ts +8 -5
  202. package/package.json +5 -5
  203. package/styles/components/fs_agenda.scss +36 -0
  204. package/styles/components/fs_agenda_event.scss +41 -0
  205. package/styles/components/fs_agenda_hours_col.scss +4 -0
  206. package/styles/components/fs_agenda_hours_row.scss +5 -0
  207. package/styles/components/fs_agenda_time_line_marker.scss +19 -0
  208. package/styles/components/fs_autocomplete_field.scss +0 -13
  209. package/styles/components/fs_breadcrumbs.scss +18 -36
  210. package/styles/components/fs_button.scss +7 -5
  211. package/styles/components/fs_chip.scss +8 -6
  212. package/styles/components/fs_clickable.scss +18 -23
  213. package/styles/components/fs_clock.scss +0 -10
  214. package/styles/components/fs_color_field.scss +1 -4
  215. package/styles/components/fs_data_iterator_item.scss +12 -10
  216. package/styles/components/fs_data_table.scss +6 -9
  217. package/styles/components/fs_dialog.scss +7 -17
  218. package/styles/components/fs_dialog_menu.scss +4 -2
  219. package/styles/components/fs_edit_image.scss +8 -0
  220. package/styles/components/fs_fade_out.scss +10 -2
  221. package/styles/components/fs_filter_button.scss +1 -6
  222. package/styles/components/fs_gradient_field.scss +11 -11
  223. package/styles/components/fs_hidden_button.scss +2 -7
  224. package/styles/components/fs_image_card.scss +6 -4
  225. package/styles/components/fs_magic_config_field.scss +1 -2
  226. package/styles/components/fs_map.scss +11 -7
  227. package/styles/components/fs_meta_field.scss +3 -5
  228. package/styles/components/fs_option_group.scss +15 -5
  229. package/styles/components/fs_password_field.scss +4 -2
  230. package/styles/components/fs_progress_bar.scss +14 -0
  231. package/styles/components/fs_radio.scss +0 -11
  232. package/styles/components/fs_rich_text_field.scss +1 -9
  233. package/styles/components/fs_select_date_settings.scss +3 -0
  234. package/styles/components/fs_select_field.scss +4 -13
  235. package/styles/components/fs_slide_group.scss +7 -0
  236. package/styles/components/fs_span.scss +13 -4
  237. package/styles/components/fs_switch.scss +1 -0
  238. package/styles/components/fs_tabs.scss +19 -33
  239. package/styles/components/fs_tag.scss +8 -22
  240. package/styles/components/fs_text_area.scss +13 -17
  241. package/styles/components/fs_tile.scss +21 -15
  242. package/styles/components/fs_window.scss +7 -0
  243. package/styles/components/fs_wrap_group.scss +7 -0
  244. package/styles/components/index.scss +6 -4
  245. package/styles/globals/index.scss +1 -5
  246. package/styles/globals/overrides.scss +28 -61
  247. package/styles/globals/scrollbars.scss +10 -0
  248. package/styles/globals/text_fonts.scss +18 -66
  249. package/tools/alertsTools.ts +69 -0
  250. package/tools/chartsTools.ts +427 -0
  251. package/tools/index.ts +4 -0
  252. package/tools/reportsTools.ts +38 -0
  253. package/tools/timeRangeTools.ts +125 -0
  254. package/utils/filter.ts +18 -0
  255. package/utils/index.ts +2 -0
  256. package/utils/leafletMarkers.ts +4 -4
  257. package/utils/operations.ts +69 -0
  258. package/utils/sort.ts +2 -2
  259. package/utils/statuses.ts +1 -1
  260. package/utils/time.ts +17 -17
  261. package/components/fields/FSTimeSlotField.vue +0 -250
  262. package/components/views/FSEntityHeader.vue +0 -350
  263. package/components/views/FSListHeader.vue +0 -83
  264. package/components/views/FSListView.vue +0 -83
  265. package/components/views/FSSkeletonView.vue +0 -100
  266. package/styles/components/fs_icon_field.scss +0 -12
  267. package/styles/components/fs_tag_field.scss +0 -8
  268. package/styles/components/fs_time_field.scss +0 -12
  269. package/styles/components/fs_timeslot_field.scss +0 -12
  270. package/styles/globals/breakpoints.scss +0 -20
  271. package/styles/globals/fixes.scss +0 -5
@@ -1,489 +1,463 @@
1
1
  <template>
2
- <template
2
+ <FSCol
3
3
  v-if="$props.loading"
4
4
  >
5
- <FSCol>
6
- <FSLoader
7
- v-if="!$props.hideHeader"
8
- variant="text-overline"
9
- />
10
- <FSLoader
11
- v-if="$props.loading"
12
- width="100%"
13
- :height="['40px', '36px']"
14
- />
15
- </FSCol>
16
- </template>
17
- <template
18
- v-else
5
+ <FSLoader
6
+ v-if="!$props.hideHeader"
7
+ variant="text-overline"
8
+ />
9
+ <FSLoader
10
+ v-if="$props.loading"
11
+ width="100%"
12
+ :height="['40px', '36px']"
13
+ />
14
+ </FSCol>
15
+ <FSCol
16
+ v-else-if="isExtraSmall"
19
17
  >
20
- <template
21
- v-if="isExtraSmall"
18
+ <FSTextField
19
+ :validationValue="$props.modelValue"
20
+ :description="$props.description"
21
+ :hideHeader="$props.hideHeader"
22
+ :clearable="$props.clearable"
23
+ :editable="$props.editable"
24
+ :required="$props.required"
25
+ :label="$props.label"
26
+ :rules="$props.rules"
27
+ :messages="messages"
28
+ :readonly="true"
29
+ :modelValue="mobileValue"
30
+ @click="openMobileOverlay"
31
+ v-bind="$attrs"
22
32
  >
23
- <FSCol>
24
- <FSTextField
25
- :validationValue="$props.modelValue"
26
- :description="$props.description"
27
- :hideHeader="$props.hideHeader"
28
- :clearable="$props.clearable"
29
- :editable="$props.editable"
30
- :required="$props.required"
31
- :label="$props.label"
32
- :rules="$props.rules"
33
- :messages="messages"
34
- :readonly="true"
35
- :modelValue="mobileValue"
36
- @click="openMobileOverlay"
37
- v-bind="$attrs"
33
+ <template
34
+ v-for="(_, name) in $slots"
35
+ v-slot:[name]="slotData"
36
+ >
37
+ <slot
38
+ :name="name"
39
+ v-bind="slotData"
40
+ />
41
+ </template>
42
+ <template
43
+ #prepend-inner
44
+ >
45
+ <slot
46
+ v-if="selectedItem && showExtra"
47
+ name="item-prepend"
48
+ v-bind="{ item: selectedItem }"
49
+ />
50
+ </template>
51
+ <template
52
+ #clear
53
+ >
54
+ <FSRow
55
+ :wrap="false"
38
56
  >
39
- <template
40
- v-for="(_, name) in $slots"
41
- v-slot:[name]="slotData"
42
- >
43
- <slot
44
- :name="name"
45
- v-bind="slotData"
46
- />
47
- </template>
48
- <template
49
- #prepend-inner
50
- >
51
- <slot
52
- v-if="selectedItem"
53
- name="item-prepend"
54
- v-bind="{ item: selectedItem }"
55
- />
56
- </template>
57
- <template
58
- #clear
59
- >
60
- <FSRow
61
- :wrap="false"
62
- >
63
- <slot
64
- v-if="selectedItem"
65
- name="item-append"
66
- v-bind="{ item: selectedItem }"
67
- />
68
- <slot
69
- name="clear"
70
- >
71
- <FSButton
72
- v-if="$props.clearable && $props.editable && !!$props.modelValue"
73
- icon="mdi-close"
74
- variant="icon"
75
- :color="ColorEnum.Dark"
76
- @click="$emit('update:modelValue', null)"
77
- />
78
- </slot>
79
- </FSRow>
80
- </template>
81
- <template
82
- #append-inner
57
+ <slot
58
+ v-if="selectedItem && showExtra"
59
+ name="item-append"
60
+ v-bind="{ item: selectedItem }"
61
+ />
62
+ <slot
63
+ name="clear"
83
64
  >
84
65
  <FSButton
85
- icon="mdi-chevron-down"
66
+ v-if="$props.clearable && $props.editable && !!$props.modelValue"
67
+ icon="mdi-close"
86
68
  variant="icon"
87
- :editable="$props.editable"
88
69
  :color="ColorEnum.Dark"
89
- @click="openMobileOverlay"
70
+ @click="onClear"
90
71
  />
91
- </template>
92
- </FSTextField>
93
- <FSSlideGroup
94
- v-if="$props.multiple && Array.isArray($props.modelValue)"
72
+ </slot>
73
+ </FSRow>
74
+ </template>
75
+ <template
76
+ #append-inner
77
+ >
78
+ <FSButton
79
+ icon="mdi-chevron-down"
80
+ variant="icon"
81
+ :editable="$props.editable"
82
+ :color="ColorEnum.Dark"
83
+ @click="openMobileOverlay"
84
+ />
85
+ </template>
86
+ </FSTextField>
87
+ <FSSlideGroup
88
+ v-if="$props.multiple && Array.isArray($props.modelValue)"
89
+ >
90
+ <FSCard
91
+ v-for="(item, index) in $props.items.filter((item: any) => $props.modelValue.includes(item[$props.itemValue!]))"
92
+ variant="standard"
93
+ :height="['40px', '36px']"
94
+ :color="ColorEnum.Light"
95
+ :border="false"
96
+ :key="index"
97
+ >
98
+ <FSRow
99
+ align="center-left"
100
+ padding="0 8px"
101
+ :wrap="false"
95
102
  >
96
- <FSCard
97
- v-for="(item, index) in $props.items.filter((item: any) => $props.modelValue.includes(item[$props.itemValue!]))"
98
- variant="standard"
99
- :height="['40px', '36px']"
100
- :color="ColorEnum.Light"
101
- :border="false"
102
- :key="index"
103
+ <slot
104
+ name="item-prepend"
105
+ v-bind="{ item }"
106
+ />
107
+ <FSSpan>
108
+ {{ item[$props.itemTitle!] }}
109
+ </FSSpan>
110
+ <slot
111
+ name="item-append"
112
+ v-bind="{ item }"
113
+ />
114
+ <FSButton
115
+ icon="mdi-close"
116
+ variant="icon"
117
+ :color="ColorEnum.Dark"
118
+ @click="() => onCheckboxChange(item[$props.itemValue!])"
119
+ />
120
+ </FSRow>
121
+ </FSCard>
122
+ </FSSlideGroup>
123
+ <FSDialogMenu
124
+ padding="16px"
125
+ v-model="dialog"
126
+ >
127
+ <template
128
+ #body
129
+ >
130
+ <FSSearchField
131
+ :clearable="$props.clearable"
132
+ :hideHeader="true"
133
+ v-model="search"
134
+ />
135
+ <FSFadeOut
136
+ :maxHeight="maxHeight"
137
+ >
138
+ <FSCol
139
+ gap="12px"
103
140
  >
104
141
  <FSRow
142
+ v-for="(item, index) in searchItems"
105
143
  align="center-left"
106
- padding="0 8px"
144
+ height="36px"
107
145
  :wrap="false"
146
+ :key="index"
147
+ @click="$props.multiple ?
148
+ onCheckboxChange(item[$props.itemValue!]) :
149
+ onRadioChange(item[$props.itemValue!])
150
+ "
108
151
  >
109
- <slot
110
- name="item-prepend"
111
- v-bind="{ item }"
112
- />
113
- <FSSpan>
114
- {{ item[$props.itemTitle!] }}
115
- </FSSpan>
116
- <slot
117
- name="item-append"
118
- v-bind="{ item }"
119
- />
120
- <FSButton
121
- icon="mdi-close"
122
- variant="icon"
123
- :color="ColorEnum.Dark"
124
- @click="() => onCheckboxChange(item[$props.itemValue!])"
125
- />
126
- </FSRow>
127
- </FSCard>
128
- </FSSlideGroup>
129
- </FSCol>
130
- <FSDialogMenu
131
- v-model="dialog"
132
- >
133
- <template
134
- #body
135
- >
136
- <FSSearchField
137
- :hideHeader="true"
138
- v-model="search"
139
- />
140
- <FSFadeOut
141
- :maxHeight="maxHeight"
142
- >
143
- <FSCol
144
- gap="12px"
145
- >
146
152
  <FSRow
147
- v-for="(item, index) in searchItems"
148
- :key="index"
153
+ style="min-width: 0;"
154
+ :wrap="false"
155
+ >
156
+ <slot
157
+ name="item-prepend"
158
+ v-bind="{ item }"
159
+ />
160
+ <FSSpan
161
+ :font="selectedItems.includes(item) ? 'text-button' : 'text-body'"
162
+ >
163
+ {{ item[$props.itemTitle!] }}
164
+ </FSSpan>
165
+ </FSRow>
166
+ <FSRow
167
+ align="center-right"
168
+ width="hug"
169
+ :wrap="false"
149
170
  >
171
+ <slot
172
+ name="item-append"
173
+ v-bind="{ item }"
174
+ />
150
175
  <FSCheckbox
151
176
  v-if="$props.multiple"
152
- :label="item[$props.itemTitle!]"
153
177
  :editable="$props.editable"
154
178
  :modelValue="$props.modelValue?.includes(item[$props.itemValue!])"
155
- @update:modelValue="() => onCheckboxChange(item[$props.itemValue!])"
156
- >
157
- <template
158
- #label="{ font }"
159
- >
160
- <FSRow
161
- align="center-left"
162
- :wrap="false"
163
- >
164
- <slot
165
- name="item-prepend"
166
- v-bind="{ item }"
167
- />
168
- <FSSpan
169
- :font="font"
170
- >
171
- {{ item[$props.itemTitle!] }}
172
- </FSSpan>
173
- </FSRow>
174
- </template>
175
- </FSCheckbox>
179
+ @update:modelValue="onCheckboxChange(item[$props.itemValue!])"
180
+ />
176
181
  <FSRadio
177
182
  v-else
178
183
  :selected="$props.modelValue === item[$props.itemValue!]"
179
- :label="item[$props.itemTitle!]"
180
184
  :editable="$props.editable"
181
185
  :item="item"
182
186
  :modelValue="item[$props.itemValue!]"
183
- @update:modelValue="() => onRadioChange(item[$props.itemValue!])"
184
- >
185
- <template
186
- #label="{ font }"
187
- >
188
- <FSRow
189
- align="center-left"
190
- :wrap="false"
191
- >
192
- <slot
193
- name="item-prepend"
194
- v-bind="{ item }"
195
- />
196
- <FSSpan
197
- :font="font"
198
- >
199
- {{ item[$props.itemTitle!] }}
200
- </FSSpan>
201
- </FSRow>
202
- </template>
203
- </FSRadio>
204
- <FSRow
205
- align="center-right"
187
+ @update:modelValue="onRadioChange(item[$props.itemValue!])"
188
+ />
189
+ </FSRow>
190
+ </FSRow>
191
+ </FSCol>
192
+ </FSFadeOut>
193
+ <FSRow
194
+ v-if="allowAddItem"
195
+ padding="4px 3px"
196
+ >
197
+ <FSButton
198
+ variant="icon"
199
+ :label="$tr('autocomplete-field.add-item', 'Add new item')"
200
+ :color="ColorEnum.Primary"
201
+ @click="$emit('add:item', search)"
202
+ />
203
+ </FSRow>
204
+ <FSRow
205
+ v-if="!allowAddItem && searchItems.length === 0"
206
+ padding="4px 3px"
207
+ >
208
+ <FSSpan>
209
+ {{ $tr("ui.common.no-data", "No data") }}
210
+ </FSSpan>
211
+ </FSRow>
212
+ </template>
213
+ </FSDialogMenu>
214
+ </FSCol>
215
+ <FSBaseField
216
+ v-else
217
+ :description="$props.description"
218
+ :hideHeader="$props.hideHeader"
219
+ :required="$props.required"
220
+ :editable="$props.editable"
221
+ :label="$props.label"
222
+ :messages="messages"
223
+ >
224
+ <FSToggleSet
225
+ v-if="$props.toggleSet"
226
+ :editable="$props.editable"
227
+ :multiple="$props.multiple"
228
+ :required="$props.required"
229
+ :values="$props.items"
230
+ :rules="$props.rules"
231
+ :modelValue="$props.modelValue"
232
+ @update:modelValue="$emit('update:modelValue', $event)"
233
+ v-bind="$attrs"
234
+ >
235
+ <template
236
+ v-for="(_, name) in toggleSetSlots"
237
+ v-slot:[name]="slotData"
238
+ >
239
+ <slot
240
+ :name="`toggle-set-${name}`"
241
+ v-bind="slotData"
242
+ />
243
+ </template>
244
+ </FSToggleSet>
245
+ <FSCol
246
+ v-else
247
+ >
248
+ <v-autocomplete
249
+ class="fs-autocomplete-field"
250
+ variant="outlined"
251
+ :clearable="$props.clearable && $props.editable && !!$props.modelValue"
252
+ :itemTitle="$props.itemTitle"
253
+ :itemValue="$props.itemValue"
254
+ :readonly="!$props.editable"
255
+ :multiple="$props.multiple"
256
+ :validateOn="validateOn"
257
+ :autoSelectFirst="true"
258
+ :persistentClear="true"
259
+ :listProps="listStyle"
260
+ :returnObject="false"
261
+ :items="$props.items"
262
+ :rules="$props.rules"
263
+ :hideDetails="true"
264
+ :menuIcon="null"
265
+ :style="style"
266
+ :modelValue="$props.modelValue"
267
+ @update:modelValue="onSingleChange"
268
+ @click="onClick"
269
+ @blur="onBlur"
270
+ v-model:search="search"
271
+ v-bind="$attrs"
272
+ >
273
+ <template
274
+ v-for="(_, name) in autocompleteSlots"
275
+ v-slot:[name]="slotData"
276
+ >
277
+ <slot
278
+ :name="`autocomplete-${name}`"
279
+ v-bind="slotData"
280
+ />
281
+ </template>
282
+ <template
283
+ #item="{ props, item }"
284
+ >
285
+ <v-list-item
286
+ v-bind="{ ...props, title: '' }"
287
+ >
288
+ <FSRow
289
+ align="center-left"
290
+ :wrap="false"
291
+ >
292
+ <FSCheckbox
293
+ v-if="$props.multiple"
294
+ :modelValue="$props.modelValue?.includes(item.raw[$props.itemValue!])"
295
+ @click="props.onClick"
296
+ >
297
+ <template
298
+ #label="{ font }"
206
299
  >
207
300
  <slot
208
- name="item-append"
209
- v-bind="{ item }"
301
+ name="item-prepend"
302
+ v-bind="{ item: item.raw }"
210
303
  />
211
- </FSRow>
304
+ <FSSpan
305
+ :font="font"
306
+ >
307
+ {{ item.raw[$props.itemTitle!] }}
308
+ </FSSpan>
309
+ </template>
310
+ </FSCheckbox>
311
+ <template
312
+ v-else
313
+ >
314
+ <slot
315
+ name="item-prepend"
316
+ v-bind="{ item: item.raw }"
317
+ />
318
+ <FSSpan
319
+ :font="$props.modelValue === item.raw[$props.itemTitle!] ? 'text-button' : 'text-body'"
320
+ >
321
+ {{ item.raw[$props.itemTitle!] }}
322
+ </FSSpan>
323
+ </template>
324
+ <FSRow
325
+ align="center-right"
326
+ >
327
+ <slot
328
+ name="item-append"
329
+ v-bind="{ item: item.raw }"
330
+ />
212
331
  </FSRow>
213
- </FSCol>
214
- </FSFadeOut>
332
+ </FSRow>
333
+ </v-list-item>
334
+ </template>
335
+ <template
336
+ #prepend-inner
337
+ >
338
+ <slot
339
+ v-if="selectedItem && showExtra"
340
+ name="item-prepend"
341
+ v-bind="{ item: selectedItem }"
342
+ />
343
+ </template>
344
+ <template
345
+ v-if="$props.multiple"
346
+ #selection="{ index }"
347
+ >
348
+ <FSSpan
349
+ v-if="index === $props.modelValue.length - 1 && showExtra"
350
+ >
351
+ {{ $props.placeholder }}
352
+ </FSSpan>
353
+ </template>
354
+ <template
355
+ #clear
356
+ >
357
+ <FSRow
358
+ :wrap="false"
359
+ >
360
+ <slot
361
+ v-if="selectedItem && showExtra"
362
+ name="item-append"
363
+ v-bind="{ item: selectedItem }"
364
+ />
365
+ <slot
366
+ name="clear"
367
+ >
368
+ <FSButton
369
+ v-if="$props.clearable && $props.editable && !!$props.modelValue"
370
+ icon="mdi-close"
371
+ variant="icon"
372
+ :color="ColorEnum.Dark"
373
+ @click="onClear"
374
+ />
375
+ </slot>
376
+ </FSRow>
377
+ </template>
378
+ <template
379
+ #append-inner
380
+ >
381
+ <slot
382
+ name="append-inner"
383
+ >
384
+ <FSButton
385
+ icon="mdi-chevron-down"
386
+ variant="icon"
387
+ :editable="$props.editable"
388
+ :color="ColorEnum.Dark"
389
+ />
390
+ </slot>
391
+ </template>
392
+ <template
393
+ #append-item
394
+ >
215
395
  <FSRow
216
396
  v-if="allowAddItem"
217
- padding="4px 3px"
397
+ padding="15px"
218
398
  >
219
399
  <FSButton
220
400
  variant="icon"
221
- :label="$tr('ui.autocomplete.add-item', 'Add new item')"
401
+ :label="$tr('autocomplete-field.add-item', 'Add new item')"
222
402
  :color="ColorEnum.Primary"
223
403
  @click="$emit('add:item', search)"
224
404
  />
225
405
  </FSRow>
406
+ </template>
407
+ <template
408
+ #no-data
409
+ >
226
410
  <FSRow
227
- v-if="!allowAddItem && searchItems.length === 0"
228
- padding="4px 3px"
411
+ v-if="!allowAddItem"
412
+ padding="15px"
229
413
  >
230
414
  <FSSpan>
231
415
  {{ $tr("ui.common.no-data", "No data") }}
232
416
  </FSSpan>
233
417
  </FSRow>
234
418
  </template>
235
- </FSDialogMenu>
236
- </template>
237
- <template
238
- v-else
239
- >
240
- <FSBaseField
241
- :description="$props.description"
242
- :hideHeader="$props.hideHeader"
243
- :required="$props.required"
244
- :editable="$props.editable"
245
- :label="$props.label"
246
- :messages="messages"
419
+ </v-autocomplete>
420
+ <FSSlideGroup
421
+ v-if="$props.multiple && Array.isArray($props.modelValue)"
247
422
  >
248
- <FSToggleSet
249
- v-if="$props.toggleSet"
250
- :editable="$props.editable"
251
- :multiple="$props.multiple"
252
- :required="$props.required"
253
- :values="$props.items"
254
- :rules="$props.rules"
255
- :modelValue="$props.modelValue"
256
- @update:modelValue="$emit('update:modelValue', $event)"
257
- v-bind="$attrs"
423
+ <FSCard
424
+ v-for="(item, index) in $props.items.filter((item: any) => $props.modelValue.includes(item[$props.itemValue!]))"
425
+ variant="standard"
426
+ :height="['40px', '36px']"
427
+ :color="ColorEnum.Light"
428
+ :border="false"
429
+ :key="index"
258
430
  >
259
- <template
260
- v-for="(_, name) in toggleSetSlots"
261
- v-slot:[name]="slotData"
431
+ <FSRow
432
+ align="center-left"
433
+ padding="0 8px"
262
434
  >
263
435
  <slot
264
- :name="`toggle-set-${name}`"
265
- v-bind="slotData"
436
+ name="item-prepend"
437
+ v-bind="{ item }"
266
438
  />
267
- </template>
268
- </FSToggleSet>
269
- <FSCol
270
- v-else
271
- >
272
- <v-autocomplete
273
- class="fs-autocomplete-field"
274
- variant="outlined"
275
- :clearable="$props.clearable && $props.editable && !!$props.modelValue"
276
- :itemTitle="$props.itemTitle"
277
- :itemValue="$props.itemValue"
278
- :readonly="!$props.editable"
279
- :multiple="$props.multiple"
280
- :validateOn="validateOn"
281
- :autoSelectFirst="true"
282
- :persistentClear="true"
283
- :listProps="listStyle"
284
- :returnObject="false"
285
- :items="$props.items"
286
- :rules="$props.rules"
287
- :hideDetails="true"
288
- :menuIcon="null"
289
- :class="classes"
290
- :style="style"
291
- :modelValue="$props.modelValue"
292
- @update:modelValue="onSingleChange"
293
- @click="onClick"
294
- v-model:search="search"
295
- v-bind="$attrs"
296
- >
297
- <template
298
- v-for="(_, name) in autocompleteSlots"
299
- v-slot:[name]="slotData"
300
- >
301
- <slot
302
- :name="`autocomplete-${name}`"
303
- v-bind="slotData"
304
- />
305
- </template>
306
- <template
307
- #item="{ props, item }"
308
- >
309
- <v-list-item
310
- v-bind="{ ...props, title: '' }"
311
- >
312
- <FSRow
313
- align="center-left"
314
- :wrap="false"
315
- >
316
- <FSCheckbox
317
- v-if="$props.multiple"
318
- :modelValue="$props.modelValue?.includes(item.raw[$props.itemValue!])"
319
- @click="props.onClick"
320
- >
321
- <template
322
- #label="{ font }"
323
- >
324
- <slot
325
- name="item-prepend"
326
- v-bind="{ item: item.raw }"
327
- />
328
- <FSSpan
329
- :font="font"
330
- >
331
- {{ item.raw[$props.itemTitle!] }}
332
- </FSSpan>
333
- </template>
334
- </FSCheckbox>
335
- <template
336
- v-else
337
- >
338
- <slot
339
- name="item-prepend"
340
- v-bind="{ item: item.raw }"
341
- />
342
- <FSSpan
343
- :font="$props.modelValue === item.raw[$props.itemTitle!] ? 'text-button' : 'text-body'"
344
- >
345
- {{ item.raw[$props.itemTitle!] }}
346
- </FSSpan>
347
- </template>
348
- <FSRow
349
- align="center-right"
350
- >
351
- <slot
352
- name="item-append"
353
- v-bind="{ item: item.raw }"
354
- />
355
- </FSRow>
356
- </FSRow>
357
- </v-list-item>
358
- </template>
359
- <template
360
- #prepend-inner
361
- >
362
- <slot
363
- v-if="selectedItem && addExtra"
364
- name="item-prepend"
365
- v-bind="{ item: selectedItem }"
366
- />
367
- </template>
368
- <template
369
- v-if="$props.multiple"
370
- #selection="{ index }"
371
- >
372
- <FSSpan
373
- v-if="index === $props.modelValue.length - 1 && addExtra"
374
- >
375
- {{ $props.placeholder }}
376
- </FSSpan>
377
- </template>
378
- <template
379
- #clear
380
- >
381
- <FSRow
382
- :wrap="false"
383
- >
384
- <slot
385
- v-if="selectedItem"
386
- name="item-append"
387
- v-bind="{ item: selectedItem }"
388
- />
389
- <slot
390
- name="clear"
391
- >
392
- <FSButton
393
- v-if="$props.clearable && $props.editable && !!$props.modelValue"
394
- icon="mdi-close"
395
- variant="icon"
396
- :color="ColorEnum.Dark"
397
- @click="$emit('update:modelValue', null)"
398
- />
399
- </slot>
400
- </FSRow>
401
- </template>
402
- <template
403
- #append-inner
404
- >
405
- <slot
406
- name="append-inner"
407
- >
408
- <FSButton
409
- icon="mdi-chevron-down"
410
- variant="icon"
411
- :editable="$props.editable"
412
- :color="ColorEnum.Dark"
413
- />
414
- </slot>
415
- </template>
416
- <template
417
- #append-item
418
- >
419
- <FSRow
420
- v-if="allowAddItem"
421
- padding="17px"
422
- >
423
- <FSButton
424
- variant="icon"
425
- :label="$tr('ui.autocomplete.add-item', 'Add new item')"
426
- :color="ColorEnum.Primary"
427
- @click="$emit('add:item', search)"
428
- />
429
- </FSRow>
430
- </template>
431
- <template
432
- #no-data
433
- >
434
- <FSRow
435
- v-if="!allowAddItem"
436
- padding="17px"
437
- >
438
- <FSSpan>
439
- {{ $tr("ui.common.no-data", "No data") }}
440
- </FSSpan>
441
- </FSRow>
442
- </template>
443
- </v-autocomplete>
444
- <FSSlideGroup
445
- v-if="$props.multiple && Array.isArray($props.modelValue)"
446
- >
447
- <FSCard
448
- v-for="(item, index) in $props.items.filter((item: any) => $props.modelValue.includes(item[$props.itemValue!]))"
449
- variant="standard"
450
- :height="['40px', '36px']"
451
- :color="ColorEnum.Light"
452
- :border="false"
453
- :key="index"
454
- >
455
- <FSRow
456
- align="center-left"
457
- padding="0 8px"
458
- >
459
- <slot
460
- name="item-prepend"
461
- v-bind="{ item }"
462
- />
463
- <FSSpan>
464
- {{ item[$props.itemTitle!] }}
465
- </FSSpan>
466
- <slot
467
- name="item-append"
468
- v-bind="{ item }"
469
- />
470
- <FSButton
471
- icon="mdi-close"
472
- variant="icon"
473
- :color="ColorEnum.Dark"
474
- @click="() => onCheckboxChange(item[$props.itemValue!])"
475
- />
476
- </FSRow>
477
- </FSCard>
478
- </FSSlideGroup>
479
- </FSCol>
480
- </FSBaseField>
481
- </template>
482
- </template>
439
+ <FSSpan>
440
+ {{ item[$props.itemTitle!] }}
441
+ </FSSpan>
442
+ <slot
443
+ name="item-append"
444
+ v-bind="{ item }"
445
+ />
446
+ <FSButton
447
+ icon="mdi-close"
448
+ variant="icon"
449
+ :color="ColorEnum.Dark"
450
+ @click="() => onCheckboxChange(item[$props.itemValue!])"
451
+ />
452
+ </FSRow>
453
+ </FSCard>
454
+ </FSSlideGroup>
455
+ </FSCol>
456
+ </FSBaseField>
483
457
  </template>
484
458
 
485
459
  <script lang="ts">
486
- import { computed, defineComponent, type PropType, ref, type StyleValue, type Slot } from "vue";
460
+ import { computed, defineComponent, type PropType, ref, type Slot, type StyleValue, watch } from "vue";
487
461
 
488
462
  import { useBreakpoints, useColors, useRules, useSlots } from "@dative-gpi/foundation-shared-components/composables";
489
463
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
@@ -612,7 +586,7 @@ export default defineComponent({
612
586
  },
613
587
  emits: ["update:modelValue", "update:search", "add:item"],
614
588
  setup: (props, { emit }) => {
615
- const { isExtraSmall, isMobileSized } = useBreakpoints();
589
+ const { fontStyles, isExtraSmall, isMobileSized } = useBreakpoints();
616
590
  const { validateOn, getMessages } = useRules();
617
591
  const { getColors } = useColors();
618
592
  const { slots } = useSlots();
@@ -627,26 +601,30 @@ export default defineComponent({
627
601
 
628
602
  const dialog = ref(false);
629
603
  const search = ref("");
630
- const addExtra = ref(true);
604
+ const showExtra = ref(true);
631
605
 
632
606
  const style = computed((): StyleValue => {
633
607
  if (!props.editable) {
634
608
  return {
635
- "--fs-autocomplete-field-cursor": "default",
636
- "--fs-autocomplete-field-border-color": lights.base,
637
- "--fs-autocomplete-field-color": lights.dark,
638
- "--fs-autocomplete-field-active-border-color": lights.base
609
+ "--fs-autocomplete-field-cursor" : "default",
610
+ "--fs-autocomplete-field-border-color" : lights.base,
611
+ "--fs-autocomplete-field-color" : lights.dark,
612
+ "--fs-autocomplete-field-active-border-color": lights.base,
613
+ "--fs-base-field-input-height" : isMobileSized.value ? "34px" : "38px",
614
+ ...fontStyles.value
639
615
  };
640
616
  }
641
617
  return {
642
- "--fs-autocomplete-field-cursor": "text",
643
- "--fs-autocomplete-field-background-color": backgrounds.base,
618
+ "--fs-autocomplete-field-cursor" : "text",
619
+ "--fs-autocomplete-field-background-color" : backgrounds.base,
644
620
  "--fs-autocomplete-field-no-data-background-color": lights.light,
645
- "--fs-autocomplete-field-border-color": lights.dark,
646
- "--fs-autocomplete-field-color": darks.base,
647
- "--fs-autocomplete-field-active-border-color": darks.dark,
648
- "--fs-autocomplete-field-error-color": errors.base,
649
- "--fs-autocomplete-field-error-border-color": errors.base
621
+ "--fs-autocomplete-field-border-color" : lights.dark,
622
+ "--fs-autocomplete-field-color" : darks.base,
623
+ "--fs-autocomplete-field-active-border-color" : darks.dark,
624
+ "--fs-autocomplete-field-error-color" : errors.base,
625
+ "--fs-autocomplete-field-error-border-color" : errors.base,
626
+ "--fs-base-field-input-height" : isMobileSized.value ? "34px" : "38px",
627
+ ...fontStyles.value
650
628
  };
651
629
  });
652
630
 
@@ -670,14 +648,6 @@ export default defineComponent({
670
648
  };
671
649
  });
672
650
 
673
- const classes = computed((): string[] => {
674
- const classNames = ["fs-autocomplete-field"];
675
- if (props.multiple) {
676
- classNames.push("fs-autocomplete-multiple-field");
677
- }
678
- return classNames;
679
- });
680
-
681
651
  const messages = computed((): string[] => props.messages ?? getMessages(props.modelValue, props.rules));
682
652
 
683
653
  const searchItems = computed((): any[] => {
@@ -717,13 +687,13 @@ export default defineComponent({
717
687
  });
718
688
 
719
689
  const maxHeight = computed(() => {
720
- const other = 8 + 8 // Paddings
721
- + (isMobileSized ? 36 : 40) + 8; // Header
690
+ const other = 8 + 8 // Paddings
691
+ + (isMobileSized.value ? 36 : 40) + 8; // Header
722
692
  return `calc(100vh - 40px - ${other}px)`;
723
693
  });
724
694
 
725
695
  const mobileValue = computed((): string | null => {
726
- if (props.multiple) {
696
+ if (props.multiple && Array.isArray(props.modelValue) && props.modelValue.length > 0) {
727
697
  return props.placeholder;
728
698
  }
729
699
  if (selectedItem.value) {
@@ -740,13 +710,11 @@ export default defineComponent({
740
710
  };
741
711
 
742
712
  const onRadioChange = (value: string | null) => {
743
- addExtra.value = true;
744
713
  emit("update:modelValue", value);
745
714
  dialog.value = false;
746
715
  };
747
716
 
748
717
  const onCheckboxChange = (value: string) => {
749
- addExtra.value = true;
750
718
  if (Array.isArray(props.modelValue)) {
751
719
  if (props.modelValue.includes(value)) {
752
720
  emit("update:modelValue", props.modelValue.filter((item: any) => item !== value));
@@ -769,17 +737,30 @@ export default defineComponent({
769
737
  };
770
738
 
771
739
  const onSingleChange = (value: string) => {
772
- addExtra.value = true;
773
740
  emit("update:modelValue", value);
741
+ if (value && !Array.isArray(value)) {
742
+ showExtra.value = true;
743
+ }
744
+ };
745
+
746
+ const onClear = () => {
747
+ emit("update:modelValue", null);
748
+ search.value = "";
774
749
  };
775
750
 
776
751
  const onClick = (): void => {
777
- addExtra.value = false;
778
- if (props.modelValue && !props.multiple) {
779
- search.value = "";
780
- }
752
+ search.value = "";
753
+ showExtra.value = false;
781
754
  };
782
755
 
756
+ const onBlur = () => {
757
+ showExtra.value = true;
758
+ };
759
+
760
+ watch(search, () => {
761
+ emit("update:search", search.value);
762
+ });
763
+
783
764
  return {
784
765
  autocompleteSlots,
785
766
  toggleSetSlots,
@@ -793,9 +774,8 @@ export default defineComponent({
793
774
  ColorEnum,
794
775
  listStyle,
795
776
  maxHeight,
796
- addExtra,
777
+ showExtra,
797
778
  messages,
798
- classes,
799
779
  dialog,
800
780
  search,
801
781
  slots,
@@ -804,7 +784,9 @@ export default defineComponent({
804
784
  onCheckboxChange,
805
785
  onSingleChange,
806
786
  onRadioChange,
807
- onClick
787
+ onClear,
788
+ onClick,
789
+ onBlur
808
790
  };
809
791
  }
810
792
  });