@winchsa/ui 0.1.33 → 0.1.35

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/dist/components/Breadcrumbs.d.vue.ts +7 -0
  2. package/dist/components/Breadcrumbs.vue +46 -0
  3. package/dist/components/Breadcrumbs.vue.d.ts +7 -0
  4. package/dist/components/CustomizerSection.d.vue.ts +17 -0
  5. package/dist/components/CustomizerSection.vue +19 -0
  6. package/dist/components/CustomizerSection.vue.d.ts +17 -0
  7. package/dist/components/DialogCloseBtn.d.vue.ts +7 -0
  8. package/dist/components/DialogCloseBtn.vue +20 -0
  9. package/dist/components/DialogCloseBtn.vue.d.ts +7 -0
  10. package/dist/components/Drawer.d.vue.ts +28 -0
  11. package/dist/components/Drawer.vue +60 -0
  12. package/dist/components/Drawer.vue.d.ts +28 -0
  13. package/dist/components/IconBtn.d.vue.ts +18 -0
  14. package/dist/components/IconBtn.vue +24 -0
  15. package/dist/components/IconBtn.vue.d.ts +18 -0
  16. package/dist/components/LoadingBar.d.vue.ts +6 -0
  17. package/dist/components/LoadingBar.vue +31 -0
  18. package/dist/components/LoadingBar.vue.d.ts +6 -0
  19. package/dist/components/LoadingDialog.d.vue.ts +12 -0
  20. package/dist/components/LoadingDialog.vue +41 -0
  21. package/dist/components/LoadingDialog.vue.d.ts +12 -0
  22. package/dist/components/LoadingItem.d.vue.ts +25 -0
  23. package/dist/components/LoadingItem.vue +66 -0
  24. package/dist/components/LoadingItem.vue.d.ts +25 -0
  25. package/dist/components/Modal.d.vue.ts +50 -0
  26. package/dist/components/Modal.vue +155 -0
  27. package/dist/components/Modal.vue.d.ts +50 -0
  28. package/dist/components/MoreBtn.d.vue.ts +17 -0
  29. package/dist/components/MoreBtn.vue +28 -0
  30. package/dist/components/MoreBtn.vue.d.ts +17 -0
  31. package/dist/components/ScrollToTop.d.vue.ts +3 -0
  32. package/dist/components/ScrollToTop.vue +39 -0
  33. package/dist/components/ScrollToTop.vue.d.ts +3 -0
  34. package/dist/components/SiteTitle.d.vue.ts +3 -0
  35. package/dist/components/SiteTitle.vue +14 -0
  36. package/dist/components/SiteTitle.vue.d.ts +3 -0
  37. package/dist/components/Toaster.d.vue.ts +6 -0
  38. package/dist/components/Toaster.vue +19 -0
  39. package/dist/components/Toaster.vue.d.ts +6 -0
  40. package/dist/components/cards/AppCard.d.vue.ts +18 -0
  41. package/dist/components/cards/AppCard.vue +45 -0
  42. package/dist/components/cards/AppCard.vue.d.ts +18 -0
  43. package/dist/components/cards/AppCardActions.d.vue.ts +33 -0
  44. package/dist/components/cards/AppCardActions.vue +126 -0
  45. package/dist/components/cards/AppCardActions.vue.d.ts +33 -0
  46. package/dist/components/cards/CardStatisticsHorizontal.d.vue.ts +9 -0
  47. package/dist/components/cards/CardStatisticsHorizontal.vue +29 -0
  48. package/dist/components/cards/CardStatisticsHorizontal.vue.d.ts +9 -0
  49. package/dist/components/cards/CheckboxesCard.d.vue.ts +18 -0
  50. package/dist/components/cards/CheckboxesCard.vue +108 -0
  51. package/dist/components/cards/CheckboxesCard.vue.d.ts +18 -0
  52. package/dist/components/cards/HeaderCard.d.vue.ts +9 -0
  53. package/dist/components/cards/HeaderCard.vue +31 -0
  54. package/dist/components/cards/HeaderCard.vue.d.ts +9 -0
  55. package/dist/components/cards/ImageCard.d.vue.ts +33 -0
  56. package/dist/components/cards/ImageCard.vue +73 -0
  57. package/dist/components/cards/ImageCard.vue.d.ts +33 -0
  58. package/dist/components/cards/InputCard.d.vue.ts +21 -0
  59. package/dist/components/cards/InputCard.vue +60 -0
  60. package/dist/components/cards/InputCard.vue.d.ts +21 -0
  61. package/dist/components/cards/StaticCard.d.vue.ts +21 -0
  62. package/dist/components/cards/StaticCard.vue +37 -0
  63. package/dist/components/cards/StaticCard.vue.d.ts +21 -0
  64. package/dist/components/forms/Accordion.d.vue.ts +19 -0
  65. package/dist/components/forms/Accordion.vue +43 -0
  66. package/dist/components/forms/Accordion.vue.d.ts +19 -0
  67. package/dist/components/forms/AppBarSearch.d.vue.ts +43 -0
  68. package/dist/components/forms/AppBarSearch.vue +345 -0
  69. package/dist/components/forms/AppBarSearch.vue.d.ts +43 -0
  70. package/dist/components/forms/AppCombobox.d.vue.ts +13 -0
  71. package/dist/components/forms/AppCombobox.vue +60 -0
  72. package/dist/components/forms/AppCombobox.vue.d.ts +13 -0
  73. package/dist/components/forms/AppDrawerHeaderSection.d.vue.ts +20 -0
  74. package/dist/components/forms/AppDrawerHeaderSection.vue +21 -0
  75. package/dist/components/forms/AppDrawerHeaderSection.vue.d.ts +20 -0
  76. package/dist/components/forms/AppLabel.d.vue.ts +24 -0
  77. package/dist/components/forms/AppLabel.vue +47 -0
  78. package/dist/components/forms/AppLabel.vue.d.ts +24 -0
  79. package/dist/components/forms/AppLink.d.vue.ts +19 -0
  80. package/dist/components/forms/AppLink.vue +50 -0
  81. package/dist/components/forms/AppLink.vue.d.ts +19 -0
  82. package/dist/components/forms/AppNumberField.d.vue.ts +20 -0
  83. package/dist/components/forms/AppNumberField.vue +79 -0
  84. package/dist/components/forms/AppNumberField.vue.d.ts +20 -0
  85. package/dist/components/forms/AppOtpInput.d.vue.ts +13 -0
  86. package/dist/components/forms/AppOtpInput.vue +84 -0
  87. package/dist/components/forms/AppOtpInput.vue.d.ts +13 -0
  88. package/dist/components/forms/AppSearchHeader.d.vue.ts +8 -0
  89. package/dist/components/forms/AppSearchHeader.vue +72 -0
  90. package/dist/components/forms/AppSearchHeader.vue.d.ts +8 -0
  91. package/dist/components/forms/AppSelect.d.vue.ts +21 -0
  92. package/dist/components/forms/AppSelect.vue +94 -0
  93. package/dist/components/forms/AppSelect.vue.d.ts +21 -0
  94. package/dist/components/forms/AppStepper.d.vue.ts +21 -0
  95. package/dist/components/forms/AppStepper.vue +232 -0
  96. package/dist/components/forms/AppStepper.vue.d.ts +21 -0
  97. package/dist/components/forms/AppSwitch.d.vue.ts +18 -0
  98. package/dist/components/forms/AppSwitch.vue +60 -0
  99. package/dist/components/forms/AppSwitch.vue.d.ts +18 -0
  100. package/dist/components/forms/AppTextField.d.vue.ts +17 -0
  101. package/dist/components/forms/AppTextField.vue +62 -0
  102. package/dist/components/forms/AppTextField.vue.d.ts +17 -0
  103. package/dist/components/forms/AppTextarea.d.vue.ts +17 -0
  104. package/dist/components/forms/AppTextarea.vue +65 -0
  105. package/dist/components/forms/AppTextarea.vue.d.ts +17 -0
  106. package/dist/components/forms/AttachmentCropperInput.d.vue.ts +18 -0
  107. package/dist/components/forms/AttachmentCropperInput.vue +227 -0
  108. package/dist/components/forms/AttachmentCropperInput.vue.d.ts +18 -0
  109. package/dist/components/forms/AttachmentInput.d.vue.ts +16 -0
  110. package/dist/components/forms/AttachmentInput.vue +116 -0
  111. package/dist/components/forms/AttachmentInput.vue.d.ts +16 -0
  112. package/dist/components/forms/AutocompleteInput.d.vue.ts +86 -0
  113. package/dist/components/forms/AutocompleteInput.vue +778 -0
  114. package/dist/components/forms/AutocompleteInput.vue.d.ts +86 -0
  115. package/dist/components/forms/BankSelect.d.vue.ts +21 -0
  116. package/dist/components/forms/BankSelect.vue +43 -0
  117. package/dist/components/forms/BankSelect.vue.d.ts +21 -0
  118. package/dist/components/forms/BaseButton.d.vue.ts +20 -0
  119. package/dist/components/forms/BaseButton.vue +42 -0
  120. package/dist/components/forms/BaseButton.vue.d.ts +20 -0
  121. package/dist/components/forms/CounterInput.d.vue.ts +13 -0
  122. package/dist/components/forms/CounterInput.vue +71 -0
  123. package/dist/components/forms/CounterInput.vue.d.ts +13 -0
  124. package/dist/components/forms/CustomCheckboxes.d.vue.ts +25 -0
  125. package/dist/components/forms/CustomCheckboxes.vue +69 -0
  126. package/dist/components/forms/CustomCheckboxes.vue.d.ts +25 -0
  127. package/dist/components/forms/CustomCheckboxesWithIcon.d.vue.ts +25 -0
  128. package/dist/components/forms/CustomCheckboxesWithIcon.vue +80 -0
  129. package/dist/components/forms/CustomCheckboxesWithIcon.vue.d.ts +25 -0
  130. package/dist/components/forms/CustomCheckboxesWithImage.d.vue.ts +16 -0
  131. package/dist/components/forms/CustomCheckboxesWithImage.vue +67 -0
  132. package/dist/components/forms/CustomCheckboxesWithImage.vue.d.ts +16 -0
  133. package/dist/components/forms/CustomRadios.d.vue.ts +25 -0
  134. package/dist/components/forms/CustomRadios.vue +69 -0
  135. package/dist/components/forms/CustomRadios.vue.d.ts +25 -0
  136. package/dist/components/forms/CustomRadiosWithIcon.d.vue.ts +28 -0
  137. package/dist/components/forms/CustomRadiosWithIcon.vue +98 -0
  138. package/dist/components/forms/CustomRadiosWithIcon.vue.d.ts +28 -0
  139. package/dist/components/forms/CustomRadiosWithImage.d.vue.ts +35 -0
  140. package/dist/components/forms/CustomRadiosWithImage.vue +69 -0
  141. package/dist/components/forms/CustomRadiosWithImage.vue.d.ts +35 -0
  142. package/dist/components/forms/DatePicker.d.vue.ts +29 -0
  143. package/dist/components/forms/DatePicker.vue +392 -0
  144. package/dist/components/forms/DatePicker.vue.d.ts +29 -0
  145. package/dist/components/forms/DatePickerRange.d.vue.ts +24 -0
  146. package/dist/components/forms/DatePickerRange.vue +127 -0
  147. package/dist/components/forms/DatePickerRange.vue.d.ts +24 -0
  148. package/dist/components/forms/DraggedUploadFile.d.vue.ts +11 -0
  149. package/dist/components/forms/DraggedUploadFile.vue +120 -0
  150. package/dist/components/forms/DraggedUploadFile.vue.d.ts +11 -0
  151. package/dist/components/forms/ImageCardInput.d.vue.ts +35 -0
  152. package/dist/components/forms/ImageCardInput.vue +234 -0
  153. package/dist/components/forms/ImageCardInput.vue.d.ts +35 -0
  154. package/dist/components/forms/InputValidationWrapper.d.vue.ts +26 -0
  155. package/dist/components/forms/InputValidationWrapper.vue +24 -0
  156. package/dist/components/forms/InputValidationWrapper.vue.d.ts +26 -0
  157. package/dist/components/forms/LicensePlateInput.d.vue.ts +21 -0
  158. package/dist/components/forms/LicensePlateInput.vue +175 -0
  159. package/dist/components/forms/LicensePlateInput.vue.d.ts +21 -0
  160. package/dist/components/forms/ManualDate.d.vue.ts +20 -0
  161. package/dist/components/forms/ManualDate.vue +264 -0
  162. package/dist/components/forms/ManualDate.vue.d.ts +20 -0
  163. package/dist/components/forms/MobileInput.d.vue.ts +25 -0
  164. package/dist/components/forms/MobileInput.vue +118 -0
  165. package/dist/components/forms/MobileInput.vue.d.ts +25 -0
  166. package/dist/components/forms/PasswordInput.d.vue.ts +11 -0
  167. package/dist/components/forms/PasswordInput.vue +29 -0
  168. package/dist/components/forms/PasswordInput.vue.d.ts +11 -0
  169. package/dist/components/forms/RangeInput.d.vue.ts +10 -0
  170. package/dist/components/forms/RangeInput.vue +48 -0
  171. package/dist/components/forms/RangeInput.vue.d.ts +10 -0
  172. package/dist/components/forms/Tabs.d.vue.ts +23 -0
  173. package/dist/components/forms/Tabs.vue +35 -0
  174. package/dist/components/forms/Tabs.vue.d.ts +23 -0
  175. package/dist/components/forms/TimePicker.d.vue.ts +18 -0
  176. package/dist/components/forms/TimePicker.vue +370 -0
  177. package/dist/components/forms/TimePicker.vue.d.ts +18 -0
  178. package/dist/components/table/DataTable.d.vue.ts +70 -0
  179. package/dist/components/table/DataTable.vue +361 -0
  180. package/dist/components/table/DataTable.vue.d.ts +70 -0
  181. package/dist/components/table/EditableDataTable.d.vue.ts +21 -0
  182. package/dist/components/table/EditableDataTable.vue +330 -0
  183. package/dist/components/table/EditableDataTable.vue.d.ts +21 -0
  184. package/dist/components/table/EditableDataTableRow.d.vue.ts +20 -0
  185. package/dist/components/table/EditableDataTableRow.vue +252 -0
  186. package/dist/components/table/EditableDataTableRow.vue.d.ts +20 -0
  187. package/dist/components/table/FilterGenerator.d.vue.ts +13 -0
  188. package/dist/components/table/FilterGenerator.vue +231 -0
  189. package/dist/components/table/FilterGenerator.vue.d.ts +13 -0
  190. package/dist/components/table/StaticTable.d.vue.ts +34 -0
  191. package/dist/components/table/StaticTable.vue +152 -0
  192. package/dist/components/table/StaticTable.vue.d.ts +34 -0
  193. package/dist/components/table/TablePagination.d.vue.ts +15 -0
  194. package/dist/components/table/TablePagination.vue +73 -0
  195. package/dist/components/table/TablePagination.vue.d.ts +15 -0
  196. package/dist/composables/useIsMobile.d.ts +1 -0
  197. package/dist/composables/useIsMobile.js +10 -0
  198. package/dist/composables/useIsMobile.mjs +4 -0
  199. package/dist/composables/useTableFilters.d.ts +23 -0
  200. package/dist/composables/useTableFilters.js +197 -0
  201. package/dist/composables/useTableFilters.mjs +184 -0
  202. package/dist/images/avatar.png +0 -0
  203. package/dist/images/sa.svg +1 -0
  204. package/dist/index.d.ts +65 -0
  205. package/dist/index.js +454 -0
  206. package/dist/index.mjs +130 -0
  207. package/dist/lang/ar.json +54 -0
  208. package/dist/lang/en.json +54 -0
  209. package/dist/styles/assets/scss/variables/_template.scss +1 -0
  210. package/dist/styles/assets/scss/variables/_vuetify.scss +1 -0
  211. package/dist/styles/core/base/_components.scss +164 -0
  212. package/dist/styles/core/base/_dark.scss +16 -0
  213. package/dist/styles/core/base/_default-layout-w-vertical-nav.scss +106 -0
  214. package/dist/styles/core/base/_default-layout.scss +16 -0
  215. package/dist/styles/core/base/_index.scss +47 -0
  216. package/dist/styles/core/base/_layouts.scss +63 -0
  217. package/dist/styles/core/base/_misc.scss +20 -0
  218. package/dist/styles/core/base/_mixins.scss +84 -0
  219. package/dist/styles/core/base/_route-transitions.scss +70 -0
  220. package/dist/styles/core/base/_utilities.scss +418 -0
  221. package/dist/styles/core/base/_utils.scss +100 -0
  222. package/dist/styles/core/base/_variables.scss +190 -0
  223. package/dist/styles/core/base/_vertical-nav.scss +264 -0
  224. package/dist/styles/core/base/libs/_perfect-scrollbar.scss +35 -0
  225. package/dist/styles/core/base/libs/vuetify/_index.scss +1 -0
  226. package/dist/styles/core/base/libs/vuetify/_overrides.scss +380 -0
  227. package/dist/styles/core/base/libs/vuetify/_variables.scss +48 -0
  228. package/dist/styles/core/base/placeholders/_default-layout-vertical-nav.scss +48 -0
  229. package/dist/styles/core/base/placeholders/_default-layout.scss +3 -0
  230. package/dist/styles/core/base/placeholders/_index.scss +5 -0
  231. package/dist/styles/core/base/placeholders/_misc.scss +7 -0
  232. package/dist/styles/core/base/placeholders/_nav.scss +26 -0
  233. package/dist/styles/core/base/placeholders/_vertical-nav.scss +84 -0
  234. package/dist/styles/core/base/skins/_bordered.scss +60 -0
  235. package/dist/styles/core/base/skins/_index.scss +1 -0
  236. package/dist/styles/core/template/_components.scss +1044 -0
  237. package/dist/styles/core/template/_default-layout-w-vertical-nav.scss +20 -0
  238. package/dist/styles/core/template/_utilities.scss +20 -0
  239. package/dist/styles/core/template/_variables.scss +67 -0
  240. package/dist/styles/core/template/_vertical-nav.scss +41 -0
  241. package/dist/styles/core/template/index.css +18786 -0
  242. package/dist/styles/core/template/index.scss +15 -0
  243. package/dist/styles/core/template/libs/vuetify/_variables.scss +464 -0
  244. package/dist/styles/core/template/libs/vuetify/index.css +739 -0
  245. package/dist/styles/core/template/libs/vuetify/index.scss +1 -0
  246. package/dist/styles/core/template/pages/misc.css +16 -0
  247. package/dist/styles/core/template/pages/misc.scss +20 -0
  248. package/dist/styles/core/template/placeholders/_default-layout-vertical-nav.scss +9 -0
  249. package/dist/styles/core/template/placeholders/_index.scss +3 -0
  250. package/dist/styles/core/template/placeholders/_nav.scss +15 -0
  251. package/dist/styles/core/template/placeholders/_vertical-nav.scss +18 -0
  252. package/dist/styles/core/template/skins/_bordered.scss +36 -0
  253. package/dist/styles/core/template/skins/_index.scss +1 -0
  254. package/dist/styles/layouts/_classes.scss +3 -0
  255. package/dist/styles/layouts/_dashboard-layout.scss +43 -0
  256. package/dist/styles/layouts/_global.scss +10 -0
  257. package/dist/styles/layouts/_mixins.scss +28 -0
  258. package/dist/styles/layouts/_placeholders.scss +53 -0
  259. package/dist/styles/layouts/_rtl.scss +7 -0
  260. package/dist/styles/layouts/_variables.scss +22 -0
  261. package/dist/styles/layouts/index.css +14 -0
  262. package/dist/styles/layouts/index.scss +2 -0
  263. package/dist/types.d.ts +218 -0
  264. package/dist/utils/apiUrl.d.ts +1 -0
  265. package/dist/utils/apiUrl.js +15 -0
  266. package/dist/utils/apiUrl.mjs +8 -0
  267. package/dist/utils/client.d.ts +9 -0
  268. package/dist/utils/client.js +53 -0
  269. package/dist/utils/client.mjs +39 -0
  270. package/dist/utils/files.d.ts +2 -0
  271. package/dist/utils/files.js +35 -0
  272. package/dist/utils/files.mjs +22 -0
  273. package/dist/utils/formValidation.d.ts +7 -0
  274. package/dist/utils/formValidation.js +20 -0
  275. package/dist/utils/formValidation.mjs +13 -0
  276. package/dist/utils/formatters.d.ts +12 -0
  277. package/dist/utils/formatters.js +84 -0
  278. package/dist/utils/formatters.mjs +56 -0
  279. package/dist/utils/hijriDate.d.ts +58 -0
  280. package/dist/utils/hijriDate.js +168 -0
  281. package/dist/utils/hijriDate.mjs +1951 -0
  282. package/dist/utils/i18n.d.ts +8 -0
  283. package/dist/utils/i18n.js +36 -0
  284. package/dist/utils/i18n.mjs +27 -0
  285. package/dist/utils/index.d.ts +10 -0
  286. package/dist/utils/index.js +115 -0
  287. package/dist/utils/index.mjs +10 -0
  288. package/dist/utils/queryParams.d.ts +4 -0
  289. package/dist/utils/queryParams.js +26 -0
  290. package/dist/utils/queryParams.mjs +18 -0
  291. package/dist/utils/ruleValidator.d.ts +41 -0
  292. package/dist/utils/ruleValidator.js +210 -0
  293. package/dist/utils/ruleValidator.mjs +195 -0
  294. package/dist/utils/toaster.d.ts +12 -0
  295. package/dist/utils/toaster.js +68 -0
  296. package/dist/utils/toaster.mjs +58 -0
  297. package/dist/utils/utils.d.ts +9 -0
  298. package/dist/utils/utils.js +84 -0
  299. package/dist/utils/utils.mjs +67 -0
  300. package/package.json +67 -67
