@sd-angular/core 19.0.0-beta.93 → 19.0.0-beta.94

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 (92) hide show
  1. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +4 -1
  2. package/components/document-builder/src/document-builder.model.d.ts +2 -0
  3. package/components/editor/src/models/editor.model.d.ts +2 -0
  4. package/components/editor/src/plugins/image-upload/utils/validate.utils.d.ts +2 -1
  5. package/components/splitter/src/splitter.component.d.ts +15 -2
  6. package/components/table/src/components/selector-action/selector-action.component.d.ts +1 -0
  7. package/components/table/src/table.component.d.ts +1 -0
  8. package/configurations/src/sd-core.configuration.d.ts +1 -0
  9. package/fesm2022/sd-angular-core-components-code-editor.mjs +3 -2
  10. package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -1
  11. package/fesm2022/sd-angular-core-components-document-builder.mjs +29 -8
  12. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  13. package/fesm2022/sd-angular-core-components-editor.mjs +31 -16
  14. package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
  15. package/fesm2022/sd-angular-core-components-form-generic.mjs +68 -61
  16. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  17. package/fesm2022/sd-angular-core-components-history.mjs +3 -2
  18. package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
  19. package/fesm2022/sd-angular-core-components-import-excel.mjs +25 -23
  20. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  21. package/fesm2022/sd-angular-core-components-preview.mjs +6 -4
  22. package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
  23. package/fesm2022/sd-angular-core-components-splitter.mjs +188 -18
  24. package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -1
  25. package/fesm2022/sd-angular-core-components-tab-router.mjs +3 -1
  26. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  27. package/fesm2022/sd-angular-core-components-table.mjs +30 -23
  28. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-components-upload-file.mjs +24 -21
  30. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-configurations.mjs.map +1 -1
  32. package/fesm2022/sd-angular-core-directives.mjs +6 -2
  33. package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
  34. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +3 -1
  35. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  36. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +5 -3
  37. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  38. package/fesm2022/sd-angular-core-forms-chip.mjs +5 -3
  39. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  40. package/fesm2022/sd-angular-core-forms-date-range.mjs +8 -5
  41. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  42. package/fesm2022/sd-angular-core-forms-date.mjs +7 -5
  43. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  44. package/fesm2022/sd-angular-core-forms-datetime.mjs +10 -8
  45. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  46. package/fesm2022/sd-angular-core-forms-input-number.mjs +5 -3
  47. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  48. package/fesm2022/sd-angular-core-forms-input.mjs +13 -6
  49. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  50. package/fesm2022/sd-angular-core-forms-radio.mjs +3 -2
  51. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  52. package/fesm2022/sd-angular-core-forms-select.mjs +5 -3
  53. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  54. package/fesm2022/sd-angular-core-forms-textarea.mjs +8 -5
  55. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  56. package/fesm2022/sd-angular-core-handlers.mjs +7 -6
  57. package/fesm2022/sd-angular-core-handlers.mjs.map +1 -1
  58. package/fesm2022/sd-angular-core-i18n.mjs +790 -0
  59. package/fesm2022/sd-angular-core-i18n.mjs.map +1 -0
  60. package/fesm2022/sd-angular-core-interceptors.mjs +10 -6
  61. package/fesm2022/sd-angular-core-interceptors.mjs.map +1 -1
  62. package/fesm2022/sd-angular-core-modules-authom.mjs +1 -0
  63. package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -1
  64. package/fesm2022/sd-angular-core-modules-keycloak.mjs +1 -0
  65. package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -1
  66. package/fesm2022/sd-angular-core-modules-layout.mjs +47 -46
  67. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  68. package/fesm2022/sd-angular-core-services-confirm.mjs +15 -13
  69. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  70. package/fesm2022/sd-angular-core-services-docx.mjs +7 -7
  71. package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -1
  72. package/fesm2022/sd-angular-core-services-excel.mjs +5 -3
  73. package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
  74. package/fesm2022/sd-angular-core-utilities-extensions.mjs +18 -11
  75. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  76. package/fesm2022/sd-angular-core-utilities-models.mjs +30 -28
  77. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  78. package/fesm2022/sd-angular-core.mjs +1 -0
  79. package/fesm2022/sd-angular-core.mjs.map +1 -1
  80. package/i18n/index.d.ts +5 -0
  81. package/i18n/src/en.d.ts +2 -0
  82. package/i18n/src/sd-i18n.messages.d.ts +2 -0
  83. package/i18n/src/sd-i18n.pipe.d.ts +9 -0
  84. package/i18n/src/sd-i18n.service.d.ts +12 -0
  85. package/i18n/src/sd-i18n.token.d.ts +1 -0
  86. package/i18n/src/sd-i18n.types.d.ts +5 -0
  87. package/i18n/src/vi.d.ts +312 -0
  88. package/package.json +53 -49
  89. package/public-api.d.ts +1 -0
  90. package/sd-angular-core-19.0.0-beta.94.tgz +0 -0
  91. package/services/confirm/src/lib/confirm.service.d.ts +1 -0
  92. package/sd-angular-core-19.0.0-beta.93.tgz +0 -0
@@ -18,9 +18,9 @@
18
18
  const REGEX_EMAIL = '^(([^<>()[\\].,;:\\s@"]+(\\.[^<>()[\\].,;:\\s@"]+)*)|(".+"))@(([^<>()[\\].,;:\\s@"]+\\.)+[^<>()[\\].,;:\\s@"]{2,})$';
19
19
  const REGEX_PHONE = '^[+]*[(]{0,1}[+]?[0-9]{1,4}[)]{0,1}[-\\s./0-9]*$';
20
20
  const REGEX_PHONE_VN = '^(?:\\+84|0|84)(3[2-9]|5[2689]|7[06-9]|8[1-689]|9[0-9])\\d{7}$';
21
- const REGEX_IDVN = '^(\\d{9}|\\d{12})$';
21
+ const REGEX_IDVN = '^\\d{12}$';
22
22
  const REGEX_PASSPORT = '^[A-Z]\\d{7}$';
23
- const REGEX_IDVN_OR_PASSPORT = '^(\\d{9}|\\d{12}|[A-Z]\\d{7})$';
23
+ const REGEX_IDVN_OR_PASSPORT = '^(\\d{12}|[A-Z]\\d{7})$';
24
24
  const REGEX_TIME = '^(?:[01]\\d|2[0-3]):[0-5]\\d$';
