@ldquocc/dynamic-form 0.0.1

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 (124) hide show
  1. package/README.md +63 -0
  2. package/fesm2022/ldquocc-dynamic-form.mjs +6466 -0
  3. package/fesm2022/ldquocc-dynamic-form.mjs.map +1 -0
  4. package/index.d.ts +5 -0
  5. package/ldquocc-dynamic-form-0.0.1.tgz +0 -0
  6. package/lib/dynamic-form.component.d.ts +67 -0
  7. package/lib/dynamic-form.service.d.ts +6 -0
  8. package/lib/shared/base/base-value-accessor.d.ts +62 -0
  9. package/lib/shared/components/component.d.ts +14 -0
  10. package/lib/shared/components/dynamic-field/dynamic-field.component.d.ts +23 -0
  11. package/lib/shared/components/fields/components/suffix/suffix.component.d.ts +12 -0
  12. package/lib/shared/components/fields/date/date-picker/date-picker.component.d.ts +15 -0
  13. package/lib/shared/components/fields/date/date-range/date-range.component.d.ts +16 -0
  14. package/lib/shared/components/fields/input/input-password/input-password.component.d.ts +11 -0
  15. package/lib/shared/components/fields/input/input-text/input-text.component.d.ts +14 -0
  16. package/lib/shared/components/fields/radio/custom/reminder-type-radio/reminder-type-radio.component.d.ts +24 -0
  17. package/lib/shared/components/fields/select/multi-select/multi-select.component.d.ts +25 -0
  18. package/lib/shared/components/fields/select/single-select/single-select.component.d.ts +26 -0
  19. package/lib/shared/components/fields/select/tree-select/tree-select.component.d.ts +27 -0
  20. package/lib/shared/components/fields/textarea/textarea.component.d.ts +13 -0
  21. package/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.d.ts +26 -0
  22. package/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.d.ts +77 -0
  23. package/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.d.ts +27 -0
  24. package/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.d.ts +29 -0
  25. package/lib/shared/config/dynamic-form.config.d.ts +9 -0
  26. package/lib/shared/consts/common/common.const.d.ts +1 -0
  27. package/lib/shared/consts/common/field-dependency.const.d.ts +1 -0
  28. package/lib/shared/consts/common/file.const.d.ts +148 -0
  29. package/lib/shared/consts/common/index.d.ts +5 -0
  30. package/lib/shared/consts/common/sample-test.const.d.ts +68 -0
  31. package/lib/shared/consts/common/standalone-import.const.d.ts +7 -0
  32. package/lib/shared/consts/controls/control.const.d.ts +1 -0
  33. package/lib/shared/consts/controls/index.d.ts +1 -0
  34. package/lib/shared/consts/fields/date-field.const.d.ts +7 -0
  35. package/lib/shared/consts/fields/field.const.d.ts +4 -0
  36. package/lib/shared/consts/fields/index.d.ts +4 -0
  37. package/lib/shared/consts/fields/input-field.const.d.ts +4 -0
  38. package/lib/shared/consts/fields/radio-field.const.d.ts +10 -0
  39. package/lib/shared/consts/fields/select-field.const.d.ts +6 -0
  40. package/lib/shared/consts/fields/upload-field.const.d.ts +1 -0
  41. package/lib/shared/consts/validators/pattern.const.d.ts +2 -0
  42. package/lib/shared/enums/common/field-dependency.enum.d.ts +9 -0
  43. package/lib/shared/enums/common/file-size-type.enum.d.ts +6 -0
  44. package/lib/shared/enums/common/index.d.ts +4 -0
  45. package/lib/shared/enums/common/output-value-type.enum.d.ts +19 -0
  46. package/lib/shared/enums/common/view-mode.enum.d.ts +4 -0
  47. package/lib/shared/enums/controls/control.enum.d.ts +11 -0
  48. package/lib/shared/enums/controls/index.d.ts +1 -0
  49. package/lib/shared/enums/fields/date-field.enum.d.ts +4 -0
  50. package/lib/shared/enums/fields/field.enum.d.ts +19 -0
  51. package/lib/shared/enums/fields/index.d.ts +5 -0
  52. package/lib/shared/enums/fields/input-field.enum.d.ts +6 -0
  53. package/lib/shared/enums/fields/select-field.enum.d.ts +4 -0
  54. package/lib/shared/enums/fields/upload-field.enum.d.ts +5 -0
  55. package/lib/shared/enums/form/dynamic-form.enum.d.ts +6 -0
  56. package/lib/shared/enums/form/index.d.ts +1 -0
  57. package/lib/shared/enums/validators/index.d.ts +1 -0
  58. package/lib/shared/enums/validators/validators.enum.d.ts +14 -0
  59. package/lib/shared/models/common/api-config.model.d.ts +4 -0
  60. package/lib/shared/models/common/api-response.model.d.ts +19 -0
  61. package/lib/shared/models/common/common.model.d.ts +29 -0
  62. package/lib/shared/models/common/field-dependency.model.d.ts +16 -0
  63. package/lib/shared/models/common/file-config.model.d.ts +11 -0
  64. package/lib/shared/models/common/index.d.ts +7 -0
  65. package/lib/shared/models/common/obj-field.model.d.ts +59 -0
  66. package/lib/shared/models/common/object-storage.model.d.ts +15 -0
  67. package/lib/shared/models/common/output-value-type.model.d.ts +4 -0
  68. package/lib/shared/models/common/table-models.d.ts +15 -0
  69. package/lib/shared/models/common/view-mode.model.d.ts +1 -0
  70. package/lib/shared/models/controls/control.model.d.ts +2 -0
  71. package/lib/shared/models/controls/index.d.ts +1 -0
  72. package/lib/shared/models/fields/date/base-date-field.model.d.ts +19 -0
  73. package/lib/shared/models/fields/date/date-picker-field.model.d.ts +12 -0
  74. package/lib/shared/models/fields/date/date-range-field.model.d.ts +11 -0
  75. package/lib/shared/models/fields/date/index.d.ts +3 -0
  76. package/lib/shared/models/fields/field-grid.model.d.ts +9 -0
  77. package/lib/shared/models/fields/field-group.model.d.ts +21 -0
  78. package/lib/shared/models/fields/field.model.d.ts +55 -0
  79. package/lib/shared/models/fields/index.model.d.ts +1 -0
  80. package/lib/shared/models/fields/input/index.d.ts +3 -0
  81. package/lib/shared/models/fields/input/input-field.model.d.ts +31 -0
  82. package/lib/shared/models/fields/input/input-password-field.model.d.ts +11 -0
  83. package/lib/shared/models/fields/input/input-text-field.model.d.ts +9 -0
  84. package/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-option.model.d.ts +26 -0
  85. package/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-type-radio-field.model.d.ts +14 -0
  86. package/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-type.model.d.ts +1 -0
  87. package/lib/shared/models/fields/radio/custom/reminder-type-radio/reminder-value.model.d.ts +7 -0
  88. package/lib/shared/models/fields/radio/radio-base-field.model.d.ts +26 -0
  89. package/lib/shared/models/fields/select/multi-select-field.model.d.ts +11 -0
  90. package/lib/shared/models/fields/select/select-base-field.model.d.ts +40 -0
  91. package/lib/shared/models/fields/select/single-select-field.model.d.ts +9 -0
  92. package/lib/shared/models/fields/select/tree-select-field.model.d.ts +10 -0
  93. package/lib/shared/models/fields/textarea/textarea-field.model.d.ts +20 -0
  94. package/lib/shared/models/fields/upload/avatar-upload-field.model.d.ts +9 -0
  95. package/lib/shared/models/fields/upload/base-upload-field.model.d.ts +25 -0
  96. package/lib/shared/models/fields/upload/index.d.ts +1 -0
  97. package/lib/shared/models/fields/upload/multi-file-upload-field.model.d.ts +10 -0
  98. package/lib/shared/models/fields/upload/multi-image-upload-field.model.d.ts +12 -0
  99. package/lib/shared/models/fields/upload/single-file-upload-field.model.d.ts +11 -0
  100. package/lib/shared/models/form/dynamic-form.model.d.ts +1 -0
  101. package/lib/shared/models/form/index.d.ts +1 -0
  102. package/lib/shared/services/dynamic-form.service.d.ts +48 -0
  103. package/lib/shared/services/field.service.d.ts +29 -0
  104. package/lib/shared/services/file.service.d.ts +20 -0
  105. package/lib/shared/services/form-config.service.d.ts +10 -0
  106. package/lib/shared/services/form-data.service.d.ts +53 -0
  107. package/lib/shared/services/form-utils.d.ts +5 -0
  108. package/lib/shared/services/suffix.service.d.ts +12 -0
  109. package/lib/shared/services/validation.service.d.ts +10 -0
  110. package/lib/shared/utils/common/common.utils.d.ts +7 -0
  111. package/lib/shared/utils/common/index.d.ts +1 -0
  112. package/lib/shared/utils/date/date.utils.d.ts +6 -0
  113. package/lib/shared/utils/date/index.d.ts +1 -0
  114. package/lib/shared/utils/dynamic-form/dynamic-form.d.ts +7 -0
  115. package/lib/shared/utils/fields/fields.d.ts +20 -0
  116. package/lib/shared/utils/fields/index.d.ts +1 -0
  117. package/lib/shared/utils/file/file.utils.d.ts +4 -0
  118. package/lib/shared/utils/file/index.d.ts +1 -0
  119. package/lib/shared/utils/validators/custom-validators.d.ts +12 -0
  120. package/lib/shared/utils/validators/default-error-message.d.ts +6 -0
  121. package/lib/shared/utils/validators/index.d.ts +3 -0
  122. package/lib/shared/utils/validators/pattern.d.ts +4 -0
  123. package/package.json +23 -0
  124. package/public-api.d.ts +28 -0
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@ldquocc/dynamic-form" />
5
+ export * from './public-api';
Binary file
@@ -0,0 +1,67 @@
1
+ import { BaseField } from './shared/models/fields/field.model';
2
+ import { EventEmitter } from '@angular/core';
3
+ import { FormGroup } from '@angular/forms';
4
+ import { FieldTypeEnum } from './shared/enums/fields';
5
+ import { FormModeEnum } from './shared/enums/form';
6
+ import { FormMode } from './shared/models/form';
7
+ import { DynamicFormService } from './shared/services/dynamic-form.service';
8
+ import { FieldGroup, GroupedFields } from './shared/models/fields/field-group.model';
9
+ import { FormDataService } from './shared/services/form-data.service';
10
+ import * as i0 from "@angular/core";
11
+ export declare class DynamicFormComponent {
12
+ private dFormService;
13
+ formId: string;
14
+ valueChangesDebounceTime: number;
15
+ readonly formValueChanges: EventEmitter<Record<string, unknown>>;
16
+ private readonly destroy$;
17
+ readonly fields: import("@angular/core").InputSignal<BaseField<any>[]>;
18
+ readonly model: import("@angular/core").InputSignal<Record<string, any>>;
19
+ readonly mode: import("@angular/core").InputSignal<FormMode>;
20
+ readonly fieldGroups: import("@angular/core").InputSignal<FieldGroup[]>;
21
+ readonly displayNonGroupedFields: import("@angular/core").InputSignal<boolean>;
22
+ readonly formSubmit: import("@angular/core").OutputEmitterRef<Record<string, unknown>>;
23
+ readonly formInvalid: import("@angular/core").OutputEmitterRef<BaseField<any>[]>;
24
+ protected readonly oldFields: import("@angular/core").WritableSignal<BaseField<any>[]>;
25
+ readonly isAddOrEdit: import("@angular/core").Signal<boolean>;
26
+ readonly formState: import("@angular/core").Signal<{
27
+ mode: FormMode;
28
+ newFields: BaseField<any>[];
29
+ model: Record<string, any>;
30
+ }>;
31
+ groupedFields: import("@angular/core").Signal<GroupedFields>;
32
+ protected readonly formModeEnum: typeof FormModeEnum;
33
+ protected readonly fieldTypeEnum: typeof FieldTypeEnum;
34
+ isHiddenField: (field: BaseField<any>) => boolean;
35
+ formGroup: FormGroup;
36
+ readonly formDataService: FormDataService;
37
+ constructor(dFormService: DynamicFormService);
38
+ ngOnDestroy(): void;
39
+ syncFieldsEffect: import("@angular/core").EffectRef;
40
+ /**
41
+ * Effect tạo FormGroup.
42
+ */
43
+ createFormGroupEffect: import("@angular/core").EffectRef;
44
+ /**
45
+ * Subscribe to form value changes
46
+ * Subscribe lắng nghe sự thay đổi giá trị của form
47
+ */
48
+ private subscribeToFormValueChanges;
49
+ /**
50
+ * Xử lý submit form và output ra ngoài.
51
+ */
52
+ private handleSubmit;
53
+ /**
54
+ * Kích submit form ảo khi nhấn nút submit.
55
+ */
56
+ private markControlForValidation;
57
+ /**
58
+ * TrackBy function for ngFor to optimize rendering.
59
+ */
60
+ protected trackByField(index: number, field: BaseField<any>): string;
61
+ readonly collapseCustomStyle: {
62
+ background: string;
63
+ border: string;
64
+ };
65
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFormComponent, never>;
66
+ static ɵcmp: i0.ɵɵComponentDeclaration<DynamicFormComponent, "app-dynamic-forms", never, { "formId": { "alias": "formId"; "required": false; }; "valueChangesDebounceTime": { "alias": "valueChangesDebounceTime"; "required": false; }; "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "fieldGroups": { "alias": "fieldGroups"; "required": false; "isSignal": true; }; "displayNonGroupedFields": { "alias": "displayNonGroupedFields"; "required": false; "isSignal": true; }; }, { "formValueChanges": "formValueChanges"; "formSubmit": "formSubmit"; "formInvalid": "formInvalid"; }, never, never, true, never>;
67
+ }
@@ -0,0 +1,6 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class DynamicFormService {
3
+ constructor();
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFormService, never>;
5
+ static ɵprov: i0.ɵɵInjectableDeclaration<DynamicFormService>;
6
+ }
@@ -0,0 +1,62 @@
1
+ import { AbstractControl, ControlValueAccessor } from '@angular/forms';
2
+ import { Subject } from 'rxjs';
3
+ import { FormMode } from '../models/form';
4
+ import { FormModeEnum } from '../enums/form';
5
+ import { DynamicFormService } from '../services/dynamic-form.service';
6
+ import { FieldService } from '../services/field.service';
7
+ import { BaseField } from '../models/fields/field.model';
8
+ import { ViewModeEnum } from '../enums/common';
9
+ import { FormDataService } from '../services/form-data.service';
10
+ import * as i0 from "@angular/core";
11
+ export declare abstract class BaseValueAccessor<T> implements ControlValueAccessor {
12
+ formId: string;
13
+ readonly fieldInput: import("@angular/core").InputSignal<BaseField<T>>;
14
+ protected readonly fieldKey: import("@angular/core").Signal<string>;
15
+ control: AbstractControl<T> | null;
16
+ readonly modeSignal: import("@angular/core").InputSignal<FormMode>;
17
+ readonly isAdd: import("@angular/core").Signal<boolean>;
18
+ readonly isEdit: import("@angular/core").Signal<boolean>;
19
+ readonly isView: import("@angular/core").Signal<boolean>;
20
+ readonly isAddOrEdit: import("@angular/core").Signal<boolean>;
21
+ readonly isEditOrView: import("@angular/core").Signal<boolean>;
22
+ protected readonly formModeEnum: typeof FormModeEnum;
23
+ protected readonly viewModeEnum: typeof ViewModeEnum;
24
+ protected readonly destroy$: Subject<void>;
25
+ protected value: T | null;
26
+ protected onChange: (value: T | null) => void;
27
+ protected onTouched: () => void;
28
+ isDisabled: boolean;
29
+ protected dFormService: DynamicFormService;
30
+ protected formDataService: FormDataService;
31
+ protected fieldService: FieldService;
32
+ ngOnDestroy(): void;
33
+ protected takeUntilDestroy<T>(): import("rxjs").MonoTypeOperatorFunction<T>;
34
+ writeValue(value: T | null): void;
35
+ registerOnChange(fn: (value: T | null) => void): void;
36
+ registerOnTouched(fn: () => void): void;
37
+ setDisabledState(isDisabled: boolean): void;
38
+ protected propagateValue(value: T | null): void;
39
+ protected reset(): void;
40
+ /**
41
+ * Thêm dữ liệu ở từng dạng field vào form data theo form id cụ thể.
42
+ * @param key Mã của field.
43
+ * @param value Giá trị của field.
44
+ */
45
+ protected patchFormData(key: string, value: T | null): void;
46
+ protected updateDependValues(key: string, value: string): void;
47
+ protected updateLastChangedParent(key: string, value: unknown): void;
48
+ protected disableAndResetControl(): void;
49
+ protected disableControl(): void;
50
+ protected enableControl(): void;
51
+ /**
52
+ * Optional: để component override riêng.
53
+ */
54
+ protected writeValueToView(value: T | null): void;
55
+ protected handleValueChange(value: T | null): void;
56
+ protected setDisabledOnView(isDisabled: boolean): void;
57
+ protected resetForAdd(): void;
58
+ protected resetForEdit(): void;
59
+ protected finalizeReset(): void;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<BaseValueAccessor<any>, never>;
61
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BaseValueAccessor<any>, never, never, { "formId": { "alias": "formId"; "required": true; }; "fieldInput": { "alias": "fieldInput"; "required": true; "isSignal": true; }; "control": { "alias": "control"; "required": false; }; "modeSignal": { "alias": "modeSignal"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
62
+ }
@@ -0,0 +1,14 @@
1
+ import { DatePickerComponent } from './fields/date/date-picker/date-picker.component';
2
+ import { DateRangeComponent } from './fields/date/date-range/date-range.component';
3
+ import { InputPasswordComponent } from './fields/input/input-password/input-password.component';
4
+ import { InputTextComponent } from './fields/input/input-text/input-text.component';
5
+ import { ReminderTypeRadioComponent } from './fields/radio/custom/reminder-type-radio/reminder-type-radio.component';
6
+ import { MultiSelectComponent } from './fields/select/multi-select/multi-select.component';
7
+ import { SingleSelectComponent } from './fields/select/single-select/single-select.component';
8
+ import { TreeSelectComponent } from './fields/select/tree-select/tree-select.component';
9
+ import { TextareaComponent } from './fields/textarea/textarea.component';
10
+ import { AvatarUploadComponent } from './fields/upload/avatar-upload/avatar-upload.component';
11
+ import { MultiFileUploadComponent } from './fields/upload/multi-file-upload/multi-file-upload.component';
12
+ import { MultiImageUploadComponent } from './fields/upload/multi-image-upload/multi-image-upload.component';
13
+ import { SingleFileUploadComponent } from './fields/upload/single-file-upload/single-file-upload.component';
14
+ export declare const FIELD_COMPONENTS: (typeof DatePickerComponent | typeof DateRangeComponent | typeof InputPasswordComponent | typeof InputTextComponent | typeof ReminderTypeRadioComponent | typeof MultiSelectComponent | typeof SingleSelectComponent | typeof TreeSelectComponent | typeof TextareaComponent | typeof AvatarUploadComponent | typeof MultiFileUploadComponent | typeof MultiImageUploadComponent | typeof SingleFileUploadComponent)[];
@@ -0,0 +1,23 @@
1
+ import { BaseField } from '../../models/fields/field.model';
2
+ import { AbstractControl, FormGroup } from '@angular/forms';
3
+ import { FormMode } from '../../models/form';
4
+ import { FieldTypeEnum } from '../../enums/fields';
5
+ import { FormModeEnum } from '../../enums/form';
6
+ import * as i0 from "@angular/core";
7
+ export declare class DynamicFieldComponent {
8
+ readonly field: import("@angular/core").InputSignal<BaseField<any>>;
9
+ readonly fields: import("@angular/core").InputSignal<BaseField<any>[]>;
10
+ readonly mode: import("@angular/core").InputSignal<FormMode>;
11
+ readonly control: import("@angular/core").InputSignal<AbstractControl<any, any>>;
12
+ readonly formGroup: import("@angular/core").InputSignal<FormGroup<any>>;
13
+ readonly formId: import("@angular/core").InputSignal<string>;
14
+ fieldTypeEnum: typeof FieldTypeEnum;
15
+ formModeEnum: typeof FormModeEnum;
16
+ private validationService;
17
+ /**
18
+ * 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.
19
+ */
20
+ protected getErrorMessage(): string;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFieldComponent, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<DynamicFieldComponent, "app-dynamic-field", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": true; "isSignal": true; }; "control": { "alias": "control"; "required": true; "isSignal": true; }; "formGroup": { "alias": "formGroup"; "required": true; "isSignal": true; }; "formId": { "alias": "formId"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
23
+ }
@@ -0,0 +1,12 @@
1
+ import { Suffix } from '../../../../models/common/common.model';
2
+ import * as i0 from "@angular/core";
3
+ export declare class SuffixComponent {
4
+ suffixConfig: Suffix;
5
+ formId: string;
6
+ protected defaultText: string;
7
+ private suffixService;
8
+ ngOnInit(): void;
9
+ handleSuffix(): void;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<SuffixComponent, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<SuffixComponent, "app-suffix", never, { "suffixConfig": { "alias": "suffixConfig"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; }, {}, never, never, true, never>;
12
+ }
@@ -0,0 +1,15 @@
1
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
2
+ import { DatePickerField } from '../../../../models/fields/date/date-picker-field.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class DatePickerComponent extends BaseValueAccessor<string | Date> {
5
+ readonly fieldSignal: import("@angular/core").Signal<DatePickerField>;
6
+ displayValue: string;
7
+ disabledDate: import("@angular/core").Signal<(current: Date) => boolean>;
8
+ constructor();
9
+ handleChangeDate(date: Date): void;
10
+ protected writeValueToView(value: Date): void;
11
+ protected handleValueChange(value: Date): void;
12
+ private getValueByOutputAs;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerComponent, never>;
14
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatePickerComponent, "app-date-picker", never, {}, {}, never, never, true, never>;
15
+ }
@@ -0,0 +1,16 @@
1
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
2
+ import { DateRangeField } from '../../../../models/fields/date/date-range-field.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class DateRangeComponent extends BaseValueAccessor<string | string[] | Date[]> {
5
+ readonly fieldSignal: import("@angular/core").Signal<DateRangeField>;
6
+ displayValueNoInfo: string;
7
+ disabledDate: import("@angular/core").Signal<(current: Date) => boolean>;
8
+ constructor();
9
+ getSelectedDateRangeFromFieldValue(fieldValue: string[] | Date[]): Date[];
10
+ handleChangeDateRange(dateRange: Date[]): void;
11
+ protected writeValueToView(value: Date[]): void;
12
+ protected handleValueChange(value: Date[]): void;
13
+ private getValueByOutputAs;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<DateRangeComponent, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<DateRangeComponent, "app-date-range", never, {}, {}, never, never, true, never>;
16
+ }
@@ -0,0 +1,11 @@
1
+ import { InputPasswordField } from '../../../../models/fields/input';
2
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
3
+ import * as i0 from "@angular/core";
4
+ export declare class InputPasswordComponent extends BaseValueAccessor<string> {
5
+ readonly fieldSignal: import("@angular/core").Signal<InputPasswordField>;
6
+ passwordVisible: boolean;
7
+ constructor();
8
+ handleChangeInputPassword(event: Event): void;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<InputPasswordComponent, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<InputPasswordComponent, "app-input-password", never, {}, {}, never, never, true, never>;
11
+ }
@@ -0,0 +1,14 @@
1
+ import { InputTextField } from '../../../../models/fields/input';
2
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
3
+ import * as i0 from "@angular/core";
4
+ export declare class InputTextComponent extends BaseValueAccessor<string> {
5
+ readonly fieldSignal: import("@angular/core").Signal<InputTextField>;
6
+ inputDisplayValue: string;
7
+ displayNoValueText: string;
8
+ constructor();
9
+ handleChangeInputText(event: Event): void;
10
+ handleChangeFormValue(value: number): void;
11
+ protected writeValueToView(value: string): void;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<InputTextComponent, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<InputTextComponent, "app-input-text", never, {}, {}, never, never, true, never>;
14
+ }
@@ -0,0 +1,24 @@
1
+ import { BaseValueAccessor } from '../../../../../base/base-value-accessor';
2
+ import { DateOptions, ReminderOption, SelectOption } from '../../../../../models/fields/radio/custom/reminder-type-radio/reminder-option.model';
3
+ import { ReminderTypeRadioField } from '../../../../../models/fields/radio/custom/reminder-type-radio/reminder-type-radio-field.model';
4
+ import { ReminderValue } from '../../../../../models/fields/radio/custom/reminder-type-radio/reminder-value.model';
5
+ import * as i0 from "@angular/core";
6
+ export declare class ReminderTypeRadioComponent extends BaseValueAccessor<ReminderValue | null> {
7
+ readonly fieldSignal: import("@angular/core").Signal<ReminderTypeRadioField>;
8
+ options: ReminderOption[];
9
+ selectedOption: ReminderOption;
10
+ selectedOptionCode: string;
11
+ deadline: Date | null;
12
+ get selectDetail(): SelectOption | undefined;
13
+ get dateDetail(): DateOptions | undefined;
14
+ disabledAfterLimit: (current: Date) => boolean;
15
+ private toast;
16
+ constructor();
17
+ protected writeValueToView(value: ReminderValue | null): void;
18
+ protected handleValueChange(value: ReminderValue): void;
19
+ reminderRadioChange(radioValue: string): void;
20
+ changeOptionSelect(optionValue: string): void;
21
+ changeDate(date: Date): void;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReminderTypeRadioComponent, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReminderTypeRadioComponent, "app-reminder-type-radio", never, {}, {}, never, never, true, never>;
24
+ }
@@ -0,0 +1,25 @@
1
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
2
+ import { MultiSelectField } from '../../../../models/fields/select/multi-select-field.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class MultiSelectComponent extends BaseValueAccessor<string[] | number[] | Record<string, unknown>[]> {
5
+ readonly fieldSignal: import("@angular/core").Signal<MultiSelectField>;
6
+ displayNoValueText: string;
7
+ displayOptionsValue: string[];
8
+ loading: import("@angular/core").WritableSignal<boolean>;
9
+ options: Record<string, unknown>[];
10
+ queryParams: Record<string, unknown>;
11
+ constructor();
12
+ private resolveDependencyState;
13
+ private createFullApiUrl;
14
+ private getOptions;
15
+ handleChangeOptions(optionValue: string[]): void;
16
+ protected writeValueToView(value: string[]): void;
17
+ protected handleValueChange(value: string[]): void;
18
+ private getValueByOutputAs;
19
+ protected getDisplayValue(value: string[] | Record<string, unknown>[]): string[];
20
+ protected transformOptionValue(option: Record<string, unknown>): unknown;
21
+ protected getOptionLabel(option: Record<string, unknown>): string;
22
+ private getCustomLabel;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<MultiSelectComponent, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<MultiSelectComponent, "app-multi-select", never, {}, {}, never, never, true, never>;
25
+ }
@@ -0,0 +1,26 @@
1
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
2
+ import { SingleSelectField } from '../../../../models/fields/select/single-select-field.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class SingleSelectComponent extends BaseValueAccessor<string | Record<string, unknown>> {
5
+ isCustomInputText: boolean;
6
+ readonly fieldSignal: import("@angular/core").Signal<SingleSelectField>;
7
+ displayValue: string | number;
8
+ loadingSignal: import("@angular/core").WritableSignal<boolean>;
9
+ isDisabledSignal: import("@angular/core").WritableSignal<boolean>;
10
+ disabled: import("@angular/core").Signal<boolean>;
11
+ options: Record<string, unknown>[];
12
+ queryParams: Record<string, unknown>;
13
+ constructor();
14
+ protected writeValueToView(value: string | null): void;
15
+ protected handleValueChange(value: string): void;
16
+ private createFullApiUrl;
17
+ private getOptions;
18
+ handleChangeOptions(optionValue: string): void;
19
+ private getValueByOutputAs;
20
+ protected getDisplayValue(value: string | Record<string, unknown>): string;
21
+ protected transformOptionValue(option: Record<string, unknown>): unknown;
22
+ protected getOptionLabel(option: Record<string, unknown>): string;
23
+ private getCustomLabel;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<SingleSelectComponent, never>;
25
+ static ɵcmp: i0.ɵɵComponentDeclaration<SingleSelectComponent, "app-single-select", never, { "isCustomInputText": { "alias": "isCustomInputText"; "required": false; }; }, {}, never, never, true, never>;
26
+ }
@@ -0,0 +1,27 @@
1
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
2
+ import { TreeSelectField } from '../../../../models/fields/select/tree-select-field.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class TreeSelectComponent extends BaseValueAccessor<string | Record<string, unknown>> {
5
+ isCustomInputText: boolean;
6
+ readonly fieldSignal: import("@angular/core").Signal<TreeSelectField>;
7
+ displayValue: string | number;
8
+ loadingSignal: import("@angular/core").WritableSignal<boolean>;
9
+ isDisabledSignal: import("@angular/core").WritableSignal<boolean>;
10
+ disabled: import("@angular/core").Signal<boolean>;
11
+ options: any[];
12
+ queryParams: Record<string, unknown>;
13
+ constructor();
14
+ protected writeValueToView(value: string | null): void;
15
+ protected handleValueChange(value: string): void;
16
+ private createFullApiUrl;
17
+ private buildTree;
18
+ private getOptions;
19
+ handleChangeOptions(optionValue: string): void;
20
+ private getValueByOutputAs;
21
+ protected getDisplayValue(value: string | Record<string, unknown>): string;
22
+ protected transformOptionValue(option: Record<string, unknown>): unknown;
23
+ protected getOptionLabel(option: Record<string, unknown>): string;
24
+ private getCustomLabel;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<TreeSelectComponent, never>;
26
+ static ɵcmp: i0.ɵɵComponentDeclaration<TreeSelectComponent, "app-tree-select", never, { "isCustomInputText": { "alias": "isCustomInputText"; "required": false; }; }, {}, never, never, true, never>;
27
+ }
@@ -0,0 +1,13 @@
1
+ import { BaseValueAccessor } from '../../../base/base-value-accessor';
2
+ import { TextareaField } from '../../../models/fields/textarea/textarea-field.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class TextareaComponent extends BaseValueAccessor<string> {
5
+ readonly fieldSignal: import("@angular/core").Signal<TextareaField>;
6
+ textareaDisplayValue: string;
7
+ displayNoValueText: string;
8
+ constructor();
9
+ handleChangeTextarea(event: Event): void;
10
+ protected writeValueToView(value: string): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<TextareaComponent, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<TextareaComponent, "app-textarea", never, {}, {}, never, never, true, never>;
13
+ }
@@ -0,0 +1,26 @@
1
+ import { NzUploadFile, NzUploadXHRArgs } from 'ng-zorro-antd/upload';
2
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
3
+ import { AvatarUploadField } from '../../../../models/fields/upload/avatar-upload-field.model';
4
+ import { ObjectStorage } from '../../../../models/common';
5
+ import { MyUploadFile } from '../../../../models/common/common.model';
6
+ import { Observable, Subscription } from 'rxjs';
7
+ import * as i0 from "@angular/core";
8
+ export declare class AvatarUploadComponent extends BaseValueAccessor<string | File> {
9
+ size: number;
10
+ readonly fieldSignal: import("@angular/core").Signal<AvatarUploadField>;
11
+ avatarUrl: string | null;
12
+ objStorageList: import("@angular/core").WritableSignal<ObjectStorage[]>;
13
+ private fileService;
14
+ private formConfigService;
15
+ constructor();
16
+ protected writeValueToView(value: string): void;
17
+ private handleInitAllData;
18
+ beforeUpload: (file: NzUploadFile, fileList: NzUploadFile[]) => boolean | Observable<boolean>;
19
+ customRequest: (item: NzUploadXHRArgs) => Subscription;
20
+ private uploadFile;
21
+ handleDelete(file: MyUploadFile): void;
22
+ handlePreview(): void;
23
+ deleteObjStorage(id: string): Subscription;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<AvatarUploadComponent, never>;
25
+ static ɵcmp: i0.ɵɵComponentDeclaration<AvatarUploadComponent, "app-avatar-upload", never, { "size": { "alias": "size"; "required": false; }; }, {}, never, never, true, never>;
26
+ }
@@ -0,0 +1,77 @@
1
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
2
+ import { NzUploadFile, NzUploadXHRArgs } from 'ng-zorro-antd/upload';
3
+ import { MultiFileUploadField } from '../../../../models/fields/upload/multi-file-upload-field.model';
4
+ import { MyUploadFile } from '../../../../models/common/common.model';
5
+ import { ObjectStorage } from '../../../../models/common';
6
+ import { Observable, Subscription } from 'rxjs';
7
+ import * as i0 from "@angular/core";
8
+ export declare class MultiFileUploadComponent extends BaseValueAccessor<string | File | NzUploadFile> {
9
+ readonly fieldSignal: import("@angular/core").Signal<MultiFileUploadField>;
10
+ objStorageList: import("@angular/core").WritableSignal<ObjectStorage[]>;
11
+ allFiles: import("@angular/core").WritableSignal<MyUploadFile[]>;
12
+ fileExtensionGuide: import("@angular/core").WritableSignal<string>;
13
+ pendingCount: import("@angular/core").WritableSignal<number>;
14
+ private _batchBuffer;
15
+ private _batchTimer;
16
+ private fileService;
17
+ private toast;
18
+ private translate;
19
+ private nzMessage;
20
+ private formConfigService;
21
+ constructor();
22
+ protected writeValueToView(value: string): void;
23
+ private handleInitAllData;
24
+ /**
25
+ * Xử lý trước khi upload — trả về Observable<boolean> để hỗ trợ batch detection.
26
+ *
27
+ * Cơ chế batch detection:
28
+ * nz-upload gọi beforeUpload() từng file một (đồng bộ) trong cùng 1 JS tick khi user
29
+ * chọn nhiều file. Mỗi lần gọi, file được đẩy vào _batchBuffer. Sau khi tất cả các
30
+ * lần gọi đồng bộ kết thúc, setTimeout(0) kích hoạt _processBatch() để xử lý toàn bộ
31
+ * batch một lần, cho phép kiểm tra tổng số lượng chính xác trước khi upload.
32
+ */
33
+ beforeUpload: (file: NzUploadFile) => Observable<boolean>;
34
+ /**
35
+ * Xử lý toàn bộ batch file sau khi tất cả beforeUpload calls trong cùng 1 tick đã hoàn tất.
36
+ *
37
+ * Logic:
38
+ * 1. Nếu tổng (file hiện tại + pending + batch) vượt maxFileCount → reject TOÀN BỘ batch.
39
+ * 2. Validate từng file trong batch:
40
+ * - File thỏa (MIME + size) → pendingCount++, resolve(true) → cho phép upload.
41
+ * - File không thỏa → hiển thị NzMessage lỗi, resolve(false) → bỏ qua.
42
+ */
43
+ private _processBatch;
44
+ customRequest: (item: NzUploadXHRArgs) => Subscription;
45
+ private uploadFile;
46
+ handleDelete(file: MyUploadFile): void;
47
+ deleteObjStorage(id: string): Subscription;
48
+ /**
49
+ * Xử lý click vào file item:
50
+ * - Không làm gì nếu file đang loading hoặc ở trạng thái error.
51
+ * - Gọi fileClick để xem file nếu đã upload thành công.
52
+ */
53
+ onFileItemClick(file: MyUploadFile): void;
54
+ fileClick(objStorage: ObjectStorage): void;
55
+ /**
56
+ * Hủy toàn bộ batch đang chờ xử lý:
57
+ * - Clear timer batch detection.
58
+ * - Reject tất cả file trong buffer (resolve false).
59
+ * - Reset pendingCount về 0.
60
+ * Gọi khi form bị reset từ bên ngoài.
61
+ */
62
+ private _clearBatch;
63
+ /**
64
+ * Đồng bộ control value với trạng thái thực tế của danh sách file đã upload thành công.
65
+ *
66
+ * Gọi sau mỗi thay đổi về danh sách file (upload xong, xóa file) để đảm bảo:
67
+ * - Không có file nào thành công → propagateValue('') → Validators.required kích hoạt.
68
+ * - Có ít nhất 1 file thành công → propagateValue(JSON string) → validators pass.
69
+ *
70
+ * Validators hiện tại tương thích:
71
+ * - acceptedMimeTypesValidator: bỏ qua nếu value falsy; parse JSON nếu là string.
72
+ * - maxFileSizeInMBValidator: bỏ qua nếu value.size undefined (JSON string).
73
+ */
74
+ private _syncControlValue;
75
+ static ɵfac: i0.ɵɵFactoryDeclaration<MultiFileUploadComponent, never>;
76
+ static ɵcmp: i0.ɵɵComponentDeclaration<MultiFileUploadComponent, "app-multi-file-upload", never, {}, {}, never, never, true, never>;
77
+ }
@@ -0,0 +1,27 @@
1
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
2
+ import { NzUploadFile, NzUploadXHRArgs } from 'ng-zorro-antd/upload';
3
+ import { MultiImageUploadField } from '../../../../models/fields/upload/multi-image-upload-field.model';
4
+ import { MyUploadFile } from '../../../../models/common/common.model';
5
+ import { ObjectStorage } from '../../../../models/common';
6
+ import { Observable, Subscription } from 'rxjs';
7
+ import * as i0 from "@angular/core";
8
+ export declare class MultiImageUploadComponent extends BaseValueAccessor<string | File | NzUploadFile> {
9
+ readonly fieldSignal: import("@angular/core").Signal<MultiImageUploadField>;
10
+ objStorageList: import("@angular/core").WritableSignal<ObjectStorage[]>;
11
+ allFiles: import("@angular/core").WritableSignal<MyUploadFile[]>;
12
+ private fileService;
13
+ private toast;
14
+ private translate;
15
+ private formConfigService;
16
+ constructor();
17
+ protected writeValueToView(value: string): void;
18
+ private handleInitAllData;
19
+ beforeUpload: (file: NzUploadFile) => boolean | Observable<boolean>;
20
+ customRequest: (item: NzUploadXHRArgs) => Subscription;
21
+ private uploadFile;
22
+ handleDelete(file: MyUploadFile): void;
23
+ deleteObjStorage(id: string): Subscription;
24
+ protected handlePreview(file: MyUploadFile): void;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<MultiImageUploadComponent, never>;
26
+ static ɵcmp: i0.ɵɵComponentDeclaration<MultiImageUploadComponent, "app-multi-image-upload", never, {}, {}, never, never, true, never>;
27
+ }
@@ -0,0 +1,29 @@
1
+ import { BaseValueAccessor } from '../../../../base/base-value-accessor';
2
+ import { SingleFileUploadField } from '../../../../models/fields/upload/single-file-upload-field.model';
3
+ import { NzUploadFile, NzUploadXHRArgs } from 'ng-zorro-antd/upload';
4
+ import { Observable, Subscription } from 'rxjs';
5
+ import { ObjectStorage } from '../../../../models/common/object-storage.model';
6
+ import { MyUploadFile } from '../../../../models/common/common.model';
7
+ import * as i0 from "@angular/core";
8
+ export declare class SingleFileUploadComponent extends BaseValueAccessor<string | File | NzUploadFile> {
9
+ readonly fieldSignal: import("@angular/core").Signal<SingleFileUploadField>;
10
+ objStorageList: import("@angular/core").WritableSignal<ObjectStorage[]>;
11
+ allFiles: import("@angular/core").WritableSignal<MyUploadFile[]>;
12
+ fileExtensionGuide: import("@angular/core").WritableSignal<string>;
13
+ inputDisplayValue: string;
14
+ readonly uploading: import("@angular/core").WritableSignal<boolean>;
15
+ private fileService;
16
+ private toast;
17
+ private translate;
18
+ private formConfigService;
19
+ constructor();
20
+ protected writeValueToView(value: string): void;
21
+ private handleInitAllData;
22
+ beforeUpload: (file: NzUploadFile, fileList: NzUploadFile[]) => boolean | Observable<boolean>;
23
+ customRequest: (item: NzUploadXHRArgs) => Subscription;
24
+ private uploadFile;
25
+ handleDelete(file: MyUploadFile): void;
26
+ deleteObjStorage(id: string): Subscription;
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<SingleFileUploadComponent, never>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<SingleFileUploadComponent, "app-single-file-upload", never, {}, {}, never, never, true, never>;
29
+ }
@@ -0,0 +1,9 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export interface DynamicFormConfig {
3
+ prefix: string;
4
+ mainApiUrl: string;
5
+ systemApiUrl: string;
6
+ portalApiUrl: string;
7
+ storageUrl: string;
8
+ }
9
+ export declare const DYNAMIC_FORM_CONFIG: InjectionToken<DynamicFormConfig>;
@@ -0,0 +1 @@
1
+ export declare const NO_INFO_TEXT = "Kh\u00F4ng c\u00F3 th\u00F4ng tin";
@@ -0,0 +1 @@
1
+ export declare const COMBINE_DEPEND_TYPES: readonly ["skip", "null", "valid"];