@@ -0,0 +1,195 @@
1
+ import { ref, nextTick } from "vue";
2
+ import { useI18n } from "vue-i18n";
3
+ import { toaster } from "./toaster.mjs";
4
+ import { isEmpty, isEmptyArray, isNullOrUndefined } from "./utils.mjs";
5
+ export const ruleValidator = () => {
6
+ const { t } = useI18n();
7
+ const requiredValidator = (value) => {
8
+ if (isNullOrUndefined(value) || isEmptyArray(value) || value === false) {
9
+ return t("validation.required");
10
+ }
11
+ return !!String(value).trim().length || t("validation.required");
12
+ };
13
+ const requiredLocationValidator = (locations) => {
14
+ const locationArray = Array.isArray(locations) ? locations : [locations];
15
+ if (!locationArray || locationArray.length === 0) {
16
+ return t("validation.required");
17
+ }
18
+ for (const location of locationArray) {
19
+ if (!location || !location.address || !String(location.address).trim() || location.lat === null || typeof location.lat !== "number" || location.lng === null || typeof location.lng !== "number") {
20
+ return t("validation.required");
21
+ }
22
+ }
23
+ return true;
24
+ };
25
+ const ibanValidator = (value) => {
26
+ if (isNullOrUndefined(value) || isEmptyArray(value) || value === false || String(value).length !== 24) {
27
+ return t("validation.iban");
28
+ }
29
+ return !!String(value).trim().length || t("validation.iban");
30
+ };
31
+ const idNumberValidator = (value) => {
32
+ const str = value?.toString() || "";
33
+ const validStarts = ["1", "2", "3", "4"];
34
+ if (str.length !== 10 || !validStarts.includes(str[0])) {
35
+ return t("validation.invalid");
36
+ }
37
+ };
38
+ const requiredManualDateValidator = (value) => {
39
+ if (isEmpty(value?.day) || isEmpty(value?.month) || isEmpty(value?.year)) {
40
+ return t("validation.required");
41
+ }
42
+ return true;
43
+ };
44
+ const emailValidator = (value) => {
45
+ if (isEmpty(value)) {
46
+ return true;
47
+ }
48
+ const re = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
49
+ if (Array.isArray(value)) {
50
+ return value.every((val) => re.test(String(val))) || t("validation.email");
51
+ }
52
+ return re.test(String(value)) || t("validation.email");
53
+ };
54
+ const confirmedValidator = (value, target) => value === target || t("validation.confirmed");
55
+ const betweenValidator = (value, min, max) => {
56
+ const valueAsNumber = Number(value);
57
+ return Number(min) <= valueAsNumber && Number(max) >= valueAsNumber || t("validation.between", { min, max });
58
+ };
59
+ const integerValidator = (value) => {
60
+ if (isEmpty(value)) {
61
+ return true;
62
+ }
63
+ if (Array.isArray(value)) {
64
+ return value.every((val) => /^-?[0-9]+$/.test(String(val))) || t("validation.integer");
65
+ }
66
+ return /^-?[0-9]+$/.test(String(value)) || t("validation.integer");
67
+ };
68
+ const numberValidator = (value) => {
69
+ if (isEmpty(value)) {
70
+ return true;
71
+ }
72
+ return /^\d+(\.\d+)?$/.test(String(value)) || t("validation.number");
73
+ };
74
+ const alphaValidator = (value) => {
75
+ if (isEmpty(value)) {
76
+ return true;
77
+ }
78
+ return /^[A-Za-z\u0600-\u06FF\s]*$/i.test(String(value)) || t("validation.alphabetic");
79
+ };
80
+ const alphaWithNumberValidator = (value) => {
81
+ if (isEmpty(value)) {
82
+ return true;
83
+ }
84
+ return /^[A-Za-z\u0600-\u06FF0-9\s]*$/.test(String(value)) || t("validation.alphabetic");
85
+ };
86
+ const urlValidator = (value) => {
87
+ if (isEmpty(value)) {
88
+ return true;
89
+ }
90
+ const re = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9.-]+\.[a-zA-Z]{2,5}[.]?/;
91
+ return re.test(String(value)) || t("validation.url");
92
+ };
93
+ const lengthValidator = (value, length) => {
94
+ if (isEmpty(value)) {
95
+ return true;
96
+ }
97
+ return String(value).length === length || t("validation.length", { length });
98
+ };
99
+ const alphaDashValidator = (value) => {
100
+ if (isEmpty(value)) {
101
+ return true;
102
+ }
103
+ const valueAsString = String(value);
104
+ return /^[0-9A-Z_-]*$/i.test(valueAsString) || t("validation.alpha_dash");
105
+ };
106
+ const fileValidator = (file, maxSizeInMB, types) => {
107
+ if (!file) {
108
+ return false;
109
+ }
110
+ if (file.size > maxSizeInMB * 1024 * 1024) {
111
+ toaster().error(
112
+ t("validation.file_size_limit_exceeded", { size: maxSizeInMB })
113
+ );
114
+ return;
115
+ }
116
+ if (!types.includes(file.type)) {
117
+ toaster().error(
118
+ t("validation.file_type_not_allowed", {
119
+ types: types.map((type) => type.split("/")[1]).join(", ")
120
+ })
121
+ );
122
+ return;
123
+ }
124
+ return true;
125
+ };
126
+ const requiredPlateValidator = (value) => {
127
+ if (!value || !value?.every((val) => val !== "")) {
128
+ return t("validation.required");
129
+ }
130
+ return true;
131
+ };
132
+ const dateValidator = (value) => {
133
+ if (isEmpty(value)) {
134
+ return true;
135
+ }
136
+ const dateString = String(value);
137
+ const datePattern = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/(\d{4})$/;
138
+ if (!datePattern.test(dateString)) {
139
+ return t("validation.date", { format: "DD/MM/YYYY" });
140
+ }
141
+ return true;
142
+ };
143
+ const regexValidator = (value, regex, message) => {
144
+ return regex.test(value) || message || t("validation.invalid");
145
+ };
146
+ return {
147
+ fileValidator,
148
+ requiredValidator,
149
+ requiredLocationValidator,
150
+ emailValidator,
151
+ alphaValidator,
152
+ alphaDashValidator,
153
+ alphaWithNumberValidator,
154
+ betweenValidator,
155
+ integerValidator,
156
+ numberValidator,
157
+ confirmedValidator,
158
+ urlValidator,
159
+ lengthValidator,
160
+ ibanValidator,
161
+ dateValidator,
162
+ regexValidator,
163
+ idNumberValidator,
164
+ requiredManualDateValidator,
165
+ requiredPlateValidator
166
+ };
167
+ };
168
+ export const useFormValidation = () => {
169
+ const validationType = ref("submit");
170
+ const validateAndScroll = async (refVForm) => {
171
+ const isValid = await refVForm?.validate();
172
+ await scrollToError();
173
+ if (isValid?.valid === false) {
174
+ await scrollToError();
175
+ validationType.value = "input";
176
+ return false;
177
+ }
178
+ return true;
179
+ };
180
+ const scrollToError = async () => {
181
+ validationType.value = "input";
182
+ await nextTick(() => {
183
+ const el = document.querySelector(".v-messages__message:first-of-type");
184
+ el?.scrollIntoView({
185
+ behavior: "smooth",
186
+ block: "center"
187
+ });
188
+ });
189
+ };
190
+ return {
191
+ validateAndScroll,
192
+ validationType,
193
+ scrollToError
194
+ };
195
+ };
@@ -0,0 +1,12 @@
1
+ import type { FetchError } from 'ofetch';
2
+ import type { ErrorResponse } from '../types';
3
+ export declare const toaster: () => {
4
+ success: (message?: string) => void;
5
+ error: (message?: string) => void;
6
+ successLang: (message: string) => void;
7
+ errorLang: (message: string) => void;
8
+ };
9
+ export declare function responseAlert(): {
10
+ showAlert: (response?: FetchError<ErrorResponse>) => void;
11
+ showValidationAlert: (response?: FetchError<ErrorResponse>) => void;
12
+ };
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.responseAlert = responseAlert;
7
+ exports.toaster = void 0;
8
+ var _vueSonner = require("vue-sonner");
9
+ var _i18n = require("./i18n");
10
+ const toaster = () => {
11
+ const success = message => {
12
+ _vueSonner.toast.success(message ?? (0, _i18n.i18n)().global.t("success"));
13
+ };
14
+ const error = message => {
15
+ _vueSonner.toast.error(message ?? (0, _i18n.i18n)().global.t("error"));
16
+ };
17
+ const successLang = message => {
18
+ _vueSonner.toast.success((0, _i18n.i18n)().global.t(message));
19
+ };
20
+ const errorLang = message => {
21
+ _vueSonner.toast.error((0, _i18n.i18n)().global.t(message));
22
+ };
23
+ return {
24
+ success,
25
+ error,
26
+ successLang,
27
+ errorLang
28
+ };
29
+ };
30
+ exports.toaster = toaster;
31
+ function responseAlert() {
32
+ const {
33
+ error: showError
34
+ } = toaster();
35
+ const getErrorMessage = response => {
36
+ const errorResponse = response?.response?._data;
37
+ const error = errorResponse?.status.errors_list?.find(e => e.field == "0");
38
+ const message = errorResponse?.status.message;
39
+ if (!error && !message) {
40
+ return null;
41
+ }
42
+ if (response?.data?.status.code === 422) {
43
+ return null;
44
+ }
45
+ return error ? error.message : message;
46
+ };
47
+ const showAlert = response => {
48
+ const message = getErrorMessage(response);
49
+ if (message) {
50
+ showError(message);
51
+ }
52
+ };
53
+ const showValidationAlert = response => {
54
+ const errorResponse = response?.response?._data;
55
+ if (response?.data?.status.code === 422) {
56
+ const validationErrors = errorResponse?.status.errors_list?.map(error => error.message).join(" ,");
57
+ if (validationErrors) {
58
+ showError(validationErrors);
59
+ return;
60
+ }
61
+ }
62
+ showAlert(response);
63
+ };
64
+ return {
65
+ showAlert,
66
+ showValidationAlert
67
+ };
68
+ }
@@ -0,0 +1,58 @@
1
+ import { toast as sonnerToast } from "vue-sonner";
2
+ import { i18n } from "./i18n.mjs";
3
+ export const toaster = () => {
4
+ const success = (message) => {
5
+ sonnerToast.success(message ?? i18n().global.t("success"));
6
+ };
7
+ const error = (message) => {
8
+ sonnerToast.error(message ?? i18n().global.t("error"));
9
+ };
10
+ const successLang = (message) => {
11
+ sonnerToast.success(i18n().global.t(message));
12
+ };
13
+ const errorLang = (message) => {
14
+ sonnerToast.error(i18n().global.t(message));
15
+ };
16
+ return {
17
+ success,
18
+ error,
19
+ successLang,
20
+ errorLang
21
+ };
22
+ };
23
+ export function responseAlert() {
24
+ const { error: showError } = toaster();
25
+ const getErrorMessage = (response) => {
26
+ const errorResponse = response?.response?._data;
27
+ const error = errorResponse?.status.errors_list?.find((e) => e.field == "0");
28
+ const message = errorResponse?.status.message;
29
+ if (!error && !message) {
30
+ return null;
31
+ }
32
+ if (response?.data?.status.code === 422) {
33
+ return null;
34
+ }
35
+ return error ? error.message : message;
36
+ };
37
+ const showAlert = (response) => {
38
+ const message = getErrorMessage(response);
39
+ if (message) {
40
+ showError(message);
41
+ }
42
+ };
43
+ const showValidationAlert = (response) => {
44
+ const errorResponse = response?.response?._data;
45
+ if (response?.data?.status.code === 422) {
46
+ const validationErrors = errorResponse?.status.errors_list?.map((error) => error.message).join(" ,");
47
+ if (validationErrors) {
48
+ showError(validationErrors);
49
+ return;
50
+ }
51
+ }
52
+ showAlert(response);
53
+ };
54
+ return {
55
+ showAlert,
56
+ showValidationAlert
57
+ };
58
+ }
@@ -0,0 +1,9 @@
1
+ export declare const generateRandomId: (length: number) => string;
2
+ export declare const generateUniqueId: () => string;
3
+ export declare const isEmpty: (value: unknown) => boolean;
4
+ export declare const isNullOrUndefined: (value: unknown) => value is undefined | null;
5
+ export declare const isEmptyArray: (arr: unknown) => boolean;
6
+ export declare const buildFormData: <T>(data: T | T[], excludedKeys?: string[], formData?: FormData, parentKey?: string) => FormData;
7
+ export declare const stripLeadingZero: (mobile: string) => string;
8
+ export declare const cloneObjectDeep: <T>(obj: T) => T;
9
+ export declare const mergeDeep: (target: any, source: any) => any;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stripLeadingZero = exports.mergeDeep = exports.isNullOrUndefined = exports.isEmptyArray = exports.isEmpty = exports.generateUniqueId = exports.generateRandomId = exports.cloneObjectDeep = exports.buildFormData = void 0;
7
+ const generateRandomId = length => {
8
+ const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
9
+ let result = "";
10
+ for (let i = 0; i < length; i++) {
11
+ result += characters.charAt(Math.floor(Math.random() * characters.length));
12
+ }
13
+ return result;
14
+ };
15
+ exports.generateRandomId = generateRandomId;
16
+ const generateUniqueId = () => {
17
+ const timestamp = (/* @__PURE__ */new Date()).getTime().toString(36);
18
+ const randomPart = generateRandomId(6);
19
+ return `${timestamp}-${randomPart}`;
20
+ };
21
+ exports.generateUniqueId = generateUniqueId;
22
+ const isEmpty = value => {
23
+ if (value === null || value === void 0 || value === "") {
24
+ return true;
25
+ }
26
+ return !!(Array.isArray(value) && value.length === 0);
27
+ };
28
+ exports.isEmpty = isEmpty;
29
+ const isNullOrUndefined = value => {
30
+ return value === null || value === void 0;
31
+ };
32
+ exports.isNullOrUndefined = isNullOrUndefined;
33
+ const isEmptyArray = arr => {
34
+ return Array.isArray(arr) && arr.length === 0;
35
+ };
36
+ exports.isEmptyArray = isEmptyArray;
37
+ const buildFormData = (data, excludedKeys = [], formData = new FormData(), parentKey = "") => {
38
+ if (Array.isArray(data)) {
39
+ data.forEach((item, index) => {
40
+ buildFormData(item, excludedKeys, formData, `${parentKey}[${index}]`);
41
+ });
42
+ return formData;
43
+ }
44
+ if (data && typeof data === "object" && !(data instanceof File)) {
45
+ Object.keys(data).forEach(key => {
46
+ if (excludedKeys.includes(key)) return;
47
+ const value = data[key];
48
+ const newKey = parentKey ? `${parentKey}[${key}]` : key;
49
+ buildFormData(value, excludedKeys, formData, newKey);
50
+ });
51
+ return formData;
52
+ }
53
+ if (data instanceof File) {
54
+ formData.append(parentKey, data);
55
+ } else if (typeof data === "boolean") {
56
+ formData.append(parentKey, data ? "1" : "0");
57
+ } else if (data != null) {
58
+ formData.append(parentKey, data.toString());
59
+ }
60
+ return formData;
61
+ };
62
+ exports.buildFormData = buildFormData;
63
+ const stripLeadingZero = mobile => {
64
+ return mobile.replace(/^0+/, "");
65
+ };
66
+ exports.stripLeadingZero = stripLeadingZero;
67
+ const cloneObjectDeep = obj => {
68
+ return JSON.parse(JSON.stringify(obj));
69
+ };
70
+ exports.cloneObjectDeep = cloneObjectDeep;
71
+ const mergeDeep = (target, source) => {
72
+ const output = {
73
+ ...target
74
+ };
75
+ for (const key in source) {
76
+ if (typeof source[key] === "object" && source[key] !== null && !Array.isArray(source[key])) {
77
+ output[key] = mergeDeep(target[key] || {}, source[key]);
78
+ } else {
79
+ output[key] = source[key];
80
+ }
81
+ }
82
+ return output;
83
+ };
84
+ exports.mergeDeep = mergeDeep;
@@ -0,0 +1,67 @@
1
+ export const generateRandomId = (length) => {
2
+ const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
3
+ let result = "";
4
+ for (let i = 0; i < length; i++) {
5
+ result += characters.charAt(Math.floor(Math.random() * characters.length));
6
+ }
7
+ return result;
8
+ };
9
+ export const generateUniqueId = () => {
10
+ const timestamp = (/* @__PURE__ */ new Date()).getTime().toString(36);
11
+ const randomPart = generateRandomId(6);
12
+ return `${timestamp}-${randomPart}`;
13
+ };
14
+ export const isEmpty = (value) => {
15
+ if (value === null || value === void 0 || value === "") {
16
+ return true;
17
+ }
18
+ return !!(Array.isArray(value) && value.length === 0);
19
+ };
20
+ export const isNullOrUndefined = (value) => {
21
+ return value === null || value === void 0;
22
+ };
23
+ export const isEmptyArray = (arr) => {
24
+ return Array.isArray(arr) && arr.length === 0;
25
+ };
26
+ export const buildFormData = (data, excludedKeys = [], formData = new FormData(), parentKey = "") => {
27
+ if (Array.isArray(data)) {
28
+ data.forEach((item, index) => {
29
+ buildFormData(item, excludedKeys, formData, `${parentKey}[${index}]`);
30
+ });
31
+ return formData;
32
+ }
33
+ if (data && typeof data === "object" && !(data instanceof File)) {
34
+ Object.keys(data).forEach((key) => {
35
+ if (excludedKeys.includes(key)) return;
36
+ const value = data[key];
37
+ const newKey = parentKey ? `${parentKey}[${key}]` : key;
38
+ buildFormData(value, excludedKeys, formData, newKey);
39
+ });
40
+ return formData;
41
+ }
42
+ if (data instanceof File) {
43
+ formData.append(parentKey, data);
44
+ } else if (typeof data === "boolean") {
45
+ formData.append(parentKey, data ? "1" : "0");
46
+ } else if (data != null) {
47
+ formData.append(parentKey, data.toString());
48
+ }
49
+ return formData;
50
+ };
51
+ export const stripLeadingZero = (mobile) => {
52
+ return mobile.replace(/^0+/, "");
53
+ };
54
+ export const cloneObjectDeep = (obj) => {
55
+ return JSON.parse(JSON.stringify(obj));
56
+ };
57
+ export const mergeDeep = (target, source) => {
58
+ const output = { ...target };
59
+ for (const key in source) {
60
+ if (typeof source[key] === "object" && source[key] !== null && !Array.isArray(source[key])) {
61
+ output[key] = mergeDeep(target[key] || {}, source[key]);
62
+ } else {
63
+ output[key] = source[key];
64
+ }
65
+ }
66
+ return output;
67
+ };
package/package.json CHANGED
@@ -1,70 +1,70 @@
1
1
  {
2
- "name": "@winchsa/ui",
3
- "version": "0.1.33",
4
- "type": "module",
5
- "private": false,
6
- "publishConfig": {
7
- "access": "public"
8
- },
9
- "files": [
10
- "dist/*"
11
- ],
12
- "exports": {
13
- ".": {
14
- "require": "./dist/index.js",
15
- "import": "./dist/index.mjs",
16
- "types": "./dist/index.d.ts"
2
+ "name": "@winchsa/ui",
3
+ "version": "0.1.35",
4
+ "type": "module",
5
+ "private": false,
6
+ "publishConfig": {
7
+ "access": "public"
17
8
  },
18
- "./utils": {
19
- "require": "./dist/utils/index.js",
20
- "import": "./dist/utils/index.mjs",
21
- "types": "./dist/utils/index.d.ts"
9
+ "files": [
10
+ "dist/*"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "require": "./dist/index.js",
15
+ "import": "./dist/index.mjs",
16
+ "types": "./dist/index.d.ts"
17
+ },
18
+ "./utils": {
19
+ "require": "./dist/utils/index.js",
20
+ "import": "./dist/utils/index.mjs",
21
+ "types": "./dist/utils/index.d.ts"
22
+ }
23
+ },
24
+ "main": "./dist/index.js",
25
+ "module": "./dist/index.mjs",
26
+ "scripts": {
27
+ "dev": "vite",
28
+ "build": "unbuild",
29
+ "lint": "eslint \"**/*.{ts,vue,mjs}\"",
30
+ "lint:fix": "eslint \"**/*.{ts,vue,mjs}\" --fix",
31
+ "bump": "pnpm version patch && pnpm run build && git add . && git commit -m \"chore: release v$(node -p \"require('./package.json').version\")\""
32
+ },
33
+ "peerDependencies": {
34
+ "@intlify/unplugin-vue-i18n": "^4.0.0",
35
+ "@tanstack/vue-query": "^5.74.5",
36
+ "@vueuse/core": "11.3.0",
37
+ "@vueuse/router": "^13.1.0",
38
+ "ofetch": "^1.4.1",
39
+ "vue": "^3.5.13",
40
+ "vue-i18n": "9.14.5",
41
+ "vue-router": "4.4.5",
42
+ "vue-sonner": "^1.3.0",
43
+ "vue3-perfect-scrollbar": "2.0.0",
44
+ "vuetify": "3.10.11"
45
+ },
46
+ "dependencies": {
47
+ "@vuepic/vue-datepicker": "^11.0.0",
48
+ "cropperjs": "^1.6.2",
49
+ "print-js": "^1.6.0",
50
+ "v-calendar": "^3.1.2",
51
+ "vue-multiselect": "^3.1.0"
52
+ },
53
+ "devDependencies": {
54
+ "@tanstack/eslint-plugin-query": "^5.73.3",
55
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
56
+ "@types/node": "^22.12.0",
57
+ "@vitejs/plugin-vue": "^6.0.1",
58
+ "eslint": "^8.57.1",
59
+ "eslint-import-resolver-typescript": "^4.3.3",
60
+ "eslint-plugin-import": "^2.31.0",
61
+ "eslint-plugin-vue": "^9.32.0",
62
+ "sass": "1.92.1",
63
+ "typescript": "^5.9.3",
64
+ "unbuild": "^3.0.0",
65
+ "vite": "^5.4.21",
66
+ "vite-plugin-vuetify": "^2.1.2",
67
+ "vue-sfc-transformer": "^0.1.16",
68
+ "vue-tsc": "^3.1.1"
22
69
  }
23
- },
24
- "main": "./dist/index.js",
25
- "module": "./dist/index.mjs",
26
- "peerDependencies": {
27
- "@intlify/unplugin-vue-i18n": "^4.0.0",
28
- "@tanstack/vue-query": "^5.74.5",
29
- "@vueuse/core": "11.3.0",
30
- "@vueuse/router": "^13.1.0",
31
- "ofetch": "^1.4.1",
32
- "vue": "^3.5.13",
33
- "vue-i18n": "9.14.5",
34
- "vue-router": "4.4.5",
35
- "vue-sonner": "^1.3.0",
36
- "vue3-perfect-scrollbar": "2.0.0",
37
- "vuetify": "3.10.11"
38
- },
39
- "dependencies": {
40
- "@vuepic/vue-datepicker": "^11.0.0",
41
- "cropperjs": "^1.6.2",
42
- "print-js": "^1.6.0",
43
- "v-calendar": "^3.1.2",
44
- "vue-multiselect": "^3.1.0"
45
- },
46
- "devDependencies": {
47
- "@tanstack/eslint-plugin-query": "^5.73.3",
48
- "@typescript-eslint/eslint-plugin": "^7.18.0",
49
- "@types/node": "^22.12.0",
50
- "@vitejs/plugin-vue": "^6.0.1",
51
- "eslint": "^8.57.1",
52
- "eslint-import-resolver-typescript": "^4.3.3",
53
- "eslint-plugin-import": "^2.31.0",
54
- "eslint-plugin-vue": "^9.32.0",
55
- "sass": "1.92.1",
56
- "typescript": "^5.9.3",
57
- "unbuild": "^3.0.0",
58
- "vite": "^5.4.21",
59
- "vite-plugin-vuetify": "^2.1.2",
60
- "vue-sfc-transformer": "^0.1.16",
61
- "vue-tsc": "^3.1.1"
62
- },
63
- "scripts": {
64
- "dev": "vite",
65
- "build": "unbuild",
66
- "lint": "eslint \"**/*.{ts,vue,mjs}\"",
67
- "lint:fix": "eslint \"**/*.{ts,vue,mjs}\" --fix",
68
- "bump": "pnpm version patch && pnpm run build && git add . && git commit -m \"chore: release v$(node -p \"require('./package.json').version\")\""
69
- }
70
- }
70
+ }