@winchsa/ui 0.1.0

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 (305) hide show
  1. package/README.md +166 -0
  2. package/dist/components/Breadcrumbs.vue +46 -0
  3. package/dist/components/Breadcrumbs.vue.d.ts +6 -0
  4. package/dist/components/Drawer.vue +60 -0
  5. package/dist/components/Drawer.vue.d.ts +44 -0
  6. package/dist/components/IconBtn.vue +18 -0
  7. package/dist/components/IconBtn.vue.d.ts +30 -0
  8. package/dist/components/Modal.vue +155 -0
  9. package/dist/components/Modal.vue.d.ts +0 -0
  10. package/dist/components/SiteTitle.vue +14 -0
  11. package/dist/components/SiteTitle.vue.d.ts +2 -0
  12. package/dist/components/Toaster.vue +19 -0
  13. package/dist/components/Toaster.vue.d.ts +5 -0
  14. package/dist/components/cards/CheckboxesCard.vue +76 -0
  15. package/dist/components/cards/CheckboxesCard.vue.d.ts +20 -0
  16. package/dist/components/cards/HeaderCard.vue +31 -0
  17. package/dist/components/cards/HeaderCard.vue.d.ts +8 -0
  18. package/dist/components/cards/ImageCard.vue +73 -0
  19. package/dist/components/cards/ImageCard.vue.d.ts +63 -0
  20. package/dist/components/cards/InputCard.vue +60 -0
  21. package/dist/components/cards/InputCard.vue.d.ts +41 -0
  22. package/dist/components/cards/StaticCard.vue +37 -0
  23. package/dist/components/cards/StaticCard.vue.d.ts +33 -0
  24. package/dist/components/core/AppBarSearch.vue +345 -0
  25. package/dist/components/core/AppBarSearch.vue.d.ts +1587 -0
  26. package/dist/components/core/AppDrawerHeaderSection.vue +21 -0
  27. package/dist/components/core/AppDrawerHeaderSection.vue.d.ts +30 -0
  28. package/dist/components/core/AppSearchHeader.vue +72 -0
  29. package/dist/components/core/AppSearchHeader.vue.d.ts +7 -0
  30. package/dist/components/core/AppStepper.vue +232 -0
  31. package/dist/components/core/AppStepper.vue.d.ts +25 -0
  32. package/dist/components/core/CustomizerSection.vue +19 -0
  33. package/dist/components/core/CustomizerSection.vue.d.ts +25 -0
  34. package/dist/components/core/DialogCloseBtn.vue +20 -0
  35. package/dist/components/core/DialogCloseBtn.vue.d.ts +9 -0
  36. package/dist/components/core/MoreBtn.vue +27 -0
  37. package/dist/components/core/MoreBtn.vue.d.ts +25 -0
  38. package/dist/components/core/ScrollToTop.vue +39 -0
  39. package/dist/components/core/ScrollToTop.vue.d.ts +2 -0
  40. package/dist/components/core/app-form-elements/AppCombobox.vue +67 -0
  41. package/dist/components/core/app-form-elements/AppCombobox.vue.d.ts +0 -0
  42. package/dist/components/core/app-form-elements/AppSelect.vue +98 -0
  43. package/dist/components/core/app-form-elements/AppSelect.vue.d.ts +0 -0
  44. package/dist/components/core/app-form-elements/AppSwitch.vue +59 -0
  45. package/dist/components/core/app-form-elements/AppSwitch.vue.d.ts +27 -0
  46. package/dist/components/core/app-form-elements/AppTextField.vue +66 -0
  47. package/dist/components/core/app-form-elements/AppTextField.vue.d.ts +26 -0
  48. package/dist/components/core/app-form-elements/AppTextarea.vue +69 -0
  49. package/dist/components/core/app-form-elements/AppTextarea.vue.d.ts +26 -0
  50. package/dist/components/core/app-form-elements/CustomCheckboxes.vue +69 -0
  51. package/dist/components/core/app-form-elements/CustomCheckboxes.vue.d.ts +39 -0
  52. package/dist/components/core/app-form-elements/CustomCheckboxesWithIcon.vue +80 -0
  53. package/dist/components/core/app-form-elements/CustomCheckboxesWithIcon.vue.d.ts +39 -0
  54. package/dist/components/core/app-form-elements/CustomCheckboxesWithImage.vue +67 -0
  55. package/dist/components/core/app-form-elements/CustomCheckboxesWithImage.vue.d.ts +15 -0
  56. package/dist/components/core/app-form-elements/CustomRadios.vue +69 -0
  57. package/dist/components/core/app-form-elements/CustomRadios.vue.d.ts +40 -0
  58. package/dist/components/core/app-form-elements/CustomRadiosWithIcon.vue +98 -0
  59. package/dist/components/core/app-form-elements/CustomRadiosWithIcon.vue.d.ts +45 -0
  60. package/dist/components/core/app-form-elements/CustomRadiosWithImage.vue +69 -0
  61. package/dist/components/core/app-form-elements/CustomRadiosWithImage.vue.d.ts +53 -0
  62. package/dist/components/core/cards/AppCard.vue +45 -0
  63. package/dist/components/core/cards/AppCard.vue.d.ts +26 -0
  64. package/dist/components/core/cards/AppCardActions.vue +126 -0
  65. package/dist/components/core/cards/AppCardActions.vue.d.ts +79 -0
  66. package/dist/components/core/cards/CardStatisticsHorizontal.vue +29 -0
  67. package/dist/components/core/cards/CardStatisticsHorizontal.vue.d.ts +10 -0
  68. package/dist/components/forms/Accordion.vue +43 -0
  69. package/dist/components/forms/Accordion.vue.d.ts +35 -0
  70. package/dist/components/forms/AppLabel.vue +47 -0
  71. package/dist/components/forms/AppLabel.vue.d.ts +36 -0
  72. package/dist/components/forms/AppLink.vue +50 -0
  73. package/dist/components/forms/AppLink.vue.d.ts +27 -0
  74. package/dist/components/forms/AppNumberField.vue +85 -0
  75. package/dist/components/forms/AppNumberField.vue.d.ts +45 -0
  76. package/dist/components/forms/AppOtpInput.vue +84 -0
  77. package/dist/components/forms/AppOtpInput.vue.d.ts +16 -0
  78. package/dist/components/forms/AttachmentCropperInput.vue +228 -0
  79. package/dist/components/forms/AttachmentCropperInput.vue.d.ts +25 -0
  80. package/dist/components/forms/AttachmentInput.vue +116 -0
  81. package/dist/components/forms/AttachmentInput.vue.d.ts +20 -0
  82. package/dist/components/forms/AutocompleteInput.vue +759 -0
  83. package/dist/components/forms/AutocompleteInput.vue.d.ts +0 -0
  84. package/dist/components/forms/BankSelect.vue +43 -0
  85. package/dist/components/forms/BankSelect.vue.d.ts +19 -0
  86. package/dist/components/forms/BaseButton.vue +42 -0
  87. package/dist/components/forms/BaseButton.vue.d.ts +31 -0
  88. package/dist/components/forms/CounterInput.vue +71 -0
  89. package/dist/components/forms/CounterInput.vue.d.ts +15 -0
  90. package/dist/components/forms/DatePicker.vue +400 -0
  91. package/dist/components/forms/DatePicker.vue.d.ts +34 -0
  92. package/dist/components/forms/DatePickerRange.vue +129 -0
  93. package/dist/components/forms/DatePickerRange.vue.d.ts +23 -0
  94. package/dist/components/forms/DraggedUploadFile.vue +120 -0
  95. package/dist/components/forms/DraggedUploadFile.vue.d.ts +10 -0
  96. package/dist/components/forms/ImageCardInput.vue +234 -0
  97. package/dist/components/forms/ImageCardInput.vue.d.ts +0 -0
  98. package/dist/components/forms/InputValidationWrapper.vue +24 -0
  99. package/dist/components/forms/InputValidationWrapper.vue.d.ts +33 -0
  100. package/dist/components/forms/LicensePlateInput.vue +159 -0
  101. package/dist/components/forms/LicensePlateInput.vue.d.ts +16 -0
  102. package/dist/components/forms/ManualDate.vue +262 -0
  103. package/dist/components/forms/ManualDate.vue.d.ts +17 -0
  104. package/dist/components/forms/MobileInput.vue +118 -0
  105. package/dist/components/forms/MobileInput.vue.d.ts +49 -0
  106. package/dist/components/forms/PasswordInput.vue +29 -0
  107. package/dist/components/forms/PasswordInput.vue.d.ts +13 -0
  108. package/dist/components/forms/RangeInput.vue +48 -0
  109. package/dist/components/forms/RangeInput.vue.d.ts +5 -0
  110. package/dist/components/forms/Tabs.vue +35 -0
  111. package/dist/components/forms/Tabs.vue.d.ts +42 -0
  112. package/dist/components/forms/TimePicker.vue +370 -0
  113. package/dist/components/forms/TimePicker.vue.d.ts +23 -0
  114. package/dist/components/icons/EndMarker.vue +25 -0
  115. package/dist/components/icons/EndMarker.vue.d.ts +17 -0
  116. package/dist/components/icons/RedXIcon.vue +36 -0
  117. package/dist/components/icons/RedXIcon.vue.d.ts +2 -0
  118. package/dist/components/icons/StarFillIcon.vue +28 -0
  119. package/dist/components/icons/StarFillIcon.vue.d.ts +2 -0
  120. package/dist/components/icons/StartMarker.vue +25 -0
  121. package/dist/components/icons/StartMarker.vue.d.ts +17 -0
  122. package/dist/components/icons/WorkerIcon.vue +39 -0
  123. package/dist/components/icons/WorkerIcon.vue.d.ts +2 -0
  124. package/dist/components/loading/LoadingBar.vue +31 -0
  125. package/dist/components/loading/LoadingBar.vue.d.ts +5 -0
  126. package/dist/components/loading/LoadingDialog.vue +41 -0
  127. package/dist/components/loading/LoadingDialog.vue.d.ts +11 -0
  128. package/dist/components/loading/LoadingItem.vue +66 -0
  129. package/dist/components/loading/LoadingItem.vue.d.ts +47 -0
  130. package/dist/components/table/DataTable.vue +319 -0
  131. package/dist/components/table/DataTable.vue.d.ts +0 -0
  132. package/dist/components/table/EditableDataTable.vue +329 -0
  133. package/dist/components/table/EditableDataTable.vue.d.ts +73 -0
  134. package/dist/components/table/EditableDataTableRow.vue +243 -0
  135. package/dist/components/table/EditableDataTableRow.vue.d.ts +18 -0
  136. package/dist/components/table/FilterGenerator.vue +232 -0
  137. package/dist/components/table/FilterGenerator.vue.d.ts +14 -0
  138. package/dist/components/table/StaticTable.vue +152 -0
  139. package/dist/components/table/StaticTable.vue.d.ts +25 -0
  140. package/dist/components/table/TablePagination.vue +73 -0
  141. package/dist/components/table/TablePagination.vue.d.ts +13 -0
  142. package/dist/composables/use-is-mobile.d.ts +1 -0
  143. package/dist/composables/use-is-mobile.js +10 -0
  144. package/dist/composables/use-is-mobile.mjs +4 -0
  145. package/dist/composables/use-table-filters.d.ts +23 -0
  146. package/dist/composables/use-table-filters.js +196 -0
  147. package/dist/composables/use-table-filters.mjs +183 -0
  148. package/dist/fonts/NotoSans-Medium.ttf +0 -0
  149. package/dist/fonts/NotoSansArabic-Medium.ttf +0 -0
  150. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.eot +0 -0
  151. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.svg +9 -0
  152. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.ttf +0 -0
  153. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.woff +0 -0
  154. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.woff2 +0 -0
  155. package/dist/images/avatar.png +0 -0
  156. package/dist/images/sa.svg +1 -0
  157. package/dist/images/successful-registration.svg +15 -0
  158. package/dist/index.d.ts +66 -0
  159. package/dist/index.js +447 -0
  160. package/dist/index.mjs +128 -0
  161. package/dist/styles/@core/scss/base/_components.scss +164 -0
  162. package/dist/styles/@core/scss/base/_dark.scss +16 -0
  163. package/dist/styles/@core/scss/base/_default-layout-w-vertical-nav.scss +106 -0
  164. package/dist/styles/@core/scss/base/_default-layout.scss +16 -0
  165. package/dist/styles/@core/scss/base/_index.scss +47 -0
  166. package/dist/styles/@core/scss/base/_layouts.scss +63 -0
  167. package/dist/styles/@core/scss/base/_misc.scss +20 -0
  168. package/dist/styles/@core/scss/base/_mixins.scss +84 -0
  169. package/dist/styles/@core/scss/base/_route-transitions.scss +70 -0
  170. package/dist/styles/@core/scss/base/_utilities.scss +418 -0
  171. package/dist/styles/@core/scss/base/_utils.scss +100 -0
  172. package/dist/styles/@core/scss/base/_variables.scss +190 -0
  173. package/dist/styles/@core/scss/base/_vertical-nav.scss +264 -0
  174. package/dist/styles/@core/scss/base/libs/_perfect-scrollbar.scss +35 -0
  175. package/dist/styles/@core/scss/base/libs/vuetify/_index.scss +1 -0
  176. package/dist/styles/@core/scss/base/libs/vuetify/_overrides.scss +385 -0
  177. package/dist/styles/@core/scss/base/libs/vuetify/_variables.scss +48 -0
  178. package/dist/styles/@core/scss/base/placeholders/_default-layout-vertical-nav.scss +48 -0
  179. package/dist/styles/@core/scss/base/placeholders/_default-layout.scss +3 -0
  180. package/dist/styles/@core/scss/base/placeholders/_index.scss +5 -0
  181. package/dist/styles/@core/scss/base/placeholders/_misc.scss +7 -0
  182. package/dist/styles/@core/scss/base/placeholders/_nav.scss +26 -0
  183. package/dist/styles/@core/scss/base/placeholders/_vertical-nav.scss +84 -0
  184. package/dist/styles/@core/scss/base/skins/_bordered.scss +60 -0
  185. package/dist/styles/@core/scss/base/skins/_index.scss +1 -0
  186. package/dist/styles/@core/scss/template/_components.scss +1035 -0
  187. package/dist/styles/@core/scss/template/_default-layout-w-vertical-nav.scss +20 -0
  188. package/dist/styles/@core/scss/template/_utilities.scss +20 -0
  189. package/dist/styles/@core/scss/template/_variables.scss +67 -0
  190. package/dist/styles/@core/scss/template/_vertical-nav.scss +41 -0
  191. package/dist/styles/@core/scss/template/index.css +18764 -0
  192. package/dist/styles/@core/scss/template/index.scss +15 -0
  193. package/dist/styles/@core/scss/template/libs/apex-chart.css +90 -0
  194. package/dist/styles/@core/scss/template/libs/apex-chart.scss +99 -0
  195. package/dist/styles/@core/scss/template/libs/shepherd.css +82 -0
  196. package/dist/styles/@core/scss/template/libs/shepherd.scss +88 -0
  197. package/dist/styles/@core/scss/template/libs/vuetify/_variables.scss +461 -0
  198. package/dist/styles/@core/scss/template/libs/vuetify/index.css +741 -0
  199. package/dist/styles/@core/scss/template/libs/vuetify/index.scss +1 -0
  200. package/dist/styles/@core/scss/template/pages/misc.css +16 -0
  201. package/dist/styles/@core/scss/template/pages/misc.scss +20 -0
  202. package/dist/styles/@core/scss/template/placeholders/_default-layout-vertical-nav.scss +9 -0
  203. package/dist/styles/@core/scss/template/placeholders/_index.scss +3 -0
  204. package/dist/styles/@core/scss/template/placeholders/_nav.scss +15 -0
  205. package/dist/styles/@core/scss/template/placeholders/_vertical-nav.scss +18 -0
  206. package/dist/styles/@core/scss/template/skins/_bordered.scss +36 -0
  207. package/dist/styles/@core/scss/template/skins/_index.scss +1 -0
  208. package/dist/styles/@layouts/styles/_classes.scss +3 -0
  209. package/dist/styles/@layouts/styles/_dashboard-layout.scss +43 -0
  210. package/dist/styles/@layouts/styles/_global.scss +10 -0
  211. package/dist/styles/@layouts/styles/_mixins.scss +28 -0
  212. package/dist/styles/@layouts/styles/_placeholders.scss +53 -0
  213. package/dist/styles/@layouts/styles/_rtl.scss +7 -0
  214. package/dist/styles/@layouts/styles/_variables.scss +22 -0
  215. package/dist/styles/@layouts/styles/index.css +14 -0
  216. package/dist/styles/@layouts/styles/index.scss +2 -0
  217. package/dist/styles/assets/scss/styles.css +16099 -0
  218. package/dist/styles/assets/scss/styles.scss +246 -0
  219. package/dist/styles/assets/scss/variables/_template.scss +1 -0
  220. package/dist/styles/assets/scss/variables/_vuetify.scss +1 -0
  221. package/dist/types.d.ts +226 -0
  222. package/dist/utils/apiUrl.d.ts +1 -0
  223. package/dist/utils/apiUrl.js +15 -0
  224. package/dist/utils/apiUrl.mjs +8 -0
  225. package/dist/utils/client.d.ts +9 -0
  226. package/dist/utils/client.js +39 -0
  227. package/dist/utils/client.mjs +25 -0
  228. package/dist/utils/files.d.ts +2 -0
  229. package/dist/utils/files.js +35 -0
  230. package/dist/utils/files.mjs +22 -0
  231. package/dist/utils/formValidation.d.ts +7 -0
  232. package/dist/utils/formValidation.js +20 -0
  233. package/dist/utils/formValidation.mjs +13 -0
  234. package/dist/utils/formatters.d.ts +12 -0
  235. package/dist/utils/formatters.js +84 -0
  236. package/dist/utils/formatters.mjs +56 -0
  237. package/dist/utils/index.d.ts +9 -0
  238. package/dist/utils/index.js +104 -0
  239. package/dist/utils/index.mjs +9 -0
  240. package/dist/utils/queryParams.d.ts +4 -0
  241. package/dist/utils/queryParams.js +26 -0
  242. package/dist/utils/queryParams.mjs +18 -0
  243. package/dist/utils/ruleValidator.d.ts +28 -0
  244. package/dist/utils/ruleValidator.js +158 -0
  245. package/dist/utils/ruleValidator.mjs +144 -0
  246. package/dist/utils/toaster.d.ts +12 -0
  247. package/dist/utils/toaster.js +71 -0
  248. package/dist/utils/toaster.mjs +59 -0
  249. package/dist/utils/utils.d.ts +8 -0
  250. package/dist/utils/utils.js +70 -0
  251. package/dist/utils/utils.mjs +56 -0
  252. package/package.json +79 -0
  253. package/src/styles/@core/scss/base/_components.scss +164 -0
  254. package/src/styles/@core/scss/base/_dark.scss +16 -0
  255. package/src/styles/@core/scss/base/_default-layout-w-vertical-nav.scss +106 -0
  256. package/src/styles/@core/scss/base/_default-layout.scss +16 -0
  257. package/src/styles/@core/scss/base/_index.scss +47 -0
  258. package/src/styles/@core/scss/base/_layouts.scss +63 -0
  259. package/src/styles/@core/scss/base/_misc.scss +20 -0
  260. package/src/styles/@core/scss/base/_mixins.scss +84 -0
  261. package/src/styles/@core/scss/base/_route-transitions.scss +70 -0
  262. package/src/styles/@core/scss/base/_utilities.scss +418 -0
  263. package/src/styles/@core/scss/base/_utils.scss +100 -0
  264. package/src/styles/@core/scss/base/_variables.scss +190 -0
  265. package/src/styles/@core/scss/base/_vertical-nav.scss +264 -0
  266. package/src/styles/@core/scss/base/libs/_perfect-scrollbar.scss +35 -0
  267. package/src/styles/@core/scss/base/libs/vuetify/_index.scss +1 -0
  268. package/src/styles/@core/scss/base/libs/vuetify/_overrides.scss +385 -0
  269. package/src/styles/@core/scss/base/libs/vuetify/_variables.scss +48 -0
  270. package/src/styles/@core/scss/base/placeholders/_default-layout-vertical-nav.scss +48 -0
  271. package/src/styles/@core/scss/base/placeholders/_default-layout.scss +3 -0
  272. package/src/styles/@core/scss/base/placeholders/_index.scss +5 -0
  273. package/src/styles/@core/scss/base/placeholders/_misc.scss +7 -0
  274. package/src/styles/@core/scss/base/placeholders/_nav.scss +26 -0
  275. package/src/styles/@core/scss/base/placeholders/_vertical-nav.scss +84 -0
  276. package/src/styles/@core/scss/base/skins/_bordered.scss +60 -0
  277. package/src/styles/@core/scss/base/skins/_index.scss +1 -0
  278. package/src/styles/@core/scss/template/_components.scss +1035 -0
  279. package/src/styles/@core/scss/template/_default-layout-w-vertical-nav.scss +20 -0
  280. package/src/styles/@core/scss/template/_utilities.scss +20 -0
  281. package/src/styles/@core/scss/template/_variables.scss +67 -0
  282. package/src/styles/@core/scss/template/_vertical-nav.scss +41 -0
  283. package/src/styles/@core/scss/template/index.scss +15 -0
  284. package/src/styles/@core/scss/template/libs/apex-chart.scss +99 -0
  285. package/src/styles/@core/scss/template/libs/shepherd.scss +88 -0
  286. package/src/styles/@core/scss/template/libs/vuetify/_variables.scss +461 -0
  287. package/src/styles/@core/scss/template/libs/vuetify/index.scss +1 -0
  288. package/src/styles/@core/scss/template/pages/misc.scss +20 -0
  289. package/src/styles/@core/scss/template/placeholders/_default-layout-vertical-nav.scss +9 -0
  290. package/src/styles/@core/scss/template/placeholders/_index.scss +3 -0
  291. package/src/styles/@core/scss/template/placeholders/_nav.scss +15 -0
  292. package/src/styles/@core/scss/template/placeholders/_vertical-nav.scss +18 -0
  293. package/src/styles/@core/scss/template/skins/_bordered.scss +36 -0
  294. package/src/styles/@core/scss/template/skins/_index.scss +1 -0
  295. package/src/styles/@layouts/styles/_classes.scss +3 -0
  296. package/src/styles/@layouts/styles/_dashboard-layout.scss +43 -0
  297. package/src/styles/@layouts/styles/_global.scss +10 -0
  298. package/src/styles/@layouts/styles/_mixins.scss +28 -0
  299. package/src/styles/@layouts/styles/_placeholders.scss +53 -0
  300. package/src/styles/@layouts/styles/_rtl.scss +7 -0
  301. package/src/styles/@layouts/styles/_variables.scss +22 -0
  302. package/src/styles/@layouts/styles/index.scss +2 -0
  303. package/src/styles/assets/scss/styles.scss +246 -0
  304. package/src/styles/assets/scss/variables/_template.scss +1 -0
  305. package/src/styles/assets/scss/variables/_vuetify.scss +1 -0
