@sd-angular/core 19.0.0-beta.94 → 19.0.0-beta.96
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.
- package/README.md +10 -10
- package/components/anchor/src/components/anchor/anchor.component.d.ts +4 -1
- package/components/anchor/src/components/anchor-item/anchor-item.component.d.ts +2 -1
- package/components/anchor/src/components/anchor-vertical/anchor-vertical-list.component.d.ts +3 -1
- package/components/badge/src/badge.component.d.ts +3 -4
- package/components/button/src/button.component.d.ts +2 -2
- package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +2 -2
- package/components/document-builder/src/document-builder.model.d.ts +2 -2
- package/components/editor/src/models/editor.model.d.ts +2 -2
- package/components/editor/src/plugins/image-upload/utils/validate.utils.d.ts +2 -2
- package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +4 -2
- package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +2 -2
- package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +2 -2
- package/components/form-generic/src/components/form-builder/components/group/attribute/group-attribute.component.d.ts +23 -0
- package/components/form-generic/src/components/form-builder/components/group/index.d.ts +1 -0
- package/components/form-generic/src/components/form-builder/components/index.d.ts +1 -0
- package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +3 -0
- package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +61 -18
- package/components/form-generic/src/components/form-render/form-render.component.d.ts +2 -2
- package/components/form-generic/src/models/form-generic-component.model.d.ts +22 -2
- package/components/index.d.ts +1 -2
- package/components/modal/src/modal.component.d.ts +5 -3
- package/components/preview/index.d.ts +3 -0
- package/components/preview/src/preview-image/preview-image.component.d.ts +84 -24
- package/components/preview/src/preview-image/preview-image.types.d.ts +53 -0
- package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +186 -0
- package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +84 -0
- package/components/quick-action/src/quick-action.component.d.ts +5 -6
- package/components/section/src/section.component.d.ts +1 -2
- package/components/table/src/components/column-filter/column-filter.component.d.ts +3 -3
- package/components/table/src/table.component.d.ts +2 -2
- package/components/upload-file/src/upload-file.component.d.ts +4 -1
- package/configurations/src/sd-core.configuration.d.ts +2 -1
- package/fesm2022/sd-angular-core-components-anchor.mjs +19 -6
- package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-button.mjs +1 -1
- package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-code-editor.mjs +3 -3
- package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-document-builder.mjs +3 -3
- package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-editor.mjs +3 -3
- package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-form-generic.mjs +627 -317
- package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-history.mjs +3 -3
- package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-import-excel.mjs +5 -5
- package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-modal.mjs +8 -3
- package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-preview.mjs +1963 -91
- package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-quick-action.mjs +8 -19
- package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab-router.mjs +31 -26
- package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-table.mjs +32 -29
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-upload-file.mjs +12 -8
- package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components.mjs +1 -2
- package/fesm2022/sd-angular-core-components.mjs.map +1 -1
- package/fesm2022/sd-angular-core-configurations.mjs.map +1 -1
- package/fesm2022/sd-angular-core-directives.mjs +2 -2
- package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-checkbox.mjs +6 -13
- package/fesm2022/sd-angular-core-forms-checkbox.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +6 -5
- package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip.mjs +6 -12
- package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date-range.mjs +33 -26
- package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date.mjs +29 -19
- package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-datetime.mjs +98 -57
- package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input-number.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input.mjs +25 -10
- package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-radio.mjs +7 -15
- package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-select.mjs +4 -4
- package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-switch.mjs +6 -14
- package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-textarea.mjs +5 -5
- package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
- package/fesm2022/sd-angular-core-handlers.mjs +2 -2
- package/fesm2022/sd-angular-core-handlers.mjs.map +1 -1
- package/fesm2022/sd-angular-core-i18n.mjs +1610 -38
- package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
- package/fesm2022/sd-angular-core-interceptors.mjs +2 -2
- package/fesm2022/sd-angular-core-interceptors.mjs.map +1 -1
- package/fesm2022/sd-angular-core-models.mjs +6 -0
- package/fesm2022/sd-angular-core-models.mjs.map +1 -0
- package/fesm2022/sd-angular-core-modules-layout.mjs +87 -39
- package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-confirm.mjs +2 -2
- package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-docx.mjs +2 -2
- package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-excel.mjs +27 -23
- package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-notify.mjs +21 -21
- package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-extensions.mjs +74 -830
- package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-models.mjs +36 -136
- package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
- package/fesm2022/sd-angular-core.mjs +0 -1
- package/fesm2022/sd-angular-core.mjs.map +1 -1
- package/forms/autocomplete/src/autocomplete.component.d.ts +1 -2
- package/forms/checkbox/src/checkbox.component.d.ts +3 -3
- package/forms/chip/src/chip.component.d.ts +4 -4
- package/forms/chip-calendar/src/chip-calendar.component.d.ts +4 -4
- package/forms/date/src/date.component.d.ts +3 -5
- package/forms/date-range/src/date-range.component.d.ts +3 -5
- package/forms/datetime/src/datetime.component.d.ts +2 -2
- package/forms/datetime/src/popup/sd-datetime-picker.component.d.ts +10 -11
- package/forms/input/src/input.component.d.ts +1 -2
- package/forms/input-number/src/input-number.component.d.ts +1 -2
- package/forms/radio/src/radio.component.d.ts +3 -3
- package/forms/select/src/select.component.d.ts +5 -5
- package/forms/switch/src/switch.component.d.ts +3 -3
- package/forms/textarea/src/textarea.component.d.ts +1 -2
- package/i18n/index.d.ts +5 -5
- package/i18n/src/en.d.ts +406 -2
- package/i18n/src/i18n.messages.d.ts +2 -0
- package/i18n/src/i18n.pipe.d.ts +9 -0
- package/i18n/src/i18n.service.d.ts +14 -0
- package/i18n/src/i18n.token.d.ts +1 -0
- package/i18n/src/i18n.types.d.ts +31 -0
- package/i18n/src/ja.d.ts +2 -0
- package/i18n/src/ko.d.ts +2 -0
- package/i18n/src/vi.d.ts +2 -312
- package/i18n/src/zh.d.ts +2 -0
- package/models/index.d.ts +1 -0
- package/models/src/language.model.d.ts +2 -0
- package/modules/layout/modules/home/components/home-page/home-page.component.d.ts +25 -0
- package/package.json +82 -89
- package/public-api.d.ts +0 -1
- package/sd-angular-core-19.0.0-beta.96.tgz +0 -0
- package/services/notify/index.d.ts +1 -1
- package/services/notify/src/components/toast/toast.component.d.ts +3 -3
- package/services/notify/src/components/toast-container.component.d.ts +3 -4
- package/services/notify/src/notify.model.d.ts +1 -1
- package/services/notify/src/notify.service.d.ts +5 -5
- package/utilities/extensions/src/array.extension.d.ts +1 -7
- package/utilities/extensions/src/color.extension.d.ts +5 -20
- package/utilities/extensions/src/date.extension.d.ts +1 -18
- package/utilities/extensions/src/number.extension.d.ts +1 -10
- package/utilities/extensions/src/string.extension.d.ts +30 -4
- package/utilities/extensions/src/utility.extension.d.ts +6 -0
- package/utilities/models/src/color.model.d.ts +4 -1
- package/utilities/models/src/empty.model.d.ts +3 -0
- package/utilities/models/src/filter.model.d.ts +12 -24
- package/utilities/models/src/maybe-async.model.d.ts +10 -4
- package/utilities/models/src/nested-key-of.model.d.ts +4 -5
- package/utilities/models/src/operator.model.d.ts +9 -4
- package/utilities/models/src/order.model.d.ts +4 -5
- package/utilities/models/src/paging.model.d.ts +8 -16
- package/utilities/models/src/pattern.model.d.ts +13 -0
- package/utilities/models/src/size.model.d.ts +4 -1
- package/components/anchor-v2/index.d.ts +0 -1
- package/components/anchor-v2/src/components/anchor-item-v2/anchor-item-v2.component.d.ts +0 -12
- package/components/anchor-v2/src/components/anchor-v2/anchor-v2.component.d.ts +0 -19
- package/components/anchor-v2/src/components/anchor-vertical-v2/anchor-vertical-list-v2.component.d.ts +0 -16
- package/components/anchor-v2/src/components/index.d.ts +0 -2
- package/components/anchor-v2/src/index.d.ts +0 -2
- package/components/anchor-v2/src/models/index.d.ts +0 -1
- package/components/anchor-v2/src/models/sd-anchor-v2.model.d.ts +0 -7
- package/components/workflow/index.d.ts +0 -2
- package/components/workflow/src/configurations/index.d.ts +0 -1
- package/components/workflow/src/configurations/workflow.configuration.d.ts +0 -10
- package/fesm2022/sd-angular-core-components-anchor-v2.mjs +0 -151
- package/fesm2022/sd-angular-core-components-anchor-v2.mjs.map +0 -1
- package/fesm2022/sd-angular-core-components-workflow.mjs +0 -17
- package/fesm2022/sd-angular-core-components-workflow.mjs.map +0 -1
- package/fesm2022/sd-angular-core-services-firebase.mjs +0 -38
- package/fesm2022/sd-angular-core-services-firebase.mjs.map +0 -1
- package/i18n/src/sd-i18n.messages.d.ts +0 -2
- package/i18n/src/sd-i18n.pipe.d.ts +0 -9
- package/i18n/src/sd-i18n.service.d.ts +0 -12
- package/i18n/src/sd-i18n.token.d.ts +0 -1
- package/i18n/src/sd-i18n.types.d.ts +0 -5
- package/sd-angular-core-19.0.0-beta.94.tgz +0 -0
- package/services/firebase/index.d.ts +0 -2
- package/services/firebase/src/firebase.model.d.ts +0 -8
- package/services/firebase/src/firebase.service.d.ts +0 -14
|
@@ -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{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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"}
|
|
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/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 @typescript-eslint/no-explicit-any */\nimport { StringUtilities as _Utils, ValidationUtilities } from '@sdcorejs/utils/fns';\n\nexport { ValidationUtilities };\n\n// Deprecated wrappers — moved to ValidationUtilities\nconst isValidEmail = (value: any) => ValidationUtilities.isEmail(value);\nconst isValidPhone = (value: any) => ValidationUtilities.isPhone(value);\nconst isValidCode = (value: any) => ValidationUtilities.isCode(value);\n\nexport const StringUtilities = {\n ..._Utils,\n // Deprecated aliases for renamed regex constants (renamed in @sdcorejs/utils v1.0.2)\n /** @deprecated Use REGEX_VN_PHONE instead */\n REGEX_PHONE_VN: _Utils.REGEX_VN_PHONE,\n /** @deprecated Use REGEX_VN_ID instead */\n REGEX_IDVN: _Utils.REGEX_VN_ID,\n /** @deprecated Use REGEX_VN_ID_OR_PASSPORT instead */\n REGEX_IDVN_OR_PASSPORT: _Utils.REGEX_VN_ID_OR_PASSPORT,\n // Deprecated validators — moved to ValidationUtilities\n /** @deprecated Use {@link ValidationUtilities.isEmail} instead */\n isValidEmail,\n /** @deprecated Use {@link ValidationUtilities.isPhone} instead */\n isValidPhone,\n /** @deprecated Use {@link ValidationUtilities.isCode} instead */\n isValidCode,\n};\n","export { Utilities, BrowserUtilities } from '@sdcorejs/utils/fns';\r\n\r\n// Hardcoded i18n cho upload utility — pure function nên không inject() được I18nService.\r\n// Đọc lang trực tiếp từ localStorage (cùng key với I18nService: 'sd-core.language').\r\n// Khi I18nService chuyển sang reload-on-change model, lang ở đây luôn đồng bộ với UI.\r\nconst SD_UPLOAD_MESSAGES = {\r\n vi: {\r\n 'invalid-format': '[{name}] File tải lên không đúng định dạng. Vui lòng chọn lại',\r\n 'invalid-size': '[{name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác',\r\n },\r\n en: {\r\n 'invalid-format': '[{name}] Invalid file format. Please select again',\r\n 'invalid-size': '[{name}] Invalid file size. Please choose a different file',\r\n },\r\n ja: {\r\n 'invalid-format': '[{name}] ファイル形式が正しくありません。もう一度選択してください',\r\n 'invalid-size': '[{name}] ファイルサイズが正しくありません。別のファイルを選択してください',\r\n },\r\n ko: {\r\n 'invalid-format': '[{name}] 파일 형식이 올바르지 않습니다. 다시 선택해 주세요',\r\n 'invalid-size': '[{name}] 파일 크기가 올바르지 않습니다. 다른 파일을 선택해 주세요',\r\n },\r\n zh: {\r\n 'invalid-format': '[{name}] 文件格式不正确,请重新选择',\r\n 'invalid-size': '[{name}] 文件大小不符合要求,请选择其他文件',\r\n },\r\n} as const;\r\n\r\ntype SdUploadMsgKey = keyof typeof SD_UPLOAD_MESSAGES.vi;\r\ntype SdUploadLang = keyof typeof SD_UPLOAD_MESSAGES;\r\n\r\nconst getSdUploadLang = (): SdUploadLang => {\r\n try {\r\n const stored = localStorage.getItem('sd-core.language');\r\n if (stored && stored in SD_UPLOAD_MESSAGES) return stored as SdUploadLang;\r\n } catch { /* ignore */ }\r\n return 'vi';\r\n};\r\n\r\nconst 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 // Hardcode i18n cho upload utility — pure function nên không inject() được I18nService.\r\n // Đọc lang trực tiếp từ localStorage (cùng key với I18nService: 'sd-core.language').\r\n // Throw plain Error(translatedText) để consumer không cần xử lý đặc biệt.\r\n const throwUploadError = (msgKey: SdUploadMsgKey, name: string): never => {\r\n const lang = getSdUploadLang();\r\n const template = SD_UPLOAD_MESSAGES[lang][msgKey] ?? SD_UPLOAD_MESSAGES.vi[msgKey];\r\n throw new Error(template.replace('{name}', name));\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('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('invalid-format', file.name);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n throwUploadError('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('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('invalid-format', file.name);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n throwUploadError('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\n/**\r\n * @deprecated Use {@link Utilities} and {@link BrowserUtilities} from `@sdcorejs/utils/fns` instead.\r\n * - upload/download/clipboard/isMobile → BrowserUtilities\r\n * - allWithPaging (→ fetchAllByPaging) / randomId / hash / parseQueryParams / generateUuid / getNestedValue → Utilities\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","export { ColorUtilities } from '@sdcorejs/utils/fns';\n\nimport { ColorUtilities } from '@sdcorejs/utils/fns';\n/** @deprecated Use {@link ColorUtilities.hslToHex} from `@sdcorejs/utils/fns` instead */\nexport const hslToHex = ColorUtilities.hslToHex;\n/** @deprecated Use {@link ColorUtilities.rgbToHex} from `@sdcorejs/utils/fns` instead */\nexport const rgbToHex = ColorUtilities.rgbToHex;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["_Utils"],"mappings":"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"}
|
|
@@ -1,150 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { EMPTY_STR } from '@sdcorejs/utils/constants';
|
|
2
|
+
export { EMPTY_STR, VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';
|
|
3
|
+
import { StringUtilities } from '@sdcorejs/utils/fns';
|
|
4
|
+
import { resolveMaybeAsync, normalizeAsync } from '@sdcorejs/utils/models';
|
|
5
|
+
export { normalizeAsync, resolveMaybeAsync } from '@sdcorejs/utils/models';
|
|
3
6
|
|
|
4
7
|
const DefaultMaterialIconFontSet = 'material-icons-outlined';
|
|
5
8
|
|
|
9
|
+
// `name` và `errorMessage` chứa i18n KEY (không phải chuỗi đã dịch).
|
|
10
|
+
/** @deprecated Use `VALIDATION_PATTERNS` from `@sdcorejs/utils/constants` instead. */
|
|
6
11
|
const SdPatternCommons = [
|
|
7
|
-
{
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
type: 'PHONE',
|
|
15
|
-
name: 'core.validator.phone.name',
|
|
16
|
-
regex: StringUtilities.REGEX_PHONE,
|
|
17
|
-
errorMessage: 'core.validator.phone.error',
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
type: 'PHONE_VN',
|
|
21
|
-
name: 'core.validator.phone-vn.name',
|
|
22
|
-
regex: StringUtilities.REGEX_PHONE_VN,
|
|
23
|
-
errorMessage: 'core.validator.phone-vn.error',
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
type: 'IDVN',
|
|
27
|
-
name: 'core.validator.cccd.name',
|
|
28
|
-
regex: StringUtilities.REGEX_IDVN,
|
|
29
|
-
errorMessage: 'core.validator.cccd.error',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
type: 'PASSPORT',
|
|
33
|
-
name: 'core.validator.passport.name',
|
|
34
|
-
regex: StringUtilities.REGEX_PASSPORT,
|
|
35
|
-
errorMessage: 'core.validator.passport.error',
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
type: 'IDVN_OR_PASSPORT',
|
|
39
|
-
name: 'core.validator.id-vn.name',
|
|
40
|
-
regex: StringUtilities.REGEX_IDVN_OR_PASSPORT,
|
|
41
|
-
errorMessage: 'core.validator.id-vn.error',
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
type: 'TIME',
|
|
45
|
-
name: 'core.validator.time.name',
|
|
46
|
-
regex: StringUtilities.REGEX_TIME,
|
|
47
|
-
errorMessage: 'core.validator.time.error',
|
|
48
|
-
},
|
|
12
|
+
{ type: 'EMAIL', name: 'core.validator.email.name', regex: StringUtilities.REGEX_EMAIL, errorMessage: 'core.validator.email.error' },
|
|
13
|
+
{ type: 'PHONE', name: 'core.validator.phone.name', regex: StringUtilities.REGEX_PHONE, errorMessage: 'core.validator.phone.error' },
|
|
14
|
+
{ type: 'PHONE_VN', name: 'core.validator.phone-vn.name', regex: StringUtilities.REGEX_VN_PHONE, errorMessage: 'core.validator.phone-vn.error' },
|
|
15
|
+
{ type: 'IDVN', name: 'core.validator.cccd.name', regex: StringUtilities.REGEX_VN_ID, errorMessage: 'core.validator.cccd.error' },
|
|
16
|
+
{ type: 'PASSPORT', name: 'core.validator.passport.name', regex: StringUtilities.REGEX_PASSPORT, errorMessage: 'core.validator.passport.error' },
|
|
17
|
+
{ type: 'IDVN_OR_PASSPORT', name: 'core.validator.id-vn.name', regex: StringUtilities.REGEX_VN_ID_OR_PASSPORT, errorMessage: 'core.validator.id-vn.error' },
|
|
18
|
+
{ type: 'TIME', name: 'core.validator.time.name', regex: StringUtilities.REGEX_TIME, errorMessage: 'core.validator.time.error' },
|
|
49
19
|
];
|
|
50
20
|
|
|
51
|
-
|
|
21
|
+
/** @deprecated Use {@link EMPTY_STR} from `@sdcorejs/utils/constants` instead */
|
|
22
|
+
const SD_EMPTY_STR = EMPTY_STR;
|
|
52
23
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (isObservable(value)) {
|
|
58
|
-
return firstValueFrom(value);
|
|
59
|
-
}
|
|
60
|
-
return Promise.resolve(value);
|
|
61
|
-
};
|
|
62
|
-
const SdNormalizeAsync = (value) => {
|
|
63
|
-
if (isObservable(value)) {
|
|
64
|
-
return value; // Nếu là Observable, giữ nguyên
|
|
65
|
-
}
|
|
66
|
-
if (value instanceof Promise) {
|
|
67
|
-
return from(value); // Nếu là Promise, chuyển sang Observable
|
|
68
|
-
}
|
|
69
|
-
return of(value); // Nếu là giá trị thuần (Object, string...), bọc lại bằng of
|
|
70
|
-
};
|
|
71
|
-
function isObservable(obj) {
|
|
72
|
-
return obj && typeof obj.subscribe === 'function';
|
|
73
|
-
}
|
|
24
|
+
/** @deprecated Use {@link resolveMaybeAsync} from `@sdcorejs/utils/models` instead */
|
|
25
|
+
const SdResolveMaybeAsync = resolveMaybeAsync;
|
|
26
|
+
/** @deprecated Use {@link normalizeAsync} from `@sdcorejs/utils/models` instead */
|
|
27
|
+
const SdNormalizeAsync = normalizeAsync;
|
|
74
28
|
|
|
75
29
|
// `display` chứa i18n KEY (không phải chuỗi đã dịch).
|
|
76
30
|
// Consumer phải gọi i18n.t(display) trước khi render ra UI.
|
|
31
|
+
// @deprecated Use `OPERATORS` from `@sdcorejs/utils/constants` instead.
|
|
32
|
+
// Note: OPERATORS has translated display labels; SdOperators uses i18n keys.
|
|
77
33
|
const SdOperators = [
|
|
78
|
-
{
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
value: 'LESS_THAN',
|
|
95
|
-
symbol: '<',
|
|
96
|
-
display: 'core.operator.less-than.display',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
value: 'GREATER_OR_EQUAL',
|
|
100
|
-
symbol: '≥',
|
|
101
|
-
display: 'core.operator.greater-or-equal.display',
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
value: 'LESS_OR_EQUAL',
|
|
105
|
-
symbol: '≤',
|
|
106
|
-
display: 'core.operator.less-or-equal.display',
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
value: 'CONTAIN',
|
|
110
|
-
symbol: 'join_inner',
|
|
111
|
-
display: 'core.operator.contain.display',
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
value: 'NOT_CONTAIN',
|
|
115
|
-
symbol: 'join',
|
|
116
|
-
display: 'core.operator.not-contain.display',
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
value: 'START_WITH',
|
|
120
|
-
symbol: 'line_start_circle',
|
|
121
|
-
display: 'core.operator.start-with.display',
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
value: 'END_WITH',
|
|
125
|
-
symbol: 'line_end_circle',
|
|
126
|
-
display: 'core.operator.end-with.display',
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
value: 'IN',
|
|
130
|
-
symbol: 'checklist_rtl',
|
|
131
|
-
display: 'core.operator.in.display',
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
value: 'NOT_IN',
|
|
135
|
-
symbol: 'event_list',
|
|
136
|
-
display: 'core.operator.not-in.display',
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
value: 'NULL',
|
|
140
|
-
symbol: 'motion_photos_off',
|
|
141
|
-
display: 'core.operator.null.display',
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
value: 'NOT_NULL',
|
|
145
|
-
symbol: 'adjust',
|
|
146
|
-
display: 'core.operator.not-null.display',
|
|
147
|
-
},
|
|
34
|
+
{ value: 'EQUAL', symbol: '=', display: 'core.operator.equal.display' },
|
|
35
|
+
{ value: 'NOT_EQUAL', symbol: '≠', display: 'core.operator.not-equal.display' },
|
|
36
|
+
{ value: 'GREATER_THAN', symbol: '>', display: 'core.operator.greater-than.display' },
|
|
37
|
+
{ value: 'LESS_THAN', symbol: '<', display: 'core.operator.less-than.display' },
|
|
38
|
+
{ value: 'GREATER_OR_EQUAL', symbol: '≥', display: 'core.operator.greater-or-equal.display' },
|
|
39
|
+
{ value: 'LESS_OR_EQUAL', symbol: '≤', display: 'core.operator.less-or-equal.display' },
|
|
40
|
+
{ value: 'CONTAIN', symbol: 'join_inner', display: 'core.operator.contain.display' },
|
|
41
|
+
{ value: 'NOT_CONTAIN', symbol: 'join', display: 'core.operator.not-contain.display' },
|
|
42
|
+
{ value: 'START_WITH', symbol: 'line_start_circle', display: 'core.operator.start-with.display' },
|
|
43
|
+
{ value: 'END_WITH', symbol: 'line_end_circle', display: 'core.operator.end-with.display' },
|
|
44
|
+
{ value: 'IN', symbol: 'checklist_rtl', display: 'core.operator.in.display' },
|
|
45
|
+
{ value: 'NOT_IN', symbol: 'event_list', display: 'core.operator.not-in.display' },
|
|
46
|
+
{ value: 'NULL', symbol: 'motion_photos_off', display: 'core.operator.null.display' },
|
|
47
|
+
{ value: 'NOT_NULL', symbol: 'adjust', display: 'core.operator.not-null.display' },
|
|
148
48
|
];
|
|
149
49
|
|
|
150
50
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-utilities-models.mjs","sources":["../../../projects/sd-angular/utilities/models/src/icon.model.ts","../../../projects/sd-angular/utilities/models/src/pattern.model.ts","../../../projects/sd-angular/utilities/models/src/empty.model.ts","../../../projects/sd-angular/utilities/models/src/maybe-async.model.ts","../../../projects/sd-angular/utilities/models/src/operator.model.ts","../../../projects/sd-angular/utilities/models/sd-angular-core-utilities-models.ts"],"sourcesContent":["export type MaterialIconFontSet = 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp' | 'material-symbols-outlined';\nexport const DefaultMaterialIconFontSet: MaterialIconFontSet = 'material-icons-outlined';\n","import {
|
|
1
|
+
{"version":3,"file":"sd-angular-core-utilities-models.mjs","sources":["../../../projects/sd-angular/utilities/models/src/icon.model.ts","../../../projects/sd-angular/utilities/models/src/pattern.model.ts","../../../projects/sd-angular/utilities/models/src/empty.model.ts","../../../projects/sd-angular/utilities/models/src/maybe-async.model.ts","../../../projects/sd-angular/utilities/models/src/operator.model.ts","../../../projects/sd-angular/utilities/models/sd-angular-core-utilities-models.ts"],"sourcesContent":["export type MaterialIconFontSet = 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp' | 'material-symbols-outlined';\nexport const DefaultMaterialIconFontSet: MaterialIconFontSet = 'material-icons-outlined';\n","import type { ValidationPatternType, ValidationPattern } from '@sdcorejs/utils/models';\nimport { VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\nexport type { ValidationPatternType, ValidationPattern };\nexport { VALIDATION_PATTERNS };\n\n/**\n * @deprecated Use {@link ValidationPatternType} from `@sdcorejs/utils/models` instead.\n * Note: member names changed — PHONE_VN → VN_PHONE, IDVN → VN_ID, IDVN_OR_PASSPORT → VN_ID_OR_PASSPORT.\n */\nexport type SdPatternType = 'EMAIL' | 'PHONE' | 'PHONE_VN' | 'IDVN' | 'PASSPORT' | 'IDVN_OR_PASSPORT' | 'TIME';\n\n/**\n * @deprecated Use {@link ValidationPattern} from `@sdcorejs/utils/models` instead.\n * Note: `regex` field renamed to `pattern` to align with Angular `Validators.pattern()`.\n */\nexport interface SdPatternCommon {\n type: SdPatternType;\n name: string;\n regex: string;\n errorMessage: string;\n}\n\n// `name` và `errorMessage` chứa i18n KEY (không phải chuỗi đã dịch).\n/** @deprecated Use `VALIDATION_PATTERNS` from `@sdcorejs/utils/constants` instead. */\nexport const SdPatternCommons: SdPatternCommon[] = [\n { type: 'EMAIL', name: 'core.validator.email.name', regex: StringUtilities.REGEX_EMAIL, errorMessage: 'core.validator.email.error' },\n { type: 'PHONE', name: 'core.validator.phone.name', regex: StringUtilities.REGEX_PHONE, errorMessage: 'core.validator.phone.error' },\n { type: 'PHONE_VN', name: 'core.validator.phone-vn.name', regex: StringUtilities.REGEX_VN_PHONE, errorMessage: 'core.validator.phone-vn.error' },\n { type: 'IDVN', name: 'core.validator.cccd.name', regex: StringUtilities.REGEX_VN_ID, errorMessage: 'core.validator.cccd.error' },\n { type: 'PASSPORT', name: 'core.validator.passport.name', regex: StringUtilities.REGEX_PASSPORT, errorMessage: 'core.validator.passport.error' },\n { type: 'IDVN_OR_PASSPORT', name: 'core.validator.id-vn.name', regex: StringUtilities.REGEX_VN_ID_OR_PASSPORT, errorMessage: 'core.validator.id-vn.error' },\n { type: 'TIME', name: 'core.validator.time.name', regex: StringUtilities.REGEX_TIME, errorMessage: 'core.validator.time.error' },\n];\n","import { EMPTY_STR } from '@sdcorejs/utils/constants';\nexport { EMPTY_STR };\n\n/** @deprecated Use {@link EMPTY_STR} from `@sdcorejs/utils/constants` instead */\nexport const SD_EMPTY_STR = EMPTY_STR;\n","import type { MaybeAsync } from '@sdcorejs/utils/models';\nimport { resolveMaybeAsync, normalizeAsync } from '@sdcorejs/utils/models';\nexport type { MaybeAsync };\nexport { resolveMaybeAsync, normalizeAsync };\n\n/** @deprecated Use {@link MaybeAsync} from `@sdcorejs/utils/models` instead */\nexport type SdMaybeAsync<T> = MaybeAsync<T>;\n/** @deprecated Use {@link resolveMaybeAsync} from `@sdcorejs/utils/models` instead */\nexport const SdResolveMaybeAsync = resolveMaybeAsync;\n/** @deprecated Use {@link normalizeAsync} from `@sdcorejs/utils/models` instead */\nexport const SdNormalizeAsync = normalizeAsync;\n","import type { Operator, OperatorHasData, OperatorNoData } from '@sdcorejs/utils/models';\nexport type { Operator, OperatorHasData, OperatorNoData };\n\n/** @deprecated Use {@link Operator} from `@sdcorejs/utils/models` instead */\nexport type SdOperator = Operator;\n/** @deprecated Use {@link OperatorHasData} from `@sdcorejs/utils/models` instead */\nexport type SdOperatorHasData = OperatorHasData;\n/** @deprecated Use {@link OperatorNoData} from `@sdcorejs/utils/models` instead */\nexport type SdOperatorNoData = OperatorNoData;\n\n// `display` chứa i18n KEY (không phải chuỗi đã dịch).\n// Consumer phải gọi i18n.t(display) trước khi render ra UI.\n// @deprecated Use `OPERATORS` from `@sdcorejs/utils/constants` instead.\n// Note: OPERATORS has translated display labels; SdOperators uses i18n keys.\nexport const SdOperators: {\n value: Operator;\n symbol?: string;\n display: string;\n}[] = [\n { value: 'EQUAL', symbol: '=', display: 'core.operator.equal.display' },\n { value: 'NOT_EQUAL', symbol: '≠', display: 'core.operator.not-equal.display' },\n { value: 'GREATER_THAN', symbol: '>', display: 'core.operator.greater-than.display' },\n { value: 'LESS_THAN', symbol: '<', display: 'core.operator.less-than.display' },\n { value: 'GREATER_OR_EQUAL', symbol: '≥', display: 'core.operator.greater-or-equal.display' },\n { value: 'LESS_OR_EQUAL', symbol: '≤', display: 'core.operator.less-or-equal.display' },\n { value: 'CONTAIN', symbol: 'join_inner', display: 'core.operator.contain.display' },\n { value: 'NOT_CONTAIN', symbol: 'join', display: 'core.operator.not-contain.display' },\n { value: 'START_WITH', symbol: 'line_start_circle', display: 'core.operator.start-with.display' },\n { value: 'END_WITH', symbol: 'line_end_circle', display: 'core.operator.end-with.display' },\n { value: 'IN', symbol: 'checklist_rtl', display: 'core.operator.in.display' },\n { value: 'NOT_IN', symbol: 'event_list', display: 'core.operator.not-in.display' },\n { value: 'NULL', symbol: 'motion_photos_off', display: 'core.operator.null.display' },\n { value: 'NOT_NULL', symbol: 'adjust', display: 'core.operator.not-null.display' },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core.mjs","sources":["../../../projects/sd-angular/src/public-api.ts","../../../projects/sd-angular/src/sd-angular-core.ts"],"sourcesContent":["/*\n * Public API Surface of sd-angular\n */\nimport '@sd-angular/core/configurations';\nimport '@sd-angular/core/
|
|
1
|
+
{"version":3,"file":"sd-angular-core.mjs","sources":["../../../projects/sd-angular/src/public-api.ts","../../../projects/sd-angular/src/sd-angular-core.ts"],"sourcesContent":["/*\n * Public API Surface of sd-angular\n */\nimport '@sd-angular/core/configurations';\nimport '@sd-angular/core/utilities';\nimport '@sd-angular/core/pipes';\nimport '@sd-angular/core/directives';\nimport '@sd-angular/core/services';\nimport '@sd-angular/core/interceptors';\nimport '@sd-angular/core/handlers';\nimport '@sd-angular/core/components';\nimport '@sd-angular/core/forms';\nimport '@sd-angular/core/modules';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;AAAA;;AAEG;;ACFH;;AAEG"}
|
|
@@ -5,7 +5,6 @@ import { ErrorStateMatcher } from '@angular/material/core';
|
|
|
5
5
|
import { MatFormFieldAppearance } from '@angular/material/form-field';
|
|
6
6
|
import { SdItemDefDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';
|
|
7
7
|
import { SdCustomValidator, SdFormControl, SdSearch, SdSelectionData } from '@sd-angular/core/forms/models';
|
|
8
|
-
import { SdSize } from '@sd-angular/core/utilities/models';
|
|
9
8
|
import * as i0 from "@angular/core";
|
|
10
9
|
declare class SdAutocompleteErrotStateMatcher implements ErrorStateMatcher {
|
|
11
10
|
private formControl;
|
|
@@ -26,7 +25,7 @@ export declare class SdAutocomplete<T = any> implements OnInit, OnDestroy, After
|
|
|
26
25
|
autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
|
|
27
26
|
autoId: import("@angular/core").Signal<string | undefined>;
|
|
28
27
|
name: import("@angular/core").InputSignal<string>;
|
|
29
|
-
size: import("@angular/core").InputSignal<
|
|
28
|
+
size: import("@angular/core").InputSignal<import("@sdcorejs/utils/models").Size>;
|
|
30
29
|
form: import("@angular/core").InputSignalWithTransform<FormGroup<any> | undefined, any>;
|
|
31
30
|
label: import("@angular/core").InputSignal<string | undefined>;
|
|
32
31
|
helperText: import("@angular/core").InputSignal<string | undefined>;
|
|
@@ -5,8 +5,8 @@ export declare class SdCheckbox implements OnDestroy, OnInit, AfterViewInit {
|
|
|
5
5
|
#private;
|
|
6
6
|
private ref;
|
|
7
7
|
id: string;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
readonly autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
|
|
9
|
+
readonly autoId: import("@angular/core").Signal<string | undefined>;
|
|
10
10
|
set name(val: string);
|
|
11
11
|
set form(val: NgForm | FormGroup);
|
|
12
12
|
formControl: FormControl<any>;
|
|
@@ -24,5 +24,5 @@ export declare class SdCheckbox implements OnDestroy, OnInit, AfterViewInit {
|
|
|
24
24
|
ngOnDestroy(): void;
|
|
25
25
|
customInlineErrorValidator(): ValidatorFn;
|
|
26
26
|
static ɵfac: i0.ɵɵFactoryDeclaration<SdCheckbox, never>;
|
|
27
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SdCheckbox, "sd-checkbox", never, { "
|
|
27
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SdCheckbox, "sd-checkbox", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; }; "form": { "alias": "form"; "required": false; }; "label": { "alias": "label"; "required": false; }; "color": { "alias": "color"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "model": { "alias": "model"; "required": false; }; "_inlineError": { "alias": "inlineError"; "required": false; }; }, { "modelChange": "modelChange"; "sdChange": "sdChange"; }, never, never, true, never>;
|
|
28
28
|
}
|
|
@@ -6,7 +6,6 @@ import { ErrorStateMatcher } from '@angular/material/core';
|
|
|
6
6
|
import { FloatLabelType, MatFormFieldAppearance } from '@angular/material/form-field';
|
|
7
7
|
import { SdLabelDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';
|
|
8
8
|
import { SdFormControl } from '@sd-angular/core/forms/models';
|
|
9
|
-
import { SdSize } from '@sd-angular/core/utilities';
|
|
10
9
|
import * as i0 from "@angular/core";
|
|
11
10
|
declare class SdChipErrorStateMatcher implements ErrorStateMatcher {
|
|
12
11
|
private formControl;
|
|
@@ -15,11 +14,12 @@ declare class SdChipErrorStateMatcher implements ErrorStateMatcher {
|
|
|
15
14
|
}
|
|
16
15
|
export declare class SdChip implements AfterViewInit {
|
|
17
16
|
#private;
|
|
18
|
-
|
|
17
|
+
autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
|
|
18
|
+
autoId: import("@angular/core").Signal<string | undefined>;
|
|
19
19
|
name: import("@angular/core").InputSignal<string | undefined>;
|
|
20
20
|
appearance: import("@angular/core").InputSignal<MatFormFieldAppearance>;
|
|
21
21
|
floatLabel: import("@angular/core").InputSignal<FloatLabelType>;
|
|
22
|
-
size: import("@angular/core").InputSignal<
|
|
22
|
+
size: import("@angular/core").InputSignal<import("@sdcorejs/utils/models").Size>;
|
|
23
23
|
form: import("@angular/core").InputSignal<NgForm | FormGroup<any> | undefined>;
|
|
24
24
|
label: import("@angular/core").InputSignal<string>;
|
|
25
25
|
placeholder: import("@angular/core").InputSignal<string | undefined>;
|
|
@@ -60,6 +60,6 @@ export declare class SdChip implements AfterViewInit {
|
|
|
60
60
|
focus: () => void;
|
|
61
61
|
onClear: ($event?: any) => void;
|
|
62
62
|
static ɵfac: i0.ɵɵFactoryDeclaration<SdChip, never>;
|
|
63
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SdChip, "sd-chip", never, { "
|
|
63
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SdChip, "sd-chip", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "addable": { "alias": "addable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; }, { "modelChange": "modelChange"; "sdChange": "sdChange"; }, ["sdViewDef", "sdLabelDef", "sdLabelTemplate", "sdValueTemplate"], never, true, never>;
|
|
64
64
|
}
|
|
65
65
|
export {};
|