@winchsa/ui 0.1.31 → 0.1.33

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