@ldquocc/dynamic-form 0.0.5 → 0.0.6

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 (21) hide show
  1. package/fesm2022/ldquocc-dynamic-form.mjs +1293 -3088
  2. package/fesm2022/ldquocc-dynamic-form.mjs.map +1 -1
  3. package/lib/shared/components/component.d.ts +13 -14
  4. package/lib/shared/components/dynamic-field/dynamic-field.component.d.ts +5 -5
  5. package/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.d.ts +1 -0
  6. package/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.d.ts +7 -6
  7. package/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.d.ts +1 -0
  8. package/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.d.ts +1 -0
  9. package/lib/shared/consts/common/index.d.ts +0 -1
  10. package/lib/shared/models/fields/index.model.d.ts +1 -0
  11. package/lib/shared/models/fields/upload/index.d.ts +5 -0
  12. package/lib/shared/services/dynamic-form.service.d.ts +3 -3
  13. package/lib/shared/utils/validators/custom-validators.d.ts +1 -2
  14. package/package.json +1 -1
  15. package/public-api.d.ts +18 -0
  16. package/lib/shared/components/fields/radio/custom/reminder-type-radio/reminder-type-radio.component.d.ts +0 -24
  17. package/lib/shared/consts/common/sample-test.const.d.ts +0 -68
  18. package/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-option.model.d.ts +0 -26
  19. package/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-type-radio-field.model.d.ts +0 -14
  20. package/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-type.model.d.ts +0 -1
  21. package/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-value.model.d.ts +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ldquocc-dynamic-form.mjs","sources":["../../../projects/dynamic-form/src/lib/shared/enums/form/dynamic-form.enum.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/standalone-import.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/common.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/file.const.ts","../../../projects/dynamic-form/src/lib/shared/enums/validators/validators.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/controls/control.enum.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/base-date-field.model.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/output-value-type.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/file-size-type.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/field-dependency.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/view-mode.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/input-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/date-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/select-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/upload-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/field.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/input-field.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/select-field.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/date-field.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/date/date.utils.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/date-picker-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/date-range-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/select-base-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/multi-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/single-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/textarea/textarea-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/base-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/avatar-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/multi-file-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/multi-image-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/single-file-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/sample-test.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/field-dependency.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/file/file.utils.ts","../../../projects/dynamic-form/src/lib/shared/utils/common/common.utils.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/custom-validators.ts","../../../projects/dynamic-form/src/lib/shared/consts/validators/pattern.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/pattern.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/default-error-message.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-text-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-password-field.model.ts","../../../projects/dynamic-form/src/lib/shared/utils/dynamic-form/dynamic-form.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/field-group.model.ts","../../../projects/dynamic-form/src/lib/shared/utils/fields/fields.ts","../../../projects/dynamic-form/src/lib/shared/config/dynamic-form.config.ts","../../../projects/dynamic-form/src/lib/shared/services/form-utils.ts","../../../projects/dynamic-form/src/lib/shared/services/form-config.service.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/tree-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/services/dynamic-form.service.ts","../../../projects/dynamic-form/src/lib/shared/services/field.service.ts","../../../projects/dynamic-form/src/lib/shared/services/form-data.service.ts","../../../projects/dynamic-form/src/lib/shared/base/base-value-accessor.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-picker/date-picker.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-picker/date-picker.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-range/date-range.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-range/date-range.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-password/input-password.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-password/input-password.component.html","../../../projects/dynamic-form/src/lib/shared/services/suffix.service.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/components/suffix/suffix.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/components/suffix/suffix.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-text/input-text.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-text/input-text.component.html","../../../projects/dynamic-form/src/lib/shared/models/fields/radio/radio-base-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-type-radio-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-value.model.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/radio/custom/reminder-type-radio/reminder-type-radio.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/radio/custom/reminder-type-radio/reminder-type-radio.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/select/multi-select/multi-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/multi-select/multi-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/select/single-select/single-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/single-select/single-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/select/tree-select/tree-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/tree-select/tree-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/textarea/textarea.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/textarea/textarea.component.html","../../../projects/dynamic-form/src/lib/shared/services/file.service.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/component.ts","../../../projects/dynamic-form/src/lib/shared/services/validation.service.ts","../../../projects/dynamic-form/src/lib/shared/components/dynamic-field/dynamic-field.component.ts","../../../projects/dynamic-form/src/lib/shared/components/dynamic-field/dynamic-field.component.html","../../../projects/dynamic-form/src/lib/dynamic-form.component.ts","../../../projects/dynamic-form/src/lib/dynamic-form.component.html","../../../projects/dynamic-form/src/public-api.ts","../../../projects/dynamic-form/src/ldquocc-dynamic-form.ts"],"sourcesContent":["export enum FormModeEnum {\r\n Add = 'add',\r\n Edit = 'edit',\r\n View = 'view',\r\n Design = 'design',\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n// NG-ZORRO\r\nimport { NzAlertModule } from 'ng-zorro-antd/alert';\r\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\r\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\r\nimport { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzInputNumberModule } from 'ng-zorro-antd/input-number';\r\nimport { NzListModule } from 'ng-zorro-antd/list';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\r\nimport { NzPopoverModule } from 'ng-zorro-antd/popover';\r\nimport { NzProgressModule } from 'ng-zorro-antd/progress';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzTabsModule } from 'ng-zorro-antd/tabs';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzTimePickerModule } from 'ng-zorro-antd/time-picker';\r\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\r\nimport { NzCollapseModule } from 'ng-zorro-antd/collapse';\r\nimport { NzUploadModule } from 'ng-zorro-antd/upload';\r\nimport { NzImageModule } from 'ng-zorro-antd/image';\r\nimport { NzCascaderModule } from 'ng-zorro-antd/cascader';\r\n\r\n// Core Angular modules (cần thiết ở hầu hết các component).\r\nexport const CORE_MODULES = [CommonModule];\r\n\r\n// Form handling (thường dùng với Reactive)\r\nexport const FORM_MODULES = [FormsModule, ReactiveFormsModule];\r\n\r\n// Routing (thường dùng khi component dùng `<router-outlet>` hoặc cần navigate)\r\nexport const ROUTING_MODULES = [RouterModule];\r\n\r\n// 🧩 All common shared modules (nếu bạn muốn gộp nhanh)\r\nexport const SHARED_MODULES = [...CORE_MODULES, ...FORM_MODULES, ...ROUTING_MODULES];\r\n","export const NO_INFO_TEXT = 'Không có thông tin';\r\n","export const IMAGE_TYPES = {\r\n apng: 'image/apng',\r\n avif: 'image/avif',\r\n bmp: 'image/bmp',\r\n gif: 'image/gif',\r\n jpeg: 'image/jpeg',\r\n jpg: 'image/jpeg',\r\n png: 'image/png',\r\n svg: 'image/svg+xml',\r\n tif: 'image/tiff',\r\n tiff: 'image/tiff',\r\n webp: 'image/webp',\r\n};\r\n\r\nexport const AUDIO_TYPES = {\r\n aac: 'audio/aac',\r\n mp3: 'audio/mpeg',\r\n oga: 'audio/ogg',\r\n opus: 'audio/ogg',\r\n wav: 'audio/wav',\r\n weba: 'audio/webm',\r\n};\r\n\r\nexport const VIDEO_TYPES = {\r\n avi: 'video/avi',\r\n mp4: 'video/mp4',\r\n mpeg: 'video/mpeg',\r\n ogv: 'video/ogg',\r\n ts: 'video/mp2t',\r\n webm: 'video/webm',\r\n};\r\n\r\nexport const videoTypesPath = ['mp4', 'avi'];\r\n\r\nexport const TEXT_TYPES = {\r\n css: 'text/css',\r\n csv: 'text/csv',\r\n html: 'text/html',\r\n ics: 'text/calendar',\r\n js: 'text/javascript ',\r\n mjs: 'text/javascript ',\r\n txt: 'text/plain',\r\n};\r\n\r\nexport const APPLICATION_TYPES = {\r\n abw: 'application/x-abiword',\r\n arc: 'application/x-freearc',\r\n azw: 'application/vnd.amazon.ebook',\r\n bin: 'application/octet-stream',\r\n bz: 'application/x-bzip',\r\n bz2: 'application/x-bzip2',\r\n cda: 'application/x-cdf',\r\n csh: 'application/x-csh',\r\n doc: 'application/msword',\r\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n eot: 'application/vnd.ms-fontobject',\r\n epub: 'application/epub+zip',\r\n jar: 'application/java-archive',\r\n json: 'application/json',\r\n jsonld: 'application/ld+json',\r\n mpkg: 'application/vnd.apple.installer+xml',\r\n ods: 'application/vnd.oasis.opendocument.spreadsheet',\r\n odt: 'application/vnd.oasis.opendocument.text',\r\n ogx: 'application/ogg',\r\n pdf: 'application/pdf',\r\n php: 'application/x-httpd-php',\r\n ppt: 'application/vnd.ms-powerpoint',\r\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n rar: 'application/vnd.rar',\r\n rarX: 'application/x-rar',\r\n rtf: 'application/rtf',\r\n sh: 'application/x-sh',\r\n tar: 'application/x-tar',\r\n vsd: 'application/vnd.visio',\r\n xhtml: 'application/xhtml+xml',\r\n xls: 'application/vnd.ms-excel',\r\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n zip: 'application/x-zip-compressed',\r\n zipN: 'application/zip',\r\n sevenZ: 'application/x-7z-compressed',\r\n csv: 'text/csv',\r\n};\r\n\r\nexport const MIME_TYPES_TO_EXTENSION = Object.entries(APPLICATION_TYPES).reduce(\r\n (acc, [key, value]) => {\r\n acc[value] = key;\r\n return acc;\r\n },\r\n {} as Record<string, string>,\r\n);\r\n\r\nexport const ALL_MIME_TYPES = {\r\n ...IMAGE_TYPES,\r\n ...AUDIO_TYPES,\r\n ...VIDEO_TYPES,\r\n ...TEXT_TYPES,\r\n ...APPLICATION_TYPES,\r\n};\r\n\r\nexport const ALL_MIME_TYPES_VALUE = Object.values({\r\n ...IMAGE_TYPES,\r\n ...AUDIO_TYPES,\r\n ...VIDEO_TYPES,\r\n ...TEXT_TYPES,\r\n ...APPLICATION_TYPES,\r\n});\r\n\r\nexport const DEFAULT_ACCEPTED_MIME_TYPES = [\r\n IMAGE_TYPES.jpg,\r\n IMAGE_TYPES.jpeg,\r\n IMAGE_TYPES.png,\r\n IMAGE_TYPES.svg,\r\n APPLICATION_TYPES.doc,\r\n APPLICATION_TYPES.docx,\r\n APPLICATION_TYPES.pdf,\r\n APPLICATION_TYPES.xls,\r\n APPLICATION_TYPES.xlsx,\r\n APPLICATION_TYPES.zip,\r\n APPLICATION_TYPES.zipN,\r\n TEXT_TYPES.txt,\r\n VIDEO_TYPES.mp4,\r\n VIDEO_TYPES.avi,\r\n];\r\n\r\nexport const DEFAULT_ACCEPTED_IMAGE_MIME_TYPES = [\r\n IMAGE_TYPES.jpg,\r\n IMAGE_TYPES.jpeg,\r\n IMAGE_TYPES.png,\r\n IMAGE_TYPES.svg,\r\n];\r\n","// Enum cho các validator chung được angular reactive form hỗ trợ.\r\nexport enum CommonValidaterEnum {\r\n Required = 'required',\r\n MinLength = 'minlength',\r\n MaxLength = 'maxlength',\r\n Min = 'min',\r\n Max = 'max',\r\n Pattern = 'pattern',\r\n}\r\n\r\n// Enum cho các validator tùy chỉnh.\r\nexport enum CustomValidaterEnum {\r\n MatchField = 'matchField',\r\n AcceptedMimiTypes = 'acceptedMimeTypes',\r\n MaxSizeInMB = 'maxSizeInMB',\r\n LeadingSpace = 'leadingSpace',\r\n}\r\n","// Dạng control.\r\nexport enum ControlTypeEnum {\r\n Input = 'input',\r\n Textarea = 'textarea',\r\n Select = 'select',\r\n Checkbox = 'checkbox',\r\n Radio = 'radio',\r\n Date = 'date',\r\n Upload = 'upload',\r\n Switch = 'switch',\r\n Autocomplete = 'autocomplete',\r\n}\r\n","import { FormControl } from '@angular/forms';\r\nimport { BaseField } from '../field.model';\r\nimport { DATE_FIELD_TYPES } from '../../../consts/fields';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nexport type DateFieldType = (typeof DATE_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Date.\r\n */\r\nexport abstract class BaseDateField<K> extends BaseField<K> {\r\n // Dạng date hiển thị.\r\n format: string;\r\n\r\n // Cho phép chọn ngày quá khứ?\r\n allowPastDates?: boolean;\r\n\r\n // Cho phép chọn ngày tương lai?\r\n allowFutureDates?: boolean;\r\n\r\n /**\r\n * Props validation chung cho các dạng Date.\r\n */\r\n\r\n constructor(init: Partial<BaseDateField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date.\r\n */\r\n this.controlType = ControlTypeEnum.Date;\r\n\r\n this.allowPastDates = true;\r\n this.allowFutureDates = true;\r\n this.format = 'dd-MM-yyyy';\r\n\r\n // this.value = undefined;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonValidators();\r\n const customValidators = this.getCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n}\r\n","export enum SelectOutputValueTypeEnum {\r\n Single = 'single', // Giá trị đơn theo bindValue.\r\n Object = 'object', // Giá trị object chỉ kèm theo 1 prop theo bindValue.\r\n SourceObject = 'sourceObject', // Giá trị object bao gồm cả instance từ list option.\r\n}\r\n\r\nexport enum DatePickerOutputValueTypeEnum {\r\n String = 'string',\r\n Date = 'date',\r\n}\r\n\r\nexport enum DateRangeOutputValueTypeEnum {\r\n String = 'string',\r\n StringArray = 'string-array',\r\n DateArray = 'date-array',\r\n}\r\n\r\nexport enum UploadOutputValueTypeEnum {\r\n File = 'file',\r\n ObjectStorage = 'object-storage',\r\n Object = 'object',\r\n}\r\n","export enum FileSizeTypeEnum {\r\n MB = 'MB',\r\n KB = 'KB',\r\n GB = 'GB',\r\n TB = 'TB',\r\n}\r\n","export enum CombineDependTypeEnum {\r\n Valid = 'valid',\r\n Skip = 'skip',\r\n Null = 'null',\r\n}\r\n\r\nexport enum DependTypeEnum {\r\n All = 'any',\r\n Any = 'all',\r\n}\r\n","export enum ViewModeEnum {\r\n form = 'form',\r\n text = 'text',\r\n}\r\n","// Dạng field cụ thể.\r\nexport enum FieldTypeEnum {\r\n InputText = 'input-text',\r\n InputPassword = 'input-password',\r\n Textarea = 'textarea',\r\n DatePicker = 'date-picker',\r\n DateRange = 'date-range',\r\n SingleSelect = 'single-select',\r\n TreeSelect = 'tree-select',\r\n MultiSelect = 'multi-select',\r\n SingleFileUpload = 'single-file-upload',\r\n MultiFileUpload = 'multi-file-upload',\r\n MultiImageUpload = 'multi-image-upload',\r\n AvatarUpload = 'avatar-upload',\r\n Checkbox = 'checkbox',\r\n Radio = 'radio',\r\n ReminderTypeRadio = 'reminder-type-radio',\r\n Switch = 'switch',\r\n Autocomplete = 'autocomplete',\r\n}\r\n","export enum InputFieldTypeEnum {\r\n Text = 'text',\r\n Email = 'email',\r\n Password = 'password',\r\n Number = 'number',\r\n}\r\n","export enum DateFieldTypeEnum {\r\n Picker = 'picker',\r\n Range = 'range',\r\n}\r\n","export enum SelectFieldTypeEnum {\r\n Single = 'single',\r\n Multi = 'multi',\r\n}\r\n","export enum UploadFieldTypeEnum {\r\n SingleFile = 'single-file',\r\n MultiFile = 'multi-file',\r\n Avatar = 'avatar',\r\n}\r\n","/**\r\n * FIELD_TYPES là readonly ['input', 'select', 'checkbox',...]\r\n */\r\nexport const FIELD_TYPES = [\r\n 'input-text',\r\n 'input-password',\r\n 'textarea',\r\n 'date-picker',\r\n 'date-range',\r\n 'single-select',\r\n 'tree-select',\r\n 'multi-select',\r\n 'single-file-upload',\r\n 'multi-file-upload',\r\n 'multi-image-upload',\r\n 'avatar-upload',\r\n 'checkbox',\r\n 'radio',\r\n 'reminder-type-radio',\r\n 'switch',\r\n 'autocomplete',\r\n] as const;\r\n","/**\r\n * FIELD_TYPES là readonly ['input', 'select', 'checkbox',...]\r\n */\r\nexport const INPUT_FIELD_TYPES = ['text', 'email', 'password', 'number'] as const;\r\n","/**\r\n * FIELD_TYPES là readonly ['single', 'multi', 'tree',...]\r\n */\r\nexport const SELECT_FIELD_TYPES = ['single', 'multi', 'tree'] as const;\r\n\r\nexport const DEFAULT_BIND_LABEL = 'name';\r\nexport const DEFAULT_BIND_VALUE = 'code';\r\n","// Loại date field.\r\nexport const DATE_FIELD_TYPES = ['picker', 'range'] as const;\r\n\r\n// Các pattern dùng để check định dạng date.\r\nexport const FORMAT_DATE_PATTERNS = {\r\n YYYY_MM_DD: /^(\\d{4})([-\\/])(0[1-9]|1[0-2])\\2(0[1-9]|[12]\\d|3[01])$/,\r\n DD_MM_YYYY: /^(0[1-9]|[12]\\d|3[01])([-\\/])(0[1-9]|1[0-2])\\2(\\d{4})$/,\r\n MM_DD_YYYY: /^(0[1-9]|1[0-2])([-\\/])(0[1-9]|[12]\\d|3[01])\\2(\\d{4})$/,\r\n\r\n MM_DD_YYYY_HMS:\r\n /^(0[1-9]|1[0-2])([-\\/])(0[1-9]|[12]\\d|3[01])\\2(\\d{4})\\s([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)$/,\r\n};\r\n","import { FORMAT_DATE_PATTERNS } from '../../consts/fields';\r\n\r\n// Chuyển đổi đối tượng Date thành string có format DDMMYYYY.\r\nexport const formatDateToDDMMYYYY = (date: Date, separator: '-' | '/' = '-'): string => {\r\n const dd = String(date.getDate()).padStart(2, '0');\r\n const mm = String(date.getMonth() + 1).padStart(2, '0');\r\n const yyyy = date.getFullYear();\r\n\r\n return `${dd}${separator}${mm}${separator}${yyyy}`;\r\n};\r\n\r\n// Chuyển đổi đối tượng Date thành string có format DDMMYYYY.\r\nexport const formatDateToYYYYMMDD = (date: Date, separator: '-' | '/' = '-'): string => {\r\n const dd = String(date.getDate()).padStart(2, '0');\r\n const mm = String(date.getMonth() + 1).padStart(2, '0');\r\n const yyyy = date.getFullYear();\r\n\r\n return `${yyyy}${separator}${mm}${separator}${dd}`;\r\n};\r\n\r\n// Chuyển đổi string ở các dạng: YYYY-MM-DD, DD-MM-YYYY, MM-DD-YYYY đến Date, nếu sẵn là Date thì mặc định không đổi.\r\nexport const normalizeToDate = (input: string | Date | undefined): Date | null => {\r\n if (!input) return null;\r\n\r\n if (input instanceof Date && !isNaN(input.getTime())) return input;\r\n if (typeof input !== 'string') return null;\r\n\r\n const inputTrimed = input.trim();\r\n\r\n let match: RegExpMatchArray | null;\r\n let year: number, month: number, day: number;\r\n let hour = 0,\r\n minute = 0,\r\n second = 0;\r\n\r\n if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.YYYY_MM_DD))) {\r\n year = +match[1];\r\n month = +match[3] - 1;\r\n day = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.DD_MM_YYYY))) {\r\n day = +match[1];\r\n month = +match[3] - 1;\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY_HMS))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n hour = +match[5];\r\n minute = +match[6];\r\n second = +match[7];\r\n } else {\r\n console.warn('Sai định dạng chuỗi date');\r\n return null;\r\n }\r\n\r\n const date = new Date(year, month, day, hour, minute, second);\r\n\r\n if (\r\n date.getFullYear() === year &&\r\n date.getMonth() === month &&\r\n date.getDate() === day &&\r\n date.getHours() === hour &&\r\n date.getMinutes() === minute &&\r\n date.getSeconds() === second\r\n ) {\r\n return date;\r\n }\r\n\r\n console.warn('Ngày hoặc giờ không hợp lệ');\r\n return null;\r\n};\r\n\r\nexport const normalizeToDate1 = (input: string | Date | undefined): Date | null => {\r\n if (input) {\r\n if (input instanceof Date && !isNaN(input.getTime())) return input;\r\n if (typeof input !== 'string') return null;\r\n const inputTrimed = String(input).trim();\r\n let match: RegExpMatchArray | null;\r\n let year: number, month: number, day: number;\r\n if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.YYYY_MM_DD))) {\r\n year = +match[1];\r\n month = +match[3] - 1;\r\n day = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.DD_MM_YYYY))) {\r\n day = +match[1];\r\n month = +match[3] - 1;\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n } else {\r\n console.warn('Sai định dạng chuỗi date');\r\n return null;\r\n }\r\n const date = new Date(year, month, day); // Validate: kiểm tra lại giá trị date (28/29/30/31 hợp lệ)\r\n if (date.getFullYear() === year && date.getMonth() === month && date.getDate() === day) {\r\n return date;\r\n } else {\r\n console.warn('Ngày đưa vào không hợp lệ');\r\n return null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n// Tạo danh sách năm chạy ngược từ hiện tại đến năm chỉ định.\r\nexport const generateYearsDesc = (from: number): number[] => {\r\n const currentYear = new Date().getFullYear();\r\n const years: number[] = [];\r\n for (let year = currentYear; year >= from; year--) {\r\n years.push(year);\r\n }\r\n return years;\r\n};\r\n\r\n// Tạo danh sách năm chạy từ năm chỉ định đến năm hiện tại.\r\nexport const generateYearsAsc = (from: number): number[] => {\r\n const currentYear = new Date().getFullYear();\r\n const years: number[] = [];\r\n for (let year = from; year <= currentYear; year++) {\r\n years.push(year);\r\n }\r\n return years;\r\n};\r\n","import { DatePickerOutputValueTypeEnum } from '../../../enums/common';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { normalizeToDate } from '../../../utils/date';\r\nimport { DatePickerOutputValueType } from '../../common';\r\nimport { BaseDateField } from './base-date-field.model';\r\n\r\nconst DEFAULT_DATE_PICKER_VALUE = '';\r\n\r\n/**\r\n * Interface của Date type là Picker.\r\n */\r\nexport class DatePickerField extends BaseDateField<string | Date | null> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: DatePickerOutputValueType;\r\n\r\n // Custom function to disable dates\r\n disabledDateFn?: (current: Date) => boolean;\r\n\r\n constructor(init: Partial<DatePickerField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date picker.\r\n */\r\n this.type = FieldTypeEnum.DatePicker;\r\n this.value = DEFAULT_DATE_PICKER_VALUE;\r\n this.initialValue = DEFAULT_DATE_PICKER_VALUE;\r\n this.outputAs = DatePickerOutputValueTypeEnum.String;\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Date {\r\n return DEFAULT_DATE_PICKER_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): Date | null {\r\n const value = modelValue as string | Date;\r\n\r\n if (!value) return null;\r\n\r\n return normalizeToDate(value);\r\n }\r\n}\r\n","import { DateRangeOutputValueTypeEnum } from '../../../enums/common';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { normalizeToDate } from '../../../utils/date';\r\nimport { DateRangeOutputValueType } from '../../common';\r\nimport { BaseDateField } from './base-date-field.model';\r\n\r\nconst DEFAULT_DATE_RANGE_VALUE: string[] | Date[] = [];\r\n\r\n/**\r\n * Interface của Date type là Range.\r\n */\r\nexport class DateRangeField extends BaseDateField<string | string[] | Date[]> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: DateRangeOutputValueType;\r\n\r\n constructor(init: Partial<DateRangeField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date range.\r\n */\r\n this.type = FieldTypeEnum.DateRange;\r\n this.value = DEFAULT_DATE_RANGE_VALUE;\r\n this.initialValue = DEFAULT_DATE_RANGE_VALUE;\r\n this.outputAs = DateRangeOutputValueTypeEnum.StringArray;\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string[] | Date[] {\r\n return DEFAULT_DATE_RANGE_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string[] | Date[] {\r\n let value = modelValue as string | string[] | Date[];\r\n\r\n if (typeof value === 'string') {\r\n value = value.split(',').map(dateStr => dateStr.trim());\r\n }\r\n\r\n let dateRange: Date[] = [];\r\n\r\n if (value?.length === 2) {\r\n const startDate = normalizeToDate(value[0]);\r\n const endDate = normalizeToDate(value[1]);\r\n if (startDate && endDate) dateRange = [startDate, endDate];\r\n }\r\n return dateRange;\r\n }\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport {\r\n DEFAULT_BIND_LABEL,\r\n DEFAULT_BIND_VALUE,\r\n SELECT_FIELD_TYPES,\r\n} from '../../../consts/fields/select-field.const';\r\nimport { BaseField } from '../field.model';\r\nimport { ApiConfig, FieldDependency, FieldDependencyType } from '../../common';\r\nimport { SelectOutputValueType } from '../../common/output-value-type.model';\r\nimport { DependTypeEnum, SelectOutputValueTypeEnum } from '../../../enums/common';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\nimport { Suffix } from '../../common/common.model';\r\n\r\nexport type SelectFieldType = (typeof SELECT_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Input Field.\r\n */\r\nexport abstract class SelectBaseField<K> extends BaseField<K> {\r\n // Key lấy ra nhãn hiển thị ở options.\r\n bindLabel!: string;\r\n\r\n // Key lấy ra giá trị ngầm ở options.\r\n bindValue!: string;\r\n\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: SelectOutputValueType;\r\n\r\n matchSelectWidth: boolean;\r\n\r\n // Mảng options cho việc lựa chọn được truyền tĩnh từ config.\r\n options: Record<string, unknown>[];\r\n\r\n // Luôn chèn vào vị trí 0\r\n optionsToPrepend: Record<string, unknown>[];\r\n\r\n // Luôn chèn vào vị trí cuối\r\n optionsToAppend: Record<string, unknown>[];\r\n\r\n exceptOptions: Record<string, unknown>[];\r\n\r\n // Phụ thuộc vào một giá trị từ bất kỳ dạng field nào khác: Select, Input,...\r\n dependsOn: FieldDependency[];\r\n\r\n // Cấu hình api nếu danh sách select dựa vào việc gọi api GET. Ưu tiên hơn options tĩnh truyền vào từ config.\r\n apiConfig?: ApiConfig;\r\n\r\n /**\r\n * dependType:\r\n * - 'all' → cần tất cả field cha có giá trị mới gọi API\r\n * - 'any' → chỉ cần 1 field cha có giá trị cũng gọi API theo từng cha\r\n */\r\n\r\n dependType: FieldDependencyType;\r\n\r\n // Biến đổi hiển thị option label từ option của options.\r\n transformLabel?: (option: Record<string, unknown>) => string;\r\n\r\n // Các nút nằm ở hậu tố (bên phải control).\r\n suffixes: Suffix[];\r\n\r\n /**\r\n * Props validation chung cho các dạng Select.\r\n */\r\n // ................. Chưa có .................\r\n\r\n constructor(init: Partial<SelectBaseField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Select.\r\n */\r\n this.controlType = ControlTypeEnum.Select;\r\n this.bindLabel = DEFAULT_BIND_LABEL;\r\n this.bindValue = DEFAULT_BIND_VALUE;\r\n this.matchSelectWidth = true;\r\n this.outputAs = SelectOutputValueTypeEnum.Object;\r\n this.dependsOn = [];\r\n this.dependType = DependTypeEnum.All;\r\n this.suffixes = [];\r\n this.optionsToPrepend = [];\r\n this.optionsToAppend = [];\r\n this.options = [];\r\n this.exceptOptions = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Select.\r\n protected getCommonSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Select.\r\n protected getCustomSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonSelectValidators();\r\n const customValidators = this.getCustomSelectValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_MULTI_SELECT_VALUE: string[] = [];\r\n\r\n/**\r\n * Interface của Select Field type là dạng Multi.\r\n */\r\nexport class MultiSelectField extends SelectBaseField<string[] | Record<string, unknown>[]> {\r\n // Số lựa chọn (option) sẽ được hiển thị khi người dùng chọn nhiều.\r\n maxTagCount?: number;\r\n maxMultipleCount?: number;\r\n\r\n constructor(init: Partial<MultiSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi Select.\r\n */\r\n this.type = FieldTypeEnum.MultiSelect;\r\n this.value = DEFAULT_MULTI_SELECT_VALUE;\r\n this.initialValue = DEFAULT_MULTI_SELECT_VALUE;\r\n this.maxTagCount = 53;\r\n this.maxMultipleCount = Infinity;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string[] | Record<string, unknown>[] {\r\n return DEFAULT_MULTI_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string[] | Record<string, unknown>[] {\r\n const value = modelValue as string[] | Record<string, unknown>[];\r\n\r\n const optionsValue = value!.map((val: string | number | Record<string, unknown>) => {\r\n if (typeof val === 'object') {\r\n let transformVal = (val?.[this.bindValue] as string) ?? '';\r\n return transformVal;\r\n }\r\n return val as string;\r\n });\r\n\r\n return optionsValue;\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_SINGLE_SELECT_VALUE = null;\r\n\r\n/**\r\n * Interface của Select Field type là dạng Single.\r\n */\r\nexport class SingleSelectField extends SelectBaseField<string | Record<string, unknown> | null> {\r\n constructor(init: Partial<SingleSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single Select.\r\n */\r\n this.type = FieldTypeEnum.SingleSelect;\r\n this.value = DEFAULT_SINGLE_SELECT_VALUE;\r\n this.initialValue = DEFAULT_SINGLE_SELECT_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> | null {\r\n return DEFAULT_SINGLE_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> | null {\r\n if (!modelValue) return null;\r\n const value = modelValue as string | Record<string, unknown>;\r\n\r\n if (typeof value === 'object') {\r\n const valueFromObj = value?.[this.bindValue];\r\n const typeOfValueFromObj = typeof valueFromObj;\r\n if (typeOfValueFromObj !== 'object') return String(valueFromObj);\r\n else {\r\n console.warn('Từ bindValue nhưng đối tượng vẫn là dạng object');\r\n return '';\r\n }\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { FormControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { BaseField } from '../field.model';\r\nimport {\r\n getDefaultMaxLengthErrorMessage,\r\n getDefaultMinLengthErrorMessage,\r\n getDefaultPatternErrorMessage,\r\n getLeadingSpaceErrorMessage,\r\n noLeadingSpaceValidator,\r\n resolvePattern,\r\n} from '../../../utils/validators';\r\nimport { CommonValidaterEnum, CustomValidaterEnum } from '../../../enums/validators';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nconst DEFAULT_TEXTAREA_VALUE = '';\r\n\r\n/**\r\n * Interface cho Các dạng Textarea.\r\n */\r\nexport class TextareaField extends BaseField<string> {\r\n /**\r\n * Props validation chung cho dạng Textarea.\r\n */\r\n // Độ dài tối thiểu của chuỗi nhập vào.\r\n minLength?: number;\r\n // Độ dài tối đa của chuỗi nhập vào.\r\n maxLength?: number;\r\n // Theo mẫu regex hoặc đối tượng RegExr\r\n pattern?: string | RegExp;\r\n\r\n constructor(init: Partial<TextareaField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input.\r\n */\r\n this.controlType = ControlTypeEnum.Textarea;\r\n this.type = FieldTypeEnum.Textarea;\r\n this.value = DEFAULT_TEXTAREA_VALUE;\r\n this.initialValue = DEFAULT_TEXTAREA_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input.\r\n protected getCommonTextareaValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n\r\n if (this.minLength) validators.push(Validators.minLength(this.minLength));\r\n if (this.maxLength) validators.push(Validators.maxLength(this.maxLength));\r\n if (this.pattern) {\r\n const resolvePatternResult = resolvePattern(this.pattern);\r\n if (resolvePatternResult?.type !== 'unknown')\r\n validators.push(Validators.pattern(resolvePatternResult.value));\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Input.\r\n protected getCustomTextareaValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n validators.push(noLeadingSpaceValidator());\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonTextareaValidators();\r\n const customValidators = this.getCustomTextareaValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n // Giá trị mặc định.\r\n override getDefaultValue(): string {\r\n return DEFAULT_TEXTAREA_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n if (errorKey === CommonValidaterEnum.Pattern) {\r\n if (this.pattern) return getDefaultPatternErrorMessage(this.label, this.pattern);\r\n }\r\n if (errorKey === CommonValidaterEnum.MinLength)\r\n return getDefaultMinLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CommonValidaterEnum.MaxLength)\r\n return getDefaultMaxLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CustomValidaterEnum.LeadingSpace)\r\n return getLeadingSpaceErrorMessage(this.label);\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { BaseField } from '../field.model';\r\nimport { UPLOAD_FIELD_TYPES } from '../../../consts/fields/upload-field.const';\r\nimport { ApiConfig, ApiFileConfig, UploadOutputValueType } from '../../common';\r\nimport {\r\n acceptedMimeTypesValidator,\r\n getDefaultAcptMimeTypesErrorMessage,\r\n getDefaultMaxSizeInMBErrorMessage,\r\n maxFileSizeInMBValidator,\r\n} from '../../../utils/validators';\r\nimport { DEFAULT_ACCEPTED_MIME_TYPES } from '../../../consts/common';\r\nimport { CustomValidaterEnum } from '../../../enums/validators';\r\nimport { getExtensions } from '../../../utils/file';\r\nimport { UploadOutputValueTypeEnum } from '../../../enums/common';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nexport type UploadFieldType = (typeof UPLOAD_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Date.\r\n */\r\nexport abstract class BaseUploadField<K> extends BaseField<K> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: UploadOutputValueType;\r\n\r\n // Config api file liên quan: upload, delete.\r\n apiFileConfig: ApiFileConfig;\r\n\r\n // Các loại mimetypes được chấp nhận.\r\n acceptedMimeTypes: string[];\r\n\r\n // Kích thước tối đa của tập tin tải lên tính bằng MB.\r\n maxSizeInMB: number;\r\n\r\n // Hiển thị thông tin hướng dẫn các định dạng file được phép upload theo config của acceptedMimeTypes\r\n showAcceptedExtensionGuide: boolean;\r\n\r\n // Mở/tắt cơ chế upload tạm.\r\n uploadTemp: boolean;\r\n\r\n /**\r\n * Props validation chung cho các dạng Date.\r\n */\r\n\r\n constructor(init: Partial<BaseUploadField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date.\r\n */\r\n this.controlType = ControlTypeEnum.Upload;\r\n this.outputAs = UploadOutputValueTypeEnum.Object;\r\n this.apiFileConfig = {\r\n uploadUrl: '',\r\n deleteUrl: '',\r\n };\r\n this.acceptedMimeTypes = DEFAULT_ACCEPTED_MIME_TYPES;\r\n this.maxSizeInMB = 25;\r\n this.showAcceptedExtensionGuide = true;\r\n this.uploadTemp = true;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi angular cho Input Password.\r\n protected getCustomBaseUploadValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n // Kiểm tra xem file tải lên có type nằm trong mảng acceptedMimeTypes đã chỉ định hay không.\r\n if (this.acceptedMimeTypes?.length > 0)\r\n validators.push(acceptedMimeTypesValidator(this.acceptedMimeTypes));\r\n\r\n // Kiểm tra kích thước tối đa mà file tải lên được cho phép.\r\n validators.push(maxFileSizeInMBValidator(this.maxSizeInMB));\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonValidators();\r\n const customValidators = this.getCustomBaseUploadValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n // Lấy error message mặc định của acceptedMimeTypes.\r\n if (errorKey === CustomValidaterEnum.AcceptedMimiTypes) {\r\n const typeString = getExtensions(this.acceptedMimeTypes).join(', ');\r\n return getDefaultAcptMimeTypesErrorMessage(typeString);\r\n }\r\n\r\n // Lấy error message mặc định của maxSizeInMB.\r\n if (errorKey === CustomValidaterEnum.MaxSizeInMB) {\r\n return getDefaultMaxSizeInMBErrorMessage(this.maxSizeInMB);\r\n }\r\n\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { BaseUploadField } from './base-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { DEFAULT_ACCEPTED_IMAGE_MIME_TYPES } from '../../../consts/common';\r\n\r\nconst DEFAULT_AVATAR_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Avatar upload.\r\n */\r\nexport class AvatarUploadField extends BaseUploadField<string | Record<string, unknown>> {\r\n constructor(init: Partial<AvatarUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Avatar upload.\r\n */\r\n\r\n this.type = FieldTypeEnum.AvatarUpload;\r\n this.value = DEFAULT_AVATAR_UPLOAD_VALUE;\r\n this.acceptedMimeTypes = DEFAULT_ACCEPTED_IMAGE_MIME_TYPES;\r\n this.initialValue = DEFAULT_AVATAR_UPLOAD_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> {\r\n return DEFAULT_AVATAR_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { BaseUploadField } from './base-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\n\r\nconst DEFAULT_MULTI_FILE_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Multi file upload.\r\n */\r\nexport class MultiFileUploadField extends BaseUploadField<string | File> {\r\n // Số lượng tập tin tối đa có thể tải lên.\r\n maxFileCount: number;\r\n\r\n constructor(init: Partial<MultiFileUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi file upload.\r\n */\r\n this.type = FieldTypeEnum.MultiFileUpload;\r\n this.value = DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n this.maxFileCount = 6;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | File {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { BaseUploadField } from './base-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\n\r\nconst DEFAULT_MULTI_IMAGE_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Multi image upload.\r\n */\r\nexport class MultiImageUploadField extends BaseUploadField<string | File> {\r\n // Số lượng hình ảnh tối đa có thể tải lên.\r\n maxFileCount: number;\r\n\r\n // Độ dài card bao image.\r\n imageCardWidth: string;\r\n\r\n // Độ cao card bao image.\r\n imageCardHeight: string;\r\n\r\n constructor(init: Partial<MultiImageUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi image upload.\r\n */\r\n this.type = FieldTypeEnum.MultiImageUpload;\r\n this.value = DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n this.maxFileCount = 6;\r\n this.imageCardWidth = '108px';\r\n this.imageCardHeight = '108px';\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: string | File): string {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { Suffix } from '../../common/common.model';\r\nimport { BaseUploadField } from './base-upload-field.model';\r\n\r\nconst DEFAULT_SINGLE_FILE_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Single file upload. Đầu vào có thể là chuỗi JSON hoặc đối tượng File.\r\n */\r\nexport class SingleFileUploadField extends BaseUploadField<string | File> {\r\n suffixes: Suffix[];\r\n constructor(init: Partial<SingleFileUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single file upload.\r\n */\r\n\r\n this.type = FieldTypeEnum.SingleFileUpload;\r\n this.value = DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n this.suffixes = [];\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { CommonValidaterEnum, CustomValidaterEnum } from '../../enums/validators';\r\nimport { Suffix } from '../../models/common/common.model';\r\nimport { Extra, ObjField } from '../../models/common/obj-field.model';\r\nimport { DatePickerField, DateRangeField } from '../../models/fields/date';\r\nimport { BaseField } from '../../models/fields/field.model';\r\nimport { InputPasswordField, InputTextField } from '../../models/fields/input';\r\nimport { MultiSelectField } from '../../models/fields/select/multi-select-field.model';\r\nimport { SingleSelectField } from '../../models/fields/select/single-select-field.model';\r\nimport { TextareaField } from '../../models/fields/textarea/textarea-field.model';\r\nimport { AvatarUploadField } from '../../models/fields/upload/avatar-upload-field.model';\r\nimport { MultiFileUploadField } from '../../models/fields/upload/multi-file-upload-field.model';\r\nimport { MultiImageUploadField } from '../../models/fields/upload/multi-image-upload-field.model';\r\nimport { SingleFileUploadField } from '../../models/fields/upload/single-file-upload-field.model';\r\nimport { APPLICATION_TYPES, IMAGE_TYPES } from './file.const';\r\nimport { DependTypeEnum } from '../../enums/common';\r\n// Sample extra.\r\n// InputText\r\nconst inputTextExtra: Extra = {\r\n form: {\r\n formTypes: ['add'],\r\n configs: {\r\n add: {\r\n key: 'name',\r\n label: 'Tên nhiệm vụ đề xuất',\r\n type: 'input-text',\r\n controlType: 'input',\r\n placeholder: 'Nhập tên nhiệm vụ đề xuất nào',\r\n required: false,\r\n grid: { xs: 12 },\r\n labelGrid: { xs: 8 },\r\n controlGrid: { xs: 16 },\r\n isHidden: false,\r\n isParent: false,\r\n allowSetValue: ['add'],\r\n } as BaseField<any>,\r\n },\r\n },\r\n};\r\n// Input Password\r\n// SingleSelect Province\r\n// SingleSelect District\r\n// DatePicker\r\n// DateRange\r\n// SingleFileUpload\r\n// MultiFileUpload\r\n\r\n// Sample test ObjFields lấy từ API.\r\nexport const sampleObjFields = [\r\n // Input Text\r\n {\r\n code: 'Name',\r\n name: 'Tên nhiệm vụ',\r\n nameEn: 'Name',\r\n dataType: 'string',\r\n allowShare: 1,\r\n objClassCode: 'SciTaskProposal',\r\n componentUI: 'InputText',\r\n codeOnDb: 'tenNhiemVu',\r\n seqNum: 3,\r\n required: 3,\r\n allowStatistic: 0,\r\n preventEdit: 0,\r\n validateRegex: 'ALPHA_DASH_VN',\r\n extra: JSON.stringify(inputTextExtra),\r\n id: '7902fd41-f7c7-47e3-86f4-29b59a97dae3',\r\n },\r\n // Input Password\r\n // SingleSelect Province\r\n // SingleSelect District\r\n // DatePicker\r\n // DateRange\r\n // SingleFileUpload\r\n // MultiFileUpload\r\n // Field rác test k có cấu hình 1\r\n // Field rác test k có cấu hình 2\r\n // {\r\n // code: 'Code',\r\n // name: 'Mã đề xuất',\r\n // nameEn: 'Code',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'maDeXuat',\r\n // seqNum: 1,\r\n // required: 2,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Basic',\r\n // id: '39d81def-6a34-4594-ab59-978233bea797',\r\n // },\r\n // {\r\n // code: 'Id',\r\n // name: 'Id',\r\n // nameEn: 'Id',\r\n // dataType: 'Guid',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'TextView',\r\n // codeOnDb: 'id',\r\n // seqNum: 1,\r\n // required: 2,\r\n // allowStatistic: 0,\r\n // preventEdit: 1,\r\n // validateRegex: 'UUID',\r\n // viewType: 'Detail',\r\n // id: '0e460f53-76b0-4718-be0a-7e87c4a252a1',\r\n // },\r\n // {\r\n // code: 'ProposalName',\r\n // name: 'Tên đề xuất',\r\n // nameEn: 'ProposalName',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'tenDeXuat',\r\n // seqNum: 2,\r\n // required: 1,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '425739aa-0ab5-4524-8eec-1ccfaaf53ccc',\r\n // },\r\n // {\r\n // code: 'Name',\r\n // name: 'Tên nhiệm vụ',\r\n // nameEn: 'Name',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'tenNhiemVu',\r\n // seqNum: 3,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // validateRegex: 'ALPHA_DASH_VN',\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":1,\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":1,\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":1,\"section\":\"left\",\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}}}}}',\r\n // viewType: 'Basic',\r\n // id: '7902fd41-f7c7-47e3-86f4-29b59a97dae3',\r\n // },\r\n // {\r\n // code: 'Level',\r\n // name: 'Cấp nhiệm vụ đề xuất',\r\n // nameEn: 'Level',\r\n // dataType: 'ObjType',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // apiURL: '{MainApiURL}/CommonCats/ObjType/byTypeGroupCode/{ObjTypeGroupCode}',\r\n // componentUI: 'Combobox(SingleChoice)',\r\n // codeOnDb: 'cap',\r\n // seqNum: 4,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\"],\"adding\":{\"seqNumber\":2,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":2,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":2,\"section\":\"left\",\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}}}}}',\r\n // viewType: 'Detail',\r\n // objTypeGroupCode: 'RECOMMEND_TASK',\r\n // id: '03230f20-2c88-4c05-a990-8290d435ce31',\r\n // },\r\n // {\r\n // code: 'Program',\r\n // name: 'Chương trình mà nhiệm vụ trực thuộc',\r\n // nameEn: 'Program',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'chuongTrinh',\r\n // seqNum: 5,\r\n // required: 1,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // validateRegex: 'ALPHA_DASH_VN',\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\"],\"adding\":{\"seqNumber\":2,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":2,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":2,\"section\":\"left\",\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}}}}}',\r\n // viewType: 'Detail',\r\n // id: 'c03a9d28-ca43-44ca-a59c-fc54494f3c73',\r\n // },\r\n // {\r\n // code: 'ResearchField',\r\n // name: 'Lĩnh vực',\r\n // nameEn: 'ResearchField',\r\n // dataType: 'ObjType',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // apiURL: '{MainApiURL}/CommonCats/ObjType/byTypeGroupCode/{ObjTypeGroupCode}',\r\n // componentUI: 'Combobox(SingleChoice)',\r\n // codeOnDb: 'linhVucNghienCuu',\r\n // seqNum: 6,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\",\"filter\"],\"adding\":{\"seqNumber\":2,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":2,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":2,\"section\":\"left\",\"isShowBgInput\":true,\"inputBgColor\":\"#2E7D32\",\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}}},\"filtering\":{\"codeField\":\"researchFieldCode\",\"seqNumber\":3,\"required\":false,\"dataTypeCombobox\":\"single\"}}}',\r\n // viewType: 'Detail',\r\n // objTypeGroupCode: 'RESEARCH_FIELD',\r\n // id: 'b5248535-fb73-486e-a980-24e8ada1993b',\r\n // },\r\n // {\r\n // code: 'Type',\r\n // name: 'Loại hình nhiệm vụ',\r\n // nameEn: 'Type',\r\n // dataType: 'ObjType',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // apiURL: '{MainApiURL}/CommonCats/ObjType/byTypeGroupCode/{ObjTypeGroupCode}',\r\n // componentUI: 'Combobox(SingleChoice)',\r\n // codeOnDb: 'loaiHinhNhiemVu',\r\n // seqNum: 7,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\",\"filter\"],\"adding\":{\"seqNumber\":3,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":3,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":3,\"section\":\"left\",\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}}},\"filtering\":{\"codeField\":\"typeCode\",\"seqNumber\":1,\"required\":false,\"dataTypeCombobox\": \"single\"}}}',\r\n // viewType: 'Detail',\r\n // objTypeGroupCode: 'TYPE_TASK',\r\n // id: 'f6793a1e-f451-4050-b751-aa3a5f86d862',\r\n // },\r\n // {\r\n // code: 'PlanningProposalYear',\r\n // name: 'Năm kế hoạch đề xuất',\r\n // nameEn: 'PlanningProposalYear',\r\n // dataType: 'int',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'namKeHoachDeXuat',\r\n // seqNum: 8,\r\n // required: 1,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '90f48f9f-5d3d-43d0-bbac-1dd072a4ffd1',\r\n // },\r\n // {\r\n // code: 'ResearchObjective',\r\n // name: 'Mục tiêu của nhiệm vụ ',\r\n // nameEn: 'ResearchObjective',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'TextArea',\r\n // codeOnDb: 'mucTieu',\r\n // seqNum: 9,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":3,\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":3,\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":1,\"section\":\"bottom\"}}}',\r\n // viewType: 'Detail',\r\n // id: 'ecc54ec4-ee0e-4b97-9c5b-2e06d25d6bf0',\r\n // },\r\n // {\r\n // code: 'ExpectedContent',\r\n // name: 'Dự kiến các nội dung cần thực hiện',\r\n // nameEn: 'ExpectedContent',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'duKienNoiDung',\r\n // seqNum: 10,\r\n // required: 1,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '180c8300-11da-41f4-8685-97d2e8885200',\r\n // },\r\n // {\r\n // code: 'ExpectedResultsAndIndicators',\r\n // name: 'Dự kiến kết quả chính và các chỉ tiêu cần đạt',\r\n // nameEn: 'ExpectedResultsAndIndicators',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'TextArea',\r\n // codeOnDb: 'duKienKetQuaVaChiTieu',\r\n // seqNum: 11,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":5,\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":5,\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":2,\"section\":\"bottom\"}}}',\r\n // viewType: 'Detail',\r\n // id: '617af2b0-d4d8-4e41-b0cb-388c4fbd917a',\r\n // },\r\n // {\r\n // code: 'ExpectedApplicationPlan',\r\n // name: 'Dự kiến phương án ứng dụng hoặc sử dụng kết quả tạo ra',\r\n // nameEn: 'ExpectedApplicationPlan',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'TextArea',\r\n // codeOnDb: 'duKienPhuongAnUngDung',\r\n // seqNum: 12,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":6,\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":6,\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":3,\"section\":\"bottom\"}}}',\r\n // viewType: 'Detail',\r\n // id: 'c89bb6c9-3dcf-4380-94f5-630baadb9b31',\r\n // },\r\n // {\r\n // code: 'EstimatedBudget',\r\n // name: 'Dự kiến kinh phí (đồng)',\r\n // nameEn: 'EstimatedBudget',\r\n // dataType: 'long',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'duKienKinhPhi',\r\n // seqNum: 13,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // validateRegex: 'INTEGER',\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":7,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\",\"isCurrency\":true},\"editting\":{\"seqNumber\":7,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\",\"isCurrency\":true},\"viewing\":{\"seqNumber\":4,\"section\":\"left\",\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}},\"isCurrency\":true}}}',\r\n // viewType: 'Detail',\r\n // id: 'a8072db6-0bd1-4352-8e30-326446989eef',\r\n // },\r\n // {\r\n // code: 'EstimatedDuration',\r\n // name: 'Dự kiến thời gian thực hiện (tháng)',\r\n // nameEn: 'EstimatedDuration',\r\n // dataType: 'int',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'duKienThoiGianThucHien',\r\n // seqNum: 14,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // validateRegex: 'INTEGER',\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":8,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"editting\":{\"seqNumber\":8,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":5,\"section\":\"left\",\"executionTime\":\"month\",\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}}}}}',\r\n // viewType: 'Detail',\r\n // id: 'f69bdf14-c555-4cf5-b793-1eba85a25701',\r\n // },\r\n // {\r\n // code: 'ProposalAttachment',\r\n // name: 'Văn bản đề xuất đính kèm (pdf)',\r\n // nameEn: 'ProposalAttachment',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'File',\r\n // codeOnDb: 'vanBanDeXuat',\r\n // seqNum: 15,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"title\":\"Văn bản đề xuất đính kèm (hỗ trợ tập tin dạng .pdf)\",\"seqNumber\":9,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"editting\":{\"title\":\"Văn bản đề xuất đính kèm (hỗ trợ tập tin dạng .pdf)\",\"seqNumber\":9,\"span\":{\"sm\":24,\"md\":\"12\"},\"viewType\":\"taskInfo\"},\"viewing\":{\"seqNumber\":7,\"section\":\"left\",\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}}}}}',\r\n // viewType: 'Detail',\r\n // id: '75596544-c7b1-40dd-ad24-deee21e8b8d1',\r\n // },\r\n // {\r\n // code: 'ProposalOrganizationName',\r\n // name: 'Tên đơn vị/cá nhân đề xuất',\r\n // nameEn: 'ProposalOrganizationName',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'tenToChucDeXuat',\r\n // seqNum: 16,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // validateRegex: 'ALPHA_DASH_VN',\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":2,\"viewType\":\"taskOrgzIndivInfo\"},\"editting\":{\"seqNumber\":2,\"viewType\":\"taskOrgzIndivInfo\"},\"viewing\":{\"seqNumber\":1,\"section\":\"right\"}}}',\r\n // viewType: 'Detail',\r\n // id: '9ba7ea0a-e1d3-4006-9a10-bba7b54f17e4',\r\n // },\r\n // {\r\n // code: 'ProposerName',\r\n // name: 'Tên cá nhân đề xuất',\r\n // nameEn: 'ProposerName',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'tenCaNhanDeXuat',\r\n // seqNum: 17,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra: '',\r\n // viewType: 'Detail',\r\n // id: 'cb2e752c-ed93-46f1-8cd8-75aeb399952b',\r\n // },\r\n // {\r\n // code: 'PhoneNumber',\r\n // name: 'Số điện thoại',\r\n // nameEn: 'PhoneNumber',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'soDienThoai',\r\n // seqNum: 18,\r\n // required: 1,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // validateRegex: 'PHONE_NUMBER',\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":4,\"viewType\":\"taskOrgzIndivInfo\",\"span\":{\"sm\":24,\"md\":12}},\"editting\":{\"seqNumber\":4,\"viewType\":\"taskOrgzIndivInfo\",\"span\":{\"sm\":24,\"md\":12}},\"viewing\":{\"seqNumber\":3,\"section\":\"right\"}}}',\r\n // viewType: 'Detail',\r\n // id: '06137a76-2793-42db-a0d1-2039e087b2ce',\r\n // },\r\n // {\r\n // code: 'Email',\r\n // name: 'Thư điện tử',\r\n // nameEn: 'Email',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'thuDienTu',\r\n // seqNum: 19,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // validateRegex: 'EMAIL',\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":3,\"viewType\":\"taskOrgzIndivInfo\",\"span\":{\"sm\":24,\"md\":12}},\"editting\":{\"seqNumber\":3,\"viewType\":\"taskOrgzIndivInfo\",\"span\":{\"sm\":24,\"md\":12}},\"viewing\":{\"seqNumber\":2,\"section\":\"right\"}}}',\r\n // viewType: 'Detail',\r\n // id: 'acef6046-1f41-48f2-b53a-c0ecebb42939',\r\n // },\r\n // {\r\n // code: 'Address',\r\n // name: 'Địa chỉ liên hệ',\r\n // nameEn: 'Address',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'TextArea',\r\n // codeOnDb: 'diaChi',\r\n // seqNum: 20,\r\n // required: 1,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"view\"],\"adding\":{\"seqNumber\":4,\"viewType\":\"taskOrgzIndivInfo\"},\"editting\":{\"seqNumber\":4,\"viewType\":\"taskOrgzIndivInfo\"},\"viewing\":{\"type\":\"InputText\",\"seqNumber\":3,\"section\":\"right\"}}}',\r\n // viewType: 'Detail',\r\n // id: 'faef0e51-f288-424e-9e72-50ed155313a5',\r\n // },\r\n // {\r\n // code: 'ProposalSource',\r\n // name: 'Nguồn đề xuất',\r\n // nameEn: 'ProposalSource',\r\n // dataType: 'ObjType',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // apiURL: '{MainApiURL}/CommonCats/ObjType/byTypeGroupCode/{ObjTypeGroupCode}',\r\n // componentUI: 'Radiobox',\r\n // codeOnDb: 'nguonDeXuat',\r\n // seqNum: 21,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"add\",\"edit\",\"filter\"],\"adding\":{\"seqNumber\":1,\"viewType\":\"taskOrgzIndivInfo\"},\"editting\":{\"seqNumber\":1,\"viewType\":\"taskOrgzIndivInfo\"},\"filtering\":{\"codeField\":\"proposalSourceCode\",\"seqNumber\":2,\"type\":\"Dropdown\",\"required\":false,\"dataTypeCombobox\": \"single\"}}}',\r\n // viewType: 'Detail',\r\n // objTypeGroupCode: 'PROPOSAL_SOURCE',\r\n // id: '6dea381c-368f-4423-83fb-957df68b176d',\r\n // },\r\n // {\r\n // code: 'ProposalStatus',\r\n // name: 'Trạng thái',\r\n // nameEn: 'ProposalStatus',\r\n // dataType: 'ObjType',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // apiURL: '{MainApiURL}/CommonCats/ObjType/byTypeGroupCode/{ObjTypeGroupCode}',\r\n // componentUI: 'Combobox(SingleChoice)',\r\n // codeOnDb: 'trangThaiDeXuat',\r\n // seqNum: 22,\r\n // required: 2,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"view\",\"filter\"],\"viewing\":{\"seqNumber\":6,\"section\":\"left\",\"isShowBgInput\":true,\"viewConfig\":{\"labelSpan\":{\"sm\":24,\"md\":10},\"formControlSpan\":{\"sm\":24,\"md\":14}}},\"filtering\":{\"codeField\":\"proposalStatusCode\",\"seqNumber\":4,\"dataTypeCombobox\":\"single\"}}}',\r\n // viewType: 'Detail',\r\n // objTypeGroupCode: 'PROPOSAL_STATUS',\r\n // id: 'b77dcf37-880b-48f9-acfb-09b983df4a0d',\r\n // },\r\n // {\r\n // code: 'ApplicationStartDate',\r\n // name: 'Ngày bắt đầu mở ứng tuyển cho đề xuất ',\r\n // nameEn: 'ApplicationStartDate',\r\n // dataType: 'Date',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'Calendar(Date)',\r\n // codeOnDb: 'ngayBatDauUngTuyen',\r\n // seqNum: 23,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"edit\",\"view\"],\"editting\":{\"title\":\"Thời gian bắt đầu\",\"allowFutureDates\":true,\"seqNumber\":1,\"span\":{\"sm\":24,\"md\":12},\"section\":\"approval\"},\"viewing\":{\"title\":\"Thời gian bắt đầu\",\"seqNumber\":1,\"section\":\"application\"}}}',\r\n // viewType: 'Detail',\r\n // id: '790d2aee-4fb2-456f-8fd0-8cd5e0296a57',\r\n // },\r\n // {\r\n // code: 'ApplicationEndDate',\r\n // name: 'Ngày kết thúc ứng tuyển cho đề xuất ',\r\n // nameEn: 'ApplicationEndDate',\r\n // dataType: 'Date',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'Calendar(Date)',\r\n // codeOnDb: 'ngayKetThucUngTuyen',\r\n // seqNum: 24,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"edit\",\"view\"],\"editting\":{\"title\":\"Thời gian kết thúc\",\"allowFutureDates\":true,\"seqNumber\":1,\"span\":{\"sm\":24,\"md\":12},\"section\":\"approval\"},\"viewing\":{\"title\":\"Thời gian kết thúc\",\"seqNumber\":2,\"section\":\"application\"}}}',\r\n // viewType: 'Detail',\r\n // id: '95822a49-2883-4ddb-a6ff-a3c8fc84f3bf',\r\n // },\r\n // {\r\n // code: 'ApprovalAttachment',\r\n // name: 'Văn bản giao nhiệm vụ - ứng tuyển được duyệt làm ',\r\n // nameEn: 'ApprovalAttachment',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'vanBanGiaoNhiemVu',\r\n // seqNum: 25,\r\n // required: 3,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: 'fa00b65d-ebfb-49f9-8da2-09cd44138b79',\r\n // },\r\n // {\r\n // code: 'ApprovalDuration',\r\n // name: 'thời gian thức hiện duyệt',\r\n // nameEn: 'ApprovalDuration',\r\n // dataType: 'int',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // codeOnDb: 'thoiGianThucHienDuyet',\r\n // seqNum: 26,\r\n // required: 0,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '54477413-ec20-43d8-8f9e-6e73205b86ad',\r\n // },\r\n // {\r\n // code: 'ApprovalTotalBudget',\r\n // name: 'Tổng kinh phí cần thiết được duyệt với văn bản giao nhiệm vụ ',\r\n // nameEn: 'ApprovalTotalBudget',\r\n // dataType: 'long',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // codeOnDb: 'tongKinhPhiCanThietDuyet',\r\n // seqNum: 27,\r\n // required: 0,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: 'f9a6c1a6-780e-4e9c-87ac-41a7dfbf37df',\r\n // },\r\n // {\r\n // code: 'ApprovalGovermentBudget',\r\n // name: 'Kinh phí từ Ngân sách nhà nước được duyệt với văn bản giao nhiệm vụ ',\r\n // nameEn: 'ApprovalGovermentBudget',\r\n // dataType: 'long',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // codeOnDb: 'kinhPhiTuNSNNDuyet',\r\n // seqNum: 28,\r\n // required: 0,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '37690b42-c4f7-40bf-ae4a-c42f10735409',\r\n // },\r\n // {\r\n // code: 'ApprovalNonGovermentBudget',\r\n // name: 'Kinh phí từ các nguồn ngoài ngân sách nhà nước được duyệt với văn bản giao nhiệm vụ ',\r\n // nameEn: 'ApprovalNonGovermentBudget',\r\n // dataType: 'long',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // codeOnDb: 'kinhPhiTuNgoaiNSNNDuyet',\r\n // seqNum: 29,\r\n // required: 0,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: 'f9cf4aa3-6593-4b2d-88ca-1513069ce57f',\r\n // },\r\n // {\r\n // code: 'ApprovalContractStateBudget',\r\n // name: 'Kinh phí Ngân sách nhà nước khoán được duyệt với văn bản giao nhiệm vụ ',\r\n // nameEn: 'ApprovalContractStateBudget',\r\n // dataType: 'long',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // codeOnDb: 'kinhPhiNSNNKhoanDuyet',\r\n // seqNum: 30,\r\n // required: 0,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '9c0aeb4b-b6db-460e-8c01-7bc728535e7a',\r\n // },\r\n // {\r\n // code: 'ApprovalNonContractStateBudget',\r\n // name: 'Kinh phí Ngân sách nhà nước không khoán được duyệt với văn bản giao nhiệm vụ ',\r\n // nameEn: 'ApprovalNonContractStateBudget',\r\n // dataType: 'long',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // codeOnDb: 'kinhPhiNSNNKhongKhoanDuyet',\r\n // seqNum: 31,\r\n // required: 0,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: 'c5cf6569-306a-4ede-ace6-5b9212003a0c',\r\n // },\r\n // {\r\n // code: 'ApprovalImplementationMethod',\r\n // name: 'Phương thức thực hiện',\r\n // nameEn: 'ApprovalImplementationMethod',\r\n // dataType: 'ObjType',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // codeOnDb: 'phuongThucThucHienDuyet',\r\n // seqNum: 32,\r\n // required: 1,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: 'cf73d6e1-581d-4228-b016-6557466ed61a',\r\n // },\r\n // {\r\n // code: 'UpdatedById',\r\n // name: 'Mã người cập nhật trang thái hiện tại của nhiệm vụ',\r\n // nameEn: 'UpdatedById',\r\n // dataType: 'Guid',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // apiURL: '1',\r\n // codeOnDb: 'maNguoiCapNhat',\r\n // seqNum: 33,\r\n // required: 2,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '8c8de675-f6fa-4dd7-b706-39ea7408a12d',\r\n // },\r\n // {\r\n // code: 'UpdatedBy',\r\n // name: 'Người cập nhật trang thái hiện tại của nhiệm vụ',\r\n // nameEn: 'UpdatedBy',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // apiURL: '1',\r\n // codeOnDb: 'nguoiCapNhat',\r\n // seqNum: 34,\r\n // required: 2,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: 'f09197be-09c3-43e2-b2a0-b535be2643f0',\r\n // },\r\n // {\r\n // code: 'CreatedAt',\r\n // name: 'Thời gian tạo',\r\n // nameEn: 'CreatedAt',\r\n // dataType: 'DateTime',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'Calendar(Date)',\r\n // codeOnDb: 'createdAt',\r\n // seqNum: 35,\r\n // required: 2,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // extra:\r\n // '{\"formField\":{\"displayMode\":[\"filter\"],\"filtering\":{\"seqNumber\":5,\"type\":\"DateRange\"}}}',\r\n // viewType: 'Detail',\r\n // id: '8b425192-574b-4df3-8b9a-c28bcd47bdc7',\r\n // },\r\n // {\r\n // code: 'UpdatedAt',\r\n // name: 'Thời gian cập nhật',\r\n // nameEn: 'UpdatedAt',\r\n // dataType: 'DateTime',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'TextView',\r\n // codeOnDb: 'updatedAt',\r\n // seqNum: 36,\r\n // required: 0,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '004a60a1-0b66-4d0b-acb0-eb76d57f49f1',\r\n // },\r\n // {\r\n // code: 'ApprovalNumber',\r\n // name: 'Số quyết định giao nhiệm vụ',\r\n // nameEn: 'ApprovalNumber',\r\n // dataType: 'string',\r\n // allowShare: 1,\r\n // objClassCode: 'SciTaskProposal',\r\n // componentUI: 'InputText',\r\n // codeOnDb: 'soQuyetDinhGiaoNhiemVu',\r\n // seqNum: 37,\r\n // required: 1,\r\n // allowStatistic: 0,\r\n // preventEdit: 0,\r\n // viewType: 'Detail',\r\n // id: '4000def5-2820-4d20-a624-9fc91834487e',\r\n // },\r\n] as ObjField[];\r\n\r\n// Sample test mảng fields json đầu vào cho tham số @Input() fields.\r\nexport const sampleFields = [\r\n // new MultiImageUploadField({\r\n // key: 'images',\r\n // label: 'Hình ảnh kèm theo',\r\n // required: true,\r\n // maxSizeInMB: 62,\r\n // imageCardWidth: '208px'\r\n // }),\r\n // new SingleSelectField({\r\n // key: 'role',\r\n // label: 'Vai trò',\r\n // bindLabel: 'name',\r\n // bindValue: 'code',\r\n // required: true,\r\n // // outputAs: 'single',\r\n // suffixes: [\r\n // new Suffix({\r\n // key: 'test',\r\n // visibleOn: ['add', 'edit', 'view']\r\n // }),\r\n // new Suffix({\r\n // key: 'edit',\r\n // }),\r\n // ],\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/system/Role',\r\n // },\r\n // options: [\r\n // { name: 'Quản trị viên', code: 'admin' },\r\n // { name: 'Người vận hành', code: 'operator' },\r\n // { name: 'Người dân', code: 'anonymous' },\r\n // ],\r\n // errorMessages: {\r\n // [CommonValidaterEnum.Required]: 'Bắt buộc nè hẹ hẹ',\r\n // },\r\n // }),\r\n // new SingleSelectField({\r\n // key: 'province',\r\n // label: 'Tỉnh/Thành phố',\r\n // required: true,\r\n // outputAs: 'single',\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/main/CommonCats/Province',\r\n // },\r\n // isParent: true,\r\n // }),\r\n // new SingleSelectField({\r\n // key: 'district',\r\n // label: 'Quận/Huyện',\r\n // required: false,\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/main/CommonCats/District',\r\n // },\r\n // isParent: true,\r\n // dependsOn: [\r\n // {\r\n // fieldKey: 'province',\r\n // paramKey: 'provinceCode',\r\n // },\r\n // ],\r\n // }),\r\n\r\n // new SingleSelectField({\r\n // key: 'ward',\r\n // label: 'Phường/Xã',\r\n // required: false,\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/main/CommonCats/Ward',\r\n // },\r\n // dependsOn: [\r\n // {\r\n // fieldKey: 'district',\r\n // paramKey: 'districtCode',\r\n // },\r\n // ],\r\n // }),\r\n // new MultiSelectField({\r\n // key: 'multiRole',\r\n // label: 'Nhiều vai trò',\r\n // bindLabel: 'name',\r\n // bindValue: 'code',\r\n // outputAs: 'single',\r\n // required: true,\r\n // isDisabled: false,\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: `${environment.GDCI_SYSTEM_URL}CommonCats/Position`,\r\n // },\r\n // errorMessages: {\r\n // [CommonValidaterEnum.Required]: 'Bắt buộc nè hẹ hẹ',\r\n // },\r\n // suffixes: [\r\n // new Suffix({\r\n // key: 'test',\r\n // visibleOn: ['add', 'edit'],\r\n // }),\r\n // new Suffix({\r\n // key: 'edit',\r\n // }),\r\n // ],\r\n // }),\r\n // new InputTextField({\r\n // key: 'username',\r\n // label: 'Tên tài khoản',\r\n // value: '',\r\n // required: true,\r\n // minLength: 1,\r\n // isDisabled: false,\r\n // suffixes: [\r\n // new Suffix({\r\n // key: 'view',\r\n // visibleOn: ['view']\r\n // }),\r\n // new Suffix({\r\n // key: 'edit',\r\n // }),\r\n // ],\r\n // errorMessages: {\r\n // // [CommonValidaterEnum.Required]: 'Bắt buộc nè hẹ hẹ',\r\n // // [CommonValidaterEnum.MinLength]: 'Tối thiểu nè hẹ hẹ',\r\n // },\r\n // pattern: 'alphaDashVN',\r\n // // grid: { xs: 12 },\r\n // // labelGrid: { xs: 8 },\r\n // // controlGrid: { xs: 16 }\r\n // }),\r\n // new InputPasswordField({\r\n // key: 'password',\r\n // label: 'Mật khẩu',\r\n // value: '',\r\n // required: false,\r\n // matchField: 'confirmPassword',\r\n // errorMessages: {\r\n // // [CustomValidaterEnum.MatchField]: 'Mật khẩu không khớp',\r\n // },\r\n // // grid: { xs: 12 },\r\n // // labelGrid: { xs: 8 },\r\n // // controlGrid: { xs: 16 }\r\n // }),\r\n // new InputPasswordField({\r\n // key: 'confirmPassword',\r\n // label: 'Xác nhận mật khẩu',\r\n // value: '',\r\n // required: false,\r\n // matchField: 'password',\r\n // errorMessages: {\r\n // // [CustomValidaterEnum.MatchField]: 'Mật khẩu không khớp',\r\n // },\r\n // // labelGrid: { xs: 16 },\r\n // // controlGrid: { xs: 8 }\r\n // }),\r\n // new TextareaField({\r\n // key: 'note',\r\n // label: 'Ghi chú',\r\n // value: '',\r\n // required: false,\r\n // minLength: 3,\r\n // maxLength: 128,\r\n // errorMessages: {\r\n // // [CommonValidaterEnum.Required]: 'Bắt buộc nè hẹ hẹ',\r\n // // [CommonValidaterEnum.MinLength]: 'Tối thiểu nè hẹ hẹ',\r\n // },\r\n // // grid: { xs: 12 },\r\n // // labelGrid: { xs: 8 },\r\n // // controlGrid: { xs: 16 }\r\n // }),\r\n // new DatePickerField({\r\n // key: 'date',\r\n // label: 'Ngày',\r\n // required: true,\r\n // allowPastDates: false,\r\n // allowFutureDates: true,\r\n // isDisabled: true\r\n // }),\r\n // new DateRangeField({\r\n // key: 'expectedTime',\r\n // label: 'Thời gian dự kiến',\r\n // required: true,\r\n // outputAs: 'date',\r\n // allowPastDates: false,\r\n // allowFutureDates: true,\r\n // isDisabled: true\r\n // }),\r\n\r\n // new SingleFileUploadField({\r\n // key: 'attachment',\r\n // label: 'Văn bản đính kèm',\r\n // // required: true,\r\n // acceptedMimeTypes: [APPLICATION_TYPES.pdf, IMAGE_TYPES.tif, IMAGE_TYPES.tiff],\r\n // maxSizeInMB: 100000,\r\n // required: true,\r\n // apiFileConfig: {\r\n // uploadUrl: DEFAULT_UPLOAD_TIFF_URL,\r\n // deleteUrl: DEFAULT_DELETE_URL,\r\n // perMimeTypeConfig: {\r\n // 'image/tiff': {\r\n // uploadUrl: DEFAULT_UPLOAD_TIFF_URL,\r\n // buildFormData: (file, extraParams) => {\r\n // const fd = new FormData();\r\n // fd.append('File', file);\r\n // fd.append('SaveFile', String(true));\r\n // fd.append('BucketName', 'documents');\r\n\r\n // return fd;\r\n // },\r\n // },\r\n // },\r\n // },\r\n // }),\r\n new MultiFileUploadField({\r\n key: 'pictures',\r\n label: 'Những hình ảnh kèm theo',\r\n // required: true,\r\n // acceptedMimeTypes: [APPLICATION_TYPES.pdf],\r\n maxSizeInMB: 2,\r\n required: true,\r\n }),\r\n // new AvatarUploadField({\r\n // key: 'avatar',\r\n // label: 'Ảnh đại diện',\r\n // acceptedMimeTypes: [IMAGE_TYPES.jpeg, IMAGE_TYPES.jpg, IMAGE_TYPES.png],\r\n // required: false,\r\n // labelGrid: { xs: 4 },\r\n // controlGrid: { xs: 20 },\r\n // }),\r\n];\r\n\r\nexport const sampleFields2 = [\r\n new SingleSelectField({\r\n key: 'role',\r\n label: 'Vai trò',\r\n bindLabel: 'name',\r\n bindValue: 'code',\r\n required: false,\r\n outputAs: 'single',\r\n transformLabel: (option: Record<string, unknown>) => {\r\n const { name, code } = option;\r\n if (name && code) return `${name} - ${code}`;\r\n return '';\r\n },\r\n apiConfig: {\r\n baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/system/Role',\r\n },\r\n options: [\r\n { name: 'Quản trị viên', code: 'admin' },\r\n { name: 'Người vận hành', code: 'operator' },\r\n { name: 'Người dân', code: 'anonymous' },\r\n ],\r\n errorMessages: {\r\n [CommonValidaterEnum.Required]: 'Bắt buộc nè hẹ hẹ',\r\n },\r\n }),\r\n new SingleSelectField({\r\n key: 'province',\r\n label: 'Tỉnh/Thành phố',\r\n required: true,\r\n transformLabel: (option: Record<string, unknown>) => {\r\n const { name, code } = option;\r\n if (name && code) return `${name} - ${code}`;\r\n return '';\r\n },\r\n apiConfig: {\r\n baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/main/CommonCats/Province',\r\n },\r\n isParent: true,\r\n }),\r\n new SingleSelectField({\r\n key: 'district',\r\n label: 'Quận/Huyện',\r\n required: false,\r\n transformLabel: (option: Record<string, unknown>) => {\r\n const { name, code } = option;\r\n if (name && code) return `${name} - ${code}`;\r\n return '';\r\n },\r\n apiConfig: {\r\n baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/main/CommonCats/District',\r\n },\r\n isParent: true,\r\n dependsOn: [\r\n {\r\n fieldKey: 'province',\r\n paramKey: 'provinceCode',\r\n },\r\n ],\r\n }),\r\n new MultiSelectField({\r\n key: 'multiRole',\r\n label: 'Nhiều vai trò',\r\n bindLabel: 'name',\r\n bindValue: 'code',\r\n outputAs: 'single',\r\n required: true,\r\n transformLabel: (option: Record<string, unknown>) => {\r\n const { name, code } = option;\r\n if (name && code) return `${name} - ${code}`;\r\n return '';\r\n },\r\n apiConfig: {\r\n baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/system/Role',\r\n },\r\n errorMessages: {\r\n [CommonValidaterEnum.Required]: 'Bắt buộc nè hẹ hẹ',\r\n },\r\n }),\r\n new InputTextField({\r\n key: 'username',\r\n label: 'Tên tài khoản',\r\n value: '',\r\n required: true,\r\n minLength: 1,\r\n errorMessages: {\r\n // [CommonValidaterEnum.Required]: 'Bắt buộc nè hẹ hẹ',\r\n // [CommonValidaterEnum.MinLength]: 'Tối thiểu nè hẹ hẹ',\r\n },\r\n pattern: 'alphaDashVN',\r\n // grid: { xs: 12 },\r\n // labelGrid: { xs: 8 },\r\n // controlGrid: { xs: 16 }\r\n }),\r\n new TextareaField({\r\n key: 'note',\r\n label: 'Ghi chú',\r\n value: '',\r\n required: false,\r\n minLength: 3,\r\n maxLength: 128,\r\n errorMessages: {\r\n // [CommonValidaterEnum.Required]: 'Bắt buộc nè hẹ hẹ',\r\n // [CommonValidaterEnum.MinLength]: 'Tối thiểu nè hẹ hẹ',\r\n },\r\n // grid: { xs: 12 },\r\n // labelGrid: { xs: 8 },\r\n // controlGrid: { xs: 16 }\r\n }),\r\n new DatePickerField({\r\n key: 'date',\r\n label: 'Ngày',\r\n required: true,\r\n allowPastDates: false,\r\n allowFutureDates: true,\r\n }),\r\n new DateRangeField({\r\n key: 'expectedTime',\r\n label: 'Thời gian dự kiến',\r\n required: true,\r\n outputAs: 'string',\r\n allowPastDates: false,\r\n allowFutureDates: true,\r\n }),\r\n\r\n new SingleFileUploadField({\r\n key: 'attachment',\r\n label: 'Văn bản đính kèm',\r\n // required: true,\r\n acceptedMimeTypes: [APPLICATION_TYPES.pdf],\r\n maxSizeInMB: 2,\r\n required: true,\r\n }),\r\n new MultiFileUploadField({\r\n key: 'documents',\r\n label: 'Những hồ sơ đính kèm',\r\n // required: true,\r\n acceptedMimeTypes: [APPLICATION_TYPES.pdf],\r\n maxSizeInMB: 2,\r\n required: false,\r\n }),\r\n];\r\n\r\n// Sample test model data 1.\r\nexport const sampleModel = {\r\n province: { code: 35, name: 'Hà Name' },\r\n username: 'ldquocccccccccc',\r\n role: {\r\n name: 'Quản trị viên',\r\n code: 'ADMIN',\r\n },\r\n // role: 'ADMIN',\r\n multiRole: [\r\n {\r\n name: 'Quản trị',\r\n code: 'ADMIN',\r\n },\r\n {\r\n name: 'Vận hành',\r\n code: 'OPERATOR',\r\n },\r\n ],\r\n note: 'Hãy nhớ những điều này:\\n-Tôi là tôi.\\n-Ai là tôi?\\n-Sẽ ra sao nếu tôi tiến lên.\\n-Hẹ hẹ.',\r\n // note: 'hè hè\\nhihihi\\nfefefef',\r\n // date: '08-01-2025',\r\n // date: '30-08-2025',\r\n // date: '2025-08-28',\r\n date: new Date('2025-08-28'),\r\n expectedTime: ['2025-08-28', new Date('2025-08-30')],\r\n // attachment: [{\r\n // id: 'd3f549e0-a036-4b16-aa67-30444d23d795',\r\n // name: 'dummy.pdf',\r\n // path: '/dummy.pdf',\r\n // type: APPLICATION_TYPES.pdf,\r\n // size: 1800\r\n // }],\r\n // attachment:\r\n // '[{\\\"id\\\":\\\"1952e9ea-61c3-4b8d-abe2-4df238804458\\\",\\\"name\\\":\\\"Ho_Cubic_30L_Tong_Hop.pdf\\\",\\\"contentType\\\":\\\"application/pdf\\\",\\\"size\\\":28407,\\\"bucket\\\":\\\"caosuvn\\\",\\\"isDir\\\":false,\\\"createdAt\\\":\\\"2025-08-08\\\",\\\"updatedAt\\\":\\\"2025-08-08\\\",\\\"path\\\":\\\"/Ho_Cubic_30L_Tong_Hop.pdf\\\",\\\"isPublic\\\":true}]',\r\n\r\n attachment:\r\n '[{\"id\":\"8fe5f9b1-18aa-415d-a33e-b4a843b7cab1\",\"name\":\"image.png\",\"contentType\":\"image/png\",\"size\":77239,\"bucket\":\"public\",\"isDir\":false,\"createdAt\":\"2025-09-04\",\"updatedAt\":\"2025-09-04\",\"path\":\"/image.png\",\"isPublic\":true},{\"id\":\"b8963fb1-e842-42ac-9fc4-1733a3b65dc5\",\"name\":\"image (1).png\",\"contentType\":\"image/png\",\"size\":79610,\"bucket\":\"public\",\"isDir\":false,\"createdAt\":\"2025-09-04\",\"updatedAt\":\"2025-09-04\",\"path\":\"/image (1).png\",\"isPublic\":true}]',\r\n pictures:\r\n '[{\\\"id\\\":\\\"1952e9ea-61c3-4b8d-abe2-4df238803338\\\",\\\"name\\\":\\\"Ho_Cubic_30L_Tong_Hop.pdf\\\",\\\"contentType\\\":\\\"application/pdf\\\",\\\"size\\\":28407,\\\"bucket\\\":\\\"caosuvn\\\",\\\"isDir\\\":false,\\\"createdAt\\\":\\\"2025-08-08\\\",\\\"updatedAt\\\":\\\"2025-08-08\\\",\\\"path\\\":\\\"/Ho_Cubic_30L_Tong_Hop.pdf\\\",\\\"isPublic\\\":true},{\\\"id\\\":\\\"1952e9ea-61c3-4b8d-abe2-4df238804458\\\",\\\"name\\\":\\\"Ho_Cubic_35L_Tong_Hop.pdf\\\",\\\"contentType\\\":\\\"application/pdf\\\",\\\"size\\\":28407,\\\"bucket\\\":\\\"caosuvn\\\",\\\"isDir\\\":false,\\\"createdAt\\\":\\\"2025-08-08\\\",\\\"updatedAt\\\":\\\"2025-08-08\\\",\\\"path\\\":\\\"/Ho_Cubic_35L_Tong_Hop.pdf\\\",\\\"isPublic\\\":true}]',\r\n // pictures: '[{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800},{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800},{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800},{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800},{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800}]'\r\n};\r\n\r\n// Sample test model data 2.\r\nexport const sampleModel2 = {\r\n images:\r\n '[{\"id\":\"56062785-a619-41f7-8b64-ed648e57f934\",\"name\":\"vrg_file_5141201818_104814_39-11_anh_bai_chinh_ml41ozadgy_ug51tjdtjb.jpg\",\"contentType\":\"image/jpeg\",\"size\":176638,\"bucket\":\"public\",\"isDir\":false,\"createdAt\":\"2025-09-08\",\"updatedAt\":\"2025-09-08\",\"path\":\"/vrg_file_5141201818_104814_39-11_anh_bai_chinh_ml41ozadgy_ug51tjdtjb.jpg\",\"isPublic\":true},{\"id\":\"79c62863-8241-4785-ac52-162a1d5347a6\",\"name\":\"vrg_file_5409423468_coral-reef-fish-reef-fish-aquarium-wallpaper-preview.jpg\",\"contentType\":\"image/jpeg\",\"size\":128651,\"bucket\":\"public\",\"isDir\":false,\"createdAt\":\"2025-09-08\",\"updatedAt\":\"2025-09-08\",\"path\":\"/vrg_file_5409423468_coral-reef-fish-reef-fish-aquarium-wallpaper-preview.jpg\",\"isPublic\":true},{\"id\":\"973d2861-fe87-481f-9dc7-aeb7991516de\",\"name\":\"vrg_file_8710772406_nemo_fi.jpg\",\"contentType\":\"image/jpeg\",\"size\":19134,\"bucket\":\"public\",\"isDir\":false,\"createdAt\":\"2025-09-08\",\"updatedAt\":\"2025-09-08\",\"path\":\"/vrg_file_8710772406_nemo_fi.jpg\",\"isPublic\":true}]',\r\n avatar:\r\n '[{\"id\":\"55283e86-6d16-4f12-9d9b-fce1b928eae5\",\"name\":\"104814_39-11_anh_bai_chinh_ml41ozadgy_ug51tjdtjb.jpg\",\"contentType\":\"image/jpeg\",\"size\":176638,\"bucket\":\"public\",\"isDir\":false,\"createdAt\":\"2025-08-19\",\"updatedAt\":\"2025-08-19\",\"path\":\"/104814_39-11_anh_bai_chinh_ml41ozadgy_ug51tjdtjb.jpg\",\"isPublic\":true}]',\r\n province: { code: 35, name: 'Hà Name' },\r\n district: { code: 349, name: 'Duy tiên' },\r\n username: 'dddddddddddddddddddddddd',\r\n role: {\r\n name: 'Vận hành',\r\n code: 'OPERATOR',\r\n },\r\n // role: 'ADMIN',\r\n multiRole: [\r\n {\r\n name: 'Quản trị',\r\n code: 'ADMIN',\r\n },\r\n {\r\n name: 'Vận hành',\r\n code: 'OPERATOR',\r\n },\r\n {\r\n name: 'Người dân',\r\n code: 'ANONYMOUS',\r\n },\r\n ],\r\n note: 'CCCCC',\r\n // note: 'hè hè\\nhihihi\\nfefefef',\r\n // date: '08-01-2025',\r\n // date: '30-08-2025',\r\n // date: '2025-08-28',\r\n date: new Date('2025-08-30'),\r\n expectedTime: ['2025-08-01', new Date('2025-08-02')],\r\n // attachment: [{\r\n // id: 'd3f549e0-a036-4b16-aa67-30444d23d795',\r\n // name: 'dummy.pdf',\r\n // path: '/dummy.pdf',\r\n // type: APPLICATION_TYPES.pdf,\r\n // size: 1800\r\n // }],\r\n attachment:\r\n '[{\"id\":\"8fe5f9b1-18aa-415d-a33e-b4a843b7cab1\",\"name\":\"image.png\",\"contentType\":\"image/png\",\"size\":77239,\"bucket\":\"public\",\"isDir\":false,\"createdAt\":\"2025-09-04\",\"updatedAt\":\"2025-09-04\",\"path\":\"/image.png\",\"isPublic\":true},{\"id\":\"b8963fb1-e842-42ac-9fc4-1733a3b65dc5\",\"name\":\"image (1).png\",\"contentType\":\"image/png\",\"size\":79610,\"bucket\":\"public\",\"isDir\":false,\"createdAt\":\"2025-09-04\",\"updatedAt\":\"2025-09-04\",\"path\":\"/image (1).png\",\"isPublic\":true}]',\r\n // attachment:\r\n // '[{\\\"id\\\":\\\"1952e9ea-61c3-4b8d-abe2-4df238804458\\\",\\\"name\\\":\\\"dumpleeeee.pdf\\\",\\\"contentType\\\":\\\"application/pdf\\\",\\\"size\\\":28407,\\\"bucket\\\":\\\"caosuvn\\\",\\\"isDir\\\":false,\\\"createdAt\\\":\\\"2025-08-08\\\",\\\"updatedAt\\\":\\\"2025-08-08\\\",\\\"path\\\":\\\"/Ho_Cubic_30L_Tong_Hop.pdf\\\",\\\"isPublic\\\":true}]',\r\n pictures:\r\n '[{\\\"id\\\":\\\"1952e9ea-61c3-4b8d-abe2-4df238803338\\\",\\\"name\\\":\\\"Ho_Cubic_45L_Tong_Hop.pdf\\\",\\\"contentType\\\":\\\"application/pdf\\\",\\\"size\\\":28407,\\\"bucket\\\":\\\"caosuvn\\\",\\\"isDir\\\":false,\\\"createdAt\\\":\\\"2025-08-08\\\",\\\"updatedAt\\\":\\\"2025-08-08\\\",\\\"path\\\":\\\"/Ho_Cubic_30L_Tong_Hop.pdf\\\",\\\"isPublic\\\":true},{\\\"id\\\":\\\"1952e9ea-61c3-4b8d-abe2-4df238804458\\\",\\\"name\\\":\\\"Ho_Cubic_60L_Tong_Hop.pdf\\\",\\\"contentType\\\":\\\"application/pdf\\\",\\\"size\\\":28407,\\\"bucket\\\":\\\"caosuvn\\\",\\\"isDir\\\":false,\\\"createdAt\\\":\\\"2025-08-08\\\",\\\"updatedAt\\\":\\\"2025-08-08\\\",\\\"path\\\":\\\"/Ho_Cubic_35L_Tong_Hop.pdf\\\",\\\"isPublic\\\":true}]',\r\n // pictures: '[{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800},{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800},{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800},{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800},{\"id\":\"d3f549e0-a036-4b16-aa67-30444d23d795\",\"name\":\"dummy.pdf\",\"path\":\"/dummy.pdf\",\"contentType\":\"application/pdf\",\"size\":1800}]'\r\n};\r\n\r\n//#region Multi Form\r\n\r\nexport const sampleMultiFormFieldsA = [\r\n // ======== Input Text ========\r\n new InputTextField({\r\n key: 'usernameA',\r\n label: 'Tên tài khoản A',\r\n value: '',\r\n required: true,\r\n minLength: 2,\r\n isDisabled: false,\r\n errorMessages: {\r\n [CommonValidaterEnum.Required]: 'Bắt buộc nha hẹ hẹ',\r\n [CommonValidaterEnum.MinLength]: 'Tối thiểu là 2 nha hẹ hẹ',\r\n },\r\n pattern: 'alphaDashVN',\r\n // grid: { xs: 12 },\r\n // labelGrid: { xs: 8 },\r\n // controlGrid: { xs: 16 },\r\n // suffixes: [\r\n // new Suffix({\r\n // key: 'view',\r\n // visibleOn: ['view'],\r\n // }),\r\n // new Suffix({\r\n // key: 'edit',\r\n // }),\r\n // ],\r\n }),\r\n // ======== Input Text ========\r\n\r\n // ======== Input Password ========\r\n // new InputPasswordField({\r\n // key: 'passwordA',\r\n // label: 'Mật khẩu',\r\n // // value: '',\r\n // required: false,\r\n // matchField: 'confirmPasswordA',\r\n // errorMessages: {\r\n // [CustomValidaterEnum.MatchField]: 'Mật khẩu không khớp',\r\n // },\r\n // // grid: { xs: 12 },\r\n // // labelGrid: { xs: 8 },\r\n // // controlGrid: { xs: 16 }\r\n // }),\r\n // new InputPasswordField({\r\n // key: 'confirmPasswordA',\r\n // label: 'Xác nhận mật khẩu',\r\n // // value: '',\r\n // required: false,\r\n // matchField: 'passwordA',\r\n // errorMessages: {\r\n // [CustomValidaterEnum.MatchField]: 'Xác nhận mật khẩu không khớp',\r\n // },\r\n // // labelGrid: { xs: 16 },\r\n // // controlGrid: { xs: 8 }\r\n // }),\r\n // ======== Input Password ========\r\n\r\n // ======== Textarea ========\r\n // new TextareaField({\r\n // key: 'noteA',\r\n // label: 'Ghi chú A',\r\n // value: '',\r\n // required: false,\r\n // minLength: 3,\r\n // maxLength: 128,\r\n // // grid: { xs: 12 },\r\n // // labelGrid: { xs: 8 },\r\n // // controlGrid: { xs: 16 }\r\n // }),\r\n // ======== Textarea ========\r\n\r\n // ======== DATE PICKER ========\r\n // new DatePickerField({\r\n // key: 'dateA',\r\n // label: 'Ngày A',\r\n // required: true,\r\n // allowPastDates: false,\r\n // allowFutureDates: true,\r\n // isDisabled: false,\r\n // }),\r\n // ======== DATE PICKER ========\r\n\r\n // ======== DATE RANGE ========\r\n // new DateRangeField({\r\n // key: 'expectedTimeA',\r\n // label: 'Thời gian dự kiến A',\r\n // required: true,\r\n // outputAs: 'date-array',\r\n // allowPastDates: false,\r\n // allowFutureDates: true,\r\n // isDisabled: false,\r\n // }),\r\n // ======== DATE RANGE ========\r\n\r\n // ======== SINGLE SELECT ========\r\n // new SingleSelectField({\r\n // key: 'roleA',\r\n // label: 'Vai trò A',\r\n // bindLabel: 'name',\r\n // bindValue: 'code',\r\n // required: true,\r\n // // outputAs: 'single',\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/system/Role',\r\n // },\r\n // options: [\r\n // { name: 'Quản trị viên', code: 'admin' },\r\n // { name: 'Người vận hành', code: 'operator' },\r\n // { name: 'Người dân', code: 'anonymous' },\r\n // ],\r\n // }),\r\n // ======== SINGLE SELECT ========\r\n\r\n // ======== MULTI SELECT ========\r\n // new MultiSelectField({\r\n // key: 'multiRoleA',\r\n // label: 'Nhiều vai trò A',\r\n // bindLabel: 'name',\r\n // bindValue: 'code',\r\n // outputAs: 'single',\r\n // required: true,\r\n // isDisabled: false,\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: `${environment.GDCI_SYSTEM_URL}CommonCats/Position`,\r\n // },\r\n // }),\r\n // ======== MULTI SELECT ========\r\n\r\n // ======== SINGLE FILE UPLOAD ========\r\n new SingleFileUploadField({\r\n key: 'attachmentA',\r\n label: 'Văn bản đính kèm A',\r\n // required: true,\r\n acceptedMimeTypes: [APPLICATION_TYPES.pdf, IMAGE_TYPES.tif, IMAGE_TYPES.tiff],\r\n maxSizeInMB: 100000,\r\n required: true,\r\n }),\r\n // ======== SINGLE FILE UPLOAD ========\r\n\r\n // ======== MULTI FILE UPLOAD ========\r\n new MultiFileUploadField({\r\n key: 'picturesA',\r\n label: 'Những hình ảnh kèm theo A',\r\n acceptedMimeTypes: [APPLICATION_TYPES.pdf],\r\n maxSizeInMB: 2,\r\n required: false,\r\n }),\r\n // ======== MULTI FILE UPLOAD ========\r\n\r\n // ======== MULTI IMAGE UPLOAD ========\r\n new MultiImageUploadField({\r\n key: 'imagesA',\r\n label: 'Hình ảnh kèm theo A',\r\n required: true,\r\n maxSizeInMB: 62,\r\n imageCardWidth: '208px',\r\n }),\r\n // ======== MULTI IMAGE UPLOAD ========\r\n\r\n // ======== AVATAR UPLOAD ========\r\n new AvatarUploadField({\r\n key: 'avatarA',\r\n label: 'Ảnh đại diện A',\r\n acceptedMimeTypes: [IMAGE_TYPES.jpeg, IMAGE_TYPES.jpg, IMAGE_TYPES.png],\r\n required: false,\r\n labelGrid: { xs: 4 },\r\n controlGrid: { xs: 20 },\r\n }),\r\n // ======== AVATAR UPLOAD ========\r\n];\r\n\r\nexport const sampleMultiFormFieldsB = [\r\n // ======== Input Text ========\r\n new InputTextField({\r\n key: 'usernameB',\r\n label: 'Tên tài khoản B',\r\n value: '',\r\n required: true,\r\n minLength: 2,\r\n isDisabled: false,\r\n errorMessages: {\r\n [CommonValidaterEnum.Required]: 'Bắt buộc nha hẹ hẹ',\r\n [CommonValidaterEnum.MinLength]: 'Tối thiểu là 2 nha hẹ hẹ',\r\n },\r\n pattern: 'alphaDashVN',\r\n // grid: { xs: 12 },\r\n // labelGrid: { xs: 8 },\r\n // controlGrid: { xs: 16 },\r\n // suffixes: [\r\n // new Suffix({\r\n // key: 'view',\r\n // visibleOn: ['view'],\r\n // }),\r\n // new Suffix({\r\n // key: 'edit',\r\n // }),\r\n // ],\r\n }),\r\n // ======== Input Text ========\r\n\r\n // ======== Input Password ========\r\n // new InputPasswordField({\r\n // key: 'passwordB',\r\n // label: 'Mật khẩu',\r\n // // value: '',\r\n // required: false,\r\n // matchField: 'confirmPasswordB',\r\n // errorMessages: {\r\n // [CustomValidaterEnum.MatchField]: 'Mật khẩu không khớp',\r\n // },\r\n // // grid: { xs: 12 },\r\n // // labelGrid: { xs: 8 },\r\n // // controlGrid: { xs: 16 }\r\n // }),\r\n // new InputPasswordField({\r\n // key: 'confirmPasswordB',\r\n // label: 'Xác nhận mật khẩu',\r\n // // value: '',\r\n // required: false,\r\n // matchField: 'passwordB',\r\n // errorMessages: {\r\n // [CustomValidaterEnum.MatchField]: 'Xác nhận mật khẩu không khớp',\r\n // },\r\n // // labelGrid: { xs: 16 },\r\n // // controlGrid: { xs: 8 }\r\n // }),\r\n // ======== Input Password ========\r\n\r\n // ======== Textarea ========\r\n // new TextareaField({\r\n // key: 'noteB',\r\n // label: 'Ghi chú B',\r\n // value: '',\r\n // required: false,\r\n // minLength: 3,\r\n // maxLength: 128,\r\n // // grid: { xs: 12 },\r\n // // labelGrid: { xs: 8 },\r\n // // controlGrid: { xs: 16 }\r\n // }),\r\n // ======== Textarea ========\r\n\r\n // ======== DATE PICKER ========\r\n // new DatePickerField({\r\n // key: 'dateB',\r\n // label: 'Ngày B',\r\n // required: true,\r\n // allowPastDates: false,\r\n // allowFutureDates: true,\r\n // isDisabled: false,\r\n // }),\r\n // ======== DATE PICKER ========\r\n\r\n // ======== DATE RANGE ========\r\n // new DateRangeField({\r\n // key: 'expectedTimeB',\r\n // label: 'Thời gian dự kiến B',\r\n // required: true,\r\n // outputAs: 'date-array',\r\n // allowPastDates: false,\r\n // allowFutureDates: true,\r\n // isDisabled: false,\r\n // }),\r\n // ======== DATE RANGE ========\r\n\r\n // ======== SINGLE SELECT ========\r\n // new SingleSelectField({\r\n // key: 'roleB',\r\n // label: 'Vai trò B',\r\n // bindLabel: 'name',\r\n // bindValue: 'code',\r\n // required: true,\r\n // // outputAs: 'single',\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: 'https://quyhoachxaydung.hanam.gov.vn/gdci/system/Role',\r\n // },\r\n // options: [\r\n // { name: 'Quản trị viên', code: 'admin' },\r\n // { name: 'Người vận hành', code: 'operator' },\r\n // { name: 'Người dân', code: 'anonymous' },\r\n // ],\r\n // }),\r\n // ======== SINGLE SELECT ========\r\n\r\n // ======== MULTI SELECT ========\r\n // new MultiSelectField({\r\n // key: 'multiRoleB',\r\n // label: 'Nhiều vai trò B',\r\n // bindLabel: 'name',\r\n // bindValue: 'code',\r\n // outputAs: 'single',\r\n // required: true,\r\n // isDisabled: false,\r\n // transformLabel: (option: Record<string, unknown>) => {\r\n // const { name, code } = option;\r\n // if (name && code) return `${name} - ${code}`;\r\n // return '';\r\n // },\r\n // apiConfig: {\r\n // baseUrl: `${environment.GDCI_SYSTEM_URL}CommonCats/Position`,\r\n // },\r\n // }),\r\n // ======== MULTI SELECT ========\r\n\r\n // ======== SINGLE FILE UPLOAD ========\r\n new SingleFileUploadField({\r\n key: 'attachmentB',\r\n label: 'Văn bản đính kèm B',\r\n // required: true,\r\n acceptedMimeTypes: [APPLICATION_TYPES.pdf, IMAGE_TYPES.tif, IMAGE_TYPES.tiff],\r\n maxSizeInMB: 100000,\r\n required: true,\r\n }),\r\n // ======== SINGLE FILE UPLOAD ========\r\n\r\n // ======== MULTI FILE UPLOAD ========\r\n new MultiFileUploadField({\r\n key: 'picturesB',\r\n label: 'Những hình ảnh kèm theo B',\r\n acceptedMimeTypes: [APPLICATION_TYPES.pdf],\r\n maxSizeInMB: 2,\r\n required: false,\r\n }),\r\n // ======== MULTI FILE UPLOAD ========\r\n\r\n // ======== MULTI IMAGE UPLOAD ========\r\n new MultiImageUploadField({\r\n key: 'imagesB',\r\n label: 'Hình ảnh kèm theo B',\r\n required: true,\r\n maxSizeInMB: 62,\r\n imageCardWidth: '208px',\r\n }),\r\n // ======== MULTI IMAGE UPLOAD ========\r\n\r\n // ======== AVATAR UPLOAD ========\r\n new AvatarUploadField({\r\n key: 'avatarB',\r\n label: 'Ảnh đại diện B',\r\n acceptedMimeTypes: [IMAGE_TYPES.jpeg, IMAGE_TYPES.jpg, IMAGE_TYPES.png],\r\n required: false,\r\n labelGrid: { xs: 4 },\r\n controlGrid: { xs: 20 },\r\n }),\r\n // ======== AVATAR UPLOAD ========\r\n];\r\n\r\nexport const sampleMultiFormModelA = {\r\n usernameA: 'Lương Văn Lào',\r\n};\r\n\r\nexport const sampleMultiFormModelB = {\r\n usernameB: 'Đào Mai Tôn',\r\n};\r\n\r\n//#endregion Multi Form\r\n\r\n//#region MultiSelect depend on field has isParent\r\nexport const sampleMultiSelectDependOnParent = [\r\n new MultiFileUploadField({\r\n key: 'picturesB',\r\n label: 'Những hình ảnh kèm theo B',\r\n acceptedMimeTypes: [APPLICATION_TYPES.pdf, IMAGE_TYPES.png, IMAGE_TYPES.jpg],\r\n maxSizeInMB: 1,\r\n required: true,\r\n }),\r\n\r\n new SingleSelectField({\r\n key: 'province',\r\n label: 'Tỉnh/Thành phố',\r\n required: true,\r\n outputAs: 'single',\r\n transformLabel: (option: Record<string, unknown>) => {\r\n const { name, code } = option;\r\n if (name && code) return `${name} - ${code}`;\r\n return '';\r\n },\r\n apiConfig: {\r\n baseUrl: `http://mock-api.com/CommonCats/Province`,\r\n },\r\n isParent: true,\r\n }),\r\n\r\n new MultiSelectField({\r\n key: 'ward',\r\n label: 'Phường/Xã',\r\n required: false,\r\n transformLabel: (option: Record<string, unknown>) => {\r\n const { name, code } = option;\r\n if (name && code) return `${name} - ${code}`;\r\n return '';\r\n },\r\n apiConfig: {\r\n baseUrl: `http://mock-api.com/CommonCats/Ward`,\r\n },\r\n dependsOn: [\r\n {\r\n fieldKey: 'province',\r\n paramKey: 'provinceCode',\r\n },\r\n ],\r\n // dependType: DependTypeEnum.All\r\n }),\r\n];\r\n\r\n//#endregion MultiSelect depend on field has isParent\r\n","export const COMBINE_DEPEND_TYPES = ['skip', 'null', 'valid'] as const;\r\n","import { MIME_TYPES_TO_EXTENSION } from '../../consts/common';\r\nimport { FileSizeTypeEnum } from '../../enums/common/file-size-type.enum';\r\n\r\n// Format file size, đầu vào là Byte, và loại muốn format sang.\r\nexport const formatFileSize = (size: number, type: FileSizeTypeEnum): number => {\r\n let returnVal = 0;\r\n switch (type) {\r\n case 'KB':\r\n returnVal = size / 1024;\r\n break;\r\n case 'MB':\r\n returnVal = size / (1024 * 1024);\r\n break;\r\n case 'GB':\r\n returnVal = size / (1024 * 1024 * 1024);\r\n break;\r\n case 'TB':\r\n returnVal = size / (1024 * 1024 * 1024 * 1024);\r\n break;\r\n default:\r\n returnVal = size;\r\n break;\r\n }\r\n return returnVal;\r\n};\r\n\r\n// Lấy extension. dựa vào các cấu hình mimeTypes sẵn.\r\nexport const getExtensions = (acptMimeTypes: string[]): string[] => {\r\n return acptMimeTypes.map(mime => `.${MIME_TYPES_TO_EXTENSION[mime] || mime}`);\r\n};\r\n\r\n// Tạo một file giả từ thông tin name, type và size.\r\nexport const createFakeFile = (name: string, type: string, size: number): File => {\r\n const buffer = new Uint8Array(size); // tạo buffer theo size, không crash nếu file có dung lượng lớn.\r\n const blob = new Blob([buffer], { type });\r\n return new File([blob], name, { type, lastModified: Date.now() });\r\n};\r\n","import { BaseField } from '../../models/fields/field.model';\r\n\r\n// Kiểm tra tính hợp lệ của JSON string.\r\nexport const isValidJSON = (str: string): boolean => {\r\n try {\r\n JSON.parse(str);\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\n// Tạo một chuỗi uuid.\r\nexport const uuidGenerator = (): string => {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = (Math.random() * 16) | 0,\r\n v = c == 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\r\n\r\nexport const lowerCaseFirstChar = (str: string): string => {\r\n return str.charAt(0).toLowerCase() + str.slice(1);\r\n};\r\n\r\nexport const upperCaseFirstChar = (str: string): string => {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n};\r\n\r\nexport const deepCopyArray = (array: BaseField<any>[]): BaseField<any>[] => {\r\n return array.map(item => {\r\n if (Array.isArray(item)) {\r\n return deepCopyArray(item); // Deep copy nếu phần tử là mảng lồng nhau\r\n } else if (item && typeof item === 'object') {\r\n return deepCopyObject(item); // Deep copy nếu phần tử là đối tượng\r\n }\r\n return item; // Trả về giá trị gốc nếu không phải mảng hoặc đối tượng\r\n }) as BaseField<any>[];\r\n};\r\n\r\nexport const deepCopyObject = (obj: BaseField<any>): BaseField<any> => {\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n return [key, deepCopyArray(value)]; // Deep copy nếu giá trị là mảng\r\n } else if (value && typeof value === 'object') {\r\n return [key, deepCopyObject(value)]; // Deep copy nếu giá trị là đối tượng\r\n }\r\n return [key, value]; // Trả về giá trị gốc\r\n }),\r\n ) as BaseField<any>;\r\n};\r\n","import { AbstractControl, AsyncValidatorFn, ValidationErrors, ValidatorFn } from '@angular/forms';\r\nimport { delay, Observable, of } from 'rxjs';\r\nimport { formatFileSize } from '../file';\r\nimport { FileSizeTypeEnum } from '../../enums/common/file-size-type.enum';\r\nimport { isValidJSON } from '../common';\r\nimport { ReminderValue } from '../../models/fields/radio/custom/reminder-type-radio/reminder-value.model';\r\n\r\n// Không cho phép nhập khoảng trắng ở đầu chuỗi, nếu không nhập gì vẫn tính đúng.\r\nexport const noLeadingSpaceValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = (control.value ?? '').toString();\r\n if (!value) return null; // Không required thì để trống là hợp lệ\r\n return value[0] === ' ' ? { leadingSpace: true } : null;\r\n };\r\n};\r\n\r\n// Không cho phép nhập toàn khoảng trắng.\r\nexport const noWhitespaceValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const isWhitespace = (control.value || '').toString().trim().length === 0;\r\n return isWhitespace ? { whitespace: true } : null;\r\n };\r\n};\r\n\r\n// Bắt đầu với một kí tự được chỉ định.\r\nexport const startsWithValidator = (prefix: string): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value ?? '';\r\n return value.startsWith(prefix) ? null : { startsWith: { requiredPrefix: prefix } };\r\n };\r\n};\r\n\r\n// So sánh giá trị field A không được lớn hơn field B.\r\nexport const minMaxFieldValidator = (minKey: string, maxKey: string): ValidatorFn => {\r\n // group: AbstractControl sẽ đại diện cho FormGroup tức là cha bao hàm các field.\r\n return (group: AbstractControl): ValidationErrors | null => {\r\n const min = group.get(minKey)?.value;\r\n const max = group.get(maxKey)?.value;\r\n if (min != null && max != null && min > max) {\r\n return { minMaxInvalid: true };\r\n }\r\n return null;\r\n };\r\n};\r\n\r\n// Match giữa hai field (ví dụ: password/confirmPassword,...).\r\nexport const matchFieldsValidator = (fieldToMatch: string): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const parent = control.parent;\r\n if (!parent) return null;\r\n\r\n const target = parent.get(fieldToMatch);\r\n if (!target?.value) return null;\r\n\r\n // Nếu đang validate chính nó (ví dụ: confirmPassword)\r\n const isMismatch = control.value !== target.value;\r\n\r\n // Nếu trước đó password (target) đang bị lỗi matchField nhưng giờ đã khớp\r\n if (!isMismatch && target.hasError('matchField')) {\r\n const errors = { ...target.errors };\r\n delete errors['matchField'];\r\n\r\n // Nếu không còn lỗi nào khác, set null\r\n target.setErrors(Object.keys(errors).length ? errors : null);\r\n }\r\n\r\n return isMismatch ? { matchField: true } : null;\r\n };\r\n};\r\n\r\n// Async: Check if username is taken (simulate API).\r\nexport const asyncUsernameValidator = (takenUsernames: string[]): AsyncValidatorFn => {\r\n return (control: AbstractControl): Observable<ValidationErrors | null> => {\r\n const value = control.value ?? '';\r\n const isTaken = takenUsernames.includes(value);\r\n return of(isTaken ? { usernameTaken: true } : null).pipe(delay(500));\r\n };\r\n};\r\n\r\n// Không có ký tự đặc biệt.\r\nexport const noSpecialCharValidator = (): ValidatorFn => {\r\n return (control: AbstractControl) => {\r\n const valid = /^[a-zA-Z0-9]*$/.test(control.value);\r\n return valid ? null : { noSpecialChar: true };\r\n };\r\n};\r\n\r\n// Username không được nằm trong blacklist.\r\nexport const usernameBlacklistValidator = (blacklist: string[]): ValidatorFn => {\r\n return (control: AbstractControl) => {\r\n return blacklist.includes(control.value) ? { blacklisted: true } : null;\r\n };\r\n};\r\n\r\n// Có thuộc mimetypes từ mảng mimetypes được chỉ định hay không?\r\nexport const acceptedMimeTypesValidator = (acceptedMimeTypes: string[]): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control?.value;\r\n\r\n if (value) {\r\n let fileType = '';\r\n if (value instanceof File) {\r\n fileType = (value as File).type;\r\n }\r\n\r\n if (isValidJSON(value as string)) {\r\n const { contentType } = JSON.parse(value)[0] || {};\r\n if (contentType) fileType = contentType;\r\n }\r\n\r\n if (fileType) {\r\n if (!acceptedMimeTypes.includes(fileType)) {\r\n return {\r\n acceptedMimeTypes: {\r\n actualValue: fileType,\r\n requiredValue: `Nằm trong ${acceptedMimeTypes}`,\r\n },\r\n };\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n};\r\n\r\nexport const maxFileSizeInMBValidator = (maxSizeInMB: number): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const file = control?.value as File;\r\n if (file) {\r\n const fileSizeInMB = formatFileSize(file.size, FileSizeTypeEnum.MB);\r\n\r\n if (fileSizeInMB > maxSizeInMB) {\r\n return {\r\n maxSizeInMB: {\r\n actualValue: fileSizeInMB,\r\n requiredValue: `Nhỏ hơn ${maxSizeInMB}`,\r\n },\r\n };\r\n }\r\n }\r\n return null;\r\n };\r\n};\r\n\r\nexport const reminderCustomRequiredValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const reminderValue: ReminderValue | null = control?.value;\r\n\r\n if (!reminderValue) {\r\n return {\r\n reminderCustomRequired: {\r\n requiredValue: `Giá trị radio và cả từ select hoặc date`,\r\n },\r\n };\r\n }\r\n\r\n if (reminderValue) {\r\n const { reminderDate } = reminderValue;\r\n if (!reminderDate) {\r\n return {\r\n reminderCustomRequired: {\r\n actualValue: reminderDate,\r\n requiredValue: `Giá trị từ select hoặc date`,\r\n },\r\n };\r\n }\r\n }\r\n return null;\r\n };\r\n};\r\n","// Các patterns regex thường dùng trong ứng dụng\r\nexport const PATTERN_PRESETS: Record<string, string | RegExp> = {\r\n alpha: '^[a-zA-Z]+$',\r\n alphaNumeric: '^[a-zA-Z0-9]+$',\r\n name: \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\()]+$\",\r\n username: '^[a-z0-9_.s]+$',\r\n regexPostCode: '^[a-zA-Z0-9-s]+$',\r\n alphaDash: '^[a-zA-Z0-9_-s.]+$',\r\n alphaVN:\r\n '^[a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\,s]+$',\r\n alphaNumericVN:\r\n '^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\s]+$',\r\n alphaDashVN:\r\n \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\()]+$\",\r\n unitName:\r\n '^[a-zA-Z0-9 ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹs_-]+$',\r\n date: '([12]\\\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01]))',\r\n time: '(?=[01]\\\\d|2[0123])=(?=[012345]\\\\d)=(?=[012345]\\\\d)',\r\n dateTime:\r\n '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9])=[0-5][0-9]=[0-5][0-9]',\r\n // dateV: \"^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4}$\",\r\n // dateV: /^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-](19|20)\\d\\d/,\r\n // dateV: \"^([0-2][0-9]|(3)[0-1])(\\-)(((0)[0-9])|((1)[0-2]))(\\-)\\d{4}$\",\r\n dateVN: '^(?=0[1-9]|[12]d|3[01])([/.-])(?=0[1-9]|1[012])\\\\1(?=19|20)dd$',\r\n dateTimeVN:\r\n '^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4} (\\\\d{2})=(\\\\d{2})=(\\\\d{2})$',\r\n dateShortTimeVN: '^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4} (\\\\d{2})=(\\\\d{2})$',\r\n integer: '^\\\\-?[0-9]+$',\r\n decimal: '^\\\\-?[0-9]*\\\\.?[0-9]+$',\r\n ipAddress:\r\n '^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$',\r\n base64: '[^a-zA-Z0-9\\\\/\\\\+=]',\r\n citizenId: '^\\\\d{12}$',\r\n passport: '^[A-Z0-9]{6,12}$', // Hộ chiếu - 6-12 ký tự (chữ IN HOA và số)\r\n // dnkhcn: \"/^DNKHCN-[A-Z]{2}-d{4}$/\",\r\n // msdn: \"/^d{10}$/\",\r\n intergerNotZero: '^[0-9]*[1-9][0-9]*$',\r\n //link: \"(https?=//(?=www.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|www.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|https?=//(?=www.|(?!www))[a-zA-Z0-9]+.[^s]{2,}|www.[a-zA-Z0-9]+.[^s]{2,})\",\r\n // code: \"^['A-Z''0-9''._\\\\-']*$\",\r\n code: \"^['A-Z''0-9''./_\\\\-\\\\/\\\\Đ']*$\",\r\n codeHsda: \"^['A-Z''0-9''./_\\\\-']*$\",\r\n link_location: '(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})([/\\\\w .-]*)?(\\\\?[\\\\w=&,.%-]*)?',\r\n link: '(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})[/\\\\w .-]*/?',\r\n //password: \"/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@$!%*?&]).{8,}/\",\r\n accountName: '^[a-zA-Z0-9_.]{2,20}$',\r\n name_or_fullName:\r\n '^[a-zA-Z0-9_ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễếệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ ]{1,20}$',\r\n packageName: '^(?:[a-zA-Z]+(?:d*[a-zA-Z_]*)*)(?:.[a-zA-Z]+(?:d*[a-zA-Z_]*)*)+$',\r\n email: '^[a-z0-9._%+-]+@[a-z0-9.-]+\\\\.[a-z]{2,4}$',\r\n passwordRegex:\r\n '^(?!.*\\\\s)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[~`!@#$%^&*()--+={}\\\\[\\\\]|\\\\\\\\:;\"\\'<>,.?/_₹]).{8,}$',\r\n // phoneNumber: \"^(\\\\+84|0)([235789])([0-9]{8,9})\\\\b\",\r\n phoneNumber: '^(\\\\+84|0)([235789])([0-9]{8,9})$',\r\n seqNum: '^(100|[0-9]{1,2})$',\r\n link_basemap:\r\n '(https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?/[a-zA-Z0-9]{2,}|((https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?)|(https://www.|http://www.|https://|http://)?[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}(.[a-zA-Z0-9]{2,})?',\r\n alphaDashBreakLineVN:\r\n \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\(\\\\)\\n]+$\",\r\n fax: '^(\\\\+?\\\\d{1,4}[\\\\s-]?)?(\\\\(?\\\\d{2,4}\\\\)?[\\\\s-]?)?[\\\\d\\\\s-]{5,15}$',\r\n alphaDashNameVN:\r\n \"^[a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\.s.\\/\\-\\_'\\\\(\\\\)]{2,}$\",\r\n businessCode: '^\\\\d{10}(-\\\\d{3})?$',\r\n};\r\n\r\n// Các error message cho các pattern regex.\r\nexport const PATTERN_ERROR_MESSAGES: Record<string, string> = {\r\n required: '%s không được để trống!',\r\n number: '%s phải là số!',\r\n email: '%s không đúng định dạng địa chỉ Email!',\r\n minlength: '%s có kích thước tối thiểu %s ký tự!',\r\n maxlength: '%s có kích thước tối đa %s ký tự!',\r\n min: '%s phải lớn hơn hoặc bằng %s!',\r\n max: '%s phải nhỏ hơn hoặc bằng %s!',\r\n alpha: '%s chỉ chứa ký tự thường và ký tự in hoa không dấu!',\r\n alphaNumeric: '%s chỉ chứa ký tự thường, ký tự in hoa không dấu và số!',\r\n name: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n username: '%s chỉ chứa ký tự thường, số, dấu chấm và dấu gạch dưới _',\r\n regexPostCode: '%s chỉ chứa ký tự thường, ký tự in hoa không dấu, số, gạch ngang -',\r\n alphaDash:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa không dấu, số, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n alphaVN: '%s chỉ chứa ký tự thường và ký tự in hoa có dấu!',\r\n alphaNumericVN: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu và số!',\r\n alphaDashVN:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n alphaDashNameVN: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu và ít nhất 2 ký tự!',\r\n unitName: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, gạch dưới _ hoặc gạch ngang -',\r\n date: '%s không đúng định dạng năm tháng ngày (YYYY-MM-DD)!',\r\n time: '%s không đúng định dạng giờ phút giây (HH:MM:SS)!',\r\n dateTime: '%s không đúng định dạng năm tháng ngày giờ phút giây (YYYY-MM-DD HH:MM:SS)!',\r\n dateVN: '%s không đúng định dạng ngày tháng năm (DD/MM/YYYY)!',\r\n dateTimeVN: '%s không đúng định dạng ngày tháng năm giờ phút giây (DD/MM/YYYY HH:MI:SS)!',\r\n dateShortTimeVN: '%s không đúng định dạng ngày tháng năm giờ phút (DD/MM/YYYY HH:MI)!',\r\n integer: '%s phải là số nguyên!',\r\n decimal: '%s phải là số thập phân!',\r\n ipAddress: '%s không đúng định dạng địa chỉ IP!',\r\n base64: '%s không đúng định dạng Base64!',\r\n intergerNotZero: '%s phải là số nguyên dương khác 0!',\r\n link_location: '%s không đúng định dạng!',\r\n link: '%s không đúng định dạng!',\r\n codeHsda: \"%s chỉ chứa các chữ cái in hoa không dấu, số và dấu '.', '_', '-'\",\r\n code: \"%s chỉ chứa các chữ cái in hoa không dấu, số và dấu '.', '_', '-', '/'\",\r\n // code: \"%s chỉ chứa các chữ cái in hoa,chữ cái thường không dấu, số và dấu '.', '_', '-'\",\r\n accountName: '%s chỉ bao gồm các kí tự từ A-Z, các số từ 0-9 và ít nhất 2 ký tự',\r\n name_or_fullName: '',\r\n // pwdErrorTip:\r\n // \"%s phải có ít nhất 8 ký tự. Ít nhất 1 ký tự hoa, số, ký tự thường và ký tự đặc biệt\",\r\n phoneNumber:\r\n 'Số điện thoại không hợp lệ (Gợi ý: Số điện thoại phải bắt đầu bằng đầu số 02, 03, 05, 07, 08, 09 hoặc +84 và có độ dài 10-11 ký tự)',\r\n seqNum: '(Gợi ý: Thứ tự hiển thị phải là dạng số và có giá trị từ 1-100)',\r\n link_basemap: '%s không đúng định dạng!',\r\n passwordRegex:\r\n '%s phải có ít nhất 8 ký tự. Ít nhất 1 ký tự hoa, ký tự thường, số và ký tự đặc biệt',\r\n alphaDashBreakLineVN:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n citizenId: '%s phải đúng định dạng 12 số!',\r\n businessCode: '',\r\n};\r\n","import { PATTERN_PRESETS } from '../../consts/validators/pattern.const';\r\n\r\nexport const resolvePattern = (\r\n pattern: string | RegExp | undefined,\r\n): {\r\n type: 'regexKey' | 'regexString' | 'regexObject' | 'unknown';\r\n value: string | RegExp;\r\n} => {\r\n if (!pattern) return { type: 'unknown', value: '' };\r\n\r\n // Trường hợp là RegExp thực sự\r\n if (pattern instanceof RegExp) return { type: 'regexObject', value: pattern };\r\n\r\n // Trường hợp là tên preset (ưu tiên nếu trùng)\r\n if (pattern in PATTERN_PRESETS) {\r\n return { type: 'regexKey', value: PATTERN_PRESETS[pattern] };\r\n }\r\n\r\n try {\r\n // Trường hợp là chuỗi regex dạng \"^abc$\"\r\n return { type: 'regexString', value: new RegExp(pattern) };\r\n } catch (err) {\r\n console.warn(`Không thể parse pattern \"${pattern}\"`, err);\r\n return { type: 'unknown', value: '' };\r\n }\r\n};\r\n","import { PATTERN_ERROR_MESSAGES } from '../../consts/validators/pattern.const';\r\nimport { resolvePattern } from './pattern';\r\n\r\nexport const getDefaultPatternErrorMessage = (label: string, pattern: string | RegExp): string => {\r\n let finalErrorMessage = '';\r\n const resolvePatternResult = resolvePattern(pattern);\r\n\r\n // if (resolvePatternResult?.type === 'unknown') {\r\n // return finalErrorMessage; // Không phải pattern hợp lệ\r\n // }\r\n\r\n if (resolvePatternResult.type === 'regexObject') {\r\n finalErrorMessage = `${label || 'Trường này'} không hợp lệ!`;\r\n }\r\n\r\n if (resolvePatternResult.type === 'regexKey') {\r\n const patternMess = PATTERN_ERROR_MESSAGES?.[pattern as string] ?? '';\r\n finalErrorMessage = `${label || 'Trường này'} không hợp lệ! ${patternMess.replace(/%s/g, () => label)}`;\r\n }\r\n\r\n return finalErrorMessage;\r\n};\r\n\r\nexport const getDefaultMinLengthErrorMessage = (label: string, errorValue: any): string => {\r\n return `${label || 'Trường này'} cần tối thiểu ${errorValue.requiredLength} ký tự`;\r\n};\r\n\r\nexport const getDefaultMaxLengthErrorMessage = (label: string, errorValue: any): string => {\r\n return `${label || 'Trường này'} cần đât thiểu ${errorValue.requiredLength} ký tự`;\r\n};\r\n\r\nexport const getDefaultAcptMimeTypesErrorMessage = (typeString: string): string => {\r\n return `Tập tin tải lên không được hỗ trợ. Vui lòng tải các tập tin có định dạng ${typeString}`;\r\n};\r\n\r\nexport const getDefaultMaxSizeInMBErrorMessage = (maxSizeInMB: number): string => {\r\n return `Kích thước tập tin tải lên không được phép vượt quá ${maxSizeInMB} MB`;\r\n};\r\n\r\nexport const getLeadingSpaceErrorMessage = (label: string): string => {\r\n return `${label || 'Trường này'} không được bắt đầu bằng khoảng trắng`;\r\n};\r\n","import { FormControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport { FIELD_TYPES } from '../../consts/fields';\r\nimport { matchFieldsValidator } from '../../utils/validators';\r\nimport { FieldGrid } from './field-grid.model';\r\nimport { NzLabelAlignType } from 'ng-zorro-antd/form';\r\nimport { CommonValidaterEnum, CustomValidaterEnum } from '../../enums/validators';\r\nimport { ControlType } from '../controls';\r\nimport { FormMode } from '../form';\r\nimport { FormModeEnum } from '../../enums/form';\r\nimport { uuidGenerator } from '../../utils/common';\r\nimport { ViewMode } from '../common';\r\nimport { ViewModeEnum } from '../../enums/common';\r\n\r\n/**\r\n * typeof FIELD_TYPES[number] có nghĩa là:\r\n - FIELD_TYPES là readonly ['input', 'select', 'checkbox']\r\n - FIELD_TYPES[number] = FIELD_TYPES[0] | FIELD_TYPES[1] | ... = 'input' | 'select' | 'checkbox'\r\n => FieldType = 'input' | 'select' | 'checkbox'\r\n*/\r\nexport type FieldType = (typeof FIELD_TYPES)[number];\r\n\r\n/**\r\n * Abstract class chung cho Field.\r\n */\r\nexport abstract class BaseField<T> {\r\n id: string;\r\n\r\n // Giá trị Binding với Reactive Form dùng ở formControlName.\r\n key!: string;\r\n\r\n // Nhãn hiển thị tên của Field.\r\n label!: string;\r\n\r\n // Giá trị của Field.\r\n value?: T;\r\n\r\n // Giá trị ban đầu để reset.\r\n initialValue?: T;\r\n\r\n // Giá gốc từ model.\r\n modelValue?: T;\r\n\r\n // Loại Field: input-text, single-select,...\r\n type!: FieldType;\r\n\r\n // Loại control: input, select,... gom nhóm các dạng field.\r\n controlType!: ControlType;\r\n\r\n // Nhãn hint.\r\n placeholder?: string;\r\n\r\n // Hiển thị text khi hover.\r\n tooltip?: string;\r\n\r\n /** Props validation chung */\r\n required: boolean;\r\n\r\n /** Props validation custom chung */\r\n matchField?: string;\r\n\r\n icon?: string;\r\n\r\n // Custom error message theo validation props.\r\n errorMessages?: Record<string, string>;\r\n\r\n // Grid layout của Field.\r\n grid: FieldGrid;\r\n\r\n // Grid layout của Label nằm trong Field.\r\n labelGrid: FieldGrid;\r\n\r\n // Vị trí của Label khi ở trong một khối cụ thể.\r\n labelAlign: NzLabelAlignType;\r\n\r\n // Grid layout của Control nằm trong Field.\r\n controlGrid: FieldGrid;\r\n\r\n // Ẩn field và không thao tác bất kì gì liên quan.\r\n isHidden: boolean;\r\n\r\n // Vô hiệu hóa field.\r\n isDisabled: boolean;\r\n\r\n // Đánh dấu giá trị của field sẽ cần cho field khác có thuộc tính dependsOn.\r\n isParent: boolean;\r\n\r\n // Cho phép gán first data ở cả mode add hoặc edit hay không.\r\n allowSetValue: FormMode[];\r\n\r\n // Gom nhóm field theo mã của nhóm. Mã này sẽ config theo code của FieldGroup model và config ở FE.\r\n groupCode?: string; // Không thuộc nhóm thì bỏ trống hoặc điền None.\r\n\r\n // Mode view: form (view theo control được disable) hoặc text (chỉ hiện thị text có thể là paragraph). Riêng upload thì không áp dụng vì không phân biệt control.\r\n viewMode: ViewMode;\r\n\r\n // Nhãn phu hiển thị tên của Field.\r\n sublabel?: string;\r\n\r\n // Thứ tự hiển thị của field\r\n seqNum: number = 0;\r\n\r\n // Cho phép field phát sự kiện change khi thay đổi giá trị.\r\n enableFieldChange: boolean;\r\n\r\n constructor(init?: Partial<BaseField<T>>) {\r\n if (!init?.key || !init?.label) {\r\n throw new Error('key, label, and type are required');\r\n }\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở BaseField.\r\n */\r\n this.id = uuidGenerator();\r\n this.required = false;\r\n this.grid = { xs: 24 };\r\n this.labelGrid = { xs: 24 };\r\n this.controlGrid = { xs: 24 };\r\n this.labelAlign = 'left';\r\n this.isHidden = false;\r\n this.isDisabled = false;\r\n this.isParent = false;\r\n this.allowSetValue = [FormModeEnum.Add, FormModeEnum.Edit, FormModeEnum.View];\r\n this.viewMode = ViewModeEnum.form;\r\n this.enableFieldChange = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo control cho từng loại field.\r\n abstract toFormControl(): FormControl;\r\n\r\n // Default value ban đầu cho từng loại field.\r\n abstract getDefaultValue(): T;\r\n\r\n abstract toFormValue(modelValue: unknown): T;\r\n\r\n // Tạo các validate chung cho các props ở abstract. this khi gọi trong class con sẽ đại diện cho đối tượng tạo từ class đó.\r\n protected getCommonValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (this.required) validators.push(Validators.required);\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo các validate custom chung cho các props ở abstract. this khi gọi trong class con sẽ đại diện cho đối tượng tạo từ class đó.\r\n protected getCustomValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (this.matchField) validators.push(matchFieldsValidator(this.matchField));\r\n\r\n return validators;\r\n }\r\n\r\n getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n if (errorKey === CommonValidaterEnum.Required) {\r\n return `${this.label || 'Trường này'} là bắt buộc`;\r\n }\r\n\r\n if (errorKey === CustomValidaterEnum.MatchField) {\r\n const matchKey = this.matchField;\r\n const targetLabel = allFields.find(f => f.key === matchKey)?.label || matchKey;\r\n return `${this.label} không khớp với ${targetLabel}`;\r\n }\r\n\r\n return '';\r\n }\r\n}\r\n","import { FormControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport { INPUT_FIELD_TYPES } from '../../../consts/fields/input-field.const';\r\nimport { BaseField } from '../field.model';\r\nimport { noLeadingSpaceValidator } from '../../../utils/validators/custom-validators';\r\nimport { resolvePattern } from '../../../utils/validators/pattern';\r\nimport { CommonValidaterEnum, CustomValidaterEnum } from '../../../enums/validators';\r\nimport {\r\n getDefaultMaxLengthErrorMessage,\r\n getDefaultMinLengthErrorMessage,\r\n getDefaultPatternErrorMessage,\r\n getLeadingSpaceErrorMessage,\r\n} from '../../../utils/validators';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\nimport { Suffix } from '../../common/common.model';\r\n\r\n/**\r\n * typeof FIELD_TYPES[number] có nghĩa là:\r\n - INPUT_FIELD_TYPES là readonly ['text','email','password','number']\r\n - INPUT_FIELD_TYPES[number] = INPUT_FIELD_TYPES[0] | INPUT_FIELD_TYPES[1] | ... = 'text' | 'email' | ...\r\n => FieldType = 'input' | 'select' | 'checkbox'\r\n*/\r\nexport type InputFieldType = (typeof INPUT_FIELD_TYPES)[number];\r\n\r\nconst DEFAULT_INPUT_VALUE = '';\r\n\r\n/**\r\n * Interface base chung cho Các dạng Input Field.\r\n */\r\nexport abstract class InputBaseField extends BaseField<string> {\r\n suffixes: Suffix[];\r\n\r\n /**\r\n * Props validation chung cho các dạng Input.\r\n */\r\n // Độ dài tối thiểu của chuỗi nhập vào.\r\n minLength?: number;\r\n // Độ dài tối đa của chuỗi nhập vào.\r\n maxLength?: number;\r\n // Theo mẫu regex hoặc đối tượng RegExr\r\n pattern?: string | RegExp;\r\n\r\n isCurrency: boolean;\r\n\r\n constructor(init: Partial<InputBaseField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input.\r\n */\r\n this.controlType = ControlTypeEnum.Input;\r\n this.value = DEFAULT_INPUT_VALUE;\r\n this.initialValue = DEFAULT_INPUT_VALUE;\r\n this.suffixes = [];\r\n this.isCurrency = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input.\r\n protected getInputCommonValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n\r\n if (this.minLength) validators.push(Validators.minLength(this.minLength));\r\n if (this.maxLength) validators.push(Validators.maxLength(this.maxLength));\r\n if (this.pattern) {\r\n const resolvePatternResult = resolvePattern(this.pattern);\r\n if (resolvePatternResult?.type !== 'unknown')\r\n validators.push(Validators.pattern(resolvePatternResult.value));\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Input.\r\n protected getInputCustomValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n validators.push(noLeadingSpaceValidator());\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputCommonValidators();\r\n const customValidators = this.getInputCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n // Giá trị mặc định.\r\n override getDefaultValue(): string {\r\n return DEFAULT_INPUT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n if (errorKey === CommonValidaterEnum.Pattern) {\r\n if (this.pattern) return getDefaultPatternErrorMessage(this.label, this.pattern);\r\n }\r\n if (errorKey === CommonValidaterEnum.MinLength)\r\n return getDefaultMinLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CommonValidaterEnum.MaxLength)\r\n return getDefaultMaxLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CustomValidaterEnum.LeadingSpace)\r\n return getLeadingSpaceErrorMessage(this.label);\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { FormControl } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { InputBaseField } from './input-field.model';\r\n\r\n/**\r\n * Interface của Input Field type là Text.\r\n */\r\nexport class InputTextField extends InputBaseField {\r\n constructor(init: Partial<InputTextField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input Text.\r\n */\r\n this.type = FieldTypeEnum.InputText;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo Form Control cho Input Text Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputCommonValidators();\r\n const customValidators = this.getInputCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport { FieldTypeEnum, InputFieldTypeEnum } from '../../../enums/fields';\r\nimport { InputBaseField } from './input-field.model';\r\n\r\n/**\r\n * Interface của Input Field type là Password.\r\n */\r\nexport class InputPasswordField extends InputBaseField {\r\n constructor(init: Partial<InputPasswordField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input Password.\r\n */\r\n this.type = FieldTypeEnum.InputPassword;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input Password.\r\n protected getInputPasswordCommonValidators(): ValidatorFn[] {\r\n const validators = this.getInputCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi angular cho Input Password.\r\n protected getInputPasswordCustomValidators(): ValidatorFn[] {\r\n const validators = this.getInputCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Password Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputPasswordCommonValidators();\r\n const customValidators = this.getInputPasswordCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n}\r\n","import { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { BaseField } from '../../models/fields/field.model';\r\nimport { FormMode } from '../../models/form';\r\nimport { FormModeEnum } from '../../enums/form';\r\nimport { SelectBaseField } from '../../models/fields/select/select-base-field.model';\r\nimport { InputPasswordField } from '../../models/fields/input';\r\nimport { FieldTypeEnum } from '../../enums/fields';\r\n\r\nexport const buildForm = (\r\n fields: BaseField<any>[],\r\n mode: FormMode,\r\n model?: Record<string, any>,\r\n): FormGroup => {\r\n const groupObj: Record<string, AbstractControl<any, any>> = {};\r\n // console.log(\"model\", model);\r\n\r\n for (const field of fields) {\r\n // Loại bỏ nếu quyết định ẩn field đi.\r\n if (field.isHidden) continue;\r\n // Nếu là dạng InputPasswordField nhưng ở mode edit và view thì không được dùng.\r\n if (\r\n field instanceof InputPasswordField &&\r\n (mode === FormModeEnum.Edit || mode === FormModeEnum.View)\r\n )\r\n continue;\r\n\r\n const fieldKey = field?.key;\r\n // field.value = field.allowSetValue ? (model?.[fieldKey] || field.value) : null;\r\n\r\n if (field.allowSetValue) {\r\n field.value = field.getDefaultValue();\r\n field.modelValue = null;\r\n if (model?.[fieldKey]) {\r\n field.value = field.toFormValue(model[fieldKey]);\r\n field.modelValue = model[fieldKey];\r\n }\r\n\r\n field.initialValue = field.value;\r\n }\r\n // console.log(\"e\", field.value );\r\n // field.value = field.allowSetValue ? field.toFormValue(model?.[fieldKey] | field.getDefaultValue()) : field.getDefaultValue();\r\n const control = field.toFormControl();\r\n control.reset(field.value);\r\n if (field.isDisabled) {\r\n //console.log(field.key, 'dfdfdfdf');\r\n\r\n control?.disable();\r\n }\r\n groupObj[fieldKey] = control;\r\n }\r\n\r\n return new FormGroup(groupObj);\r\n};\r\n\r\n// Tạo placeholder mặc định cho các dạng Input, Textarea.\r\nexport const createPlaceholder = (field: BaseField<any>): string => {\r\n const placeholder = field?.placeholder;\r\n if (placeholder) return placeholder;\r\n\r\n const label = field?.label;\r\n if (label) return `Nhập ${label?.toLowerCase()}`;\r\n\r\n return `Nhập ${field.key?.toLowerCase()}`;\r\n};\r\n\r\n// Tạo placeholder mặc định cho các dạng Select.\r\nexport const createSelectPlaceholder = <K>(field: SelectBaseField<K>): string => {\r\n const placeholder = field?.placeholder;\r\n if (placeholder) return placeholder;\r\n\r\n const label = field?.label;\r\n if (label) {\r\n const isSingleSelect = field?.type === FieldTypeEnum.SingleSelect;\r\n return `Chọn ${isSingleSelect ? '' : 'các'} ${label?.toLowerCase()}`;\r\n }\r\n\r\n return `Nhập ${field.key?.toLowerCase()}`;\r\n};\r\n","import { TemplateRef } from '@angular/core';\r\nimport { BaseField } from './field.model';\r\n\r\n// Dữ liệu sau khi đã tiến hành xử lý gom nhóm từ fields và groups.\r\nexport class GroupedFields {\r\n noGroup: BaseField<any>[];\r\n grouped: {\r\n group: FieldGroup;\r\n fields: BaseField<any>[];\r\n }[];\r\n\r\n constructor(init: Partial<GroupedFields>) {\r\n this.noGroup = [];\r\n this.grouped = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n}\r\n\r\n// Đại diện cho 1 group.\r\nexport class FieldGroup {\r\n // Nhãn của nhóm field.\r\n label!: string;\r\n\r\n // Mã nhóm field.\r\n code!: string;\r\n\r\n template?: TemplateRef<any>;\r\n\r\n // Thứ tự hiển thị nhóm field.\r\n order!: number;\r\n\r\n // Có mở sẵn collapse hay không?\r\n isActive: boolean;\r\n\r\n showArrow: boolean;\r\n\r\n required: boolean;\r\n\r\n disabled: boolean;\r\n\r\n constructor(init: Partial<FieldGroup>) {\r\n this.isActive = false;\r\n this.showArrow = true;\r\n this.disabled = false;\r\n this.required = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n}\r\n","import { ControlTypeEnum } from '../../enums/controls';\r\nimport { FieldTypeEnum, InputFieldTypeEnum } from '../../enums/fields';\r\nimport { DateFieldTypeEnum } from '../../enums/fields/date-field.enum';\r\nimport { SelectFieldTypeEnum } from '../../enums/fields/select-field.enum';\r\nimport { UploadFieldTypeEnum } from '../../enums/fields/upload-field.enum';\r\nimport { DatePickerField } from '../../models/fields/date/date-picker-field.model';\r\nimport { DateRangeField } from '../../models/fields/date/date-range-field.model';\r\nimport { FieldGroup, GroupedFields } from '../../models/fields/field-group.model';\r\nimport { BaseField } from '../../models/fields/field.model';\r\nimport { InputPasswordField, InputTextField } from '../../models/fields/input';\r\nimport { MultiSelectField } from '../../models/fields/select/multi-select-field.model';\r\nimport { SingleSelectField } from '../../models/fields/select/single-select-field.model';\r\nimport { AvatarUploadField } from '../../models/fields/upload/avatar-upload-field.model';\r\nimport { MultiFileUploadField } from '../../models/fields/upload/multi-file-upload-field.model';\r\nimport { SingleFileUploadField } from '../../models/fields/upload/single-file-upload-field.model';\r\n\r\nexport const isInputTextField = (field: BaseField<any>): field is InputTextField => {\r\n return field.controlType === ControlTypeEnum.Input && field.type === FieldTypeEnum.InputText;\r\n};\r\n\r\nexport const isInputPasswordField = (field: BaseField<any>): field is InputPasswordField => {\r\n return field.controlType === ControlTypeEnum.Input && field.type === FieldTypeEnum.InputPassword;\r\n};\r\n\r\nexport const isSingleSelectField = (field: BaseField<any>): field is SingleSelectField => {\r\n return field.controlType === ControlTypeEnum.Select && field.type === FieldTypeEnum.SingleSelect;\r\n};\r\n\r\nexport const isMultiSelectField = (field: BaseField<any>): field is MultiSelectField => {\r\n return field.controlType === ControlTypeEnum.Select && field.type === FieldTypeEnum.MultiSelect;\r\n};\r\n\r\nexport const isDatePickerField = (field: BaseField<any>): field is DatePickerField => {\r\n return field.controlType === ControlTypeEnum.Date && field.type === FieldTypeEnum.DatePicker;\r\n};\r\n\r\nexport const isDateRangeField = (field: BaseField<any>): field is DateRangeField => {\r\n return field.controlType === ControlTypeEnum.Date && field.type === FieldTypeEnum.DateRange;\r\n};\r\n\r\nexport const isSingleFileUploadField = (field: BaseField<any>): field is SingleFileUploadField => {\r\n return (\r\n field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.SingleFileUpload\r\n );\r\n};\r\n\r\nexport const isMultiFileUploadField = (field: BaseField<any>): field is MultiFileUploadField => {\r\n return (\r\n field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.MultiFileUpload\r\n );\r\n};\r\n\r\nexport const isAvatarUploadField = (field: BaseField<any>): field is AvatarUploadField => {\r\n return field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.AvatarUpload;\r\n};\r\n\r\n// Tạo FieldGroup render UI từ thông tin fields và groups truyền vào cho dynamic-form.\r\nexport const buildGroupedFields = (\r\n fields: BaseField<any>[],\r\n groups: FieldGroup[] = [],\r\n): GroupedFields => {\r\n const noGroup = fields.filter(\r\n field => !field?.groupCode || field?.groupCode.toLowerCase() === 'none',\r\n );\r\n\r\n const sortedGroups = [...groups].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n const grouped = sortedGroups\r\n .map(group => ({\r\n group,\r\n fields: fields.filter(field => field.groupCode?.toLowerCase() === group.code.toLowerCase()),\r\n }))\r\n .filter(groupedFields => groupedFields.fields.length > 0);\r\n\r\n return new GroupedFields({\r\n noGroup,\r\n grouped,\r\n });\r\n};\r\n","import { InjectionToken } from '@angular/core';\n\nexport interface DynamicFormConfig {\n prefix: string;\n mainApiUrl: string;\n systemApiUrl: string;\n portalApiUrl: string;\n storageUrl: string;\n}\n\nexport const DYNAMIC_FORM_CONFIG = new InjectionToken<DynamicFormConfig>('DYNAMIC_FORM_CONFIG');\n","import { format } from 'date-fns';\n\nexport class FormUtils {\n public static makeFileNameEncode(str: string): string {\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\n str = str.replace(/đ/g, 'd');\n str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, 'A');\n str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, 'E');\n str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, 'I');\n str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, 'O');\n str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, 'U');\n str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, 'Y');\n str = str.replace(/Đ/g, 'D');\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, ''); \n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, ''); \n return str;\n }\n\n public static randomFileName(name: string): string {\n const ns = name.split('.');\n const extension = ns.pop();\n const encodedName = FormUtils.makeFileNameEncode(ns.join('.'));\n return `${encodedName}_${Math.floor(Math.random() * 90000) + 10000}.${extension}`.toLocaleLowerCase();\n }\n\n public static convertViewDate(date: unknown, ft: string = 'dd/MM/yyyy'): string {\n let d: Date | null = null;\n if (date instanceof Date) {\n d = date;\n } else if (typeof date === 'string') {\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(date)) {\n d = new Date(date);\n } else if (/^\\d{2}\\/\\d{2}\\/\\d{4}\\s\\d{2}:\\d{2}:\\d{2}$/.test(date)) {\n const [datePart, timePart] = date.split(' ');\n const [month, day, year] = datePart.split('/').map(Number);\n const [hour, min, sec] = timePart.split(':').map(Number);\n d = new Date(year, month - 1, day, hour, min, sec);\n } else {\n const parsed = new Date(date);\n if (!isNaN(parsed.getTime())) {\n d = parsed;\n }\n }\n }\n return d && !isNaN(d.getTime()) ? format(d, ft) : '';\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DYNAMIC_FORM_CONFIG } from '../config/dynamic-form.config';\nimport { FormUtils } from './form-utils';\n\n@Injectable({ providedIn: 'root' })\nexport class FormConfigService {\n private config = inject(DYNAMIC_FORM_CONFIG);\n\n public handleApiUrlCreation(apiUrlFromApi: string, typeGrpCode?: string): string {\n if (!apiUrlFromApi) return '';\n let newApiUrl = '';\n const domain = apiUrlFromApi.split('/')[0];\n\n let newDomain = '';\n switch (domain.toLowerCase()) {\n case '{mainapiurl}':\n newDomain = this.config.mainApiUrl;\n break;\n case '{systemapiurl}':\n newDomain = this.config.systemApiUrl;\n break;\n case '{portalapiurl}':\n newDomain = this.config.portalApiUrl;\n break;\n default:\n newDomain = domain;\n }\n\n newApiUrl = apiUrlFromApi.replace(`${domain}/`, newDomain ? `${newDomain}/` : '');\n\n if (typeGrpCode) {\n newApiUrl = newApiUrl.replace('{ObjTypeGroupCode}', typeGrpCode);\n }\n\n return newApiUrl;\n }\n\n public generateRandomFileName(name: string, addition = ''): string {\n const encodedName = FormUtils.makeFileNameEncode(name);\n return `${this.config.prefix}_${addition || 'file'}_${\n Math.floor(Math.random() * 9000000000) + 1000000000\n }_${encodedName}`.toLocaleLowerCase();\n }\n\n public getViewFileUrl(fileName: string, isTemp: boolean = false): string {\n const type = isTemp ? 'temporary' : 'public';\n return `${this.config.storageUrl}${type}/${fileName}`;\n }\n\n public getStorageUrl(): string {\n return this.config.storageUrl;\n }\n}\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_TREE_SELECT_VALUE = null;\r\n\r\n/**\r\n * Interface của Select Field type là dạng Single.\r\n */\r\nexport class TreeSelectField extends SelectBaseField<string | Record<string, unknown> | null> {\r\n groupBy?: string;\r\n constructor(init: Partial<TreeSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single Select.\r\n */\r\n this.type = FieldTypeEnum.TreeSelect;\r\n this.value = DEFAULT_TREE_SELECT_VALUE;\r\n this.initialValue = DEFAULT_TREE_SELECT_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> | null {\r\n return DEFAULT_TREE_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> | null {\r\n if (!modelValue) return null;\r\n const value = modelValue as string | Record<string, unknown>;\r\n\r\n if (typeof value === 'object') {\r\n const valueFromObj = value?.[this.bindValue];\r\n const typeOfValueFromObj = typeof valueFromObj;\r\n if (typeOfValueFromObj !== 'object') return String(valueFromObj);\r\n else {\r\n console.warn('Từ bindValue nhưng đối tượng vẫn là dạng object');\r\n return '';\r\n }\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { computed, inject, Injectable, signal } from '@angular/core';\r\nimport { BaseField } from '../models/fields/field.model';\r\nimport { Extra, ObjField } from '../models/common/obj-field.model';\r\nimport { isValidJSON, lowerCaseFirstChar } from '../utils/common';\r\nimport { FieldTypeEnum } from '../enums/fields';\r\nimport { InputPasswordField, InputTextField } from '../models/fields/input';\r\nimport { TextareaField } from '../models/fields/textarea/textarea-field.model';\r\nimport { SingleSelectField } from '../models/fields/select/single-select-field.model';\r\nimport { MultiSelectField } from '../models/fields/select/multi-select-field.model';\r\nimport { DatePickerField, DateRangeField } from '../models/fields/date';\r\nimport { SingleFileUploadField } from '../models/fields/upload/single-file-upload-field.model';\r\nimport { MultiFileUploadField } from '../models/fields/upload/multi-file-upload-field.model';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { MultiImageUploadField } from '../models/fields/upload/multi-image-upload-field.model';\r\nimport { FormConfigService } from './form-config.service';\r\nimport { AvatarUploadField } from '../models/fields/upload/avatar-upload-field.model';\r\nimport { TreeSelectField } from '../models/fields/select/tree-select-field.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DynamicFormService {\r\n private formConfigService = inject(FormConfigService);\r\n\r\n /**\r\n * Lưu giữ FormGroup hiện tại của dynamic form.\r\n */\r\n private _formGroup!: FormGroup;\r\n\r\n // Lấy FormGroup.\r\n get formGroup() {\r\n return this._formGroup;\r\n }\r\n\r\n // Gán FormGroup.\r\n setFormGroup(formGroup: FormGroup) {\r\n this._formGroup = formGroup;\r\n }\r\n\r\n /**\r\n * Lưu giữ fields hiện tại của dynamic form.\r\n */\r\n private _fields!: BaseField<any>[];\r\n\r\n // Lấy fields.\r\n get fields() {\r\n return this._fields;\r\n }\r\n\r\n // Gán fields.\r\n setFields(fields: BaseField<any>[]) {\r\n this._fields = fields;\r\n }\r\n\r\n /**\r\n * Thao tác với control và fields cũng như output đầu ra của data form.\r\n */\r\n setFieldValue(fieldKey: string, rawValue: unknown) {\r\n const field = this.fields.find(f => f.key === fieldKey);\r\n if (!field) return;\r\n\r\n const formValue = field.toFormValue(rawValue);\r\n this.formGroup.get(fieldKey)?.setValue(formValue);\r\n }\r\n\r\n /**\r\n * Signal để kích hoạt submit từ bên ngoài.\r\n */\r\n private readonly _submitTrigger = signal<{ formId: string | null; time: number } | null>(null);\r\n\r\n // Lấy signal để track vào effect.\r\n get submitTrigger() {\r\n return this._submitTrigger.asReadonly();\r\n }\r\n\r\n // Tiến hành submit.\r\n triggerSubmit(formId: string | null) {\r\n this._submitTrigger.set({ formId, time: Date.now() }); // trigger tạo theo formId.\r\n }\r\n\r\n /**\r\n * Signal để kích hoạt reset từ bên ngoài.\r\n */\r\n private readonly _resetTrigger = signal<{ formId: string; time: number } | null>(null);\r\n\r\n get resetTrigger() {\r\n return this._resetTrigger.asReadonly();\r\n }\r\n\r\n triggerReset(formId: string) {\r\n if (formId) this._resetTrigger.set({ formId, time: Date.now() });\r\n }\r\n\r\n /**\r\n * Tạo mảng fields đầu vào theo mảng data từ objField.\r\n */\r\n createFieldsByObjFields(objFields: ObjField[], formType: string, options?: {}): BaseField<any>[] {\r\n let fields: BaseField<any>[] = [];\r\n\r\n // Nếu không tồn tại objFields hoặc objFields là mảng rỗng.\r\n if (!objFields || objFields.length === 0) return [];\r\n\r\n for (const objField of objFields) {\r\n // Bỏ qua những field không cấu hình.\r\n if (!objField?.extra) {\r\n continue;\r\n }\r\n\r\n // Nếu extra không phải chuỗi JSON hợp lệ.\r\n if (objField?.extra && !isValidJSON(objField?.extra)) {\r\n // console.warn(`Extra của field ${objField.code} không phải chuỗi dạng JSON`);\r\n continue;\r\n }\r\n\r\n const extra: Extra = JSON.parse(objField?.extra);\r\n if (!extra.form) {\r\n continue;\r\n }\r\n\r\n const form = extra.form;\r\n const { formTypes, configs } = form;\r\n\r\n if (!formTypes.includes(formType)) {\r\n // console.error(`Field '${objField.code}' không tồn tại formType '${formType}'`);\r\n continue;\r\n }\r\n\r\n const fieldConfig = configs?.[formType];\r\n if (!fieldConfig) {\r\n // console.error(`Field '${objField.code}' không có config field với formType '${formType}'`);\r\n continue;\r\n }\r\n\r\n const field = this.createFieldFromJson(fieldConfig, objField);\r\n if (field) {\r\n fields.push(field);\r\n } else {\r\n // console.error(`Field '${objField.code}' không có fieldType phù hợp`);\r\n continue;\r\n }\r\n }\r\n\r\n return fields.sort((a, b) => a.seqNum - b.seqNum);\r\n }\r\n\r\n private createFieldFromJson(\r\n fieldConfig: BaseField<any>,\r\n objField: ObjField,\r\n ): BaseField<any> | null {\r\n fieldConfig.key = fieldConfig?.key || lowerCaseFirstChar(objField.code) || '';\r\n fieldConfig.label = fieldConfig?.label || objField?.name || '';\r\n fieldConfig.groupCode = fieldConfig.groupCode ?? objField.viewType ?? '';\r\n fieldConfig.seqNum = fieldConfig.seqNum ?? objField.seqNum;\r\n fieldConfig.required = fieldConfig.required ?? objField.required === 3;\r\n\r\n const fieldType = fieldConfig.type;\r\n if (fieldType === FieldTypeEnum.InputText) {\r\n return new InputTextField({ ...(fieldConfig as InputTextField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.InputPassword) {\r\n return new InputPasswordField({ ...(fieldConfig as InputPasswordField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.Textarea) {\r\n return new TextareaField({ ...(fieldConfig as TextareaField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.SingleSelect) {\r\n const singleSelect = fieldConfig as SingleSelectField;\r\n if (!singleSelect.apiConfig) {\r\n singleSelect.apiConfig = { baseUrl: this.formConfigService.handleApiUrlCreation(objField.apiURL || '', objField.objTypeGroupCode) };\r\n }\r\n return new SingleSelectField({ ...singleSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiSelect) {\r\n const multiSelect = fieldConfig as MultiSelectField;\r\n if (!multiSelect.apiConfig) {\r\n multiSelect.apiConfig = { baseUrl: this.formConfigService.handleApiUrlCreation(objField.apiURL || '', objField.objTypeGroupCode) };\r\n }\r\n return new MultiSelectField({ ...multiSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.TreeSelect) {\r\n const treeSelect = fieldConfig as TreeSelectField;\r\n if (!treeSelect.apiConfig) {\r\n treeSelect.apiConfig = {\r\n baseUrl: this.formConfigService.handleApiUrlCreation(objField.apiURL || '', objField.objTypeGroupCode),\r\n };\r\n }\r\n return new TreeSelectField({ ...treeSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.DatePicker) {\r\n return new DatePickerField({ ...(fieldConfig as DatePickerField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.DateRange) {\r\n return new DateRangeField({ ...(fieldConfig as DateRangeField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.SingleFileUpload) {\r\n return new SingleFileUploadField({ ...(fieldConfig as SingleFileUploadField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiFileUpload) {\r\n return new MultiFileUploadField({ ...(fieldConfig as MultiFileUploadField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.AvatarUpload) {\r\n return new AvatarUploadField({ ...(fieldConfig as AvatarUploadField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiImageUpload) {\r\n return new MultiImageUploadField({ ...(fieldConfig as MultiImageUploadField) });\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable, Signal, signal, WritableSignal } from '@angular/core';\r\nimport { ApiResponse } from '../models/common/api-response.model';\r\nimport { LastChangedParent } from '../models/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FieldService {\r\n private httpClient = inject(HttpClient);\r\n\r\n // Options for dropdown.\r\n getAllOptions<T = Record<string, unknown>>(apiUrl: string, queryParams: Record<string, unknown>) {\r\n return this.httpClient.get<ApiResponse<T[]>>(apiUrl, {\r\n params: { ...(queryParams as { [key: string]: any }) },\r\n });\r\n }\r\n\r\n private dependValuesMap = new Map<string, WritableSignal<string>>();\r\n\r\n updateDependValuesMap(key: string, value: string): void {\r\n if (!this.dependValuesMap.has(key)) {\r\n this.dependValuesMap.set(key, signal(value));\r\n return;\r\n }\r\n\r\n const fieldSignal = this.dependValuesMap.get(key)!;\r\n fieldSignal.set(value);\r\n }\r\n\r\n getDependValuesMap(): Map<string, Signal<string>> {\r\n return this.dependValuesMap;\r\n }\r\n\r\n // Signal lưu trữ đối tượng chứa các prop là fieldKey có isParent là true.\r\n private dependValues = signal<Record<string, string>>({});\r\n\r\n // Cập nhật giá trị theo key vào đối tượng của signal.\r\n updateDependValues(key: string, value: string): void {\r\n this.dependValues.update(curr => ({ ...curr, [key]: value }));\r\n }\r\n // Xóa giá trị và loại bỏ key theo key khỏi đối tượng của signal.\r\n removeDependValues(key: string): void {\r\n this.dependValues.update(({ [key]: _, ...rest }) => rest);\r\n }\r\n\r\n getDependValues(): Record<string, string> {\r\n return this.dependValues();\r\n }\r\n\r\n clearDependValues(): void {\r\n this.dependValues.set({});\r\n }\r\n\r\n // Lấy trị trị theo key.\r\n getValueProp(key: string) {\r\n return this.dependValues()[key];\r\n }\r\n\r\n // Signal lưu giữ xem field có isParent gần nhất vừa change giá trị.\r\n private lastChangedParent = signal<LastChangedParent | null>(null);\r\n\r\n // Cập nhật key của parent gần nhất change.\r\n updateLastChangedParent(key: string, value: unknown): void {\r\n this.lastChangedParent.set({ key, value });\r\n }\r\n\r\n // Lấy ra key của parent gần nhất change.\r\n getLastChangedParent(): LastChangedParent | null {\r\n return this.lastChangedParent();\r\n }\r\n\r\n clearLastChangedParent(): void {\r\n this.lastChangedParent.set(null);\r\n }\r\n\r\n // Field change cho bên ngoài form\r\n private fieldChange = new Subject<{\r\n key: string;\r\n value: any;\r\n }>();\r\n\r\n fieldChange$ = this.fieldChange.asObservable(); // expose ra ngoài.\r\n\r\n onFieldChange(key: string, value: any) {\r\n this.fieldChange.next({\r\n key,\r\n value,\r\n });\r\n }\r\n}\r\n","import { Injectable, signal, untracked, WritableSignal } from '@angular/core';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FormDataService {\r\n // Lưu một hoặc nhiều form data.\r\n private formDataMap = new Map<string, WritableSignal<Record<string, unknown>>>();\r\n\r\n /**\r\n * Kiểm tra xem đã tồn tại form data với form id truyền vào.\r\n * @param formId Id của form.\r\n * @returns true nếu có và ngược lại\r\n */\r\n has(formId: string): boolean {\r\n if (!this.formDataMap.has(formId)) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Cập nhật giá trị của một hoặc nhiều field vào form data theo form id.\r\n * @param formId Id của form.\r\n * @param data Đối tượng các field theo dạng key:value.\r\n */\r\n patch(formId: string, data: Record<string, unknown>) {\r\n // Lấy form data từ formDataMap.\r\n let formData = this.formDataMap.get(formId);\r\n\r\n // Nếu chưa có form data trong formDataMap thì thêm mới. Ngược lại cập nhật field data vào formData.\r\n if (!formData) {\r\n formData = signal(data);\r\n } else {\r\n formData.update(curr => ({ ...curr, ...data }));\r\n }\r\n\r\n // Tiến hành cập nhật vào formDataMap.\r\n this.formDataMap.set(formId, formData);\r\n }\r\n\r\n /**\r\n * Gán form data theo form id.\r\n * @param formId Id của form.\r\n * @param data Đối tượng các field theo dạng key:value.\r\n */\r\n set(formId: string, data: Record<string, unknown>) {\r\n this.formDataMap.set(formId, signal(data));\r\n }\r\n\r\n /**\r\n * Lấy giá trị của form data theo form id có track signal.\r\n * @param formId Id của form.\r\n * @returns Record<string, unknown> nếu có giá trị. Ngược lại undefined.\r\n */\r\n get(formId: string): Record<string, unknown> | undefined {\r\n const formData = this.formDataMap.get(formId);\r\n\r\n if (!formData) return undefined;\r\n\r\n return formData();\r\n }\r\n\r\n /**\r\n * Lấy giá trị của form data theo form id không track signal.\r\n * @param formId Id của form.\r\n * @returns Record<string, unknown> nếu có giá trị. Ngược lại undefined.\r\n */\r\n getSnapshot(formId: string): Record<string, unknown> | undefined {\r\n const formData = this.formDataMap.get(formId);\r\n\r\n if (!formData) return undefined;\r\n\r\n return untracked(() => formData());\r\n }\r\n\r\n /**\r\n * Clear giá trị form data theo form id. Clear chứ không xóa khỏi formDataMap hoàn toàn.\r\n * @param formId Id của form.\r\n */\r\n clear(formId: string) {\r\n let formData = this.formDataMap.get(formId);\r\n\r\n if (formData) {\r\n formData.set({});\r\n this.formDataMap.set(formId, formData);\r\n }\r\n }\r\n\r\n /**\r\n * Delete form data theo form id khỏi formDataMap.\r\n * @param formId Id của form.\r\n */\r\n delete(formId: string) {\r\n let formData = this.formDataMap.get(formId);\r\n if (formData) this.formDataMap.delete(formId);\r\n }\r\n\r\n /**\r\n *\r\n * @param formId Id của form.\r\n * @param key mã trường trong object form data.\r\n * @returns unknown.\r\n */\r\n getFieldValue(formId: string, key: string): unknown {\r\n let formData = this.formDataMap.get(formId);\r\n let fieldValue: unknown = undefined;\r\n\r\n if (formData) {\r\n fieldValue = formData()?.[key];\r\n }\r\n\r\n return fieldValue;\r\n }\r\n}\r\n","import { computed, Directive, inject, input, Input, untracked } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor } from '@angular/forms';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { FormMode } from '../models/form';\r\nimport { FormModeEnum } from '../enums/form';\r\nimport { DynamicFormService } from '../services/dynamic-form.service';\r\nimport { FieldService } from '../services/field.service';\r\nimport { LastChangedParent } from '../models/common';\r\nimport { BaseField } from '../models/fields/field.model';\r\nimport { ViewModeEnum } from '../enums/common';\r\nimport { FormDataService } from '../services/form-data.service';\r\n\r\n@Directive() // Dùng @Directive vì class này không có template riêng\r\nexport abstract class BaseValueAccessor<T> implements ControlValueAccessor {\r\n // Control theo dạng field lấy từ reactive form.\r\n @Input({ required: true }) formId!: string;\r\n\r\n readonly fieldInput = input.required<BaseField<T>>();\r\n protected readonly fieldKey = untracked(() => computed<string>(() => this.fieldInput().key));\r\n\r\n @Input({ required: false }) control: AbstractControl<T> | null = null;\r\n\r\n // Chế độ form: Add, Edit, View...\r\n readonly modeSignal = input<FormMode>(FormModeEnum.Add);\r\n\r\n readonly isAdd = computed(() => this.modeSignal() === 'add');\r\n readonly isEdit = computed(() => this.modeSignal() === 'edit');\r\n readonly isView = computed(() => this.modeSignal() === 'view');\r\n readonly isAddOrEdit = computed(() => ['add', 'edit'].includes(this.modeSignal()));\r\n readonly isEditOrView = computed(() => ['edit', 'view'].includes(this.modeSignal()));\r\n\r\n protected readonly formModeEnum = FormModeEnum;\r\n protected readonly viewModeEnum = ViewModeEnum;\r\n\r\n protected readonly destroy$ = new Subject<void>();\r\n\r\n // Dành cho ControlValueAccessor.\r\n protected value: T | null = null;\r\n protected onChange: (value: T | null) => void = () => {};\r\n protected onTouched: () => void = () => {};\r\n isDisabled = false;\r\n\r\n protected dFormService = inject(DynamicFormService);\r\n protected formDataService = inject(FormDataService);\r\n protected fieldService = inject(FieldService);\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n protected takeUntilDestroy<T>() {\r\n return takeUntil<T>(this.destroy$);\r\n }\r\n\r\n writeValue(value: T | null): void {\r\n this.value = value;\r\n this.writeValueToView(value); // 👈 component con override nếu cần.\r\n }\r\n\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.setDisabledOnView(isDisabled);\r\n }\r\n\r\n protected propagateValue(value: T | null): void {\r\n this.value = value;\r\n this.onChange(this.value);\r\n // Khi thay đổi value.\r\n this.handleValueChange(value);\r\n }\r\n\r\n // Xử lý reset chung ban đầu.\r\n protected reset(): void {\r\n if (!this.control || !this.isAddOrEdit()) return;\r\n const baseField = untracked(() => this.fieldInput());\r\n this.control.reset(baseField.initialValue as T);\r\n }\r\n\r\n /**\r\n * Thêm dữ liệu ở từng dạng field vào form data theo form id cụ thể.\r\n * @param key Mã của field.\r\n * @param value Giá trị của field.\r\n */\r\n protected patchFormData(key: string, value: T | null): void {\r\n this.formDataService.patch(this.formId, { [key]: value });\r\n }\r\n\r\n // Update data ở từng prop vào dependValuesSignal. Cơ chế nếu falsy thì không được phép cho vào dependValuesSignal.\r\n protected updateDependValues(key: string, value: string): void {\r\n this.fieldService.removeDependValues(key);\r\n if (value) {\r\n this.fieldService.updateDependValues(key, value);\r\n }\r\n }\r\n\r\n // Đánh dấu field có isParent là true vừa thay đổi.\r\n protected updateLastChangedParent(key: string, value: unknown): void {\r\n this.fieldService.updateLastChangedParent(key, value);\r\n }\r\n\r\n protected disableAndResetControl(): void {\r\n this.control?.reset();\r\n this.control?.disable();\r\n }\r\n\r\n protected disableControl(): void {\r\n this.control?.disable();\r\n }\r\n\r\n protected enableControl(): void {\r\n this.control?.enable();\r\n }\r\n\r\n /**\r\n * Optional: để component override riêng.\r\n */\r\n // Xử lý giao diện khi ghi giá trị mới.\r\n protected writeValueToView(value: T | null): void {}\r\n\r\n // Khi value change.\r\n protected handleValueChange(value: T | null): void {}\r\n\r\n // Xử lý giao diện khi ghi thay đổi giá trị isDisabled.\r\n protected setDisabledOnView(isDisabled: boolean): void {}\r\n\r\n // Xử lý các logic riêng của reset ở add mode.\r\n protected resetForAdd(): void {}\r\n\r\n // Xử lý các logic riêng của reset ở edit mode.\r\n protected resetForEdit(): void {}\r\n\r\n // Xử lý các logic riêng chung cuối cùng.\r\n protected finalizeReset(): void {}\r\n}\r\n","import { Component, computed, effect, forwardRef, untracked } from '@angular/core';\r\nimport { FORM_MODULES } from '../../../../consts/common';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { DatePickerField } from '../../../../models/fields/date/date-picker-field.model';\r\nimport { createPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { differenceInCalendarDays } from 'date-fns';\r\nimport { DatePickerOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { formatDateToDDMMYYYY, formatDateToYYYYMMDD } from '../../../../utils/date';\r\nimport { DatePickerOutputValueType } from '../../../../models/common/output-value-type.model';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { FormUtils } from '../../../../services/form-utils';\r\n\r\nconst ZORRO_MODULES = [NzDatePickerModule, NzInputModule];\r\n\r\n@Component({\r\n selector: 'app-date-picker',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './date-picker.component.html',\r\n styleUrls: ['./date-picker.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatePickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DatePickerComponent extends BaseValueAccessor<string | Date> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof DatePickerField) ||\r\n (base.type !== FieldTypeEnum.DatePicker && base.controlType !== ControlTypeEnum.Date)\r\n ) {\r\n throw new Error('Expected DatePickerField');\r\n }\r\n return base;\r\n });\r\n\r\n displayValue = '';\r\n\r\n // Kiểm tra có cho phép chọn ngày quá khứ hay ngày tương lai hay không?\r\n disabledDate = computed(() => {\r\n const field = this.fieldSignal();\r\n return (current: Date): boolean => {\r\n if (field.disabledDateFn) {\r\n return field.disabledDateFn(current);\r\n }\r\n const today = new Date();\r\n const diff = differenceInCalendarDays(current, today);\r\n\r\n // if (field.onlyToday) return diff !== 0;\r\n if (!field.allowPastDates && diff < 0) return true;\r\n if (!field.allowFutureDates && diff > 0) return true;\r\n\r\n return false;\r\n };\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder } = field;\r\n if (!placeholder) field.placeholder = createPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n handleChangeDate(date: Date): void {\r\n this.propagateValue(date);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: Date): void {\r\n if (this.isView()) {\r\n this.displayValue = value\r\n ? FormUtils.convertViewDate(value, this.fieldSignal().format ?? 'dd-MM-yyyy')\r\n : NO_INFO_TEXT;\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n const { outputAs } = untracked(() => this.fieldSignal());\r\n\r\n this.fieldService.updateDependValuesMap(\r\n this.fieldKey(),\r\n value ? formatDateToYYYYMMDD(value) : '',\r\n );\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value, outputAs);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: Date): void {\r\n const { outputAs, isParent } = untracked(() => this.fieldSignal());\r\n\r\n if (isParent) {\r\n this.fieldService.updateDependValuesMap(\r\n this.fieldKey(),\r\n value ? formatDateToYYYYMMDD(value) : '',\r\n );\r\n }\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value, outputAs);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n private getValueByOutputAs(date: Date, outputAs: DatePickerOutputValueType): string | Date {\r\n let value: string | Date = date;\r\n\r\n if (outputAs === DatePickerOutputValueTypeEnum.String) {\r\n value = formatDateToYYYYMMDD(value);\r\n }\r\n return value;\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n <input nz-input [value]=\"displayValue\" [disabled]=\"true\" class=\"modeView\" />\r\n} @else {\r\n <nz-date-picker\r\n [id]=\"fieldSignal().key\"\r\n [class]=\"'w-100'\"\r\n [nzDisabled]=\"isDisabled\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder!\"\r\n [nzFormat]=\"fieldSignal().format\"\r\n [nzDisabledDate]=\"disabledDate()\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"handleChangeDate($event)\"\r\n >\r\n </nz-date-picker>\r\n}\r\n","import { Component, computed, effect, forwardRef, untracked } from '@angular/core';\r\nimport { FORM_MODULES } from '../../../../consts/common';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { DateRangeField } from '../../../../models/fields/date/date-range-field.model';\r\nimport { DateRangeOutputValueType } from '../../../../models/common/output-value-type.model';\r\nimport { DateRangeOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { formatDateToYYYYMMDD, normalizeToDate } from '../../../../utils/date';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { differenceInCalendarDays } from 'date-fns';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nconst ZORRO_MODULES = [NzDatePickerModule, NzInputModule];\r\n\r\n@Component({\r\n selector: 'app-date-range',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './date-range.component.html',\r\n styleUrls: ['./date-range.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateRangeComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DateRangeComponent extends BaseValueAccessor<string | string[] | Date[]> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof DateRangeField) ||\r\n (base.type !== FieldTypeEnum.DateRange && base.controlType !== ControlTypeEnum.Date)\r\n ) {\r\n throw new Error('Expected DatePickerField');\r\n }\r\n return base;\r\n });\r\n\r\n displayValueNoInfo = '';\r\n\r\n // Kiểm tra có cho phép chọn ngày quá khứ hay ngày tương lai hay không?\r\n disabledDate = computed(() => {\r\n const field = this.fieldSignal();\r\n return (current: Date): boolean => {\r\n const today = new Date();\r\n const diff = differenceInCalendarDays(current, today);\r\n\r\n // if (field.onlyToday) return diff !== 0;\r\n if (!field.allowPastDates && diff < 0) return true;\r\n if (!field.allowFutureDates && diff > 0) return true;\r\n\r\n return false;\r\n };\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n getSelectedDateRangeFromFieldValue(fieldValue: string[] | Date[]): Date[] {\r\n let dateRange: Date[] = [];\r\n if (fieldValue?.length === 2) {\r\n const startDate = normalizeToDate(fieldValue[0]);\r\n const endDate = normalizeToDate(fieldValue[1]);\r\n if (startDate && endDate) dateRange = [startDate, endDate];\r\n }\r\n return dateRange;\r\n }\r\n\r\n handleChangeDateRange(dateRange: Date[]): void {\r\n this.propagateValue(dateRange);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: Date[]): void {\r\n if (this.isView()) {\r\n if (value.length === 0) {\r\n this.displayValueNoInfo = NO_INFO_TEXT;\r\n return;\r\n }\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n const { outputAs } = untracked(() => this.fieldSignal());\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n value.length > 0 ? this.getValueByOutputAs(value, outputAs) : null,\r\n );\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: Date[]): void {\r\n const { outputAs } = untracked(() => this.fieldSignal());\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n value.length > 0 ? this.getValueByOutputAs(value, outputAs) : null,\r\n );\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(\r\n dateRange: Date[],\r\n outputAs: DateRangeOutputValueType,\r\n ): string | string[] | Date[] {\r\n let value: string | string[] | Date[] = dateRange;\r\n\r\n if (dateRange.length > 0) {\r\n if (outputAs === DateRangeOutputValueTypeEnum.String) {\r\n value = `${formatDateToYYYYMMDD(dateRange[0])},${formatDateToYYYYMMDD(dateRange[1])}`;\r\n }\r\n\r\n if (outputAs === DateRangeOutputValueTypeEnum.StringArray) {\r\n value = [formatDateToYYYYMMDD(dateRange[0]), formatDateToYYYYMMDD(dateRange[1])];\r\n }\r\n }\r\n return value;\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n @if (value!.length > 0) {\r\n <nz-range-picker\r\n [class]=\"'w-100'\"\r\n [nzFormat]=\"fieldSignal().format\"\r\n [nzDisabled]=\"true\"\r\n [(ngModel)]=\"value\"\r\n class=\"modeView\"\r\n [nzSuffixIcon]=\"suffixIcon\"\r\n ></nz-range-picker>\r\n <ng-template #suffixIcon>\r\n <!-- Để trống, hoặc custom icon khác -->\r\n </ng-template>\r\n } @else {\r\n <input nz-input [value]=\"displayValueNoInfo\" [disabled]=\"true\" class=\"modeView\" />\r\n }\r\n} @else {\r\n <nz-range-picker\r\n [id]=\"fieldSignal().key\"\r\n class=\"w-100\"\r\n [nzDisabled]=\"isDisabled\"\r\n [nzFormat]=\"fieldSignal().format\"\r\n [nzDisabledDate]=\"disabledDate()\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder ?? ['Ngày bắt đầu', 'Ngày kết thúc']\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"handleChangeDateRange($event)\"\r\n ></nz-range-picker>\r\n}\r\n","import { Component, computed, effect, forwardRef } from '@angular/core';\r\nimport { InputPasswordField } from '../../../../models/fields/input';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { createPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\n\r\nconst ZORRO_MODULES = [NzInputModule, NzIconModule];\r\n\r\n@Component({\r\n selector: 'app-input-password',\r\n standalone: true,\r\n imports: [...ZORRO_MODULES],\r\n templateUrl: './input-password.component.html',\r\n styleUrls: ['./input-password.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputPasswordComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputPasswordComponent extends BaseValueAccessor<string> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof InputPasswordField) ||\r\n (base.type !== FieldTypeEnum.InputPassword && base.controlType !== ControlTypeEnum.Input)\r\n ) {\r\n throw new Error('Expected InputPasswordField');\r\n }\r\n return base;\r\n });\r\n\r\n passwordVisible = false;\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAdd()) {\r\n const field = this.fieldSignal();\r\n const { placeholder } = field;\r\n\r\n if (!placeholder) field.placeholder = createPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n handleChangeInputPassword(event: Event): void {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(inputValue);\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n}\r\n","<nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input\r\n nz-input\r\n [value]=\"value\"\r\n [type]=\"passwordVisible ? 'text' : 'password'\"\r\n autocomplete=\"new-password\"\r\n [placeholder]=\"fieldSignal().placeholder!\"\r\n (input)=\"handleChangeInputPassword($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n</nz-input-group>\r\n<ng-template #suffixTemplate>\r\n <span\r\n nz-icon\r\n [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"\r\n ></span>\r\n</ng-template>\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SuffixService {\r\n private suffixClick$ = new Subject<{ key: string; formId: string }>();\r\n\r\n suffixClick = this.suffixClick$.asObservable(); // expose ra ngoài.\r\n\r\n onSuffixClick(key: string, formId: string) {\r\n this.suffixClick$.next({ key, formId });\r\n }\r\n constructor() {}\r\n}\r\n","import { Component, inject, Input } from '@angular/core';\r\nimport { Suffix } from '../../../../models/common/common.model';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { SuffixService } from '../../../../services/suffix.service';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\nconst ZORRO_MODULES = [NzButtonModule, NzIconModule];\r\n\r\n@Component({\r\n selector: 'app-suffix',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './suffix.component.html',\r\n styleUrl: './suffix.component.scss',\r\n})\r\nexport class SuffixComponent {\r\n @Input() suffixConfig!: Suffix;\r\n @Input() formId = '';\r\n\r\n protected defaultText = '';\r\n\r\n private suffixService = inject(SuffixService);\r\n\r\n ngOnInit(): void {\r\n this.defaultText = `Suffix ${this.suffixConfig.key}`;\r\n }\r\n\r\n handleSuffix(): void {\r\n this.suffixService.onSuffixClick(this.suffixConfig.key, this.formId);\r\n }\r\n}\r\n","<button\r\n nz-button\r\n nzType=\"primary\"\r\n nzSize=\"small\"\r\n [title]=\"suffixConfig.description\"\r\n class=\"h-100 suffix-btn font-size-12\"\r\n [ngClass]=\"suffixConfig.class ?? ''\"\r\n (click)=\"handleSuffix()\"\r\n>\r\n @if (suffixConfig.icon) {\r\n <span class=\"icon\">\r\n <!-- Nếu là icon Zorro -->\r\n @if (suffixConfig.icon.type === 'zorro') {\r\n <span\r\n nz-icon\r\n [nzType]=\"suffixConfig.icon.value\"\r\n nzTheme=\"outline\"\r\n [ngClass]=\"suffixConfig.icon.class ?? ''\"\r\n >\r\n </span>\r\n }\r\n\r\n <!-- Nếu là Boxicons -->\r\n @if (suffixConfig.icon.type === 'mdi') {\r\n <span [class]=\"'mdi ' + suffixConfig.icon.value\" [ngClass]=\"suffixConfig.icon.class ?? ''\">\r\n </span>\r\n }\r\n </span>\r\n }\r\n\r\n @if (suffixConfig.label) {\r\n <span class=\"label\">\r\n {{ suffixConfig.label }}\r\n </span>\r\n }\r\n\r\n @if (!suffixConfig.icon && !suffixConfig.label) {\r\n <span class=\"label\">\r\n {{ defaultText }}\r\n </span>\r\n }\r\n</button>\r\n","import { Component, computed, effect, forwardRef, inject, untracked } from '@angular/core';\r\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { InputTextField } from '../../../../models/fields/input';\r\nimport { createPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { CommonModule, CurrencyPipe } from '@angular/common';\r\nimport { NgxCurrencyDirective } from 'ngx-currency';\r\n\r\nconst ZORRO_MODULES = [\r\n NzInputModule,\r\n NgxCurrencyDirective,\r\n CurrencyPipe,\r\n CommonModule,\r\n FormsModule,\r\n];\r\nconst COMPONENTS = [SuffixComponent];\r\n@Component({\r\n selector: 'app-input-text',\r\n standalone: true,\r\n imports: [...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './input-text.component.html',\r\n styleUrls: ['./input-text.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputTextComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputTextComponent extends BaseValueAccessor<string> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof InputTextField) ||\r\n (base.type !== FieldTypeEnum.InputText && base.controlType !== ControlTypeEnum.Input)\r\n ) {\r\n throw new Error('Expected InputTextField');\r\n }\r\n return base;\r\n });\r\n\r\n inputDisplayValue = '';\r\n displayNoValueText = NO_INFO_TEXT;\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder } = field;\r\n if (!placeholder) field.placeholder = createPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n handleChangeInputText(event: Event): void {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(inputValue);\r\n // Gán data vào đầu ra của form.\r\n this.fieldService.onFieldChange(this.fieldKey(), inputValue);\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n\r\n handleChangeFormValue(value: number): void {\r\n const inputValue = value?.toString();\r\n this.propagateValue(inputValue);\r\n this.fieldService.onFieldChange(this.fieldKey(), inputValue);\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n\r\n protected override writeValueToView(value: string): void {\r\n if (this.isView()) {\r\n this.inputDisplayValue = this.fieldSignal().modelValue || NO_INFO_TEXT;\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n}\r\n","<div class=\"flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n @if (fieldSignal().isCurrency) {\r\n <input\r\n nz-input\r\n [(ngModel)]=\"inputDisplayValue\"\r\n class=\"modeView\"\r\n [currencyMask]=\"{\r\n prefix: '',\r\n suffix: ' VND',\r\n thousands: ',',\r\n decimal: '.',\r\n precision: 2,\r\n align: 'left',\r\n }\"\r\n />\r\n } @else {\r\n <input nz-input [value]=\"inputDisplayValue\" class=\"modeView\" />\r\n }\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n @if (fieldSignal().isCurrency) {\r\n <span class=\"modeView\">\r\n {{ inputDisplayValue | currency: 'VND' : 'symbol' : '1.0-0' : 'vi-VN' }}\r\n </span>\r\n } @else {\r\n <span class=\"modeView\">{{ inputDisplayValue }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (fieldSignal().isCurrency) {\r\n <input\r\n nz-input\r\n class=\"input-control\"\r\n [currencyMask]=\"{\r\n prefix: '',\r\n suffix: ' VND',\r\n thousands: ',',\r\n decimal: '.',\r\n precision: 2,\r\n align: 'left',\r\n }\"\r\n [(ngModel)]=\"value\"\r\n [placeholder]=\"fieldSignal().placeholder!\"\r\n [disabled]=\"isDisabled\"\r\n (ngModelChange)=\"handleChangeFormValue($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n } @else {\r\n <input\r\n nz-input\r\n class=\"input-control\"\r\n [value]=\"value\"\r\n [placeholder]=\"fieldSignal().placeholder!\"\r\n [disabled]=\"isDisabled\"\r\n (input)=\"handleChangeInputText($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n }\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport {\r\n DEFAULT_BIND_LABEL,\r\n DEFAULT_BIND_VALUE,\r\n SELECT_FIELD_TYPES,\r\n} from '../../../consts/fields/select-field.const';\r\nimport { BaseField } from '../field.model';\r\nimport { ApiConfig, FieldDependency } from '../../common';\r\nimport { SelectOutputValueType } from '../../common/output-value-type.model';\r\nimport { SelectOutputValueTypeEnum } from '../../../enums/common';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { RADIO_FIELD_TYPES } from '../../../consts/fields/radio-field.const';\r\n\r\nexport type RadioFieldType = (typeof RADIO_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Radio.\r\n */\r\nexport abstract class RadioBaseField<K, TOptions = Record<string, unknown>> extends BaseField<K> {\r\n // Key lấy ra nhãn hiển thị ở options.\r\n bindLabel!: string;\r\n\r\n // Key lấy ra giá trị ngầm ở options.\r\n bindValue!: string;\r\n\r\n // Mảng options cho việc lựa chọn được truyền tĩnh từ config.\r\n options?: TOptions[];\r\n\r\n // Cấu hình api nếu danh sách select dựa vào việc gọi api GET. Ưu tiên hơn options tĩnh truyền vào từ config.\r\n apiConfig?: ApiConfig;\r\n\r\n // Phụ thuộc vào một giá trị từ bất kỳ dạng field nào khác: Select, Input,...\r\n dependsOn?: FieldDependency[];\r\n\r\n // Biến đổi hiển thị option label từ option của options.\r\n transformLabel?: (option: TOptions) => string;\r\n\r\n /**\r\n * Props validation chung cho các dạng Radio.\r\n */\r\n // ................. Chưa có .................\r\n\r\n constructor(init: Partial<RadioBaseField<K, TOptions>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Radio.\r\n */\r\n this.controlType = ControlTypeEnum.Radio;\r\n this.bindLabel = DEFAULT_BIND_LABEL;\r\n this.bindValue = DEFAULT_BIND_VALUE;\r\n this.dependsOn = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Radio.\r\n protected getCommonSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Radio.\r\n protected getCustomSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonSelectValidators();\r\n const customValidators = this.getCustomSelectValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: K): K;\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport { TIME_SELECT_OPTIONS } from '../../../../../consts/fields/radio-field.const';\r\nimport { FieldTypeEnum } from '../../../../../enums/fields';\r\nimport { RadioBaseField } from '../../radio-base-field.model';\r\nimport { ReminderOption } from './reminder-option.model';\r\nimport { ReminderValue } from './reminder-value.model';\r\nimport { reminderCustomRequiredValidator } from '../../../../../utils/validators';\r\n\r\nconst DEFAULT_REMINDER_TYPE_RADIO_VALUE = null;\r\n\r\n// const DEFAULT_OPTIONS = [\r\n// {\r\n// code: 'REMINDERDATE_01',\r\n// name: 'Chọn thời điểm',\r\n// type: 'select',\r\n// },\r\n// {\r\n// code: 'REMINDERDATE_02',\r\n// name: 'Chọn ngày cụ thể',\r\n// type: 'date',\r\n// },\r\n// ] as ReminderOption[];\r\n\r\n/**\r\n * Interface của Select Field type là dạng Reminder Type Radio.\r\n */\r\nexport class ReminderTypeRadioField extends RadioBaseField<ReminderValue | null, ReminderOption> {\r\n constructor(init: Partial<ReminderTypeRadioField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Reminder Type Radio.\r\n */\r\n this.type = FieldTypeEnum.ReminderTypeRadio;\r\n this.value = DEFAULT_REMINDER_TYPE_RADIO_VALUE;\r\n this.initialValue = DEFAULT_REMINDER_TYPE_RADIO_VALUE;\r\n // this.options = DEFAULT_OPTIONS;\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): ReminderValue | null {\r\n return DEFAULT_REMINDER_TYPE_RADIO_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): ReminderValue | null {\r\n console.log('modelValue', modelValue);\r\n\r\n return modelValue as ReminderValue;\r\n }\r\n\r\n protected getCustomReminderTypeValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n if (this.required) validators.push(reminderCustomRequiredValidator());\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const customValidators = this.getCustomReminderTypeValidators();\r\n return new FormControl(this.value ?? '', [...customValidators]);\r\n }\r\n}\r\n","export class ReminderValue {\r\n reminderDate: string | Date;\r\n reminderDateType!: {\r\n code: string;\r\n };\r\n\r\n constructor(init: Partial<ReminderValue>) {\r\n this.reminderDate = '';\r\n Object.assign(this, init);\r\n }\r\n}\r\n","import { Component, computed, effect, forwardRef, inject, untracked } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../../base/base-value-accessor';\r\nimport {\r\n CORE_MODULES,\r\n FORM_MODULES,\r\n NO_INFO_TEXT,\r\n} from '../../../../../consts/common';\r\nimport { TIME_SELECT_OPTIONS } from '../../../../../consts/fields/radio-field.const';\r\nimport { ControlTypeEnum } from '../../../../../enums/controls';\r\nimport { FieldTypeEnum } from '../../../../../enums/fields';\r\nimport { ApiResponse } from '../../../../../models/common';\r\nimport {\r\n DateOptions,\r\n ReminderOption,\r\n SelectOption,\r\n} from '../../../../../models/fields/radio/custom/reminder-type-radio/reminder-option.model';\r\nimport { ReminderTypeRadioField } from '../../../../../models/fields/radio/custom/reminder-type-radio/reminder-type-radio-field.model';\r\nimport { ReminderValue } from '../../../../../models/fields/radio/custom/reminder-type-radio/reminder-value.model';\r\nimport { formatDateToYYYYMMDD } from '../../../../../utils/date';\r\nimport { normalizeToDate } from '../../../../../utils/date';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { ToastrService } from 'ngx-toastr';\r\n\r\nconst ZORRO_MODULES = [NzRadioModule, NzSelectModule, NzDatePickerModule];\r\n\r\n@Component({\r\n selector: 'app-reminder-type-radio',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...FORM_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './reminder-type-radio.component.html',\r\n styleUrl: './reminder-type-radio.component.less',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ReminderTypeRadioComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class ReminderTypeRadioComponent extends BaseValueAccessor<ReminderValue | null> {\r\n // Field config từ mảng fields.\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof ReminderTypeRadioField) ||\r\n (base.type !== FieldTypeEnum.ReminderTypeRadio && base.controlType !== ControlTypeEnum.Radio)\r\n ) {\r\n throw new Error('Expected ReminderTypeRadioField');\r\n }\r\n return base;\r\n });\r\n\r\n options: ReminderOption[] = [];\r\n selectedOption!: ReminderOption;\r\n selectedOptionCode = '';\r\n\r\n deadline: Date | null = null;\r\n\r\n get selectDetail(): SelectOption | undefined {\r\n return this.selectedOption.type === 'select'\r\n ? (this.selectedOption.detail as SelectOption)\r\n : undefined;\r\n }\r\n\r\n get dateDetail(): DateOptions | undefined {\r\n return this.selectedOption.type === 'date'\r\n ? (this.selectedOption.detail as DateOptions)\r\n : undefined;\r\n }\r\n\r\n disabledAfterLimit = (current: Date) => {\r\n if (!this.deadline) return false;\r\n // clone và normalize limitDate\r\n const dayBefore = new Date(this.deadline);\r\n dayBefore.setHours(0, 0, 0, 0);\r\n dayBefore.setDate(dayBefore.getDate());\r\n\r\n // normalize current\r\n const cur = new Date(current);\r\n cur.setHours(0, 0, 0, 0);\r\n return cur >= dayBefore;\r\n };\r\n\r\n private toast = inject(ToastrService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { options } = field;\r\n\r\n // Reminder option.\r\n this.options = options || [];\r\n // Mặc định chọn index 0 của radio reminder.\r\n if (this.options.length > 0) {\r\n this.selectedOption = this.options[0];\r\n this.selectedOptionCode = this.options[0].code;\r\n this.value = new ReminderValue({\r\n reminderDateType: {\r\n code: this.selectedOption.code,\r\n },\r\n reminderDate: '',\r\n });\r\n }\r\n }\r\n });\r\n\r\n effect(() => {\r\n const key = this.fieldSignal().dependsOn![0].fieldKey;\r\n const dependValuesMap = this.fieldService.getDependValuesMap();\r\n\r\n const dependSignal = dependValuesMap.get(key); // <- giữ nguyên signal\r\n if (dependSignal) {\r\n const value = dependSignal(); // lấy giá trị hiện tại\r\n if (value) this.deadline = new Date(value);\r\n else this.deadline = null;\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: ReminderValue | null): void {\r\n // if (this.isView()) {\r\n // this.displayValue = this.getDisplayValue(\r\n // this.fieldSignal().modelValue as string | Record<string, unknown>,\r\n // );\r\n // return;\r\n // }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n const { key } = untracked(() => this.fieldSignal());\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value;\r\n this.patchFormData(key, newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: ReminderValue): void {\r\n const newOutputValue = value && new ReminderValue({ ...value });\r\n\r\n if (this.selectedOption.type === 'date') {\r\n const date = newOutputValue.reminderDate as Date;\r\n newOutputValue.reminderDate = value && formatDateToYYYYMMDD(date);\r\n }\r\n\r\n this.patchFormData(this.fieldSignal().key, newOutputValue);\r\n }\r\n\r\n reminderRadioChange(radioValue: string): void {\r\n const currOption = this.options.find(o => o.code === radioValue);\r\n\r\n if (currOption) {\r\n this.selectedOption = currOption;\r\n this.selectedOptionCode = currOption.code;\r\n\r\n if (currOption.type === 'date' && !this.deadline)\r\n this.toast.warning(\r\n `Chọn ${this.fieldSignal().dependsOn![0].fieldLabel} trước khi chọn ngày cụ thể cho việc Nhắc báo cáo`,\r\n );\r\n }\r\n\r\n this.value = new ReminderValue({\r\n reminderDateType: {\r\n code: radioValue,\r\n },\r\n reminderDate: '',\r\n });\r\n }\r\n\r\n changeOptionSelect(optionValue: string): void {\r\n this.propagateValue(\r\n new ReminderValue({\r\n ...this.value,\r\n reminderDate: optionValue,\r\n }),\r\n );\r\n }\r\n\r\n changeDate(date: Date): void {\r\n this.propagateValue(\r\n new ReminderValue({\r\n ...this.value,\r\n reminderDate: date,\r\n }),\r\n );\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n <!-- <input nz-input [value]=\"displayValue\" class=\"modeView\" /> -->\r\n} @else {\r\n <!-- *ngIf=\"!!deadline\" -->\r\n <div class=\"reminder-wrapper\">\r\n <div class=\"reminder\">\r\n <div class=\"radio-group\">\r\n <nz-radio-group\r\n [ngModel]=\"selectedOptionCode\"\r\n (ngModelChange)=\"reminderRadioChange($event)\"\r\n >\r\n <label *ngFor=\"let opt of options\" nz-radio [nzValue]=\"opt.code\">\r\n {{ opt.name }}\r\n </label>\r\n </nz-radio-group>\r\n </div>\r\n\r\n <div class=\"detail-for-radio\" [ngSwitch]=\"selectedOption.type\">\r\n <ng-container *ngSwitchCase=\"'select'\">\r\n <nz-select\r\n [nzPlaceHolder]=\"'Chọn thời điểm nhắc báo cáo'\"\r\n [nzAllowClear]=\"true\"\r\n [ngModel]=\"value!.reminderDate || ''\"\r\n (ngModelChange)=\"changeOptionSelect($event)\"\r\n >\r\n <nz-option\r\n *ngFor=\"let o of selectDetail?.options\"\r\n [nzValue]=\"o?.code || ''\"\r\n [nzLabel]=\"o?.name || ''\"\r\n ></nz-option>\r\n </nz-select>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <div>\r\n <nz-date-picker\r\n [ngModel]=\"value!.reminderDate || null\"\r\n (ngModelChange)=\"changeDate($event)\"\r\n [nzAllowClear]=\"true\"\r\n [nzPlaceHolder]=\"'Chọn ngày nhắc báo cáo cụ thể'\"\r\n [nzDisabledDate]=\"disabledAfterLimit\"\r\n [nzDisabled]=\"!deadline\"\r\n ></nz-date-picker>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- <div\r\n class=\"\"\r\n [ngClass]=\"{\r\n 'background-disabled': !deadline,\r\n }\"\r\n ></div> -->\r\n </div>\r\n}\r\n","import { Component, computed, effect, forwardRef, signal, untracked } from '@angular/core';\r\nimport { CORE_MODULES, FORM_MODULES } from '../../../../consts/common';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { MultiSelectField } from '../../../../models/fields/select/multi-select-field.model';\r\nimport { createSelectPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { ApiResponse } from '../../../../models/common/api-response.model';\r\nimport { DependTypeEnum, SelectOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { finalize } from 'rxjs';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\n\r\nconst ZORRO_MODULES = [NzSelectModule, NzInputModule, NzSpinModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\n@Component({\r\n selector: 'app-multi-select',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './multi-select.component.html',\r\n styleUrls: ['./multi-select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiSelectComponent extends BaseValueAccessor<\r\n string[] | number[] | Record<string, unknown>[]\r\n> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiSelectField) ||\r\n (base.type !== FieldTypeEnum.MultiSelect && base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error('Expected MultiSelectField');\r\n }\r\n return base;\r\n });\r\n\r\n displayNoValueText = NO_INFO_TEXT;\r\n displayOptionsValue: string[] = [];\r\n\r\n loading = signal(false);\r\n\r\n options: Record<string, unknown>[] = [];\r\n queryParams: Record<string, unknown> = {};\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder, dependsOn } = field;\r\n\r\n // Nếu field không phụ thuộc vào field khác mặc định phải gọi\r\n if (dependsOn?.length === 0) this.getOptions();\r\n if (!placeholder) field.placeholder = createSelectPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n // Xử lý luồng ban đầu cho việc getOptions, cũng như getOptions phụ thuộc vào dependsOn.\r\n effect(() => {\r\n const { canProceed, queryParams } = this.resolveDependencyState();\r\n\r\n if (!canProceed) {\r\n this.disableAndResetControl();\r\n return;\r\n }\r\n\r\n this.queryParams = { ...this.queryParams, ...queryParams };\r\n this.getOptions();\r\n this.enableControl();\r\n });\r\n }\r\n\r\n // Xử lý tạo queryParams và có cho phép gọi getOptions hay không.\r\n private resolveDependencyState(): {\r\n canProceed: boolean;\r\n queryParams: Record<string, unknown>;\r\n } {\r\n //1. Không gọi API lấy options nếu ở view mode.\r\n if (untracked(() => this.isView())) {\r\n return {\r\n canProceed: false,\r\n queryParams: {},\r\n };\r\n }\r\n\r\n const field = untracked(() => this.fieldSignal());\r\n const { dependsOn, dependType } = field;\r\n\r\n // Không phụ thuộc vào giá trị từ field khác, tức mảng dependsOn rỗng -> luôn cho phép gọi list.\r\n const requiredCount = dependsOn?.length ?? 0;\r\n if (requiredCount === 0) {\r\n return {\r\n canProceed: true,\r\n queryParams: {},\r\n };\r\n }\r\n\r\n // 3. Tạo mảng object dependValues theo paramKey và value. Ví dụ [{paramKey: 'provinceCode', value: '36'}]\r\n const dependValuesMap = this.fieldService.getDependValuesMap();\r\n const dependValues = dependsOn.map(depend => {\r\n const getter = dependValuesMap.get(depend.fieldKey);\r\n const value = typeof getter === 'function' ? getter() : getter;\r\n return { paramKey: depend.paramKey, value };\r\n });\r\n\r\n // 4. Đếm số paramKey giá trị đã có (không phải falsy).\r\n const availableCount = dependValues.filter(v => v.value).length;\r\n\r\n // 5. Check xem có thể tiếp tục đến gọi list không.\r\n // ===== Nếu dependType là 'all' thì canProceed true chỉ khi availableCount = với requiredCount.\r\n // ===== Ngược lại dependType là 'any' chỉ cần availableCount > 0.\r\n const canProceed =\r\n dependType === DependTypeEnum.All ? availableCount === requiredCount : availableCount > 0;\r\n\r\n return {\r\n canProceed,\r\n queryParams: Object.fromEntries(dependValues.map(v => [v.paramKey, v.value])),\r\n };\r\n }\r\n\r\n private createFullApiUrl(field: MultiSelectField): string {\r\n let fullApiUrl = field?.apiConfig?.baseUrl || '';\r\n const params = field?.apiConfig?.params || {};\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n return fullApiUrl;\r\n }\r\n\r\n // Lấy danh sách options từ GET api.\r\n private getOptions(): void {\r\n const field = this.fieldSignal();\r\n const fullApiUrl = this.createFullApiUrl(field);\r\n\r\n if (!fullApiUrl) {\r\n this.options = field?.options ?? [];\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.disableControl();\r\n this.fieldService\r\n .getAllOptions(fullApiUrl, this.queryParams)\r\n .pipe(\r\n finalize(() => {\r\n this.loading.set(false);\r\n this.enableControl();\r\n }),\r\n this.takeUntilDestroy(),\r\n )\r\n .subscribe({\r\n next: (res: ApiResponse<Record<string, unknown>[]>) => {\r\n if (res?.code === 0) {\r\n this.options = res?.data;\r\n }\r\n },\r\n error: (error: Error) => {},\r\n });\r\n }\r\n\r\n handleChangeOptions(optionValue: string[]): void {\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string[]): void {\r\n if (this.isView()) {\r\n const modelValue = this.fieldSignal().modelValue;\r\n if (modelValue) this.displayOptionsValue = this.getDisplayValue(modelValue);\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string[]): void {\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(\r\n singleValueArr: string[] | number[],\r\n ): string[] | Record<string, unknown>[] {\r\n const field = this.fieldSignal();\r\n\r\n if (singleValueArr.length === 0) {\r\n return singleValueArr.map(String);\r\n }\r\n\r\n // Nếu outputAs là dạng single.\r\n let value: string[] | Record<string, unknown>[] = singleValueArr.map(String);\r\n\r\n // Nếu outputAs là dạng object.\r\n if (field.outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = value.map(val => ({\r\n [field.bindValue]: val,\r\n }));\r\n }\r\n return value;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string[] | Record<string, unknown>[]) {\r\n const optionsValue = value!.map((val: string | number | Record<string, unknown>) => {\r\n if (typeof val === 'object') {\r\n return this.getCustomLabel(val);\r\n }\r\n return val as string;\r\n });\r\n\r\n return optionsValue;\r\n }\r\n\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.fieldSignal();\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.fieldSignal();\r\n\r\n if (typeof option[field.bindLabel] === 'function' || !option[field.bindLabel]) {\r\n let warnMessage =\r\n 'Giá trị label lấy theo bindLabel hiện đang là dạng object, array hoặc các dạng còn lại của complex data';\r\n if (!option[field.bindLabel])\r\n warnMessage = 'Không tồn tại giá trị label khi lấy theo bindLabel';\r\n //console.warn(warnMessage);\r\n\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = option[field.bindLabel] as string;\r\n\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n @if (fieldSignal().value!.length > 0) {\r\n <nz-select\r\n nzAllowClear\r\n [nzMode]=\"'multiple'\"\r\n [(ngModel)]=\"displayOptionsValue\"\r\n [nzMaxTagCount]=\"fieldSignal().maxTagCount!\"\r\n [nzMaxMultipleCount]=\"fieldSignal().maxMultipleCount!\"\r\n [nzDisabled]=\"true\"\r\n >\r\n @for (displayOption of displayOptionsValue; track $index) {\r\n <nz-option [nzValue]=\"displayOption\" [nzLabel]=\"displayOption\"> </nz-option>\r\n }\r\n </nz-select>\r\n } @else {\r\n <input nz-input [value]=\"displayNoValueText\" [disabled]=\"true\" />\r\n }\r\n }\r\n\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n @if (displayOptionsValue && displayOptionsValue.length) {\r\n <ul class=\"view-list\">\r\n @for (label of displayOptionsValue; track $index) {\r\n <li>{{ label }}</li>\r\n }\r\n </ul>\r\n } @else {\r\n <span class=\"modeView\">{{ displayNoValueText }}</span>\r\n }\r\n }\r\n } @else {\r\n <nz-select\r\n [id]=\"fieldSignal().key\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"isDisabled\"\r\n [nzMode]=\"'multiple'\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder!\"\r\n [nzMaxTagCount]=\"fieldSignal().maxTagCount!\"\r\n [nzMaxMultipleCount]=\"fieldSignal().maxMultipleCount!\"\r\n [nzSuffixIcon]=\"loading() ? loadingIcon : null\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n @for (option of options; track `${option[this.fieldSignal().bindValue]}-${$index}`) {\r\n <nz-option [nzValue]=\"transformOptionValue(option)\" [nzLabel]=\"getOptionLabel(option)\">\r\n </nz-option>\r\n }\r\n </nz-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef, Input, signal, untracked } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { SingleSelectField } from '../../../../models/fields/select/single-select-field.model';\r\nimport { createSelectPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { FORM_MODULES } from '../../../../consts/common/standalone-import.const';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { SelectOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { ApiResponse } from '../../../../models/common/api-response.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nconst ZORRO_MODULES = [NzSelectModule, NzSpinModule, NzInputModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\n@Component({\r\n selector: 'app-single-select',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './single-select.component.html',\r\n styleUrls: ['./single-select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SingleSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SingleSelectComponent extends BaseValueAccessor<string | Record<string, unknown>> {\r\n @Input() isCustomInputText!: boolean;\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof SingleSelectField) ||\r\n (base.type !== FieldTypeEnum.SingleSelect && base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error('Expected SingleSelectField');\r\n }\r\n return base;\r\n });\r\n\r\n // Giá trị dùng hiển thị ở chế độ View.\r\n displayValue: string | number = '';\r\n\r\n loadingSignal = signal(false);\r\n isDisabledSignal = signal(false);\r\n disabled = computed(() => this.loadingSignal() || this.isDisabledSignal());\r\n\r\n options: Record<string, unknown>[] = [];\r\n queryParams: Record<string, unknown> = {};\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder } = field;\r\n\r\n if (!placeholder) field.placeholder = createSelectPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (untracked(() => this.isView())) return;\r\n\r\n const { key, dependsOn, isParent, dependType } = untracked(() => this.fieldSignal());\r\n\r\n // Không dính dáng gì đến isParent và dependsOn.\r\n if (!isParent && dependsOn!.length === 0) {\r\n this.getOptions();\r\n return;\r\n }\r\n\r\n const dependValuesMap = this.fieldService.getDependValuesMap();\r\n\r\n const dependValues = dependsOn?.map(depend => {\r\n const dependFunc = dependValuesMap.get(depend.fieldKey);\r\n const value = typeof dependFunc === 'function' ? dependFunc() : dependFunc;\r\n return [depend.paramKey, value];\r\n });\r\n\r\n // console.log(`${key} dependValue`, dependValues);\r\n\r\n const params = Object.fromEntries(dependValues as any);\r\n\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n\r\n // console.log(`${key} queryParams`, this.queryParams);\r\n\r\n // Nếu tất cả các phụ thuộc có value thì mới gọi API.\r\n const allDependHasValues = dependValues?.every(([fieldKey, value]) => value);\r\n // console.log(`${key} allDependHasValues`, allDependHasValues);\r\n\r\n if (allDependHasValues) {\r\n // this.isDisabledSignal.set(false);\r\n this.control?.enable();\r\n this.getOptions();\r\n } else {\r\n // Ngược lại reset và disabled.\r\n this.control?.reset();\r\n // this.isDisabledSignal.set(true);\r\n this.control?.disable();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string | null): void {\r\n if (this.isView()) {\r\n this.displayValue = this.getDisplayValue(\r\n this.fieldSignal().modelValue as string | Record<string, unknown>,\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value ?? '');\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap SET\", untracked(() => signal!()));\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string): void {\r\n const { isParent } = this.fieldSignal();\r\n if (isParent) {\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value);\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap UI\", untracked(() => signal!()));\r\n }\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n private createFullApiUrl(): string {\r\n const field = untracked(() => this.fieldSignal());\r\n let fullApiUrl = field?.apiConfig?.baseUrl || '';\r\n const params = field?.apiConfig?.params || {};\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n return fullApiUrl;\r\n }\r\n\r\n // Lấy danh sách options từ GET api.\r\n private getOptions(): void {\r\n const field = untracked(() => this.fieldSignal());\r\n const { optionsToPrepend, optionsToAppend, exceptOptions } = field;\r\n const fullApiUrl = this.createFullApiUrl();\r\n\r\n if (!fullApiUrl) {\r\n this.options = field?.options ?? [];\r\n this.options = [...optionsToPrepend, ...this.options, ...optionsToAppend].filter(\r\n options => !exceptOptions.some(opts => opts[field.bindValue] === options[field.bindValue]),\r\n );\r\n return;\r\n }\r\n\r\n this.loadingSignal.set(true);\r\n this.control?.disable();\r\n this.fieldService\r\n .getAllOptions(fullApiUrl, this.queryParams)\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res: ApiResponse<Record<string, unknown>[]>) => {\r\n this.loadingSignal.set(false);\r\n if (!this.fieldSignal().isDisabled) this.control?.enable();\r\n\r\n if (res?.code === 0) {\r\n this.options = res?.data;\r\n this.options = [...optionsToPrepend, ...this.options, ...optionsToAppend].filter(\r\n options =>\r\n !exceptOptions.some(opts => opts[field.bindValue] === options[field.bindValue]),\r\n );\r\n\r\n // Nếu outputAs là dạng sourceObject đồng bộ sau khi load xong list.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n const newOutputValue = this.options.find(\r\n option => option[field.bindValue] === this.value,\r\n ) ?? {\r\n [field.bindValue]: this.value,\r\n };\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n }\r\n },\r\n error: (error: Error) => {\r\n this.loadingSignal.set(false);\r\n if (!this.fieldSignal().isDisabled) this.control?.enable();\r\n },\r\n });\r\n }\r\n\r\n handleChangeOptions(optionValue: string): void {\r\n const { enableFieldChange, bindValue } = untracked(() => this.fieldSignal());\r\n\r\n if (enableFieldChange) {\r\n const option = this.options.find(option => option[bindValue] === optionValue);\r\n this.fieldService.onFieldChange(this.fieldKey(), option);\r\n }\r\n\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(singleValue: string): string | Record<string, unknown> {\r\n const field = this.fieldSignal();\r\n\r\n if (singleValue) {\r\n // Nếu outputAs là dạng single.\r\n let value: string | Record<string, unknown> = singleValue;\r\n\r\n // Nếu outputAs là dạng object.\r\n if (field.outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n // Nếu outputAs là dạng sourceObject.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n value = this.options.find(option => option[field.bindValue] === singleValue) ?? {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n return value;\r\n }\r\n return singleValue;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string | Record<string, unknown>): string {\r\n if (!value) return NO_INFO_TEXT;\r\n\r\n if (typeof value === 'object') {\r\n return this.getCustomLabel(value);\r\n }\r\n return value as string;\r\n }\r\n\r\n // Lấy value ở option tag.\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.fieldSignal()!;\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n // Lấy label.\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.fieldSignal();\r\n\r\n if (typeof option[field.bindLabel] === 'function' || !option[field.bindLabel]) {\r\n let warnMessage =\r\n 'Giá trị label lấy theo bindLabel hiện đang là dạng object, array hoặc các dạng còn lại của complex data';\r\n if (!option[field.bindLabel])\r\n warnMessage = 'Không tồn tại giá trị label khi lấy theo bindLabel';\r\n // console.warn(warnMessage);\r\n\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = option[field.bindLabel] as string;\r\n\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n <input [title]=\"displayValue\" nz-input [value]=\"displayValue\" class=\"modeView\" />\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n <span [title]=\"displayValue\" class=\"modeView break-work\">{{ displayValue }}</span>\r\n }\r\n } @else {\r\n <nz-select\r\n [id]=\"fieldSignal().key\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"isDisabled\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder!\"\r\n [nzSuffixIcon]=\"loadingSignal() ? loadingIcon : null\"\r\n [title]=\"fieldSignal().tooltip || ''\"\r\n [nzDropdownMatchSelectWidth]=\"fieldSignal().matchSelectWidth\"\r\n [ngModel]=\"value\"\r\n class=\"flex-1 select-box\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n @for (option of options; track `${option[this.fieldSignal().bindValue]}-${$index}`) {\r\n <nz-option [nzValue]=\"transformOptionValue(option)\" [nzLabel]=\"getOptionLabel(option)\">\r\n </nz-option>\r\n }\r\n </nz-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef, Input, signal, untracked } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { TreeSelectField } from '../../../../models/fields/select/tree-select-field.model';\r\nimport { createSelectPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { FORM_MODULES } from '../../../../consts/common/standalone-import.const';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { SelectOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { ApiResponse } from '../../../../models/common/api-response.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzTreeSelectModule } from 'ng-zorro-antd/tree-select';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nconst ZORRO_MODULES = [NzTreeSelectModule, NzSpinModule, NzInputModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\ninterface FlatItem {\r\n code: string;\r\n name: string;\r\n [key: string]: any;\r\n}\r\n\r\ninterface TreeNode {\r\n key: any;\r\n title: string;\r\n children?: TreeNode[];\r\n selectable?: boolean;\r\n isLeaf?: boolean;\r\n [key: string]: any;\r\n}\r\n\r\n@Component({\r\n selector: 'app-tree-select',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './tree-select.component.html',\r\n styleUrls: ['./tree-select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TreeSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TreeSelectComponent extends BaseValueAccessor<string | Record<string, unknown>> {\r\n @Input() isCustomInputText!: boolean;\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof TreeSelectField) ||\r\n (base.type !== FieldTypeEnum.TreeSelect && base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error('Expected TreeSelectField');\r\n }\r\n return base;\r\n });\r\n\r\n // Giá trị dùng hiển thị ở chế độ View.\r\n displayValue: string | number = '';\r\n\r\n loadingSignal = signal(false);\r\n isDisabledSignal = signal(false);\r\n disabled = computed(() => this.loadingSignal() || this.isDisabledSignal());\r\n\r\n options: any[] = [];\r\n queryParams: Record<string, unknown> = {};\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder } = field;\r\n\r\n if (!placeholder) field.placeholder = createSelectPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (untracked(() => this.isView())) return;\r\n\r\n const { key, dependsOn, isParent, dependType } = untracked(() => this.fieldSignal());\r\n\r\n // Không dính dáng gì đến isParent và dependsOn.\r\n if (!isParent && dependsOn!.length === 0) {\r\n this.getOptions();\r\n return;\r\n }\r\n\r\n const dependValuesMap = this.fieldService.getDependValuesMap();\r\n\r\n const dependValues = dependsOn?.map(depend => {\r\n const dependFunc = dependValuesMap.get(depend.fieldKey);\r\n const value = typeof dependFunc === 'function' ? dependFunc() : dependFunc;\r\n return [depend.paramKey, value];\r\n });\r\n\r\n // console.log(`${key} dependValue`, dependValues);\r\n\r\n const params = Object.fromEntries(dependValues as any);\r\n\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n\r\n // console.log(`${key} queryParams`, this.queryParams);\r\n\r\n // Nếu tất cả các phụ thuộc có value thì mới gọi API.\r\n const allDependHasValues = dependValues?.every(([fieldKey, value]) => value);\r\n // console.log(`${key} allDependHasValues`, allDependHasValues);\r\n\r\n if (allDependHasValues) {\r\n // this.isDisabledSignal.set(false);\r\n this.control?.enable();\r\n this.getOptions();\r\n } else {\r\n // Ngược lại reset và disabled.\r\n this.control?.reset();\r\n // this.isDisabledSignal.set(true);\r\n this.control?.disable();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string | null): void {\r\n if (this.isView()) {\r\n this.displayValue = this.getDisplayValue(\r\n this.fieldSignal().modelValue as string | Record<string, unknown>,\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value ?? '');\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap SET\", untracked(() => signal!()));\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string): void {\r\n const { isParent } = this.fieldSignal();\r\n if (isParent) {\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value);\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap UI\", untracked(() => signal!()));\r\n }\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n private createFullApiUrl(): string {\r\n const field = untracked(() => this.fieldSignal());\r\n let fullApiUrl = field?.apiConfig?.baseUrl || '';\r\n const params = field?.apiConfig?.params || {};\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n return fullApiUrl;\r\n }\r\n\r\n private buildTree(items: FlatItem[], groupBy?: string): any[] {\r\n if (!groupBy) return items;\r\n const map = new Map<string, TreeNode>();\r\n const roots: TreeNode[] = [];\r\n\r\n // Step 1: Transform & store in map\r\n for (const item of items) {\r\n map.set(item.code, {\r\n key: this.transformOptionValue(item),\r\n title: this.getOptionLabel(item),\r\n parentCode: item[groupBy],\r\n isLeaf: true,\r\n });\r\n }\r\n\r\n // Step 2: Build parent-child relation\r\n for (const node of map.values()) {\r\n if (node['parentCode']) {\r\n const parent = map.get(node['parentCode']);\r\n if (parent) {\r\n if (!parent.children) parent.children = [];\r\n parent.children.push(node);\r\n parent.isLeaf = false;\r\n } else {\r\n roots.push(node);\r\n }\r\n } else {\r\n roots.push(node);\r\n }\r\n }\r\n\r\n return roots;\r\n }\r\n\r\n // Lấy danh sách options từ GET api.\r\n private getOptions(): void {\r\n const field = untracked(() => this.fieldSignal());\r\n const { optionsToPrepend, optionsToAppend, exceptOptions } = field;\r\n const fullApiUrl = this.createFullApiUrl();\r\n\r\n if (!fullApiUrl) {\r\n const options = [...optionsToPrepend, ...field.options, ...optionsToAppend].filter(\r\n options => !exceptOptions.some(opts => opts[field.bindValue] === options[field.bindValue]),\r\n ) as any;\r\n this.options = this.buildTree(options, field.groupBy);\r\n return;\r\n }\r\n\r\n this.loadingSignal.set(true);\r\n this.control?.disable();\r\n this.fieldService\r\n .getAllOptions(fullApiUrl, this.queryParams)\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res: ApiResponse<Record<string, unknown>[]>) => {\r\n this.loadingSignal.set(false);\r\n if (!this.fieldSignal().isDisabled) this.control?.enable();\r\n\r\n if (res?.code === 0) {\r\n const options = [...optionsToPrepend, ...(res?.data ?? []), ...optionsToAppend].filter(\r\n options =>\r\n !exceptOptions.some(opts => opts[field.bindValue] === options[field.bindValue]),\r\n ) as any;\r\n this.options = this.buildTree(options, field.groupBy);\r\n\r\n // Nếu outputAs là dạng sourceObject đồng bộ sau khi load xong list.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n const newOutputValue = this.options.find(option => option.key === this.value) ?? {\r\n [field.bindValue]: this.value,\r\n };\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n }\r\n },\r\n error: (error: Error) => {\r\n this.loadingSignal.set(false);\r\n if (!this.fieldSignal().isDisabled) this.control?.enable();\r\n },\r\n });\r\n }\r\n\r\n handleChangeOptions(optionValue: string): void {\r\n const { enableFieldChange, bindValue } = untracked(() => this.fieldSignal());\r\n\r\n if (enableFieldChange) {\r\n const option = this.options.find(option => option[bindValue] === optionValue);\r\n this.fieldService.onFieldChange(this.fieldKey(), option);\r\n }\r\n\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(singleValue: string): string | Record<string, unknown> {\r\n const field = this.fieldSignal();\r\n\r\n if (singleValue) {\r\n // Nếu outputAs là dạng single.\r\n let value: string | Record<string, unknown> = singleValue;\r\n\r\n // Nếu outputAs là dạng object.\r\n if (field.outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n // Nếu outputAs là dạng sourceObject.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n value = this.options.find(option => option[field.bindValue] === singleValue) ?? {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n return value;\r\n }\r\n return singleValue;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string | Record<string, unknown>): string {\r\n if (!value) return NO_INFO_TEXT;\r\n\r\n if (typeof value === 'object') {\r\n return this.getCustomLabel(value);\r\n }\r\n return value as string;\r\n }\r\n\r\n // Lấy value ở option tag.\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.fieldSignal()!;\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n // Lấy label.\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.fieldSignal();\r\n\r\n if (typeof option[field.bindLabel] === 'function' || !option[field.bindLabel]) {\r\n let warnMessage =\r\n 'Giá trị label lấy theo bindLabel hiện đang là dạng object, array hoặc các dạng còn lại của complex data';\r\n if (!option[field.bindLabel])\r\n warnMessage = 'Không tồn tại giá trị label khi lấy theo bindLabel';\r\n // console.warn(warnMessage);\r\n\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = option[field.bindLabel] as string;\r\n\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n <input nz-input [value]=\"displayValue\" class=\"modeView\" />\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n <span class=\"modeView break-work\">{{ displayValue }}</span>\r\n }\r\n } @else {\r\n <nz-tree-select\r\n [nzId]=\"fieldSignal().key\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"isDisabled\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder!\"\r\n [title]=\"fieldSignal().tooltip || ''\"\r\n [nzDropdownMatchSelectWidth]=\"fieldSignal().matchSelectWidth\"\r\n [ngModel]=\"value\"\r\n [nzNodes]=\"options\"\r\n class=\"flex-1 select-box\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n </nz-tree-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../base/base-value-accessor';\r\nimport { TextareaField } from '../../../models/fields/textarea/textarea-field.model';\r\nimport { createPlaceholder } from '../../../utils/dynamic-form/dynamic-form';\r\nimport { NO_INFO_TEXT } from '../../../consts/common/common.const';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nconst ZORRO_MODULES = [NzInputModule];\r\n\r\n@Component({\r\n selector: 'app-textarea',\r\n standalone: true,\r\n imports: [...ZORRO_MODULES],\r\n templateUrl: './textarea.component.html',\r\n styleUrls: ['./textarea.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextareaComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TextareaComponent extends BaseValueAccessor<string> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (!(base instanceof TextareaField) || base.type !== FieldTypeEnum.Textarea) {\r\n throw new Error('Expected TextareaField');\r\n }\r\n return base;\r\n });\r\n\r\n textareaDisplayValue = '';\r\n displayNoValueText = NO_INFO_TEXT;\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = this.fieldSignal();\r\n const { placeholder } = field;\r\n if (!placeholder) field.placeholder = createPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n handleChangeTextarea(event: Event): void {\r\n const textareaValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(textareaValue);\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n textareaValue && textareaValue.replace(/\\n+/g, 'br_enter').replace(/br_enter+/g, '\\n'),\r\n );\r\n }\r\n\r\n protected override writeValueToView(value: string): void {\r\n if (this.isView()) {\r\n this.textareaDisplayValue = this.fieldSignal().modelValue || NO_INFO_TEXT;\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n @if (textareaDisplayValue) {\r\n <p [innerHTML]=\"textareaDisplayValue\" class=\"disabled-textarea break-work mb0\"></p>\r\n } @else {\r\n <input nz-input [value]=\"displayNoValueText\" class=\"modeView\" />\r\n }\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n @if (textareaDisplayValue) {\r\n <p [innerHTML]=\"textareaDisplayValue\" class=\"mode-view mb-0 break-work mb0\"></p>\r\n } @else {\r\n <span class=\"modeView\">{{ displayNoValueText }}</span>\r\n }\r\n }\r\n} @else {\r\n <textarea\r\n nz-input\r\n [id]=\"fieldSignal().key\"\r\n [nzAutosize]=\"{ minRows: 1, maxRows: 6 }\"\r\n [value]=\"value\"\r\n [disabled]=\"isDisabled\"\r\n [placeholder]=\"fieldSignal().placeholder!\"\r\n (input)=\"handleChangeTextarea($event)\"\r\n >\r\n </textarea>\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { ApiResponse } from '../models/common/api-response.model';\r\nimport { ObjectStorage } from '../models/common/object-storage.model';\r\nimport { Subject } from 'rxjs';\r\nimport { FormConfigService } from './form-config.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FileService {\r\n private httpClient = inject(HttpClient);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n private fileClick$ = new Subject<ObjectStorage>();\r\n\r\n fileClick = this.fileClick$.asObservable(); // expose ra ngoài.\r\n\r\n onFileClick(objStorage: ObjectStorage) {\r\n this.fileClick$.next(objStorage);\r\n }\r\n\r\n // Upload file đến server và trả về 1 ObjectStorage.\r\n uploadFile(\r\n file: File,\r\n formData: FormData,\r\n options?: {\r\n uploadUrl?: string;\r\n directoryId?: string;\r\n },\r\n ) {\r\n if (!options) options = {};\r\n if (!options.uploadUrl) {\r\n options.uploadUrl = this.formConfigService['config'].systemApiUrl + 'ObjectStorage/public/upload'; // fallback\r\n }\r\n return this.httpClient.post<any>(options.uploadUrl, formData);\r\n }\r\n\r\n // Xóa ObjectStorage.\r\n deleteObjStorage(\r\n id: string,\r\n options?: {\r\n deleteUrl?: string;\r\n directoryId?: string;\r\n },\r\n ) {\r\n if (!options) options = {};\r\n if (!options.deleteUrl) {\r\n options.deleteUrl = this.formConfigService['config'].systemApiUrl + 'ObjectStorage/public/delete'; // fallback\r\n }\r\n return this.httpClient.delete<ApiResponse<unknown>>(`${options.deleteUrl}/${id}`);\r\n }\r\n}\r\n","import { Component, computed, effect, forwardRef, inject, Input, signal } from '@angular/core';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { NzUploadFile, NzUploadModule, NzUploadXHRArgs } from 'ng-zorro-antd/upload';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { AvatarUploadField } from '../../../../models/fields/upload/avatar-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { ObjectStorage } from '../../../../models/common';\r\nimport { MyUploadFile } from '../../../../models/common/common.model';\r\nimport { FileService } from '../../../../services/file.service';\r\nimport { isValidJSON } from '../../../../utils/common';\r\nimport { Observable, of, Subscription } from 'rxjs';\r\nimport { formatFileSize } from '../../../../utils/file';\r\nimport { FileSizeTypeEnum } from '../../../../enums/common';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FormConfigService } from '../../../../services/form-config.service';\r\n\r\nconst ZORRO_MODULES = [NzUploadModule];\r\n\r\n@Component({\r\n selector: 'app-avatar-upload',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './avatar-upload.component.html',\r\n styleUrl: './avatar-upload.component.scss',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AvatarUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class AvatarUploadComponent extends BaseValueAccessor<string | File> {\r\n @Input() size: number = 100; // kích thước avatar\r\n\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof AvatarUploadField) ||\r\n (base.type !== FieldTypeEnum.AvatarUpload && base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error('Expected AvatarUploadField');\r\n }\r\n return base;\r\n });\r\n\r\n avatarUrl: string | null = null;\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n private fileService = inject(FileService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorage, myFile, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.avatarUrl = '';\r\n\r\n if (isValidJSON(value)) {\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n this.avatarUrl = this.formConfigService.getViewFileUrl(objStorageList[0].name ?? '', false);\r\n }\r\n }\r\n\r\n beforeUpload = (file: NzUploadFile, fileList: NzUploadFile[]): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxSizeInMB, acceptedMimeTypes } = this.fieldSignal();\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n const { uploadTemp } = this.fieldSignal();\r\n const newFileName = this.formConfigService.generateRandomFileName(file.name, 'avatar');\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const formData = new FormData();\r\n formData.append('File', renamedFile);\r\n // formData.append('isTemp', 'true');\r\n if (uploadTemp) formData.append('isTemp', 'true');\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, { uploadUrl: this.fieldSignal().apiFileConfig.uploadUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([data]);\r\n\r\n this.avatarUrl = this.formConfigService.getViewFileUrl(data.name ?? '', true);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error('Lỗi trong quá trình tải lên ảnh đại diện!!');\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n this.objStorageList.set([]);\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n }\r\n\r\n handlePreview(): void {}\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, { deleteUrl: this.fieldSignal().apiFileConfig.deleteUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([]);\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error('Lỗi trong quá trình xóa tập tin khỏi máy chủ!!');\r\n // Tạm do api xóa có vấn đề\r\n this.objStorageList.set([]);\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n },\r\n });\r\n }\r\n}\r\n","<nz-upload\r\n [nzDisabled]=\"isDisabled\"\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n [nzDisabled]=\"!!isView()\"\r\n>\r\n <ng-container *ngTemplateOutlet=\"renderAvatarTpl\"></ng-container>\r\n</nz-upload>\r\n\r\n<!-- Template custom hiển thị avatar -->\r\n<ng-template #renderAvatarTpl>\r\n <div class=\"avatar-wrapper\" [ngStyle]=\"{ width: size + 'px', height: size + 'px' }\">\r\n @if (!avatarUrl && isAddOrEdit()) {\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\" class=\"upload-icon\"></span>\r\n }\r\n\r\n @if (avatarUrl) {\r\n <img [src]=\"avatarUrl\" alt=\"\" class=\"avatar-img\" />\r\n }\r\n </div>\r\n</ng-template>\r\n","import { Component, computed, effect, forwardRef, inject, signal, untracked } from '@angular/core';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { NzUploadFile, NzUploadModule, NzUploadXHRArgs } from 'ng-zorro-antd/upload';\r\nimport { MultiFileUploadField } from '../../../../models/fields/upload/multi-file-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { isValidJSON } from '../../../../utils/common';\r\nimport { MyUploadFile } from '../../../../models/common/common.model';\r\nimport { ObjectStorage } from '../../../../models/common';\r\nimport { FileService } from '../../../../services/file.service';\r\nimport { Observable, of, Subscription } from 'rxjs';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { formatFileSize, getExtensions } from '../../../../utils/file';\r\nimport { FileSizeTypeEnum } from '../../../../enums/common';\r\nimport { FormConfigService } from '../../../../services/form-config.service';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzMessageService } from 'ng-zorro-antd/message';\r\n\r\nconst ZORRO_MODULES = [NzUploadModule, NzIconModule, NzButtonModule];\r\n\r\n@Component({\r\n selector: 'app-multi-file-upload',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './multi-file-upload.component.html',\r\n styleUrl: './multi-file-upload.component.scss',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiFileUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiFileUploadComponent extends BaseValueAccessor<string | File | NzUploadFile> {\r\n // Cast lại đúng instance là MultiFileUploadFile.\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiFileUploadField) ||\r\n (base.type !== FieldTypeEnum.MultiFileUpload && base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error('Expected MultiFileUploadField');\r\n }\r\n return base;\r\n });\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các images.\r\n allFiles = signal<MyUploadFile[]>([]);\r\n\r\n // Text hướng dẫn các loại extension được upload.\r\n fileExtensionGuide = signal('');\r\n\r\n // Đếm số file đã pass beforeUpload nhưng chưa upload xong (đang trong hàng chờ customRequest/uploadFile).\r\n // Dùng để tính toán count chính xác khi user chọn nhiều file cùng lúc.\r\n pendingCount = signal<number>(0);\r\n\r\n // Buffer chứa các file đang chờ xử lý trong một batch (một lần chọn file từ dialog).\r\n private _batchBuffer: Array<{\r\n file: NzUploadFile;\r\n resolve: (pass: boolean) => void;\r\n }> = [];\r\n\r\n // Timer dùng để phát hiện kết thúc một batch (setTimeout(0)).\r\n private _batchTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n private fileService = inject(FileService);\r\n private toast = inject(ToastrService);\r\n private translate = inject(TranslateService);\r\n private nzMessage = inject(NzMessageService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { acceptedMimeTypes } = field;\r\n\r\n this.fileExtensionGuide.set(\r\n `Hỗ trợ các định dạng ${getExtensions(acceptedMimeTypes).join(', ')}`,\r\n );\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this._clearBatch(); // Hủy batch đang xử lý trước khi reset.\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorageList, allFiles, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n // Khởi tạo danh sách ObjectStorage từ data json.\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n // File từ server luôn ở trạng thái success.\r\n const myUploadFiles = objStorageList.map(\r\n objStorage =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: this.formConfigService.getViewFileUrl(objStorage.name ?? '', false),\r\n uploadStatus: 'success',\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n }\r\n }\r\n\r\n /**\r\n * Xử lý trước khi upload — trả về Observable<boolean> để hỗ trợ batch detection.\r\n *\r\n * Cơ chế batch detection:\r\n * nz-upload gọi beforeUpload() từng file một (đồng bộ) trong cùng 1 JS tick khi user\r\n * chọn nhiều file. Mỗi lần gọi, file được đẩy vào _batchBuffer. Sau khi tất cả các\r\n * lần gọi đồng bộ kết thúc, setTimeout(0) kích hoạt _processBatch() để xử lý toàn bộ\r\n * batch một lần, cho phép kiểm tra tổng số lượng chính xác trước khi upload.\r\n */\r\n beforeUpload = (file: NzUploadFile): Observable<boolean> => {\r\n return new Observable<boolean>(subscriber => {\r\n // Đẩy file vào buffer với hàm resolve tương ứng.\r\n this._batchBuffer.push({\r\n file,\r\n resolve: (pass: boolean) => {\r\n subscriber.next(pass);\r\n subscriber.complete();\r\n },\r\n });\r\n\r\n // Reset timer mỗi lần có file mới vào buffer.\r\n // Khi tất cả beforeUpload synchronous calls kết thúc, timer sẽ fire và gọi _processBatch().\r\n if (this._batchTimer !== null) clearTimeout(this._batchTimer);\r\n this._batchTimer = setTimeout(() => this._processBatch(), 0);\r\n });\r\n };\r\n\r\n /**\r\n * Xử lý toàn bộ batch file sau khi tất cả beforeUpload calls trong cùng 1 tick đã hoàn tất.\r\n *\r\n * Logic:\r\n * 1. Nếu tổng (file hiện tại + pending + batch) vượt maxFileCount → reject TOÀN BỘ batch.\r\n * 2. Validate từng file trong batch:\r\n * - File thỏa (MIME + size) → pendingCount++, resolve(true) → cho phép upload.\r\n * - File không thỏa → hiển thị NzMessage lỗi, resolve(false) → bỏ qua.\r\n */\r\n private _processBatch(): void {\r\n const batch = [...this._batchBuffer];\r\n this._batchBuffer = [];\r\n this._batchTimer = null;\r\n\r\n const { maxFileCount, maxSizeInMB, acceptedMimeTypes } = this.fieldSignal();\r\n\r\n // Số file hiện tại: đã upload xong + đang trong hàng chờ upload.\r\n const currentCount = this.allFiles().length + this.pendingCount();\r\n\r\n // ── CHECK 1: Tổng batch vượt maxFileCount → reject TOÀN BỘ batch ──\r\n if (currentCount + batch.length > maxFileCount) {\r\n this.toast.warning(\r\n this.translate.instant(\r\n `Không thể tải lên: số lượng file chọn (${batch.length}) vượt quá giới hạn cho phép. Tối đa ${maxFileCount} tập tin.`,\r\n ),\r\n );\r\n batch.forEach(({ resolve }) => resolve(false));\r\n return;\r\n }\r\n\r\n // ── CHECK 2: Validate từng file — upload file thỏa, báo lỗi file không thỏa ──\r\n for (const { file, resolve } of batch) {\r\n const originFile = file as unknown as File;\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type ?? '';\r\n\r\n const isSizeOk = fileSizeInMB <= maxSizeInMB;\r\n const isMimeOk = acceptedMimeTypes.includes(fileType);\r\n\r\n if (!isSizeOk || !isMimeOk) {\r\n // Xây dựng thông báo lỗi chi tiết cho từng file không thỏa.\r\n const reasons: string[] = [];\r\n if (!isMimeOk) reasons.push(`định dạng không hợp lệ`);\r\n if (!isSizeOk) reasons.push(`kích thước vượt ${maxSizeInMB}MB`);\r\n\r\n this.nzMessage.error(`\"${file.name}\" không được tải lên: ${reasons.join(', ')}.`);\r\n\r\n // Propagate để CVA/validator hiển thị trạng thái lỗi trên control.\r\n this.propagateValue(originFile);\r\n resolve(false);\r\n continue;\r\n }\r\n\r\n // File hợp lệ: thêm optimistic entry vào allFiles với trạng thái loading ngay lập tức.\r\n // Dùng file.uid (do nz-upload tự tạo, duy nhất cho mỗi NzUploadFile) làm key để track và update sau này.\r\n const uid = file.uid;\r\n this.allFiles.update(curr => [\r\n ...curr,\r\n {\r\n uid,\r\n objStorage: { id: uid, name: originFile.name }, // placeholder, sẽ được thay bằng data thật sau khi upload\r\n isTemp: true,\r\n previewUrl: '',\r\n uploadStatus: 'loading',\r\n } as MyUploadFile,\r\n ]);\r\n\r\n // Propagate để trigger validator, tăng pendingCount, cho phép upload.\r\n this.propagateValue(originFile);\r\n this.pendingCount.update(c => c + 1);\r\n resolve(true);\r\n }\r\n }\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const uid = item.file.uid; // Stable key để map với optimistic entry trong allFiles.\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây và xóa optimistic entry khỏi list.\r\n if (this.control?.invalid) {\r\n this.pendingCount.update(c => Math.max(0, c - 1));\r\n this.allFiles.update(curr => curr.filter(f => f.uid !== uid));\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile, uid);\r\n };\r\n\r\n private uploadFile(file: File, uid: string) {\r\n const { apiFileConfig, uploadTemp } = this.fieldSignal();\r\n const newFileName = this.formConfigService.generateRandomFileName(file.name, 'file');\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {})\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append('File', renamedFile);\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append('isTemp', 'true');\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, { uploadUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n // Giảm pending dù thành công hay thất bại.\r\n this.pendingCount.update(c => Math.max(0, c - 1));\r\n\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n // Cập nhật objStorageList với data thật từ server.\r\n this.objStorageList.update(curr => [...curr, data]);\r\n\r\n // Thay thế optimistic entry (uid) bằng data thật, chuyển sang trạng thái success.\r\n this.allFiles.update(curr =>\r\n curr.map(f =>\r\n f.uid === uid\r\n ? ({\r\n ...f,\r\n objStorage: data,\r\n previewUrl: this.formConfigService.getViewFileUrl(data.name ?? '', true),\r\n uploadStatus: 'success',\r\n } as MyUploadFile)\r\n : f,\r\n ),\r\n );\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Đồng bộ control value → validators (required) nhận biết có file thành công.\r\n this._syncControlValue();\r\n } else {\r\n // Cập nhật optimistic entry sang trạng thái error.\r\n this.allFiles.update(curr =>\r\n curr.map(f =>\r\n f.uid === uid ? ({ ...f, uploadStatus: 'error' } as MyUploadFile) : f,\r\n ),\r\n );\r\n console.error(message);\r\n // Đồng bộ control value → nếu tất cả file đều fail, objStorageList rỗng → required kích hoạt.\r\n this._syncControlValue();\r\n }\r\n },\r\n error: () => {\r\n // Giảm pending khi upload thất bại.\r\n this.pendingCount.update(c => Math.max(0, c - 1));\r\n // Cập nhật optimistic entry sang trạng thái error.\r\n this.allFiles.update(curr =>\r\n curr.map(f => (f.uid === uid ? ({ ...f, uploadStatus: 'error' } as MyUploadFile) : f)),\r\n );\r\n console.error('Lỗi trong quá trình tải tập đến máy chủ!!');\r\n // Đồng bộ control value → nếu tất cả file đều fail → required kích hoạt.\r\n this._syncControlValue();\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage, uploadStatus } = file;\r\n const { uploadTemp } = this.fieldSignal();\r\n\r\n // Loại bỏ và cập nhật danh sách ObjectStorage.\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== objStorage?.id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(item => item.objStorage?.id !== objStorage?.id);\r\n this.allFiles.set(newAllFiles);\r\n\r\n // File ở trạng thái error: upload chưa thành công, không cần gọi API xoá trên server.\r\n if (uploadStatus === 'error') {\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Đồng bộ control value → nếu xóa hết file error còn lại → required kích hoạt.\r\n this._syncControlValue();\r\n return;\r\n }\r\n\r\n if (uploadTemp) {\r\n this.deleteObjStorage(objStorage.id || '');\r\n return;\r\n }\r\n\r\n // Cập nhật đầu ra cho form.\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Đồng bộ control value → nếu xóa hết file → required kích hoạt.\r\n this._syncControlValue();\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, { deleteUrl: this.fieldSignal().apiFileConfig.deleteUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Đồng bộ control value sau khi server xác nhận xóa.\r\n this._syncControlValue();\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error('Lỗi trong quá trình xóa tập tin khỏi máy chủ!!');\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Đồng bộ control value (fake delete thành công).\r\n this._syncControlValue();\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý click vào file item:\r\n * - Không làm gì nếu file đang loading hoặc ở trạng thái error.\r\n * - Gọi fileClick để xem file nếu đã upload thành công.\r\n */\r\n onFileItemClick(file: MyUploadFile): void {\r\n if (file.uploadStatus === 'loading' || file.uploadStatus === 'error') return;\r\n this.fileService.onFileClick(file.objStorage);\r\n }\r\n\r\n fileClick(objStorage: ObjectStorage): void {\r\n this.fileService.onFileClick(objStorage);\r\n }\r\n\r\n /**\r\n * Hủy toàn bộ batch đang chờ xử lý:\r\n * - Clear timer batch detection.\r\n * - Reject tất cả file trong buffer (resolve false).\r\n * - Reset pendingCount về 0.\r\n * Gọi khi form bị reset từ bên ngoài.\r\n */\r\n private _clearBatch(): void {\r\n if (this._batchTimer !== null) {\r\n clearTimeout(this._batchTimer);\r\n this._batchTimer = null;\r\n }\r\n this._batchBuffer.forEach(({ resolve }) => resolve(false));\r\n this._batchBuffer = [];\r\n this.pendingCount.set(0);\r\n }\r\n\r\n /**\r\n * Đồng bộ control value với trạng thái thực tế của danh sách file đã upload thành công.\r\n *\r\n * Gọi sau mỗi thay đổi về danh sách file (upload xong, xóa file) để đảm bảo:\r\n * - Không có file nào thành công → propagateValue('') → Validators.required kích hoạt.\r\n * - Có ít nhất 1 file thành công → propagateValue(JSON string) → validators pass.\r\n *\r\n * Validators hiện tại tương thích:\r\n * - acceptedMimeTypesValidator: bỏ qua nếu value falsy; parse JSON nếu là string.\r\n * - maxFileSizeInMBValidator: bỏ qua nếu value.size undefined (JSON string).\r\n */\r\n private _syncControlValue(): void {\r\n const list = this.objStorageList();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.propagateValue((list.length > 0 ? JSON.stringify(list) : '') as any);\r\n }\r\n}\r\n","@if (isAddOrEdit()) {\r\n <nz-upload\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"true\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button nz-button class=\"btn-upload\" nzType=\"primary\" nzSize=\"small\">\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n <span class=\"font-size-12\">Tải lên</span>\r\n </button>\r\n\r\n <span class=\"font-size-12\">( Tối đa {{ fieldSignal().maxFileCount }} tập tin )</span>\r\n\r\n @if (fieldSignal().showAcceptedExtensionGuide) {\r\n <div class=\"file-extension-guide\">{{ fileExtensionGuide() }}</div>\r\n }\r\n </nz-upload>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách tập tin -->\r\n@if (allFiles().length > 0) {\r\n <ng-container *ngTemplateOutlet=\"renderFileTpl\"></ng-container>\r\n}\r\n\r\n<!-- Template custom hiển thị danh sách tập tin -->\r\n<ng-template #renderFileTpl>\r\n <ul class=\"custom-upload-list\">\r\n @for (file of allFiles(); track file.objStorage?.id) {\r\n <li\r\n class=\"upload-item\"\r\n [class.is-loading]=\"file.uploadStatus === 'loading'\"\r\n [class.is-error]=\"file.uploadStatus === 'error'\"\r\n (click)=\"onFileItemClick(file)\"\r\n >\r\n <!-- Icon trạng thái bên trái -->\r\n @switch (file.uploadStatus) {\r\n @case ('loading') {\r\n <span\r\n nz-icon\r\n nzType=\"loading\"\r\n nzTheme=\"outline\"\r\n class=\"status-icon loading-icon\"\r\n ></span>\r\n }\r\n @case ('error') {\r\n <span\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"fill\"\r\n class=\"status-icon error-icon\"\r\n ></span>\r\n }\r\n @default {\r\n <span nz-icon nzType=\"paper-clip\" nzTheme=\"outline\" class=\"paper-clip-icon\"></span>\r\n }\r\n }\r\n\r\n <span class=\"file-name\" [title]=\"file.objStorage.name ?? ''\">{{\r\n file.objStorage.name\r\n }}</span>\r\n\r\n @if (isAddOrEdit() && file.uploadStatus !== 'loading') {\r\n <span\r\n nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n title=\"Xóa\"\r\n class=\"delete-icon\"\r\n (click)=\"handleDelete(file); $event.stopPropagation()\"\r\n ></span>\r\n }\r\n\r\n @if (!isAddOrEdit() && file.uploadStatus !== 'error' && file.uploadStatus !== 'loading') {\r\n <span nz-icon nzType=\"eye\" nzTheme=\"outline\" class=\"view-icon\" title=\"Xem file\"></span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</ng-template>\r\n","import { Component, computed, effect, forwardRef, inject, signal } from '@angular/core';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { NzUploadFile, NzUploadModule, NzUploadXHRArgs } from 'ng-zorro-antd/upload';\r\nimport { MultiImageUploadField } from '../../../../models/fields/upload/multi-image-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { isValidJSON } from '../../../../utils/common';\r\nimport { MyUploadFile } from '../../../../models/common/common.model';\r\nimport { ObjectStorage } from '../../../../models/common';\r\nimport { FileService } from '../../../../services/file.service';\r\nimport { Observable, of, Subscription } from 'rxjs';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { formatFileSize } from '../../../../utils/file';\r\nimport { FileSizeTypeEnum } from '../../../../enums/common';\r\nimport { FormConfigService } from '../../../../services/form-config.service';\r\nimport { NzImageModule } from 'ng-zorro-antd/image';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\n\r\nconst ZORRO_MODULES = [NzUploadModule, NzIconModule, NzButtonModule, NzImageModule];\r\n\r\n@Component({\r\n selector: 'app-multi-image-upload',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './multi-image-upload.component.html',\r\n styleUrl: './multi-image-upload.component.less',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiImageUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiImageUploadComponent extends BaseValueAccessor<string | File | NzUploadFile> {\r\n // Cast lại đúng instance là MultiImageUploadField.\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiImageUploadField) ||\r\n (base.type !== FieldTypeEnum.MultiImageUpload && base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error('Expected MultiImageUploadField');\r\n }\r\n return base;\r\n });\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến hình ảnh.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các images.\r\n allFiles = signal<MyUploadFile[]>([]);\r\n\r\n private fileService = inject(FileService);\r\n private toast = inject(ToastrService);\r\n private translate = inject(TranslateService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorageList, allFiles, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n // Khởi tạo danh sách ObjectStorage từ data json.\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n const myUploadFiles = objStorageList.map(\r\n objStorage =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: this.formConfigService.getViewFileUrl(objStorage.name ?? '', false),\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n }\r\n }\r\n\r\n // Xử lý trước khi upload.\r\n beforeUpload = (file: NzUploadFile): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxFileCount, maxSizeInMB, acceptedMimeTypes } = this.fieldSignal();\r\n // Kiểm tra số lượng tối đa hình ảnh có thể tải lên.\r\n if (this.allFiles().length + 1 > maxFileCount) {\r\n this.toast.warning(\r\n this.translate.instant(`Chỉ được phép tải lên tối đa ${maxFileCount} hình ảnh`),\r\n );\r\n return false;\r\n }\r\n\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n // Luôn trả về true vì lúc này chưa bắt kịp control là valid hay invalid.\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n const { apiFileConfig, uploadTemp } = this.fieldSignal();\r\n const newFileName = this.formConfigService.generateRandomFileName(file.name, 'file');\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {})\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append('File', renamedFile);\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append('isTemp', 'true');\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, { uploadUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.update(curr => [...curr, data]);\r\n\r\n this.allFiles.update(curr => [\r\n ...curr,\r\n {\r\n objStorage: data,\r\n isTemp: true,\r\n previewUrl: this.formConfigService.getViewFileUrl(data.name ?? '', true),\r\n } as MyUploadFile,\r\n ]);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error('Lỗi trong quá trình tải hình ảnh đến máy chủ!!');\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage } = file;\r\n\r\n // Loại bỏ và cập nhật danh sách ObjectStorage.\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== objStorage?.id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(item => item.objStorage?.id !== objStorage?.id);\r\n this.allFiles.set(newAllFiles);\r\n\r\n // Cập nhật đầu ra cho form.\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, { deleteUrl: this.fieldSignal().apiFileConfig.deleteUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error('Lỗi trong quá trình xóa tập tin khỏi máy chủ!!');\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n },\r\n });\r\n }\r\n\r\n protected handlePreview(file: MyUploadFile): void {\r\n const imgRef = document.getElementById(file.objStorage.id);\r\n if (imgRef) imgRef.click();\r\n }\r\n}\r\n","@if (isAddOrEdit()) {\r\n <div class=\"upload\">\r\n <nz-upload\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button nz-button class=\"btn-upload\">\r\n Tải lên\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n </button>\r\n\r\n <span>Tối đa {{ fieldSignal().maxFileCount }} hình ảnh.</span>\r\n </nz-upload>\r\n </div>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách hình ảnh -->\r\n@if (allFiles().length > 0) {\r\n <ng-container *ngTemplateOutlet=\"imageGroupTpl\"></ng-container>\r\n}\r\n\r\n<!-- Template custom hiển thị danh sách hình ảnh -->\r\n<ng-template #imageGroupTpl>\r\n <nz-image-group>\r\n <div class=\"image-list\">\r\n @for (file of allFiles(); track file.objStorage?.id; let i = $index) {\r\n <div\r\n class=\"image-card-container\"\r\n [ngStyle]=\"{\r\n width: fieldSignal().imageCardWidth,\r\n height: fieldSignal().imageCardHeight,\r\n }\"\r\n >\r\n <div class=\"image-item\">\r\n <div class=\"image-item-info\">\r\n <img\r\n [id]=\"file.objStorage.id\"\r\n nz-image\r\n nzSrc=\"{{ file.previewUrl }}\"\r\n alt=\"{{ file.objStorage.originalName }}\"\r\n />\r\n </div>\r\n\r\n <div class=\"image-item-actions\">\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"handlePreview(file)\">\r\n <nz-icon nzType=\"eye\" nzTheme=\"outline\" />\r\n </button>\r\n\r\n @if (isAddOrEdit()) {\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"handleDelete(file)\">\r\n <nz-icon nzType=\"delete\" nzTheme=\"outline\" />\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </nz-image-group>\r\n</ng-template>\r\n","import { Component, computed, effect, forwardRef, inject, signal, untracked } from '@angular/core';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { SingleFileUploadField } from '../../../../models/fields/upload/single-file-upload-field.model';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NzUploadFile, NzUploadModule, NzUploadXHRArgs } from 'ng-zorro-antd/upload';\r\nimport { finalize, Observable, of, Subscription } from 'rxjs';\r\nimport { FileService } from '../../../../services/file.service';\r\nimport { ObjectStorage } from '../../../../models/common/object-storage.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { MyUploadFile } from '../../../../models/common/common.model';\r\nimport { formatFileSize, getExtensions } from '../../../../utils/file';\r\nimport { isValidJSON } from '../../../../utils/common';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { FileSizeTypeEnum } from '../../../../enums/common';\r\nimport { FormUtils } from '../../../../services/form-utils';\r\nimport { FormConfigService } from '../../../../services/form-config.service';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\n\r\nconst ZORRO_MODULES = [NzUploadModule, NzIconModule, NzInputModule, NzButtonModule, NzSpinModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\n@Component({\r\n selector: 'app-single-file-upload',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './single-file-upload.component.html',\r\n styleUrls: ['./single-file-upload.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SingleFileUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SingleFileUploadComponent extends BaseValueAccessor<string | File | NzUploadFile> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof SingleFileUploadField) ||\r\n (base.type !== FieldTypeEnum.SingleFileUpload && base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error('Expected SingleFileUploadField');\r\n }\r\n return base;\r\n });\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các files.\r\n allFiles = signal<MyUploadFile[]>([]);\r\n\r\n // Text hướng dẫn các loại extension được upload.\r\n fileExtensionGuide = signal('');\r\n\r\n inputDisplayValue = '';\r\n readonly uploading = signal(false);\r\n\r\n private fileService = inject(FileService);\r\n private toast = inject(ToastrService);\r\n private translate = inject(TranslateService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { acceptedMimeTypes } = field;\r\n\r\n this.fileExtensionGuide.set(\r\n `Hỗ trợ định dạng ${getExtensions(acceptedMimeTypes).join(', ')}`,\r\n );\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const allFiles = this.allFiles();\r\n this.inputDisplayValue = allFiles[0]\r\n ? (allFiles[0].objStorage.nameAlias ?? allFiles[0].objStorage.name) || 'Không có thông tin'\r\n : 'Không có thông tin';\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorage, myFile, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n const myUploadFiles = objStorageList.map(\r\n objStorage =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: `${this.formConfigService.getStorageUrl()}${objStorage.bucket}/${objStorage.path}`,\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n } else {\r\n if (value) {\r\n this.allFiles.set([\r\n { isTemp: false, objStorage: { id: '', name: value }, previewUrl: '' } as MyUploadFile,\r\n ]);\r\n }\r\n }\r\n }\r\n\r\n beforeUpload = (file: NzUploadFile, fileList: NzUploadFile[]): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxSizeInMB, acceptedMimeTypes } = this.fieldSignal();\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n this.uploading.set(true);\r\n const { apiFileConfig, uploadTemp } = this.fieldSignal();\r\n const newFileName = FormUtils.randomFileName(file.name);\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {\r\n fileName: newFileName,\r\n })\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append('File', file, newFileName);\r\n if (apiFileConfig.uploadByPath && apiFileConfig.uploadPath) {\r\n fd.append('path', apiFileConfig.uploadPath);\r\n }\r\n\r\n if (apiFileConfig.isOriginName) {\r\n fd.append('nameAlias', file.name);\r\n }\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append('isTemp', 'true');\r\n\r\n return this.fileService\r\n .uploadFile(file, formData, { uploadUrl })\r\n .pipe(\r\n this.takeUntilDestroy(),\r\n finalize(() => this.uploading.set(false)),\r\n )\r\n .subscribe({\r\n next: res => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([data]);\r\n\r\n this.allFiles.set([\r\n {\r\n objStorage: data,\r\n isTemp: true,\r\n previewUrl: uploadTemp\r\n ? this.formConfigService.getViewFileUrl(data.name ?? '', true)\r\n : `${this.formConfigService.getStorageUrl()}${data.bucket}/${data.path}`,\r\n } as MyUploadFile,\r\n ]);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error('Lỗi trong quá trình tải tập tin đến máy chủ!!');\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage } = file;\r\n const { uploadTemp } = this.fieldSignal();\r\n\r\n this.objStorageList.set([]);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(item => item.objStorage?.id !== objStorage?.id);\r\n this.allFiles.set(newAllFiles);\r\n\r\n if (!uploadTemp) {\r\n this.deleteObjStorage(objStorage.id || '');\r\n return;\r\n }\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n\r\n return;\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, { deleteUrl: this.fieldSignal().apiFileConfig.deleteUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([]);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error('Lỗi trong quá trình xóa tập tin khỏi máy chủ!!');\r\n // Tạm do api xóa có vấn đề\r\n this.objStorageList.set([]);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n <input nz-input [value]=\"inputDisplayValue\" class=\"modeView\" />\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n <span class=\"modeView\">{{ inputDisplayValue }}</span>\r\n }\r\n }\r\n @if (isAddOrEdit()) {\r\n <nz-spin [nzSpinning]=\"uploading()\" nzTip=\"Đang tải lên\" class=\"width-100\">\r\n <div class=\"d-flex\">\r\n <nz-input-group\r\n [nzSuffix]=\"allFiles().length > 0 && isAddOrEdit() ? deleteIcon : undefined\"\r\n class=\"flex-1\"\r\n >\r\n <input nz-input [value]=\"inputDisplayValue\" class=\"no-events\" />\r\n </nz-input-group>\r\n <nz-upload\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button nz-button class=\"btn-upload height-100 text-white\">\r\n <span class=\"font-size-12\">Tải lên</span>\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n </button>\r\n </nz-upload>\r\n </div>\r\n </nz-spin>\r\n }\r\n\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n@if (fieldSignal().showAcceptedExtensionGuide && fileExtensionGuide()) {\r\n <div class=\"file-extension-guide\">{{ fileExtensionGuide() }}</div>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách tập tin -->\r\n@if (allFiles().length > 0) {\r\n <!-- <ng-container *ngTemplateOutlet=\"renderFileTpl\"></ng-container> -->\r\n}\r\n\r\n<!-- Template custom hiển thị danh sách tập tin -->\r\n<ng-template #renderFileTpl>\r\n <ul class=\"custom-upload-list\">\r\n @for (file of allFiles() | slice: 0 : 1; track file.objStorage?.id) {\r\n <li class=\"upload-item\">\r\n <span nz-icon nzType=\"paper-clip\" nzTheme=\"outline\" class=\"paper-clip-icon\"></span>\r\n\r\n <span class=\"filename\">{{ file.objStorage.name }}</span>\r\n\r\n @if (isAddOrEdit()) {\r\n <span\r\n nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n title=\"Xóa\"\r\n class=\"delete-icon\"\r\n (click)=\"handleDelete(file)\"\r\n ></span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #deleteIcon>\r\n <span\r\n title=\"Xóa\"\r\n class=\"mdi mdi-delete cursor-pointer text-error\"\r\n (click)=\"handleDelete(allFiles()[0])\"\r\n ></span>\r\n</ng-template>\r\n","import { DatePickerComponent } from './fields/date/date-picker/date-picker.component';\r\nimport { DateRangeComponent } from './fields/date/date-range/date-range.component';\r\nimport { InputPasswordComponent } from './fields/input/input-password/input-password.component';\r\nimport { InputTextComponent } from './fields/input/input-text/input-text.component';\r\nimport { ReminderTypeRadioComponent } from './fields/radio/custom/reminder-type-radio/reminder-type-radio.component';\r\nimport { MultiSelectComponent } from './fields/select/multi-select/multi-select.component';\r\nimport { SingleSelectComponent } from './fields/select/single-select/single-select.component';\r\nimport { TreeSelectComponent } from './fields/select/tree-select/tree-select.component';\r\nimport { TextareaComponent } from './fields/textarea/textarea.component';\r\nimport { AvatarUploadComponent } from './fields/upload/avatar-upload/avatar-upload.component';\r\nimport { MultiFileUploadComponent } from './fields/upload/multi-file-upload/multi-file-upload.component';\r\nimport { MultiImageUploadComponent } from './fields/upload/multi-image-upload/multi-image-upload.component';\r\nimport { SingleFileUploadComponent } from './fields/upload/single-file-upload/single-file-upload.component';\r\n\r\n// Các field component đại diện cho giao diện của từng control.\r\nexport const FIELD_COMPONENTS = [\r\n InputTextComponent,\r\n InputPasswordComponent,\r\n\r\n SingleSelectComponent,\r\n MultiSelectComponent,\r\n TreeSelectComponent,\r\n\r\n TextareaComponent,\r\n\r\n DatePickerComponent,\r\n DateRangeComponent,\r\n\r\n SingleFileUploadComponent,\r\n MultiFileUploadComponent,\r\n MultiImageUploadComponent,\r\n AvatarUploadComponent,\r\n\r\n ReminderTypeRadioComponent,\r\n];\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { BaseField } from '../models/fields/field.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ValidationService {\r\n constructor() {}\r\n\r\n getFirstError(control: AbstractControl, field: BaseField<any>, fields: BaseField<any>[]): string {\r\n // if (field.key === 'reminder') console.log(\"control?.errors\", field.key, control?.errors);\r\n if (!control?.errors || !field) return '';\r\n\r\n const errorKey = Object.keys(control.errors)?.[0] || '';\r\n const errorValue = control.errors?.[errorKey];\r\n\r\n return this.getErrorMessage(errorKey, errorValue, field, fields);\r\n }\r\n\r\n private getErrorMessage(\r\n errorKey: string,\r\n errorValue: any,\r\n field: BaseField<any>,\r\n allFields: BaseField<any>[],\r\n ): string {\r\n let finalErrorMessage = '';\r\n\r\n const customMessage = field.errorMessages?.[errorKey];\r\n if (customMessage) return customMessage;\r\n\r\n // 2. Nếu field có hàm getErrorMessage riêng.\r\n const defaultErrorMessage = field.getErrorMessage(errorKey, errorValue, allFields);\r\n if (defaultErrorMessage) return defaultErrorMessage;\r\n\r\n return `Chưa cấu hình message lỗi cho trường ${field.key}`;\r\n }\r\n}\r\n","import { Component, inject, input } from '@angular/core';\r\nimport { BaseField } from '../../models/fields/field.model';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { FormMode } from '../../models/form';\r\nimport { FORM_MODULES } from '../../consts/common';\r\nimport { FIELD_COMPONENTS } from '../component';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { FieldTypeEnum } from '../../enums/fields';\r\nimport { FormModeEnum } from '../../enums/form';\r\nimport { ValidationService } from '../../services/validation.service';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\n\r\nconst ZORRO_MODULES = [NzFormModule, NzGridModule];\r\nconst COMPONENTS = [...FIELD_COMPONENTS];\r\n\r\n@Component({\r\n selector: 'app-dynamic-field',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './dynamic-field.component.html',\r\n styleUrls: ['./dynamic-field.component.scss'],\r\n})\r\nexport class DynamicFieldComponent {\r\n readonly field = input.required<BaseField<any>>();\r\n readonly fields = input.required<BaseField<any>[]>();\r\n readonly mode = input.required<FormMode>();\r\n readonly control = input.required<AbstractControl>();\r\n readonly formGroup = input.required<FormGroup>();\r\n readonly formId = input.required<string>();\r\n\r\n fieldTypeEnum = FieldTypeEnum;\r\n formModeEnum = FormModeEnum;\r\n\r\n private validationService = inject(ValidationService);\r\n\r\n /**\r\n * Lấy thông báo lỗi đầu tiên của trường đang thao tác dựa trên control và field.\r\n */\r\n protected getErrorMessage(): string {\r\n return this.validationService.getFirstError(this.control(), this.field(), this.fields()) ?? '';\r\n }\r\n}\r\n","<div [formGroup]=\"formGroup()\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzXXl]=\"field().labelGrid.xxl ?? null\"\r\n [nzXl]=\"field().labelGrid.xl ?? null\"\r\n [nzLg]=\"field().labelGrid.lg ?? null\"\r\n [nzMd]=\"field().labelGrid.md ?? null\"\r\n [nzSm]=\"field().labelGrid.sm ?? null\"\r\n [nzXs]=\"field().labelGrid.xs ?? null\"\r\n [nzLabelAlign]=\"field().labelAlign\"\r\n >\r\n @if (field().required) {\r\n <span class=\"required\">*</span>\r\n }\r\n <span class=\"form-label\">\r\n {{ field().label }}\r\n @if (field().sublabel) {\r\n <span class=\"sub-label mb-sm\">{{ field().sublabel }}</span>\r\n }\r\n </span>\r\n </nz-form-label>\r\n\r\n <nz-form-control\r\n [nzXXl]=\"field().controlGrid.xxl ?? null\"\r\n [nzXl]=\"field().controlGrid.xl ?? null\"\r\n [nzLg]=\"field().controlGrid.lg ?? null\"\r\n [nzMd]=\"field().controlGrid.md ?? null\"\r\n [nzSm]=\"field().controlGrid.sm ?? null\"\r\n [nzXs]=\"field().controlGrid.xs ?? null\"\r\n [nzErrorTip]=\"getErrorMessage()\"\r\n >\r\n @switch (field().type) {\r\n <!-- Input text -->\r\n @case (fieldTypeEnum.InputText) {\r\n <app-input-text\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-input-text>\r\n }\r\n\r\n <!-- Input password -->\r\n @case (fieldTypeEnum.InputPassword) {\r\n @if (mode() === formModeEnum.Add) {\r\n <app-input-password\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-input-password>\r\n }\r\n }\r\n\r\n <!-- Textarea -->\r\n @case (fieldTypeEnum.Textarea) {\r\n <app-textarea\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-textarea>\r\n }\r\n\r\n <!-- Single select -->\r\n @case (fieldTypeEnum.SingleSelect) {\r\n <app-single-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-single-select>\r\n }\r\n\r\n <!-- Multi select -->\r\n @case (fieldTypeEnum.MultiSelect) {\r\n <app-multi-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-select>\r\n }\r\n\r\n @case (fieldTypeEnum.TreeSelect) {\r\n <app-tree-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-tree-select>\r\n }\r\n\r\n <!-- Date Picker -->\r\n @case (fieldTypeEnum.DatePicker) {\r\n <app-date-picker\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-date-picker>\r\n }\r\n\r\n <!-- Date Range -->\r\n @case (fieldTypeEnum.DateRange) {\r\n <app-date-range\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-date-range>\r\n }\r\n\r\n <!-- Single File Upload -->\r\n @case (fieldTypeEnum.SingleFileUpload) {\r\n <app-single-file-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-single-file-upload>\r\n }\r\n\r\n <!-- Multi File Upload -->\r\n @case (fieldTypeEnum.MultiFileUpload) {\r\n <app-multi-file-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-file-upload>\r\n }\r\n\r\n <!-- Multi File Upload -->\r\n @case (fieldTypeEnum.MultiImageUpload) {\r\n <app-multi-image-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-image-upload>\r\n }\r\n\r\n <!-- Avatar -->\r\n @case (fieldTypeEnum.AvatarUpload) {\r\n <app-avatar-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-avatar-upload>\r\n }\r\n\r\n <!-- Radio -->\r\n @case (fieldTypeEnum.Radio) {\r\n <span>Radio</span>\r\n }\r\n\r\n @case (fieldTypeEnum.ReminderTypeRadio) {\r\n <app-reminder-type-radio\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-reminder-type-radio>\r\n }\r\n\r\n <!-- Checkbox -->\r\n @case (fieldTypeEnum.Checkbox) {\r\n <span>Checkbox</span>\r\n }\r\n\r\n <!-- Radio -->\r\n @case (fieldTypeEnum.Radio) {\r\n <span>Radio</span>\r\n }\r\n\r\n <!-- Switch -->\r\n @case (fieldTypeEnum.Switch) {\r\n <span>Switch</span>\r\n }\r\n\r\n <!-- Autocomplete -->\r\n @case (fieldTypeEnum.Autocomplete) {\r\n <span>Autocomplete</span>\r\n }\r\n }\r\n </nz-form-control>\r\n </nz-form-item>\r\n</div>\r\n","import { BaseField } from './shared/models/fields/field.model';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n EventEmitter,\r\n inject,\r\n input,\r\n Input,\r\n output,\r\n Output,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { buildForm } from './shared/utils/dynamic-form/dynamic-form';\r\nimport { FieldTypeEnum } from './shared/enums/fields';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { FormModeEnum } from './shared/enums/form';\r\nimport { FormMode } from './shared/models/form';\r\nimport { DynamicFormService } from './shared/services/dynamic-form.service';\r\n\r\nimport { FORM_MODULES } from './shared/consts/common';\r\nimport { InputPasswordField } from './shared/models/fields/input';\r\nimport { isEqual } from 'lodash-es';\r\nimport { FieldGroup, GroupedFields } from './shared/models/fields/field-group.model';\r\nimport { buildGroupedFields } from './shared/utils/fields';\r\nimport { DynamicFieldComponent } from './shared/components/dynamic-field/dynamic-field.component';\r\nimport { debounceTime, distinctUntilChanged, Subject, takeUntil } from 'rxjs';\r\n\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzCollapseModule } from 'ng-zorro-antd/collapse';\r\nimport { FormDataService } from './shared/services/form-data.service';\r\n\r\nconst ZORRO_MODULES = [NzFormModule, NzGridModule, NzCollapseModule];\r\nconst COMPONENTS = [DynamicFieldComponent];\r\n\r\n@Component({\r\n selector: 'app-dynamic-forms',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './dynamic-form.component.html',\r\n styleUrls: ['./dynamic-form.component.scss'],\r\n})\r\nexport class DynamicFormComponent {\r\n // Id phân biệt form.\r\n @Input() formId!: string;\r\n\r\n // ===================== NGOÀI LUỒNG LOGIC ======================== //\r\n // Debounce time for form value changes (ms)\r\n // Default: 300ms\r\n // Thời gian trễ cho sự thay đổi giá trị của form (ms)\r\n @Input() valueChangesDebounceTime = 300;\r\n\r\n // Emit form value changes\r\n @Output() readonly formValueChanges = new EventEmitter<Record<string, unknown>>();\r\n\r\n // Subject for cleanup subscriptions\r\n private readonly destroy$ = new Subject<void>();\r\n // ====================================================== //\r\n\r\n // Input.\r\n // Mảng fields mới.\r\n readonly fields = input.required<BaseField<any>[]>();\r\n // Signal model data.\r\n readonly model = input<Record<string, any>>({});\r\n // Signal form mode.\r\n readonly mode = input<FormMode>(FormModeEnum.Add);\r\n // Input signal groupFields.\r\n readonly fieldGroups = input<FieldGroup[]>([]);\r\n\r\n // Cho phép show nhưng field không thuộc group nào\r\n readonly displayNonGroupedFields = input(true);\r\n\r\n // Output.\r\n readonly formSubmit = output<Record<string, unknown>>();\r\n readonly formInvalid = output<BaseField<any>[]>();\r\n\r\n // Mảng field cũ.\r\n protected readonly oldFields = signal<BaseField<any>[]>([]);\r\n\r\n // Check mode là add hay edit.\r\n readonly isAddOrEdit = computed(() =>\r\n [FormModeEnum.Add, FormModeEnum.Edit].includes(this.mode() as FormModeEnum),\r\n );\r\n\r\n // FormState check sự thay đổi giữa mode, newFields, model chỉ chạy 1 lần dù 3 cái đều đổi.\r\n readonly formState = computed(() => ({\r\n mode: this.mode(),\r\n newFields: this.fields(),\r\n model: this.model(),\r\n }));\r\n\r\n // Computed chạy lại khi fields hoặc groupFields thay đổi.\r\n groupedFields = computed<GroupedFields>(() => {\r\n const groups = this.fieldGroups();\r\n const groupedFields = buildGroupedFields(this.oldFields(), groups);\r\n return groupedFields;\r\n });\r\n\r\n protected readonly formModeEnum = FormModeEnum;\r\n protected readonly fieldTypeEnum = FieldTypeEnum;\r\n\r\n // Kiểm tra có cần ẩn field không?\r\n isHiddenField = (field: BaseField<any>): boolean => {\r\n const { isHidden } = field;\r\n if (isHidden) return true;\r\n if (field instanceof InputPasswordField) {\r\n if (this.mode() === FormModeEnum.Edit || this.mode() === FormModeEnum.View) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n // Form group cho reactive form.\r\n formGroup!: FormGroup;\r\n\r\n readonly formDataService = inject(FormDataService);\r\n constructor(private dFormService: DynamicFormService) {\r\n // Trigger form từ submit bên ngoài.\r\n effect(() => {\r\n this.dFormService.submitTrigger();\r\n if (untracked(() => this.isAddOrEdit())) {\r\n const submit = this.dFormService.submitTrigger();\r\n\r\n if (submit?.formId === this.formId) {\r\n this.handleSubmit();\r\n this.dFormService.triggerSubmit(null);\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup subscriptions\r\n // Dọn dẹp các subscription\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n // Loại bỏ output data khi dynamic form destroy component.\r\n this.formDataService.clear(this.formId);\r\n }\r\n\r\n // Đồng bộ fields sang dynamic-form service mỗi lần fields signal change.\r\n syncFieldsEffect = effect(() => {\r\n this.dFormService.setFields(this.fields());\r\n this.formDataService.clear(this.formId);\r\n });\r\n\r\n /**\r\n * Effect tạo FormGroup.\r\n */\r\n createFormGroupEffect = effect(() => {\r\n const { mode, newFields, model } = this.formState();\r\n const oldFields = untracked(() => this.oldFields());\r\n\r\n if (!this.formGroup || !isEqual(newFields, oldFields)) {\r\n this.oldFields.set(newFields);\r\n this.formGroup = buildForm(newFields, mode, model);\r\n this.dFormService.setFormGroup(this.formGroup);\r\n // Subscribe to form value changes\r\n // Lắng nghe sự thay đổi giá trị của form\r\n this.subscribeToFormValueChanges();\r\n // console.log('formGroup create from new fields', this.formGroup);\r\n return;\r\n }\r\n\r\n // patch value nếu không phải fields mới.\r\n for (const field of oldFields) {\r\n // Loại bỏ nếu quyết định ẩn field đi.\r\n if (field.isHidden) continue;\r\n\r\n // Nếu là dạng InputPasswordField nhưng ở mode edit và view thì không được dùng.\r\n if (\r\n field instanceof InputPasswordField &&\r\n (mode === FormModeEnum.Edit || mode === FormModeEnum.View)\r\n )\r\n continue;\r\n\r\n const fieldKey = field?.key;\r\n const control = this.formGroup.get(fieldKey);\r\n\r\n if (field.allowSetValue) {\r\n field.value = field.getDefaultValue();\r\n field.modelValue = null;\r\n if (model?.[fieldKey]) {\r\n field.value = field.toFormValue(model[fieldKey]);\r\n field.modelValue = model[fieldKey];\r\n }\r\n\r\n field.initialValue = field.value;\r\n }\r\n control?.reset(field.value);\r\n }\r\n // console.log('formGroup create from old fields', this.formGroup);\r\n });\r\n\r\n /**\r\n * Subscribe to form value changes\r\n * Subscribe lắng nghe sự thay đổi giá trị của form\r\n */\r\n private subscribeToFormValueChanges(): void {\r\n if (!this.formGroup) return;\r\n\r\n // Unsubscribe previous subscription if exists\r\n this.destroy$.next();\r\n\r\n this.formGroup.valueChanges\r\n .pipe(\r\n debounceTime(this.valueChangesDebounceTime),\r\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(formValue => {\r\n // console.log('Form value changed:', formValue);\r\n this.formValueChanges.emit(formValue);\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý submit form và output ra ngoài.\r\n */\r\n private handleSubmit() {\r\n const form = this.formGroup;\r\n const invalidFields: Array<BaseField<any>> = [];\r\n\r\n // Xử lý trường hợp form chưa thỏa mãn validation.\r\n if (form.invalid) {\r\n const controls = form.controls;\r\n for (const name in controls) {\r\n if (controls[name].invalid) {\r\n this.markControlForValidation(controls[name]);\r\n const field = this.fields().find(field => field.key === name);\r\n if (field) invalidFields.push(field);\r\n }\r\n }\r\n this.formInvalid.emit(invalidFields);\r\n return;\r\n }\r\n\r\n const formData = untracked(() => this.formDataService.get(this.formId));\r\n this.formSubmit.emit(formData ?? {});\r\n }\r\n\r\n /**\r\n * Kích submit form ảo khi nhấn nút submit.\r\n */\r\n private markControlForValidation(control: AbstractControl) {\r\n control.markAllAsTouched();\r\n control.markAsDirty();\r\n control.updateValueAndValidity({ onlySelf: true, emitEvent: true });\r\n }\r\n\r\n /**\r\n * TrackBy function for ngFor to optimize rendering.\r\n */\r\n protected trackByField(index: number, field: BaseField<any>): string {\r\n return field.key || `field-${index}`;\r\n }\r\n\r\n readonly collapseCustomStyle = {\r\n background: '#fff',\r\n border: '0px',\r\n };\r\n}\r\n","@if (formGroup) {\r\n <form [formGroup]=\"formGroup\">\r\n @if (oldFields().length > 0) {\r\n <!-- 1. Nếu không có groups thì render từ fields -->\r\n @if (!fieldGroups() || fieldGroups().length === 0) {\r\n <div nz-row [nzGutter]=\"[12, 0]\">\r\n @for (field of oldFields(); track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n [nzFlex]=\"\r\n !field?.grid?.xs &&\r\n !field?.grid?.sm &&\r\n !field?.grid?.md &&\r\n !field?.grid?.lg &&\r\n !field?.grid?.xl &&\r\n !field?.grid?.xxl\r\n ? '1 0 0'\r\n : null\r\n \"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- 2. Nếu có groups thì render từ groupedFields -->\r\n @if (fieldGroups() && fieldGroups().length > 0) {\r\n <!-- Các field noGroup -->\r\n @if (groupedFields().noGroup.length > 0 && displayNonGroupedFields()) {\r\n <div nz-row [nzGutter]=\"24\">\r\n @for (field of groupedFields().noGroup; track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Group các field -->\r\n @if (groupedFields().grouped.length > 0) {\r\n <nz-collapse [nzBordered]=\"false\">\r\n @for (groupField of groupedFields().grouped; track groupField.group.code) {\r\n <nz-collapse-panel\r\n [nzHeader]=\"groupField.group.template ?? groupField.group.label\"\r\n [nzActive]=\"groupField.group.isActive\"\r\n [nzShowArrow]=\"groupField.group.showArrow\"\r\n [nzDisabled]=\"groupField.group.disabled\"\r\n [style]=\"collapseCustomStyle\"\r\n class=\"mt-sm\"\r\n >\r\n <div nz-row [nzGutter]=\"24\">\r\n @for (field of groupField.fields; track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </nz-collapse-panel>\r\n }\r\n </nz-collapse>\r\n }\r\n }\r\n }\r\n </form>\r\n}\r\n","/*\n * Public API Surface of dynamic-form\n * v0.0.5 - TEST: Comment het model exports de verify loi bundle circular dependency\n */\n\n// ==========================================\n// 1. MODULE & COMPONENT & SERVICE CHINH\n// ==========================================\nexport * from \"./lib/dynamic-form.component\";\n\n// ==========================================\n// 2. CONFIGURATION & DI TOKENS\n// ==========================================\nexport * from \"./lib/shared/config/dynamic-form.config\";\nexport * from \"./lib/shared/services/form-config.service\";\nexport * from \"./lib/shared/services/dynamic-form.service\";\nexport * from \"./lib/shared/services/form-data.service\";\n\n// ==========================================\n// 3. ENUMS\n// ==========================================\nexport * from \"./lib/shared/enums/controls/index\";\nexport * from \"./lib/shared/enums/fields/index\";\nexport * from \"./lib/shared/enums/validators/index\";\nexport * from \"./lib/shared/enums/common/index\";\nexport * from \"./lib/shared/enums/form/index\";\n\n// ==========================================\n// 4-6. MODELS - COMMENTED FOR v0.0.5 TEST\n// ==========================================\n// export * from \"./lib/shared/models/common/index\";\n// export * from \"./lib/shared/models/common/table-models\";\n// export * from \"./lib/shared/models/fields/field.model\";\n// export * from \"./lib/shared/models/fields/field-grid.model\";\n// export * from \"./lib/shared/models/fields/field-group.model\";\n// export * from \"./lib/shared/models/fields/index.model\";\n// export * from \"./lib/shared/models/fields/input/index\";\n// export * from \"./lib/shared/models/fields/textarea/textarea-field.model\";\n// export * from \"./lib/shared/models/fields/date/index\";\n// export * from \"./lib/shared/models/fields/select/select-base-field.model\";\n// export * from \"./lib/shared/models/fields/select/single-select-field.model\";\n// export * from \"./lib/shared/models/fields/select/multi-select-field.model\";\n// export * from \"./lib/shared/models/fields/select/tree-select-field.model\";\n// export * from \"./lib/shared/models/fields/upload/index\";\n// export * from \"./lib/shared/models/fields/radio/radio-base-field.model\";\n// export * from \"./lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-type-radio-field.model\";\n// export * from \"./lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-value.model\";\n// export * from \"./lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-option.model\";\n// export * from \"./lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-type.model\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["ZORRO_MODULES","i3","i1","i2","i5","COMPONENTS","i4","i6","i7","i8","i4.InputTextComponent","i5.InputPasswordComponent","i6.SingleSelectComponent","i7.MultiSelectComponent","i8.TreeSelectComponent","i9.TextareaComponent","i10.DatePickerComponent","i11.DateRangeComponent","i12.SingleFileUploadComponent","i13.MultiFileUploadComponent","i14.MultiImageUploadComponent","i15.AvatarUploadComponent","i16.ReminderTypeRadioComponent","i1.DynamicFormService"],"mappings":"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"}
1
+ {"version":3,"file":"ldquocc-dynamic-form.mjs","sources":["../../../projects/dynamic-form/src/lib/shared/consts/common/standalone-import.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/common.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/file.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/field-dependency.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/file/file.utils.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/file-size-type.enum.ts","../../../projects/dynamic-form/src/lib/shared/utils/common/common.utils.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/custom-validators.ts","../../../projects/dynamic-form/src/lib/shared/enums/validators/validators.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/form/dynamic-form.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/output-value-type.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/field-dependency.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/view-mode.enum.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/field-group.model.ts","../../../projects/dynamic-form/src/lib/shared/consts/validators/pattern.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/pattern.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/default-error-message.ts","../../../projects/dynamic-form/src/lib/shared/enums/controls/control.enum.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-field.model.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/input-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/date-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/select-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/upload-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-text-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-password-field.model.ts","../../../projects/dynamic-form/src/lib/shared/utils/dynamic-form/dynamic-form.ts","../../../projects/dynamic-form/src/lib/shared/utils/fields/fields.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/textarea/textarea-field.model.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/select-field.const.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/select-base-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/single-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/multi-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/base-date-field.model.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/field.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/input-field.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/date-field.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/date/date.utils.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/date-picker-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/date-range-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/base-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/single-file-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/multi-file-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/multi-image-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/config/dynamic-form.config.ts","../../../projects/dynamic-form/src/lib/shared/services/form-utils.ts","../../../projects/dynamic-form/src/lib/shared/services/form-config.service.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/avatar-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/tree-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/services/dynamic-form.service.ts","../../../projects/dynamic-form/src/lib/shared/services/field.service.ts","../../../projects/dynamic-form/src/lib/shared/services/form-data.service.ts","../../../projects/dynamic-form/src/lib/shared/base/base-value-accessor.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-picker/date-picker.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-picker/date-picker.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-range/date-range.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-range/date-range.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-password/input-password.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-password/input-password.component.html","../../../projects/dynamic-form/src/lib/shared/services/suffix.service.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/components/suffix/suffix.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/components/suffix/suffix.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-text/input-text.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-text/input-text.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/select/multi-select/multi-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/multi-select/multi-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/select/single-select/single-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/single-select/single-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/select/tree-select/tree-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/tree-select/tree-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/textarea/textarea.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/textarea/textarea.component.html","../../../projects/dynamic-form/src/lib/shared/services/file.service.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/component.ts","../../../projects/dynamic-form/src/lib/shared/services/validation.service.ts","../../../projects/dynamic-form/src/lib/shared/components/dynamic-field/dynamic-field.component.ts","../../../projects/dynamic-form/src/lib/shared/components/dynamic-field/dynamic-field.component.html","../../../projects/dynamic-form/src/lib/dynamic-form.component.ts","../../../projects/dynamic-form/src/lib/dynamic-form.component.html","../../../projects/dynamic-form/src/lib/shared/models/common/table-models.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/radio/radio-base-field.model.ts","../../../projects/dynamic-form/src/public-api.ts","../../../projects/dynamic-form/src/ldquocc-dynamic-form.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n// NG-ZORRO\r\nimport { NzAlertModule } from 'ng-zorro-antd/alert';\r\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\r\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\r\nimport { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzInputNumberModule } from 'ng-zorro-antd/input-number';\r\nimport { NzListModule } from 'ng-zorro-antd/list';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\r\nimport { NzPopoverModule } from 'ng-zorro-antd/popover';\r\nimport { NzProgressModule } from 'ng-zorro-antd/progress';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzTabsModule } from 'ng-zorro-antd/tabs';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzTimePickerModule } from 'ng-zorro-antd/time-picker';\r\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\r\nimport { NzCollapseModule } from 'ng-zorro-antd/collapse';\r\nimport { NzUploadModule } from 'ng-zorro-antd/upload';\r\nimport { NzImageModule } from 'ng-zorro-antd/image';\r\nimport { NzCascaderModule } from 'ng-zorro-antd/cascader';\r\n\r\n// Core Angular modules (cần thiết ở hầu hết các component).\r\nexport const CORE_MODULES = [CommonModule];\r\n\r\n// Form handling (thường dùng với Reactive)\r\nexport const FORM_MODULES = [FormsModule, ReactiveFormsModule];\r\n\r\n// Routing (thường dùng khi component dùng `<router-outlet>` hoặc cần navigate)\r\nexport const ROUTING_MODULES = [RouterModule];\r\n\r\n// 🧩 All common shared modules (nếu bạn muốn gộp nhanh)\r\nexport const SHARED_MODULES = [...CORE_MODULES, ...FORM_MODULES, ...ROUTING_MODULES];\r\n","export const NO_INFO_TEXT = 'Không có thông tin';\r\n","export const IMAGE_TYPES = {\r\n apng: 'image/apng',\r\n avif: 'image/avif',\r\n bmp: 'image/bmp',\r\n gif: 'image/gif',\r\n jpeg: 'image/jpeg',\r\n jpg: 'image/jpeg',\r\n png: 'image/png',\r\n svg: 'image/svg+xml',\r\n tif: 'image/tiff',\r\n tiff: 'image/tiff',\r\n webp: 'image/webp',\r\n};\r\n\r\nexport const AUDIO_TYPES = {\r\n aac: 'audio/aac',\r\n mp3: 'audio/mpeg',\r\n oga: 'audio/ogg',\r\n opus: 'audio/ogg',\r\n wav: 'audio/wav',\r\n weba: 'audio/webm',\r\n};\r\n\r\nexport const VIDEO_TYPES = {\r\n avi: 'video/avi',\r\n mp4: 'video/mp4',\r\n mpeg: 'video/mpeg',\r\n ogv: 'video/ogg',\r\n ts: 'video/mp2t',\r\n webm: 'video/webm',\r\n};\r\n\r\nexport const videoTypesPath = ['mp4', 'avi'];\r\n\r\nexport const TEXT_TYPES = {\r\n css: 'text/css',\r\n csv: 'text/csv',\r\n html: 'text/html',\r\n ics: 'text/calendar',\r\n js: 'text/javascript ',\r\n mjs: 'text/javascript ',\r\n txt: 'text/plain',\r\n};\r\n\r\nexport const APPLICATION_TYPES = {\r\n abw: 'application/x-abiword',\r\n arc: 'application/x-freearc',\r\n azw: 'application/vnd.amazon.ebook',\r\n bin: 'application/octet-stream',\r\n bz: 'application/x-bzip',\r\n bz2: 'application/x-bzip2',\r\n cda: 'application/x-cdf',\r\n csh: 'application/x-csh',\r\n doc: 'application/msword',\r\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n eot: 'application/vnd.ms-fontobject',\r\n epub: 'application/epub+zip',\r\n jar: 'application/java-archive',\r\n json: 'application/json',\r\n jsonld: 'application/ld+json',\r\n mpkg: 'application/vnd.apple.installer+xml',\r\n ods: 'application/vnd.oasis.opendocument.spreadsheet',\r\n odt: 'application/vnd.oasis.opendocument.text',\r\n ogx: 'application/ogg',\r\n pdf: 'application/pdf',\r\n php: 'application/x-httpd-php',\r\n ppt: 'application/vnd.ms-powerpoint',\r\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n rar: 'application/vnd.rar',\r\n rarX: 'application/x-rar',\r\n rtf: 'application/rtf',\r\n sh: 'application/x-sh',\r\n tar: 'application/x-tar',\r\n vsd: 'application/vnd.visio',\r\n xhtml: 'application/xhtml+xml',\r\n xls: 'application/vnd.ms-excel',\r\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n zip: 'application/x-zip-compressed',\r\n zipN: 'application/zip',\r\n sevenZ: 'application/x-7z-compressed',\r\n csv: 'text/csv',\r\n};\r\n\r\nexport const MIME_TYPES_TO_EXTENSION = Object.entries(APPLICATION_TYPES).reduce(\r\n (acc, [key, value]) => {\r\n acc[value] = key;\r\n return acc;\r\n },\r\n {} as Record<string, string>,\r\n);\r\n\r\nexport const ALL_MIME_TYPES = {\r\n ...IMAGE_TYPES,\r\n ...AUDIO_TYPES,\r\n ...VIDEO_TYPES,\r\n ...TEXT_TYPES,\r\n ...APPLICATION_TYPES,\r\n};\r\n\r\nexport const ALL_MIME_TYPES_VALUE = Object.values({\r\n ...IMAGE_TYPES,\r\n ...AUDIO_TYPES,\r\n ...VIDEO_TYPES,\r\n ...TEXT_TYPES,\r\n ...APPLICATION_TYPES,\r\n});\r\n\r\nexport const DEFAULT_ACCEPTED_MIME_TYPES = [\r\n IMAGE_TYPES.jpg,\r\n IMAGE_TYPES.jpeg,\r\n IMAGE_TYPES.png,\r\n IMAGE_TYPES.svg,\r\n APPLICATION_TYPES.doc,\r\n APPLICATION_TYPES.docx,\r\n APPLICATION_TYPES.pdf,\r\n APPLICATION_TYPES.xls,\r\n APPLICATION_TYPES.xlsx,\r\n APPLICATION_TYPES.zip,\r\n APPLICATION_TYPES.zipN,\r\n TEXT_TYPES.txt,\r\n VIDEO_TYPES.mp4,\r\n VIDEO_TYPES.avi,\r\n];\r\n\r\nexport const DEFAULT_ACCEPTED_IMAGE_MIME_TYPES = [\r\n IMAGE_TYPES.jpg,\r\n IMAGE_TYPES.jpeg,\r\n IMAGE_TYPES.png,\r\n IMAGE_TYPES.svg,\r\n];\r\n","export const COMBINE_DEPEND_TYPES = ['skip', 'null', 'valid'] as const;\r\n","import { MIME_TYPES_TO_EXTENSION } from '../../consts/common';\r\nimport { FileSizeTypeEnum } from '../../enums/common/file-size-type.enum';\r\n\r\n// Format file size, đầu vào là Byte, và loại muốn format sang.\r\nexport const formatFileSize = (size: number, type: FileSizeTypeEnum): number => {\r\n let returnVal = 0;\r\n switch (type) {\r\n case 'KB':\r\n returnVal = size / 1024;\r\n break;\r\n case 'MB':\r\n returnVal = size / (1024 * 1024);\r\n break;\r\n case 'GB':\r\n returnVal = size / (1024 * 1024 * 1024);\r\n break;\r\n case 'TB':\r\n returnVal = size / (1024 * 1024 * 1024 * 1024);\r\n break;\r\n default:\r\n returnVal = size;\r\n break;\r\n }\r\n return returnVal;\r\n};\r\n\r\n// Lấy extension. dựa vào các cấu hình mimeTypes sẵn.\r\nexport const getExtensions = (acptMimeTypes: string[]): string[] => {\r\n return acptMimeTypes.map(mime => `.${MIME_TYPES_TO_EXTENSION[mime] || mime}`);\r\n};\r\n\r\n// Tạo một file giả từ thông tin name, type và size.\r\nexport const createFakeFile = (name: string, type: string, size: number): File => {\r\n const buffer = new Uint8Array(size); // tạo buffer theo size, không crash nếu file có dung lượng lớn.\r\n const blob = new Blob([buffer], { type });\r\n return new File([blob], name, { type, lastModified: Date.now() });\r\n};\r\n","export enum FileSizeTypeEnum {\r\n MB = 'MB',\r\n KB = 'KB',\r\n GB = 'GB',\r\n TB = 'TB',\r\n}\r\n","import { BaseField } from '../../models/fields/field.model';\r\n\r\n// Kiểm tra tính hợp lệ của JSON string.\r\nexport const isValidJSON = (str: string): boolean => {\r\n try {\r\n JSON.parse(str);\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\n// Tạo một chuỗi uuid.\r\nexport const uuidGenerator = (): string => {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = (Math.random() * 16) | 0,\r\n v = c == 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\r\n\r\nexport const lowerCaseFirstChar = (str: string): string => {\r\n return str.charAt(0).toLowerCase() + str.slice(1);\r\n};\r\n\r\nexport const upperCaseFirstChar = (str: string): string => {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n};\r\n\r\nexport const deepCopyArray = (array: BaseField<any>[]): BaseField<any>[] => {\r\n return array.map(item => {\r\n if (Array.isArray(item)) {\r\n return deepCopyArray(item); // Deep copy nếu phần tử là mảng lồng nhau\r\n } else if (item && typeof item === 'object') {\r\n return deepCopyObject(item); // Deep copy nếu phần tử là đối tượng\r\n }\r\n return item; // Trả về giá trị gốc nếu không phải mảng hoặc đối tượng\r\n }) as BaseField<any>[];\r\n};\r\n\r\nexport const deepCopyObject = (obj: BaseField<any>): BaseField<any> => {\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n return [key, deepCopyArray(value)]; // Deep copy nếu giá trị là mảng\r\n } else if (value && typeof value === 'object') {\r\n return [key, deepCopyObject(value)]; // Deep copy nếu giá trị là đối tượng\r\n }\r\n return [key, value]; // Trả về giá trị gốc\r\n }),\r\n ) as BaseField<any>;\r\n};\r\n","import {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from \"@angular/forms\";\r\nimport { delay, Observable, of } from \"rxjs\";\r\nimport { formatFileSize } from \"../file\";\r\nimport { FileSizeTypeEnum } from \"../../enums/common/file-size-type.enum\";\r\nimport { isValidJSON } from \"../common\";\r\n\r\n// Không cho phép nhập khoảng trắng ở đầu chuỗi, nếu không nhập gì vẫn tính đúng.\r\nexport const noLeadingSpaceValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = (control.value ?? \"\").toString();\r\n if (!value) return null; // Không required thì để trống là hợp lệ\r\n return value[0] === \" \" ? { leadingSpace: true } : null;\r\n };\r\n};\r\n\r\n// Không cho phép nhập toàn khoảng trắng.\r\nexport const noWhitespaceValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const isWhitespace = (control.value || \"\").toString().trim().length === 0;\r\n return isWhitespace ? { whitespace: true } : null;\r\n };\r\n};\r\n\r\n// Bắt đầu với một kí tự được chỉ định.\r\nexport const startsWithValidator = (prefix: string): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value ?? \"\";\r\n return value.startsWith(prefix)\r\n ? null\r\n : { startsWith: { requiredPrefix: prefix } };\r\n };\r\n};\r\n\r\n// So sánh giá trị field A không được lớn hơn field B.\r\nexport const minMaxFieldValidator = (\r\n minKey: string,\r\n maxKey: string,\r\n): ValidatorFn => {\r\n // group: AbstractControl sẽ đại diện cho FormGroup tức là cha bao hàm các field.\r\n return (group: AbstractControl): ValidationErrors | null => {\r\n const min = group.get(minKey)?.value;\r\n const max = group.get(maxKey)?.value;\r\n if (min != null && max != null && min > max) {\r\n return { minMaxInvalid: true };\r\n }\r\n return null;\r\n };\r\n};\r\n\r\n// Match giữa hai field (ví dụ: password/confirmPassword,...).\r\nexport const matchFieldsValidator = (fieldToMatch: string): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const parent = control.parent;\r\n if (!parent) return null;\r\n\r\n const target = parent.get(fieldToMatch);\r\n if (!target?.value) return null;\r\n\r\n // Nếu đang validate chính nó (ví dụ: confirmPassword)\r\n const isMismatch = control.value !== target.value;\r\n\r\n // Nếu trước đó password (target) đang bị lỗi matchField nhưng giờ đã khớp\r\n if (!isMismatch && target.hasError(\"matchField\")) {\r\n const errors = { ...target.errors };\r\n delete errors[\"matchField\"];\r\n\r\n // Nếu không còn lỗi nào khác, set null\r\n target.setErrors(Object.keys(errors).length ? errors : null);\r\n }\r\n\r\n return isMismatch ? { matchField: true } : null;\r\n };\r\n};\r\n\r\n// Async: Check if username is taken (simulate API).\r\nexport const asyncUsernameValidator = (\r\n takenUsernames: string[],\r\n): AsyncValidatorFn => {\r\n return (control: AbstractControl): Observable<ValidationErrors | null> => {\r\n const value = control.value ?? \"\";\r\n const isTaken = takenUsernames.includes(value);\r\n return of(isTaken ? { usernameTaken: true } : null).pipe(delay(500));\r\n };\r\n};\r\n\r\n// Không có ký tự đặc biệt.\r\nexport const noSpecialCharValidator = (): ValidatorFn => {\r\n return (control: AbstractControl) => {\r\n const valid = /^[a-zA-Z0-9]*$/.test(control.value);\r\n return valid ? null : { noSpecialChar: true };\r\n };\r\n};\r\n\r\n// Username không được nằm trong blacklist.\r\nexport const usernameBlacklistValidator = (\r\n blacklist: string[],\r\n): ValidatorFn => {\r\n return (control: AbstractControl) => {\r\n return blacklist.includes(control.value) ? { blacklisted: true } : null;\r\n };\r\n};\r\n\r\n// Có thuộc mimetypes từ mảng mimetypes được chỉ định hay không?\r\nexport const acceptedMimeTypesValidator = (\r\n acceptedMimeTypes: string[],\r\n): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control?.value;\r\n\r\n if (value) {\r\n let fileType = \"\";\r\n if (value instanceof File) {\r\n fileType = (value as File).type;\r\n }\r\n\r\n if (isValidJSON(value as string)) {\r\n const { contentType } = JSON.parse(value)[0] || {};\r\n if (contentType) fileType = contentType;\r\n }\r\n\r\n if (fileType) {\r\n if (!acceptedMimeTypes.includes(fileType)) {\r\n return {\r\n acceptedMimeTypes: {\r\n actualValue: fileType,\r\n requiredValue: `Nằm trong ${acceptedMimeTypes}`,\r\n },\r\n };\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n};\r\n\r\nexport const maxFileSizeInMBValidator = (maxSizeInMB: number): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const file = control?.value as File;\r\n if (file) {\r\n const fileSizeInMB = formatFileSize(file.size, FileSizeTypeEnum.MB);\r\n\r\n if (fileSizeInMB > maxSizeInMB) {\r\n return {\r\n maxSizeInMB: {\r\n actualValue: fileSizeInMB,\r\n requiredValue: `Nhỏ hơn ${maxSizeInMB}`,\r\n },\r\n };\r\n }\r\n }\r\n return null;\r\n };\r\n};\r\n","// Enum cho các validator chung được angular reactive form hỗ trợ.\r\nexport enum CommonValidaterEnum {\r\n Required = 'required',\r\n MinLength = 'minlength',\r\n MaxLength = 'maxlength',\r\n Min = 'min',\r\n Max = 'max',\r\n Pattern = 'pattern',\r\n}\r\n\r\n// Enum cho các validator tùy chỉnh.\r\nexport enum CustomValidaterEnum {\r\n MatchField = 'matchField',\r\n AcceptedMimiTypes = 'acceptedMimeTypes',\r\n MaxSizeInMB = 'maxSizeInMB',\r\n LeadingSpace = 'leadingSpace',\r\n}\r\n","export enum FormModeEnum {\r\n Add = 'add',\r\n Edit = 'edit',\r\n View = 'view',\r\n Design = 'design',\r\n}\r\n","export enum SelectOutputValueTypeEnum {\r\n Single = 'single', // Giá trị đơn theo bindValue.\r\n Object = 'object', // Giá trị object chỉ kèm theo 1 prop theo bindValue.\r\n SourceObject = 'sourceObject', // Giá trị object bao gồm cả instance từ list option.\r\n}\r\n\r\nexport enum DatePickerOutputValueTypeEnum {\r\n String = 'string',\r\n Date = 'date',\r\n}\r\n\r\nexport enum DateRangeOutputValueTypeEnum {\r\n String = 'string',\r\n StringArray = 'string-array',\r\n DateArray = 'date-array',\r\n}\r\n\r\nexport enum UploadOutputValueTypeEnum {\r\n File = 'file',\r\n ObjectStorage = 'object-storage',\r\n Object = 'object',\r\n}\r\n","export enum CombineDependTypeEnum {\r\n Valid = 'valid',\r\n Skip = 'skip',\r\n Null = 'null',\r\n}\r\n\r\nexport enum DependTypeEnum {\r\n All = 'any',\r\n Any = 'all',\r\n}\r\n","export enum ViewModeEnum {\r\n form = 'form',\r\n text = 'text',\r\n}\r\n","import { FormControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport { FIELD_TYPES } from '../../consts/fields';\r\nimport { matchFieldsValidator } from '../../utils/validators/custom-validators';\r\nimport { FieldGrid } from './field-grid.model';\r\nimport { NzLabelAlignType } from 'ng-zorro-antd/form';\r\nimport { CommonValidaterEnum, CustomValidaterEnum } from '../../enums/validators';\r\nimport { ControlType } from '../controls';\r\nimport { FormMode } from '../form';\r\nimport { FormModeEnum } from '../../enums/form';\r\nimport { uuidGenerator } from '../../utils/common';\r\nimport { ViewMode } from '../common';\r\nimport { ViewModeEnum } from '../../enums/common';\r\n\r\n/**\r\n * typeof FIELD_TYPES[number] có nghĩa là:\r\n - FIELD_TYPES là readonly ['input', 'select', 'checkbox']\r\n - FIELD_TYPES[number] = FIELD_TYPES[0] | FIELD_TYPES[1] | ... = 'input' | 'select' | 'checkbox'\r\n => FieldType = 'input' | 'select' | 'checkbox'\r\n*/\r\nexport type FieldType = (typeof FIELD_TYPES)[number];\r\n\r\n/**\r\n * Abstract class chung cho Field.\r\n */\r\nexport abstract class BaseField<T> {\r\n id: string;\r\n\r\n // Giá trị Binding với Reactive Form dùng ở formControlName.\r\n key!: string;\r\n\r\n // Nhãn hiển thị tên của Field.\r\n label!: string;\r\n\r\n // Giá trị của Field.\r\n value?: T;\r\n\r\n // Giá trị ban đầu để reset.\r\n initialValue?: T;\r\n\r\n // Giá gốc từ model.\r\n modelValue?: T;\r\n\r\n // Loại Field: input-text, single-select,...\r\n type!: FieldType;\r\n\r\n // Loại control: input, select,... gom nhóm các dạng field.\r\n controlType!: ControlType;\r\n\r\n // Nhãn hint.\r\n placeholder?: string;\r\n\r\n // Hiển thị text khi hover.\r\n tooltip?: string;\r\n\r\n /** Props validation chung */\r\n required: boolean;\r\n\r\n /** Props validation custom chung */\r\n matchField?: string;\r\n\r\n icon?: string;\r\n\r\n // Custom error message theo validation props.\r\n errorMessages?: Record<string, string>;\r\n\r\n // Grid layout của Field.\r\n grid: FieldGrid;\r\n\r\n // Grid layout của Label nằm trong Field.\r\n labelGrid: FieldGrid;\r\n\r\n // Vị trí của Label khi ở trong một khối cụ thể.\r\n labelAlign: NzLabelAlignType;\r\n\r\n // Grid layout của Control nằm trong Field.\r\n controlGrid: FieldGrid;\r\n\r\n // Ẩn field và không thao tác bất kì gì liên quan.\r\n isHidden: boolean;\r\n\r\n // Vô hiệu hóa field.\r\n isDisabled: boolean;\r\n\r\n // Đánh dấu giá trị của field sẽ cần cho field khác có thuộc tính dependsOn.\r\n isParent: boolean;\r\n\r\n // Cho phép gán first data ở cả mode add hoặc edit hay không.\r\n allowSetValue: FormMode[];\r\n\r\n // Gom nhóm field theo mã của nhóm. Mã này sẽ config theo code của FieldGroup model và config ở FE.\r\n groupCode?: string; // Không thuộc nhóm thì bỏ trống hoặc điền None.\r\n\r\n // Mode view: form (view theo control được disable) hoặc text (chỉ hiện thị text có thể là paragraph). Riêng upload thì không áp dụng vì không phân biệt control.\r\n viewMode: ViewMode;\r\n\r\n // Nhãn phu hiển thị tên của Field.\r\n sublabel?: string;\r\n\r\n // Thứ tự hiển thị của field\r\n seqNum: number = 0;\r\n\r\n // Cho phép field phát sự kiện change khi thay đổi giá trị.\r\n enableFieldChange: boolean;\r\n\r\n constructor(init?: Partial<BaseField<T>>) {\r\n if (!init?.key || !init?.label) {\r\n throw new Error('key, label, and type are required');\r\n }\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở BaseField.\r\n */\r\n this.id = uuidGenerator();\r\n this.required = false;\r\n this.grid = { xs: 24 };\r\n this.labelGrid = { xs: 24 };\r\n this.controlGrid = { xs: 24 };\r\n this.labelAlign = 'left';\r\n this.isHidden = false;\r\n this.isDisabled = false;\r\n this.isParent = false;\r\n this.allowSetValue = [FormModeEnum.Add, FormModeEnum.Edit, FormModeEnum.View];\r\n this.viewMode = ViewModeEnum.form;\r\n this.enableFieldChange = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo control cho từng loại field.\r\n abstract toFormControl(): FormControl;\r\n\r\n // Default value ban đầu cho từng loại field.\r\n abstract getDefaultValue(): T;\r\n\r\n abstract toFormValue(modelValue: unknown): T;\r\n\r\n // Tạo các validate chung cho các props ở abstract. this khi gọi trong class con sẽ đại diện cho đối tượng tạo từ class đó.\r\n protected getCommonValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (this.required) validators.push(Validators.required);\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo các validate custom chung cho các props ở abstract. this khi gọi trong class con sẽ đại diện cho đối tượng tạo từ class đó.\r\n protected getCustomValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (this.matchField) validators.push(matchFieldsValidator(this.matchField));\r\n\r\n return validators;\r\n }\r\n\r\n getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n if (errorKey === CommonValidaterEnum.Required) {\r\n return `${this.label || 'Trường này'} là bắt buộc`;\r\n }\r\n\r\n if (errorKey === CustomValidaterEnum.MatchField) {\r\n const matchKey = this.matchField;\r\n const targetLabel = allFields.find(f => f.key === matchKey)?.label || matchKey;\r\n return `${this.label} không khớp với ${targetLabel}`;\r\n }\r\n\r\n return '';\r\n }\r\n}\r\n","import { TemplateRef } from '@angular/core';\r\nimport { BaseField } from './field.model';\r\n\r\n// Dữ liệu sau khi đã tiến hành xử lý gom nhóm từ fields và groups.\r\nexport class GroupedFields {\r\n noGroup: BaseField<any>[];\r\n grouped: {\r\n group: FieldGroup;\r\n fields: BaseField<any>[];\r\n }[];\r\n\r\n constructor(init: Partial<GroupedFields>) {\r\n this.noGroup = [];\r\n this.grouped = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n}\r\n\r\n// Đại diện cho 1 group.\r\nexport class FieldGroup {\r\n // Nhãn của nhóm field.\r\n label!: string;\r\n\r\n // Mã nhóm field.\r\n code!: string;\r\n\r\n template?: TemplateRef<any>;\r\n\r\n // Thứ tự hiển thị nhóm field.\r\n order!: number;\r\n\r\n // Có mở sẵn collapse hay không?\r\n isActive: boolean;\r\n\r\n showArrow: boolean;\r\n\r\n required: boolean;\r\n\r\n disabled: boolean;\r\n\r\n constructor(init: Partial<FieldGroup>) {\r\n this.isActive = false;\r\n this.showArrow = true;\r\n this.disabled = false;\r\n this.required = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n}\r\n","// Các patterns regex thường dùng trong ứng dụng\r\nexport const PATTERN_PRESETS: Record<string, string | RegExp> = {\r\n alpha: '^[a-zA-Z]+$',\r\n alphaNumeric: '^[a-zA-Z0-9]+$',\r\n name: \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\()]+$\",\r\n username: '^[a-z0-9_.s]+$',\r\n regexPostCode: '^[a-zA-Z0-9-s]+$',\r\n alphaDash: '^[a-zA-Z0-9_-s.]+$',\r\n alphaVN:\r\n '^[a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\,s]+$',\r\n alphaNumericVN:\r\n '^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\s]+$',\r\n alphaDashVN:\r\n \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\()]+$\",\r\n unitName:\r\n '^[a-zA-Z0-9 ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹs_-]+$',\r\n date: '([12]\\\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01]))',\r\n time: '(?=[01]\\\\d|2[0123])=(?=[012345]\\\\d)=(?=[012345]\\\\d)',\r\n dateTime:\r\n '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9])=[0-5][0-9]=[0-5][0-9]',\r\n // dateV: \"^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4}$\",\r\n // dateV: /^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-](19|20)\\d\\d/,\r\n // dateV: \"^([0-2][0-9]|(3)[0-1])(\\-)(((0)[0-9])|((1)[0-2]))(\\-)\\d{4}$\",\r\n dateVN: '^(?=0[1-9]|[12]d|3[01])([/.-])(?=0[1-9]|1[012])\\\\1(?=19|20)dd$',\r\n dateTimeVN:\r\n '^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4} (\\\\d{2})=(\\\\d{2})=(\\\\d{2})$',\r\n dateShortTimeVN: '^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4} (\\\\d{2})=(\\\\d{2})$',\r\n integer: '^\\\\-?[0-9]+$',\r\n decimal: '^\\\\-?[0-9]*\\\\.?[0-9]+$',\r\n ipAddress:\r\n '^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$',\r\n base64: '[^a-zA-Z0-9\\\\/\\\\+=]',\r\n citizenId: '^\\\\d{12}$',\r\n passport: '^[A-Z0-9]{6,12}$', // Hộ chiếu - 6-12 ký tự (chữ IN HOA và số)\r\n // dnkhcn: \"/^DNKHCN-[A-Z]{2}-d{4}$/\",\r\n // msdn: \"/^d{10}$/\",\r\n intergerNotZero: '^[0-9]*[1-9][0-9]*$',\r\n //link: \"(https?=//(?=www.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|www.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|https?=//(?=www.|(?!www))[a-zA-Z0-9]+.[^s]{2,}|www.[a-zA-Z0-9]+.[^s]{2,})\",\r\n // code: \"^['A-Z''0-9''._\\\\-']*$\",\r\n code: \"^['A-Z''0-9''./_\\\\-\\\\/\\\\Đ']*$\",\r\n codeHsda: \"^['A-Z''0-9''./_\\\\-']*$\",\r\n link_location: '(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})([/\\\\w .-]*)?(\\\\?[\\\\w=&,.%-]*)?',\r\n link: '(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})[/\\\\w .-]*/?',\r\n //password: \"/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@$!%*?&]).{8,}/\",\r\n accountName: '^[a-zA-Z0-9_.]{2,20}$',\r\n name_or_fullName:\r\n '^[a-zA-Z0-9_ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễếệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ ]{1,20}$',\r\n packageName: '^(?:[a-zA-Z]+(?:d*[a-zA-Z_]*)*)(?:.[a-zA-Z]+(?:d*[a-zA-Z_]*)*)+$',\r\n email: '^[a-z0-9._%+-]+@[a-z0-9.-]+\\\\.[a-z]{2,4}$',\r\n passwordRegex:\r\n '^(?!.*\\\\s)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[~`!@#$%^&*()--+={}\\\\[\\\\]|\\\\\\\\:;\"\\'<>,.?/_₹]).{8,}$',\r\n // phoneNumber: \"^(\\\\+84|0)([235789])([0-9]{8,9})\\\\b\",\r\n phoneNumber: '^(\\\\+84|0)([235789])([0-9]{8,9})$',\r\n seqNum: '^(100|[0-9]{1,2})$',\r\n link_basemap:\r\n '(https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?/[a-zA-Z0-9]{2,}|((https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?)|(https://www.|http://www.|https://|http://)?[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}(.[a-zA-Z0-9]{2,})?',\r\n alphaDashBreakLineVN:\r\n \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\(\\\\)\\n]+$\",\r\n fax: '^(\\\\+?\\\\d{1,4}[\\\\s-]?)?(\\\\(?\\\\d{2,4}\\\\)?[\\\\s-]?)?[\\\\d\\\\s-]{5,15}$',\r\n alphaDashNameVN:\r\n \"^[a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\.s.\\/\\-\\_'\\\\(\\\\)]{2,}$\",\r\n businessCode: '^\\\\d{10}(-\\\\d{3})?$',\r\n};\r\n\r\n// Các error message cho các pattern regex.\r\nexport const PATTERN_ERROR_MESSAGES: Record<string, string> = {\r\n required: '%s không được để trống!',\r\n number: '%s phải là số!',\r\n email: '%s không đúng định dạng địa chỉ Email!',\r\n minlength: '%s có kích thước tối thiểu %s ký tự!',\r\n maxlength: '%s có kích thước tối đa %s ký tự!',\r\n min: '%s phải lớn hơn hoặc bằng %s!',\r\n max: '%s phải nhỏ hơn hoặc bằng %s!',\r\n alpha: '%s chỉ chứa ký tự thường và ký tự in hoa không dấu!',\r\n alphaNumeric: '%s chỉ chứa ký tự thường, ký tự in hoa không dấu và số!',\r\n name: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n username: '%s chỉ chứa ký tự thường, số, dấu chấm và dấu gạch dưới _',\r\n regexPostCode: '%s chỉ chứa ký tự thường, ký tự in hoa không dấu, số, gạch ngang -',\r\n alphaDash:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa không dấu, số, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n alphaVN: '%s chỉ chứa ký tự thường và ký tự in hoa có dấu!',\r\n alphaNumericVN: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu và số!',\r\n alphaDashVN:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n alphaDashNameVN: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu và ít nhất 2 ký tự!',\r\n unitName: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, gạch dưới _ hoặc gạch ngang -',\r\n date: '%s không đúng định dạng năm tháng ngày (YYYY-MM-DD)!',\r\n time: '%s không đúng định dạng giờ phút giây (HH:MM:SS)!',\r\n dateTime: '%s không đúng định dạng năm tháng ngày giờ phút giây (YYYY-MM-DD HH:MM:SS)!',\r\n dateVN: '%s không đúng định dạng ngày tháng năm (DD/MM/YYYY)!',\r\n dateTimeVN: '%s không đúng định dạng ngày tháng năm giờ phút giây (DD/MM/YYYY HH:MI:SS)!',\r\n dateShortTimeVN: '%s không đúng định dạng ngày tháng năm giờ phút (DD/MM/YYYY HH:MI)!',\r\n integer: '%s phải là số nguyên!',\r\n decimal: '%s phải là số thập phân!',\r\n ipAddress: '%s không đúng định dạng địa chỉ IP!',\r\n base64: '%s không đúng định dạng Base64!',\r\n intergerNotZero: '%s phải là số nguyên dương khác 0!',\r\n link_location: '%s không đúng định dạng!',\r\n link: '%s không đúng định dạng!',\r\n codeHsda: \"%s chỉ chứa các chữ cái in hoa không dấu, số và dấu '.', '_', '-'\",\r\n code: \"%s chỉ chứa các chữ cái in hoa không dấu, số và dấu '.', '_', '-', '/'\",\r\n // code: \"%s chỉ chứa các chữ cái in hoa,chữ cái thường không dấu, số và dấu '.', '_', '-'\",\r\n accountName: '%s chỉ bao gồm các kí tự từ A-Z, các số từ 0-9 và ít nhất 2 ký tự',\r\n name_or_fullName: '',\r\n // pwdErrorTip:\r\n // \"%s phải có ít nhất 8 ký tự. Ít nhất 1 ký tự hoa, số, ký tự thường và ký tự đặc biệt\",\r\n phoneNumber:\r\n 'Số điện thoại không hợp lệ (Gợi ý: Số điện thoại phải bắt đầu bằng đầu số 02, 03, 05, 07, 08, 09 hoặc +84 và có độ dài 10-11 ký tự)',\r\n seqNum: '(Gợi ý: Thứ tự hiển thị phải là dạng số và có giá trị từ 1-100)',\r\n link_basemap: '%s không đúng định dạng!',\r\n passwordRegex:\r\n '%s phải có ít nhất 8 ký tự. Ít nhất 1 ký tự hoa, ký tự thường, số và ký tự đặc biệt',\r\n alphaDashBreakLineVN:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n citizenId: '%s phải đúng định dạng 12 số!',\r\n businessCode: '',\r\n};\r\n","import { PATTERN_PRESETS } from '../../consts/validators/pattern.const';\r\n\r\nexport const resolvePattern = (\r\n pattern: string | RegExp | undefined,\r\n): {\r\n type: 'regexKey' | 'regexString' | 'regexObject' | 'unknown';\r\n value: string | RegExp;\r\n} => {\r\n if (!pattern) return { type: 'unknown', value: '' };\r\n\r\n // Trường hợp là RegExp thực sự\r\n if (pattern instanceof RegExp) return { type: 'regexObject', value: pattern };\r\n\r\n // Trường hợp là tên preset (ưu tiên nếu trùng)\r\n if (pattern in PATTERN_PRESETS) {\r\n return { type: 'regexKey', value: PATTERN_PRESETS[pattern] };\r\n }\r\n\r\n try {\r\n // Trường hợp là chuỗi regex dạng \"^abc$\"\r\n return { type: 'regexString', value: new RegExp(pattern) };\r\n } catch (err) {\r\n console.warn(`Không thể parse pattern \"${pattern}\"`, err);\r\n return { type: 'unknown', value: '' };\r\n }\r\n};\r\n","import { PATTERN_ERROR_MESSAGES } from '../../consts/validators/pattern.const';\r\nimport { resolvePattern } from './pattern';\r\n\r\nexport const getDefaultPatternErrorMessage = (label: string, pattern: string | RegExp): string => {\r\n let finalErrorMessage = '';\r\n const resolvePatternResult = resolvePattern(pattern);\r\n\r\n // if (resolvePatternResult?.type === 'unknown') {\r\n // return finalErrorMessage; // Không phải pattern hợp lệ\r\n // }\r\n\r\n if (resolvePatternResult.type === 'regexObject') {\r\n finalErrorMessage = `${label || 'Trường này'} không hợp lệ!`;\r\n }\r\n\r\n if (resolvePatternResult.type === 'regexKey') {\r\n const patternMess = PATTERN_ERROR_MESSAGES?.[pattern as string] ?? '';\r\n finalErrorMessage = `${label || 'Trường này'} không hợp lệ! ${patternMess.replace(/%s/g, () => label)}`;\r\n }\r\n\r\n return finalErrorMessage;\r\n};\r\n\r\nexport const getDefaultMinLengthErrorMessage = (label: string, errorValue: any): string => {\r\n return `${label || 'Trường này'} cần tối thiểu ${errorValue.requiredLength} ký tự`;\r\n};\r\n\r\nexport const getDefaultMaxLengthErrorMessage = (label: string, errorValue: any): string => {\r\n return `${label || 'Trường này'} cần đât thiểu ${errorValue.requiredLength} ký tự`;\r\n};\r\n\r\nexport const getDefaultAcptMimeTypesErrorMessage = (typeString: string): string => {\r\n return `Tập tin tải lên không được hỗ trợ. Vui lòng tải các tập tin có định dạng ${typeString}`;\r\n};\r\n\r\nexport const getDefaultMaxSizeInMBErrorMessage = (maxSizeInMB: number): string => {\r\n return `Kích thước tập tin tải lên không được phép vượt quá ${maxSizeInMB} MB`;\r\n};\r\n\r\nexport const getLeadingSpaceErrorMessage = (label: string): string => {\r\n return `${label || 'Trường này'} không được bắt đầu bằng khoảng trắng`;\r\n};\r\n","// Dạng control.\r\nexport enum ControlTypeEnum {\r\n Input = 'input',\r\n Textarea = 'textarea',\r\n Select = 'select',\r\n Checkbox = 'checkbox',\r\n Radio = 'radio',\r\n Date = 'date',\r\n Upload = 'upload',\r\n Switch = 'switch',\r\n Autocomplete = 'autocomplete',\r\n}\r\n","import { FormControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport { INPUT_FIELD_TYPES } from '../../../consts/fields/input-field.const';\r\nimport { BaseField } from '../field.model';\r\nimport { noLeadingSpaceValidator } from '../../../utils/validators/custom-validators';\r\nimport { resolvePattern } from '../../../utils/validators/pattern';\r\nimport { CommonValidaterEnum, CustomValidaterEnum } from '../../../enums/validators';\r\nimport {\r\n getDefaultMaxLengthErrorMessage,\r\n getDefaultMinLengthErrorMessage,\r\n getDefaultPatternErrorMessage,\r\n getLeadingSpaceErrorMessage,\r\n} from '../../../utils/validators';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\nimport { Suffix } from '../../common/common.model';\r\n\r\n/**\r\n * typeof FIELD_TYPES[number] có nghĩa là:\r\n - INPUT_FIELD_TYPES là readonly ['text','email','password','number']\r\n - INPUT_FIELD_TYPES[number] = INPUT_FIELD_TYPES[0] | INPUT_FIELD_TYPES[1] | ... = 'text' | 'email' | ...\r\n => FieldType = 'input' | 'select' | 'checkbox'\r\n*/\r\nexport type InputFieldType = (typeof INPUT_FIELD_TYPES)[number];\r\n\r\nconst DEFAULT_INPUT_VALUE = '';\r\n\r\n/**\r\n * Interface base chung cho Các dạng Input Field.\r\n */\r\nexport abstract class InputBaseField extends BaseField<string> {\r\n suffixes: Suffix[];\r\n\r\n /**\r\n * Props validation chung cho các dạng Input.\r\n */\r\n // Độ dài tối thiểu của chuỗi nhập vào.\r\n minLength?: number;\r\n // Độ dài tối đa của chuỗi nhập vào.\r\n maxLength?: number;\r\n // Theo mẫu regex hoặc đối tượng RegExr\r\n pattern?: string | RegExp;\r\n\r\n isCurrency: boolean;\r\n\r\n constructor(init: Partial<InputBaseField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input.\r\n */\r\n this.controlType = ControlTypeEnum.Input;\r\n this.value = DEFAULT_INPUT_VALUE;\r\n this.initialValue = DEFAULT_INPUT_VALUE;\r\n this.suffixes = [];\r\n this.isCurrency = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input.\r\n protected getInputCommonValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n\r\n if (this.minLength) validators.push(Validators.minLength(this.minLength));\r\n if (this.maxLength) validators.push(Validators.maxLength(this.maxLength));\r\n if (this.pattern) {\r\n const resolvePatternResult = resolvePattern(this.pattern);\r\n if (resolvePatternResult?.type !== 'unknown')\r\n validators.push(Validators.pattern(resolvePatternResult.value));\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Input.\r\n protected getInputCustomValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n validators.push(noLeadingSpaceValidator());\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputCommonValidators();\r\n const customValidators = this.getInputCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n // Giá trị mặc định.\r\n override getDefaultValue(): string {\r\n return DEFAULT_INPUT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n if (errorKey === CommonValidaterEnum.Pattern) {\r\n if (this.pattern) return getDefaultPatternErrorMessage(this.label, this.pattern);\r\n }\r\n if (errorKey === CommonValidaterEnum.MinLength)\r\n return getDefaultMinLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CommonValidaterEnum.MaxLength)\r\n return getDefaultMaxLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CustomValidaterEnum.LeadingSpace)\r\n return getLeadingSpaceErrorMessage(this.label);\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","// Dạng field cụ thể.\r\nexport enum FieldTypeEnum {\r\n InputText = 'input-text',\r\n InputPassword = 'input-password',\r\n Textarea = 'textarea',\r\n DatePicker = 'date-picker',\r\n DateRange = 'date-range',\r\n SingleSelect = 'single-select',\r\n TreeSelect = 'tree-select',\r\n MultiSelect = 'multi-select',\r\n SingleFileUpload = 'single-file-upload',\r\n MultiFileUpload = 'multi-file-upload',\r\n MultiImageUpload = 'multi-image-upload',\r\n AvatarUpload = 'avatar-upload',\r\n Checkbox = 'checkbox',\r\n Radio = 'radio',\r\n ReminderTypeRadio = 'reminder-type-radio',\r\n Switch = 'switch',\r\n Autocomplete = 'autocomplete',\r\n}\r\n","export enum InputFieldTypeEnum {\r\n Text = 'text',\r\n Email = 'email',\r\n Password = 'password',\r\n Number = 'number',\r\n}\r\n","export enum DateFieldTypeEnum {\r\n Picker = 'picker',\r\n Range = 'range',\r\n}\r\n","export enum SelectFieldTypeEnum {\r\n Single = 'single',\r\n Multi = 'multi',\r\n}\r\n","export enum UploadFieldTypeEnum {\r\n SingleFile = 'single-file',\r\n MultiFile = 'multi-file',\r\n Avatar = 'avatar',\r\n}\r\n","import { FormControl } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { InputBaseField } from './input-field.model';\r\n\r\n/**\r\n * Interface của Input Field type là Text.\r\n */\r\nexport class InputTextField extends InputBaseField {\r\n constructor(init: Partial<InputTextField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input Text.\r\n */\r\n this.type = FieldTypeEnum.InputText;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo Form Control cho Input Text Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputCommonValidators();\r\n const customValidators = this.getInputCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport { FieldTypeEnum, InputFieldTypeEnum } from '../../../enums/fields';\r\nimport { InputBaseField } from './input-field.model';\r\n\r\n/**\r\n * Interface của Input Field type là Password.\r\n */\r\nexport class InputPasswordField extends InputBaseField {\r\n constructor(init: Partial<InputPasswordField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input Password.\r\n */\r\n this.type = FieldTypeEnum.InputPassword;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input Password.\r\n protected getInputPasswordCommonValidators(): ValidatorFn[] {\r\n const validators = this.getInputCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi angular cho Input Password.\r\n protected getInputPasswordCustomValidators(): ValidatorFn[] {\r\n const validators = this.getInputCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Password Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputPasswordCommonValidators();\r\n const customValidators = this.getInputPasswordCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n}\r\n","import { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { BaseField } from '../../models/fields/field.model';\r\nimport { FormMode } from '../../models/form';\r\nimport { FormModeEnum } from '../../enums/form';\r\nimport { SelectBaseField } from '../../models/fields/select/select-base-field.model';\r\nimport { InputPasswordField } from '../../models/fields/input';\r\nimport { FieldTypeEnum } from '../../enums/fields';\r\n\r\nexport const buildForm = (\r\n fields: BaseField<any>[],\r\n mode: FormMode,\r\n model?: Record<string, any>,\r\n): FormGroup => {\r\n const groupObj: Record<string, AbstractControl<any, any>> = {};\r\n // console.log(\"model\", model);\r\n\r\n for (const field of fields) {\r\n // Loại bỏ nếu quyết định ẩn field đi.\r\n if (field.isHidden) continue;\r\n // Nếu là dạng InputPasswordField nhưng ở mode edit và view thì không được dùng.\r\n if (\r\n field instanceof InputPasswordField &&\r\n (mode === FormModeEnum.Edit || mode === FormModeEnum.View)\r\n )\r\n continue;\r\n\r\n const fieldKey = field?.key;\r\n // field.value = field.allowSetValue ? (model?.[fieldKey] || field.value) : null;\r\n\r\n if (field.allowSetValue) {\r\n field.value = field.getDefaultValue();\r\n field.modelValue = null;\r\n if (model?.[fieldKey]) {\r\n field.value = field.toFormValue(model[fieldKey]);\r\n field.modelValue = model[fieldKey];\r\n }\r\n\r\n field.initialValue = field.value;\r\n }\r\n // console.log(\"e\", field.value );\r\n // field.value = field.allowSetValue ? field.toFormValue(model?.[fieldKey] | field.getDefaultValue()) : field.getDefaultValue();\r\n const control = field.toFormControl();\r\n control.reset(field.value);\r\n if (field.isDisabled) {\r\n //console.log(field.key, 'dfdfdfdf');\r\n\r\n control?.disable();\r\n }\r\n groupObj[fieldKey] = control;\r\n }\r\n\r\n return new FormGroup(groupObj);\r\n};\r\n\r\n// Tạo placeholder mặc định cho các dạng Input, Textarea.\r\nexport const createPlaceholder = (field: BaseField<any>): string => {\r\n const placeholder = field?.placeholder;\r\n if (placeholder) return placeholder;\r\n\r\n const label = field?.label;\r\n if (label) return `Nhập ${label?.toLowerCase()}`;\r\n\r\n return `Nhập ${field.key?.toLowerCase()}`;\r\n};\r\n\r\n// Tạo placeholder mặc định cho các dạng Select.\r\nexport const createSelectPlaceholder = <K>(field: SelectBaseField<K>): string => {\r\n const placeholder = field?.placeholder;\r\n if (placeholder) return placeholder;\r\n\r\n const label = field?.label;\r\n if (label) {\r\n const isSingleSelect = field?.type === FieldTypeEnum.SingleSelect;\r\n return `Chọn ${isSingleSelect ? '' : 'các'} ${label?.toLowerCase()}`;\r\n }\r\n\r\n return `Nhập ${field.key?.toLowerCase()}`;\r\n};\r\n","import { ControlTypeEnum } from '../../enums/controls';\r\nimport { FieldTypeEnum, InputFieldTypeEnum } from '../../enums/fields';\r\nimport { DateFieldTypeEnum } from '../../enums/fields/date-field.enum';\r\nimport { SelectFieldTypeEnum } from '../../enums/fields/select-field.enum';\r\nimport { UploadFieldTypeEnum } from '../../enums/fields/upload-field.enum';\r\nimport { DatePickerField } from '../../models/fields/date/date-picker-field.model';\r\nimport { DateRangeField } from '../../models/fields/date/date-range-field.model';\r\nimport { FieldGroup, GroupedFields } from '../../models/fields/field-group.model';\r\nimport { BaseField } from '../../models/fields/field.model';\r\nimport { InputPasswordField, InputTextField } from '../../models/fields/input';\r\nimport { MultiSelectField } from '../../models/fields/select/multi-select-field.model';\r\nimport { SingleSelectField } from '../../models/fields/select/single-select-field.model';\r\nimport { AvatarUploadField } from '../../models/fields/upload/avatar-upload-field.model';\r\nimport { MultiFileUploadField } from '../../models/fields/upload/multi-file-upload-field.model';\r\nimport { SingleFileUploadField } from '../../models/fields/upload/single-file-upload-field.model';\r\n\r\nexport const isInputTextField = (field: BaseField<any>): field is InputTextField => {\r\n return field.controlType === ControlTypeEnum.Input && field.type === FieldTypeEnum.InputText;\r\n};\r\n\r\nexport const isInputPasswordField = (field: BaseField<any>): field is InputPasswordField => {\r\n return field.controlType === ControlTypeEnum.Input && field.type === FieldTypeEnum.InputPassword;\r\n};\r\n\r\nexport const isSingleSelectField = (field: BaseField<any>): field is SingleSelectField => {\r\n return field.controlType === ControlTypeEnum.Select && field.type === FieldTypeEnum.SingleSelect;\r\n};\r\n\r\nexport const isMultiSelectField = (field: BaseField<any>): field is MultiSelectField => {\r\n return field.controlType === ControlTypeEnum.Select && field.type === FieldTypeEnum.MultiSelect;\r\n};\r\n\r\nexport const isDatePickerField = (field: BaseField<any>): field is DatePickerField => {\r\n return field.controlType === ControlTypeEnum.Date && field.type === FieldTypeEnum.DatePicker;\r\n};\r\n\r\nexport const isDateRangeField = (field: BaseField<any>): field is DateRangeField => {\r\n return field.controlType === ControlTypeEnum.Date && field.type === FieldTypeEnum.DateRange;\r\n};\r\n\r\nexport const isSingleFileUploadField = (field: BaseField<any>): field is SingleFileUploadField => {\r\n return (\r\n field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.SingleFileUpload\r\n );\r\n};\r\n\r\nexport const isMultiFileUploadField = (field: BaseField<any>): field is MultiFileUploadField => {\r\n return (\r\n field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.MultiFileUpload\r\n );\r\n};\r\n\r\nexport const isAvatarUploadField = (field: BaseField<any>): field is AvatarUploadField => {\r\n return field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.AvatarUpload;\r\n};\r\n\r\n// Tạo FieldGroup render UI từ thông tin fields và groups truyền vào cho dynamic-form.\r\nexport const buildGroupedFields = (\r\n fields: BaseField<any>[],\r\n groups: FieldGroup[] = [],\r\n): GroupedFields => {\r\n const noGroup = fields.filter(\r\n field => !field?.groupCode || field?.groupCode.toLowerCase() === 'none',\r\n );\r\n\r\n const sortedGroups = [...groups].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n const grouped = sortedGroups\r\n .map(group => ({\r\n group,\r\n fields: fields.filter(field => field.groupCode?.toLowerCase() === group.code.toLowerCase()),\r\n }))\r\n .filter(groupedFields => groupedFields.fields.length > 0);\r\n\r\n return new GroupedFields({\r\n noGroup,\r\n grouped,\r\n });\r\n};\r\n","import { FormControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { BaseField } from '../field.model';\r\nimport {\r\n getDefaultMaxLengthErrorMessage,\r\n getDefaultMinLengthErrorMessage,\r\n getDefaultPatternErrorMessage,\r\n getLeadingSpaceErrorMessage,\r\n noLeadingSpaceValidator,\r\n resolvePattern,\r\n} from '../../../utils/validators';\r\nimport { CommonValidaterEnum, CustomValidaterEnum } from '../../../enums/validators';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nconst DEFAULT_TEXTAREA_VALUE = '';\r\n\r\n/**\r\n * Interface cho Các dạng Textarea.\r\n */\r\nexport class TextareaField extends BaseField<string> {\r\n /**\r\n * Props validation chung cho dạng Textarea.\r\n */\r\n // Độ dài tối thiểu của chuỗi nhập vào.\r\n minLength?: number;\r\n // Độ dài tối đa của chuỗi nhập vào.\r\n maxLength?: number;\r\n // Theo mẫu regex hoặc đối tượng RegExr\r\n pattern?: string | RegExp;\r\n\r\n constructor(init: Partial<TextareaField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input.\r\n */\r\n this.controlType = ControlTypeEnum.Textarea;\r\n this.type = FieldTypeEnum.Textarea;\r\n this.value = DEFAULT_TEXTAREA_VALUE;\r\n this.initialValue = DEFAULT_TEXTAREA_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input.\r\n protected getCommonTextareaValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n\r\n if (this.minLength) validators.push(Validators.minLength(this.minLength));\r\n if (this.maxLength) validators.push(Validators.maxLength(this.maxLength));\r\n if (this.pattern) {\r\n const resolvePatternResult = resolvePattern(this.pattern);\r\n if (resolvePatternResult?.type !== 'unknown')\r\n validators.push(Validators.pattern(resolvePatternResult.value));\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Input.\r\n protected getCustomTextareaValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n validators.push(noLeadingSpaceValidator());\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonTextareaValidators();\r\n const customValidators = this.getCustomTextareaValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n // Giá trị mặc định.\r\n override getDefaultValue(): string {\r\n return DEFAULT_TEXTAREA_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n if (errorKey === CommonValidaterEnum.Pattern) {\r\n if (this.pattern) return getDefaultPatternErrorMessage(this.label, this.pattern);\r\n }\r\n if (errorKey === CommonValidaterEnum.MinLength)\r\n return getDefaultMinLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CommonValidaterEnum.MaxLength)\r\n return getDefaultMaxLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CustomValidaterEnum.LeadingSpace)\r\n return getLeadingSpaceErrorMessage(this.label);\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","/**\r\n * FIELD_TYPES là readonly ['single', 'multi', 'tree',...]\r\n */\r\nexport const SELECT_FIELD_TYPES = ['single', 'multi', 'tree'] as const;\r\n\r\nexport const DEFAULT_BIND_LABEL = 'name';\r\nexport const DEFAULT_BIND_VALUE = 'code';\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport {\r\n DEFAULT_BIND_LABEL,\r\n DEFAULT_BIND_VALUE,\r\n SELECT_FIELD_TYPES,\r\n} from '../../../consts/fields/select-field.const';\r\nimport { BaseField } from '../field.model';\r\nimport { ApiConfig, FieldDependency, FieldDependencyType } from '../../common';\r\nimport { SelectOutputValueType } from '../../common/output-value-type.model';\r\nimport { DependTypeEnum, SelectOutputValueTypeEnum } from '../../../enums/common';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\nimport { Suffix } from '../../common/common.model';\r\n\r\nexport type SelectFieldType = (typeof SELECT_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Input Field.\r\n */\r\nexport abstract class SelectBaseField<K> extends BaseField<K> {\r\n // Key lấy ra nhãn hiển thị ở options.\r\n bindLabel!: string;\r\n\r\n // Key lấy ra giá trị ngầm ở options.\r\n bindValue!: string;\r\n\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: SelectOutputValueType;\r\n\r\n matchSelectWidth: boolean;\r\n\r\n // Mảng options cho việc lựa chọn được truyền tĩnh từ config.\r\n options: Record<string, unknown>[];\r\n\r\n // Luôn chèn vào vị trí 0\r\n optionsToPrepend: Record<string, unknown>[];\r\n\r\n // Luôn chèn vào vị trí cuối\r\n optionsToAppend: Record<string, unknown>[];\r\n\r\n exceptOptions: Record<string, unknown>[];\r\n\r\n // Phụ thuộc vào một giá trị từ bất kỳ dạng field nào khác: Select, Input,...\r\n dependsOn: FieldDependency[];\r\n\r\n // Cấu hình api nếu danh sách select dựa vào việc gọi api GET. Ưu tiên hơn options tĩnh truyền vào từ config.\r\n apiConfig?: ApiConfig;\r\n\r\n /**\r\n * dependType:\r\n * - 'all' → cần tất cả field cha có giá trị mới gọi API\r\n * - 'any' → chỉ cần 1 field cha có giá trị cũng gọi API theo từng cha\r\n */\r\n\r\n dependType: FieldDependencyType;\r\n\r\n // Biến đổi hiển thị option label từ option của options.\r\n transformLabel?: (option: Record<string, unknown>) => string;\r\n\r\n // Các nút nằm ở hậu tố (bên phải control).\r\n suffixes: Suffix[];\r\n\r\n /**\r\n * Props validation chung cho các dạng Select.\r\n */\r\n // ................. Chưa có .................\r\n\r\n constructor(init: Partial<SelectBaseField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Select.\r\n */\r\n this.controlType = ControlTypeEnum.Select;\r\n this.bindLabel = DEFAULT_BIND_LABEL;\r\n this.bindValue = DEFAULT_BIND_VALUE;\r\n this.matchSelectWidth = true;\r\n this.outputAs = SelectOutputValueTypeEnum.Object;\r\n this.dependsOn = [];\r\n this.dependType = DependTypeEnum.All;\r\n this.suffixes = [];\r\n this.optionsToPrepend = [];\r\n this.optionsToAppend = [];\r\n this.options = [];\r\n this.exceptOptions = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Select.\r\n protected getCommonSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Select.\r\n protected getCustomSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonSelectValidators();\r\n const customValidators = this.getCustomSelectValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_SINGLE_SELECT_VALUE = null;\r\n\r\n/**\r\n * Interface của Select Field type là dạng Single.\r\n */\r\nexport class SingleSelectField extends SelectBaseField<string | Record<string, unknown> | null> {\r\n constructor(init: Partial<SingleSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single Select.\r\n */\r\n this.type = FieldTypeEnum.SingleSelect;\r\n this.value = DEFAULT_SINGLE_SELECT_VALUE;\r\n this.initialValue = DEFAULT_SINGLE_SELECT_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> | null {\r\n return DEFAULT_SINGLE_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> | null {\r\n if (!modelValue) return null;\r\n const value = modelValue as string | Record<string, unknown>;\r\n\r\n if (typeof value === 'object') {\r\n const valueFromObj = value?.[this.bindValue];\r\n const typeOfValueFromObj = typeof valueFromObj;\r\n if (typeOfValueFromObj !== 'object') return String(valueFromObj);\r\n else {\r\n console.warn('Từ bindValue nhưng đối tượng vẫn là dạng object');\r\n return '';\r\n }\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_MULTI_SELECT_VALUE: string[] = [];\r\n\r\n/**\r\n * Interface của Select Field type là dạng Multi.\r\n */\r\nexport class MultiSelectField extends SelectBaseField<string[] | Record<string, unknown>[]> {\r\n // Số lựa chọn (option) sẽ được hiển thị khi người dùng chọn nhiều.\r\n maxTagCount?: number;\r\n maxMultipleCount?: number;\r\n\r\n constructor(init: Partial<MultiSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi Select.\r\n */\r\n this.type = FieldTypeEnum.MultiSelect;\r\n this.value = DEFAULT_MULTI_SELECT_VALUE;\r\n this.initialValue = DEFAULT_MULTI_SELECT_VALUE;\r\n this.maxTagCount = 53;\r\n this.maxMultipleCount = Infinity;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string[] | Record<string, unknown>[] {\r\n return DEFAULT_MULTI_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string[] | Record<string, unknown>[] {\r\n const value = modelValue as string[] | Record<string, unknown>[];\r\n\r\n const optionsValue = value!.map((val: string | number | Record<string, unknown>) => {\r\n if (typeof val === 'object') {\r\n let transformVal = (val?.[this.bindValue] as string) ?? '';\r\n return transformVal;\r\n }\r\n return val as string;\r\n });\r\n\r\n return optionsValue;\r\n }\r\n}\r\n","import { FormControl } from '@angular/forms';\r\nimport { BaseField } from '../field.model';\r\nimport { DATE_FIELD_TYPES } from '../../../consts/fields';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nexport type DateFieldType = (typeof DATE_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Date.\r\n */\r\nexport abstract class BaseDateField<K> extends BaseField<K> {\r\n // Dạng date hiển thị.\r\n format: string;\r\n\r\n // Cho phép chọn ngày quá khứ?\r\n allowPastDates?: boolean;\r\n\r\n // Cho phép chọn ngày tương lai?\r\n allowFutureDates?: boolean;\r\n\r\n /**\r\n * Props validation chung cho các dạng Date.\r\n */\r\n\r\n constructor(init: Partial<BaseDateField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date.\r\n */\r\n this.controlType = ControlTypeEnum.Date;\r\n\r\n this.allowPastDates = true;\r\n this.allowFutureDates = true;\r\n this.format = 'dd-MM-yyyy';\r\n\r\n // this.value = undefined;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonValidators();\r\n const customValidators = this.getCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n}\r\n","/**\r\n * FIELD_TYPES là readonly ['input', 'select', 'checkbox',...]\r\n */\r\nexport const FIELD_TYPES = [\r\n 'input-text',\r\n 'input-password',\r\n 'textarea',\r\n 'date-picker',\r\n 'date-range',\r\n 'single-select',\r\n 'tree-select',\r\n 'multi-select',\r\n 'single-file-upload',\r\n 'multi-file-upload',\r\n 'multi-image-upload',\r\n 'avatar-upload',\r\n 'checkbox',\r\n 'radio',\r\n 'reminder-type-radio',\r\n 'switch',\r\n 'autocomplete',\r\n] as const;\r\n","/**\r\n * FIELD_TYPES là readonly ['input', 'select', 'checkbox',...]\r\n */\r\nexport const INPUT_FIELD_TYPES = ['text', 'email', 'password', 'number'] as const;\r\n","// Loại date field.\r\nexport const DATE_FIELD_TYPES = ['picker', 'range'] as const;\r\n\r\n// Các pattern dùng để check định dạng date.\r\nexport const FORMAT_DATE_PATTERNS = {\r\n YYYY_MM_DD: /^(\\d{4})([-\\/])(0[1-9]|1[0-2])\\2(0[1-9]|[12]\\d|3[01])$/,\r\n DD_MM_YYYY: /^(0[1-9]|[12]\\d|3[01])([-\\/])(0[1-9]|1[0-2])\\2(\\d{4})$/,\r\n MM_DD_YYYY: /^(0[1-9]|1[0-2])([-\\/])(0[1-9]|[12]\\d|3[01])\\2(\\d{4})$/,\r\n\r\n MM_DD_YYYY_HMS:\r\n /^(0[1-9]|1[0-2])([-\\/])(0[1-9]|[12]\\d|3[01])\\2(\\d{4})\\s([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)$/,\r\n};\r\n","import { FORMAT_DATE_PATTERNS } from '../../consts/fields';\r\n\r\n// Chuyển đổi đối tượng Date thành string có format DDMMYYYY.\r\nexport const formatDateToDDMMYYYY = (date: Date, separator: '-' | '/' = '-'): string => {\r\n const dd = String(date.getDate()).padStart(2, '0');\r\n const mm = String(date.getMonth() + 1).padStart(2, '0');\r\n const yyyy = date.getFullYear();\r\n\r\n return `${dd}${separator}${mm}${separator}${yyyy}`;\r\n};\r\n\r\n// Chuyển đổi đối tượng Date thành string có format DDMMYYYY.\r\nexport const formatDateToYYYYMMDD = (date: Date, separator: '-' | '/' = '-'): string => {\r\n const dd = String(date.getDate()).padStart(2, '0');\r\n const mm = String(date.getMonth() + 1).padStart(2, '0');\r\n const yyyy = date.getFullYear();\r\n\r\n return `${yyyy}${separator}${mm}${separator}${dd}`;\r\n};\r\n\r\n// Chuyển đổi string ở các dạng: YYYY-MM-DD, DD-MM-YYYY, MM-DD-YYYY đến Date, nếu sẵn là Date thì mặc định không đổi.\r\nexport const normalizeToDate = (input: string | Date | undefined): Date | null => {\r\n if (!input) return null;\r\n\r\n if (input instanceof Date && !isNaN(input.getTime())) return input;\r\n if (typeof input !== 'string') return null;\r\n\r\n const inputTrimed = input.trim();\r\n\r\n let match: RegExpMatchArray | null;\r\n let year: number, month: number, day: number;\r\n let hour = 0,\r\n minute = 0,\r\n second = 0;\r\n\r\n if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.YYYY_MM_DD))) {\r\n year = +match[1];\r\n month = +match[3] - 1;\r\n day = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.DD_MM_YYYY))) {\r\n day = +match[1];\r\n month = +match[3] - 1;\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY_HMS))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n hour = +match[5];\r\n minute = +match[6];\r\n second = +match[7];\r\n } else {\r\n console.warn('Sai định dạng chuỗi date');\r\n return null;\r\n }\r\n\r\n const date = new Date(year, month, day, hour, minute, second);\r\n\r\n if (\r\n date.getFullYear() === year &&\r\n date.getMonth() === month &&\r\n date.getDate() === day &&\r\n date.getHours() === hour &&\r\n date.getMinutes() === minute &&\r\n date.getSeconds() === second\r\n ) {\r\n return date;\r\n }\r\n\r\n console.warn('Ngày hoặc giờ không hợp lệ');\r\n return null;\r\n};\r\n\r\nexport const normalizeToDate1 = (input: string | Date | undefined): Date | null => {\r\n if (input) {\r\n if (input instanceof Date && !isNaN(input.getTime())) return input;\r\n if (typeof input !== 'string') return null;\r\n const inputTrimed = String(input).trim();\r\n let match: RegExpMatchArray | null;\r\n let year: number, month: number, day: number;\r\n if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.YYYY_MM_DD))) {\r\n year = +match[1];\r\n month = +match[3] - 1;\r\n day = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.DD_MM_YYYY))) {\r\n day = +match[1];\r\n month = +match[3] - 1;\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n } else {\r\n console.warn('Sai định dạng chuỗi date');\r\n return null;\r\n }\r\n const date = new Date(year, month, day); // Validate: kiểm tra lại giá trị date (28/29/30/31 hợp lệ)\r\n if (date.getFullYear() === year && date.getMonth() === month && date.getDate() === day) {\r\n return date;\r\n } else {\r\n console.warn('Ngày đưa vào không hợp lệ');\r\n return null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n// Tạo danh sách năm chạy ngược từ hiện tại đến năm chỉ định.\r\nexport const generateYearsDesc = (from: number): number[] => {\r\n const currentYear = new Date().getFullYear();\r\n const years: number[] = [];\r\n for (let year = currentYear; year >= from; year--) {\r\n years.push(year);\r\n }\r\n return years;\r\n};\r\n\r\n// Tạo danh sách năm chạy từ năm chỉ định đến năm hiện tại.\r\nexport const generateYearsAsc = (from: number): number[] => {\r\n const currentYear = new Date().getFullYear();\r\n const years: number[] = [];\r\n for (let year = from; year <= currentYear; year++) {\r\n years.push(year);\r\n }\r\n return years;\r\n};\r\n","import { DatePickerOutputValueTypeEnum } from '../../../enums/common';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { normalizeToDate } from '../../../utils/date';\r\nimport { DatePickerOutputValueType } from '../../common';\r\nimport { BaseDateField } from './base-date-field.model';\r\n\r\nconst DEFAULT_DATE_PICKER_VALUE = '';\r\n\r\n/**\r\n * Interface của Date type là Picker.\r\n */\r\nexport class DatePickerField extends BaseDateField<string | Date | null> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: DatePickerOutputValueType;\r\n\r\n // Custom function to disable dates\r\n disabledDateFn?: (current: Date) => boolean;\r\n\r\n constructor(init: Partial<DatePickerField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date picker.\r\n */\r\n this.type = FieldTypeEnum.DatePicker;\r\n this.value = DEFAULT_DATE_PICKER_VALUE;\r\n this.initialValue = DEFAULT_DATE_PICKER_VALUE;\r\n this.outputAs = DatePickerOutputValueTypeEnum.String;\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Date {\r\n return DEFAULT_DATE_PICKER_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): Date | null {\r\n const value = modelValue as string | Date;\r\n\r\n if (!value) return null;\r\n\r\n return normalizeToDate(value);\r\n }\r\n}\r\n","import { DateRangeOutputValueTypeEnum } from '../../../enums/common';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { normalizeToDate } from '../../../utils/date';\r\nimport { DateRangeOutputValueType } from '../../common';\r\nimport { BaseDateField } from './base-date-field.model';\r\n\r\nconst DEFAULT_DATE_RANGE_VALUE: string[] | Date[] = [];\r\n\r\n/**\r\n * Interface của Date type là Range.\r\n */\r\nexport class DateRangeField extends BaseDateField<string | string[] | Date[]> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: DateRangeOutputValueType;\r\n\r\n constructor(init: Partial<DateRangeField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date range.\r\n */\r\n this.type = FieldTypeEnum.DateRange;\r\n this.value = DEFAULT_DATE_RANGE_VALUE;\r\n this.initialValue = DEFAULT_DATE_RANGE_VALUE;\r\n this.outputAs = DateRangeOutputValueTypeEnum.StringArray;\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string[] | Date[] {\r\n return DEFAULT_DATE_RANGE_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string[] | Date[] {\r\n let value = modelValue as string | string[] | Date[];\r\n\r\n if (typeof value === 'string') {\r\n value = value.split(',').map(dateStr => dateStr.trim());\r\n }\r\n\r\n let dateRange: Date[] = [];\r\n\r\n if (value?.length === 2) {\r\n const startDate = normalizeToDate(value[0]);\r\n const endDate = normalizeToDate(value[1]);\r\n if (startDate && endDate) dateRange = [startDate, endDate];\r\n }\r\n return dateRange;\r\n }\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { BaseField } from '../field.model';\r\nimport { UPLOAD_FIELD_TYPES } from '../../../consts/fields/upload-field.const';\r\nimport { ApiConfig, ApiFileConfig, UploadOutputValueType } from '../../common';\r\nimport {\r\n acceptedMimeTypesValidator,\r\n getDefaultAcptMimeTypesErrorMessage,\r\n getDefaultMaxSizeInMBErrorMessage,\r\n maxFileSizeInMBValidator,\r\n} from '../../../utils/validators';\r\nimport { DEFAULT_ACCEPTED_MIME_TYPES } from '../../../consts/common';\r\nimport { CustomValidaterEnum } from '../../../enums/validators';\r\nimport { getExtensions } from '../../../utils/file';\r\nimport { UploadOutputValueTypeEnum } from '../../../enums/common';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nexport type UploadFieldType = (typeof UPLOAD_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Date.\r\n */\r\nexport abstract class BaseUploadField<K> extends BaseField<K> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: UploadOutputValueType;\r\n\r\n // Config api file liên quan: upload, delete.\r\n apiFileConfig: ApiFileConfig;\r\n\r\n // Các loại mimetypes được chấp nhận.\r\n acceptedMimeTypes: string[];\r\n\r\n // Kích thước tối đa của tập tin tải lên tính bằng MB.\r\n maxSizeInMB: number;\r\n\r\n // Hiển thị thông tin hướng dẫn các định dạng file được phép upload theo config của acceptedMimeTypes\r\n showAcceptedExtensionGuide: boolean;\r\n\r\n // Mở/tắt cơ chế upload tạm.\r\n uploadTemp: boolean;\r\n\r\n /**\r\n * Props validation chung cho các dạng Date.\r\n */\r\n\r\n constructor(init: Partial<BaseUploadField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date.\r\n */\r\n this.controlType = ControlTypeEnum.Upload;\r\n this.outputAs = UploadOutputValueTypeEnum.Object;\r\n this.apiFileConfig = {\r\n uploadUrl: '',\r\n deleteUrl: '',\r\n };\r\n this.acceptedMimeTypes = DEFAULT_ACCEPTED_MIME_TYPES;\r\n this.maxSizeInMB = 25;\r\n this.showAcceptedExtensionGuide = true;\r\n this.uploadTemp = true;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi angular cho Input Password.\r\n protected getCustomBaseUploadValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n // Kiểm tra xem file tải lên có type nằm trong mảng acceptedMimeTypes đã chỉ định hay không.\r\n if (this.acceptedMimeTypes?.length > 0)\r\n validators.push(acceptedMimeTypesValidator(this.acceptedMimeTypes));\r\n\r\n // Kiểm tra kích thước tối đa mà file tải lên được cho phép.\r\n validators.push(maxFileSizeInMBValidator(this.maxSizeInMB));\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonValidators();\r\n const customValidators = this.getCustomBaseUploadValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n // Lấy error message mặc định của acceptedMimeTypes.\r\n if (errorKey === CustomValidaterEnum.AcceptedMimiTypes) {\r\n const typeString = getExtensions(this.acceptedMimeTypes).join(', ');\r\n return getDefaultAcptMimeTypesErrorMessage(typeString);\r\n }\r\n\r\n // Lấy error message mặc định của maxSizeInMB.\r\n if (errorKey === CustomValidaterEnum.MaxSizeInMB) {\r\n return getDefaultMaxSizeInMBErrorMessage(this.maxSizeInMB);\r\n }\r\n\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { Suffix } from '../../common/common.model';\r\nimport { BaseUploadField } from './base-upload-field.model';\r\n\r\nconst DEFAULT_SINGLE_FILE_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Single file upload. Đầu vào có thể là chuỗi JSON hoặc đối tượng File.\r\n */\r\nexport class SingleFileUploadField extends BaseUploadField<string | File> {\r\n suffixes: Suffix[];\r\n constructor(init: Partial<SingleFileUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single file upload.\r\n */\r\n\r\n this.type = FieldTypeEnum.SingleFileUpload;\r\n this.value = DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n this.suffixes = [];\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { BaseUploadField } from './base-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\n\r\nconst DEFAULT_MULTI_FILE_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Multi file upload.\r\n */\r\nexport class MultiFileUploadField extends BaseUploadField<string | File> {\r\n // Số lượng tập tin tối đa có thể tải lên.\r\n maxFileCount: number;\r\n\r\n constructor(init: Partial<MultiFileUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi file upload.\r\n */\r\n this.type = FieldTypeEnum.MultiFileUpload;\r\n this.value = DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n this.maxFileCount = 6;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | File {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { BaseUploadField } from './base-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\n\r\nconst DEFAULT_MULTI_IMAGE_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Multi image upload.\r\n */\r\nexport class MultiImageUploadField extends BaseUploadField<string | File> {\r\n // Số lượng hình ảnh tối đa có thể tải lên.\r\n maxFileCount: number;\r\n\r\n // Độ dài card bao image.\r\n imageCardWidth: string;\r\n\r\n // Độ cao card bao image.\r\n imageCardHeight: string;\r\n\r\n constructor(init: Partial<MultiImageUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi image upload.\r\n */\r\n this.type = FieldTypeEnum.MultiImageUpload;\r\n this.value = DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n this.maxFileCount = 6;\r\n this.imageCardWidth = '108px';\r\n this.imageCardHeight = '108px';\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: string | File): string {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\n\nexport interface DynamicFormConfig {\n prefix: string;\n mainApiUrl: string;\n systemApiUrl: string;\n portalApiUrl: string;\n storageUrl: string;\n}\n\nexport const DYNAMIC_FORM_CONFIG = new InjectionToken<DynamicFormConfig>('DYNAMIC_FORM_CONFIG');\n","import { format } from 'date-fns';\n\nexport class FormUtils {\n public static makeFileNameEncode(str: string): string {\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\n str = str.replace(/đ/g, 'd');\n str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, 'A');\n str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, 'E');\n str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, 'I');\n str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, 'O');\n str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, 'U');\n str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, 'Y');\n str = str.replace(/Đ/g, 'D');\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, ''); \n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, ''); \n return str;\n }\n\n public static randomFileName(name: string): string {\n const ns = name.split('.');\n const extension = ns.pop();\n const encodedName = FormUtils.makeFileNameEncode(ns.join('.'));\n return `${encodedName}_${Math.floor(Math.random() * 90000) + 10000}.${extension}`.toLocaleLowerCase();\n }\n\n public static convertViewDate(date: unknown, ft: string = 'dd/MM/yyyy'): string {\n let d: Date | null = null;\n if (date instanceof Date) {\n d = date;\n } else if (typeof date === 'string') {\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(date)) {\n d = new Date(date);\n } else if (/^\\d{2}\\/\\d{2}\\/\\d{4}\\s\\d{2}:\\d{2}:\\d{2}$/.test(date)) {\n const [datePart, timePart] = date.split(' ');\n const [month, day, year] = datePart.split('/').map(Number);\n const [hour, min, sec] = timePart.split(':').map(Number);\n d = new Date(year, month - 1, day, hour, min, sec);\n } else {\n const parsed = new Date(date);\n if (!isNaN(parsed.getTime())) {\n d = parsed;\n }\n }\n }\n return d && !isNaN(d.getTime()) ? format(d, ft) : '';\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DYNAMIC_FORM_CONFIG } from '../config/dynamic-form.config';\nimport { FormUtils } from './form-utils';\n\n@Injectable({ providedIn: 'root' })\nexport class FormConfigService {\n private config = inject(DYNAMIC_FORM_CONFIG);\n\n public handleApiUrlCreation(apiUrlFromApi: string, typeGrpCode?: string): string {\n if (!apiUrlFromApi) return '';\n let newApiUrl = '';\n const domain = apiUrlFromApi.split('/')[0];\n\n let newDomain = '';\n switch (domain.toLowerCase()) {\n case '{mainapiurl}':\n newDomain = this.config.mainApiUrl;\n break;\n case '{systemapiurl}':\n newDomain = this.config.systemApiUrl;\n break;\n case '{portalapiurl}':\n newDomain = this.config.portalApiUrl;\n break;\n default:\n newDomain = domain;\n }\n\n newApiUrl = apiUrlFromApi.replace(`${domain}/`, newDomain ? `${newDomain}/` : '');\n\n if (typeGrpCode) {\n newApiUrl = newApiUrl.replace('{ObjTypeGroupCode}', typeGrpCode);\n }\n\n return newApiUrl;\n }\n\n public generateRandomFileName(name: string, addition = ''): string {\n const encodedName = FormUtils.makeFileNameEncode(name);\n return `${this.config.prefix}_${addition || 'file'}_${\n Math.floor(Math.random() * 9000000000) + 1000000000\n }_${encodedName}`.toLocaleLowerCase();\n }\n\n public getViewFileUrl(fileName: string, isTemp: boolean = false): string {\n const type = isTemp ? 'temporary' : 'public';\n return `${this.config.storageUrl}${type}/${fileName}`;\n }\n\n public getStorageUrl(): string {\n return this.config.storageUrl;\n }\n}\n","import { BaseUploadField } from './base-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { DEFAULT_ACCEPTED_IMAGE_MIME_TYPES } from '../../../consts/common';\r\n\r\nconst DEFAULT_AVATAR_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Avatar upload.\r\n */\r\nexport class AvatarUploadField extends BaseUploadField<string | Record<string, unknown>> {\r\n constructor(init: Partial<AvatarUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Avatar upload.\r\n */\r\n\r\n this.type = FieldTypeEnum.AvatarUpload;\r\n this.value = DEFAULT_AVATAR_UPLOAD_VALUE;\r\n this.acceptedMimeTypes = DEFAULT_ACCEPTED_IMAGE_MIME_TYPES;\r\n this.initialValue = DEFAULT_AVATAR_UPLOAD_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> {\r\n return DEFAULT_AVATAR_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_TREE_SELECT_VALUE = null;\r\n\r\n/**\r\n * Interface của Select Field type là dạng Single.\r\n */\r\nexport class TreeSelectField extends SelectBaseField<string | Record<string, unknown> | null> {\r\n groupBy?: string;\r\n constructor(init: Partial<TreeSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single Select.\r\n */\r\n this.type = FieldTypeEnum.TreeSelect;\r\n this.value = DEFAULT_TREE_SELECT_VALUE;\r\n this.initialValue = DEFAULT_TREE_SELECT_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> | null {\r\n return DEFAULT_TREE_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> | null {\r\n if (!modelValue) return null;\r\n const value = modelValue as string | Record<string, unknown>;\r\n\r\n if (typeof value === 'object') {\r\n const valueFromObj = value?.[this.bindValue];\r\n const typeOfValueFromObj = typeof valueFromObj;\r\n if (typeOfValueFromObj !== 'object') return String(valueFromObj);\r\n else {\r\n console.warn('Từ bindValue nhưng đối tượng vẫn là dạng object');\r\n return '';\r\n }\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { computed, inject, Injectable, signal } from \"@angular/core\";\r\nimport { BaseField } from \"../models/fields/field.model\";\r\nimport { Extra, ObjField } from \"../models/common/obj-field.model\";\r\nimport { isValidJSON, lowerCaseFirstChar } from \"../utils/common\";\r\nimport { FieldTypeEnum } from \"../enums/fields\";\r\nimport { InputPasswordField, InputTextField } from \"../models/fields/input\";\r\nimport { TextareaField } from \"../models/fields/textarea/textarea-field.model\";\r\nimport { SingleSelectField } from \"../models/fields/select/single-select-field.model\";\r\nimport { MultiSelectField } from \"../models/fields/select/multi-select-field.model\";\r\nimport { DatePickerField, DateRangeField } from \"../models/fields/date\";\r\nimport { SingleFileUploadField } from \"../models/fields/upload/single-file-upload-field.model\";\r\nimport { MultiFileUploadField } from \"../models/fields/upload/multi-file-upload-field.model\";\r\nimport { FormGroup } from \"@angular/forms\";\r\nimport { MultiImageUploadField } from \"../models/fields/upload/multi-image-upload-field.model\";\r\nimport { FormConfigService } from \"./form-config.service\";\r\nimport { AvatarUploadField } from \"../models/fields/upload/avatar-upload-field.model\";\r\nimport { TreeSelectField } from \"../models/fields/select/tree-select-field.model\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class DynamicFormService {\r\n private formConfigService = inject(FormConfigService);\r\n\r\n /**\r\n * Lưu giữ FormGroup hiện tại của dynamic form.\r\n */\r\n private _formGroup!: FormGroup;\r\n\r\n // Lấy FormGroup.\r\n get formGroup() {\r\n return this._formGroup;\r\n }\r\n\r\n // Gán FormGroup.\r\n setFormGroup(formGroup: FormGroup) {\r\n this._formGroup = formGroup;\r\n }\r\n\r\n /**\r\n * Lưu giữ fields hiện tại của dynamic form.\r\n */\r\n private _fields!: BaseField<any>[];\r\n\r\n // Lấy fields.\r\n get fields() {\r\n return this._fields;\r\n }\r\n\r\n // Gán fields.\r\n setFields(fields: BaseField<any>[]) {\r\n this._fields = fields;\r\n }\r\n\r\n /**\r\n * Thao tác với control và fields cũng như output đầu ra của data form.\r\n */\r\n setFieldValue(fieldKey: string, rawValue: unknown) {\r\n const field = this.fields.find((f) => f.key === fieldKey);\r\n if (!field) return;\r\n\r\n const formValue = field.toFormValue(rawValue);\r\n this.formGroup.get(fieldKey)?.setValue(formValue);\r\n }\r\n\r\n /**\r\n * Signal để kích hoạt submit từ bên ngoài.\r\n */\r\n private readonly _submitTrigger = signal<{\r\n formId: string | null;\r\n time: number;\r\n } | null>(null);\r\n\r\n // Lấy signal để track vào effect.\r\n get submitTrigger() {\r\n return this._submitTrigger.asReadonly();\r\n }\r\n\r\n // Tiến hành submit.\r\n triggerSubmit(formId: string | null) {\r\n this._submitTrigger.set({ formId, time: Date.now() }); // trigger tạo theo formId.\r\n }\r\n\r\n /**\r\n * Signal để kích hoạt reset từ bên ngoài.\r\n */\r\n private readonly _resetTrigger = signal<{\r\n formId: string;\r\n time: number;\r\n } | null>(null);\r\n\r\n get resetTrigger() {\r\n return this._resetTrigger.asReadonly();\r\n }\r\n\r\n triggerReset(formId: string) {\r\n if (formId) this._resetTrigger.set({ formId, time: Date.now() });\r\n }\r\n\r\n /**\r\n * Tạo mảng fields đầu vào theo mảng data từ objField.\r\n */\r\n createFieldsByObjFields(\r\n objFields: ObjField[],\r\n formType: string,\r\n options?: {},\r\n ): BaseField<any>[] {\r\n let fields: BaseField<any>[] = [];\r\n\r\n // Nếu không tồn tại objFields hoặc objFields là mảng rỗng.\r\n if (!objFields || objFields.length === 0) return [];\r\n\r\n for (const objField of objFields) {\r\n // Bỏ qua những field không cấu hình.\r\n if (!objField?.extra) {\r\n continue;\r\n }\r\n\r\n // Nếu extra không phải chuỗi JSON hợp lệ.\r\n if (objField?.extra && !isValidJSON(objField?.extra)) {\r\n // console.warn(`Extra của field ${objField.code} không phải chuỗi dạng JSON`);\r\n continue;\r\n }\r\n\r\n const extra: Extra = JSON.parse(objField?.extra);\r\n if (!extra.form) {\r\n continue;\r\n }\r\n\r\n const form = extra.form;\r\n const { formTypes, configs } = form;\r\n\r\n if (!formTypes.includes(formType)) {\r\n // console.error(`Field '${objField.code}' không tồn tại formType '${formType}'`);\r\n continue;\r\n }\r\n\r\n const fieldConfig = configs?.[formType];\r\n if (!fieldConfig) {\r\n // console.error(`Field '${objField.code}' không có config field với formType '${formType}'`);\r\n continue;\r\n }\r\n\r\n const field = this.createFieldFromJson(fieldConfig, objField);\r\n if (field) {\r\n fields.push(field);\r\n } else {\r\n // console.error(`Field '${objField.code}' không có fieldType phù hợp`);\r\n continue;\r\n }\r\n }\r\n\r\n return fields.sort((a, b) => a.seqNum - b.seqNum);\r\n }\r\n\r\n private createFieldFromJson(\r\n fieldConfig: BaseField<any>,\r\n objField: ObjField,\r\n ): BaseField<any> | null {\r\n fieldConfig.key =\r\n fieldConfig?.key || lowerCaseFirstChar(objField.code) || \"\";\r\n fieldConfig.label = fieldConfig?.label || objField?.name || \"\";\r\n fieldConfig.groupCode = fieldConfig.groupCode ?? objField.viewType ?? \"\";\r\n fieldConfig.seqNum = fieldConfig.seqNum ?? objField.seqNum;\r\n fieldConfig.required = fieldConfig.required ?? objField.required === 3;\r\n\r\n const fieldType = fieldConfig.type;\r\n if (fieldType === FieldTypeEnum.InputText) {\r\n return new InputTextField({ ...(fieldConfig as InputTextField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.InputPassword) {\r\n return new InputPasswordField({ ...(fieldConfig as InputPasswordField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.Textarea) {\r\n return new TextareaField({ ...(fieldConfig as TextareaField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.SingleSelect) {\r\n const singleSelect = fieldConfig as SingleSelectField;\r\n if (!singleSelect.apiConfig) {\r\n singleSelect.apiConfig = {\r\n baseUrl: this.formConfigService.handleApiUrlCreation(\r\n objField.apiURL || \"\",\r\n objField.objTypeGroupCode,\r\n ),\r\n };\r\n }\r\n return new SingleSelectField({ ...singleSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiSelect) {\r\n const multiSelect = fieldConfig as MultiSelectField;\r\n if (!multiSelect.apiConfig) {\r\n multiSelect.apiConfig = {\r\n baseUrl: this.formConfigService.handleApiUrlCreation(\r\n objField.apiURL || \"\",\r\n objField.objTypeGroupCode,\r\n ),\r\n };\r\n }\r\n return new MultiSelectField({ ...multiSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.TreeSelect) {\r\n const treeSelect = fieldConfig as TreeSelectField;\r\n if (!treeSelect.apiConfig) {\r\n treeSelect.apiConfig = {\r\n baseUrl: this.formConfigService.handleApiUrlCreation(\r\n objField.apiURL || \"\",\r\n objField.objTypeGroupCode,\r\n ),\r\n };\r\n }\r\n return new TreeSelectField({ ...treeSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.DatePicker) {\r\n return new DatePickerField({ ...(fieldConfig as DatePickerField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.DateRange) {\r\n return new DateRangeField({ ...(fieldConfig as DateRangeField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.SingleFileUpload) {\r\n return new SingleFileUploadField({\r\n ...(fieldConfig as SingleFileUploadField),\r\n });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiFileUpload) {\r\n return new MultiFileUploadField({\r\n ...(fieldConfig as MultiFileUploadField),\r\n });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.AvatarUpload) {\r\n return new AvatarUploadField({ ...(fieldConfig as AvatarUploadField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiImageUpload) {\r\n return new MultiImageUploadField({\r\n ...(fieldConfig as MultiImageUploadField),\r\n });\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable, Signal, signal, WritableSignal } from '@angular/core';\r\nimport { ApiResponse } from '../models/common/api-response.model';\r\nimport { LastChangedParent } from '../models/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FieldService {\r\n private httpClient = inject(HttpClient);\r\n\r\n // Options for dropdown.\r\n getAllOptions<T = Record<string, unknown>>(apiUrl: string, queryParams: Record<string, unknown>) {\r\n return this.httpClient.get<ApiResponse<T[]>>(apiUrl, {\r\n params: { ...(queryParams as { [key: string]: any }) },\r\n });\r\n }\r\n\r\n private dependValuesMap = new Map<string, WritableSignal<string>>();\r\n\r\n updateDependValuesMap(key: string, value: string): void {\r\n if (!this.dependValuesMap.has(key)) {\r\n this.dependValuesMap.set(key, signal(value));\r\n return;\r\n }\r\n\r\n const fieldSignal = this.dependValuesMap.get(key)!;\r\n fieldSignal.set(value);\r\n }\r\n\r\n getDependValuesMap(): Map<string, Signal<string>> {\r\n return this.dependValuesMap;\r\n }\r\n\r\n // Signal lưu trữ đối tượng chứa các prop là fieldKey có isParent là true.\r\n private dependValues = signal<Record<string, string>>({});\r\n\r\n // Cập nhật giá trị theo key vào đối tượng của signal.\r\n updateDependValues(key: string, value: string): void {\r\n this.dependValues.update(curr => ({ ...curr, [key]: value }));\r\n }\r\n // Xóa giá trị và loại bỏ key theo key khỏi đối tượng của signal.\r\n removeDependValues(key: string): void {\r\n this.dependValues.update(({ [key]: _, ...rest }) => rest);\r\n }\r\n\r\n getDependValues(): Record<string, string> {\r\n return this.dependValues();\r\n }\r\n\r\n clearDependValues(): void {\r\n this.dependValues.set({});\r\n }\r\n\r\n // Lấy trị trị theo key.\r\n getValueProp(key: string) {\r\n return this.dependValues()[key];\r\n }\r\n\r\n // Signal lưu giữ xem field có isParent gần nhất vừa change giá trị.\r\n private lastChangedParent = signal<LastChangedParent | null>(null);\r\n\r\n // Cập nhật key của parent gần nhất change.\r\n updateLastChangedParent(key: string, value: unknown): void {\r\n this.lastChangedParent.set({ key, value });\r\n }\r\n\r\n // Lấy ra key của parent gần nhất change.\r\n getLastChangedParent(): LastChangedParent | null {\r\n return this.lastChangedParent();\r\n }\r\n\r\n clearLastChangedParent(): void {\r\n this.lastChangedParent.set(null);\r\n }\r\n\r\n // Field change cho bên ngoài form\r\n private fieldChange = new Subject<{\r\n key: string;\r\n value: any;\r\n }>();\r\n\r\n fieldChange$ = this.fieldChange.asObservable(); // expose ra ngoài.\r\n\r\n onFieldChange(key: string, value: any) {\r\n this.fieldChange.next({\r\n key,\r\n value,\r\n });\r\n }\r\n}\r\n","import { Injectable, signal, untracked, WritableSignal } from '@angular/core';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FormDataService {\r\n // Lưu một hoặc nhiều form data.\r\n private formDataMap = new Map<string, WritableSignal<Record<string, unknown>>>();\r\n\r\n /**\r\n * Kiểm tra xem đã tồn tại form data với form id truyền vào.\r\n * @param formId Id của form.\r\n * @returns true nếu có và ngược lại\r\n */\r\n has(formId: string): boolean {\r\n if (!this.formDataMap.has(formId)) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Cập nhật giá trị của một hoặc nhiều field vào form data theo form id.\r\n * @param formId Id của form.\r\n * @param data Đối tượng các field theo dạng key:value.\r\n */\r\n patch(formId: string, data: Record<string, unknown>) {\r\n // Lấy form data từ formDataMap.\r\n let formData = this.formDataMap.get(formId);\r\n\r\n // Nếu chưa có form data trong formDataMap thì thêm mới. Ngược lại cập nhật field data vào formData.\r\n if (!formData) {\r\n formData = signal(data);\r\n } else {\r\n formData.update(curr => ({ ...curr, ...data }));\r\n }\r\n\r\n // Tiến hành cập nhật vào formDataMap.\r\n this.formDataMap.set(formId, formData);\r\n }\r\n\r\n /**\r\n * Gán form data theo form id.\r\n * @param formId Id của form.\r\n * @param data Đối tượng các field theo dạng key:value.\r\n */\r\n set(formId: string, data: Record<string, unknown>) {\r\n this.formDataMap.set(formId, signal(data));\r\n }\r\n\r\n /**\r\n * Lấy giá trị của form data theo form id có track signal.\r\n * @param formId Id của form.\r\n * @returns Record<string, unknown> nếu có giá trị. Ngược lại undefined.\r\n */\r\n get(formId: string): Record<string, unknown> | undefined {\r\n const formData = this.formDataMap.get(formId);\r\n\r\n if (!formData) return undefined;\r\n\r\n return formData();\r\n }\r\n\r\n /**\r\n * Lấy giá trị của form data theo form id không track signal.\r\n * @param formId Id của form.\r\n * @returns Record<string, unknown> nếu có giá trị. Ngược lại undefined.\r\n */\r\n getSnapshot(formId: string): Record<string, unknown> | undefined {\r\n const formData = this.formDataMap.get(formId);\r\n\r\n if (!formData) return undefined;\r\n\r\n return untracked(() => formData());\r\n }\r\n\r\n /**\r\n * Clear giá trị form data theo form id. Clear chứ không xóa khỏi formDataMap hoàn toàn.\r\n * @param formId Id của form.\r\n */\r\n clear(formId: string) {\r\n let formData = this.formDataMap.get(formId);\r\n\r\n if (formData) {\r\n formData.set({});\r\n this.formDataMap.set(formId, formData);\r\n }\r\n }\r\n\r\n /**\r\n * Delete form data theo form id khỏi formDataMap.\r\n * @param formId Id của form.\r\n */\r\n delete(formId: string) {\r\n let formData = this.formDataMap.get(formId);\r\n if (formData) this.formDataMap.delete(formId);\r\n }\r\n\r\n /**\r\n *\r\n * @param formId Id của form.\r\n * @param key mã trường trong object form data.\r\n * @returns unknown.\r\n */\r\n getFieldValue(formId: string, key: string): unknown {\r\n let formData = this.formDataMap.get(formId);\r\n let fieldValue: unknown = undefined;\r\n\r\n if (formData) {\r\n fieldValue = formData()?.[key];\r\n }\r\n\r\n return fieldValue;\r\n }\r\n}\r\n","import { computed, Directive, inject, input, Input, untracked } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor } from '@angular/forms';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { FormMode } from '../models/form';\r\nimport { FormModeEnum } from '../enums/form';\r\nimport { DynamicFormService } from '../services/dynamic-form.service';\r\nimport { FieldService } from '../services/field.service';\r\nimport { LastChangedParent } from '../models/common';\r\nimport { BaseField } from '../models/fields/field.model';\r\nimport { ViewModeEnum } from '../enums/common';\r\nimport { FormDataService } from '../services/form-data.service';\r\n\r\n@Directive() // Dùng @Directive vì class này không có template riêng\r\nexport abstract class BaseValueAccessor<T> implements ControlValueAccessor {\r\n // Control theo dạng field lấy từ reactive form.\r\n @Input({ required: true }) formId!: string;\r\n\r\n readonly fieldInput = input.required<BaseField<T>>();\r\n protected readonly fieldKey = untracked(() => computed<string>(() => this.fieldInput().key));\r\n\r\n @Input({ required: false }) control: AbstractControl<T> | null = null;\r\n\r\n // Chế độ form: Add, Edit, View...\r\n readonly modeSignal = input<FormMode>(FormModeEnum.Add);\r\n\r\n readonly isAdd = computed(() => this.modeSignal() === 'add');\r\n readonly isEdit = computed(() => this.modeSignal() === 'edit');\r\n readonly isView = computed(() => this.modeSignal() === 'view');\r\n readonly isAddOrEdit = computed(() => ['add', 'edit'].includes(this.modeSignal()));\r\n readonly isEditOrView = computed(() => ['edit', 'view'].includes(this.modeSignal()));\r\n\r\n protected readonly formModeEnum = FormModeEnum;\r\n protected readonly viewModeEnum = ViewModeEnum;\r\n\r\n protected readonly destroy$ = new Subject<void>();\r\n\r\n // Dành cho ControlValueAccessor.\r\n protected value: T | null = null;\r\n protected onChange: (value: T | null) => void = () => {};\r\n protected onTouched: () => void = () => {};\r\n isDisabled = false;\r\n\r\n protected dFormService = inject(DynamicFormService);\r\n protected formDataService = inject(FormDataService);\r\n protected fieldService = inject(FieldService);\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n protected takeUntilDestroy<T>() {\r\n return takeUntil<T>(this.destroy$);\r\n }\r\n\r\n writeValue(value: T | null): void {\r\n this.value = value;\r\n this.writeValueToView(value); // 👈 component con override nếu cần.\r\n }\r\n\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.setDisabledOnView(isDisabled);\r\n }\r\n\r\n protected propagateValue(value: T | null): void {\r\n this.value = value;\r\n this.onChange(this.value);\r\n // Khi thay đổi value.\r\n this.handleValueChange(value);\r\n }\r\n\r\n // Xử lý reset chung ban đầu.\r\n protected reset(): void {\r\n if (!this.control || !this.isAddOrEdit()) return;\r\n const baseField = untracked(() => this.fieldInput());\r\n this.control.reset(baseField.initialValue as T);\r\n }\r\n\r\n /**\r\n * Thêm dữ liệu ở từng dạng field vào form data theo form id cụ thể.\r\n * @param key Mã của field.\r\n * @param value Giá trị của field.\r\n */\r\n protected patchFormData(key: string, value: T | null): void {\r\n this.formDataService.patch(this.formId, { [key]: value });\r\n }\r\n\r\n // Update data ở từng prop vào dependValuesSignal. Cơ chế nếu falsy thì không được phép cho vào dependValuesSignal.\r\n protected updateDependValues(key: string, value: string): void {\r\n this.fieldService.removeDependValues(key);\r\n if (value) {\r\n this.fieldService.updateDependValues(key, value);\r\n }\r\n }\r\n\r\n // Đánh dấu field có isParent là true vừa thay đổi.\r\n protected updateLastChangedParent(key: string, value: unknown): void {\r\n this.fieldService.updateLastChangedParent(key, value);\r\n }\r\n\r\n protected disableAndResetControl(): void {\r\n this.control?.reset();\r\n this.control?.disable();\r\n }\r\n\r\n protected disableControl(): void {\r\n this.control?.disable();\r\n }\r\n\r\n protected enableControl(): void {\r\n this.control?.enable();\r\n }\r\n\r\n /**\r\n * Optional: để component override riêng.\r\n */\r\n // Xử lý giao diện khi ghi giá trị mới.\r\n protected writeValueToView(value: T | null): void {}\r\n\r\n // Khi value change.\r\n protected handleValueChange(value: T | null): void {}\r\n\r\n // Xử lý giao diện khi ghi thay đổi giá trị isDisabled.\r\n protected setDisabledOnView(isDisabled: boolean): void {}\r\n\r\n // Xử lý các logic riêng của reset ở add mode.\r\n protected resetForAdd(): void {}\r\n\r\n // Xử lý các logic riêng của reset ở edit mode.\r\n protected resetForEdit(): void {}\r\n\r\n // Xử lý các logic riêng chung cuối cùng.\r\n protected finalizeReset(): void {}\r\n}\r\n","import { Component, computed, effect, forwardRef, untracked } from '@angular/core';\r\nimport { FORM_MODULES } from '../../../../consts/common';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { DatePickerField } from '../../../../models/fields/date/date-picker-field.model';\r\nimport { createPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { differenceInCalendarDays } from 'date-fns';\r\nimport { DatePickerOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { formatDateToDDMMYYYY, formatDateToYYYYMMDD } from '../../../../utils/date';\r\nimport { DatePickerOutputValueType } from '../../../../models/common/output-value-type.model';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { FormUtils } from '../../../../services/form-utils';\r\n\r\nconst ZORRO_MODULES = [NzDatePickerModule, NzInputModule];\r\n\r\n@Component({\r\n selector: 'app-date-picker',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './date-picker.component.html',\r\n styleUrls: ['./date-picker.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatePickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DatePickerComponent extends BaseValueAccessor<string | Date> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof DatePickerField) ||\r\n (base.type !== FieldTypeEnum.DatePicker && base.controlType !== ControlTypeEnum.Date)\r\n ) {\r\n throw new Error('Expected DatePickerField');\r\n }\r\n return base;\r\n });\r\n\r\n displayValue = '';\r\n\r\n // Kiểm tra có cho phép chọn ngày quá khứ hay ngày tương lai hay không?\r\n disabledDate = computed(() => {\r\n const field = this.fieldSignal();\r\n return (current: Date): boolean => {\r\n if (field.disabledDateFn) {\r\n return field.disabledDateFn(current);\r\n }\r\n const today = new Date();\r\n const diff = differenceInCalendarDays(current, today);\r\n\r\n // if (field.onlyToday) return diff !== 0;\r\n if (!field.allowPastDates && diff < 0) return true;\r\n if (!field.allowFutureDates && diff > 0) return true;\r\n\r\n return false;\r\n };\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder } = field;\r\n if (!placeholder) field.placeholder = createPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n handleChangeDate(date: Date): void {\r\n this.propagateValue(date);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: Date): void {\r\n if (this.isView()) {\r\n this.displayValue = value\r\n ? FormUtils.convertViewDate(value, this.fieldSignal().format ?? 'dd-MM-yyyy')\r\n : NO_INFO_TEXT;\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n const { outputAs } = untracked(() => this.fieldSignal());\r\n\r\n this.fieldService.updateDependValuesMap(\r\n this.fieldKey(),\r\n value ? formatDateToYYYYMMDD(value) : '',\r\n );\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value, outputAs);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: Date): void {\r\n const { outputAs, isParent } = untracked(() => this.fieldSignal());\r\n\r\n if (isParent) {\r\n this.fieldService.updateDependValuesMap(\r\n this.fieldKey(),\r\n value ? formatDateToYYYYMMDD(value) : '',\r\n );\r\n }\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value, outputAs);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n private getValueByOutputAs(date: Date, outputAs: DatePickerOutputValueType): string | Date {\r\n let value: string | Date = date;\r\n\r\n if (outputAs === DatePickerOutputValueTypeEnum.String) {\r\n value = formatDateToYYYYMMDD(value);\r\n }\r\n return value;\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n <input nz-input [value]=\"displayValue\" [disabled]=\"true\" class=\"modeView\" />\r\n} @else {\r\n <nz-date-picker\r\n [id]=\"fieldSignal().key\"\r\n [class]=\"'w-100'\"\r\n [nzDisabled]=\"isDisabled\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder!\"\r\n [nzFormat]=\"fieldSignal().format\"\r\n [nzDisabledDate]=\"disabledDate()\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"handleChangeDate($event)\"\r\n >\r\n </nz-date-picker>\r\n}\r\n","import { Component, computed, effect, forwardRef, untracked } from '@angular/core';\r\nimport { FORM_MODULES } from '../../../../consts/common';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { DateRangeField } from '../../../../models/fields/date/date-range-field.model';\r\nimport { DateRangeOutputValueType } from '../../../../models/common/output-value-type.model';\r\nimport { DateRangeOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { formatDateToYYYYMMDD, normalizeToDate } from '../../../../utils/date';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { differenceInCalendarDays } from 'date-fns';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nconst ZORRO_MODULES = [NzDatePickerModule, NzInputModule];\r\n\r\n@Component({\r\n selector: 'app-date-range',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './date-range.component.html',\r\n styleUrls: ['./date-range.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateRangeComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DateRangeComponent extends BaseValueAccessor<string | string[] | Date[]> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof DateRangeField) ||\r\n (base.type !== FieldTypeEnum.DateRange && base.controlType !== ControlTypeEnum.Date)\r\n ) {\r\n throw new Error('Expected DatePickerField');\r\n }\r\n return base;\r\n });\r\n\r\n displayValueNoInfo = '';\r\n\r\n // Kiểm tra có cho phép chọn ngày quá khứ hay ngày tương lai hay không?\r\n disabledDate = computed(() => {\r\n const field = this.fieldSignal();\r\n return (current: Date): boolean => {\r\n const today = new Date();\r\n const diff = differenceInCalendarDays(current, today);\r\n\r\n // if (field.onlyToday) return diff !== 0;\r\n if (!field.allowPastDates && diff < 0) return true;\r\n if (!field.allowFutureDates && diff > 0) return true;\r\n\r\n return false;\r\n };\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n getSelectedDateRangeFromFieldValue(fieldValue: string[] | Date[]): Date[] {\r\n let dateRange: Date[] = [];\r\n if (fieldValue?.length === 2) {\r\n const startDate = normalizeToDate(fieldValue[0]);\r\n const endDate = normalizeToDate(fieldValue[1]);\r\n if (startDate && endDate) dateRange = [startDate, endDate];\r\n }\r\n return dateRange;\r\n }\r\n\r\n handleChangeDateRange(dateRange: Date[]): void {\r\n this.propagateValue(dateRange);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: Date[]): void {\r\n if (this.isView()) {\r\n if (value.length === 0) {\r\n this.displayValueNoInfo = NO_INFO_TEXT;\r\n return;\r\n }\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n const { outputAs } = untracked(() => this.fieldSignal());\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n value.length > 0 ? this.getValueByOutputAs(value, outputAs) : null,\r\n );\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: Date[]): void {\r\n const { outputAs } = untracked(() => this.fieldSignal());\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n value.length > 0 ? this.getValueByOutputAs(value, outputAs) : null,\r\n );\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(\r\n dateRange: Date[],\r\n outputAs: DateRangeOutputValueType,\r\n ): string | string[] | Date[] {\r\n let value: string | string[] | Date[] = dateRange;\r\n\r\n if (dateRange.length > 0) {\r\n if (outputAs === DateRangeOutputValueTypeEnum.String) {\r\n value = `${formatDateToYYYYMMDD(dateRange[0])},${formatDateToYYYYMMDD(dateRange[1])}`;\r\n }\r\n\r\n if (outputAs === DateRangeOutputValueTypeEnum.StringArray) {\r\n value = [formatDateToYYYYMMDD(dateRange[0]), formatDateToYYYYMMDD(dateRange[1])];\r\n }\r\n }\r\n return value;\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n @if (value!.length > 0) {\r\n <nz-range-picker\r\n [class]=\"'w-100'\"\r\n [nzFormat]=\"fieldSignal().format\"\r\n [nzDisabled]=\"true\"\r\n [(ngModel)]=\"value\"\r\n class=\"modeView\"\r\n [nzSuffixIcon]=\"suffixIcon\"\r\n ></nz-range-picker>\r\n <ng-template #suffixIcon>\r\n <!-- Để trống, hoặc custom icon khác -->\r\n </ng-template>\r\n } @else {\r\n <input nz-input [value]=\"displayValueNoInfo\" [disabled]=\"true\" class=\"modeView\" />\r\n }\r\n} @else {\r\n <nz-range-picker\r\n [id]=\"fieldSignal().key\"\r\n class=\"w-100\"\r\n [nzDisabled]=\"isDisabled\"\r\n [nzFormat]=\"fieldSignal().format\"\r\n [nzDisabledDate]=\"disabledDate()\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder ?? ['Ngày bắt đầu', 'Ngày kết thúc']\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"handleChangeDateRange($event)\"\r\n ></nz-range-picker>\r\n}\r\n","import { Component, computed, effect, forwardRef } from '@angular/core';\r\nimport { InputPasswordField } from '../../../../models/fields/input';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { createPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\n\r\nconst ZORRO_MODULES = [NzInputModule, NzIconModule];\r\n\r\n@Component({\r\n selector: 'app-input-password',\r\n standalone: true,\r\n imports: [...ZORRO_MODULES],\r\n templateUrl: './input-password.component.html',\r\n styleUrls: ['./input-password.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputPasswordComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputPasswordComponent extends BaseValueAccessor<string> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof InputPasswordField) ||\r\n (base.type !== FieldTypeEnum.InputPassword && base.controlType !== ControlTypeEnum.Input)\r\n ) {\r\n throw new Error('Expected InputPasswordField');\r\n }\r\n return base;\r\n });\r\n\r\n passwordVisible = false;\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAdd()) {\r\n const field = this.fieldSignal();\r\n const { placeholder } = field;\r\n\r\n if (!placeholder) field.placeholder = createPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n handleChangeInputPassword(event: Event): void {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(inputValue);\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n}\r\n","<nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input\r\n nz-input\r\n [value]=\"value\"\r\n [type]=\"passwordVisible ? 'text' : 'password'\"\r\n autocomplete=\"new-password\"\r\n [placeholder]=\"fieldSignal().placeholder!\"\r\n (input)=\"handleChangeInputPassword($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n</nz-input-group>\r\n<ng-template #suffixTemplate>\r\n <span\r\n nz-icon\r\n [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"\r\n ></span>\r\n</ng-template>\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SuffixService {\r\n private suffixClick$ = new Subject<{ key: string; formId: string }>();\r\n\r\n suffixClick = this.suffixClick$.asObservable(); // expose ra ngoài.\r\n\r\n onSuffixClick(key: string, formId: string) {\r\n this.suffixClick$.next({ key, formId });\r\n }\r\n constructor() {}\r\n}\r\n","import { Component, inject, Input } from '@angular/core';\r\nimport { Suffix } from '../../../../models/common/common.model';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { SuffixService } from '../../../../services/suffix.service';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\nconst ZORRO_MODULES = [NzButtonModule, NzIconModule];\r\n\r\n@Component({\r\n selector: 'app-suffix',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './suffix.component.html',\r\n styleUrl: './suffix.component.scss',\r\n})\r\nexport class SuffixComponent {\r\n @Input() suffixConfig!: Suffix;\r\n @Input() formId = '';\r\n\r\n protected defaultText = '';\r\n\r\n private suffixService = inject(SuffixService);\r\n\r\n ngOnInit(): void {\r\n this.defaultText = `Suffix ${this.suffixConfig.key}`;\r\n }\r\n\r\n handleSuffix(): void {\r\n this.suffixService.onSuffixClick(this.suffixConfig.key, this.formId);\r\n }\r\n}\r\n","<button\r\n nz-button\r\n nzType=\"primary\"\r\n nzSize=\"small\"\r\n [title]=\"suffixConfig.description\"\r\n class=\"h-100 suffix-btn font-size-12\"\r\n [ngClass]=\"suffixConfig.class ?? ''\"\r\n (click)=\"handleSuffix()\"\r\n>\r\n @if (suffixConfig.icon) {\r\n <span class=\"icon\">\r\n <!-- Nếu là icon Zorro -->\r\n @if (suffixConfig.icon.type === 'zorro') {\r\n <span\r\n nz-icon\r\n [nzType]=\"suffixConfig.icon.value\"\r\n nzTheme=\"outline\"\r\n [ngClass]=\"suffixConfig.icon.class ?? ''\"\r\n >\r\n </span>\r\n }\r\n\r\n <!-- Nếu là Boxicons -->\r\n @if (suffixConfig.icon.type === 'mdi') {\r\n <span [class]=\"'mdi ' + suffixConfig.icon.value\" [ngClass]=\"suffixConfig.icon.class ?? ''\">\r\n </span>\r\n }\r\n </span>\r\n }\r\n\r\n @if (suffixConfig.label) {\r\n <span class=\"label\">\r\n {{ suffixConfig.label }}\r\n </span>\r\n }\r\n\r\n @if (!suffixConfig.icon && !suffixConfig.label) {\r\n <span class=\"label\">\r\n {{ defaultText }}\r\n </span>\r\n }\r\n</button>\r\n","import { Component, computed, effect, forwardRef, inject, untracked } from '@angular/core';\r\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { InputTextField } from '../../../../models/fields/input';\r\nimport { createPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { CommonModule, CurrencyPipe } from '@angular/common';\r\nimport { NgxCurrencyDirective } from 'ngx-currency';\r\n\r\nconst ZORRO_MODULES = [\r\n NzInputModule,\r\n NgxCurrencyDirective,\r\n CurrencyPipe,\r\n CommonModule,\r\n FormsModule,\r\n];\r\nconst COMPONENTS = [SuffixComponent];\r\n@Component({\r\n selector: 'app-input-text',\r\n standalone: true,\r\n imports: [...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './input-text.component.html',\r\n styleUrls: ['./input-text.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputTextComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputTextComponent extends BaseValueAccessor<string> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof InputTextField) ||\r\n (base.type !== FieldTypeEnum.InputText && base.controlType !== ControlTypeEnum.Input)\r\n ) {\r\n throw new Error('Expected InputTextField');\r\n }\r\n return base;\r\n });\r\n\r\n inputDisplayValue = '';\r\n displayNoValueText = NO_INFO_TEXT;\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder } = field;\r\n if (!placeholder) field.placeholder = createPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n handleChangeInputText(event: Event): void {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(inputValue);\r\n // Gán data vào đầu ra của form.\r\n this.fieldService.onFieldChange(this.fieldKey(), inputValue);\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n\r\n handleChangeFormValue(value: number): void {\r\n const inputValue = value?.toString();\r\n this.propagateValue(inputValue);\r\n this.fieldService.onFieldChange(this.fieldKey(), inputValue);\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n\r\n protected override writeValueToView(value: string): void {\r\n if (this.isView()) {\r\n this.inputDisplayValue = this.fieldSignal().modelValue || NO_INFO_TEXT;\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n}\r\n","<div class=\"flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n @if (fieldSignal().isCurrency) {\r\n <input\r\n nz-input\r\n [(ngModel)]=\"inputDisplayValue\"\r\n class=\"modeView\"\r\n [currencyMask]=\"{\r\n prefix: '',\r\n suffix: ' VND',\r\n thousands: ',',\r\n decimal: '.',\r\n precision: 2,\r\n align: 'left',\r\n }\"\r\n />\r\n } @else {\r\n <input nz-input [value]=\"inputDisplayValue\" class=\"modeView\" />\r\n }\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n @if (fieldSignal().isCurrency) {\r\n <span class=\"modeView\">\r\n {{ inputDisplayValue | currency: 'VND' : 'symbol' : '1.0-0' : 'vi-VN' }}\r\n </span>\r\n } @else {\r\n <span class=\"modeView\">{{ inputDisplayValue }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (fieldSignal().isCurrency) {\r\n <input\r\n nz-input\r\n class=\"input-control\"\r\n [currencyMask]=\"{\r\n prefix: '',\r\n suffix: ' VND',\r\n thousands: ',',\r\n decimal: '.',\r\n precision: 2,\r\n align: 'left',\r\n }\"\r\n [(ngModel)]=\"value\"\r\n [placeholder]=\"fieldSignal().placeholder!\"\r\n [disabled]=\"isDisabled\"\r\n (ngModelChange)=\"handleChangeFormValue($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n } @else {\r\n <input\r\n nz-input\r\n class=\"input-control\"\r\n [value]=\"value\"\r\n [placeholder]=\"fieldSignal().placeholder!\"\r\n [disabled]=\"isDisabled\"\r\n (input)=\"handleChangeInputText($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n }\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef, signal, untracked } from '@angular/core';\r\nimport { CORE_MODULES, FORM_MODULES } from '../../../../consts/common';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { MultiSelectField } from '../../../../models/fields/select/multi-select-field.model';\r\nimport { createSelectPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { ApiResponse } from '../../../../models/common/api-response.model';\r\nimport { DependTypeEnum, SelectOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { finalize } from 'rxjs';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\n\r\nconst ZORRO_MODULES = [NzSelectModule, NzInputModule, NzSpinModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\n@Component({\r\n selector: 'app-multi-select',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './multi-select.component.html',\r\n styleUrls: ['./multi-select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiSelectComponent extends BaseValueAccessor<\r\n string[] | number[] | Record<string, unknown>[]\r\n> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiSelectField) ||\r\n (base.type !== FieldTypeEnum.MultiSelect && base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error('Expected MultiSelectField');\r\n }\r\n return base;\r\n });\r\n\r\n displayNoValueText = NO_INFO_TEXT;\r\n displayOptionsValue: string[] = [];\r\n\r\n loading = signal(false);\r\n\r\n options: Record<string, unknown>[] = [];\r\n queryParams: Record<string, unknown> = {};\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder, dependsOn } = field;\r\n\r\n // Nếu field không phụ thuộc vào field khác mặc định phải gọi\r\n if (dependsOn?.length === 0) this.getOptions();\r\n if (!placeholder) field.placeholder = createSelectPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n // Xử lý luồng ban đầu cho việc getOptions, cũng như getOptions phụ thuộc vào dependsOn.\r\n effect(() => {\r\n const { canProceed, queryParams } = this.resolveDependencyState();\r\n\r\n if (!canProceed) {\r\n this.disableAndResetControl();\r\n return;\r\n }\r\n\r\n this.queryParams = { ...this.queryParams, ...queryParams };\r\n this.getOptions();\r\n this.enableControl();\r\n });\r\n }\r\n\r\n // Xử lý tạo queryParams và có cho phép gọi getOptions hay không.\r\n private resolveDependencyState(): {\r\n canProceed: boolean;\r\n queryParams: Record<string, unknown>;\r\n } {\r\n //1. Không gọi API lấy options nếu ở view mode.\r\n if (untracked(() => this.isView())) {\r\n return {\r\n canProceed: false,\r\n queryParams: {},\r\n };\r\n }\r\n\r\n const field = untracked(() => this.fieldSignal());\r\n const { dependsOn, dependType } = field;\r\n\r\n // Không phụ thuộc vào giá trị từ field khác, tức mảng dependsOn rỗng -> luôn cho phép gọi list.\r\n const requiredCount = dependsOn?.length ?? 0;\r\n if (requiredCount === 0) {\r\n return {\r\n canProceed: true,\r\n queryParams: {},\r\n };\r\n }\r\n\r\n // 3. Tạo mảng object dependValues theo paramKey và value. Ví dụ [{paramKey: 'provinceCode', value: '36'}]\r\n const dependValuesMap = this.fieldService.getDependValuesMap();\r\n const dependValues = dependsOn.map(depend => {\r\n const getter = dependValuesMap.get(depend.fieldKey);\r\n const value = typeof getter === 'function' ? getter() : getter;\r\n return { paramKey: depend.paramKey, value };\r\n });\r\n\r\n // 4. Đếm số paramKey giá trị đã có (không phải falsy).\r\n const availableCount = dependValues.filter(v => v.value).length;\r\n\r\n // 5. Check xem có thể tiếp tục đến gọi list không.\r\n // ===== Nếu dependType là 'all' thì canProceed true chỉ khi availableCount = với requiredCount.\r\n // ===== Ngược lại dependType là 'any' chỉ cần availableCount > 0.\r\n const canProceed =\r\n dependType === DependTypeEnum.All ? availableCount === requiredCount : availableCount > 0;\r\n\r\n return {\r\n canProceed,\r\n queryParams: Object.fromEntries(dependValues.map(v => [v.paramKey, v.value])),\r\n };\r\n }\r\n\r\n private createFullApiUrl(field: MultiSelectField): string {\r\n let fullApiUrl = field?.apiConfig?.baseUrl || '';\r\n const params = field?.apiConfig?.params || {};\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n return fullApiUrl;\r\n }\r\n\r\n // Lấy danh sách options từ GET api.\r\n private getOptions(): void {\r\n const field = this.fieldSignal();\r\n const fullApiUrl = this.createFullApiUrl(field);\r\n\r\n if (!fullApiUrl) {\r\n this.options = field?.options ?? [];\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.disableControl();\r\n this.fieldService\r\n .getAllOptions(fullApiUrl, this.queryParams)\r\n .pipe(\r\n finalize(() => {\r\n this.loading.set(false);\r\n this.enableControl();\r\n }),\r\n this.takeUntilDestroy(),\r\n )\r\n .subscribe({\r\n next: (res: ApiResponse<Record<string, unknown>[]>) => {\r\n if (res?.code === 0) {\r\n this.options = res?.data;\r\n }\r\n },\r\n error: (error: Error) => {},\r\n });\r\n }\r\n\r\n handleChangeOptions(optionValue: string[]): void {\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string[]): void {\r\n if (this.isView()) {\r\n const modelValue = this.fieldSignal().modelValue;\r\n if (modelValue) this.displayOptionsValue = this.getDisplayValue(modelValue);\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string[]): void {\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(\r\n singleValueArr: string[] | number[],\r\n ): string[] | Record<string, unknown>[] {\r\n const field = this.fieldSignal();\r\n\r\n if (singleValueArr.length === 0) {\r\n return singleValueArr.map(String);\r\n }\r\n\r\n // Nếu outputAs là dạng single.\r\n let value: string[] | Record<string, unknown>[] = singleValueArr.map(String);\r\n\r\n // Nếu outputAs là dạng object.\r\n if (field.outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = value.map(val => ({\r\n [field.bindValue]: val,\r\n }));\r\n }\r\n return value;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string[] | Record<string, unknown>[]) {\r\n const optionsValue = value!.map((val: string | number | Record<string, unknown>) => {\r\n if (typeof val === 'object') {\r\n return this.getCustomLabel(val);\r\n }\r\n return val as string;\r\n });\r\n\r\n return optionsValue;\r\n }\r\n\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.fieldSignal();\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.fieldSignal();\r\n\r\n if (typeof option[field.bindLabel] === 'function' || !option[field.bindLabel]) {\r\n let warnMessage =\r\n 'Giá trị label lấy theo bindLabel hiện đang là dạng object, array hoặc các dạng còn lại của complex data';\r\n if (!option[field.bindLabel])\r\n warnMessage = 'Không tồn tại giá trị label khi lấy theo bindLabel';\r\n //console.warn(warnMessage);\r\n\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = option[field.bindLabel] as string;\r\n\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n @if (fieldSignal().value!.length > 0) {\r\n <nz-select\r\n nzAllowClear\r\n [nzMode]=\"'multiple'\"\r\n [(ngModel)]=\"displayOptionsValue\"\r\n [nzMaxTagCount]=\"fieldSignal().maxTagCount!\"\r\n [nzMaxMultipleCount]=\"fieldSignal().maxMultipleCount!\"\r\n [nzDisabled]=\"true\"\r\n >\r\n @for (displayOption of displayOptionsValue; track $index) {\r\n <nz-option [nzValue]=\"displayOption\" [nzLabel]=\"displayOption\"> </nz-option>\r\n }\r\n </nz-select>\r\n } @else {\r\n <input nz-input [value]=\"displayNoValueText\" [disabled]=\"true\" />\r\n }\r\n }\r\n\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n @if (displayOptionsValue && displayOptionsValue.length) {\r\n <ul class=\"view-list\">\r\n @for (label of displayOptionsValue; track $index) {\r\n <li>{{ label }}</li>\r\n }\r\n </ul>\r\n } @else {\r\n <span class=\"modeView\">{{ displayNoValueText }}</span>\r\n }\r\n }\r\n } @else {\r\n <nz-select\r\n [id]=\"fieldSignal().key\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"isDisabled\"\r\n [nzMode]=\"'multiple'\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder!\"\r\n [nzMaxTagCount]=\"fieldSignal().maxTagCount!\"\r\n [nzMaxMultipleCount]=\"fieldSignal().maxMultipleCount!\"\r\n [nzSuffixIcon]=\"loading() ? loadingIcon : null\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n @for (option of options; track `${option[this.fieldSignal().bindValue]}-${$index}`) {\r\n <nz-option [nzValue]=\"transformOptionValue(option)\" [nzLabel]=\"getOptionLabel(option)\">\r\n </nz-option>\r\n }\r\n </nz-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef, Input, signal, untracked } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { SingleSelectField } from '../../../../models/fields/select/single-select-field.model';\r\nimport { createSelectPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { FORM_MODULES } from '../../../../consts/common/standalone-import.const';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { SelectOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { ApiResponse } from '../../../../models/common/api-response.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nconst ZORRO_MODULES = [NzSelectModule, NzSpinModule, NzInputModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\n@Component({\r\n selector: 'app-single-select',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './single-select.component.html',\r\n styleUrls: ['./single-select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SingleSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SingleSelectComponent extends BaseValueAccessor<string | Record<string, unknown>> {\r\n @Input() isCustomInputText!: boolean;\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof SingleSelectField) ||\r\n (base.type !== FieldTypeEnum.SingleSelect && base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error('Expected SingleSelectField');\r\n }\r\n return base;\r\n });\r\n\r\n // Giá trị dùng hiển thị ở chế độ View.\r\n displayValue: string | number = '';\r\n\r\n loadingSignal = signal(false);\r\n isDisabledSignal = signal(false);\r\n disabled = computed(() => this.loadingSignal() || this.isDisabledSignal());\r\n\r\n options: Record<string, unknown>[] = [];\r\n queryParams: Record<string, unknown> = {};\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder } = field;\r\n\r\n if (!placeholder) field.placeholder = createSelectPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (untracked(() => this.isView())) return;\r\n\r\n const { key, dependsOn, isParent, dependType } = untracked(() => this.fieldSignal());\r\n\r\n // Không dính dáng gì đến isParent và dependsOn.\r\n if (!isParent && dependsOn!.length === 0) {\r\n this.getOptions();\r\n return;\r\n }\r\n\r\n const dependValuesMap = this.fieldService.getDependValuesMap();\r\n\r\n const dependValues = dependsOn?.map(depend => {\r\n const dependFunc = dependValuesMap.get(depend.fieldKey);\r\n const value = typeof dependFunc === 'function' ? dependFunc() : dependFunc;\r\n return [depend.paramKey, value];\r\n });\r\n\r\n // console.log(`${key} dependValue`, dependValues);\r\n\r\n const params = Object.fromEntries(dependValues as any);\r\n\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n\r\n // console.log(`${key} queryParams`, this.queryParams);\r\n\r\n // Nếu tất cả các phụ thuộc có value thì mới gọi API.\r\n const allDependHasValues = dependValues?.every(([fieldKey, value]) => value);\r\n // console.log(`${key} allDependHasValues`, allDependHasValues);\r\n\r\n if (allDependHasValues) {\r\n // this.isDisabledSignal.set(false);\r\n this.control?.enable();\r\n this.getOptions();\r\n } else {\r\n // Ngược lại reset và disabled.\r\n this.control?.reset();\r\n // this.isDisabledSignal.set(true);\r\n this.control?.disable();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string | null): void {\r\n if (this.isView()) {\r\n this.displayValue = this.getDisplayValue(\r\n this.fieldSignal().modelValue as string | Record<string, unknown>,\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value ?? '');\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap SET\", untracked(() => signal!()));\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string): void {\r\n const { isParent } = this.fieldSignal();\r\n if (isParent) {\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value);\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap UI\", untracked(() => signal!()));\r\n }\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n private createFullApiUrl(): string {\r\n const field = untracked(() => this.fieldSignal());\r\n let fullApiUrl = field?.apiConfig?.baseUrl || '';\r\n const params = field?.apiConfig?.params || {};\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n return fullApiUrl;\r\n }\r\n\r\n // Lấy danh sách options từ GET api.\r\n private getOptions(): void {\r\n const field = untracked(() => this.fieldSignal());\r\n const { optionsToPrepend, optionsToAppend, exceptOptions } = field;\r\n const fullApiUrl = this.createFullApiUrl();\r\n\r\n if (!fullApiUrl) {\r\n this.options = field?.options ?? [];\r\n this.options = [...optionsToPrepend, ...this.options, ...optionsToAppend].filter(\r\n options => !exceptOptions.some(opts => opts[field.bindValue] === options[field.bindValue]),\r\n );\r\n return;\r\n }\r\n\r\n this.loadingSignal.set(true);\r\n this.control?.disable();\r\n this.fieldService\r\n .getAllOptions(fullApiUrl, this.queryParams)\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res: ApiResponse<Record<string, unknown>[]>) => {\r\n this.loadingSignal.set(false);\r\n if (!this.fieldSignal().isDisabled) this.control?.enable();\r\n\r\n if (res?.code === 0) {\r\n this.options = res?.data;\r\n this.options = [...optionsToPrepend, ...this.options, ...optionsToAppend].filter(\r\n options =>\r\n !exceptOptions.some(opts => opts[field.bindValue] === options[field.bindValue]),\r\n );\r\n\r\n // Nếu outputAs là dạng sourceObject đồng bộ sau khi load xong list.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n const newOutputValue = this.options.find(\r\n option => option[field.bindValue] === this.value,\r\n ) ?? {\r\n [field.bindValue]: this.value,\r\n };\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n }\r\n },\r\n error: (error: Error) => {\r\n this.loadingSignal.set(false);\r\n if (!this.fieldSignal().isDisabled) this.control?.enable();\r\n },\r\n });\r\n }\r\n\r\n handleChangeOptions(optionValue: string): void {\r\n const { enableFieldChange, bindValue } = untracked(() => this.fieldSignal());\r\n\r\n if (enableFieldChange) {\r\n const option = this.options.find(option => option[bindValue] === optionValue);\r\n this.fieldService.onFieldChange(this.fieldKey(), option);\r\n }\r\n\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(singleValue: string): string | Record<string, unknown> {\r\n const field = this.fieldSignal();\r\n\r\n if (singleValue) {\r\n // Nếu outputAs là dạng single.\r\n let value: string | Record<string, unknown> = singleValue;\r\n\r\n // Nếu outputAs là dạng object.\r\n if (field.outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n // Nếu outputAs là dạng sourceObject.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n value = this.options.find(option => option[field.bindValue] === singleValue) ?? {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n return value;\r\n }\r\n return singleValue;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string | Record<string, unknown>): string {\r\n if (!value) return NO_INFO_TEXT;\r\n\r\n if (typeof value === 'object') {\r\n return this.getCustomLabel(value);\r\n }\r\n return value as string;\r\n }\r\n\r\n // Lấy value ở option tag.\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.fieldSignal()!;\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n // Lấy label.\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.fieldSignal();\r\n\r\n if (typeof option[field.bindLabel] === 'function' || !option[field.bindLabel]) {\r\n let warnMessage =\r\n 'Giá trị label lấy theo bindLabel hiện đang là dạng object, array hoặc các dạng còn lại của complex data';\r\n if (!option[field.bindLabel])\r\n warnMessage = 'Không tồn tại giá trị label khi lấy theo bindLabel';\r\n // console.warn(warnMessage);\r\n\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = option[field.bindLabel] as string;\r\n\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n <input [title]=\"displayValue\" nz-input [value]=\"displayValue\" class=\"modeView\" />\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n <span [title]=\"displayValue\" class=\"modeView break-work\">{{ displayValue }}</span>\r\n }\r\n } @else {\r\n <nz-select\r\n [id]=\"fieldSignal().key\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"isDisabled\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder!\"\r\n [nzSuffixIcon]=\"loadingSignal() ? loadingIcon : null\"\r\n [title]=\"fieldSignal().tooltip || ''\"\r\n [nzDropdownMatchSelectWidth]=\"fieldSignal().matchSelectWidth\"\r\n [ngModel]=\"value\"\r\n class=\"flex-1 select-box\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n @for (option of options; track `${option[this.fieldSignal().bindValue]}-${$index}`) {\r\n <nz-option [nzValue]=\"transformOptionValue(option)\" [nzLabel]=\"getOptionLabel(option)\">\r\n </nz-option>\r\n }\r\n </nz-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef, Input, signal, untracked } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { TreeSelectField } from '../../../../models/fields/select/tree-select-field.model';\r\nimport { createSelectPlaceholder } from '../../../../utils/dynamic-form/dynamic-form';\r\nimport { FORM_MODULES } from '../../../../consts/common/standalone-import.const';\r\nimport { NO_INFO_TEXT } from '../../../../consts/common/common.const';\r\nimport { SelectOutputValueTypeEnum } from '../../../../enums/common';\r\nimport { ApiResponse } from '../../../../models/common/api-response.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzTreeSelectModule } from 'ng-zorro-antd/tree-select';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nconst ZORRO_MODULES = [NzTreeSelectModule, NzSpinModule, NzInputModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\ninterface FlatItem {\r\n code: string;\r\n name: string;\r\n [key: string]: any;\r\n}\r\n\r\ninterface TreeNode {\r\n key: any;\r\n title: string;\r\n children?: TreeNode[];\r\n selectable?: boolean;\r\n isLeaf?: boolean;\r\n [key: string]: any;\r\n}\r\n\r\n@Component({\r\n selector: 'app-tree-select',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './tree-select.component.html',\r\n styleUrls: ['./tree-select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TreeSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TreeSelectComponent extends BaseValueAccessor<string | Record<string, unknown>> {\r\n @Input() isCustomInputText!: boolean;\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof TreeSelectField) ||\r\n (base.type !== FieldTypeEnum.TreeSelect && base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error('Expected TreeSelectField');\r\n }\r\n return base;\r\n });\r\n\r\n // Giá trị dùng hiển thị ở chế độ View.\r\n displayValue: string | number = '';\r\n\r\n loadingSignal = signal(false);\r\n isDisabledSignal = signal(false);\r\n disabled = computed(() => this.loadingSignal() || this.isDisabledSignal());\r\n\r\n options: any[] = [];\r\n queryParams: Record<string, unknown> = {};\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { placeholder } = field;\r\n\r\n if (!placeholder) field.placeholder = createSelectPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (untracked(() => this.isView())) return;\r\n\r\n const { key, dependsOn, isParent, dependType } = untracked(() => this.fieldSignal());\r\n\r\n // Không dính dáng gì đến isParent và dependsOn.\r\n if (!isParent && dependsOn!.length === 0) {\r\n this.getOptions();\r\n return;\r\n }\r\n\r\n const dependValuesMap = this.fieldService.getDependValuesMap();\r\n\r\n const dependValues = dependsOn?.map(depend => {\r\n const dependFunc = dependValuesMap.get(depend.fieldKey);\r\n const value = typeof dependFunc === 'function' ? dependFunc() : dependFunc;\r\n return [depend.paramKey, value];\r\n });\r\n\r\n // console.log(`${key} dependValue`, dependValues);\r\n\r\n const params = Object.fromEntries(dependValues as any);\r\n\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n\r\n // console.log(`${key} queryParams`, this.queryParams);\r\n\r\n // Nếu tất cả các phụ thuộc có value thì mới gọi API.\r\n const allDependHasValues = dependValues?.every(([fieldKey, value]) => value);\r\n // console.log(`${key} allDependHasValues`, allDependHasValues);\r\n\r\n if (allDependHasValues) {\r\n // this.isDisabledSignal.set(false);\r\n this.control?.enable();\r\n this.getOptions();\r\n } else {\r\n // Ngược lại reset và disabled.\r\n this.control?.reset();\r\n // this.isDisabledSignal.set(true);\r\n this.control?.disable();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string | null): void {\r\n if (this.isView()) {\r\n this.displayValue = this.getDisplayValue(\r\n this.fieldSignal().modelValue as string | Record<string, unknown>,\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value ?? '');\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap SET\", untracked(() => signal!()));\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string): void {\r\n const { isParent } = this.fieldSignal();\r\n if (isParent) {\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value);\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap UI\", untracked(() => signal!()));\r\n }\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n private createFullApiUrl(): string {\r\n const field = untracked(() => this.fieldSignal());\r\n let fullApiUrl = field?.apiConfig?.baseUrl || '';\r\n const params = field?.apiConfig?.params || {};\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n return fullApiUrl;\r\n }\r\n\r\n private buildTree(items: FlatItem[], groupBy?: string): any[] {\r\n if (!groupBy) return items;\r\n const map = new Map<string, TreeNode>();\r\n const roots: TreeNode[] = [];\r\n\r\n // Step 1: Transform & store in map\r\n for (const item of items) {\r\n map.set(item.code, {\r\n key: this.transformOptionValue(item),\r\n title: this.getOptionLabel(item),\r\n parentCode: item[groupBy],\r\n isLeaf: true,\r\n });\r\n }\r\n\r\n // Step 2: Build parent-child relation\r\n for (const node of map.values()) {\r\n if (node['parentCode']) {\r\n const parent = map.get(node['parentCode']);\r\n if (parent) {\r\n if (!parent.children) parent.children = [];\r\n parent.children.push(node);\r\n parent.isLeaf = false;\r\n } else {\r\n roots.push(node);\r\n }\r\n } else {\r\n roots.push(node);\r\n }\r\n }\r\n\r\n return roots;\r\n }\r\n\r\n // Lấy danh sách options từ GET api.\r\n private getOptions(): void {\r\n const field = untracked(() => this.fieldSignal());\r\n const { optionsToPrepend, optionsToAppend, exceptOptions } = field;\r\n const fullApiUrl = this.createFullApiUrl();\r\n\r\n if (!fullApiUrl) {\r\n const options = [...optionsToPrepend, ...field.options, ...optionsToAppend].filter(\r\n options => !exceptOptions.some(opts => opts[field.bindValue] === options[field.bindValue]),\r\n ) as any;\r\n this.options = this.buildTree(options, field.groupBy);\r\n return;\r\n }\r\n\r\n this.loadingSignal.set(true);\r\n this.control?.disable();\r\n this.fieldService\r\n .getAllOptions(fullApiUrl, this.queryParams)\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res: ApiResponse<Record<string, unknown>[]>) => {\r\n this.loadingSignal.set(false);\r\n if (!this.fieldSignal().isDisabled) this.control?.enable();\r\n\r\n if (res?.code === 0) {\r\n const options = [...optionsToPrepend, ...(res?.data ?? []), ...optionsToAppend].filter(\r\n options =>\r\n !exceptOptions.some(opts => opts[field.bindValue] === options[field.bindValue]),\r\n ) as any;\r\n this.options = this.buildTree(options, field.groupBy);\r\n\r\n // Nếu outputAs là dạng sourceObject đồng bộ sau khi load xong list.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n const newOutputValue = this.options.find(option => option.key === this.value) ?? {\r\n [field.bindValue]: this.value,\r\n };\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n }\r\n },\r\n error: (error: Error) => {\r\n this.loadingSignal.set(false);\r\n if (!this.fieldSignal().isDisabled) this.control?.enable();\r\n },\r\n });\r\n }\r\n\r\n handleChangeOptions(optionValue: string): void {\r\n const { enableFieldChange, bindValue } = untracked(() => this.fieldSignal());\r\n\r\n if (enableFieldChange) {\r\n const option = this.options.find(option => option[bindValue] === optionValue);\r\n this.fieldService.onFieldChange(this.fieldKey(), option);\r\n }\r\n\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(singleValue: string): string | Record<string, unknown> {\r\n const field = this.fieldSignal();\r\n\r\n if (singleValue) {\r\n // Nếu outputAs là dạng single.\r\n let value: string | Record<string, unknown> = singleValue;\r\n\r\n // Nếu outputAs là dạng object.\r\n if (field.outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n // Nếu outputAs là dạng sourceObject.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n value = this.options.find(option => option[field.bindValue] === singleValue) ?? {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n return value;\r\n }\r\n return singleValue;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string | Record<string, unknown>): string {\r\n if (!value) return NO_INFO_TEXT;\r\n\r\n if (typeof value === 'object') {\r\n return this.getCustomLabel(value);\r\n }\r\n return value as string;\r\n }\r\n\r\n // Lấy value ở option tag.\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.fieldSignal()!;\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n // Lấy label.\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.fieldSignal();\r\n\r\n if (typeof option[field.bindLabel] === 'function' || !option[field.bindLabel]) {\r\n let warnMessage =\r\n 'Giá trị label lấy theo bindLabel hiện đang là dạng object, array hoặc các dạng còn lại của complex data';\r\n if (!option[field.bindLabel])\r\n warnMessage = 'Không tồn tại giá trị label khi lấy theo bindLabel';\r\n // console.warn(warnMessage);\r\n\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = option[field.bindLabel] as string;\r\n\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n <input nz-input [value]=\"displayValue\" class=\"modeView\" />\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n <span class=\"modeView break-work\">{{ displayValue }}</span>\r\n }\r\n } @else {\r\n <nz-tree-select\r\n [nzId]=\"fieldSignal().key\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"isDisabled\"\r\n [nzPlaceHolder]=\"fieldSignal().placeholder!\"\r\n [title]=\"fieldSignal().tooltip || ''\"\r\n [nzDropdownMatchSelectWidth]=\"fieldSignal().matchSelectWidth\"\r\n [ngModel]=\"value\"\r\n [nzNodes]=\"options\"\r\n class=\"flex-1 select-box\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n </nz-tree-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseValueAccessor } from '../../../base/base-value-accessor';\r\nimport { TextareaField } from '../../../models/fields/textarea/textarea-field.model';\r\nimport { createPlaceholder } from '../../../utils/dynamic-form/dynamic-form';\r\nimport { NO_INFO_TEXT } from '../../../consts/common/common.const';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\n\r\nconst ZORRO_MODULES = [NzInputModule];\r\n\r\n@Component({\r\n selector: 'app-textarea',\r\n standalone: true,\r\n imports: [...ZORRO_MODULES],\r\n templateUrl: './textarea.component.html',\r\n styleUrls: ['./textarea.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextareaComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TextareaComponent extends BaseValueAccessor<string> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (!(base instanceof TextareaField) || base.type !== FieldTypeEnum.Textarea) {\r\n throw new Error('Expected TextareaField');\r\n }\r\n return base;\r\n });\r\n\r\n textareaDisplayValue = '';\r\n displayNoValueText = NO_INFO_TEXT;\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = this.fieldSignal();\r\n const { placeholder } = field;\r\n if (!placeholder) field.placeholder = createPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n handleChangeTextarea(event: Event): void {\r\n const textareaValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(textareaValue);\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n textareaValue && textareaValue.replace(/\\n+/g, 'br_enter').replace(/br_enter+/g, '\\n'),\r\n );\r\n }\r\n\r\n protected override writeValueToView(value: string): void {\r\n if (this.isView()) {\r\n this.textareaDisplayValue = this.fieldSignal().modelValue || NO_INFO_TEXT;\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n @if (textareaDisplayValue) {\r\n <p [innerHTML]=\"textareaDisplayValue\" class=\"disabled-textarea break-work mb0\"></p>\r\n } @else {\r\n <input nz-input [value]=\"displayNoValueText\" class=\"modeView\" />\r\n }\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n @if (textareaDisplayValue) {\r\n <p [innerHTML]=\"textareaDisplayValue\" class=\"mode-view mb-0 break-work mb0\"></p>\r\n } @else {\r\n <span class=\"modeView\">{{ displayNoValueText }}</span>\r\n }\r\n }\r\n} @else {\r\n <textarea\r\n nz-input\r\n [id]=\"fieldSignal().key\"\r\n [nzAutosize]=\"{ minRows: 1, maxRows: 6 }\"\r\n [value]=\"value\"\r\n [disabled]=\"isDisabled\"\r\n [placeholder]=\"fieldSignal().placeholder!\"\r\n (input)=\"handleChangeTextarea($event)\"\r\n >\r\n </textarea>\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { ApiResponse } from '../models/common/api-response.model';\r\nimport { ObjectStorage } from '../models/common/object-storage.model';\r\nimport { Subject } from 'rxjs';\r\nimport { FormConfigService } from './form-config.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FileService {\r\n private httpClient = inject(HttpClient);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n private fileClick$ = new Subject<ObjectStorage>();\r\n\r\n fileClick = this.fileClick$.asObservable(); // expose ra ngoài.\r\n\r\n onFileClick(objStorage: ObjectStorage) {\r\n this.fileClick$.next(objStorage);\r\n }\r\n\r\n // Upload file đến server và trả về 1 ObjectStorage.\r\n uploadFile(\r\n file: File,\r\n formData: FormData,\r\n options?: {\r\n uploadUrl?: string;\r\n directoryId?: string;\r\n },\r\n ) {\r\n if (!options) options = {};\r\n if (!options.uploadUrl) {\r\n options.uploadUrl = this.formConfigService['config'].systemApiUrl + 'ObjectStorage/public/upload'; // fallback\r\n }\r\n return this.httpClient.post<any>(options.uploadUrl, formData);\r\n }\r\n\r\n // Xóa ObjectStorage.\r\n deleteObjStorage(\r\n id: string,\r\n options?: {\r\n deleteUrl?: string;\r\n directoryId?: string;\r\n },\r\n ) {\r\n if (!options) options = {};\r\n if (!options.deleteUrl) {\r\n options.deleteUrl = this.formConfigService['config'].systemApiUrl + 'ObjectStorage/public/delete'; // fallback\r\n }\r\n return this.httpClient.delete<ApiResponse<unknown>>(`${options.deleteUrl}/${id}`);\r\n }\r\n}\r\n","import { Component, computed, effect, forwardRef, inject, Input, signal } from '@angular/core';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { NzUploadFile, NzUploadModule, NzUploadXHRArgs } from 'ng-zorro-antd/upload';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { AvatarUploadField } from '../../../../models/fields/upload/avatar-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { ObjectStorage } from '../../../../models/common';\r\nimport { MyUploadFile } from '../../../../models/common/common.model';\r\nimport { FileService } from '../../../../services/file.service';\r\nimport { isValidJSON } from '../../../../utils/common';\r\nimport { Observable, of, Subscription } from 'rxjs';\r\nimport { formatFileSize } from '../../../../utils/file';\r\nimport { FileSizeTypeEnum } from '../../../../enums/common';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FormConfigService } from '../../../../services/form-config.service';\r\nimport { NzNotificationService } from 'ng-zorro-antd/notification';\r\n\r\nconst ZORRO_MODULES = [NzUploadModule];\r\n\r\n@Component({\r\n selector: 'app-avatar-upload',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './avatar-upload.component.html',\r\n styleUrl: './avatar-upload.component.scss',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AvatarUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class AvatarUploadComponent extends BaseValueAccessor<string | File> {\r\n @Input() size: number = 100; // kích thước avatar\r\n\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof AvatarUploadField) ||\r\n (base.type !== FieldTypeEnum.AvatarUpload && base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error('Expected AvatarUploadField');\r\n }\r\n return base;\r\n });\r\n\r\n avatarUrl: string | null = null;\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n private fileService = inject(FileService);\r\n private formConfigService = inject(FormConfigService);\r\n private nzNotification = inject(NzNotificationService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorage, myFile, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.avatarUrl = '';\r\n\r\n if (isValidJSON(value)) {\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n this.avatarUrl = this.formConfigService.getViewFileUrl(objStorageList[0].name ?? '', false);\r\n }\r\n }\r\n\r\n beforeUpload = (file: NzUploadFile, fileList: NzUploadFile[]): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxSizeInMB, acceptedMimeTypes } = this.fieldSignal();\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n const { uploadTemp } = this.fieldSignal();\r\n const newFileName = this.formConfigService.generateRandomFileName(file.name, 'avatar');\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const formData = new FormData();\r\n formData.append('File', renamedFile);\r\n // formData.append('isTemp', 'true');\r\n if (uploadTemp) formData.append('isTemp', 'true');\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, { uploadUrl: this.fieldSignal().apiFileConfig.uploadUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([data]);\r\n\r\n this.avatarUrl = this.formConfigService.getViewFileUrl(data.name ?? '', true);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error('Lỗi trong quá trình tải lên ảnh đại diện!!');\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n this.objStorageList.set([]);\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n }\r\n\r\n handlePreview(): void {}\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, { deleteUrl: this.fieldSignal().apiFileConfig.deleteUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([]);\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error('Lỗi trong quá trình xóa tập tin khỏi máy chủ!!');\r\n // Tạm do api xóa có vấn đề\r\n this.objStorageList.set([]);\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n },\r\n });\r\n }\r\n}\r\n","<nz-upload\r\n [nzDisabled]=\"isDisabled\"\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n [nzDisabled]=\"!!isView()\"\r\n>\r\n <ng-container *ngTemplateOutlet=\"renderAvatarTpl\"></ng-container>\r\n</nz-upload>\r\n\r\n<!-- Template custom hiển thị avatar -->\r\n<ng-template #renderAvatarTpl>\r\n <div class=\"avatar-wrapper\" [ngStyle]=\"{ width: size + 'px', height: size + 'px' }\">\r\n @if (!avatarUrl && isAddOrEdit()) {\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\" class=\"upload-icon\"></span>\r\n }\r\n\r\n @if (avatarUrl) {\r\n <img [src]=\"avatarUrl\" alt=\"\" class=\"avatar-img\" />\r\n }\r\n </div>\r\n</ng-template>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n inject,\r\n signal,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport { CORE_MODULES } from \"../../../../consts/common\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport {\r\n NzUploadFile,\r\n NzUploadModule,\r\n NzUploadXHRArgs,\r\n} from \"ng-zorro-antd/upload\";\r\nimport { MultiFileUploadField } from \"../../../../models/fields/upload/multi-file-upload-field.model\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { isValidJSON } from \"../../../../utils/common\";\r\nimport { MyUploadFile } from \"../../../../models/common/common.model\";\r\nimport { ObjectStorage } from \"../../../../models/common\";\r\nimport { FileService } from \"../../../../services/file.service\";\r\nimport { Observable, of, Subscription } from \"rxjs\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { ToastrService } from \"ngx-toastr\";\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { formatFileSize, getExtensions } from \"../../../../utils/file\";\r\nimport { FileSizeTypeEnum } from \"../../../../enums/common\";\r\nimport { FormConfigService } from \"../../../../services/form-config.service\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzButtonModule } from \"ng-zorro-antd/button\";\r\nimport { NzMessageService } from \"ng-zorro-antd/message\";\r\nimport { NzNotificationService } from \"ng-zorro-antd/notification\";\r\n\r\nconst ZORRO_MODULES = [NzUploadModule, NzIconModule, NzButtonModule];\r\n\r\n@Component({\r\n selector: \"app-multi-file-upload\",\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: \"./multi-file-upload.component.html\",\r\n styleUrl: \"./multi-file-upload.component.scss\",\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiFileUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiFileUploadComponent extends BaseValueAccessor<\r\n string | File | NzUploadFile\r\n> {\r\n // Cast lại đúng instance là MultiFileUploadFile.\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiFileUploadField) ||\r\n (base.type !== FieldTypeEnum.MultiFileUpload &&\r\n base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error(\"Expected MultiFileUploadField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các images.\r\n allFiles = signal<MyUploadFile[]>([]);\r\n\r\n // Text hướng dẫn các loại extension được upload.\r\n fileExtensionGuide = signal(\"\");\r\n\r\n // Đếm số file đã pass beforeUpload nhưng chưa upload xong (đang trong hàng chờ customRequest/uploadFile).\r\n // Dùng để tính toán count chính xác khi user chọn nhiều file cùng lúc.\r\n pendingCount = signal<number>(0);\r\n\r\n // Buffer chứa các file đang chờ xử lý trong một batch (một lần chọn file từ dialog).\r\n private _batchBuffer: Array<{\r\n file: NzUploadFile;\r\n resolve: (pass: boolean) => void;\r\n }> = [];\r\n\r\n // Timer dùng để phát hiện kết thúc một batch (setTimeout(0)).\r\n private _batchTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n private fileService = inject(FileService);\r\n private toast = inject(ToastrService);\r\n private translate = inject(TranslateService);\r\n private nzMessage = inject(NzMessageService);\r\n private nzNotification = inject(NzNotificationService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { acceptedMimeTypes } = field;\r\n\r\n this.fileExtensionGuide.set(\r\n `Hỗ trợ các định dạng ${getExtensions(acceptedMimeTypes).join(\", \")}`,\r\n );\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this._clearBatch(); // Hủy batch đang xử lý trước khi reset.\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorageList, allFiles, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n // Khởi tạo danh sách ObjectStorage từ data json.\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n // File từ server luôn ở trạng thái success.\r\n const myUploadFiles = objStorageList.map(\r\n (objStorage) =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: this.formConfigService.getViewFileUrl(\r\n objStorage.name ?? \"\",\r\n false,\r\n ),\r\n uploadStatus: \"success\",\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n }\r\n }\r\n\r\n /**\r\n * Xử lý trước khi upload — trả về Observable<boolean> để hỗ trợ batch detection.\r\n *\r\n * Cơ chế batch detection:\r\n * nz-upload gọi beforeUpload() từng file một (đồng bộ) trong cùng 1 JS tick khi user\r\n * chọn nhiều file. Mỗi lần gọi, file được đẩy vào _batchBuffer. Sau khi tất cả các\r\n * lần gọi đồng bộ kết thúc, setTimeout(0) kích hoạt _processBatch() để xử lý toàn bộ\r\n * batch một lần, cho phép kiểm tra tổng số lượng chính xác trước khi upload.\r\n */\r\n beforeUpload = (file: NzUploadFile): Observable<boolean> => {\r\n return new Observable<boolean>((subscriber) => {\r\n // Đẩy file vào buffer với hàm resolve tương ứng.\r\n this._batchBuffer.push({\r\n file,\r\n resolve: (pass: boolean) => {\r\n subscriber.next(pass);\r\n subscriber.complete();\r\n },\r\n });\r\n\r\n // Reset timer mỗi lần có file mới vào buffer.\r\n // Khi tất cả beforeUpload synchronous calls kết thúc, timer sẽ fire và gọi _processBatch().\r\n if (this._batchTimer !== null) clearTimeout(this._batchTimer);\r\n this._batchTimer = setTimeout(() => this._processBatch(), 0);\r\n });\r\n };\r\n\r\n /**\r\n * Xử lý toàn bộ batch file sau khi tất cả beforeUpload calls trong cùng 1 tick đã hoàn tất.\r\n *\r\n * Logic:\r\n * 1. Nếu tổng (file hiện tại + pending + batch) vượt maxFileCount → reject TOÀN BỘ batch.\r\n * 2. Validate từng file trong batch:\r\n * - File thỏa (MIME + size) → pendingCount++, resolve(true) → cho phép upload.\r\n * - File không thỏa → hiển thị NzMessage lỗi, resolve(false) → bỏ qua.\r\n */\r\n private _processBatch(): void {\r\n const batch = [...this._batchBuffer];\r\n this._batchBuffer = [];\r\n this._batchTimer = null;\r\n\r\n const { maxFileCount, maxSizeInMB, acceptedMimeTypes } = this.fieldSignal();\r\n\r\n // Số file hiện tại: đã upload xong + đang trong hàng chờ upload.\r\n const currentCount = this.allFiles().length + this.pendingCount();\r\n\r\n // ── CHECK 1: Tổng batch vượt maxFileCount → reject TOÀN BỘ batch ──\r\n if (currentCount + batch.length > maxFileCount) {\r\n // this.toast.warning(\r\n // this.translate.instant(\r\n // `Không thể tải lên: số lượng file chọn (${batch.length}) vượt quá giới hạn cho phép. Tối đa ${maxFileCount} tập tin.`,\r\n // ),\r\n // );\r\n this.nzNotification.warning(\r\n \"Cảnh báo\",\r\n `Không thể tải lên: số lượng file tải lên vượt quá giới hạn cho phép. Tối đa ${maxFileCount} tập tin.`,\r\n { nzDuration: 4500 },\r\n );\r\n batch.forEach(({ resolve }) => resolve(false));\r\n return;\r\n }\r\n\r\n // ── CHECK 2: Validate từng file — upload file thỏa, báo lỗi file không thỏa ──\r\n for (const { file, resolve } of batch) {\r\n const originFile = file as unknown as File;\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type ?? \"\";\r\n\r\n const isSizeOk = fileSizeInMB <= maxSizeInMB;\r\n const isMimeOk = acceptedMimeTypes.includes(fileType);\r\n\r\n if (!isSizeOk || !isMimeOk) {\r\n // Xây dựng thông báo lỗi chi tiết cho từng file không thỏa.\r\n const reasons: string[] = [];\r\n if (!isMimeOk) reasons.push(`định dạng không hợp lệ`);\r\n if (!isSizeOk) reasons.push(`kích thước vượt ${maxSizeInMB}MB`);\r\n\r\n this.nzMessage.error(\r\n `\"${file.name}\" không được tải lên: ${reasons.join(\", \")}.`,\r\n );\r\n\r\n // Propagate để CVA/validator hiển thị trạng thái lỗi trên control.\r\n this.propagateValue(originFile);\r\n resolve(false);\r\n continue;\r\n }\r\n\r\n // File hợp lệ: thêm optimistic entry vào allFiles với trạng thái loading ngay lập tức.\r\n // Dùng file.uid (do nz-upload tự tạo, duy nhất cho mỗi NzUploadFile) làm key để track và update sau này.\r\n const uid = file.uid;\r\n this.allFiles.update((curr) => [\r\n ...curr,\r\n {\r\n uid,\r\n objStorage: { id: uid, name: originFile.name }, // placeholder, sẽ được thay bằng data thật sau khi upload\r\n isTemp: true,\r\n previewUrl: \"\",\r\n uploadStatus: \"loading\",\r\n } as MyUploadFile,\r\n ]);\r\n\r\n // Propagate để trigger validator, tăng pendingCount, cho phép upload.\r\n this.propagateValue(originFile);\r\n this.pendingCount.update((c) => c + 1);\r\n resolve(true);\r\n }\r\n }\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const uid = item.file.uid; // Stable key để map với optimistic entry trong allFiles.\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây và xóa optimistic entry khỏi list.\r\n if (this.control?.invalid) {\r\n this.pendingCount.update((c) => Math.max(0, c - 1));\r\n this.allFiles.update((curr) => curr.filter((f) => f.uid !== uid));\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile, uid);\r\n };\r\n\r\n private uploadFile(file: File, uid: string) {\r\n const { apiFileConfig, uploadTemp } = this.fieldSignal();\r\n const newFileName = this.formConfigService.generateRandomFileName(\r\n file.name,\r\n \"file\",\r\n );\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {})\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append(\"File\", renamedFile);\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append(\"isTemp\", \"true\");\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, { uploadUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res) => {\r\n // Giảm pending dù thành công hay thất bại.\r\n this.pendingCount.update((c) => Math.max(0, c - 1));\r\n\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n // Cập nhật objStorageList với data thật từ server.\r\n this.objStorageList.update((curr) => [...curr, data]);\r\n\r\n // Thay thế optimistic entry (uid) bằng data thật, chuyển sang trạng thái success.\r\n this.allFiles.update((curr) =>\r\n curr.map((f) =>\r\n f.uid === uid\r\n ? ({\r\n ...f,\r\n objStorage: data,\r\n previewUrl: this.formConfigService.getViewFileUrl(\r\n data.name ?? \"\",\r\n true,\r\n ),\r\n uploadStatus: \"success\",\r\n } as MyUploadFile)\r\n : f,\r\n ),\r\n );\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Đồng bộ control value → validators (required) nhận biết có file thành công.\r\n this._syncControlValue();\r\n } else {\r\n // Cập nhật optimistic entry sang trạng thái error.\r\n this.allFiles.update((curr) =>\r\n curr.map((f) =>\r\n f.uid === uid\r\n ? ({ ...f, uploadStatus: \"error\" } as MyUploadFile)\r\n : f,\r\n ),\r\n );\r\n console.error(message);\r\n // Đồng bộ control value → nếu tất cả file đều fail, objStorageList rỗng → required kích hoạt.\r\n this._syncControlValue();\r\n }\r\n },\r\n error: () => {\r\n // Giảm pending khi upload thất bại.\r\n this.pendingCount.update((c) => Math.max(0, c - 1));\r\n // Cập nhật optimistic entry sang trạng thái error.\r\n this.allFiles.update((curr) =>\r\n curr.map((f) =>\r\n f.uid === uid\r\n ? ({ ...f, uploadStatus: \"error\" } as MyUploadFile)\r\n : f,\r\n ),\r\n );\r\n console.error(\"Lỗi trong quá trình tải tập đến máy chủ!!\");\r\n // Đồng bộ control value → nếu tất cả file đều fail → required kích hoạt.\r\n this._syncControlValue();\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage, uploadStatus } = file;\r\n const { uploadTemp } = this.fieldSignal();\r\n\r\n // Loại bỏ và cập nhật danh sách ObjectStorage.\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== objStorage?.id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(\r\n (item) => item.objStorage?.id !== objStorage?.id,\r\n );\r\n this.allFiles.set(newAllFiles);\r\n\r\n // File ở trạng thái error: upload chưa thành công, không cần gọi API xoá trên server.\r\n if (uploadStatus === \"error\") {\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Đồng bộ control value → nếu xóa hết file error còn lại → required kích hoạt.\r\n this._syncControlValue();\r\n return;\r\n }\r\n\r\n if (uploadTemp) {\r\n this.deleteObjStorage(objStorage.id || \"\");\r\n return;\r\n }\r\n\r\n // Cập nhật đầu ra cho form.\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Đồng bộ control value → nếu xóa hết file → required kích hoạt.\r\n this._syncControlValue();\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, {\r\n deleteUrl: this.fieldSignal().apiFileConfig.deleteUrl,\r\n })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res) => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Đồng bộ control value sau khi server xác nhận xóa.\r\n this._syncControlValue();\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error(\"Lỗi trong quá trình xóa tập tin khỏi máy chủ!!\");\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Đồng bộ control value (fake delete thành công).\r\n this._syncControlValue();\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý click vào file item:\r\n * - Không làm gì nếu file đang loading hoặc ở trạng thái error.\r\n * - Gọi fileClick để xem file nếu đã upload thành công.\r\n */\r\n onFileItemClick(file: MyUploadFile): void {\r\n if (file.uploadStatus === \"loading\" || file.uploadStatus === \"error\")\r\n return;\r\n this.fileService.onFileClick(file.objStorage);\r\n }\r\n\r\n fileClick(objStorage: ObjectStorage): void {\r\n this.fileService.onFileClick(objStorage);\r\n }\r\n\r\n /**\r\n * Hủy toàn bộ batch đang chờ xử lý:\r\n * - Clear timer batch detection.\r\n * - Reject tất cả file trong buffer (resolve false).\r\n * - Reset pendingCount về 0.\r\n * Gọi khi form bị reset từ bên ngoài.\r\n */\r\n private _clearBatch(): void {\r\n if (this._batchTimer !== null) {\r\n clearTimeout(this._batchTimer);\r\n this._batchTimer = null;\r\n }\r\n this._batchBuffer.forEach(({ resolve }) => resolve(false));\r\n this._batchBuffer = [];\r\n this.pendingCount.set(0);\r\n }\r\n\r\n /**\r\n * Đồng bộ control value với trạng thái thực tế của danh sách file đã upload thành công.\r\n *\r\n * Gọi sau mỗi thay đổi về danh sách file (upload xong, xóa file) để đảm bảo:\r\n * - Không có file nào thành công → propagateValue('') → Validators.required kích hoạt.\r\n * - Có ít nhất 1 file thành công → propagateValue(JSON string) → validators pass.\r\n *\r\n * Validators hiện tại tương thích:\r\n * - acceptedMimeTypesValidator: bỏ qua nếu value falsy; parse JSON nếu là string.\r\n * - maxFileSizeInMBValidator: bỏ qua nếu value.size undefined (JSON string).\r\n */\r\n private _syncControlValue(): void {\r\n const list = this.objStorageList();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.propagateValue((list.length > 0 ? JSON.stringify(list) : \"\") as any);\r\n }\r\n}\r\n","@if (isAddOrEdit()) {\r\n <nz-upload\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"true\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button nz-button class=\"btn-upload\" nzType=\"primary\" nzSize=\"small\">\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n <span class=\"font-size-12\">Tải lên</span>\r\n </button>\r\n\r\n <span class=\"font-size-12\"\r\n >( Tối đa {{ fieldSignal().maxFileCount }} tập tin )</span\r\n >\r\n\r\n @if (fieldSignal().showAcceptedExtensionGuide) {\r\n <div class=\"file-extension-guide\">{{ fileExtensionGuide() }}</div>\r\n }\r\n </nz-upload>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách tập tin -->\r\n@if (allFiles().length > 0) {\r\n <ng-container *ngTemplateOutlet=\"renderFileTpl\"></ng-container>\r\n}\r\n\r\n<!-- Template custom hiển thị danh sách tập tin -->\r\n<ng-template #renderFileTpl>\r\n <ul class=\"custom-upload-list\">\r\n @for (file of allFiles(); track file.objStorage?.id) {\r\n <li\r\n class=\"upload-item\"\r\n [class.is-loading]=\"file.uploadStatus === 'loading'\"\r\n [class.is-error]=\"file.uploadStatus === 'error'\"\r\n (click)=\"onFileItemClick(file)\"\r\n >\r\n <!-- Icon trạng thái bên trái -->\r\n @switch (file.uploadStatus) {\r\n @case (\"loading\") {\r\n <span\r\n nz-icon\r\n nzType=\"loading\"\r\n nzTheme=\"outline\"\r\n class=\"status-icon loading-icon\"\r\n ></span>\r\n }\r\n @case (\"error\") {\r\n <span\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"fill\"\r\n class=\"status-icon error-icon\"\r\n ></span>\r\n }\r\n @default {\r\n <span\r\n nz-icon\r\n nzType=\"paper-clip\"\r\n nzTheme=\"outline\"\r\n class=\"paper-clip-icon\"\r\n ></span>\r\n }\r\n }\r\n\r\n <span class=\"file-name\" [title]=\"file.objStorage.name ?? ''\">{{\r\n file.objStorage.name\r\n }}</span>\r\n\r\n @if (isAddOrEdit() && file.uploadStatus !== \"loading\") {\r\n <span\r\n nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n title=\"Xóa\"\r\n class=\"delete-icon\"\r\n (click)=\"handleDelete(file); $event.stopPropagation()\"\r\n ></span>\r\n }\r\n\r\n @if (\r\n !isAddOrEdit() &&\r\n file.uploadStatus !== \"error\" &&\r\n file.uploadStatus !== \"loading\"\r\n ) {\r\n <span\r\n nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n class=\"view-icon\"\r\n title=\"Xem file\"\r\n ></span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</ng-template>\r\n","import { Component, computed, effect, forwardRef, inject, signal } from '@angular/core';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { NzUploadFile, NzUploadModule, NzUploadXHRArgs } from 'ng-zorro-antd/upload';\r\nimport { MultiImageUploadField } from '../../../../models/fields/upload/multi-image-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { isValidJSON } from '../../../../utils/common';\r\nimport { MyUploadFile } from '../../../../models/common/common.model';\r\nimport { ObjectStorage } from '../../../../models/common';\r\nimport { FileService } from '../../../../services/file.service';\r\nimport { Observable, of, Subscription } from 'rxjs';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { formatFileSize } from '../../../../utils/file';\r\nimport { FileSizeTypeEnum } from '../../../../enums/common';\r\nimport { FormConfigService } from '../../../../services/form-config.service';\r\nimport { NzImageModule } from 'ng-zorro-antd/image';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzNotificationService } from 'ng-zorro-antd/notification';\r\n\r\nconst ZORRO_MODULES = [NzUploadModule, NzIconModule, NzButtonModule, NzImageModule];\r\n\r\n@Component({\r\n selector: 'app-multi-image-upload',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './multi-image-upload.component.html',\r\n styleUrl: './multi-image-upload.component.less',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiImageUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiImageUploadComponent extends BaseValueAccessor<string | File | NzUploadFile> {\r\n // Cast lại đúng instance là MultiImageUploadField.\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiImageUploadField) ||\r\n (base.type !== FieldTypeEnum.MultiImageUpload && base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error('Expected MultiImageUploadField');\r\n }\r\n return base;\r\n });\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến hình ảnh.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các images.\r\n allFiles = signal<MyUploadFile[]>([]);\r\n\r\n private fileService = inject(FileService);\r\n private toast = inject(ToastrService);\r\n private translate = inject(TranslateService);\r\n private nzNotification = inject(NzNotificationService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorageList, allFiles, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n // Khởi tạo danh sách ObjectStorage từ data json.\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n const myUploadFiles = objStorageList.map(\r\n objStorage =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: this.formConfigService.getViewFileUrl(objStorage.name ?? '', false),\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n }\r\n }\r\n\r\n // Xử lý trước khi upload.\r\n beforeUpload = (file: NzUploadFile): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxFileCount, maxSizeInMB, acceptedMimeTypes } = this.fieldSignal();\r\n // Kiểm tra số lượng tối đa hình ảnh có thể tải lên.\r\n if (this.allFiles().length + 1 > maxFileCount) {\r\n // this.toast.warning(\r\n // this.translate.instant(`Chỉ được phép tải lên tối đa ${maxFileCount} hình ảnh`),\r\n // );\r\n this.nzNotification.warning(\r\n 'Cảnh báo',\r\n `Chỉ được phép tải lên tối đa ${maxFileCount} hình ảnh`,\r\n { nzDuration: 4500 }\r\n );\r\n return false;\r\n }\r\n\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n // Luôn trả về true vì lúc này chưa bắt kịp control là valid hay invalid.\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n const { apiFileConfig, uploadTemp } = this.fieldSignal();\r\n const newFileName = this.formConfigService.generateRandomFileName(file.name, 'file');\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {})\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append('File', renamedFile);\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append('isTemp', 'true');\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, { uploadUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.update(curr => [...curr, data]);\r\n\r\n this.allFiles.update(curr => [\r\n ...curr,\r\n {\r\n objStorage: data,\r\n isTemp: true,\r\n previewUrl: this.formConfigService.getViewFileUrl(data.name ?? '', true),\r\n } as MyUploadFile,\r\n ]);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error('Lỗi trong quá trình tải hình ảnh đến máy chủ!!');\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage } = file;\r\n\r\n // Loại bỏ và cập nhật danh sách ObjectStorage.\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== objStorage?.id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(item => item.objStorage?.id !== objStorage?.id);\r\n this.allFiles.set(newAllFiles);\r\n\r\n // Cập nhật đầu ra cho form.\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, { deleteUrl: this.fieldSignal().apiFileConfig.deleteUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error('Lỗi trong quá trình xóa tập tin khỏi máy chủ!!');\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n const newObjStorageList = this.objStorageList().filter(item => item.id !== id);\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n },\r\n });\r\n }\r\n\r\n protected handlePreview(file: MyUploadFile): void {\r\n const imgRef = document.getElementById(file.objStorage.id);\r\n if (imgRef) imgRef.click();\r\n }\r\n}\r\n","@if (isAddOrEdit()) {\r\n <div class=\"upload\">\r\n <nz-upload\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button nz-button class=\"btn-upload\">\r\n Tải lên\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n </button>\r\n\r\n <span>Tối đa {{ fieldSignal().maxFileCount }} hình ảnh.</span>\r\n </nz-upload>\r\n </div>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách hình ảnh -->\r\n@if (allFiles().length > 0) {\r\n <ng-container *ngTemplateOutlet=\"imageGroupTpl\"></ng-container>\r\n}\r\n\r\n<!-- Template custom hiển thị danh sách hình ảnh -->\r\n<ng-template #imageGroupTpl>\r\n <nz-image-group>\r\n <div class=\"image-list\">\r\n @for (file of allFiles(); track file.objStorage?.id; let i = $index) {\r\n <div\r\n class=\"image-card-container\"\r\n [ngStyle]=\"{\r\n width: fieldSignal().imageCardWidth,\r\n height: fieldSignal().imageCardHeight,\r\n }\"\r\n >\r\n <div class=\"image-item\">\r\n <div class=\"image-item-info\">\r\n <img\r\n [id]=\"file.objStorage.id\"\r\n nz-image\r\n nzSrc=\"{{ file.previewUrl }}\"\r\n alt=\"{{ file.objStorage.originalName }}\"\r\n />\r\n </div>\r\n\r\n <div class=\"image-item-actions\">\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"handlePreview(file)\">\r\n <nz-icon nzType=\"eye\" nzTheme=\"outline\" />\r\n </button>\r\n\r\n @if (isAddOrEdit()) {\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"handleDelete(file)\">\r\n <nz-icon nzType=\"delete\" nzTheme=\"outline\" />\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </nz-image-group>\r\n</ng-template>\r\n","import { Component, computed, effect, forwardRef, inject, signal, untracked } from '@angular/core';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { BaseValueAccessor } from '../../../../base/base-value-accessor';\r\nimport { SingleFileUploadField } from '../../../../models/fields/upload/single-file-upload-field.model';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NzUploadFile, NzUploadModule, NzUploadXHRArgs } from 'ng-zorro-antd/upload';\r\nimport { finalize, Observable, of, Subscription } from 'rxjs';\r\nimport { FileService } from '../../../../services/file.service';\r\nimport { ObjectStorage } from '../../../../models/common/object-storage.model';\r\nimport { FieldTypeEnum } from '../../../../enums/fields';\r\nimport { MyUploadFile } from '../../../../models/common/common.model';\r\nimport { formatFileSize, getExtensions } from '../../../../utils/file';\r\nimport { isValidJSON } from '../../../../utils/common';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { ControlTypeEnum } from '../../../../enums/controls';\r\nimport { FileSizeTypeEnum } from '../../../../enums/common';\r\nimport { FormUtils } from '../../../../services/form-utils';\r\nimport { FormConfigService } from '../../../../services/form-config.service';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { SuffixComponent } from '../../components/suffix/suffix.component';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\n\r\nimport { NzNotificationService } from 'ng-zorro-antd/notification';\r\n\r\nconst ZORRO_MODULES = [NzUploadModule, NzIconModule, NzInputModule, NzButtonModule, NzSpinModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\n@Component({\r\n selector: 'app-single-file-upload',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './single-file-upload.component.html',\r\n styleUrls: ['./single-file-upload.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SingleFileUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SingleFileUploadComponent extends BaseValueAccessor<string | File | NzUploadFile> {\r\n readonly fieldSignal = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof SingleFileUploadField) ||\r\n (base.type !== FieldTypeEnum.SingleFileUpload && base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error('Expected SingleFileUploadField');\r\n }\r\n return base;\r\n });\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các files.\r\n allFiles = signal<MyUploadFile[]>([]);\r\n\r\n // Text hướng dẫn các loại extension được upload.\r\n fileExtensionGuide = signal('');\r\n\r\n inputDisplayValue = '';\r\n readonly uploading = signal(false);\r\n\r\n private fileService = inject(FileService);\r\n private toast = inject(ToastrService);\r\n private translate = inject(TranslateService);\r\n private nzNotification = inject(NzNotificationService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.fieldSignal());\r\n const { acceptedMimeTypes } = field;\r\n\r\n this.fileExtensionGuide.set(\r\n `Hỗ trợ định dạng ${getExtensions(acceptedMimeTypes).join(', ')}`,\r\n );\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const allFiles = this.allFiles();\r\n this.inputDisplayValue = allFiles[0]\r\n ? (allFiles[0].objStorage.nameAlias ?? allFiles[0].objStorage.name) || 'Không có thông tin'\r\n : 'Không có thông tin';\r\n });\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorage, myFile, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n const myUploadFiles = objStorageList.map(\r\n objStorage =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: `${this.formConfigService.getStorageUrl()}${objStorage.bucket}/${objStorage.path}`,\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n } else {\r\n if (value) {\r\n this.allFiles.set([\r\n { isTemp: false, objStorage: { id: '', name: value }, previewUrl: '' } as MyUploadFile,\r\n ]);\r\n }\r\n }\r\n }\r\n\r\n beforeUpload = (file: NzUploadFile, fileList: NzUploadFile[]): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxSizeInMB, acceptedMimeTypes } = this.fieldSignal();\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n this.uploading.set(true);\r\n const { apiFileConfig, uploadTemp } = this.fieldSignal();\r\n const newFileName = FormUtils.randomFileName(file.name);\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {\r\n fileName: newFileName,\r\n })\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append('File', file, newFileName);\r\n if (apiFileConfig.uploadByPath && apiFileConfig.uploadPath) {\r\n fd.append('path', apiFileConfig.uploadPath);\r\n }\r\n\r\n if (apiFileConfig.isOriginName) {\r\n fd.append('nameAlias', file.name);\r\n }\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append('isTemp', 'true');\r\n\r\n return this.fileService\r\n .uploadFile(file, formData, { uploadUrl })\r\n .pipe(\r\n this.takeUntilDestroy(),\r\n finalize(() => this.uploading.set(false)),\r\n )\r\n .subscribe({\r\n next: res => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([data]);\r\n\r\n this.allFiles.set([\r\n {\r\n objStorage: data,\r\n isTemp: true,\r\n previewUrl: uploadTemp\r\n ? this.formConfigService.getViewFileUrl(data.name ?? '', true)\r\n : `${this.formConfigService.getStorageUrl()}${data.bucket}/${data.path}`,\r\n } as MyUploadFile,\r\n ]);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error('Lỗi trong quá trình tải tập tin đến máy chủ!!');\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage } = file;\r\n const { uploadTemp } = this.fieldSignal();\r\n\r\n this.objStorageList.set([]);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(item => item.objStorage?.id !== objStorage?.id);\r\n this.allFiles.set(newAllFiles);\r\n\r\n if (!uploadTemp) {\r\n this.deleteObjStorage(objStorage.id || '');\r\n return;\r\n }\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n\r\n return;\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, { deleteUrl: this.fieldSignal().apiFileConfig.deleteUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: res => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([]);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error('Lỗi trong quá trình xóa tập tin khỏi máy chủ!!');\r\n // Tạm do api xóa có vấn đề\r\n this.objStorageList.set([]);\r\n\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (fieldSignal().viewMode === viewModeEnum.form) {\r\n <input nz-input [value]=\"inputDisplayValue\" class=\"modeView\" />\r\n }\r\n @if (fieldSignal().viewMode === viewModeEnum.text) {\r\n <span class=\"modeView\">{{ inputDisplayValue }}</span>\r\n }\r\n }\r\n @if (isAddOrEdit()) {\r\n <nz-spin [nzSpinning]=\"uploading()\" nzTip=\"Đang tải lên\" class=\"width-100\">\r\n <div class=\"d-flex\">\r\n <nz-input-group\r\n [nzSuffix]=\"allFiles().length > 0 && isAddOrEdit() ? deleteIcon : undefined\"\r\n class=\"flex-1\"\r\n >\r\n <input nz-input [value]=\"inputDisplayValue\" class=\"no-events\" />\r\n </nz-input-group>\r\n <nz-upload\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button nz-button class=\"btn-upload height-100 text-white\">\r\n <span class=\"font-size-12\">Tải lên</span>\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n </button>\r\n </nz-upload>\r\n </div>\r\n </nz-spin>\r\n }\r\n\r\n @if (fieldSignal().suffixes.length > 0) {\r\n @for (suffix of fieldSignal().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n@if (fieldSignal().showAcceptedExtensionGuide && fileExtensionGuide()) {\r\n <div class=\"file-extension-guide\">{{ fileExtensionGuide() }}</div>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách tập tin -->\r\n@if (allFiles().length > 0) {\r\n <!-- <ng-container *ngTemplateOutlet=\"renderFileTpl\"></ng-container> -->\r\n}\r\n\r\n<!-- Template custom hiển thị danh sách tập tin -->\r\n<ng-template #renderFileTpl>\r\n <ul class=\"custom-upload-list\">\r\n @for (file of allFiles() | slice: 0 : 1; track file.objStorage?.id) {\r\n <li class=\"upload-item\">\r\n <span nz-icon nzType=\"paper-clip\" nzTheme=\"outline\" class=\"paper-clip-icon\"></span>\r\n\r\n <span class=\"filename\">{{ file.objStorage.name }}</span>\r\n\r\n @if (isAddOrEdit()) {\r\n <span\r\n nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n title=\"Xóa\"\r\n class=\"delete-icon\"\r\n (click)=\"handleDelete(file)\"\r\n ></span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #deleteIcon>\r\n <span\r\n title=\"Xóa\"\r\n class=\"mdi mdi-delete cursor-pointer text-error\"\r\n (click)=\"handleDelete(allFiles()[0])\"\r\n ></span>\r\n</ng-template>\r\n","import { DatePickerComponent } from \"./fields/date/date-picker/date-picker.component\";\r\nimport { DateRangeComponent } from \"./fields/date/date-range/date-range.component\";\r\nimport { InputPasswordComponent } from \"./fields/input/input-password/input-password.component\";\r\nimport { InputTextComponent } from \"./fields/input/input-text/input-text.component\";\r\nimport { MultiSelectComponent } from \"./fields/select/multi-select/multi-select.component\";\r\nimport { SingleSelectComponent } from \"./fields/select/single-select/single-select.component\";\r\nimport { TreeSelectComponent } from \"./fields/select/tree-select/tree-select.component\";\r\nimport { TextareaComponent } from \"./fields/textarea/textarea.component\";\r\nimport { AvatarUploadComponent } from \"./fields/upload/avatar-upload/avatar-upload.component\";\r\nimport { MultiFileUploadComponent } from \"./fields/upload/multi-file-upload/multi-file-upload.component\";\r\nimport { MultiImageUploadComponent } from \"./fields/upload/multi-image-upload/multi-image-upload.component\";\r\nimport { SingleFileUploadComponent } from \"./fields/upload/single-file-upload/single-file-upload.component\";\r\n\r\n// Các field component đại diện cho giao diện của từng control.\r\nexport const FIELD_COMPONENTS = [\r\n InputTextComponent,\r\n InputPasswordComponent,\r\n\r\n SingleSelectComponent,\r\n MultiSelectComponent,\r\n TreeSelectComponent,\r\n\r\n TextareaComponent,\r\n\r\n DatePickerComponent,\r\n DateRangeComponent,\r\n\r\n SingleFileUploadComponent,\r\n MultiFileUploadComponent,\r\n MultiImageUploadComponent,\r\n AvatarUploadComponent,\r\n];\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { BaseField } from '../models/fields/field.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ValidationService {\r\n constructor() {}\r\n\r\n getFirstError(control: AbstractControl, field: BaseField<any>, fields: BaseField<any>[]): string {\r\n // if (field.key === 'reminder') console.log(\"control?.errors\", field.key, control?.errors);\r\n if (!control?.errors || !field) return '';\r\n\r\n const errorKey = Object.keys(control.errors)?.[0] || '';\r\n const errorValue = control.errors?.[errorKey];\r\n\r\n return this.getErrorMessage(errorKey, errorValue, field, fields);\r\n }\r\n\r\n private getErrorMessage(\r\n errorKey: string,\r\n errorValue: any,\r\n field: BaseField<any>,\r\n allFields: BaseField<any>[],\r\n ): string {\r\n let finalErrorMessage = '';\r\n\r\n const customMessage = field.errorMessages?.[errorKey];\r\n if (customMessage) return customMessage;\r\n\r\n // 2. Nếu field có hàm getErrorMessage riêng.\r\n const defaultErrorMessage = field.getErrorMessage(errorKey, errorValue, allFields);\r\n if (defaultErrorMessage) return defaultErrorMessage;\r\n\r\n return `Chưa cấu hình message lỗi cho trường ${field.key}`;\r\n }\r\n}\r\n","import { Component, inject, input } from \"@angular/core\";\r\nimport { BaseField } from \"../../models/fields/field.model\";\r\nimport { AbstractControl, FormGroup } from \"@angular/forms\";\r\nimport { FormMode } from \"../../models/form\";\r\nimport { FORM_MODULES } from \"../../consts/common\";\r\nimport { FIELD_COMPONENTS } from \"../component\";\r\nimport { NzFormModule } from \"ng-zorro-antd/form\";\r\nimport { FieldTypeEnum } from \"../../enums/fields\";\r\nimport { FormModeEnum } from \"../../enums/form\";\r\nimport { ValidationService } from \"../../services/validation.service\";\r\nimport { NzGridModule } from \"ng-zorro-antd/grid\";\r\n\r\nconst ZORRO_MODULES = [NzFormModule, NzGridModule];\r\nconst COMPONENTS = [...FIELD_COMPONENTS];\r\n\r\n@Component({\r\n selector: \"app-dynamic-field\",\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: \"./dynamic-field.component.html\",\r\n styleUrls: [\"./dynamic-field.component.scss\"],\r\n})\r\nexport class DynamicFieldComponent {\r\n readonly field = input.required<BaseField<any>>();\r\n readonly fields = input.required<BaseField<any>[]>();\r\n readonly mode = input.required<FormMode>();\r\n readonly control = input.required<AbstractControl>();\r\n readonly formGroup = input.required<FormGroup>();\r\n readonly formId = input.required<string>();\r\n\r\n fieldTypeEnum = FieldTypeEnum;\r\n formModeEnum = FormModeEnum;\r\n\r\n private validationService = inject(ValidationService);\r\n\r\n /**\r\n * Lấy thông báo lỗi đầu tiên của trường đang thao tác dựa trên control và field.\r\n */\r\n protected getErrorMessage(): string {\r\n return (\r\n this.validationService.getFirstError(\r\n this.control(),\r\n this.field(),\r\n this.fields(),\r\n ) ?? \"\"\r\n );\r\n }\r\n}\r\n","<div [formGroup]=\"formGroup()\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzXXl]=\"field().labelGrid.xxl ?? null\"\r\n [nzXl]=\"field().labelGrid.xl ?? null\"\r\n [nzLg]=\"field().labelGrid.lg ?? null\"\r\n [nzMd]=\"field().labelGrid.md ?? null\"\r\n [nzSm]=\"field().labelGrid.sm ?? null\"\r\n [nzXs]=\"field().labelGrid.xs ?? null\"\r\n [nzLabelAlign]=\"field().labelAlign\"\r\n >\r\n @if (field().required) {\r\n <span class=\"required\">*</span>\r\n }\r\n <span class=\"form-label\">\r\n {{ field().label }}\r\n @if (field().sublabel) {\r\n <span class=\"sub-label mb-sm\">{{ field().sublabel }}</span>\r\n }\r\n </span>\r\n </nz-form-label>\r\n\r\n <nz-form-control\r\n [nzXXl]=\"field().controlGrid.xxl ?? null\"\r\n [nzXl]=\"field().controlGrid.xl ?? null\"\r\n [nzLg]=\"field().controlGrid.lg ?? null\"\r\n [nzMd]=\"field().controlGrid.md ?? null\"\r\n [nzSm]=\"field().controlGrid.sm ?? null\"\r\n [nzXs]=\"field().controlGrid.xs ?? null\"\r\n [nzErrorTip]=\"getErrorMessage()\"\r\n >\r\n @switch (field().type) {\r\n <!-- Input text -->\r\n @case (fieldTypeEnum.InputText) {\r\n <app-input-text\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-input-text>\r\n }\r\n\r\n <!-- Input password -->\r\n @case (fieldTypeEnum.InputPassword) {\r\n @if (mode() === formModeEnum.Add) {\r\n <app-input-password\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-input-password>\r\n }\r\n }\r\n\r\n <!-- Textarea -->\r\n @case (fieldTypeEnum.Textarea) {\r\n <app-textarea\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-textarea>\r\n }\r\n\r\n <!-- Single select -->\r\n @case (fieldTypeEnum.SingleSelect) {\r\n <app-single-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-single-select>\r\n }\r\n\r\n <!-- Multi select -->\r\n @case (fieldTypeEnum.MultiSelect) {\r\n <app-multi-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-select>\r\n }\r\n\r\n @case (fieldTypeEnum.TreeSelect) {\r\n <app-tree-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-tree-select>\r\n }\r\n\r\n <!-- Date Picker -->\r\n @case (fieldTypeEnum.DatePicker) {\r\n <app-date-picker\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-date-picker>\r\n }\r\n\r\n <!-- Date Range -->\r\n @case (fieldTypeEnum.DateRange) {\r\n <app-date-range\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-date-range>\r\n }\r\n\r\n <!-- Single File Upload -->\r\n @case (fieldTypeEnum.SingleFileUpload) {\r\n <app-single-file-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-single-file-upload>\r\n }\r\n\r\n <!-- Multi File Upload -->\r\n @case (fieldTypeEnum.MultiFileUpload) {\r\n <app-multi-file-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-file-upload>\r\n }\r\n\r\n <!-- Multi File Upload -->\r\n @case (fieldTypeEnum.MultiImageUpload) {\r\n <app-multi-image-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-image-upload>\r\n }\r\n\r\n <!-- Avatar -->\r\n @case (fieldTypeEnum.AvatarUpload) {\r\n <app-avatar-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-avatar-upload>\r\n }\r\n\r\n <!-- Radio -->\r\n @case (fieldTypeEnum.Radio) {\r\n <span>Radio</span>\r\n }\r\n\r\n <!-- Checkbox -->\r\n @case (fieldTypeEnum.Checkbox) {\r\n <span>Checkbox</span>\r\n }\r\n\r\n <!-- Radio -->\r\n @case (fieldTypeEnum.Radio) {\r\n <span>Radio</span>\r\n }\r\n\r\n <!-- Switch -->\r\n @case (fieldTypeEnum.Switch) {\r\n <span>Switch</span>\r\n }\r\n\r\n <!-- Autocomplete -->\r\n @case (fieldTypeEnum.Autocomplete) {\r\n <span>Autocomplete</span>\r\n }\r\n }\r\n </nz-form-control>\r\n </nz-form-item>\r\n</div>\r\n","import { BaseField } from './shared/models/fields/field.model';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n EventEmitter,\r\n inject,\r\n input,\r\n Input,\r\n output,\r\n Output,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { buildForm } from './shared/utils/dynamic-form/dynamic-form';\r\nimport { FieldTypeEnum } from './shared/enums/fields';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { FormModeEnum } from './shared/enums/form';\r\nimport { FormMode } from './shared/models/form';\r\nimport { DynamicFormService } from './shared/services/dynamic-form.service';\r\n\r\nimport { FORM_MODULES } from './shared/consts/common';\r\nimport { InputPasswordField } from './shared/models/fields/input';\r\nimport { isEqual } from 'lodash-es';\r\nimport { FieldGroup, GroupedFields } from './shared/models/fields/field-group.model';\r\nimport { buildGroupedFields } from './shared/utils/fields';\r\nimport { DynamicFieldComponent } from './shared/components/dynamic-field/dynamic-field.component';\r\nimport { debounceTime, distinctUntilChanged, Subject, takeUntil } from 'rxjs';\r\n\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzCollapseModule } from 'ng-zorro-antd/collapse';\r\nimport { FormDataService } from './shared/services/form-data.service';\r\n\r\nconst ZORRO_MODULES = [NzFormModule, NzGridModule, NzCollapseModule];\r\nconst COMPONENTS = [DynamicFieldComponent];\r\n\r\n@Component({\r\n selector: 'app-dynamic-forms',\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: './dynamic-form.component.html',\r\n styleUrls: ['./dynamic-form.component.scss'],\r\n})\r\nexport class DynamicFormComponent {\r\n // Id phân biệt form.\r\n @Input() formId!: string;\r\n\r\n // ===================== NGOÀI LUỒNG LOGIC ======================== //\r\n // Debounce time for form value changes (ms)\r\n // Default: 300ms\r\n // Thời gian trễ cho sự thay đổi giá trị của form (ms)\r\n @Input() valueChangesDebounceTime = 300;\r\n\r\n // Emit form value changes\r\n @Output() readonly formValueChanges = new EventEmitter<Record<string, unknown>>();\r\n\r\n // Subject for cleanup subscriptions\r\n private readonly destroy$ = new Subject<void>();\r\n // ====================================================== //\r\n\r\n // Input.\r\n // Mảng fields mới.\r\n readonly fields = input.required<BaseField<any>[]>();\r\n // Signal model data.\r\n readonly model = input<Record<string, any>>({});\r\n // Signal form mode.\r\n readonly mode = input<FormMode>(FormModeEnum.Add);\r\n // Input signal groupFields.\r\n readonly fieldGroups = input<FieldGroup[]>([]);\r\n\r\n // Cho phép show nhưng field không thuộc group nào\r\n readonly displayNonGroupedFields = input(true);\r\n\r\n // Output.\r\n readonly formSubmit = output<Record<string, unknown>>();\r\n readonly formInvalid = output<BaseField<any>[]>();\r\n\r\n // Mảng field cũ.\r\n protected readonly oldFields = signal<BaseField<any>[]>([]);\r\n\r\n // Check mode là add hay edit.\r\n readonly isAddOrEdit = computed(() =>\r\n [FormModeEnum.Add, FormModeEnum.Edit].includes(this.mode() as FormModeEnum),\r\n );\r\n\r\n // FormState check sự thay đổi giữa mode, newFields, model chỉ chạy 1 lần dù 3 cái đều đổi.\r\n readonly formState = computed(() => ({\r\n mode: this.mode(),\r\n newFields: this.fields(),\r\n model: this.model(),\r\n }));\r\n\r\n // Computed chạy lại khi fields hoặc groupFields thay đổi.\r\n groupedFields = computed<GroupedFields>(() => {\r\n const groups = this.fieldGroups();\r\n const groupedFields = buildGroupedFields(this.oldFields(), groups);\r\n return groupedFields;\r\n });\r\n\r\n protected readonly formModeEnum = FormModeEnum;\r\n protected readonly fieldTypeEnum = FieldTypeEnum;\r\n\r\n // Kiểm tra có cần ẩn field không?\r\n isHiddenField = (field: BaseField<any>): boolean => {\r\n const { isHidden } = field;\r\n if (isHidden) return true;\r\n if (field instanceof InputPasswordField) {\r\n if (this.mode() === FormModeEnum.Edit || this.mode() === FormModeEnum.View) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n // Form group cho reactive form.\r\n formGroup!: FormGroup;\r\n\r\n readonly formDataService = inject(FormDataService);\r\n constructor(private dFormService: DynamicFormService) {\r\n // Trigger form từ submit bên ngoài.\r\n effect(() => {\r\n this.dFormService.submitTrigger();\r\n if (untracked(() => this.isAddOrEdit())) {\r\n const submit = this.dFormService.submitTrigger();\r\n\r\n if (submit?.formId === this.formId) {\r\n this.handleSubmit();\r\n this.dFormService.triggerSubmit(null);\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup subscriptions\r\n // Dọn dẹp các subscription\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n // Loại bỏ output data khi dynamic form destroy component.\r\n this.formDataService.clear(this.formId);\r\n }\r\n\r\n // Đồng bộ fields sang dynamic-form service mỗi lần fields signal change.\r\n syncFieldsEffect = effect(() => {\r\n this.dFormService.setFields(this.fields());\r\n this.formDataService.clear(this.formId);\r\n });\r\n\r\n /**\r\n * Effect tạo FormGroup.\r\n */\r\n createFormGroupEffect = effect(() => {\r\n const { mode, newFields, model } = this.formState();\r\n const oldFields = untracked(() => this.oldFields());\r\n\r\n if (!this.formGroup || !isEqual(newFields, oldFields)) {\r\n this.oldFields.set(newFields);\r\n this.formGroup = buildForm(newFields, mode, model);\r\n this.dFormService.setFormGroup(this.formGroup);\r\n // Subscribe to form value changes\r\n // Lắng nghe sự thay đổi giá trị của form\r\n this.subscribeToFormValueChanges();\r\n // console.log('formGroup create from new fields', this.formGroup);\r\n return;\r\n }\r\n\r\n // patch value nếu không phải fields mới.\r\n for (const field of oldFields) {\r\n // Loại bỏ nếu quyết định ẩn field đi.\r\n if (field.isHidden) continue;\r\n\r\n // Nếu là dạng InputPasswordField nhưng ở mode edit và view thì không được dùng.\r\n if (\r\n field instanceof InputPasswordField &&\r\n (mode === FormModeEnum.Edit || mode === FormModeEnum.View)\r\n )\r\n continue;\r\n\r\n const fieldKey = field?.key;\r\n const control = this.formGroup.get(fieldKey);\r\n\r\n if (field.allowSetValue) {\r\n field.value = field.getDefaultValue();\r\n field.modelValue = null;\r\n if (model?.[fieldKey]) {\r\n field.value = field.toFormValue(model[fieldKey]);\r\n field.modelValue = model[fieldKey];\r\n }\r\n\r\n field.initialValue = field.value;\r\n }\r\n control?.reset(field.value);\r\n }\r\n // console.log('formGroup create from old fields', this.formGroup);\r\n });\r\n\r\n /**\r\n * Subscribe to form value changes\r\n * Subscribe lắng nghe sự thay đổi giá trị của form\r\n */\r\n private subscribeToFormValueChanges(): void {\r\n if (!this.formGroup) return;\r\n\r\n // Unsubscribe previous subscription if exists\r\n this.destroy$.next();\r\n\r\n this.formGroup.valueChanges\r\n .pipe(\r\n debounceTime(this.valueChangesDebounceTime),\r\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(formValue => {\r\n // console.log('Form value changed:', formValue);\r\n this.formValueChanges.emit(formValue);\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý submit form và output ra ngoài.\r\n */\r\n private handleSubmit() {\r\n const form = this.formGroup;\r\n const invalidFields: Array<BaseField<any>> = [];\r\n\r\n // Xử lý trường hợp form chưa thỏa mãn validation.\r\n if (form.invalid) {\r\n const controls = form.controls;\r\n for (const name in controls) {\r\n if (controls[name].invalid) {\r\n this.markControlForValidation(controls[name]);\r\n const field = this.fields().find(field => field.key === name);\r\n if (field) invalidFields.push(field);\r\n }\r\n }\r\n this.formInvalid.emit(invalidFields);\r\n return;\r\n }\r\n\r\n const formData = untracked(() => this.formDataService.get(this.formId));\r\n this.formSubmit.emit(formData ?? {});\r\n }\r\n\r\n /**\r\n * Kích submit form ảo khi nhấn nút submit.\r\n */\r\n private markControlForValidation(control: AbstractControl) {\r\n control.markAllAsTouched();\r\n control.markAsDirty();\r\n control.updateValueAndValidity({ onlySelf: true, emitEvent: true });\r\n }\r\n\r\n /**\r\n * TrackBy function for ngFor to optimize rendering.\r\n */\r\n protected trackByField(index: number, field: BaseField<any>): string {\r\n return field.key || `field-${index}`;\r\n }\r\n\r\n readonly collapseCustomStyle = {\r\n background: '#fff',\r\n border: '0px',\r\n };\r\n}\r\n","@if (formGroup) {\r\n <form [formGroup]=\"formGroup\">\r\n @if (oldFields().length > 0) {\r\n <!-- 1. Nếu không có groups thì render từ fields -->\r\n @if (!fieldGroups() || fieldGroups().length === 0) {\r\n <div nz-row [nzGutter]=\"[12, 0]\">\r\n @for (field of oldFields(); track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n [nzFlex]=\"\r\n !field?.grid?.xs &&\r\n !field?.grid?.sm &&\r\n !field?.grid?.md &&\r\n !field?.grid?.lg &&\r\n !field?.grid?.xl &&\r\n !field?.grid?.xxl\r\n ? '1 0 0'\r\n : null\r\n \"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- 2. Nếu có groups thì render từ groupedFields -->\r\n @if (fieldGroups() && fieldGroups().length > 0) {\r\n <!-- Các field noGroup -->\r\n @if (groupedFields().noGroup.length > 0 && displayNonGroupedFields()) {\r\n <div nz-row [nzGutter]=\"24\">\r\n @for (field of groupedFields().noGroup; track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Group các field -->\r\n @if (groupedFields().grouped.length > 0) {\r\n <nz-collapse [nzBordered]=\"false\">\r\n @for (groupField of groupedFields().grouped; track groupField.group.code) {\r\n <nz-collapse-panel\r\n [nzHeader]=\"groupField.group.template ?? groupField.group.label\"\r\n [nzActive]=\"groupField.group.isActive\"\r\n [nzShowArrow]=\"groupField.group.showArrow\"\r\n [nzDisabled]=\"groupField.group.disabled\"\r\n [style]=\"collapseCustomStyle\"\r\n class=\"mt-sm\"\r\n >\r\n <div nz-row [nzGutter]=\"24\">\r\n @for (field of groupField.fields; track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </nz-collapse-panel>\r\n }\r\n </nz-collapse>\r\n }\r\n }\r\n }\r\n </form>\r\n}\r\n","export enum TableCellTypeEnum {\n ACTION = 'action',\n CHECK = 'check',\n SUBTEXT = 'subtext',\n IMAGE = 'image',\n BADGE = 'badge',\n INDEX = 'index',\n TEXT = 'text',\n ICON_TEXT = 'icon-text',\n SWAP_FUNC = 'swap',\n EMPTY = 'empty',\n}\n\nexport interface RawColumn {\n [key: string]: any;\n}\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport {\r\n DEFAULT_BIND_LABEL,\r\n DEFAULT_BIND_VALUE,\r\n SELECT_FIELD_TYPES,\r\n} from '../../../consts/fields/select-field.const';\r\nimport { BaseField } from '../field.model';\r\nimport { ApiConfig, FieldDependency } from '../../common';\r\nimport { SelectOutputValueType } from '../../common/output-value-type.model';\r\nimport { SelectOutputValueTypeEnum } from '../../../enums/common';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { RADIO_FIELD_TYPES } from '../../../consts/fields/radio-field.const';\r\n\r\nexport type RadioFieldType = (typeof RADIO_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Radio.\r\n */\r\nexport abstract class RadioBaseField<K, TOptions = Record<string, unknown>> extends BaseField<K> {\r\n // Key lấy ra nhãn hiển thị ở options.\r\n bindLabel!: string;\r\n\r\n // Key lấy ra giá trị ngầm ở options.\r\n bindValue!: string;\r\n\r\n // Mảng options cho việc lựa chọn được truyền tĩnh từ config.\r\n options?: TOptions[];\r\n\r\n // Cấu hình api nếu danh sách select dựa vào việc gọi api GET. Ưu tiên hơn options tĩnh truyền vào từ config.\r\n apiConfig?: ApiConfig;\r\n\r\n // Phụ thuộc vào một giá trị từ bất kỳ dạng field nào khác: Select, Input,...\r\n dependsOn?: FieldDependency[];\r\n\r\n // Biến đổi hiển thị option label từ option của options.\r\n transformLabel?: (option: TOptions) => string;\r\n\r\n /**\r\n * Props validation chung cho các dạng Radio.\r\n */\r\n // ................. Chưa có .................\r\n\r\n constructor(init: Partial<RadioBaseField<K, TOptions>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Radio.\r\n */\r\n this.controlType = ControlTypeEnum.Radio;\r\n this.bindLabel = DEFAULT_BIND_LABEL;\r\n this.bindValue = DEFAULT_BIND_VALUE;\r\n this.dependsOn = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Radio.\r\n protected getCommonSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Radio.\r\n protected getCustomSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonSelectValidators();\r\n const customValidators = this.getCustomSelectValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: K): K;\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","/*\n * Public API Surface of dynamic-form\n */\n\n// ==========================================\n// 0. BASE FIELD MODELS (export truoc de tranh loi circular dependency)\n// ==========================================\nexport * from \"./lib/shared/models/fields/field.model\";\nexport * from \"./lib/shared/models/fields/field-grid.model\";\nexport * from \"./lib/shared/models/fields/field-group.model\";\nexport * from \"./lib/shared/models/fields/index.model\";\n\n// ==========================================\n// 1. MODULE & COMPONENT & SERVICE CHINH\n// ==========================================\nexport * from \"./lib/dynamic-form.component\";\n\n// ==========================================\n// 2. CONFIGURATION & DI TOKENS\n// ==========================================\nexport * from \"./lib/shared/config/dynamic-form.config\";\nexport * from \"./lib/shared/services/form-config.service\";\nexport * from \"./lib/shared/services/dynamic-form.service\";\nexport * from \"./lib/shared/services/form-data.service\";\nexport * from \"./lib/shared/services/suffix.service\";\nexport * from \"./lib/shared/services/file.service\";\nexport * from \"./lib/shared/consts/common/file.const\";\n\n// ==========================================\n// 3. ENUMS\n// ==========================================\nexport * from \"./lib/shared/enums/controls/index\";\nexport * from \"./lib/shared/enums/fields/index\";\nexport * from \"./lib/shared/enums/validators/index\";\nexport * from \"./lib/shared/enums/common/index\";\nexport * from \"./lib/shared/enums/form/index\";\n\n// ==========================================\n// 4. COMMON MODELS\n// ==========================================\nexport * from \"./lib/shared/models/common/index\";\nexport * from \"./lib/shared/models/common/table-models\";\n\n// ==========================================\n// 5. CAC CLASS CAU HINH CU THE CHO TUNG LOAI DIEU KHIEN\n// ==========================================\n\n// Input Fields\nexport * from \"./lib/shared/models/fields/input/index\";\n\n// Textarea Fields\nexport * from \"./lib/shared/models/fields/textarea/textarea-field.model\";\n\n// Date Fields\nexport * from \"./lib/shared/models/fields/date/index\";\n\n// Select Fields\nexport * from \"./lib/shared/models/fields/select/select-base-field.model\";\nexport * from \"./lib/shared/models/fields/select/single-select-field.model\";\nexport * from \"./lib/shared/models/fields/select/multi-select-field.model\";\nexport * from \"./lib/shared/models/fields/select/tree-select-field.model\";\n\n// Upload Fields\nexport * from \"./lib/shared/models/fields/upload/index\";\n\n// Radio & Checkbox\nexport * from \"./lib/shared/models/fields/radio/radio-base-field.model\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["ZORRO_MODULES","i3","i1","i2","i5","COMPONENTS","i4","i6","i7","i8","i4.InputTextComponent","i5.InputPasswordComponent","i6.SingleSelectComponent","i7.MultiSelectComponent","i8.TreeSelectComponent","i9.TextareaComponent","i10.DatePickerComponent","i11.DateRangeComponent","i12.SingleFileUploadComponent","i13.MultiFileUploadComponent","i14.MultiImageUploadComponent","i15.AvatarUploadComponent","i1.DynamicFormService"],"mappings":"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"}