@sd-angular/core 19.0.0-beta.3 → 19.0.0-beta.4

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 (44) hide show
  1. package/components/document-builder/src/document-builder.config.d.ts +21 -0
  2. package/components/document-builder/src/document-builder.utils.d.ts +10 -0
  3. package/fesm2022/sd-angular-core-components-document-builder.mjs +336 -124
  4. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  5. package/fesm2022/sd-angular-core-components-table.mjs +4 -4
  6. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  7. package/fesm2022/sd-angular-core-components-workflow.mjs +23 -23
  8. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  9. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +22 -2
  10. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  11. package/fesm2022/sd-angular-core-forms-date.mjs +13 -3
  12. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  13. package/fesm2022/sd-angular-core-forms-input-number.mjs +17 -3
  14. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  15. package/fesm2022/sd-angular-core-forms-input.mjs +18 -6
  16. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  17. package/fesm2022/sd-angular-core-forms-radio.mjs +15 -2
  18. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  19. package/fesm2022/sd-angular-core-forms-select.mjs +13 -2
  20. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  21. package/fesm2022/sd-angular-core-forms-textarea.mjs +9 -2
  22. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  23. package/fesm2022/sd-angular-core-modules-auth.mjs +5 -5
  24. package/fesm2022/sd-angular-core-modules-auth.mjs.map +1 -1
  25. package/fesm2022/sd-angular-core-modules-layout.mjs +1 -1
  26. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  27. package/fesm2022/sd-angular-core-services-confirm.mjs +1 -1
  28. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-utilities-extensions.mjs +66 -1
  30. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-utilities-models.mjs +2 -2
  32. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  33. package/forms/autocomplete/src/autocomplete.component.d.ts +5 -1
  34. package/forms/date/src/date.component.d.ts +4 -1
  35. package/forms/input/src/input.component.d.ts +6 -4
  36. package/forms/input-number/src/input-number.component.d.ts +4 -1
  37. package/forms/radio/src/radio.component.d.ts +5 -1
  38. package/forms/select/src/select.component.d.ts +5 -1
  39. package/forms/textarea/src/textarea.component.d.ts +3 -1
  40. package/modules/auth/guards/portal.guard.d.ts +3 -3
  41. package/package.json +63 -63
  42. package/utilities/extensions/index.d.ts +1 -0
  43. package/utilities/extensions/src/color.extension.d.ts +20 -0
  44. package/utilities/models/src/pattern.model.d.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-services-confirm.mjs","sources":["../../../projects/sd-angular/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.ts","../../../projects/sd-angular/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.html","../../../projects/sd-angular/services/confirm/src/lib/confirm.service.ts","../../../projects/sd-angular/services/confirm/src/public-api.ts","../../../projects/sd-angular/services/confirm/sd-angular-core-services-confirm.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, Inject } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SdButton } from '@sd-angular/core/components/button';\r\nimport { SdDate } from '@sd-angular/core/forms/date';\r\nimport { SdRadio } from '@sd-angular/core/forms/radio';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\nimport * as uuid from 'uuid';\r\n\r\nexport interface DialogData {\r\n icon?: string;\r\n title?: string;\r\n message?: string;\r\n yesTitle?: string;\r\n noTitle?: string;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n input?: {\r\n placeholder?: string;\r\n minlength?: number;\r\n maxlength?: number;\r\n required?: boolean;\r\n defaultValue?: string;\r\n };\r\n date?: {\r\n required?: boolean;\r\n placeholder?: string;\r\n defaultValue?: string | Date;\r\n min?: string | Date;\r\n max?: string | Date;\r\n };\r\n radio?: {\r\n required?: boolean;\r\n defaultValue?: string | number;\r\n items: any[];\r\n valueField: string;\r\n displayField: string;\r\n display?: 'row' | 'column';\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'sd-dialog-confirm',\r\n templateUrl: 'dialog-confirm.component.html',\r\n styleUrls: ['./dialog-confirm.component.scss'],\r\n imports: [CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatIconModule, SdButton, SdDate, SdRadio],\r\n})\r\nexport class DialogConfirmComponent {\r\n value: any;\r\n required = false;\r\n id = `I${uuid.v4()}`;\r\n constructor(\r\n public dialogRef: MatDialogRef<DialogConfirmComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData\r\n ) {\r\n if (data?.input) {\r\n this.value = data?.input?.defaultValue ?? '';\r\n this.required = data?.input?.required || false;\r\n }\r\n if (data?.date) {\r\n this.value = data?.date?.defaultValue ?? '';\r\n this.required = data?.date?.required || false;\r\n }\r\n if (data?.radio) {\r\n this.value = data?.radio?.defaultValue ?? '';\r\n this.required = data?.radio?.required || false;\r\n }\r\n }\r\n\r\n onCancel = () => {\r\n this.dialogRef.close({ action: 'CANCEL', value: null });\r\n };\r\n\r\n onAccept = () => {\r\n // Always return an object with action and value for consistency\r\n if (this.data?.radio || this.data?.input || this.data?.date) {\r\n this.dialogRef.close({ action: 'ACCEPT', value: this.value });\r\n } else {\r\n this.dialogRef.close({ action: 'ACCEPT', value: null });\r\n }\r\n };\r\n}\r\n","<div mat-dialog-title class=\"\">\r\n @if (data.icon) {\r\n <mat-icon>\r\n {{ data.icon }}\r\n </mat-icon>\r\n }\r\n <span class=\"T28M\" [innerHtml]=\"data.title || 'Confirm'\"></span>\r\n</div>\r\n<div mat-dialog-content>\r\n <div class=\"T14R mb-4\" [innerHtml]=\"data.message\"></div>\r\n @if (data.input) {\r\n <mat-form-field appearance=\"outline\">\r\n <textarea\r\n style=\"width: 100%\"\r\n matInput\r\n [placeholder]=\"data.input.placeholder\"\r\n [(ngModel)]=\"value\"\r\n autocomplete=\"off\"\r\n rows=\"5\"\r\n [maxlength]=\"data.input.maxlength!\"></textarea>\r\n </mat-form-field>\r\n }\r\n @if (data.date) {\r\n <sd-date\r\n [placeholder]=\"data.date.placeholder\"\r\n [(model)]=\"value\"\r\n type=\"date\"\r\n [min]=\"data.date.min!\"\r\n [max]=\"data.date.max!\"\r\n [required]=\"data.date.required\">\r\n </sd-date>\r\n }\r\n @if (data.radio) {\r\n <sd-radio\r\n [items]=\"data.radio.items\"\r\n [valueField]=\"data.radio.valueField\"\r\n [displayField]=\"data.radio.displayField\"\r\n [display]=\"data.radio.display || 'column'\"\r\n [(model)]=\"value\"\r\n [required]=\"data.radio.required\">\r\n </sd-radio>\r\n }\r\n</div>\r\n<div mat-dialog-actions align=\"end\">\r\n @if (data.noTitle) {\r\n <sd-button [color]=\"data.noButtonColor || 'secondary'\" [title]=\"data.noTitle\" (click)=\"onCancel()\"></sd-button>\r\n }\r\n @if (data.yesTitle) {\r\n <sd-button\r\n class=\"ml-8\"\r\n type=\"fill\"\r\n [color]=\"data.yesButtonColor || 'primary'\"\r\n [disabled]=\"required && !value\"\r\n cdkFocusInitial\r\n [title]=\"data.yesTitle\"\r\n (click)=\"onAccept()\"></sd-button>\r\n }\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DialogConfirmComponent } from './components/dialog-confirm/dialog-confirm.component';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdConfirmService {\r\n constructor(private dialog: MatDialog) {}\r\n\r\n confirm = (\r\n message: string,\r\n option: {\r\n title?: string;\r\n yesTitle?: string;\r\n noTitle?: string;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n } = {}\r\n ) => {\r\n const dialogRef = this.dialog.open(DialogConfirmComponent, {\r\n width: '400px',\r\n data: {\r\n title: option?.title || 'Xác nhận',\r\n message,\r\n yesTitle: option?.yesTitle || 'Đồng ý',\r\n noTitle: option?.noTitle || 'Hủy bỏ',\r\n noButtonColor: option?.noButtonColor || 'secondary',\r\n yesButtonColor: option?.yesButtonColor || 'primary',\r\n },\r\n });\r\n return new Promise((resolve, reject) => {\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action === 'CANCEL') {\r\n reject(result.action);\r\n } else if (result.action === 'ACCEPT') {\r\n resolve(result.value);\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n withInput = (\r\n message?: string,\r\n option?: {\r\n title?: string;\r\n yesTitle?: string;\r\n noTitle?: string;\r\n required?: boolean;\r\n maxlength?: number;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n defaultValue?: string;\r\n }\r\n ): Promise<string> => {\r\n const dialogRef = this.dialog.open(DialogConfirmComponent, {\r\n width: '400px',\r\n data: {\r\n title: option?.title || 'Xác nhận',\r\n message,\r\n yesTitle: option?.yesTitle || 'Có',\r\n noTitle: option?.noTitle || 'Không',\r\n noButtonColor: option?.noButtonColor || 'secondary',\r\n yesButtonColor: option?.yesButtonColor || 'primary',\r\n input: {\r\n maxlength: option?.maxlength || 255,\r\n required: option?.required,\r\n defaultValue: option?.defaultValue || '',\r\n },\r\n },\r\n });\r\n return new Promise((resolve, reject) => {\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action === 'CANCEL') {\r\n reject(result.action);\r\n } else if (result.action === 'ACCEPT') {\r\n resolve(result.value);\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n withRadio = (\r\n message?: string,\r\n option?: {\r\n title?: string;\r\n yesTitle?: string;\r\n noTitle?: string;\r\n required?: boolean;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n defaultValue?: string | number;\r\n items: any[];\r\n valueField: string;\r\n displayField: string;\r\n display?: 'row' | 'column';\r\n }\r\n ): Promise<string> => {\r\n const dialogRef = this.dialog.open(DialogConfirmComponent, {\r\n width: '400px',\r\n data: {\r\n title: option?.title || 'Xác nhận',\r\n message,\r\n yesTitle: option?.yesTitle || 'Có',\r\n noTitle: option?.noTitle || 'Không',\r\n noButtonColor: option?.noButtonColor || 'secondary',\r\n yesButtonColor: option?.yesButtonColor || 'primary',\r\n radio: {\r\n items: option?.items || [],\r\n valueField: option?.valueField || 'value',\r\n displayField: option?.displayField || 'label',\r\n display: option?.display || 'row',\r\n required: option?.required,\r\n defaultValue: option?.defaultValue,\r\n },\r\n },\r\n });\r\n return new Promise((resolve, reject) => {\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action === 'CANCEL') {\r\n reject(result.action);\r\n } else if (result.action === 'ACCEPT') {\r\n resolve(result.value);\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n withDate = (\r\n message?: string,\r\n option?: {\r\n title?: string;\r\n\r\n yesTitle?: string;\r\n noTitle?: string;\r\n required?: boolean;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n defaultValue?: string | Date;\r\n placeholder?: string;\r\n }\r\n ): Promise<string> => {\r\n const dialogRef = this.dialog.open(DialogConfirmComponent, {\r\n width: '400px',\r\n data: {\r\n title: option?.title || 'Xác nhận',\r\n message,\r\n yesTitle: option?.yesTitle || 'Có',\r\n noTitle: option?.noTitle || 'Không',\r\n noButtonColor: option?.noButtonColor || 'secondary',\r\n yesButtonColor: option?.yesButtonColor || 'primary',\r\n date: {\r\n placeholder: option?.placeholder,\r\n required: option?.required,\r\n defaultValue: option?.defaultValue || '',\r\n },\r\n },\r\n });\r\n return new Promise((resolve, reject) => {\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action === 'CANCEL') {\r\n reject(result.action);\r\n } else if (result.action === 'ACCEPT') {\r\n resolve(result.value);\r\n }\r\n }\r\n });\r\n });\r\n };\r\n}\r\n","/*\n * Public API Surface of superdev-angular-core\n */\n\nexport * from './lib/components/dialog-confirm/dialog-confirm.component';\nexport * from './lib/confirm.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-services-confirm.mjs","sources":["../../../projects/sd-angular/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.ts","../../../projects/sd-angular/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.html","../../../projects/sd-angular/services/confirm/src/lib/confirm.service.ts","../../../projects/sd-angular/services/confirm/src/public-api.ts","../../../projects/sd-angular/services/confirm/sd-angular-core-services-confirm.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, Inject } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SdButton } from '@sd-angular/core/components/button';\r\nimport { SdDate } from '@sd-angular/core/forms/date';\r\nimport { SdRadio } from '@sd-angular/core/forms/radio';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\nimport * as uuid from 'uuid';\r\n\r\nexport interface DialogData {\r\n icon?: string;\r\n title?: string;\r\n message?: string;\r\n yesTitle?: string;\r\n noTitle?: string;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n input?: {\r\n placeholder?: string;\r\n minlength?: number;\r\n maxlength?: number;\r\n required?: boolean;\r\n defaultValue?: string;\r\n };\r\n date?: {\r\n required?: boolean;\r\n placeholder?: string;\r\n defaultValue?: string | Date;\r\n min?: string | Date;\r\n max?: string | Date;\r\n };\r\n radio?: {\r\n required?: boolean;\r\n defaultValue?: string | number;\r\n items: any[];\r\n valueField: string;\r\n displayField: string;\r\n display?: 'row' | 'column';\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'sd-dialog-confirm',\r\n templateUrl: 'dialog-confirm.component.html',\r\n styleUrls: ['./dialog-confirm.component.scss'],\r\n imports: [CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatIconModule, SdButton, SdDate, SdRadio],\r\n})\r\nexport class DialogConfirmComponent {\r\n value: any;\r\n required = false;\r\n id = `I${uuid.v4()}`;\r\n constructor(\r\n public dialogRef: MatDialogRef<DialogConfirmComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData\r\n ) {\r\n if (data?.input) {\r\n this.value = data?.input?.defaultValue ?? '';\r\n this.required = data?.input?.required || false;\r\n }\r\n if (data?.date) {\r\n this.value = data?.date?.defaultValue ?? '';\r\n this.required = data?.date?.required || false;\r\n }\r\n if (data?.radio) {\r\n this.value = data?.radio?.defaultValue ?? '';\r\n this.required = data?.radio?.required || false;\r\n }\r\n }\r\n\r\n onCancel = () => {\r\n this.dialogRef.close({ action: 'CANCEL', value: null });\r\n };\r\n\r\n onAccept = () => {\r\n // Always return an object with action and value for consistency\r\n if (this.data?.radio || this.data?.input || this.data?.date) {\r\n this.dialogRef.close({ action: 'ACCEPT', value: this.value });\r\n } else {\r\n this.dialogRef.close({ action: 'ACCEPT', value: null });\r\n }\r\n };\r\n}\r\n","<div mat-dialog-title class=\"\">\r\n @if (data.icon) {\r\n <mat-icon>\r\n {{ data.icon }}\r\n </mat-icon>\r\n }\r\n <span class=\"T28M\" [innerHtml]=\"data.title || 'Confirm'\"></span>\r\n</div>\r\n<div mat-dialog-content>\r\n <div class=\"T14R mb-4\" [innerHtml]=\"data.message\"></div>\r\n @if (data.input) {\r\n <mat-form-field appearance=\"outline\">\r\n <textarea\r\n style=\"width: 100%\"\r\n matInput\r\n [placeholder]=\"data.input.placeholder\"\r\n [(ngModel)]=\"value\"\r\n autocomplete=\"off\"\r\n rows=\"5\"\r\n [maxlength]=\"data.input.maxlength!\"></textarea>\r\n </mat-form-field>\r\n }\r\n @if (data.date) {\r\n <sd-date\r\n [placeholder]=\"data.date.placeholder\"\r\n [(model)]=\"value\"\r\n type=\"date\"\r\n [min]=\"data.date.min!\"\r\n [max]=\"data.date.max!\"\r\n [required]=\"data.date.required\">\r\n </sd-date>\r\n }\r\n @if (data.radio) {\r\n <sd-radio\r\n [items]=\"data.radio.items\"\r\n [valueField]=\"data.radio.valueField\"\r\n [displayField]=\"data.radio.displayField\"\r\n [display]=\"data.radio.display || 'column'\"\r\n [(model)]=\"value\"\r\n [required]=\"data.radio.required\">\r\n </sd-radio>\r\n }\r\n</div>\r\n<div mat-dialog-actions align=\"end\">\r\n @if (data.noTitle) {\r\n <sd-button [color]=\"data.noButtonColor || 'secondary'\" [title]=\"data.noTitle\" (click)=\"onCancel()\"></sd-button>\r\n }\r\n @if (data.yesTitle) {\r\n <sd-button\r\n class=\"ml-8\"\r\n type=\"fill\"\r\n [color]=\"data.yesButtonColor || 'primary'\"\r\n [disabled]=\"required && !value\"\r\n cdkFocusInitial\r\n [title]=\"data.yesTitle\"\r\n (click)=\"onAccept()\"></sd-button>\r\n }\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DialogConfirmComponent } from './components/dialog-confirm/dialog-confirm.component';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdConfirmService {\r\n constructor(private dialog: MatDialog) {}\r\n\r\n confirm = (\r\n message: string,\r\n option: {\r\n title?: string;\r\n yesTitle?: string;\r\n noTitle?: string;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n } = {}\r\n ) => {\r\n const dialogRef = this.dialog.open(DialogConfirmComponent, {\r\n width: '400px',\r\n data: {\r\n title: option?.title || 'Xác nhận',\r\n message,\r\n yesTitle: option?.yesTitle || 'Đồng ý',\r\n noTitle: option?.noTitle || 'Hủy bỏ',\r\n noButtonColor: option?.noButtonColor || 'secondary',\r\n yesButtonColor: option?.yesButtonColor || 'primary',\r\n },\r\n });\r\n return new Promise((resolve, reject) => {\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action === 'CANCEL') {\r\n reject(result.action);\r\n } else if (result.action === 'ACCEPT') {\r\n resolve(result.value);\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n withInput = (\r\n message?: string,\r\n option?: {\r\n title?: string;\r\n yesTitle?: string;\r\n noTitle?: string;\r\n required?: boolean;\r\n maxlength?: number;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n defaultValue?: string;\r\n }\r\n ): Promise<string> => {\r\n const dialogRef = this.dialog.open(DialogConfirmComponent, {\r\n width: '400px',\r\n data: {\r\n title: option?.title || 'Xác nhận',\r\n message,\r\n yesTitle: option?.yesTitle || 'Có',\r\n noTitle: option?.noTitle || 'Không',\r\n noButtonColor: option?.noButtonColor || 'secondary',\r\n yesButtonColor: option?.yesButtonColor || 'primary',\r\n input: {\r\n maxlength: option?.maxlength || 255,\r\n required: option?.required,\r\n defaultValue: option?.defaultValue || '',\r\n },\r\n },\r\n });\r\n return new Promise((resolve, reject) => {\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action === 'CANCEL') {\r\n reject(result.action);\r\n } else if (result.action === 'ACCEPT') {\r\n resolve(result.value);\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n withRadio = (\r\n message?: string,\r\n option?: {\r\n title?: string;\r\n yesTitle?: string;\r\n noTitle?: string;\r\n required?: boolean;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n defaultValue?: string | number;\r\n items: any[];\r\n valueField: string;\r\n displayField: string;\r\n display?: 'row' | 'column';\r\n }\r\n ): Promise<string> => {\r\n const dialogRef = this.dialog.open(DialogConfirmComponent, {\r\n width: '400px',\r\n data: {\r\n title: option?.title || 'Xác nhận',\r\n message,\r\n yesTitle: option?.yesTitle || 'Có',\r\n noTitle: option?.noTitle || 'Không',\r\n noButtonColor: option?.noButtonColor || 'secondary',\r\n yesButtonColor: option?.yesButtonColor || 'primary',\r\n radio: {\r\n items: option?.items || [],\r\n valueField: option?.valueField || 'value',\r\n displayField: option?.displayField || 'label',\r\n display: option?.display || 'row',\r\n required: option?.required,\r\n defaultValue: option?.defaultValue,\r\n },\r\n },\r\n });\r\n return new Promise((resolve, reject) => {\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action === 'CANCEL') {\r\n reject(result.action);\r\n } else if (result.action === 'ACCEPT') {\r\n resolve(result.value);\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n withDate = (\r\n message?: string,\r\n option?: {\r\n title?: string;\r\n\r\n yesTitle?: string;\r\n noTitle?: string;\r\n required?: boolean;\r\n yesButtonColor?: SdColor;\r\n noButtonColor?: SdColor;\r\n defaultValue?: string | Date;\r\n placeholder?: string;\r\n }\r\n ): Promise<string> => {\r\n const dialogRef = this.dialog.open(DialogConfirmComponent, {\r\n width: '400px',\r\n data: {\r\n title: option?.title || 'Xác nhận',\r\n message,\r\n yesTitle: option?.yesTitle || 'Có',\r\n noTitle: option?.noTitle || 'Không',\r\n noButtonColor: option?.noButtonColor || 'secondary',\r\n yesButtonColor: option?.yesButtonColor || 'primary',\r\n date: {\r\n placeholder: option?.placeholder,\r\n required: option?.required,\r\n defaultValue: option?.defaultValue || '',\r\n },\r\n },\r\n });\r\n return new Promise((resolve, reject) => {\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action === 'CANCEL') {\r\n reject(result.action);\r\n } else if (result.action === 'ACCEPT') {\r\n resolve(result.value);\r\n }\r\n }\r\n });\r\n });\r\n };\r\n}\r\n","/*\n * Public API Surface of superdev-angular-core\n */\n\nexport * from './lib/components/dialog-confirm/dialog-confirm.component';\nexport * from './lib/confirm.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;MAkDa,sBAAsB,CAAA;AAKxB,IAAA,SAAA;AACyB,IAAA,IAAA;AALlC,IAAA,KAAK;IACL,QAAQ,GAAG,KAAK;AAChB,IAAA,EAAE,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE;IACpB,WAAA,CACS,SAA+C,EACtB,IAAgB,EAAA;QADzC,IAAA,CAAA,SAAS,GAAT,SAAS;QACgB,IAAA,CAAA,IAAI,GAAJ,IAAI;AAEpC,QAAA,IAAI,IAAI,EAAE,KAAK,EAAE;YACf,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,IAAI,EAAE;YAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,IAAI,KAAK;QAChD;AACA,QAAA,IAAI,IAAI,EAAE,IAAI,EAAE;YACd,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY,IAAI,EAAE;YAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK;QAC/C;AACA,QAAA,IAAI,IAAI,EAAE,KAAK,EAAE;YACf,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,IAAI,EAAE;YAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,IAAI,KAAK;QAChD;IACF;IAEA,QAAQ,GAAG,MAAK;AACd,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzD,IAAA,CAAC;IAED,QAAQ,GAAG,MAAK;;AAEd,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AAC3D,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/D;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzD;AACF,IAAA,CAAC;AAjCU,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,8CAMvB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AANd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,6EClDnC,uxDA0DA,EAAA,MAAA,EAAA,CAAA,26JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDVY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,yOAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,mUAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAEvG,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,WAGpB,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAA,QAAA,EAAA,uxDAAA,EAAA,MAAA,EAAA,CAAA,26JAAA,CAAA,EAAA;;0BAQhH,MAAM;2BAAC,eAAe;;;MEhDd,gBAAgB,CAAA;AACP,IAAA,MAAA;AAApB,IAAA,WAAA,CAAoB,MAAiB,EAAA;QAAjB,IAAA,CAAA,MAAM,GAAN,MAAM;IAAc;AAExC,IAAA,OAAO,GAAG,CACR,OAAe,EACf,MAAA,GAMI,EAAE,KACJ;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,UAAU;gBAClC,OAAO;AACP,gBAAA,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,QAAQ;AACtC,gBAAA,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,QAAQ;AACpC,gBAAA,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,WAAW;AACnD,gBAAA,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,SAAS;AACpD,aAAA;AACF,SAAA,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;gBACzC,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AAC9B,wBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;oBACvB;AAAO,yBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AACrC,wBAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;oBACvB;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,SAAS,GAAG,CACV,OAAgB,EAChB,MASC,KACkB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,UAAU;gBAClC,OAAO;AACP,gBAAA,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI;AAClC,gBAAA,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,OAAO;AACnC,gBAAA,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,WAAW;AACnD,gBAAA,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,SAAS;AACnD,gBAAA,KAAK,EAAE;AACL,oBAAA,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,GAAG;oBACnC,QAAQ,EAAE,MAAM,EAAE,QAAQ;AAC1B,oBAAA,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,EAAE;AACzC,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;gBACzC,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AAC9B,wBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;oBACvB;AAAO,yBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AACrC,wBAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;oBACvB;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,SAAS,GAAG,CACV,OAAgB,EAChB,MAYC,KACkB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,UAAU;gBAClC,OAAO;AACP,gBAAA,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI;AAClC,gBAAA,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,OAAO;AACnC,gBAAA,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,WAAW;AACnD,gBAAA,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,SAAS;AACnD,gBAAA,KAAK,EAAE;AACL,oBAAA,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,oBAAA,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,OAAO;AACzC,oBAAA,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,OAAO;AAC7C,oBAAA,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK;oBACjC,QAAQ,EAAE,MAAM,EAAE,QAAQ;oBAC1B,YAAY,EAAE,MAAM,EAAE,YAAY;AACnC,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;gBACzC,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AAC9B,wBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;oBACvB;AAAO,yBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AACrC,wBAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;oBACvB;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CACT,OAAgB,EAChB,MAUC,KACkB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;AACzD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,UAAU;gBAClC,OAAO;AACP,gBAAA,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI;AAClC,gBAAA,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,OAAO;AACnC,gBAAA,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,WAAW;AACnD,gBAAA,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,SAAS;AACnD,gBAAA,IAAI,EAAE;oBACJ,WAAW,EAAE,MAAM,EAAE,WAAW;oBAChC,QAAQ,EAAE,MAAM,EAAE,QAAQ;AAC1B,oBAAA,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,EAAE;AACzC,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,IAAG;gBACzC,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AAC9B,wBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;oBACvB;AAAO,yBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AACrC,wBAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;oBACvB;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;wGAxKU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACPD;;AAEG;;ACFH;;AAEG;;;;"}
@@ -1085,9 +1085,74 @@ const SdUtilities = {
1085
1085
  generateUuid
1086
1086
  };
1087
1087
 
1088
+ /**
1089
+ * Color Utilities Extension
1090
+ * Các tiện ích xử lý màu
1091
+ */
1092
+ /**
1093
+ * Chuyển đổi màu HSL sang định dạng hex
1094
+ * @param h - Hue (0-360)
1095
+ * @param s - Saturation (0-100)
1096
+ * @param l - Lightness (0-100)
1097
+ * @returns Mã màu hex
1098
+ */
1099
+ function hslToHex(h, s, l) {
1100
+ // Chuyển đổi sang định dạng 0-1
1101
+ const hNormalized = h / 360;
1102
+ const sNormalized = s / 100;
1103
+ const lNormalized = l / 100;
1104
+ let r, g, b;
1105
+ if (sNormalized === 0) {
1106
+ // Màu xám (grayscale)
1107
+ r = g = b = lNormalized;
1108
+ }
1109
+ else {
1110
+ const hue2rgb = (p, q, t) => {
1111
+ if (t < 0)
1112
+ t += 1;
1113
+ if (t > 1)
1114
+ t -= 1;
1115
+ if (t < 1 / 6)
1116
+ return p + (q - p) * 6 * t;
1117
+ if (t < 1 / 2)
1118
+ return q;
1119
+ if (t < 2 / 3)
1120
+ return p + (q - p) * (2 / 3 - t) * 6;
1121
+ return p;
1122
+ };
1123
+ const q = lNormalized < 0.5
1124
+ ? lNormalized * (1 + sNormalized)
1125
+ : lNormalized + sNormalized - lNormalized * sNormalized;
1126
+ const p = 2 * lNormalized - q;
1127
+ r = hue2rgb(p, q, hNormalized + 1 / 3);
1128
+ g = hue2rgb(p, q, hNormalized);
1129
+ b = hue2rgb(p, q, hNormalized - 1 / 3);
1130
+ }
1131
+ // Chuyển đổi sang hex
1132
+ const toHex = (x) => {
1133
+ const hex = Math.round(x * 255).toString(16);
1134
+ return hex.length === 1 ? '0' + hex : hex;
1135
+ };
1136
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
1137
+ }
1138
+ /**
1139
+ * Chuyển đổi màu RGB sang hex
1140
+ * @param r - Red (0-255)
1141
+ * @param g - Green (0-255)
1142
+ * @param b - Blue (0-255)
1143
+ * @returns Mã màu hex
1144
+ */
1145
+ function rgbToHex(r, g, b) {
1146
+ const toHex = (x) => {
1147
+ const hex = Math.round(Math.max(0, Math.min(255, x))).toString(16);
1148
+ return hex.length === 1 ? '0' + hex : hex;
1149
+ };
1150
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
1151
+ }
1152
+
1088
1153
  /**
1089
1154
  * Generated bundle index. Do not edit.
1090
1155
  */
1091
1156
 
1092
- export { ArrayUtilities, DateUtilities, NumberUtilities, SdUtilities, StringUtilities };
1157
+ export { ArrayUtilities, DateUtilities, NumberUtilities, SdUtilities, StringUtilities, hslToHex, rgbToHex };
1093
1158
  //# sourceMappingURL=sd-angular-core-utilities-extensions.mjs.map
@@ -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/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[0-9]|8[1-9]|9[0-9])d{7}$';\r\n\r\nconst isValidEmail = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\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 = /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\s\\./0-9]*$/;\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(/^ *$/) !== 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\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, entity?.[key] || '');\r\n }\r\n }\r\n return template;\r\n};\r\n\r\n// Convert: `${name} === \"Tên\"` => true/false;\r\nconst parseExpression = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return undefined;\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 // Xử lý trong trường hợp key có định dạng a.b.c ...\r\n let val: any = entity;\r\n const strs = key.split('.');\r\n for (const str of strs) {\r\n val = val?.[str];\r\n }\r\n if (typeof val === 'string') {\r\n // Nếu là chuỗi thì thêm dấu nháy khi replace giá trị để so sánh, ví dụ 'a' === 'a'\r\n // Nếu là số hay boolean thì không cần, ví dụ 121 === 121\r\n template = template.replace(match, `'${val}'`);\r\n } else {\r\n // Nếu là object/array thì phải dùng JSON.stringify\r\n if (typeof val === 'object' && !!val) {\r\n template = template.replace(match, JSON.stringify(val) ?? `undefined`);\r\n } else {\r\n template = template.replace(match, val ?? `undefined`);\r\n }\r\n }\r\n }\r\n }\r\n if (!template) {\r\n return undefined;\r\n }\r\n try {\r\n const result = new Function('return ' + template)();\r\n return result;\r\n } catch (ex) {\r\n console.error(ex);\r\n return undefined;\r\n }\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 (encripted[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\nexport const StringUtilities = {\r\n REGEX_EMAIL,\r\n REGEX_PHONE,\r\n REGEX_PHONE_VN,\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};\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) {\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","import { DateUtilities } from './date.extension';\r\nimport { StringUtilities } from './string.extension';\r\n// interface SdUtilityContructor {\r\n// upload: (option?: {\r\n// extensions?: string[];\r\n// maxSizeInMb?: number;\r\n// validator?: (fileName: string) => string;\r\n// multiple?: boolean;\r\n// }) => Promise<File | File[] | null>;\r\n// download: (filePath: string, fileName?: string) => void;\r\n// downloadBlob: (blob: Blob, fileName?: string) => void;\r\n// changeAliasLowerCase: (alias: string) => string;\r\n// copyToClipboard: (text: string) => void;\r\n// allWithPaging: <T = any>(\r\n// func: (\r\n// pageSize: number,\r\n// pageNumber: number\r\n// ) => Promise<{\r\n// items: T[];\r\n// total: number;\r\n// }>,\r\n// defaultPageSize?: number\r\n// ) => Promise<T[]>;\r\n// isIncognito: () => Promise<boolean>;\r\n// isMobile: () => boolean;\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 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);\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// var SdUtility: SdUtilityContructor = {\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// };\r\n\r\n// declare global {\r\n// var SdUtility: SdUtilityContructor;\r\n// }\r\n// globalThis.SdUtility = SdUtility;\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\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};\r\nexport { SdUtilities };\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[0-9]|8[1-9]|9[0-9])d{7}$';\r\n\r\nconst isValidEmail = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\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 = /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\s\\./0-9]*$/;\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(/^ *$/) !== 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\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, entity?.[key] || '');\r\n }\r\n }\r\n return template;\r\n};\r\n\r\n// Convert: `${name} === \"Tên\"` => true/false;\r\nconst parseExpression = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return undefined;\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 // Xử lý trong trường hợp key có định dạng a.b.c ...\r\n let val: any = entity;\r\n const strs = key.split('.');\r\n for (const str of strs) {\r\n val = val?.[str];\r\n }\r\n if (typeof val === 'string') {\r\n // Nếu là chuỗi thì thêm dấu nháy khi replace giá trị để so sánh, ví dụ 'a' === 'a'\r\n // Nếu là số hay boolean thì không cần, ví dụ 121 === 121\r\n template = template.replace(match, `'${val}'`);\r\n } else {\r\n // Nếu là object/array thì phải dùng JSON.stringify\r\n if (typeof val === 'object' && !!val) {\r\n template = template.replace(match, JSON.stringify(val) ?? `undefined`);\r\n } else {\r\n template = template.replace(match, val ?? `undefined`);\r\n }\r\n }\r\n }\r\n }\r\n if (!template) {\r\n return undefined;\r\n }\r\n try {\r\n const result = new Function('return ' + template)();\r\n return result;\r\n } catch (ex) {\r\n console.error(ex);\r\n return undefined;\r\n }\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 (encripted[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\nexport const StringUtilities = {\r\n REGEX_EMAIL,\r\n REGEX_PHONE,\r\n REGEX_PHONE_VN,\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};\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) {\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","import { DateUtilities } from './date.extension';\r\nimport { StringUtilities } from './string.extension';\r\n// interface SdUtilityContructor {\r\n// upload: (option?: {\r\n// extensions?: string[];\r\n// maxSizeInMb?: number;\r\n// validator?: (fileName: string) => string;\r\n// multiple?: boolean;\r\n// }) => Promise<File | File[] | null>;\r\n// download: (filePath: string, fileName?: string) => void;\r\n// downloadBlob: (blob: Blob, fileName?: string) => void;\r\n// changeAliasLowerCase: (alias: string) => string;\r\n// copyToClipboard: (text: string) => void;\r\n// allWithPaging: <T = any>(\r\n// func: (\r\n// pageSize: number,\r\n// pageNumber: number\r\n// ) => Promise<{\r\n// items: T[];\r\n// total: number;\r\n// }>,\r\n// defaultPageSize?: number\r\n// ) => Promise<T[]>;\r\n// isIncognito: () => Promise<boolean>;\r\n// isMobile: () => boolean;\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 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);\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// var SdUtility: SdUtilityContructor = {\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// };\r\n\r\n// declare global {\r\n// var SdUtility: SdUtilityContructor;\r\n// }\r\n// globalThis.SdUtility = SdUtility;\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\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};\r\nexport { SdUtilities };\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,7 +1,7 @@
1
1
  import { StringUtilities } from '@sd-angular/core/utilities/extensions';