@@ -0,0 +1,759 @@
1
+ <script setup>
2
+ import MultiSelect from "vue-multiselect";
3
+ import { ref, computed, watch, useAttrs } from "vue";
4
+ import { useI18n } from "vue-i18n";
5
+ import { VLabel, VValidation, VListItem, VMessages, VIcon } from "vuetify/components";
6
+ import { client } from "../../utils/client";
7
+ import { generateUniqueId } from "../../utils/utils";
8
+ import { buildQueryString } from "../../utils/queryParams";
9
+ import LoadingBar from "../loading/LoadingBar.vue";
10
+ const { t } = useI18n();
11
+ const guid = generateUniqueId();
12
+ const props = defineProps({
13
+ options: { type: Array, required: false },
14
+ rules: { type: Array, required: false },
15
+ multiple: { type: Boolean, required: false },
16
+ searchable: { type: Boolean, required: false },
17
+ searchInternally: { type: Boolean, required: false },
18
+ querySearchParam: { type: String, required: false, default: "q" },
19
+ disabled: { type: Boolean, required: false },
20
+ required: { type: Boolean, required: false },
21
+ grouped: { type: Boolean, required: false },
22
+ returnObject: { type: Boolean, required: false },
23
+ teleported: { type: Boolean, required: false },
24
+ preselectFirst: { type: Boolean, required: false },
25
+ hideSelected: { type: Boolean, required: false, default: false },
26
+ error: { type: Boolean, required: false },
27
+ modelValue: { type: null, required: false },
28
+ itemLabel: { type: String, required: false },
29
+ groupValues: { type: String, required: false },
30
+ groupLabel: { type: String, required: false },
31
+ trackBy: { type: String, required: false, default: "id" },
32
+ trackByValue: { type: [String, Number, Array], required: false },
33
+ placeholder: { type: String, required: false },
34
+ url: { type: String, required: false },
35
+ label: { type: String, required: false },
36
+ deselectLabel: { type: String, required: false, default: "" },
37
+ selectLabel: { type: String, required: false, default: "" },
38
+ selectedLabel: { type: String, required: false, default: "" },
39
+ errorMessages: { type: String, required: false },
40
+ params: { type: Object, required: false },
41
+ hideDetails: { type: Boolean, required: false, default: false },
42
+ fetchEnabled: { type: Boolean, required: false, default: true },
43
+ isLoading: { type: Boolean, required: false, default: false },
44
+ disableIfEmpty: { type: Boolean, required: false, default: false }
45
+ });
46
+ const defaultOptions = ref(props.options ?? []);
47
+ const displayedOptions = ref(props.options ?? []);
48
+ const loadedValuesHaveBeenSet = ref(false);
49
+ const loading = ref(false);
50
+ const showTeleport = ref(false);
51
+ const search = ref("");
52
+ const inputRef = ref({});
53
+ const errorState = ref(false);
54
+ const isOpen = ref(false);
55
+ const emits = defineEmits(["update:model-value"]);
56
+ const value = computed({
57
+ get() {
58
+ return props.modelValue;
59
+ },
60
+ set(value2) {
61
+ emits("update:model-value", value2);
62
+ }
63
+ });
64
+ const isLoading = computed(() => {
65
+ return props.isLoading || loading.value;
66
+ });
67
+ const params = computed(() => buildQueryString(props.params));
68
+ const elementId = computed(() => {
69
+ const attrs = useAttrs();
70
+ const _elementIdToken = attrs.id || attrs.label;
71
+ return _elementIdToken ? `autocomplete-input-${_elementIdToken}-${guid}` : `autocomplete-input-${_elementIdToken}-${guid}`;
72
+ });
73
+ const internalPlaceholder = computed(() => {
74
+ return props.placeholder ? props.placeholder : t("inputs.placeholder_select", {
75
+ name: props.label ? t(props.label) : ""
76
+ });
77
+ });
78
+ const customPosition = () => {
79
+ const autocompleteInputElement = document.querySelector(`#${elementId.value}`);
80
+ const rect = autocompleteInputElement?.getBoundingClientRect();
81
+ return {
82
+ top: rect?.top || 0,
83
+ left: rect?.left || 0,
84
+ width: rect?.width,
85
+ height: rect?.height
86
+ };
87
+ };
88
+ const normalizeArabic = (text) => {
89
+ if (typeof text === "number") {
90
+ return text.toString();
91
+ }
92
+ return text.trim().replace(/أ|ا|إ|آ/g, "\u0627").replace(/ي|ى|ئ/g, "\u064A").replace(/ة/g, "\u0647");
93
+ };
94
+ const searchArabic = (value2, query) => {
95
+ if (!value2 || !query) {
96
+ return false;
97
+ }
98
+ const normalizedValue = normalizeArabic(value2.toString()).toLowerCase();
99
+ const normalizedQuery = normalizeArabic(query).toLowerCase();
100
+ return normalizedValue.includes(normalizedQuery);
101
+ };
102
+ const customSearch = (query) => {
103
+ search.value = query?.toString().trim() || "";
104
+ };
105
+ const resetTeleportState = () => {
106
+ if (!props.multiple && props.teleported) {
107
+ showTeleport.value = false;
108
+ inputRef.value[`select-input-${elementId.value}`]?.deactivate();
109
+ }
110
+ };
111
+ const closeMenu = () => {
112
+ inputRef.value[`select-input-${elementId.value}`]?.deactivate();
113
+ };
114
+ const getRecords = async (searchQuery) => {
115
+ loading.value = true;
116
+ const params2 = buildQueryString({
117
+ ...props.params,
118
+ ...searchQuery ? { [props.querySearchParam]: searchQuery } : {}
119
+ });
120
+ try {
121
+ const { data } = await client.get(`${props.url}?${params2}`);
122
+ return data;
123
+ } catch (err) {
124
+ return [];
125
+ } finally {
126
+ loading.value = false;
127
+ }
128
+ };
129
+ const fetchAndUpdateRecords = async (searchQuery) => {
130
+ displayedOptions.value = await getRecords(searchQuery);
131
+ };
132
+ watch(
133
+ [() => props.trackByValue, defaultOptions],
134
+ async ([trackByValue, _defaultOptions]) => {
135
+ if (!trackByValue || _defaultOptions.length === 0 || loadedValuesHaveBeenSet.value) {
136
+ return;
137
+ }
138
+ loadedValuesHaveBeenSet.value = true;
139
+ const loadedValues = Array.isArray(trackByValue) ? trackByValue : [trackByValue];
140
+ let items = _defaultOptions.flatMap((option) => props.grouped ? option.children : [option]);
141
+ const missingIds = loadedValues.filter((value2) => !items.some((item) => item?.[props.trackBy] == value2));
142
+ if (missingIds.length > 0 && props.url) {
143
+ const fetchedItems = await Promise.all(missingIds.map((id) => getRecords(id)));
144
+ if (fetchedItems.length > 0) {
145
+ items = items.concat(fetchedItems.flat());
146
+ }
147
+ }
148
+ const optionsToSelect = loadedValues.map((value2) => items.find((item) => item?.[props.trackBy] == value2)).filter(Boolean);
149
+ if (optionsToSelect.length > 0) {
150
+ emits("update:model-value", optionsToSelect);
151
+ }
152
+ },
153
+ {
154
+ immediate: true
155
+ }
156
+ );
157
+ watch(() => props.errorMessages, () => {
158
+ if (props.errorMessages && props.errorMessages.length > 0) {
159
+ errorState.value = true;
160
+ }
161
+ }, {
162
+ deep: true,
163
+ immediate: true
164
+ });
165
+ watch(() => params.value, (value2) => {
166
+ if (value2) {
167
+ fetchAndUpdateRecords();
168
+ }
169
+ });
170
+ const filteredOptions = computed(() => {
171
+ if (!search.value) {
172
+ return displayedOptions.value;
173
+ }
174
+ return displayedOptions.value?.map((entry) => {
175
+ if (props.grouped) {
176
+ const matchingChildren = entry?.children?.filter((child) => {
177
+ const childValue = typeof child === "object" && child !== null && "name" in child ? child.name : child;
178
+ return searchArabic(childValue?.toString() ?? "", search.value);
179
+ });
180
+ if (matchingChildren && matchingChildren.length > 0) {
181
+ return {
182
+ ...entry,
183
+ children: matchingChildren
184
+ };
185
+ }
186
+ return null;
187
+ }
188
+ const entryValue = typeof entry === "object" && entry !== null && "name" in entry ? entry.name : entry;
189
+ return searchArabic(entryValue?.toString() || "", search.value) ? entry : null;
190
+ }).filter(Boolean);
191
+ });
192
+ const disableIfNoOptions = computed(() => filteredOptions.value.length === 0 && props.disableIfEmpty);
193
+ watch(() => props.url, async () => {
194
+ if (props.fetchEnabled && props.url) {
195
+ const options = await getRecords();
196
+ defaultOptions.value = options;
197
+ displayedOptions.value = options;
198
+ }
199
+ }, {
200
+ immediate: true
201
+ });
202
+ watch(() => props.options, () => {
203
+ if (props.options && props.options.length > 0) {
204
+ defaultOptions.value = props.options;
205
+ displayedOptions.value = props.options;
206
+ }
207
+ }, {
208
+ deep: true,
209
+ immediate: true
210
+ });
211
+ defineExpose({
212
+ records: defaultOptions,
213
+ internalOptions: filteredOptions,
214
+ loading: isLoading
215
+ });
216
+ </script>
217
+
218
+ <template>
219
+ <div :id="elementId" class="d-flex flex-column w-100">
220
+ <VLabel
221
+ v-if="label"
222
+ class="text-body-2 text-high-emphasis mb-2"
223
+ :text="t(label)"
224
+ />
225
+
226
+ <Teleport v-if="teleported && showTeleport" to="body">
227
+ <VValidation
228
+ v-slot="{ errorMessages: validationErrors, isValid }"
229
+ v-model="value"
230
+ :rules="rules"
231
+ validate-on="input lazy"
232
+ >
233
+ <MultiSelect
234
+ v-model="value"
235
+ :options="filteredOptions"
236
+ :multiple="multiple"
237
+ :close-on-select="multiple ? false : true"
238
+ :searchable="searchable"
239
+ :internal-search="false"
240
+ :preselect-first="preselectFirst"
241
+ :disabled="disabled || disableIfNoOptions"
242
+ :required="required"
243
+ :group-select="grouped"
244
+ :group-values="groupValues"
245
+ :group-label="groupLabel"
246
+ class="app-custom-input position-absolute app-z-7 app-custom-input-teleport"
247
+ :class="{
248
+ 'app-custom-input-error': error || isValid.value === false || errorState
249
+ }"
250
+ :style="{
251
+ left: `${customPosition().left}px`,
252
+ top: `${customPosition().top}px`,
253
+ width: `${customPosition().width}px`,
254
+ height: `${customPosition().height}px`
255
+ }"
256
+ :label="itemLabel"
257
+ :track-by="trackBy"
258
+ :placeholder="value && value.length > 0 ? '' : internalPlaceholder || t('inputs.placeholder_select')"
259
+ :show-labels="false"
260
+ :clear-on-select="true"
261
+ :show-no-options="isLoading ? false : true"
262
+ :show-no-results="isLoading ? false : true"
263
+ :deselect-label="deselectLabel"
264
+ :hide-selected="hideSelected"
265
+ :select-label="selectLabel"
266
+ :selected-label="selectedLabel"
267
+ :value="value"
268
+ @search-change="searchInternally ? customSearch($event) : fetchAndUpdateRecords($event)"
269
+ @select="errorState = false, resetTeleportState()"
270
+ >
271
+ <template #caret>
272
+ <span class="multiselect-arrow">
273
+ <VIcon class="icon" size="19">tabler-chevron-down</VIcon>
274
+ </span>
275
+ </template>
276
+
277
+ <template v-if="grouped" #option="{ option }">
278
+ <VListItem
279
+ v-if="option.$isLabel"
280
+ class="app-group-category-title pa-0"
281
+ >
282
+ {{ option.$groupLabel }}
283
+ </VListItem>
284
+
285
+ <VListItem v-else class="pa-0 w-100" :title="option.name">
286
+ <template #title>
287
+ <div class="d-flex flex-column text-wrap">
288
+ <p class="ma-0 app-font-size-13">
289
+ {{ option.name }}
290
+ </p>
291
+ <span v-if="option?.description" class="text-gray-600 app-font-size-13">({{ option?.description }})</span>
292
+ </div>
293
+ </template>
294
+
295
+ <template #prepend>
296
+ <img
297
+ v-if="option?.svg_icon_url"
298
+ :src="option?.svg_icon_url"
299
+ width="65"
300
+ class="me-2"
301
+ >
302
+ </template>
303
+ </VListItem>
304
+ </template>
305
+
306
+ <template #clear>
307
+ <div
308
+ v-if="(Array.isArray(value) && value?.length > 0 || value) && value && !disabled"
309
+ class="multiselect-clear cursor-pointer"
310
+ @mousedown.prevent.stop="value = null"
311
+ >
312
+ <VIcon class="icon" size="19">
313
+ tabler-x
314
+ </VIcon>
315
+ </div>
316
+ </template>
317
+
318
+ <template #noResult>
319
+ <span class="app-font-size-13 text-center w-100">{{ t("no_data") }}</span>
320
+ </template>
321
+
322
+ <template #noOptions>
323
+ <span class="app-font-size-13 text-center w-100">{{ t("no_data") }}</span>
324
+ </template>
325
+
326
+ <template v-if="isLoading" #beforeList>
327
+ <div class="app-h-50px w-100">
328
+ <LoadingBar
329
+ :is-loading="isLoading"
330
+ />
331
+ </div>
332
+ </template>
333
+
334
+ <template #afterList />
335
+
336
+ <template
337
+ v-for="(_, name) in $slots"
338
+ #[name]="slotProps"
339
+ >
340
+ <slot
341
+ :name="name"
342
+ v-bind="slotProps || {}"
343
+ />
344
+ </template>
345
+ </MultiSelect>
346
+ <VMessages
347
+ v-if="!hideDetails"
348
+ class="mt-1"
349
+ :messages="[validationErrors.value, errorMessages]"
350
+ :active="isValid.value === false || errorMessages?.length !== 0"
351
+ />
352
+ </VValidation>
353
+ </Teleport>
354
+
355
+ <VValidation
356
+ v-slot="{ errorMessages: validationErrors, isValid }"
357
+ v-model="value"
358
+ :rules="rules"
359
+ validate-on="input lazy"
360
+ >
361
+ <div class="d-flex h-100 position-relative">
362
+ <div v-if="isOpen" class="w-100 h-100 position-absolute app-z-11" @click="closeMenu" />
363
+ <MultiSelect
364
+ :ref="el => inputRef[`select-input-${elementId}`] = el"
365
+ v-model="value"
366
+ :options="filteredOptions"
367
+ :multiple="multiple"
368
+ :close-on-select="multiple ? false : true"
369
+ :searchable="searchable"
370
+ :internal-search="false"
371
+ :preselect-first="preselectFirst"
372
+ :disabled="disabled || disableIfNoOptions"
373
+ :required="required"
374
+ :group-select="grouped"
375
+ :group-values="groupValues"
376
+ :group-label="groupLabel"
377
+ class="app-custom-input"
378
+ :class="{
379
+ 'app-custom-input-error': error || isValid.value === false || errorState,
380
+ 'app-teleport-clone': teleported
381
+ }"
382
+ style="margin-top: 2px;"
383
+ :label="itemLabel"
384
+ :track-by="trackBy"
385
+ :placeholder="value && value?.length > 0 ? '' : internalPlaceholder || t('inputs.placeholder_select')"
386
+ :show-labels="false"
387
+ :clear-on-select="true"
388
+ :show-no-options="isLoading ? false : true"
389
+ :show-no-results="isLoading ? false : true"
390
+ :deselect-label="deselectLabel"
391
+ :hide-selected="hideSelected"
392
+ :select-label="selectLabel"
393
+ :selected-label="selectedLabel"
394
+ @open="showTeleport = true, isOpen = true"
395
+ @close="showTeleport = false, isOpen = false"
396
+ @search-change="searchInternally ? customSearch($event) : fetchAndUpdateRecords($event)"
397
+ @select="errorState = false, resetTeleportState()"
398
+ >
399
+ <template #caret>
400
+ <span class="multiselect-arrow">
401
+ <VIcon class="icon" size="19">tabler-chevron-down</VIcon>
402
+ </span>
403
+ </template>
404
+
405
+ <template v-if="grouped" #option="{ option }">
406
+ <VListItem
407
+ v-if="option.$isLabel"
408
+ class="app-group-category-title pa-0"
409
+ >
410
+ {{ option.$groupLabel }}
411
+ </VListItem>
412
+ <VListItem
413
+ v-else
414
+ class="pa-0 w-100"
415
+ :title="option.name"
416
+ >
417
+ <template #title>
418
+ <div class="d-flex flex-column text-wrap">
419
+ <p class="ma-0 app-font-size-13">
420
+ {{ option.name }}
421
+ </p>
422
+ <span v-if="option?.description" class="text-gray-600 app-font-size-13">({{ option?.description }})</span>
423
+ </div>
424
+ </template>
425
+
426
+ <template #prepend>
427
+ <img
428
+ v-if="option?.svg_icon_url"
429
+ :src="option?.svg_icon_url"
430
+ width="65"
431
+ class="me-2"
432
+ >
433
+ </template>
434
+ </VListItem>
435
+ </template>
436
+
437
+ <template #clear>
438
+ <div
439
+ v-if="!disabled && Array.isArray(value) && value.length > 0"
440
+ class="multiselect-clear cursor-pointer"
441
+ @mousedown.prevent.stop="value = null"
442
+ >
443
+ <VIcon class="icon" size="19">
444
+ tabler-x
445
+ </VIcon>
446
+ </div>
447
+ </template>
448
+
449
+ <template #noResult>
450
+ <span class="app-font-size-13 text-center w-100">{{ t("no_data") }}</span>
451
+ </template>
452
+
453
+ <template #noOptions>
454
+ <span class="app-font-size-13 text-center w-100">{{ t("no_data") }}</span>
455
+ </template>
456
+
457
+ <template v-if="isLoading" #beforeList>
458
+ <div class="app-h-50px w-100">
459
+ <LoadingBar
460
+ :is-loading="isLoading"
461
+ />
462
+ </div>
463
+ </template>
464
+
465
+ <template
466
+ v-for="(_, name) in $slots"
467
+ #[name]="slotProps"
468
+ >
469
+ <slot
470
+ :name="name"
471
+ v-bind="slotProps || {}"
472
+ />
473
+ </template>
474
+ </MultiSelect>
475
+ </div>
476
+ <VMessages
477
+ v-if="!hideDetails"
478
+ class="mt-1"
479
+ :messages="[validationErrors.value, errorMessages]"
480
+ :active="isValid.value === false || errorMessages?.length !== 0"
481
+ />
482
+ </VValidation>
483
+ </div>
484
+ </template>
485
+
486
+ <style src="vue-multiselect/dist/vue-multiselect.min.css">
487
+
488
+ </style>
489
+
490
+ <style>
491
+ .app-custom-input-teleport .multiselect__tags {
492
+ display: none !important;
493
+ height: 100%;
494
+ display: flex;
495
+ align-items: center;
496
+ cursor: pointer;
497
+ padding-top: 0;
498
+ }
499
+ .app-custom-input-teleport .multiselect-arrow {
500
+ display: none !important;
501
+ }
502
+ .app-custom-input-teleport .multiselect__placeholder {
503
+ margin: 0;
504
+ padding-top: 0;
505
+ }
506
+ .app-custom-input-teleport .multiselect__content-wrapper {
507
+ margin-top: 53px;
508
+ z-index: 10;
509
+ display: block !important;
510
+ }
511
+
512
+ .app-teleport-clone .multiselect__tags {
513
+ height: 100%;
514
+ display: flex;
515
+ align-items: center;
516
+ cursor: pointer;
517
+ padding-top: 0;
518
+ }
519
+ .app-teleport-clone .multiselect__placeholder {
520
+ margin: 0;
521
+ padding-top: 0;
522
+ }
523
+ .app-teleport-clone .multiselect__content-wrapper {
524
+ display: none !important;
525
+ }
526
+
527
+ .app-custom-input .multiselect__placeholder {
528
+ display: flex;
529
+ align-items: center;
530
+ height: 21px;
531
+ line-height: 21px;
532
+ font-weight: 400;
533
+ font-size: 13px;
534
+ margin: 0px;
535
+ padding: 0;
536
+ padding-inline-start: 5px;
537
+ color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity));
538
+ }
539
+ .app-custom-input .multiselect__tags {
540
+ transition: all 0.3s;
541
+ border: 1px solid rgba(var(--v-border-color), 0.29);
542
+ font-size: 13px !important;
543
+ background-color: rgba(var(--v-theme-surface));
544
+ font-weight: 100 !important;
545
+ min-height: 43px;
546
+ border-radius: 6px;
547
+ }
548
+ .app-custom-input .multiselect__tags:hover {
549
+ transition: all 0.3s;
550
+ border: 1px solid rgba(var(--v-border-color), 0.8);
551
+ }
552
+ .app-custom-input:focus .multiselect__tags, .app-custom-input:focus-within .multiselect__tags {
553
+ border-color: rgba(var(--v-theme-primary)) !important;
554
+ }
555
+ .app-custom-input:focus .multiselect-clear, .app-custom-input:focus-within .multiselect-clear {
556
+ opacity: 1;
557
+ }
558
+
559
+ .multiselect__content-wrapper {
560
+ padding: 4px 0;
561
+ border-color: rgba(var(--v-border-color), var(--v-border-opacity));
562
+ border-style: solid;
563
+ border-width: 0;
564
+ box-shadow: 0 0px 9px rgba(var(--v-shadow-key-umbra-color), 0.3), 0 0 transparent, 0 0 transparent !important;
565
+ border-radius: 6px;
566
+ background: rgba(var(--v-theme-surface));
567
+ color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity));
568
+ }
569
+
570
+ .multiselect__input {
571
+ display: none;
572
+ height: 21px;
573
+ line-height: 21px;
574
+ font-size: 13px;
575
+ font-weight: 400;
576
+ text-align: start;
577
+ margin: 0px;
578
+ padding: 0;
579
+ padding-inline-start: 5px;
580
+ border-radius: 0px;
581
+ background-color: rgba(var(--v-theme-surface));
582
+ }
583
+
584
+ .multiselect--active .multiselect__input {
585
+ display: flex !important;
586
+ align-items: center !important;
587
+ justify-content: center !important;
588
+ }
589
+
590
+ [dir=rtl] .multiselect__input {
591
+ inset-inline-start: 0px !important;
592
+ }
593
+
594
+ .app-custom-input-error .multiselect__tags {
595
+ border: 1px solid rgba(var(--v-border-color), var(--v-border-opacity));
596
+ border-color: rgba(var(--v-theme-error)) !important;
597
+ }
598
+
599
+ .multiselect--disabled {
600
+ opacity: 1;
601
+ background: transparent !important;
602
+ }
603
+ .multiselect--disabled .multiselect__tags {
604
+ border: 1px solid rgba(var(--v-border-color), var(--v-border-opacity)) !important;
605
+ background: rgb(var(--v-disabled-background)) !important;
606
+ }
607
+ .multiselect--disabled .multiselect__placeholder {
608
+ background-color: rgb(var(--v-disabled-background));
609
+ }
610
+ .multiselect--disabled .multiselect-arrow {
611
+ display: none;
612
+ }
613
+ .multiselect--disabled .multiselect-arrow .icon {
614
+ background: rgb(var(--v-disabled-background)) !important;
615
+ }
616
+ .multiselect--disabled .multiselect__spinner, .multiselect--disabled .multiselect__single {
617
+ background: rgb(var(--v-disabled-background)) !important;
618
+ }
619
+
620
+ .multiselect__single {
621
+ font-size: 13px;
622
+ background-color: rgba(var(--v-theme-surface));
623
+ color: rgba(var(--v-theme-on-surface));
624
+ padding-top: 2px;
625
+ padding-inline-start: 8px;
626
+ }
627
+
628
+ .multiselect--active .multiselect-arrow .icon {
629
+ transition: all 0.3s;
630
+ transform: rotate(180deg);
631
+ }
632
+
633
+ .icon {
634
+ transition: all 0.3s;
635
+ transform: rotate(0deg);
636
+ color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)) !important;
637
+ background: rgb(var(--v-theme-surface));
638
+ }
639
+
640
+ .multiselect-arrow {
641
+ position: absolute;
642
+ top: 50%;
643
+ inset-inline-end: 10px !important;
644
+ transform: translateY(-50%);
645
+ }
646
+
647
+ .multiselect-clear {
648
+ position: absolute;
649
+ top: 50%;
650
+ margin: 0;
651
+ display: flex;
652
+ align-items: center;
653
+ justify-items: center;
654
+ transform: translateY(-50%);
655
+ inset-inline-end: 10px !important;
656
+ opacity: 1;
657
+ transition: all 0.3s;
658
+ z-index: 12;
659
+ }
660
+
661
+ .multiselect__tag {
662
+ background: rgb(var(--v-theme-surface-variant));
663
+ color: rgb(var(--v-theme-on-surface-variant));
664
+ margin-top: 2px;
665
+ }
666
+
667
+ .multiselect__tag-icon::after {
668
+ color: rgb(var(--v-theme-on-surface-variant));
669
+ }
670
+
671
+ .multiselect__content {
672
+ font-size: 13px !important;
673
+ padding: 6px;
674
+ }
675
+
676
+ .multiselect__option {
677
+ align-items: center;
678
+ display: grid;
679
+ flex: none;
680
+ outline: none;
681
+ max-width: 100%;
682
+ padding: 4px 20px;
683
+ position: relative;
684
+ margin-block: 0.25rem;
685
+ text-decoration: none;
686
+ border-color: rgba(var(--v-border-color), var(--v-border-opacity));
687
+ border-style: solid;
688
+ border-width: 0;
689
+ border-radius: 0;
690
+ color: rgba(var(--v-theme-on-surface)) !important;
691
+ width: 100% !important;
692
+ text-wrap: wrap;
693
+ }
694
+
695
+ .multiselect__option--highlight {
696
+ background: rgb(var(--v-theme-surface)) !important;
697
+ color: rgb(var(--v-theme-on-primary));
698
+ border-radius: 8px;
699
+ transition: all 0.3s;
700
+ }
701
+ .multiselect__option--highlight:hover {
702
+ background: rgb(var(--v-theme-gray-200)) !important;
703
+ }
704
+
705
+ .multiselect__option--selected {
706
+ border-radius: 8px;
707
+ background: rgb(var(--v-nav-background)) !important;
708
+ color: rgb(var(--v-theme-on-primary));
709
+ }
710
+
711
+ .multiselect__spinner {
712
+ top: 50%;
713
+ inset-inline-end: 4px !important;
714
+ transform: translate(0%, -50%);
715
+ }
716
+ .multiselect__spinner::after {
717
+ border-color: rgba(var(--v-theme-primary)) transparent transparent !important;
718
+ }
719
+ .multiselect__spinner::before {
720
+ border-color: rgba(var(--v-theme-primary)) transparent transparent !important;
721
+ }
722
+
723
+ .multiselect__option--selected {
724
+ font-weight: inherit !important;
725
+ }
726
+
727
+ .multiselect__input::placeholder {
728
+ color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity));
729
+ }
730
+
731
+ .multiselect__option--group, .app-group-category-title {
732
+ background-color: rgb(var(--v-theme-gray-100)) !important;
733
+ border-radius: 8px !important;
734
+ color: rgba(var(--v-theme-dark-gray)) !important;
735
+ pointer-events: none;
736
+ font-size: 13px !important;
737
+ width: 100% !important;
738
+ font-weight: 700;
739
+ }
740
+
741
+ .multiselect--active .multiselect__placeholder {
742
+ display: inline-block;
743
+ }
744
+
745
+ .multiselect--active {
746
+ z-index: unset;
747
+ }
748
+
749
+ .multiselect__tags-wrap {
750
+ position: relative;
751
+ }
752
+ .multiselect__tags-wrap .multiselect__tag {
753
+ z-index: 12 !important;
754
+ }
755
+ </style>
756
+
757
+ <style scoped>
758
+ :deep(.v-list-item){min-height:auto}
759
+ </style>