25
25
  const isValidEmail = (value) => {
26
26
  if (!value) {
@@ -783,24 +783,32 @@ const upload = (option) => {
783
783
  element.addEventListener('change', (evt) => {
784
784
  try {
785
785
  const target = evt.target;
786
+ // Throw i18n KEY thay vì chuỗi đã dịch — utility là pure function nên không
787
+ // inject() được; consumer (component/service) chịu trách nhiệm i18n.t(err.message, { name }).
788
+ // Quy ước: SdUploadError có shape { key, params } được set qua Error.cause để consumer trích xuất an toàn.
789
+ const throwUploadError = (key, name) => {
790
+ const err = new Error(key);
791
+ err.i18nParams = { name };
792
+ throw err;
793
+ };
786
794
  if (option?.multiple) {
787
795
  const files = [];
788
796
  for (const file of target.files) {
789
797
  if (file) {
790
798
  const lastDot = file.name.lastIndexOf('.');
791
799
  if (lastDot === -1) {
792
- throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);
800
+ throwUploadError('core.utility.upload.invalid-format', file.name);
793
801
  }
794
802
  const extension = file.name.substring(lastDot + 1);
795
803
  if (option) {
796
804
  if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {
797
- throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);
805
+ throwUploadError('core.utility.upload.invalid-format', file.name);
798
806
  }
799
807
  if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {
800
- const message = `[${file.name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác`;
801
- throw new Error(message);
808
+ throwUploadError('core.utility.upload.invalid-size', file.name);
802
809
  }
803
810
  if (option.validator && option.validator(file.name)) {
811
+ // Custom validator returns its own message — pass through as-is (caller defines format).
804
812
  const message = option.validator(file.name);
805
813
  throw new Error(message);
806
814
  }
@@ -815,16 +823,15 @@ const upload = (option) => {
815
823
  if (file) {
816
824
  const lastDot = file.name.lastIndexOf('.');
817
825
  if (lastDot === -1) {
818
- throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);
826
+ throwUploadError('core.utility.upload.invalid-format', file.name);
819
827
  }
820
828
  const extension = file.name.substring(lastDot + 1);
821
829
  if (option) {
822
830
  if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {
823
- throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);
831
+ throwUploadError('core.utility.upload.invalid-format', file.name);
824
832
  }
825
833
  if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {
826
- const message = `[${file.name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác`;
827
- throw new Error(message);
834
+ throwUploadError('core.utility.upload.invalid-size', file.name);
828
835
  }
829
836
  if (option.validator && option.validator(file.name)) {
830
837
  const message = option.validator(file.name);
@@ -1029,7 +1036,7 @@ const getClientPublicIp = async () => {
1029
1036
  return data.ip;
1030
1037
  }
1031
1038
  catch (error) {
1032
- console.error('Không thể lấy địa chỉ IP:', error);
1039
+ console.error('Failed to fetch client IP:', error);
1033
1040
  return null; // Trả về null nếu có lỗi
1034
1041
  }
1035
1042
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-utilities-extensions.mjs","sources":["../../../projects/sd-angular/utilities/extensions/src/string.extension.ts","../../../projects/sd-angular/utilities/extensions/src/array.extension.ts","../../../projects/sd-angular/utilities/extensions/src/number.extension.ts","../../../projects/sd-angular/utilities/extensions/src/date.extension.ts","../../../projects/sd-angular/utilities/extensions/src/utility.extension.ts","../../../projects/sd-angular/utilities/extensions/src/color.extension.ts","../../../projects/sd-angular/utilities/extensions/sd-angular-core-utilities-extensions.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// declare global {\r\n// interface StringConstructor {\r\n// isValidEmail(value: any): boolean;\r\n// isValidPhone(value: any): boolean;\r\n// isValidCode(value: any): boolean;\r\n// changeAliasLowerCase(alias: any): string;\r\n// aliasIncludes(alias: any, searchText: any): boolean;\r\n// format(template: string, ...arr: any[]): string;\r\n// templateToDisplay(template: string, entity: any): string; // Convert theo format ${key}\r\n// encrypt(obj: any): string;\r\n// decrypt(encripted: string): any;\r\n// isNullOrEmpty(value: any): boolean;\r\n// isNullOrWhiteSpace(value: any): boolean;\r\n// }\r\n// }\r\n\r\nconst REGEX_EMAIL = '^(([^<>()[\\\\].,;:\\\\s@\"]+(\\\\.[^<>()[\\\\].,;:\\\\s@\"]+)*)|(\".+\"))@(([^<>()[\\\\].,;:\\\\s@\"]+\\\\.)+[^<>()[\\\\].,;:\\\\s@\"]{2,})$';\r\nconst REGEX_PHONE = '^[+]*[(]{0,1}[+]?[0-9]{1,4}[)]{0,1}[-\\\\s./0-9]*$';\r\nconst REGEX_PHONE_VN = '^(?:\\\\+84|0|84)(3[2-9]|5[2689]|7[06-9]|8[1-689]|9[0-9])\\\\d{7}$';\r\nconst REGEX_IDVN = '^(\\\\d{9}|\\\\d{12})$';\r\nconst REGEX_PASSPORT = '^[A-Z]\\\\d{7}$';\r\nconst REGEX_IDVN_OR_PASSPORT = '^(\\\\d{9}|\\\\d{12}|[A-Z]\\\\d{7})$';\r\nconst REGEX_TIME = '^(?:[01]\\\\d|2[0-3]):[0-5]\\\\d$';\r\nconst isValidEmail = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = new RegExp(REGEX_EMAIL);\r\n return re.test(value);\r\n};\r\n\r\nconst isValidPhone = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = new RegExp(REGEX_PHONE);\r\n return re.test(value);\r\n};\r\n\r\nconst isValidCode = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = /^[a-zA-Z0-9\\@\\_\\-]{2,20}$/;\r\n return re.test(value);\r\n};\r\n\r\nconst isNullOrEmpty = (value: any) => {\r\n return value === undefined || value === null || value === '';\r\n};\r\n\r\nconst isNullOrWhiteSpace = (value: any) => {\r\n return value === undefined || value === null || typeof value !== 'string' || value.match(/^\\s*$/) !== null;\r\n};\r\n\r\nconst changeAliasLowerCase = (alias: any) => {\r\n let str: string = alias?.toString() ?? '';\r\n str = str.toString().toLowerCase();\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, ' ');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n};\r\n\r\nconst aliasIncludes = (alias: any, searchText: any) => {\r\n return changeAliasLowerCase(alias).includes(changeAliasLowerCase(searchText));\r\n};\r\n\r\nconst format = (template: string, ...arr: any[]) => {\r\n for (let i = 0; i < arr.length; i++) {\r\n const regexp = new RegExp(`\\\\{${i}\\\\}`, 'gi');\r\n template = template.replace(regexp, arr[i]);\r\n }\r\n return template;\r\n};\r\n\r\nconst getValueByPath = (entity: Record<string, any>, key: string) => {\r\n let value: any = entity;\r\n for (const part of key.split('.')) {\r\n value = value?.[part];\r\n }\r\n return value;\r\n};\r\n\r\n// Convert: `[${code}] ${name}` => `[Mã] Tên`;\r\nconst templateToDisplay = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return template;\r\n }\r\n const regex = /\\$\\{([A-Za-z0-9._-]*)\\}/g;\r\n const matches = template.match(regex) || [];\r\n for (const match of matches) {\r\n const key = match.slice(2, match.length - 1);\r\n if (key) {\r\n template = template.replace(match, getValueByPath(entity, key) ?? '');\r\n }\r\n }\r\n return template;\r\n};\r\n\r\nconst EXACT_TEMPLATE_REGEX = /^\\$\\{([A-Za-z0-9._-]*)\\}$/;\r\nconst NUMBER_LITERAL_REGEX = /^-?\\d+(\\.\\d+)?$/;\r\n\r\n// Convert placeholder/literal an toàn, không thực thi JavaScript động.\r\nconst parseExpression = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return undefined;\r\n }\r\n const trimmedTemplate = template.trim();\r\n const exactTemplateMatch = trimmedTemplate.match(EXACT_TEMPLATE_REGEX);\r\n if (exactTemplateMatch?.[1]) {\r\n return getValueByPath(entity, exactTemplateMatch[1]);\r\n }\r\n\r\n if (trimmedTemplate === 'true') {\r\n return true;\r\n }\r\n if (trimmedTemplate === 'false') {\r\n return false;\r\n }\r\n if (trimmedTemplate === 'null') {\r\n return null;\r\n }\r\n if (trimmedTemplate === 'undefined') {\r\n return undefined;\r\n }\r\n if (NUMBER_LITERAL_REGEX.test(trimmedTemplate)) {\r\n return Number(trimmedTemplate);\r\n }\r\n\r\n return templateToDisplay(template, entity);\r\n};\r\n\r\nconst SALT = 'cb9f4b2a-d26c-4787-a66e-e7130ee00f95';\r\n\r\nconst encrypt = (obj: any) => {\r\n obj = JSON.stringify(obj).split('');\r\n for (let i = 0, l = obj.length; i < l; i++)\r\n if (obj[i] == '{') obj[i] = '}';\r\n else if (obj[i] == '}') obj[i] = '{';\r\n return encodeURI(SALT + obj.join(''));\r\n};\r\n\r\nconst decrypt = (encripted: string) => {\r\n encripted = decodeURI(encripted);\r\n if (SALT && encripted.indexOf(SALT) != 0) throw new Error('object cannot be decrypted');\r\n const strs = encripted.substring(SALT.length).split('');\r\n for (let i = 0, l = strs.length; i < l; i++)\r\n if (strs[i] == '{') strs[i] = '}';\r\n else if (strs[i] == '}') strs[i] = '{';\r\n return JSON.parse(strs.join(''));\r\n};\r\n\r\n// Conver \"Đội Kỹ Thuật\" thành \"doi_ky_thuat\"\r\nconst convertToSnakeCaseCode = (name: string): string => {\r\n if (typeof name !== 'string') {\r\n throw new Error('Invalid name');\r\n }\r\n return name\r\n .normalize('NFD') // Tách dấu\r\n .replace(/[\\u0300-\\u036f]/g, '') // Xóa các dấu vừa tách\r\n .replace(/[đĐ]/g, 'd') // Quan trọng: Xử lý chữ đ/Đ thành d\r\n .trim()\r\n .replace(/[^a-zA-Z0-9]+/g, '_') // Thay ký tự đặc biệt bằng _\r\n .replace(/^_+|_+$/g, '') // Xóa _ ở đầu/cuối\r\n .toLowerCase(); // Chuyển thành chữ thường: doi_ky_thuat\r\n};\r\n\r\n/**\r\n * Tạo code duy nhất, tự động thêm suffix _n nếu bị trùng\r\n * @param name Tên cần convert\r\n * @param existingCodes Danh sách các code đã tồn tại\r\n */\r\nconst generateUniqueCode = (name: string, existingCodes: string[]): string => {\r\n // 1. Tạo base code trước\r\n const baseCode = convertToSnakeCaseCode(name);\r\n // 2. Nếu code chưa tồn tại thì trả về luôn\r\n if (!existingCodes.includes(baseCode)) {\r\n return baseCode;\r\n }\r\n // 3. Nếu trùng, bắt đầu loop để tìm index phù hợp\r\n let index = 1;\r\n let newCode = `${baseCode}_${index}`;\r\n\r\n while (existingCodes.includes(newCode)) {\r\n index++;\r\n newCode = `${baseCode}_${index}`;\r\n }\r\n return newCode;\r\n};\r\n\r\nconst sha256 = async (input: string): Promise<string> => {\r\n const buffer = new TextEncoder().encode(input);\r\n const hash = await crypto.subtle.digest('SHA-256', buffer);\r\n const bytes = new Uint8Array(hash);\r\n let binary = '';\r\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\r\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n};\r\n\r\nexport const StringUtilities = {\r\n REGEX_EMAIL,\r\n REGEX_PHONE,\r\n REGEX_PHONE_VN,\r\n REGEX_IDVN,\r\n REGEX_PASSPORT,\r\n REGEX_IDVN_OR_PASSPORT,\r\n REGEX_TIME,\r\n isValidEmail,\r\n isValidPhone,\r\n isValidCode,\r\n changeAliasLowerCase,\r\n aliasIncludes,\r\n format,\r\n templateToDisplay,\r\n parseExpression,\r\n encrypt,\r\n decrypt,\r\n isNullOrEmpty,\r\n isNullOrWhiteSpace,\r\n convertToSnakeCaseCode,\r\n generateUniqueCode,\r\n sha256,\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// export {};\r\n\r\nimport { StringUtilities } from './string.extension';\r\n\r\n// declare global {\r\n// interface Array<T = any> {\r\n// search(searchText: string | number, fields?: (string | undefined) | (string | undefined)[], children?: string): T[];\r\n// paging(pageSize: number, page?: number): T[];\r\n// toObject(key: string): Record<string, T>;\r\n// union(key: string, ...args: T[][]): T[];\r\n// distinct(): T[];\r\n// }\r\n// interface ArrayConstructor {\r\n// search<T = any>(items: T[], searchText: string | number, fields?: (string | undefined) | (string | undefined)[]): T[];\r\n// union<T = any>(key: string, ...args: T[][]): T[];\r\n// toObject<T = any>(key: string, items: T[]): Record<string, T>;\r\n// }\r\n// }\r\n\r\nconst search = <T = any>(items: T[], searchText: any, fields?: (string | undefined) | (string | undefined)[], children?: string): T[] => {\r\n if (!searchText?.toString()) {\r\n return items;\r\n }\r\n if (!items?.length) {\r\n return items;\r\n }\r\n if (Array.isArray(fields)) {\r\n const fs = fields.filter(e => e !== undefined && e !== null && e !== '') as string[];\r\n if (!fs.length) {\r\n return items.filter(item => item !== undefined && item !== null && StringUtilities.aliasIncludes(item, searchText));\r\n }\r\n return items.filter(\r\n item =>\r\n (item !== undefined && item !== null && fs.some(field => StringUtilities.aliasIncludes((item as any)[field], searchText))) ||\r\n (children && search((item as any)[children], searchText, fields, children)?.length)\r\n );\r\n }\r\n if (!fields) {\r\n return items.filter(item => item !== undefined && item !== null && StringUtilities.aliasIncludes(item, searchText));\r\n }\r\n return items.filter(\r\n item =>\r\n (item !== undefined && item !== null && StringUtilities.aliasIncludes((item as any)[fields], searchText)) ||\r\n (children && search((item as any)[children], searchText, fields, children)?.length)\r\n );\r\n};\r\n\r\n// Array.prototype.search = function <T = any>(\r\n// searchText: any,\r\n// fields?: (string | undefined) | (string | undefined)[],\r\n// children?: string\r\n// ): T[] {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return search(items, searchText, fields, children);\r\n// };\r\n\r\n// Array.prototype.paging = function <T extends Record<string, any> = any>(pageSize: number, page = 0): T[] {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return items.filter((_, index) => {\r\n// return index >= page * pageSize && index < (page + 1) * pageSize;\r\n// });\r\n// };\r\n\r\n// Array.prototype.toObject = function <T = any>(key: string): Record<string, T> {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return items\r\n// .filter(item => item !== undefined && item !== null)\r\n// .reduce<Record<string, any>>((obj, item: Record<string, any>) => {\r\n// const objKey = item?.[key]?.toString();\r\n// if (typeof objKey === 'string') {\r\n// obj[objKey] = item;\r\n// }\r\n// return obj;\r\n// }, {});\r\n// };\r\n\r\n// Array.prototype.union = function <T = Record<string, any>>(key: string, ...args: T[][]) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// let results: T[] = this;\r\n// const filterUnion = <T = any>(val: T, index: number, self: T[]) =>\r\n// val !== undefined && val !== null && self.findIndex(e => (e as any)[key] === (val as any)[key]) === index;\r\n// if (!args?.length) {\r\n// return results.filter(filterUnion);\r\n// }\r\n// for (const arg of args) {\r\n// if (Array.isArray(arg)) {\r\n// results = [...results, ...arg].filter(filterUnion);\r\n// }\r\n// }\r\n// return results;\r\n// };\r\n\r\n// Array.prototype.distinct = function () {\r\n// if (Array.isArray(this)) {\r\n// return [...new Set(this)];\r\n// }\r\n// return this;\r\n// };\r\n\r\nconst union = <T = unknown>(key: string, ...args: (T[] | undefined | null)[]) => {\r\n let results: T[] = [];\r\n const filterUnion = <T = any>(val: T, index: number, self: T[]) =>\r\n val !== undefined && val !== null && self.findIndex(e => (e as any)[key] === (val as any)[key]) === index;\r\n if (!args?.length) {\r\n return [];\r\n }\r\n for (const arg of args) {\r\n if (Array.isArray(arg)) {\r\n results = [...results, ...arg].filter(filterUnion);\r\n }\r\n }\r\n return results;\r\n};\r\n\r\nconst toObject = <T>(key: string, items: T[] | undefined | null): Record<string, T> => {\r\n if (!Array.isArray(items)) {\r\n return {};\r\n }\r\n return items\r\n .filter(item => item !== undefined && item !== null)\r\n .reduce<Record<string, any>>((obj, item: Record<string, any>) => {\r\n const objKey = item?.[key]?.toString();\r\n if (typeof objKey === 'string') {\r\n obj[objKey] = item;\r\n }\r\n return obj;\r\n }, {});\r\n};\r\n\r\nconst distinct = <T = any>(items: T[] | undefined | null) => {\r\n if (Array.isArray(items)) {\r\n return [...new Set(items)];\r\n }\r\n return [];\r\n};\r\n\r\nconst paging = <T = any>(items: T[] | undefined | null, pageSize: number, page = 0): T[] => {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n return items.filter((_, index) => {\r\n return index >= page * pageSize && index < (page + 1) * pageSize;\r\n });\r\n};\r\n\r\nexport const ArrayUtilities = {\r\n search,\r\n union,\r\n toObject,\r\n distinct,\r\n paging,\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// export {};\n\n// declare global {\n// interface NumberConstructor {\n// toVNCurrency(value: any): string | null;\n// toISO(value: any): string | null;\n// isNumber(value: any): boolean;\n// isPositiveInteger(value: any): boolean;\n// isPositiveNumber(value: any): boolean;\n// round(value: any, digits?: number): number | null;\n// }\n// }\n\nconst toVNCurrency = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('vi-VN', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst toVN = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('vi-VN', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst toISO = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('en-US', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst isPositiveInteger = (value: any) => {\n if (!value) {\n return false;\n }\n const regex = /^([0-9]*)$/;\n return regex.test(value) && +value > 0;\n};\n\nconst isPositiveNumber = (value: any) => {\n if (!value) {\n return false;\n }\n const regex = /^([0-9]*)(\\.[0-9]+$){0,1}$/;\n return regex.test(value) && +value > 0;\n};\n\nconst isNumber = (value: any) => {\n if (value === undefined || value === null || value === '') {\n return false;\n }\n return !Number.isNaN(+value);\n};\n\nconst round = (value: any, digits?: number): number | null => {\n digits = digits ?? 2;\n if (!NumberUtilities.isNumber(value)) {\n return null;\n }\n const val = Math.pow(10, digits);\n return Math.round(value * val) / val;\n};\n\nconst NumberUtilities = {\n toVNCurrency,\n toVN,\n toISO,\n isPositiveInteger,\n isPositiveNumber,\n isNumber,\n round,\n};\n\nexport { NumberUtilities };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// export {};\r\n\r\nimport { NumberUtilities } from './number.extension';\r\n\r\n// declare global {\r\n// interface Date {\r\n// begin(): Date;\r\n// end(): Date;\r\n// addMiliseconds(miliseconds: number): Date;\r\n// addHours(hours: number): Date;\r\n// addDays(days: number): Date;\r\n// addMonths(months: number): Date;\r\n// toFormat(format: string): string;\r\n// }\r\n// interface DateConstructor {\r\n// equal(date1: any, date2: any): boolean;\r\n// dayDiff(date1: any, date2: any): number | null;\r\n// monthDiff(date1: any, date2: any): number | null;\r\n// yearDiff(date1: any, date2: any): number | null;\r\n// age(date1: any, date2: any): number | null;\r\n// parseFrom(value: any, format: string): Date | null;\r\n// isDate(value: any): boolean;\r\n// toFormat(value: any, format: string): string;\r\n// addMiliseconds(value: any, miliseconds: number): Date | null;\r\n// addHours(value: any, hours: number): Date | null;\r\n// addDays(value: any, days: number): Date | null;\r\n// addMonths(value: any, months: number): Date | null;\r\n// begin(value: any): Date | null;\r\n// end(value: any): Date | null;\r\n// timeDifference(previous: any, current?: any): string;\r\n// }\r\n// }\r\n\r\nconst isDate = (value: any) => {\r\n if (value === undefined || value === null || value === '') {\r\n return false;\r\n }\r\n if (typeof value === 'string') {\r\n // Kiểm tra regex\r\n if (value.length < 8) {\r\n return false;\r\n } else {\r\n const date1 = value.substring(0, 10); // yyyy/MM/dd\r\n const date2 = value.substring(0, 9); // yyyy/M/dd, yyyy/MM/d\r\n const date3 = value.substring(0, 8); // yyyy/M/d\r\n const regex1 = /^(0[1-9]|[1-9]|1[0-2])(-|\\/)(0[1-9]|[1-9]|[12][0-9]|3[01])(-|\\/)(\\d{4})$/; // MM/dd/yyyy, MM-dd-yyyy\r\n const regex2 = /^(\\d{4})(-|\\/)(0[1-9]|[1-9]|1[0-2])(-|\\/)(0[1-9]|[1-9]|[12][0-9]|3[01])$/; // yyyy/MM/dd, yyyy-MM-dd\r\n const result =\r\n regex1.test(date1) || regex2.test(date1) || regex1.test(date2) || regex2.test(date2) || regex1.test(date3) || regex2.test(date3);\r\n if (result) {\r\n const date = new Date(value);\r\n return !isNaN(date.getTime());\r\n } else {\r\n return false;\r\n }\r\n }\r\n } else {\r\n const date = new Date(value);\r\n return !isNaN(date.getTime());\r\n }\r\n};\r\n\r\n// const toFormatBackup = (value: any, format: string): string => {\r\n// if (!isDate(value)) {\r\n// return '';\r\n// }\r\n// const date: Date = new Date(value);\r\n// let result = format;\r\n// result = result.replace('yyyy', date.getFullYear().toString());\r\n// result = result.replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'));\r\n// result = result.replace('dd', date.getDate().toString().padStart(2, '0'));\r\n// result = result.replace('HH', date.getHours().toString().padStart(2, '0'));\r\n// result = result.replace('mm', date.getMinutes().toString().padStart(2, '0'));\r\n// result = result.replace('ss', date.getSeconds().toString().padStart(2, '0'));\r\n// return result;\r\n// };\r\n\r\nconst toFormat = (value: any, format: string): string => {\r\n if (!isDate(value)) {\r\n return '';\r\n }\r\n\r\n const isDatePart = (type: Intl.DateTimeFormatPart['type']): type is 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' => {\r\n return type === 'year' || type === 'month' || type === 'day' || type === 'hour' || type === 'minute' || type === 'second';\r\n };\r\n\r\n const date = new Date(value);\r\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n const parts = new Intl.DateTimeFormat('en-GB', {\r\n timeZone,\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n }).formatToParts(date);\r\n const map: Partial<Record<'year' | 'month' | 'day' | 'hour' | 'minute' | 'second', string>> = {};\r\n parts.forEach(part => {\r\n if (isDatePart(part.type)) {\r\n map[part.type] = part.value;\r\n }\r\n });\r\n\r\n return format\r\n .replace('yyyy', map.year ?? '')\r\n .replace('MM', map.month ?? '')\r\n .replace('dd', map.day ?? '')\r\n .replace('HH', map.hour ?? '')\r\n .replace('mm', map.minute ?? '')\r\n .replace('ss', map.second ?? '');\r\n};\r\n\r\nconst addDays = (value: any, days: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setDate(date.getDate() + days);\r\n return date;\r\n};\r\n\r\nconst addMiliseconds = (value: any, miliseconds: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setMilliseconds(date.getMilliseconds() + miliseconds);\r\n return date;\r\n};\r\n\r\nconst begin = (value: any): Date | null => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n return new Date(toFormat(value, 'MM/dd/yyyy'));\r\n};\r\n\r\nconst end = (value: any): Date | null => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n return addMiliseconds(begin(addDays(value, 1)), -1);\r\n};\r\n\r\nconst equal = (date1: any, date2: any) => {\r\n if (!isDate(date1) && !isDate(date2)) {\r\n return true;\r\n }\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return false;\r\n }\r\n return new Date(date1).getTime() === new Date(date2).getTime();\r\n};\r\n\r\nconst dayDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n const diff = new Date(date2).getTime() - new Date(date1).getTime();\r\n return Math.floor(diff / (24 * 3600 * 1000));\r\n};\r\n\r\nconst monthDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n const d1Y = date1.getFullYear();\r\n const d2Y = date2.getFullYear();\r\n const d1M = date2.getMonth();\r\n const d2M = date2.getMonth();\r\n return d2M + 12 * d2Y - (d1M + 12 * d1Y);\r\n};\r\n\r\nconst yearDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n return new Date(date2).getFullYear() - new Date(date1).getFullYear();\r\n};\r\n\r\nconst age = (date1: any, date2: any) => {\r\n const diff = monthDiff(date1, date2);\r\n if (!diff) {\r\n return null;\r\n }\r\n return NumberUtilities.round(diff / 12);\r\n};\r\n\r\nconst parseFrom = (value: any, format: string) => {\r\n if (!value) {\r\n return null;\r\n }\r\n if (!format) {\r\n return null;\r\n }\r\n value = value.toString();\r\n const dmy = format.indexOf('dd') > -1 && format.indexOf('MM') > -1 && format.indexOf('yyyy') > -1;\r\n const hms = format.indexOf('HH') > -1 || format.indexOf('mm') > -1 || format.indexOf('ss') > -1;\r\n let strDate = '';\r\n if (dmy) {\r\n const dd = value.substr(format.indexOf('dd'), 'dd'.length);\r\n const MM = value.substr(format.indexOf('MM'), 'MM'.length);\r\n const yyyy = value.substr(format.indexOf('yyyy'), 'yyyy'.length);\r\n if (+yyyy > 0 && +MM > 0 && +dd > 0) {\r\n strDate += `${MM}/${dd}/${yyyy}`;\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n const today = new Date();\r\n const yyyy = today.getFullYear().toString();\r\n const MM = (today.getMonth() + 1).toString().padStart(2, '0');\r\n const dd = today.getDate().toString().padStart(2, '0');\r\n strDate += `${MM}/${dd}/${yyyy}`;\r\n }\r\n if (hms) {\r\n const HH = format.indexOf('HH') > -1 ? value.substr(format.indexOf('HH'), 'HH'.length) : '00';\r\n const mm = format.indexOf('mm') > -1 ? value.substr(format.indexOf('mm'), 'mm'.length) : '00';\r\n const ss = format.indexOf('ss') > -1 ? value.substr(format.indexOf('ss'), 'ss'.length) : '00';\r\n strDate += ` ${HH || '00'}:${mm || '00'}:${ss || '00'}`;\r\n }\r\n if (!isDate(strDate)) {\r\n return null;\r\n }\r\n return new Date(strDate);\r\n};\r\n\r\nconst addHours = (value: any, hours: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setHours(date.getHours() + hours);\r\n return date;\r\n};\r\n\r\nconst addMonths = (value: any, months: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setMonth(date.getMonth() + months);\r\n return date;\r\n};\r\n\r\nconst timeDifference = function (previous: any, current: any = new Date()) {\r\n if (!isDate(previous)) {\r\n return '';\r\n }\r\n if (!isDate(current)) {\r\n return '';\r\n }\r\n const from = new Date(previous);\r\n const to = new Date(current);\r\n const msPerMinute = 60 * 1000;\r\n const msPerHour = msPerMinute * 60;\r\n const msPerDay = msPerHour * 24;\r\n const msPerMonth = msPerDay * 30;\r\n const msPerYear = msPerDay * 365;\r\n const elapsed = to.getTime() - from.getTime();\r\n\r\n if (elapsed < msPerMinute) {\r\n return `${Math.round(elapsed / 1000)} seconds ago`;\r\n }\r\n\r\n if (elapsed < msPerHour) {\r\n return `${Math.round(elapsed / msPerMinute)} minutes ago`;\r\n }\r\n\r\n if (elapsed < msPerDay) {\r\n return `${Math.round(elapsed / msPerHour)} hours ago`;\r\n }\r\n\r\n if (elapsed < msPerMonth) {\r\n return `${Math.round(elapsed / msPerDay)} days ago`;\r\n }\r\n\r\n if (elapsed < msPerYear) {\r\n return `${Math.round(elapsed / msPerMonth)} months ago`;\r\n }\r\n return `${Math.round(elapsed / msPerYear)} years ago`;\r\n};\r\n\r\n// Date.prototype.begin = function () {\r\n// return new Date(this.toFormat('MM/dd/yyyy'));\r\n// };\r\n\r\n// Date.prototype.end = function () {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// return date.addDays(1).begin().addMiliseconds(-1);\r\n// };\r\n\r\n// Date.prototype.addMiliseconds = function (miliseconds: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setMilliseconds(date.getMilliseconds() + miliseconds);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addHours = function (hours: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setHours(date.getHours() + hours);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addDays = function (days: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setDate(date.getDate() + days);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addMonths = function (months: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setMonth(date.getMonth() + months);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.toFormat = function (format: string) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// let result = format;\r\n// result = result.replace('yyyy', date.getFullYear().toString());\r\n// result = result.replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'));\r\n// result = result.replace('dd', date.getDate().toString().padStart(2, '0'));\r\n// result = result.replace('HH', date.getHours().toString().padStart(2, '0'));\r\n// result = result.replace('mm', date.getMinutes().toString().padStart(2, '0'));\r\n// result = result.replace('ss', date.getSeconds().toString().padStart(2, '0'));\r\n// return result;\r\n// };\r\n\r\nconst DateUtilities = {\r\n equal,\r\n dayDiff,\r\n monthDiff,\r\n yearDiff,\r\n age,\r\n parseFrom,\r\n isDate,\r\n toFormat,\r\n addMiliseconds,\r\n addHours,\r\n addDays,\r\n addMonths,\r\n begin,\r\n end,\r\n timeDifference,\r\n};\r\n\r\nexport { DateUtilities };\r\n","const upload = (option?: { extensions?: string[]; maxSizeInMb?: number; validator?: (fileName: string) => string; multiple?: boolean }) => {\r\n const uploadId = 'U1e09c1c0-b647-437e-995e-d7a1a1b60550';\r\n const promise = new Promise<File | File[] | null>((resolve, reject) => {\r\n const body = document.getElementsByTagName('body')?.[0];\r\n if (!body) {\r\n resolve(null);\r\n return;\r\n }\r\n const existedElement = document.getElementById(uploadId);\r\n if (existedElement) {\r\n existedElement.remove();\r\n }\r\n const element = document.createElement('input');\r\n element.setAttribute('id', uploadId);\r\n element.setAttribute('type', 'file');\r\n if (option?.multiple) {\r\n element.setAttribute('multiple', '');\r\n }\r\n element.style.display = 'none';\r\n body.appendChild(element);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n element.addEventListener('change', (evt: any) => {\r\n try {\r\n const target = evt.target as DataTransfer;\r\n\r\n if (option?.multiple) {\r\n const files: File[] = [];\r\n for (const file of target.files) {\r\n if (file) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n const extension = file.name.substring(lastDot + 1);\r\n if (option) {\r\n if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n const message = `[${file.name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác`;\r\n throw new Error(message);\r\n }\r\n if (option.validator && option.validator(file.name)) {\r\n const message = option.validator(file.name);\r\n throw new Error(message);\r\n }\r\n }\r\n files.push(file);\r\n }\r\n resolve(files);\r\n }\r\n } else {\r\n const file = target.files.item(0);\r\n if (file) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n const extension = file.name.substring(lastDot + 1);\r\n if (option) {\r\n if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n const message = `[${file.name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác`;\r\n throw new Error(message);\r\n }\r\n if (option.validator && option.validator(file.name)) {\r\n const message = option.validator(file.name);\r\n throw new Error(message);\r\n }\r\n }\r\n resolve(file);\r\n }\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n element.click();\r\n });\r\n return promise;\r\n};\r\n\r\nconst generateFileName = (fileName?: string | null) => {\r\n if (!fileName) {\r\n return `file_${randomId()}`;\r\n }\r\n return fileName;\r\n};\r\n\r\nconst download = (fileOrPath: File | string | undefined | null, fileName?: string | null) => {\r\n if (!fileOrPath) {\r\n console.warn('No file or path provided for download');\r\n return;\r\n }\r\n fileName = generateFileName(fileName);\r\n if (fileOrPath instanceof File) {\r\n // Hoặc sử dụng cách thông thường:\r\n const url = URL.createObjectURL(fileOrPath);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileOrPath.name || fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url); // Giải phóng tài nguyên\r\n return;\r\n }\r\n const a = document.createElement('a');\r\n a.href = fileOrPath;\r\n if (fileOrPath.startsWith('http')) {\r\n a.target = '_blank'; // mở tab mới\r\n } else {\r\n a.download = fileName;\r\n }\r\n a.style.visibility = 'hidden';\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n return;\r\n};\r\n\r\nconst downloadBlob = (blob: Blob, fileName?: string) => {\r\n try {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n if (link.download !== undefined) {\r\n // feature detection\r\n link.download = generateFileName(fileName);\r\n link.href = url;\r\n link.style.visibility = 'hidden';\r\n document.body.appendChild(link);\r\n link.click();\r\n window.URL.revokeObjectURL(url);\r\n link.remove();\r\n }\r\n } catch (e) {\r\n console.error('BlobToSaveAs error', e);\r\n }\r\n};\r\n\r\nconst changeAliasLowerCase = (alias: string) => {\r\n let str = alias?.toString() ?? '';\r\n str = str.toString().toLowerCase();\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n // eslint-disable-next-line no-useless-escape\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, ' ');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n};\r\n\r\nconst copyToClipboard = (text: string) => {\r\n navigator.clipboard.writeText(text);\r\n};\r\n\r\nconst allWithPaging = async <T = unknown>(\r\n func: (pageSize: number, pageNumber: number) => Promise<{ items: T[]; total: number }>,\r\n defaultPageSize?: number\r\n): Promise<T[]> => {\r\n const pageSize = defaultPageSize || 1000;\r\n let pageNumber = 0;\r\n let count = 0;\r\n let items: T[] = [];\r\n while (true) {\r\n const res = await func(pageSize, pageNumber);\r\n if (Array(res?.items) && res?.total > 0) {\r\n items = [...items, ...res.items];\r\n count += res.items.length;\r\n pageNumber++;\r\n if (count >= res.total || !res.items?.length) {\r\n return items;\r\n }\r\n } else {\r\n return [];\r\n }\r\n }\r\n};\r\n\r\nconst isIncognito = async (): Promise<boolean> => {\r\n // Chrome-based\r\n if ('storage' in navigator && 'estimate' in navigator.storage) {\r\n try {\r\n const { quota } = await navigator.storage.estimate();\r\n if (quota && quota < 120 * 1024 * 1024) return true;\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n // Safari fallback\r\n try {\r\n localStorage.setItem('__incognito_test', '1');\r\n localStorage.removeItem('__incognito_test');\r\n return false;\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\nconst isMobile = (): boolean => {\r\n return /Mobi|Android/i.test(navigator.userAgent);\r\n};\r\n\r\nconst randomId = (prefix?: string | null): string => {\r\n const id = `${new Date().getTime().toString(36)}${Math.random().toString(36).substring(2, 7)}`;\r\n if (prefix) {\r\n return `${prefix}_${id}`;\r\n }\r\n return id;\r\n};\r\n\r\nconst hash = (obj: any): string => {\r\n const json = stableStringify(obj);\r\n let hash = 0;\r\n\r\n for (let i = 0; i < json.length; i++) {\r\n hash = (hash << 5) - hash + json.charCodeAt(i);\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n\r\n return `h${Math.abs(hash)}`;\r\n};\r\n\r\n/**\r\n * Convert object to stable JSON string (keys sorted)\r\n */\r\nconst stableStringify = (obj: any): string => {\r\n if (obj === null || typeof obj !== 'object') {\r\n return JSON.stringify(obj);\r\n }\r\n\r\n if (obj instanceof File) {\r\n // Chỉ serialize các thuộc tính quan trọng của File\r\n return JSON.stringify({\r\n __type: 'File',\r\n name: obj.name,\r\n size: obj.size,\r\n type: obj.type,\r\n lastModified: obj.lastModified,\r\n });\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return `[${obj.map(stableStringify).join(',')}]`;\r\n }\r\n\r\n const keys = Object.keys(obj).sort();\r\n const keyValuePairs = keys.map(key => `\"${key}\":${stableStringify(obj[key])}`);\r\n\r\n return `{${keyValuePairs.join(',')}}`;\r\n};\r\n\r\n// Hàm `parseQueryParams` dùng để phân tích chuỗi query string (phần sau dấu `?` trên URL)\r\n// và chuyển đổi nó thành một đối tượng JavaScript với các cặp key-value.\r\nconst parseQueryParams = (queryString?: string): Record<string, string> => {\r\n const params = new URLSearchParams(queryString || '');\r\n const result: Record<string, string> = {};\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n return result;\r\n};\r\n\r\n/**\r\n * Lấy địa chỉ IP public của client bằng cách gọi API bên thứ ba.\r\n */\r\nconst getClientPublicIp = async (): Promise<string | null> => {\r\n try {\r\n // Gọi đến API của ipify để lấy IP dưới dạng JSON\r\n const response = await fetch('https://api.ipify.org?format=json');\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n const data = await response.json();\r\n // Trả về địa chỉ IP\r\n return data.ip;\r\n } catch (error) {\r\n console.error('Không thể lấy địa chỉ IP:', error);\r\n return null; // Trả về null nếu có lỗi\r\n }\r\n};\r\n\r\n\r\n// Helper function với fallback\r\nconst generateUuid = (): string => {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback cho browser cũ\r\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\r\n};\r\n\r\n/**\r\n * Truy xuất giá trị của object dựa trên đường dẫn nested (VD: 'user.address.city')\r\n */\r\nconst getNestedValue = (obj: any, path: string) => {\r\n if (!obj || !path) return undefined;\r\n // Tách chuỗi theo dấu chấm và duyệt qua từng cấp của object\r\n return path.split('.').reduce((acc, part) => acc?.[part], obj);\r\n};\r\n\r\nconst SdUtilities = {\r\n upload,\r\n download,\r\n downloadBlob,\r\n changeAliasLowerCase,\r\n copyToClipboard,\r\n allWithPaging,\r\n isIncognito,\r\n isMobile,\r\n randomId,\r\n hash,\r\n parseQueryParams,\r\n getClientPublicIp,\r\n generateUuid,\r\n getNestedValue\r\n};\r\nexport { SdUtilities };\r\n\r\n","/**\r\n * Color Utilities Extension\r\n * Các tiện ích xử lý màu\r\n */\r\n\r\n/**\r\n * Chuyển đổi màu HSL sang định dạng hex\r\n * @param h - Hue (0-360)\r\n * @param s - Saturation (0-100)\r\n * @param l - Lightness (0-100)\r\n * @returns Mã màu hex\r\n */\r\nexport function hslToHex(h: number, s: number, l: number): string {\r\n // Chuyển đổi sang định dạng 0-1\r\n const hNormalized = h / 360;\r\n const sNormalized = s / 100;\r\n const lNormalized = l / 100;\r\n\r\n let r: number, g: number, b: number;\r\n\r\n if (sNormalized === 0) {\r\n // Màu xám (grayscale)\r\n r = g = b = lNormalized;\r\n } else {\r\n const hue2rgb = (p: number, q: number, t: number) => {\r\n if (t < 0) t += 1;\r\n if (t > 1) t -= 1;\r\n if (t < 1/6) return p + (q - p) * 6 * t;\r\n if (t < 1/2) return q;\r\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n };\r\n\r\n const q = lNormalized < 0.5 \r\n ? lNormalized * (1 + sNormalized) \r\n : lNormalized + sNormalized - lNormalized * sNormalized;\r\n const p = 2 * lNormalized - q;\r\n\r\n r = hue2rgb(p, q, hNormalized + 1/3);\r\n g = hue2rgb(p, q, hNormalized);\r\n b = hue2rgb(p, q, hNormalized - 1/3);\r\n }\r\n\r\n // Chuyển đổi sang hex\r\n const toHex = (x: number) => {\r\n const hex = Math.round(x * 255).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n\r\n/**\r\n * Chuyển đổi màu RGB sang hex\r\n * @param r - Red (0-255)\r\n * @param g - Green (0-255)\r\n * @param b - Blue (0-255)\r\n * @returns Mã màu hex\r\n */\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const toHex = (x: number) => {\r\n const hex = Math.round(Math.max(0, Math.min(255, x))).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n \r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["changeAliasLowerCase"],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-utilities-extensions.mjs","sources":["../../../projects/sd-angular/utilities/extensions/src/string.extension.ts","../../../projects/sd-angular/utilities/extensions/src/array.extension.ts","../../../projects/sd-angular/utilities/extensions/src/number.extension.ts","../../../projects/sd-angular/utilities/extensions/src/date.extension.ts","../../../projects/sd-angular/utilities/extensions/src/utility.extension.ts","../../../projects/sd-angular/utilities/extensions/src/color.extension.ts","../../../projects/sd-angular/utilities/extensions/sd-angular-core-utilities-extensions.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// declare global {\r\n// interface StringConstructor {\r\n// isValidEmail(value: any): boolean;\r\n// isValidPhone(value: any): boolean;\r\n// isValidCode(value: any): boolean;\r\n// changeAliasLowerCase(alias: any): string;\r\n// aliasIncludes(alias: any, searchText: any): boolean;\r\n// format(template: string, ...arr: any[]): string;\r\n// templateToDisplay(template: string, entity: any): string; // Convert theo format ${key}\r\n// encrypt(obj: any): string;\r\n// decrypt(encripted: string): any;\r\n// isNullOrEmpty(value: any): boolean;\r\n// isNullOrWhiteSpace(value: any): boolean;\r\n// }\r\n// }\r\n\r\nconst REGEX_EMAIL = '^(([^<>()[\\\\].,;:\\\\s@\"]+(\\\\.[^<>()[\\\\].,;:\\\\s@\"]+)*)|(\".+\"))@(([^<>()[\\\\].,;:\\\\s@\"]+\\\\.)+[^<>()[\\\\].,;:\\\\s@\"]{2,})$';\r\nconst REGEX_PHONE = '^[+]*[(]{0,1}[+]?[0-9]{1,4}[)]{0,1}[-\\\\s./0-9]*$';\r\nconst REGEX_PHONE_VN = '^(?:\\\\+84|0|84)(3[2-9]|5[2689]|7[06-9]|8[1-689]|9[0-9])\\\\d{7}$';\r\nconst REGEX_IDVN = '^\\\\d{12}$';\r\nconst REGEX_PASSPORT = '^[A-Z]\\\\d{7}$';\r\nconst REGEX_IDVN_OR_PASSPORT = '^(\\\\d{12}|[A-Z]\\\\d{7})$';\r\nconst REGEX_TIME = '^(?:[01]\\\\d|2[0-3]):[0-5]\\\\d$';\r\nconst isValidEmail = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = new RegExp(REGEX_EMAIL);\r\n return re.test(value);\r\n};\r\n\r\nconst isValidPhone = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = new RegExp(REGEX_PHONE);\r\n return re.test(value);\r\n};\r\n\r\nconst isValidCode = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = /^[a-zA-Z0-9\\@\\_\\-]{2,20}$/;\r\n return re.test(value);\r\n};\r\n\r\nconst isNullOrEmpty = (value: any) => {\r\n return value === undefined || value === null || value === '';\r\n};\r\n\r\nconst isNullOrWhiteSpace = (value: any) => {\r\n return value === undefined || value === null || typeof value !== 'string' || value.match(/^\\s*$/) !== null;\r\n};\r\n\r\nconst changeAliasLowerCase = (alias: any) => {\r\n let str: string = alias?.toString() ?? '';\r\n str = str.toString().toLowerCase();\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, ' ');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n};\r\n\r\nconst aliasIncludes = (alias: any, searchText: any) => {\r\n return changeAliasLowerCase(alias).includes(changeAliasLowerCase(searchText));\r\n};\r\n\r\nconst format = (template: string, ...arr: any[]) => {\r\n for (let i = 0; i < arr.length; i++) {\r\n const regexp = new RegExp(`\\\\{${i}\\\\}`, 'gi');\r\n template = template.replace(regexp, arr[i]);\r\n }\r\n return template;\r\n};\r\n\r\nconst getValueByPath = (entity: Record<string, any>, key: string) => {\r\n let value: any = entity;\r\n for (const part of key.split('.')) {\r\n value = value?.[part];\r\n }\r\n return value;\r\n};\r\n\r\n// Convert: `[${code}] ${name}` => `[Mã] Tên`;\r\nconst templateToDisplay = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return template;\r\n }\r\n const regex = /\\$\\{([A-Za-z0-9._-]*)\\}/g;\r\n const matches = template.match(regex) || [];\r\n for (const match of matches) {\r\n const key = match.slice(2, match.length - 1);\r\n if (key) {\r\n template = template.replace(match, getValueByPath(entity, key) ?? '');\r\n }\r\n }\r\n return template;\r\n};\r\n\r\nconst EXACT_TEMPLATE_REGEX = /^\\$\\{([A-Za-z0-9._-]*)\\}$/;\r\nconst NUMBER_LITERAL_REGEX = /^-?\\d+(\\.\\d+)?$/;\r\n\r\n// Convert placeholder/literal an toàn, không thực thi JavaScript động.\r\nconst parseExpression = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return undefined;\r\n }\r\n const trimmedTemplate = template.trim();\r\n const exactTemplateMatch = trimmedTemplate.match(EXACT_TEMPLATE_REGEX);\r\n if (exactTemplateMatch?.[1]) {\r\n return getValueByPath(entity, exactTemplateMatch[1]);\r\n }\r\n\r\n if (trimmedTemplate === 'true') {\r\n return true;\r\n }\r\n if (trimmedTemplate === 'false') {\r\n return false;\r\n }\r\n if (trimmedTemplate === 'null') {\r\n return null;\r\n }\r\n if (trimmedTemplate === 'undefined') {\r\n return undefined;\r\n }\r\n if (NUMBER_LITERAL_REGEX.test(trimmedTemplate)) {\r\n return Number(trimmedTemplate);\r\n }\r\n\r\n return templateToDisplay(template, entity);\r\n};\r\n\r\nconst SALT = 'cb9f4b2a-d26c-4787-a66e-e7130ee00f95';\r\n\r\nconst encrypt = (obj: any) => {\r\n obj = JSON.stringify(obj).split('');\r\n for (let i = 0, l = obj.length; i < l; i++)\r\n if (obj[i] == '{') obj[i] = '}';\r\n else if (obj[i] == '}') obj[i] = '{';\r\n return encodeURI(SALT + obj.join(''));\r\n};\r\n\r\nconst decrypt = (encripted: string) => {\r\n encripted = decodeURI(encripted);\r\n if (SALT && encripted.indexOf(SALT) != 0) throw new Error('object cannot be decrypted');\r\n const strs = encripted.substring(SALT.length).split('');\r\n for (let i = 0, l = strs.length; i < l; i++)\r\n if (strs[i] == '{') strs[i] = '}';\r\n else if (strs[i] == '}') strs[i] = '{';\r\n return JSON.parse(strs.join(''));\r\n};\r\n\r\n// Conver \"Đội Kỹ Thuật\" thành \"doi_ky_thuat\"\r\nconst convertToSnakeCaseCode = (name: string): string => {\r\n if (typeof name !== 'string') {\r\n throw new Error('Invalid name');\r\n }\r\n return name\r\n .normalize('NFD') // Tách dấu\r\n .replace(/[\\u0300-\\u036f]/g, '') // Xóa các dấu vừa tách\r\n .replace(/[đĐ]/g, 'd') // Quan trọng: Xử lý chữ đ/Đ thành d\r\n .trim()\r\n .replace(/[^a-zA-Z0-9]+/g, '_') // Thay ký tự đặc biệt bằng _\r\n .replace(/^_+|_+$/g, '') // Xóa _ ở đầu/cuối\r\n .toLowerCase(); // Chuyển thành chữ thường: doi_ky_thuat\r\n};\r\n\r\n/**\r\n * Tạo code duy nhất, tự động thêm suffix _n nếu bị trùng\r\n * @param name Tên cần convert\r\n * @param existingCodes Danh sách các code đã tồn tại\r\n */\r\nconst generateUniqueCode = (name: string, existingCodes: string[]): string => {\r\n // 1. Tạo base code trước\r\n const baseCode = convertToSnakeCaseCode(name);\r\n // 2. Nếu code chưa tồn tại thì trả về luôn\r\n if (!existingCodes.includes(baseCode)) {\r\n return baseCode;\r\n }\r\n // 3. Nếu trùng, bắt đầu loop để tìm index phù hợp\r\n let index = 1;\r\n let newCode = `${baseCode}_${index}`;\r\n\r\n while (existingCodes.includes(newCode)) {\r\n index++;\r\n newCode = `${baseCode}_${index}`;\r\n }\r\n return newCode;\r\n};\r\n\r\nconst sha256 = async (input: string): Promise<string> => {\r\n const buffer = new TextEncoder().encode(input);\r\n const hash = await crypto.subtle.digest('SHA-256', buffer);\r\n const bytes = new Uint8Array(hash);\r\n let binary = '';\r\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\r\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n};\r\n\r\nexport const StringUtilities = {\r\n REGEX_EMAIL,\r\n REGEX_PHONE,\r\n REGEX_PHONE_VN,\r\n REGEX_IDVN,\r\n REGEX_PASSPORT,\r\n REGEX_IDVN_OR_PASSPORT,\r\n REGEX_TIME,\r\n isValidEmail,\r\n isValidPhone,\r\n isValidCode,\r\n changeAliasLowerCase,\r\n aliasIncludes,\r\n format,\r\n templateToDisplay,\r\n parseExpression,\r\n encrypt,\r\n decrypt,\r\n isNullOrEmpty,\r\n isNullOrWhiteSpace,\r\n convertToSnakeCaseCode,\r\n generateUniqueCode,\r\n sha256,\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// export {};\r\n\r\nimport { StringUtilities } from './string.extension';\r\n\r\n// declare global {\r\n// interface Array<T = any> {\r\n// search(searchText: string | number, fields?: (string | undefined) | (string | undefined)[], children?: string): T[];\r\n// paging(pageSize: number, page?: number): T[];\r\n// toObject(key: string): Record<string, T>;\r\n// union(key: string, ...args: T[][]): T[];\r\n// distinct(): T[];\r\n// }\r\n// interface ArrayConstructor {\r\n// search<T = any>(items: T[], searchText: string | number, fields?: (string | undefined) | (string | undefined)[]): T[];\r\n// union<T = any>(key: string, ...args: T[][]): T[];\r\n// toObject<T = any>(key: string, items: T[]): Record<string, T>;\r\n// }\r\n// }\r\n\r\nconst search = <T = any>(items: T[], searchText: any, fields?: (string | undefined) | (string | undefined)[], children?: string): T[] => {\r\n if (!searchText?.toString()) {\r\n return items;\r\n }\r\n if (!items?.length) {\r\n return items;\r\n }\r\n if (Array.isArray(fields)) {\r\n const fs = fields.filter(e => e !== undefined && e !== null && e !== '') as string[];\r\n if (!fs.length) {\r\n return items.filter(item => item !== undefined && item !== null && StringUtilities.aliasIncludes(item, searchText));\r\n }\r\n return items.filter(\r\n item =>\r\n (item !== undefined && item !== null && fs.some(field => StringUtilities.aliasIncludes((item as any)[field], searchText))) ||\r\n (children && search((item as any)[children], searchText, fields, children)?.length)\r\n );\r\n }\r\n if (!fields) {\r\n return items.filter(item => item !== undefined && item !== null && StringUtilities.aliasIncludes(item, searchText));\r\n }\r\n return items.filter(\r\n item =>\r\n (item !== undefined && item !== null && StringUtilities.aliasIncludes((item as any)[fields], searchText)) ||\r\n (children && search((item as any)[children], searchText, fields, children)?.length)\r\n );\r\n};\r\n\r\n// Array.prototype.search = function <T = any>(\r\n// searchText: any,\r\n// fields?: (string | undefined) | (string | undefined)[],\r\n// children?: string\r\n// ): T[] {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return search(items, searchText, fields, children);\r\n// };\r\n\r\n// Array.prototype.paging = function <T extends Record<string, any> = any>(pageSize: number, page = 0): T[] {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return items.filter((_, index) => {\r\n// return index >= page * pageSize && index < (page + 1) * pageSize;\r\n// });\r\n// };\r\n\r\n// Array.prototype.toObject = function <T = any>(key: string): Record<string, T> {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return items\r\n// .filter(item => item !== undefined && item !== null)\r\n// .reduce<Record<string, any>>((obj, item: Record<string, any>) => {\r\n// const objKey = item?.[key]?.toString();\r\n// if (typeof objKey === 'string') {\r\n// obj[objKey] = item;\r\n// }\r\n// return obj;\r\n// }, {});\r\n// };\r\n\r\n// Array.prototype.union = function <T = Record<string, any>>(key: string, ...args: T[][]) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// let results: T[] = this;\r\n// const filterUnion = <T = any>(val: T, index: number, self: T[]) =>\r\n// val !== undefined && val !== null && self.findIndex(e => (e as any)[key] === (val as any)[key]) === index;\r\n// if (!args?.length) {\r\n// return results.filter(filterUnion);\r\n// }\r\n// for (const arg of args) {\r\n// if (Array.isArray(arg)) {\r\n// results = [...results, ...arg].filter(filterUnion);\r\n// }\r\n// }\r\n// return results;\r\n// };\r\n\r\n// Array.prototype.distinct = function () {\r\n// if (Array.isArray(this)) {\r\n// return [...new Set(this)];\r\n// }\r\n// return this;\r\n// };\r\n\r\nconst union = <T = unknown>(key: string, ...args: (T[] | undefined | null)[]) => {\r\n let results: T[] = [];\r\n const filterUnion = <T = any>(val: T, index: number, self: T[]) =>\r\n val !== undefined && val !== null && self.findIndex(e => (e as any)[key] === (val as any)[key]) === index;\r\n if (!args?.length) {\r\n return [];\r\n }\r\n for (const arg of args) {\r\n if (Array.isArray(arg)) {\r\n results = [...results, ...arg].filter(filterUnion);\r\n }\r\n }\r\n return results;\r\n};\r\n\r\nconst toObject = <T>(key: string, items: T[] | undefined | null): Record<string, T> => {\r\n if (!Array.isArray(items)) {\r\n return {};\r\n }\r\n return items\r\n .filter(item => item !== undefined && item !== null)\r\n .reduce<Record<string, any>>((obj, item: Record<string, any>) => {\r\n const objKey = item?.[key]?.toString();\r\n if (typeof objKey === 'string') {\r\n obj[objKey] = item;\r\n }\r\n return obj;\r\n }, {});\r\n};\r\n\r\nconst distinct = <T = any>(items: T[] | undefined | null) => {\r\n if (Array.isArray(items)) {\r\n return [...new Set(items)];\r\n }\r\n return [];\r\n};\r\n\r\nconst paging = <T = any>(items: T[] | undefined | null, pageSize: number, page = 0): T[] => {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n return items.filter((_, index) => {\r\n return index >= page * pageSize && index < (page + 1) * pageSize;\r\n });\r\n};\r\n\r\nexport const ArrayUtilities = {\r\n search,\r\n union,\r\n toObject,\r\n distinct,\r\n paging,\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// export {};\n\n// declare global {\n// interface NumberConstructor {\n// toVNCurrency(value: any): string | null;\n// toISO(value: any): string | null;\n// isNumber(value: any): boolean;\n// isPositiveInteger(value: any): boolean;\n// isPositiveNumber(value: any): boolean;\n// round(value: any, digits?: number): number | null;\n// }\n// }\n\nconst toVNCurrency = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('vi-VN', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst toVN = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('vi-VN', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst toISO = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('en-US', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst isPositiveInteger = (value: any) => {\n if (!value) {\n return false;\n }\n const regex = /^([0-9]*)$/;\n return regex.test(value) && +value > 0;\n};\n\nconst isPositiveNumber = (value: any) => {\n if (!value) {\n return false;\n }\n const regex = /^([0-9]*)(\\.[0-9]+$){0,1}$/;\n return regex.test(value) && +value > 0;\n};\n\nconst isNumber = (value: any) => {\n if (value === undefined || value === null || value === '') {\n return false;\n }\n return !Number.isNaN(+value);\n};\n\nconst round = (value: any, digits?: number): number | null => {\n digits = digits ?? 2;\n if (!NumberUtilities.isNumber(value)) {\n return null;\n }\n const val = Math.pow(10, digits);\n return Math.round(value * val) / val;\n};\n\nconst NumberUtilities = {\n toVNCurrency,\n toVN,\n toISO,\n isPositiveInteger,\n isPositiveNumber,\n isNumber,\n round,\n};\n\nexport { NumberUtilities };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// export {};\r\n\r\nimport { NumberUtilities } from './number.extension';\r\n\r\n// declare global {\r\n// interface Date {\r\n// begin(): Date;\r\n// end(): Date;\r\n// addMiliseconds(miliseconds: number): Date;\r\n// addHours(hours: number): Date;\r\n// addDays(days: number): Date;\r\n// addMonths(months: number): Date;\r\n// toFormat(format: string): string;\r\n// }\r\n// interface DateConstructor {\r\n// equal(date1: any, date2: any): boolean;\r\n// dayDiff(date1: any, date2: any): number | null;\r\n// monthDiff(date1: any, date2: any): number | null;\r\n// yearDiff(date1: any, date2: any): number | null;\r\n// age(date1: any, date2: any): number | null;\r\n// parseFrom(value: any, format: string): Date | null;\r\n// isDate(value: any): boolean;\r\n// toFormat(value: any, format: string): string;\r\n// addMiliseconds(value: any, miliseconds: number): Date | null;\r\n// addHours(value: any, hours: number): Date | null;\r\n// addDays(value: any, days: number): Date | null;\r\n// addMonths(value: any, months: number): Date | null;\r\n// begin(value: any): Date | null;\r\n// end(value: any): Date | null;\r\n// timeDifference(previous: any, current?: any): string;\r\n// }\r\n// }\r\n\r\nconst isDate = (value: any) => {\r\n if (value === undefined || value === null || value === '') {\r\n return false;\r\n }\r\n if (typeof value === 'string') {\r\n // Kiểm tra regex\r\n if (value.length < 8) {\r\n return false;\r\n } else {\r\n const date1 = value.substring(0, 10); // yyyy/MM/dd\r\n const date2 = value.substring(0, 9); // yyyy/M/dd, yyyy/MM/d\r\n const date3 = value.substring(0, 8); // yyyy/M/d\r\n const regex1 = /^(0[1-9]|[1-9]|1[0-2])(-|\\/)(0[1-9]|[1-9]|[12][0-9]|3[01])(-|\\/)(\\d{4})$/; // MM/dd/yyyy, MM-dd-yyyy\r\n const regex2 = /^(\\d{4})(-|\\/)(0[1-9]|[1-9]|1[0-2])(-|\\/)(0[1-9]|[1-9]|[12][0-9]|3[01])$/; // yyyy/MM/dd, yyyy-MM-dd\r\n const result =\r\n regex1.test(date1) || regex2.test(date1) || regex1.test(date2) || regex2.test(date2) || regex1.test(date3) || regex2.test(date3);\r\n if (result) {\r\n const date = new Date(value);\r\n return !isNaN(date.getTime());\r\n } else {\r\n return false;\r\n }\r\n }\r\n } else {\r\n const date = new Date(value);\r\n return !isNaN(date.getTime());\r\n }\r\n};\r\n\r\n// const toFormatBackup = (value: any, format: string): string => {\r\n// if (!isDate(value)) {\r\n// return '';\r\n// }\r\n// const date: Date = new Date(value);\r\n// let result = format;\r\n// result = result.replace('yyyy', date.getFullYear().toString());\r\n// result = result.replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'));\r\n// result = result.replace('dd', date.getDate().toString().padStart(2, '0'));\r\n// result = result.replace('HH', date.getHours().toString().padStart(2, '0'));\r\n// result = result.replace('mm', date.getMinutes().toString().padStart(2, '0'));\r\n// result = result.replace('ss', date.getSeconds().toString().padStart(2, '0'));\r\n// return result;\r\n// };\r\n\r\nconst toFormat = (value: any, format: string): string => {\r\n if (!isDate(value)) {\r\n return '';\r\n }\r\n\r\n const isDatePart = (type: Intl.DateTimeFormatPart['type']): type is 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' => {\r\n return type === 'year' || type === 'month' || type === 'day' || type === 'hour' || type === 'minute' || type === 'second';\r\n };\r\n\r\n const date = new Date(value);\r\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n const parts = new Intl.DateTimeFormat('en-GB', {\r\n timeZone,\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n }).formatToParts(date);\r\n const map: Partial<Record<'year' | 'month' | 'day' | 'hour' | 'minute' | 'second', string>> = {};\r\n parts.forEach(part => {\r\n if (isDatePart(part.type)) {\r\n map[part.type] = part.value;\r\n }\r\n });\r\n\r\n return format\r\n .replace('yyyy', map.year ?? '')\r\n .replace('MM', map.month ?? '')\r\n .replace('dd', map.day ?? '')\r\n .replace('HH', map.hour ?? '')\r\n .replace('mm', map.minute ?? '')\r\n .replace('ss', map.second ?? '');\r\n};\r\n\r\nconst addDays = (value: any, days: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setDate(date.getDate() + days);\r\n return date;\r\n};\r\n\r\nconst addMiliseconds = (value: any, miliseconds: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setMilliseconds(date.getMilliseconds() + miliseconds);\r\n return date;\r\n};\r\n\r\nconst begin = (value: any): Date | null => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n return new Date(toFormat(value, 'MM/dd/yyyy'));\r\n};\r\n\r\nconst end = (value: any): Date | null => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n return addMiliseconds(begin(addDays(value, 1)), -1);\r\n};\r\n\r\nconst equal = (date1: any, date2: any) => {\r\n if (!isDate(date1) && !isDate(date2)) {\r\n return true;\r\n }\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return false;\r\n }\r\n return new Date(date1).getTime() === new Date(date2).getTime();\r\n};\r\n\r\nconst dayDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n const diff = new Date(date2).getTime() - new Date(date1).getTime();\r\n return Math.floor(diff / (24 * 3600 * 1000));\r\n};\r\n\r\nconst monthDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n const d1Y = date1.getFullYear();\r\n const d2Y = date2.getFullYear();\r\n const d1M = date2.getMonth();\r\n const d2M = date2.getMonth();\r\n return d2M + 12 * d2Y - (d1M + 12 * d1Y);\r\n};\r\n\r\nconst yearDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n return new Date(date2).getFullYear() - new Date(date1).getFullYear();\r\n};\r\n\r\nconst age = (date1: any, date2: any) => {\r\n const diff = monthDiff(date1, date2);\r\n if (!diff) {\r\n return null;\r\n }\r\n return NumberUtilities.round(diff / 12);\r\n};\r\n\r\nconst parseFrom = (value: any, format: string) => {\r\n if (!value) {\r\n return null;\r\n }\r\n if (!format) {\r\n return null;\r\n }\r\n value = value.toString();\r\n const dmy = format.indexOf('dd') > -1 && format.indexOf('MM') > -1 && format.indexOf('yyyy') > -1;\r\n const hms = format.indexOf('HH') > -1 || format.indexOf('mm') > -1 || format.indexOf('ss') > -1;\r\n let strDate = '';\r\n if (dmy) {\r\n const dd = value.substr(format.indexOf('dd'), 'dd'.length);\r\n const MM = value.substr(format.indexOf('MM'), 'MM'.length);\r\n const yyyy = value.substr(format.indexOf('yyyy'), 'yyyy'.length);\r\n if (+yyyy > 0 && +MM > 0 && +dd > 0) {\r\n strDate += `${MM}/${dd}/${yyyy}`;\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n const today = new Date();\r\n const yyyy = today.getFullYear().toString();\r\n const MM = (today.getMonth() + 1).toString().padStart(2, '0');\r\n const dd = today.getDate().toString().padStart(2, '0');\r\n strDate += `${MM}/${dd}/${yyyy}`;\r\n }\r\n if (hms) {\r\n const HH = format.indexOf('HH') > -1 ? value.substr(format.indexOf('HH'), 'HH'.length) : '00';\r\n const mm = format.indexOf('mm') > -1 ? value.substr(format.indexOf('mm'), 'mm'.length) : '00';\r\n const ss = format.indexOf('ss') > -1 ? value.substr(format.indexOf('ss'), 'ss'.length) : '00';\r\n strDate += ` ${HH || '00'}:${mm || '00'}:${ss || '00'}`;\r\n }\r\n if (!isDate(strDate)) {\r\n return null;\r\n }\r\n return new Date(strDate);\r\n};\r\n\r\nconst addHours = (value: any, hours: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setHours(date.getHours() + hours);\r\n return date;\r\n};\r\n\r\nconst addMonths = (value: any, months: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setMonth(date.getMonth() + months);\r\n return date;\r\n};\r\n\r\nconst timeDifference = function (previous: any, current: any = new Date()) {\r\n if (!isDate(previous)) {\r\n return '';\r\n }\r\n if (!isDate(current)) {\r\n return '';\r\n }\r\n const from = new Date(previous);\r\n const to = new Date(current);\r\n const msPerMinute = 60 * 1000;\r\n const msPerHour = msPerMinute * 60;\r\n const msPerDay = msPerHour * 24;\r\n const msPerMonth = msPerDay * 30;\r\n const msPerYear = msPerDay * 365;\r\n const elapsed = to.getTime() - from.getTime();\r\n\r\n if (elapsed < msPerMinute) {\r\n return `${Math.round(elapsed / 1000)} seconds ago`;\r\n }\r\n\r\n if (elapsed < msPerHour) {\r\n return `${Math.round(elapsed / msPerMinute)} minutes ago`;\r\n }\r\n\r\n if (elapsed < msPerDay) {\r\n return `${Math.round(elapsed / msPerHour)} hours ago`;\r\n }\r\n\r\n if (elapsed < msPerMonth) {\r\n return `${Math.round(elapsed / msPerDay)} days ago`;\r\n }\r\n\r\n if (elapsed < msPerYear) {\r\n return `${Math.round(elapsed / msPerMonth)} months ago`;\r\n }\r\n return `${Math.round(elapsed / msPerYear)} years ago`;\r\n};\r\n\r\n// Date.prototype.begin = function () {\r\n// return new Date(this.toFormat('MM/dd/yyyy'));\r\n// };\r\n\r\n// Date.prototype.end = function () {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// return date.addDays(1).begin().addMiliseconds(-1);\r\n// };\r\n\r\n// Date.prototype.addMiliseconds = function (miliseconds: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setMilliseconds(date.getMilliseconds() + miliseconds);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addHours = function (hours: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setHours(date.getHours() + hours);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addDays = function (days: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setDate(date.getDate() + days);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addMonths = function (months: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setMonth(date.getMonth() + months);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.toFormat = function (format: string) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// let result = format;\r\n// result = result.replace('yyyy', date.getFullYear().toString());\r\n// result = result.replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'));\r\n// result = result.replace('dd', date.getDate().toString().padStart(2, '0'));\r\n// result = result.replace('HH', date.getHours().toString().padStart(2, '0'));\r\n// result = result.replace('mm', date.getMinutes().toString().padStart(2, '0'));\r\n// result = result.replace('ss', date.getSeconds().toString().padStart(2, '0'));\r\n// return result;\r\n// };\r\n\r\nconst DateUtilities = {\r\n equal,\r\n dayDiff,\r\n monthDiff,\r\n yearDiff,\r\n age,\r\n parseFrom,\r\n isDate,\r\n toFormat,\r\n addMiliseconds,\r\n addHours,\r\n addDays,\r\n addMonths,\r\n begin,\r\n end,\r\n timeDifference,\r\n};\r\n\r\nexport { DateUtilities };\r\n","const upload = (option?: { extensions?: string[]; maxSizeInMb?: number; validator?: (fileName: string) => string; multiple?: boolean }) => {\r\n const uploadId = 'U1e09c1c0-b647-437e-995e-d7a1a1b60550';\r\n const promise = new Promise<File | File[] | null>((resolve, reject) => {\r\n const body = document.getElementsByTagName('body')?.[0];\r\n if (!body) {\r\n resolve(null);\r\n return;\r\n }\r\n const existedElement = document.getElementById(uploadId);\r\n if (existedElement) {\r\n existedElement.remove();\r\n }\r\n const element = document.createElement('input');\r\n element.setAttribute('id', uploadId);\r\n element.setAttribute('type', 'file');\r\n if (option?.multiple) {\r\n element.setAttribute('multiple', '');\r\n }\r\n element.style.display = 'none';\r\n body.appendChild(element);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n element.addEventListener('change', (evt: any) => {\r\n try {\r\n const target = evt.target as DataTransfer;\r\n\r\n // Throw i18n KEY thay vì chuỗi đã dịch — utility là pure function nên không\r\n // inject() được; consumer (component/service) chịu trách nhiệm i18n.t(err.message, { name }).\r\n // Quy ước: SdUploadError có shape { key, params } được set qua Error.cause để consumer trích xuất an toàn.\r\n const throwUploadError = (key: string, name: string): never => {\r\n const err = new Error(key);\r\n (err as Error & { i18nParams?: Record<string, string> }).i18nParams = { name };\r\n throw err;\r\n };\r\n\r\n if (option?.multiple) {\r\n const files: File[] = [];\r\n for (const file of target.files) {\r\n if (file) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n throwUploadError('core.utility.upload.invalid-format', file.name);\r\n }\r\n const extension = file.name.substring(lastDot + 1);\r\n if (option) {\r\n if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {\r\n throwUploadError('core.utility.upload.invalid-format', file.name);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n throwUploadError('core.utility.upload.invalid-size', file.name);\r\n }\r\n if (option.validator && option.validator(file.name)) {\r\n // Custom validator returns its own message — pass through as-is (caller defines format).\r\n const message = option.validator(file.name);\r\n throw new Error(message);\r\n }\r\n }\r\n files.push(file);\r\n }\r\n resolve(files);\r\n }\r\n } else {\r\n const file = target.files.item(0);\r\n if (file) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n throwUploadError('core.utility.upload.invalid-format', file.name);\r\n }\r\n const extension = file.name.substring(lastDot + 1);\r\n if (option) {\r\n if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {\r\n throwUploadError('core.utility.upload.invalid-format', file.name);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n throwUploadError('core.utility.upload.invalid-size', file.name);\r\n }\r\n if (option.validator && option.validator(file.name)) {\r\n const message = option.validator(file.name);\r\n throw new Error(message);\r\n }\r\n }\r\n resolve(file);\r\n }\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n element.click();\r\n });\r\n return promise;\r\n};\r\n\r\nconst generateFileName = (fileName?: string | null) => {\r\n if (!fileName) {\r\n return `file_${randomId()}`;\r\n }\r\n return fileName;\r\n};\r\n\r\nconst download = (fileOrPath: File | string | undefined | null, fileName?: string | null) => {\r\n if (!fileOrPath) {\r\n console.warn('No file or path provided for download');\r\n return;\r\n }\r\n fileName = generateFileName(fileName);\r\n if (fileOrPath instanceof File) {\r\n // Hoặc sử dụng cách thông thường:\r\n const url = URL.createObjectURL(fileOrPath);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileOrPath.name || fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url); // Giải phóng tài nguyên\r\n return;\r\n }\r\n const a = document.createElement('a');\r\n a.href = fileOrPath;\r\n if (fileOrPath.startsWith('http')) {\r\n a.target = '_blank'; // mở tab mới\r\n } else {\r\n a.download = fileName;\r\n }\r\n a.style.visibility = 'hidden';\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n return;\r\n};\r\n\r\nconst downloadBlob = (blob: Blob, fileName?: string) => {\r\n try {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n if (link.download !== undefined) {\r\n // feature detection\r\n link.download = generateFileName(fileName);\r\n link.href = url;\r\n link.style.visibility = 'hidden';\r\n document.body.appendChild(link);\r\n link.click();\r\n window.URL.revokeObjectURL(url);\r\n link.remove();\r\n }\r\n } catch (e) {\r\n console.error('BlobToSaveAs error', e);\r\n }\r\n};\r\n\r\nconst changeAliasLowerCase = (alias: string) => {\r\n let str = alias?.toString() ?? '';\r\n str = str.toString().toLowerCase();\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n // eslint-disable-next-line no-useless-escape\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, ' ');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n};\r\n\r\nconst copyToClipboard = (text: string) => {\r\n navigator.clipboard.writeText(text);\r\n};\r\n\r\nconst allWithPaging = async <T = unknown>(\r\n func: (pageSize: number, pageNumber: number) => Promise<{ items: T[]; total: number }>,\r\n defaultPageSize?: number\r\n): Promise<T[]> => {\r\n const pageSize = defaultPageSize || 1000;\r\n let pageNumber = 0;\r\n let count = 0;\r\n let items: T[] = [];\r\n while (true) {\r\n const res = await func(pageSize, pageNumber);\r\n if (Array(res?.items) && res?.total > 0) {\r\n items = [...items, ...res.items];\r\n count += res.items.length;\r\n pageNumber++;\r\n if (count >= res.total || !res.items?.length) {\r\n return items;\r\n }\r\n } else {\r\n return [];\r\n }\r\n }\r\n};\r\n\r\nconst isIncognito = async (): Promise<boolean> => {\r\n // Chrome-based\r\n if ('storage' in navigator && 'estimate' in navigator.storage) {\r\n try {\r\n const { quota } = await navigator.storage.estimate();\r\n if (quota && quota < 120 * 1024 * 1024) return true;\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n // Safari fallback\r\n try {\r\n localStorage.setItem('__incognito_test', '1');\r\n localStorage.removeItem('__incognito_test');\r\n return false;\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\nconst isMobile = (): boolean => {\r\n return /Mobi|Android/i.test(navigator.userAgent);\r\n};\r\n\r\nconst randomId = (prefix?: string | null): string => {\r\n const id = `${new Date().getTime().toString(36)}${Math.random().toString(36).substring(2, 7)}`;\r\n if (prefix) {\r\n return `${prefix}_${id}`;\r\n }\r\n return id;\r\n};\r\n\r\nconst hash = (obj: any): string => {\r\n const json = stableStringify(obj);\r\n let hash = 0;\r\n\r\n for (let i = 0; i < json.length; i++) {\r\n hash = (hash << 5) - hash + json.charCodeAt(i);\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n\r\n return `h${Math.abs(hash)}`;\r\n};\r\n\r\n/**\r\n * Convert object to stable JSON string (keys sorted)\r\n */\r\nconst stableStringify = (obj: any): string => {\r\n if (obj === null || typeof obj !== 'object') {\r\n return JSON.stringify(obj);\r\n }\r\n\r\n if (obj instanceof File) {\r\n // Chỉ serialize các thuộc tính quan trọng của File\r\n return JSON.stringify({\r\n __type: 'File',\r\n name: obj.name,\r\n size: obj.size,\r\n type: obj.type,\r\n lastModified: obj.lastModified,\r\n });\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return `[${obj.map(stableStringify).join(',')}]`;\r\n }\r\n\r\n const keys = Object.keys(obj).sort();\r\n const keyValuePairs = keys.map(key => `\"${key}\":${stableStringify(obj[key])}`);\r\n\r\n return `{${keyValuePairs.join(',')}}`;\r\n};\r\n\r\n// Hàm `parseQueryParams` dùng để phân tích chuỗi query string (phần sau dấu `?` trên URL)\r\n// và chuyển đổi nó thành một đối tượng JavaScript với các cặp key-value.\r\nconst parseQueryParams = (queryString?: string): Record<string, string> => {\r\n const params = new URLSearchParams(queryString || '');\r\n const result: Record<string, string> = {};\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n return result;\r\n};\r\n\r\n/**\r\n * Lấy địa chỉ IP public của client bằng cách gọi API bên thứ ba.\r\n */\r\nconst getClientPublicIp = async (): Promise<string | null> => {\r\n try {\r\n // Gọi đến API của ipify để lấy IP dưới dạng JSON\r\n const response = await fetch('https://api.ipify.org?format=json');\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n const data = await response.json();\r\n // Trả về địa chỉ IP\r\n return data.ip;\r\n } catch (error) {\r\n console.error('Failed to fetch client IP:', error);\r\n return null; // Trả về null nếu có lỗi\r\n }\r\n};\r\n\r\n\r\n// Helper function với fallback\r\nconst generateUuid = (): string => {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback cho browser cũ\r\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\r\n};\r\n\r\n/**\r\n * Truy xuất giá trị của object dựa trên đường dẫn nested (VD: 'user.address.city')\r\n */\r\nconst getNestedValue = (obj: any, path: string) => {\r\n if (!obj || !path) return undefined;\r\n // Tách chuỗi theo dấu chấm và duyệt qua từng cấp của object\r\n return path.split('.').reduce((acc, part) => acc?.[part], obj);\r\n};\r\n\r\nconst SdUtilities = {\r\n upload,\r\n download,\r\n downloadBlob,\r\n changeAliasLowerCase,\r\n copyToClipboard,\r\n allWithPaging,\r\n isIncognito,\r\n isMobile,\r\n randomId,\r\n hash,\r\n parseQueryParams,\r\n getClientPublicIp,\r\n generateUuid,\r\n getNestedValue\r\n};\r\nexport { SdUtilities };\r\n\r\n","/**\r\n * Color Utilities Extension\r\n * Các tiện ích xử lý màu\r\n */\r\n\r\n/**\r\n * Chuyển đổi màu HSL sang định dạng hex\r\n * @param h - Hue (0-360)\r\n * @param s - Saturation (0-100)\r\n * @param l - Lightness (0-100)\r\n * @returns Mã màu hex\r\n */\r\nexport function hslToHex(h: number, s: number, l: number): string {\r\n // Chuyển đổi sang định dạng 0-1\r\n const hNormalized = h / 360;\r\n const sNormalized = s / 100;\r\n const lNormalized = l / 100;\r\n\r\n let r: number, g: number, b: number;\r\n\r\n if (sNormalized === 0) {\r\n // Màu xám (grayscale)\r\n r = g = b = lNormalized;\r\n } else {\r\n const hue2rgb = (p: number, q: number, t: number) => {\r\n if (t < 0) t += 1;\r\n if (t > 1) t -= 1;\r\n if (t < 1/6) return p + (q - p) * 6 * t;\r\n if (t < 1/2) return q;\r\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n };\r\n\r\n const q = lNormalized < 0.5 \r\n ? lNormalized * (1 + sNormalized) \r\n : lNormalized + sNormalized - lNormalized * sNormalized;\r\n const p = 2 * lNormalized - q;\r\n\r\n r = hue2rgb(p, q, hNormalized + 1/3);\r\n g = hue2rgb(p, q, hNormalized);\r\n b = hue2rgb(p, q, hNormalized - 1/3);\r\n }\r\n\r\n // Chuyển đổi sang hex\r\n const toHex = (x: number) => {\r\n const hex = Math.round(x * 255).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n\r\n/**\r\n * Chuyển đổi màu RGB sang hex\r\n * @param r - Red (0-255)\r\n * @param g - Green (0-255)\r\n * @param b - Blue (0-255)\r\n * @returns Mã màu hex\r\n */\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const toHex = (x: number) => {\r\n const hex = Math.round(Math.max(0, Math.min(255, x))).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n \r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["changeAliasLowerCase"],"mappings":"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"}
@@ -6,45 +6,45 @@ const DefaultMaterialIconFontSet = 'material-icons-outlined';
6
6
  const SdPatternCommons = [
7
7
  {
8
8
  type: 'EMAIL',
9
- name: 'Email',
9
+ name: 'core.validator.email.name',
10
10
  regex: StringUtilities.REGEX_EMAIL,
11
- errorMessage: 'Email không hợp lệ',
11
+ errorMessage: 'core.validator.email.error',
12
12
  },
13
13
  {
14
14
  type: 'PHONE',
15
- name: 'SĐT',
15
+ name: 'core.validator.phone.name',
16
16
  regex: StringUtilities.REGEX_PHONE,
17
- errorMessage: 'Số điện thoại không hợp lệ',
17
+ errorMessage: 'core.validator.phone.error',
18
18
  },
19
19
  {
20
20
  type: 'PHONE_VN',
21
- name: 'SĐT VN',
21
+ name: 'core.validator.phone-vn.name',
22
22
  regex: StringUtilities.REGEX_PHONE_VN,
23
- errorMessage: 'Số điện thoại không hợp lệ',
23
+ errorMessage: 'core.validator.phone-vn.error',
24
24
  },
25
25
  {
26
26
  type: 'IDVN',
27
- name: 'CCCD',
27
+ name: 'core.validator.cccd.name',
28
28
  regex: StringUtilities.REGEX_IDVN,
29
- errorMessage: 'CCCD không hợp lệ (9 hoặc 12 chữ số)',
29
+ errorMessage: 'core.validator.cccd.error',
30
30
  },
31
31
  {
32
32
  type: 'PASSPORT',
33
- name: 'Hộ chiếu',
33
+ name: 'core.validator.passport.name',
34
34
  regex: StringUtilities.REGEX_PASSPORT,
35
- errorMessage: 'Hộ chiếu không hợp lệ (1 chữ cái + 7 chữ số)',
35
+ errorMessage: 'core.validator.passport.error',
36
36
  },
37
37
  {
38
38
  type: 'IDVN_OR_PASSPORT',
39
- name: 'CCCD/Hộ chiếu',
39
+ name: 'core.validator.id-vn.name',
40
40
  regex: StringUtilities.REGEX_IDVN_OR_PASSPORT,
41
- errorMessage: 'CCCD/CMND hoặc Hộ chiếu không hợp lệ',
41
+ errorMessage: 'core.validator.id-vn.error',
42
42
  },
43
43
  {
44
44
  type: 'TIME',
45
- name: 'Giờ',
45
+ name: 'core.validator.time.name',
46
46
  regex: StringUtilities.REGEX_TIME,
47
- errorMessage: 'Giờ không hợp lệ (định dạng HH:mm)',
47
+ errorMessage: 'core.validator.time.error',
48
48
  },
49
49
  ];
50
50
 
@@ -72,76 +72,78 @@ function isObservable(obj) {
72
72
  return obj && typeof obj.subscribe === 'function';
73
73
  }
74
74
 
75
+ // `display` chứa i18n KEY (không phải chuỗi đã dịch).
76
+ // Consumer phải gọi i18n.t(display) trước khi render ra UI.
75
77
  const SdOperators = [
76
78
  {
77
79
  value: 'EQUAL',
78
80
  symbol: '=',
79
- display: 'Bằng',
81
+ display: 'core.operator.equal.display',
80
82
  },
81
83
  {
82
84
  value: 'NOT_EQUAL',
83
85
  symbol: '≠',
84
- display: 'Không bằng',
86
+ display: 'core.operator.not-equal.display',
85
87
  },
86
88
  {
87
89
  value: 'GREATER_THAN',
88
90
  symbol: '>',
89
- display: 'Lớn hơn',
91
+ display: 'core.operator.greater-than.display',
90
92
  },
91
93
  {
92
94
  value: 'LESS_THAN',
93
95
  symbol: '<',
94
- display: 'Nhỏ hơn',
96
+ display: 'core.operator.less-than.display',
95
97
  },
96
98
  {
97
99
  value: 'GREATER_OR_EQUAL',
98
100
  symbol: '≥',
99
- display: 'Lớn hơn, hoặc bằng',
101
+ display: 'core.operator.greater-or-equal.display',
100
102
  },
101
103
  {
102
104
  value: 'LESS_OR_EQUAL',
103
105
  symbol: '≤',
104
- display: 'Nhỏ hơn, hoặc bằng',
106
+ display: 'core.operator.less-or-equal.display',
105
107
  },
106
108
  {
107
109
  value: 'CONTAIN',
108
110
  symbol: 'join_inner',
109
- display: 'Chứa',
111
+ display: 'core.operator.contain.display',
110
112
  },
111
113
  {
112
114
  value: 'NOT_CONTAIN',
113
115
  symbol: 'join',
114
- display: 'Không chứa',
116
+ display: 'core.operator.not-contain.display',
115
117
  },
116
118
  {
117
119
  value: 'START_WITH',
118
120
  symbol: 'line_start_circle',
119
- display: 'Bắt đầu bởi',
121
+ display: 'core.operator.start-with.display',
120
122
  },
121
123
  {
122
124
  value: 'END_WITH',
123
125
  symbol: 'line_end_circle',
124
- display: 'Kết thúc bởi',
126
+ display: 'core.operator.end-with.display',
125
127
  },
126
128
  {
127
129
  value: 'IN',
128
130
  symbol: 'checklist_rtl',
129
- display: 'Nằm trong',
131
+ display: 'core.operator.in.display',
130
132
  },
131
133
  {
132
134
  value: 'NOT_IN',
133
135
  symbol: 'event_list',
134
- display: 'Không nằm trong',
136
+ display: 'core.operator.not-in.display',
135
137
  },
136
138
  {
137
139
  value: 'NULL',
138
140
  symbol: 'motion_photos_off',
139
- display: 'Là rỗng',
141
+ display: 'core.operator.null.display',
140
142
  },
141
143
  {
142
144
  value: 'NOT_NULL',
143
145
  symbol: 'adjust',
144
- display: 'Không rỗng',
146
+ display: 'core.operator.not-null.display',
145
147
  },
146
148
  ];
147
149