2
2
  import { firstValueFrom, from, of } from 'rxjs';
3
3
 
4
- const SdPatterns = [
4
+ const SdPatternCommons = [
5
5
  {
6
6
  type: 'EMAIL',
7
7
  name: 'Email',
@@ -123,5 +123,5 @@ const SdOperators = [
123
123
  * Generated bundle index. Do not edit.
124
124
  */
125
125
 
126
- export { SD_EMPTY_STR, SdNormalizeAsync, SdOperators, SdPatterns, SdResolveMaybeAsync };
126
+ export { SD_EMPTY_STR, SdNormalizeAsync, SdOperators, SdPatternCommons, SdResolveMaybeAsync };
127
127
  //# sourceMappingURL=sd-angular-core-utilities-models.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-utilities-models.mjs","sources":["../../../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":["import { StringUtilities } from '@sd-angular/core/utilities/extensions';\r\n\r\nexport type SdPatternType = 'EMAIL' | 'PHONE' | 'PHONE_VN';\r\n\r\nexport interface SdPattern {\r\n type: SdPatternType;\r\n name: string;\r\n regex: string;\r\n errorMessage: string;\r\n}\r\n\r\nexport const SdPatterns: SdPattern[] = [\r\n {\r\n type: 'EMAIL',\r\n name: 'Email',\r\n regex: StringUtilities.REGEX_EMAIL,\r\n errorMessage: 'Email không hợp lệ',\r\n },\r\n {\r\n type: 'PHONE',\r\n name: 'SĐT',\r\n regex: StringUtilities.REGEX_PHONE,\r\n errorMessage: 'Số điện thoại không hợp lệ',\r\n },\r\n {\r\n type: 'PHONE_VN',\r\n name: 'SĐT VN',\r\n regex: StringUtilities.REGEX_PHONE_VN,\r\n errorMessage: 'Số điện thoại không hợp lệ',\r\n },\r\n];\r\n","export const SD_EMPTY_STR = '--';\r\n","import { firstValueFrom, from, Observable, of } from 'rxjs';\r\n\r\nexport type SdMaybeAsync<T> = T | Promise<T> | Observable<T>;\r\n\r\nexport const SdResolveMaybeAsync = <T>(value: SdMaybeAsync<T>): Promise<T> => {\r\n if (value instanceof Promise) {\r\n return value;\r\n }\r\n if (isObservable(value)) {\r\n return firstValueFrom(value);\r\n }\r\n return Promise.resolve(value);\r\n};\r\n\r\nexport const SdNormalizeAsync = <T>(value: SdMaybeAsync<T>): Observable<T> => {\r\n if (isObservable(value)) {\r\n return value; // Nếu là Observable, giữ nguyên\r\n }\r\n if (value instanceof Promise) {\r\n return from(value); // Nếu là Promise, chuyển sang Observable\r\n }\r\n return of(value); // Nếu là giá trị thuần (Object, string...), bọc lại bằng of\r\n};\r\n\r\nfunction isObservable(obj: any): obj is Observable<any> {\r\n return obj && typeof obj.subscribe === 'function';\r\n}","export type SdOperator = SdOperatorHasData | SdOperatorNoData;\r\n\r\nexport type SdOperatorHasData =\r\n | 'EQUAL'\r\n | 'NOT_EQUAL'\r\n | 'CONTAIN'\r\n | 'NOT_CONTAIN'\r\n | 'IN'\r\n | 'NOT_IN'\r\n | 'START_WITH'\r\n | 'END_WITH'\r\n | 'GREATER_THAN'\r\n | 'LESS_THAN'\r\n | 'GREATER_OR_EQUAL'\r\n | 'LESS_OR_EQUAL'\r\n | 'BETWEEN';\r\n\r\nexport type SdOperatorNoData = 'NULL' | 'NOT_NULL';\r\n\r\nexport const SdOperators: {\r\n value: SdOperator;\r\n symbol?: string;\r\n display: string;\r\n}[] = [\r\n {\r\n value: 'EQUAL',\r\n symbol: '=',\r\n display: 'Bằng',\r\n },\r\n {\r\n value: 'NOT_EQUAL',\r\n symbol: '≠',\r\n display: 'Không bằng',\r\n },\r\n {\r\n value: 'GREATER_THAN',\r\n symbol: '>',\r\n display: 'Lớn hơn',\r\n },\r\n {\r\n value: 'LESS_THAN',\r\n symbol: '<',\r\n display: 'Nhỏ hơn',\r\n },\r\n {\r\n value: 'GREATER_OR_EQUAL',\r\n symbol: '≥',\r\n display: 'Lớn hơn, hoặc bằng',\r\n },\r\n {\r\n value: 'LESS_OR_EQUAL',\r\n symbol: '≤',\r\n display: 'Nhỏ hơn, hoặc bằng',\r\n },\r\n {\r\n value: 'CONTAIN',\r\n symbol: 'join_inner',\r\n display: 'Chứa',\r\n },\r\n {\r\n value: 'NOT_CONTAIN',\r\n symbol: 'join',\r\n display: 'Không chứa',\r\n },\r\n {\r\n value: 'START_WITH',\r\n symbol: 'line_start_circle',\r\n display: 'Bắt đầu bởi',\r\n },\r\n {\r\n value: 'END_WITH',\r\n symbol: 'line_end_circle',\r\n display: 'Kết thúc bởi',\r\n },\r\n {\r\n value: 'IN',\r\n symbol: 'checklist_rtl',\r\n display: 'Nằm trong',\r\n },\r\n {\r\n value: 'NOT_IN',\r\n symbol: 'event_list',\r\n display: 'Không nằm trong',\r\n },\r\n {\r\n value: 'NULL',\r\n symbol: 'motion_photos_off',\r\n display: 'Là rỗng',\r\n },\r\n {\r\n value: 'NOT_NULL',\r\n symbol: 'adjust',\r\n display: 'Không rỗng',\r\n },\r\n];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-utilities-models.mjs","sources":["../../../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":["import { StringUtilities } from '@sd-angular/core/utilities/extensions';\r\n\r\nexport type SdPatternType = 'EMAIL' | 'PHONE' | 'PHONE_VN';\r\n\r\nexport interface SdPatternCommon {\r\n type: SdPatternType;\r\n name: string;\r\n regex: string;\r\n errorMessage: string;\r\n}\r\n\r\nexport const SdPatternCommons: SdPatternCommon[] = [\r\n {\r\n type: 'EMAIL',\r\n name: 'Email',\r\n regex: StringUtilities.REGEX_EMAIL,\r\n errorMessage: 'Email không hợp lệ',\r\n },\r\n {\r\n type: 'PHONE',\r\n name: 'SĐT',\r\n regex: StringUtilities.REGEX_PHONE,\r\n errorMessage: 'Số điện thoại không hợp lệ',\r\n },\r\n {\r\n type: 'PHONE_VN',\r\n name: 'SĐT VN',\r\n regex: StringUtilities.REGEX_PHONE_VN,\r\n errorMessage: 'Số điện thoại không hợp lệ',\r\n },\r\n];\r\n","export const SD_EMPTY_STR = '--';\r\n","import { firstValueFrom, from, Observable, of } from 'rxjs';\r\n\r\nexport type SdMaybeAsync<T> = T | Promise<T> | Observable<T>;\r\n\r\nexport const SdResolveMaybeAsync = <T>(value: SdMaybeAsync<T>): Promise<T> => {\r\n if (value instanceof Promise) {\r\n return value;\r\n }\r\n if (isObservable(value)) {\r\n return firstValueFrom(value);\r\n }\r\n return Promise.resolve(value);\r\n};\r\n\r\nexport const SdNormalizeAsync = <T>(value: SdMaybeAsync<T>): Observable<T> => {\r\n if (isObservable(value)) {\r\n return value; // Nếu là Observable, giữ nguyên\r\n }\r\n if (value instanceof Promise) {\r\n return from(value); // Nếu là Promise, chuyển sang Observable\r\n }\r\n return of(value); // Nếu là giá trị thuần (Object, string...), bọc lại bằng of\r\n};\r\n\r\nfunction isObservable(obj: any): obj is Observable<any> {\r\n return obj && typeof obj.subscribe === 'function';\r\n}","export type SdOperator = SdOperatorHasData | SdOperatorNoData;\r\n\r\nexport type SdOperatorHasData =\r\n | 'EQUAL'\r\n | 'NOT_EQUAL'\r\n | 'CONTAIN'\r\n | 'NOT_CONTAIN'\r\n | 'IN'\r\n | 'NOT_IN'\r\n | 'START_WITH'\r\n | 'END_WITH'\r\n | 'GREATER_THAN'\r\n | 'LESS_THAN'\r\n | 'GREATER_OR_EQUAL'\r\n | 'LESS_OR_EQUAL'\r\n | 'BETWEEN';\r\n\r\nexport type SdOperatorNoData = 'NULL' | 'NOT_NULL';\r\n\r\nexport const SdOperators: {\r\n value: SdOperator;\r\n symbol?: string;\r\n display: string;\r\n}[] = [\r\n {\r\n value: 'EQUAL',\r\n symbol: '=',\r\n display: 'Bằng',\r\n },\r\n {\r\n value: 'NOT_EQUAL',\r\n symbol: '≠',\r\n display: 'Không bằng',\r\n },\r\n {\r\n value: 'GREATER_THAN',\r\n symbol: '>',\r\n display: 'Lớn hơn',\r\n },\r\n {\r\n value: 'LESS_THAN',\r\n symbol: '<',\r\n display: 'Nhỏ hơn',\r\n },\r\n {\r\n value: 'GREATER_OR_EQUAL',\r\n symbol: '≥',\r\n display: 'Lớn hơn, hoặc bằng',\r\n },\r\n {\r\n value: 'LESS_OR_EQUAL',\r\n symbol: '≤',\r\n display: 'Nhỏ hơn, hoặc bằng',\r\n },\r\n {\r\n value: 'CONTAIN',\r\n symbol: 'join_inner',\r\n display: 'Chứa',\r\n },\r\n {\r\n value: 'NOT_CONTAIN',\r\n symbol: 'join',\r\n display: 'Không chứa',\r\n },\r\n {\r\n value: 'START_WITH',\r\n symbol: 'line_start_circle',\r\n display: 'Bắt đầu bởi',\r\n },\r\n {\r\n value: 'END_WITH',\r\n symbol: 'line_end_circle',\r\n display: 'Kết thúc bởi',\r\n },\r\n {\r\n value: 'IN',\r\n symbol: 'checklist_rtl',\r\n display: 'Nằm trong',\r\n },\r\n {\r\n value: 'NOT_IN',\r\n symbol: 'event_list',\r\n display: 'Không nằm trong',\r\n },\r\n {\r\n value: 'NULL',\r\n symbol: 'motion_photos_off',\r\n display: 'Là rỗng',\r\n },\r\n {\r\n value: 'NOT_NULL',\r\n symbol: 'adjust',\r\n display: 'Không rỗng',\r\n },\r\n];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}