@sd-angular/core 19.0.0-beta.95 → 19.0.0-beta.97

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 (107) hide show
  1. package/README.md +8 -9
  2. package/components/badge/src/badge.component.d.ts +3 -4
  3. package/components/button/src/button.component.d.ts +2 -2
  4. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +2 -2
  5. package/components/document-builder/src/document-builder.model.d.ts +6 -2
  6. package/components/editor/src/editor.component.d.ts +8 -0
  7. package/components/editor/src/models/image-upload.plugin.model.d.ts +33 -0
  8. package/components/editor/src/plugins/image-upload/utils/style.utils.d.ts +1 -0
  9. package/components/index.d.ts +0 -2
  10. package/components/modal/src/modal.component.d.ts +1 -2
  11. package/components/section/src/section.component.d.ts +1 -2
  12. package/components/table/index.d.ts +1 -0
  13. package/components/table/src/components/column-filter/column-filter.component.d.ts +3 -3
  14. package/components/table/src/models/index.d.ts +1 -0
  15. package/components/table/src/models/table-item.model.d.ts +10 -0
  16. package/components/table/src/models/table-option-style.model.d.ts +6 -1
  17. package/components/table/src/models/table-option-tree.model.d.ts +12 -0
  18. package/components/table/src/models/table-option.model.d.ts +6 -0
  19. package/components/table/src/pipes/index.d.ts +1 -0
  20. package/components/table/src/pipes/sd-tree.pipe.d.ts +9 -0
  21. package/components/table/src/services/tree/tree.util.d.ts +14 -0
  22. package/components/table/src/table.component.d.ts +3 -0
  23. package/fesm2022/sd-angular-core-components-document-builder.mjs +9 -4
  24. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  25. package/fesm2022/sd-angular-core-components-editor.mjs +222 -97
  26. package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
  27. package/fesm2022/sd-angular-core-components-form-generic.mjs +4 -4
  28. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-components-tab-router.mjs +80 -33
  30. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-components-table.mjs +325 -41
  32. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  33. package/fesm2022/sd-angular-core-components.mjs +0 -2
  34. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  35. package/fesm2022/sd-angular-core-forms-input.mjs +20 -5
  36. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  37. package/fesm2022/sd-angular-core-i18n.mjs +35 -0
  38. package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
  39. package/fesm2022/sd-angular-core-models.mjs +1 -4
  40. package/fesm2022/sd-angular-core-models.mjs.map +1 -1
  41. package/fesm2022/sd-angular-core-modules-layout.mjs +172 -37
  42. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  43. package/fesm2022/sd-angular-core-services-notify.mjs +21 -21
  44. package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
  45. package/fesm2022/sd-angular-core-utilities-extensions.mjs +29 -819
  46. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  47. package/fesm2022/sd-angular-core-utilities-models.mjs +36 -136
  48. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  49. package/forms/autocomplete/src/autocomplete.component.d.ts +1 -2
  50. package/forms/chip/src/chip.component.d.ts +1 -2
  51. package/forms/chip-calendar/src/chip-calendar.component.d.ts +1 -2
  52. package/forms/date/src/date.component.d.ts +1 -2
  53. package/forms/date-range/src/date-range.component.d.ts +1 -2
  54. package/forms/datetime/src/datetime.component.d.ts +1 -2
  55. package/forms/input/src/input.component.d.ts +1 -2
  56. package/forms/input-number/src/input-number.component.d.ts +1 -2
  57. package/forms/select/src/select.component.d.ts +5 -5
  58. package/forms/textarea/src/textarea.component.d.ts +1 -2
  59. package/i18n/src/en.d.ts +6 -0
  60. package/models/src/language.model.d.ts +2 -4
  61. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +8 -1
  62. package/modules/layout/configurations/layout.configuration.d.ts +8 -0
  63. package/modules/layout/services/storage/storage.service.d.ts +2 -0
  64. package/package.json +68 -79
  65. package/sd-angular-core-19.0.0-beta.97.tgz +0 -0
  66. package/services/notify/index.d.ts +1 -1
  67. package/services/notify/src/components/toast/toast.component.d.ts +3 -3
  68. package/services/notify/src/components/toast-container.component.d.ts +3 -4
  69. package/services/notify/src/notify.model.d.ts +1 -1
  70. package/services/notify/src/notify.service.d.ts +5 -5
  71. package/utilities/extensions/src/array.extension.d.ts +1 -7
  72. package/utilities/extensions/src/color.extension.d.ts +5 -20
  73. package/utilities/extensions/src/date.extension.d.ts +1 -18
  74. package/utilities/extensions/src/number.extension.d.ts +1 -10
  75. package/utilities/extensions/src/string.extension.d.ts +30 -4
  76. package/utilities/extensions/src/utility.extension.d.ts +6 -0
  77. package/utilities/models/src/color.model.d.ts +4 -1
  78. package/utilities/models/src/empty.model.d.ts +3 -0
  79. package/utilities/models/src/filter.model.d.ts +12 -24
  80. package/utilities/models/src/maybe-async.model.d.ts +10 -4
  81. package/utilities/models/src/nested-key-of.model.d.ts +4 -5
  82. package/utilities/models/src/operator.model.d.ts +9 -4
  83. package/utilities/models/src/order.model.d.ts +4 -5
  84. package/utilities/models/src/paging.model.d.ts +8 -16
  85. package/utilities/models/src/pattern.model.d.ts +13 -0
  86. package/utilities/models/src/size.model.d.ts +4 -1
  87. package/components/anchor-v2/index.d.ts +0 -1
  88. package/components/anchor-v2/src/components/anchor-item-v2/anchor-item-v2.component.d.ts +0 -12
  89. package/components/anchor-v2/src/components/anchor-v2/anchor-v2.component.d.ts +0 -19
  90. package/components/anchor-v2/src/components/anchor-vertical-v2/anchor-vertical-list-v2.component.d.ts +0 -16
  91. package/components/anchor-v2/src/components/index.d.ts +0 -2
  92. package/components/anchor-v2/src/index.d.ts +0 -2
  93. package/components/anchor-v2/src/models/index.d.ts +0 -1
  94. package/components/anchor-v2/src/models/sd-anchor-v2.model.d.ts +0 -7
  95. package/components/workflow/index.d.ts +0 -2
  96. package/components/workflow/src/configurations/index.d.ts +0 -1
  97. package/components/workflow/src/configurations/workflow.configuration.d.ts +0 -10
  98. package/fesm2022/sd-angular-core-components-anchor-v2.mjs +0 -151
  99. package/fesm2022/sd-angular-core-components-anchor-v2.mjs.map +0 -1
  100. package/fesm2022/sd-angular-core-components-workflow.mjs +0 -17
  101. package/fesm2022/sd-angular-core-components-workflow.mjs.map +0 -1
  102. package/fesm2022/sd-angular-core-services-firebase.mjs +0 -38
  103. package/fesm2022/sd-angular-core-services-firebase.mjs.map +0 -1
  104. package/sd-angular-core-19.0.0-beta.95.tgz +0 -0
  105. package/services/firebase/index.d.ts +0 -2
  106. package/services/firebase/src/firebase.model.d.ts +0 -8
  107. package/services/firebase/src/firebase.service.d.ts +0 -14
@@ -8,9 +8,7 @@ export * from '@sd-angular/core/components/table';
8
8
  export * from '@sd-angular/core/components/quick-action';
9
9
  export * from '@sd-angular/core/components/upload-file';
10
10
  export * from '@sd-angular/core/components/section';
11
- export * from '@sd-angular/core/components/workflow';
12
11
  export * from '@sd-angular/core/components/anchor';
13
- export * from '@sd-angular/core/components/anchor-v2';
14
12
  export * from '@sd-angular/core/components/query-builder';
15
13
  export * from '@sd-angular/core/components/import-excel';
16
14
  export * from '@sd-angular/core/components/document-builder';
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components.mjs","sources":["../../../projects/sd-angular/components/sd-angular-core-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
1
+ {"version":3,"file":"sd-angular-core-components.mjs","sources":["../../../projects/sd-angular/components/sd-angular-core-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
@@ -18,10 +18,17 @@ import { SdSuffixDefDirective, SdViewDefDirective } from '@sd-angular/core/forms
18
18
  import { SdLabel } from '@sd-angular/core/forms/label';
19
19
  import { SD_FORM_CONFIGURATION, SdFormControl, HandleSdCustomValidator } from '@sd-angular/core/forms/models';
20
20
  import { I18nService, TranslatePipe } from '@sd-angular/core/i18n';
21
- import { SdPatternCommons } from '@sd-angular/core/utilities/models';
21
+ import { VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';
22
22
  import { Subscription } from 'rxjs';
23
23
  import * as uuid from 'uuid';
24
24
 
25
+ // Back-compat: SdPatternType cũ → ValidationPatternType mới.
26
+ // 3 key đã đổi tên trong @sdcorejs/utils v1.x.
27
+ const LEGACY_PATTERN_ALIAS = {
28
+ PHONE_VN: 'VN_PHONE',
29
+ IDVN: 'VN_ID',
30
+ IDVN_OR_PASSPORT: 'VN_ID_OR_PASSPORT',
31
+ };
25
32
  class SdInput {
26
33
  id = `I${uuid.v4()}`;
27
34
  // ==========================================
@@ -79,18 +86,26 @@ class SdInput {
79
86
  maxlength = input(undefined, { transform: v => (v == null ? undefined : Number(v)) });
80
87
  pattern = input();
81
88
  patternErrorMessage = input();
89
+ // Bỏ qua nếu val không phải string (number/boolean/object truyền nhầm → tránh validator hỏng)
90
+ #lookupPattern = (val) => {
91
+ if (typeof val !== 'string')
92
+ return undefined;
93
+ const key = (LEGACY_PATTERN_ALIAS[val] ?? val);
94
+ return VALIDATION_PATTERNS.find(e => e.type === key);
95
+ };
82
96
  resolvedPattern = computed(() => {
83
97
  const val = this.pattern();
84
- const patternObj = SdPatternCommons.find(e => e.type === val);
85
- return patternObj ? patternObj.regex : (val ?? undefined);
98
+ if (typeof val !== 'string')
99
+ return undefined;
100
+ const patternObj = this.#lookupPattern(val);
101
+ return patternObj ? patternObj.pattern : val;
86
102
  });
87
103
  resolvedPatternErrorMsg = computed(() => {
88
- const val = this.pattern();
89
- const patternObj = SdPatternCommons.find(e => e.type === val);
90
104
  // patternObj.errorMessage là i18n key (vd 'core.validator.email.error') → wrap qua i18n.t() để hiển thị string đã dịch
91
105
  const customMsg = this.patternErrorMessage();
92
106
  if (customMsg)
93
107
  return customMsg;
108
+ const patternObj = this.#lookupPattern(this.pattern());
94
109
  return patternObj ? this.#i18n.t(patternObj.errorMessage) : undefined;
95
110
  });
96
111
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-forms-input.mjs","sources":["../../../projects/sd-angular/forms/input/src/input.component.ts","../../../projects/sd-angular/forms/input/src/input.component.html","../../../projects/sd-angular/forms/input/sd-angular-core-forms-input.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n contentChild,\r\n effect,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n Output,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormGroup,\r\n FormsModule,\r\n NgForm,\r\n ReactiveFormsModule,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { SdView } from '@sd-angular/core/components/view';\r\nimport { SdSuffixDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { HandleSdCustomValidator, SD_FORM_CONFIGURATION, SdCustomValidator, SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { I18nService, TranslatePipe } from '@sd-angular/core/i18n';\r\nimport { SdPatternCommons, SdPatternType, SdSize } from '@sd-angular/core/utilities/models';\r\nimport { Subscription } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\n\r\n@Component({\r\n selector: 'sd-input',\r\n templateUrl: './input.component.html',\r\n styleUrls: ['./input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n MatButtonModule,\r\n SdLabel,\r\n SdView,\r\n TranslatePipe,\r\n ],\r\n})\r\nexport class SdInput implements OnDestroy, OnInit, AfterViewInit {\r\n id = `I${uuid.v4()}`;\r\n\r\n // ==========================================\r\n // 1. SIGNAL QUERIES (Thay thế @ViewChild / @ContentChild)\r\n // ==========================================\r\n control = viewChild<ElementRef<HTMLInputElement>>('control');\r\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\r\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\r\n sdSuffixDef = contentChild(SdSuffixDefDirective);\r\n sdViewDef = contentChild(SdViewDefDirective);\r\n\r\n // ==========================================\r\n // 2. SIGNAL INPUTS & MODEL\r\n // ==========================================\r\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n autoId = computed(() => (this.autoIdInput() ? `forms-input-${this.autoIdInput()}` : undefined));\r\n name = input<string>(uuid.v4());\r\n\r\n // ==========================================\r\n // 3. INJECT (Thay thế Constructor DI)\r\n // ==========================================\r\n #ref = inject(ChangeDetectorRef);\r\n #formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\r\n readonly #i18n = inject(I18nService);\r\n\r\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\r\n appearance = computed(() => this.appearanceInput() ?? this.#formConfig?.appearance ?? 'outline');\r\n\r\n floatLabel = input<FloatLabelType>('auto');\r\n\r\n size = input<SdSize>('md');\r\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\r\n form = input<FormGroup | undefined, any>(undefined, {\r\n transform: (val: any): FormGroup | undefined => {\r\n if (!val) return undefined;\r\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\r\n if (val instanceof NgForm) return val.form;\r\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\r\n if (val instanceof FormGroup) return val;\r\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\r\n if (val?.form instanceof FormGroup) return val.form;\r\n return undefined;\r\n },\r\n });\r\n label = input<string | undefined>();\r\n helperText = input<string | undefined>();\r\n placeholder = input<string | undefined>();\r\n type = input<'text' | 'number' | 'password' | 'email'>('text');\r\n\r\n hideInlineError = input(false, { transform: booleanAttribute });\r\n blurOnEnter = input(false, { transform: booleanAttribute });\r\n required = input(false, { transform: booleanAttribute });\r\n readonly = input(false, { transform: booleanAttribute });\r\n disabled = input(false, { transform: booleanAttribute });\r\n viewed = input(false, { transform: booleanAttribute });\r\n\r\n minlength = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\r\n maxlength = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\r\n\r\n pattern = input<SdPatternType | string | undefined | null>();\r\n patternErrorMessage = input<string | undefined | null>();\r\n\r\n resolvedPattern = computed(() => {\r\n const val = this.pattern();\r\n const patternObj = SdPatternCommons.find(e => e.type === val);\r\n return patternObj ? patternObj.regex : (val ?? undefined);\r\n });\r\n\r\n resolvedPatternErrorMsg = computed(() => {\r\n const val = this.pattern();\r\n const patternObj = SdPatternCommons.find(e => e.type === val);\r\n // patternObj.errorMessage là i18n key (vd 'core.validator.email.error') → wrap qua i18n.t() để hiển thị string đã dịch\r\n const customMsg = this.patternErrorMessage();\r\n if (customMsg) return customMsg;\r\n return patternObj ? this.#i18n.t(patternObj.errorMessage) : undefined;\r\n });\r\n\r\n /**\r\n * Tổng hợp error message đầu tiên để hiển thị trong tooltip khi hideInlineError = true.\r\n * Dùng getter (không phải computed) vì formControl.errors không phải Angular signal.\r\n * cdRef.markForCheck() được gọi qua sdChanges subscription nên getter sẽ được re-evaluate đúng cycle.\r\n */\r\n get errorTooltipMessage(): string | undefined {\r\n const errors = this.formControl.errors;\r\n if (!errors) return undefined;\r\n\r\n if (errors['required']) return this.#i18n.t('core.form.input.required');\r\n if (errors['maxlength']) return this.#i18n.t('core.form.input.maxlength', { max: this.maxlength() ?? '' });\r\n if (errors['pattern']) return this.resolvedPatternErrorMsg() || this.#i18n.t('core.form.input.invalid-pattern');\r\n if (errors['customValidator']) return errors['customValidator'] as string;\r\n if (errors['inlineError']) return this.inlineError();\r\n return undefined;\r\n }\r\n\r\n validator = input<SdCustomValidator | undefined>();\r\n inlineError = input<string | undefined>();\r\n hyperlink = input<string | null | undefined>();\r\n tooltip = input<string | undefined>();\r\n\r\n valueModel = model<any>(undefined, { alias: 'model' });\r\n\r\n // ==========================================\r\n // 4. SIGNAL OUTPUTS (Thay thế @Output)\r\n // ==========================================\r\n sdChange = output<any>();\r\n sdFocus = output<void>(); // Đổi sang void vì không truyền data\r\n sdBlur = output<any>();\r\n keyupEnter = output<any>();\r\n\r\n // 🚨 GIỮ LẠI EVENT_EMITTER DUY NHẤT VÌ CẦN CHECK OBSERVERED\r\n @Output() sdFocusForceBlur = new EventEmitter<void>();\r\n\r\n formControl = new SdFormControl();\r\n #subscription = new Subscription();\r\n isFocused = false;\r\n\r\n constructor() {\r\n effect(() => {\r\n const val = this.valueModel();\r\n untracked(() => {\r\n if (this.formControl.value !== val) {\r\n this.formControl.setValue(val, { emitEvent: false });\r\n }\r\n });\r\n });\r\n\r\n effect(() => {\r\n if (this.disabled()) {\r\n this.formControl.disable({ emitEvent: false });\r\n } else {\r\n this.formControl.enable({ emitEvent: false });\r\n }\r\n });\r\n\r\n effect(() => {\r\n const req = this.required();\r\n const min = this.minlength();\r\n const max = this.maxlength();\r\n const pat = this.resolvedPattern();\r\n const inl = this.inlineError();\r\n const val = this.validator();\r\n\r\n untracked(() => {\r\n this.#updateValidator(req, min, max, pat, inl, val);\r\n });\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.#subscription.add(\r\n this.formControl.sdChanges.subscribe(() => {\r\n this.#ref.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(this.formControl.valueChanges.subscribe(this.#onChange));\r\n\r\n const formGroup = this.form();\r\n formGroup?.addControl(this.name(), this.formControl);\r\n\r\n this.#ref.detectChanges();\r\n }\r\n\r\n ngOnDestroy() {\r\n const formGroup = this.form();\r\n formGroup?.removeControl(this.name());\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n reValidate = () => {\r\n this.formControl.updateValueAndValidity();\r\n };\r\n\r\n #updateValidator = (\r\n req: boolean,\r\n min: number | undefined,\r\n max: number | undefined,\r\n pat: string | undefined,\r\n inl: string | undefined,\r\n val: SdCustomValidator | undefined\r\n ) => {\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n\r\n if (req) validators.push(Validators.required);\r\n if (min && min > 0) validators.push(Validators.minLength(min));\r\n if (max && max > 0) validators.push(Validators.maxLength(max));\r\n if (pat) validators.push(Validators.pattern(pat));\r\n if (inl) validators.push(this.customInlineErrorValidator());\r\n if (val) asyncValidators.push(HandleSdCustomValidator(val));\r\n\r\n this.formControl.setValidators(validators.length ? validators : null);\r\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n };\r\n\r\n customInlineErrorValidator(): ValidatorFn {\r\n return (): Record<string, any> | null => ({ inlineError: true });\r\n }\r\n\r\n getCurrentLength = (): number => {\r\n return (this.formControl.value ?? '').toString().length;\r\n };\r\n\r\n isMaxlengthExceeded = (): boolean => {\r\n const max = this.maxlength();\r\n return !!(max && max > 0 && this.getCurrentLength() > max);\r\n };\r\n\r\n #onChange = () => {\r\n const value = this.formControl.value ?? '';\r\n\r\n this.valueModel.set(value);\r\n this.sdChange.emit(value);\r\n };\r\n\r\n onKeyupEnter = () => {\r\n const val: string = (this.formControl.value ?? '').toString();\r\n if (val.length > val.trim().length) {\r\n this.formControl.setValue(val.trim());\r\n }\r\n this.keyupEnter.emit(this.formControl.value);\r\n if (this.blurOnEnter()) {\r\n this.blur();\r\n }\r\n };\r\n\r\n onFocus = () => {\r\n this.isFocused = true;\r\n this.sdFocus.emit(); // Gọi .emit() y hệt như cũ\r\n\r\n if (this.sdFocusForceBlur.observed) {\r\n this.blur();\r\n this.sdFocusForceBlur.emit();\r\n }\r\n };\r\n\r\n onBlur = () => {\r\n this.isFocused = false;\r\n const val: string = (this.formControl.value ?? '').toString();\r\n if (val.length > val.trim().length) {\r\n this.formControl.setValue(val.trim());\r\n }\r\n this.sdBlur.emit(this.formControl.value);\r\n };\r\n\r\n onClick = () => {\r\n // 🚨 GỌI SIGNAL: Phải thêm () vào sdViewDef\r\n if (this.sdViewDef()?.templateRef) {\r\n if (!this.formControl.disabled && !this.isFocused) {\r\n this.focus();\r\n }\r\n }\r\n };\r\n\r\n blur = () => {\r\n this.isFocused = false;\r\n // 🚨 GỌI SIGNAL: Phải thêm () vào control\r\n this.control()?.nativeElement?.blur();\r\n };\r\n\r\n focus = () => {\r\n this.isFocused = true;\r\n setTimeout(() => {\r\n // 🚨 GỌI SIGNAL: Phải thêm () vào control\r\n this.control()?.nativeElement?.focus();\r\n }, 100);\r\n };\r\n}\r\n\r\nexport function backendErrorValidator(backendErrorMessage: string): ValidatorFn {\r\n return (control: AbstractControl): Record<string, any> | null => {\r\n const value = control.value as string;\r\n if (value === backendErrorMessage) {\r\n return { backendError: true };\r\n }\r\n return null;\r\n };\r\n}\r\n","@let _label = label();\r\n@let _appearance = appearance();\r\n@let _hideInlineError = hideInlineError();\r\n@let _viewDef = sdViewDef();\r\n@let _helperText = helperText();\r\n@let _tooltip = tooltip();\r\n@let _maxLength = maxlength();\r\n@let _errorMessage = errorTooltipMessage;\r\n@let _required = required();\r\n\r\n@if (viewed()) {\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"formControl.value\"\r\n [display]=\"formControl.value\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"sdValueTemplate()\">\r\n </sd-view>\r\n} @else {\r\n @if (!_appearance) {\r\n <ng-content select=\"[sdLabel]\">\r\n @if (_label) {\r\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\r\n }\r\n </ng-content>\r\n }\r\n\r\n <div\r\n class=\"d-flex align-items-center sd-input-container\"\r\n [class.sd-view]=\"!!_viewDef?.templateRef\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\"\r\n aria-hidden=\"true\">\r\n @if (_viewDef?.templateRef && !isFocused) {\r\n <ng-container *ngTemplateOutlet=\"_viewDef!.templateRef; context: { value: formControl.value }\"> </ng-container>\r\n } @else {\r\n <div class=\"sd-input-field-wrap\">\r\n <mat-form-field\r\n [class.sd-md]=\"size() === 'md'\"\r\n [class.sd-sm]=\"size() === 'sm'\"\r\n [class.hide-inline-error]=\"_hideInlineError\"\r\n [class.sd-form-tooltip]=\"!!_tooltip\"\r\n [appearance]=\"_appearance!\"\r\n [floatLabel]=\"floatLabel()\">\r\n @if (_appearance && _label) {\r\n <mat-label style=\"display: inline-block\">\r\n <div style=\"display: flex; align-items: center; gap: 4px\">\r\n <span>{{ _label }}</span>\r\n @if (_helperText) {\r\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\r\n }\r\n </div>\r\n </mat-label>\r\n }\r\n\r\n <input\r\n aria-hidden=\"true\"\r\n [id]=\"id\"\r\n [formControl]=\"formControl\"\r\n [type]=\"type()\"\r\n #control\r\n matInput\r\n [placeholder]=\"placeholder() || _label || ''\"\r\n (keyup.enter)=\"onKeyupEnter()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n [required]=\"_required\"\r\n [readonly]=\"readonly()\"\r\n [autocomplete]=\"id\"\r\n autocorrect=\"off\"\r\n [step]=\"1\"\r\n [attr.data-autoId]=\"autoId()\" />\r\n\r\n @if (_hideInlineError && _errorMessage && formControl.touched) {\r\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\r\n }\r\n\r\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\r\n <mat-error>{{ _errorMessage }}</mat-error>\r\n }\r\n\r\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\r\n <ng-container matSuffix>\r\n <ng-container *ngTemplateOutlet=\"suffixRef\"></ng-container>\r\n </ng-container>\r\n }\r\n <!-- <ng-container matSuffix>\r\n <ng-content select=\"[sdSuffix]\"></ng-content>\r\n </ng-container> -->\r\n </mat-form-field>\r\n\r\n @if (_maxLength && !_hideInlineError && !formControl.disabled) {\r\n <div\r\n class=\"sd-maxlength-counter\"\r\n [class.sd-maxlength-counter--visible]=\"isFocused\"\r\n [class.sd-maxlength-counter--exceeded]=\"isMaxlengthExceeded()\"\r\n [attr.title]=\"isMaxlengthExceeded() ? ('core.form.input.exceeded' | translate) : null\">\r\n {{ getCurrentLength() }}/{{ _maxLength }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (_tooltip) {\r\n <div class=\"sd-tooltip\">\r\n <mat-icon (click)=\"sdTooltip.toggle()\" [matTooltip]=\"formControl.value || _tooltip\" matSuffix #sdTooltip=\"matTooltip\">info</mat-icon>\r\n </div>\r\n }\r\n }\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;MAmEa,OAAO,CAAA;AAClB,IAAA,EAAE,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE,EAAE;;;;AAKpB,IAAA,OAAO,GAAG,SAAS,CAA+B,SAAS,CAAC;AAC5D,IAAA,eAAe,GAAG,YAAY,CAAmB,SAAS,CAAC;AAC3D,IAAA,eAAe,GAAG,YAAY,CAAmB,SAAS,CAAC;AAC3D,IAAA,WAAW,GAAG,YAAY,CAAC,oBAAoB,CAAC;AAChD,IAAA,SAAS,GAAG,YAAY,CAAC,kBAAkB,CAAC;;;;IAK5C,WAAW,GAAG,KAAK,CAA4B,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC9E,MAAM,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,CAAA,YAAA,EAAe,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE,GAAG,SAAS,CAAC,CAAC;IAC/F,IAAI,GAAG,KAAK,CAAS,IAAI,CAAC,EAAE,EAAE,CAAC;;;;AAK/B,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAChC,WAAW,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtD,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IAEpC,eAAe,GAAG,KAAK,CAAqC,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAC/F,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,UAAU,IAAI,SAAS,CAAC;AAEhG,IAAA,UAAU,GAAG,KAAK,CAAiB,MAAM,CAAC;AAE1C,IAAA,IAAI,GAAG,KAAK,CAAS,IAAI,CAAC;;AAE1B,IAAA,IAAI,GAAG,KAAK,CAA6B,SAAS,EAAE;AAClD,QAAA,SAAS,EAAE,CAAC,GAAQ,KAA2B;AAC7C,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,SAAS;;YAE1B,IAAI,GAAG,YAAY,MAAM;gBAAE,OAAO,GAAG,CAAC,IAAI;;YAE1C,IAAI,GAAG,YAAY,SAAS;AAAE,gBAAA,OAAO,GAAG;;AAExC,YAAA,IAAI,GAAG,EAAE,IAAI,YAAY,SAAS;gBAAE,OAAO,GAAG,CAAC,IAAI;AACnD,YAAA,OAAO,SAAS;QAClB,CAAC;AACF,KAAA,CAAC;IACF,KAAK,GAAG,KAAK,EAAsB;IACnC,UAAU,GAAG,KAAK,EAAsB;IACxC,WAAW,GAAG,KAAK,EAAsB;AACzC,IAAA,IAAI,GAAG,KAAK,CAA2C,MAAM,CAAC;IAE9D,eAAe,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC/D,WAAW,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC3D,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACxD,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAEtD,IAAA,SAAS,GAAG,KAAK,CAA8B,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClH,IAAA,SAAS,GAAG,KAAK,CAA8B,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElH,OAAO,GAAG,KAAK,EAA6C;IAC5D,mBAAmB,GAAG,KAAK,EAA6B;AAExD,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAC1B,QAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;AAC7D,QAAA,OAAO,UAAU,GAAG,UAAU,CAAC,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC3D,IAAA,CAAC,CAAC;AAEF,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAC1B,QAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;;AAE7D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC5C,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,SAAS;AAC/B,QAAA,OAAO,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,SAAS;AACvE,IAAA,CAAC,CAAC;AAEF;;;;AAIG;AACH,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM;AACtC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,SAAS;QAE7B,IAAI,MAAM,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0BAA0B,CAAC;QACvE,IAAI,MAAM,CAAC,WAAW,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1G,IAAI,MAAM,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,uBAAuB,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAiC,CAAC;QAC/G,IAAI,MAAM,CAAC,iBAAiB,CAAC;AAAE,YAAA,OAAO,MAAM,CAAC,iBAAiB,CAAW;QACzE,IAAI,MAAM,CAAC,aAAa,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE;AACpD,QAAA,OAAO,SAAS;IAClB;IAEA,SAAS,GAAG,KAAK,EAAiC;IAClD,WAAW,GAAG,KAAK,EAAsB;IACzC,SAAS,GAAG,KAAK,EAA6B;IAC9C,OAAO,GAAG,KAAK,EAAsB;IAErC,UAAU,GAAG,KAAK,CAAM,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;;;IAKtD,QAAQ,GAAG,MAAM,EAAO;AACxB,IAAA,OAAO,GAAG,MAAM,EAAQ,CAAC;IACzB,MAAM,GAAG,MAAM,EAAO;IACtB,UAAU,GAAG,MAAM,EAAO;;AAGhB,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAQ;AAErD,IAAA,WAAW,GAAG,IAAI,aAAa,EAAE;AACjC,IAAA,aAAa,GAAG,IAAI,YAAY,EAAE;IAClC,SAAS,GAAG,KAAK;AAEjB,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;YAC7B,SAAS,CAAC,MAAK;gBACb,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,EAAE;AAClC,oBAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACtD;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAChD;iBAAO;gBACL,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC/C;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE;AAClC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;YAE5B,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACrD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;QAC1B,CAAC,CAAC,CACH;IACH;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAE/E,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE;AAC7B,QAAA,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC;AAEpD,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;IAC3B;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE;QAC7B,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;IAClC;IAEA,UAAU,GAAG,MAAK;AAChB,QAAA,IAAI,CAAC,WAAW,CAAC,sBAAsB,EAAE;AAC3C,IAAA,CAAC;AAED,IAAA,gBAAgB,GAAG,CACjB,GAAY,EACZ,GAAuB,EACvB,GAAuB,EACvB,GAAuB,EACvB,GAAuB,EACvB,GAAkC,KAChC;QACF,MAAM,UAAU,GAAkB,EAAE;QACpC,MAAM,eAAe,GAAuB,EAAE;AAE9C,QAAA,IAAI,GAAG;AAAE,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC7C,QAAA,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC9D,QAAA,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC9D,QAAA,IAAI,GAAG;YAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACjD,QAAA,IAAI,GAAG;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;AAC3D,QAAA,IAAI,GAAG;YAAE,eAAe,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAE3D,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;AACrE,QAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,eAAe,CAAC,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;QACpF,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/D,IAAA,CAAC;IAED,0BAA0B,GAAA;QACxB,OAAO,OAAmC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAClE;IAEA,gBAAgB,GAAG,MAAa;AAC9B,QAAA,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM;AACzD,IAAA,CAAC;IAED,mBAAmB,GAAG,MAAc;AAClC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;AAC5B,QAAA,OAAO,CAAC,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,GAAG,CAAC;AAC5D,IAAA,CAAC;IAED,SAAS,GAAG,MAAK;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;AAE1C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,IAAA,CAAC;IAED,YAAY,GAAG,MAAK;AAClB,QAAA,MAAM,GAAG,GAAW,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE;QAC7D,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE;YAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACvC;QACA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,IAAI,CAAC,IAAI,EAAE;QACb;AACF,IAAA,CAAC;IAED,OAAO,GAAG,MAAK;AACb,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAEpB,QAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;YAClC,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAC9B;AACF,IAAA,CAAC;IAED,MAAM,GAAG,MAAK;AACZ,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,MAAM,GAAG,GAAW,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE;QAC7D,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE;YAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACvC;QACA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1C,IAAA,CAAC;IAED,OAAO,GAAG,MAAK;;AAEb,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACjD,IAAI,CAAC,KAAK,EAAE;YACd;QACF;AACF,IAAA,CAAC;IAED,IAAI,GAAG,MAAK;AACV,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;;QAEtB,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;AACvC,IAAA,CAAC;IAED,KAAK,GAAG,MAAK;AACX,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,UAAU,CAAC,MAAK;;YAEd,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;QACxC,CAAC,EAAE,GAAG,CAAC;AACT,IAAA,CAAC;wGA9QU,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EASS,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACtB,kBAAkB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7E7C,wtIAgHA,EAAA,MAAA,EAAA,CAAA,+hLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1DI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACN,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGJ,OAAO,EAAA,UAAA,EAAA,CAAA;kBApBnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,mBAGH,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,kBAAkB;wBAClB,cAAc;wBACd,aAAa;wBACb,gBAAgB;wBAChB,eAAe;wBACf,OAAO;wBACP,MAAM;wBACN,aAAa;AACd,qBAAA,EAAA,QAAA,EAAA,wtIAAA,EAAA,MAAA,EAAA,CAAA,+hLAAA,CAAA,EAAA;wDAiHS,gBAAgB,EAAA,CAAA;sBAAzB;;AAkKG,SAAU,qBAAqB,CAAC,mBAA2B,EAAA;IAC/D,OAAO,CAAC,OAAwB,KAAgC;AAC9D,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAe;AACrC,QAAA,IAAI,KAAK,KAAK,mBAAmB,EAAE;AACjC,YAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE;QAC/B;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACH;;AE5VA;;AAEG;;;;"}
1
+ {"version":3,"file":"sd-angular-core-forms-input.mjs","sources":["../../../projects/sd-angular/forms/input/src/input.component.ts","../../../projects/sd-angular/forms/input/src/input.component.html","../../../projects/sd-angular/forms/input/sd-angular-core-forms-input.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n contentChild,\r\n effect,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n Output,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormGroup,\r\n FormsModule,\r\n NgForm,\r\n ReactiveFormsModule,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { SdView } from '@sd-angular/core/components/view';\r\nimport { SdSuffixDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { HandleSdCustomValidator, SD_FORM_CONFIGURATION, SdCustomValidator, SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { I18nService, TranslatePipe } from '@sd-angular/core/i18n';\r\nimport { SdSize } from '@sd-angular/core/utilities/models';\r\nimport type { ValidationPatternType } from '@sdcorejs/utils/models';\r\nimport { VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';\r\n\r\n// Back-compat: SdPatternType cũ → ValidationPatternType mới.\r\n// 3 key đã đổi tên trong @sdcorejs/utils v1.x.\r\nconst LEGACY_PATTERN_ALIAS: Record<string, ValidationPatternType> = {\r\n PHONE_VN: 'VN_PHONE',\r\n IDVN: 'VN_ID',\r\n IDVN_OR_PASSPORT: 'VN_ID_OR_PASSPORT',\r\n};\r\nimport { Subscription } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\n\r\n@Component({\r\n selector: 'sd-input',\r\n templateUrl: './input.component.html',\r\n styleUrls: ['./input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n MatButtonModule,\r\n SdLabel,\r\n SdView,\r\n TranslatePipe,\r\n ],\r\n})\r\nexport class SdInput implements OnDestroy, OnInit, AfterViewInit {\r\n id = `I${uuid.v4()}`;\r\n\r\n // ==========================================\r\n // 1. SIGNAL QUERIES (Thay thế @ViewChild / @ContentChild)\r\n // ==========================================\r\n control = viewChild<ElementRef<HTMLInputElement>>('control');\r\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\r\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\r\n sdSuffixDef = contentChild(SdSuffixDefDirective);\r\n sdViewDef = contentChild(SdViewDefDirective);\r\n\r\n // ==========================================\r\n // 2. SIGNAL INPUTS & MODEL\r\n // ==========================================\r\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n autoId = computed(() => (this.autoIdInput() ? `forms-input-${this.autoIdInput()}` : undefined));\r\n name = input<string>(uuid.v4());\r\n\r\n // ==========================================\r\n // 3. INJECT (Thay thế Constructor DI)\r\n // ==========================================\r\n #ref = inject(ChangeDetectorRef);\r\n #formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\r\n readonly #i18n = inject(I18nService);\r\n\r\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\r\n appearance = computed(() => this.appearanceInput() ?? this.#formConfig?.appearance ?? 'outline');\r\n\r\n floatLabel = input<FloatLabelType>('auto');\r\n\r\n size = input<SdSize>('md');\r\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\r\n form = input<FormGroup | undefined, any>(undefined, {\r\n transform: (val: any): FormGroup | undefined => {\r\n if (!val) return undefined;\r\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\r\n if (val instanceof NgForm) return val.form;\r\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\r\n if (val instanceof FormGroup) return val;\r\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\r\n if (val?.form instanceof FormGroup) return val.form;\r\n return undefined;\r\n },\r\n });\r\n label = input<string | undefined>();\r\n helperText = input<string | undefined>();\r\n placeholder = input<string | undefined>();\r\n type = input<'text' | 'number' | 'password' | 'email'>('text');\r\n\r\n hideInlineError = input(false, { transform: booleanAttribute });\r\n blurOnEnter = input(false, { transform: booleanAttribute });\r\n required = input(false, { transform: booleanAttribute });\r\n readonly = input(false, { transform: booleanAttribute });\r\n disabled = input(false, { transform: booleanAttribute });\r\n viewed = input(false, { transform: booleanAttribute });\r\n\r\n minlength = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\r\n maxlength = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\r\n\r\n pattern = input<ValidationPatternType | string | undefined | null>();\r\n patternErrorMessage = input<string | undefined | null>();\r\n\r\n // Bỏ qua nếu val không phải string (number/boolean/object truyền nhầm → tránh validator hỏng)\r\n #lookupPattern = (val: unknown) => {\r\n if (typeof val !== 'string') return undefined;\r\n const key = (LEGACY_PATTERN_ALIAS[val] ?? val) as ValidationPatternType;\r\n return VALIDATION_PATTERNS.find(e => e.type === key);\r\n };\r\n\r\n resolvedPattern = computed(() => {\r\n const val = this.pattern();\r\n if (typeof val !== 'string') return undefined;\r\n const patternObj = this.#lookupPattern(val);\r\n return patternObj ? patternObj.pattern : val;\r\n });\r\n\r\n resolvedPatternErrorMsg = computed(() => {\r\n // patternObj.errorMessage là i18n key (vd 'core.validator.email.error') → wrap qua i18n.t() để hiển thị string đã dịch\r\n const customMsg = this.patternErrorMessage();\r\n if (customMsg) return customMsg;\r\n const patternObj = this.#lookupPattern(this.pattern());\r\n return patternObj ? this.#i18n.t(patternObj.errorMessage) : undefined;\r\n });\r\n\r\n /**\r\n * Tổng hợp error message đầu tiên để hiển thị trong tooltip khi hideInlineError = true.\r\n * Dùng getter (không phải computed) vì formControl.errors không phải Angular signal.\r\n * cdRef.markForCheck() được gọi qua sdChanges subscription nên getter sẽ được re-evaluate đúng cycle.\r\n */\r\n get errorTooltipMessage(): string | undefined {\r\n const errors = this.formControl.errors;\r\n if (!errors) return undefined;\r\n\r\n if (errors['required']) return this.#i18n.t('core.form.input.required');\r\n if (errors['maxlength']) return this.#i18n.t('core.form.input.maxlength', { max: this.maxlength() ?? '' });\r\n if (errors['pattern']) return this.resolvedPatternErrorMsg() || this.#i18n.t('core.form.input.invalid-pattern');\r\n if (errors['customValidator']) return errors['customValidator'] as string;\r\n if (errors['inlineError']) return this.inlineError();\r\n return undefined;\r\n }\r\n\r\n validator = input<SdCustomValidator | undefined>();\r\n inlineError = input<string | undefined>();\r\n hyperlink = input<string | null | undefined>();\r\n tooltip = input<string | undefined>();\r\n\r\n valueModel = model<any>(undefined, { alias: 'model' });\r\n\r\n // ==========================================\r\n // 4. SIGNAL OUTPUTS (Thay thế @Output)\r\n // ==========================================\r\n sdChange = output<any>();\r\n sdFocus = output<void>(); // Đổi sang void vì không truyền data\r\n sdBlur = output<any>();\r\n keyupEnter = output<any>();\r\n\r\n // 🚨 GIỮ LẠI EVENT_EMITTER DUY NHẤT VÌ CẦN CHECK OBSERVERED\r\n @Output() sdFocusForceBlur = new EventEmitter<void>();\r\n\r\n formControl = new SdFormControl();\r\n #subscription = new Subscription();\r\n isFocused = false;\r\n\r\n constructor() {\r\n effect(() => {\r\n const val = this.valueModel();\r\n untracked(() => {\r\n if (this.formControl.value !== val) {\r\n this.formControl.setValue(val, { emitEvent: false });\r\n }\r\n });\r\n });\r\n\r\n effect(() => {\r\n if (this.disabled()) {\r\n this.formControl.disable({ emitEvent: false });\r\n } else {\r\n this.formControl.enable({ emitEvent: false });\r\n }\r\n });\r\n\r\n effect(() => {\r\n const req = this.required();\r\n const min = this.minlength();\r\n const max = this.maxlength();\r\n const pat = this.resolvedPattern();\r\n const inl = this.inlineError();\r\n const val = this.validator();\r\n\r\n untracked(() => {\r\n this.#updateValidator(req, min, max, pat, inl, val);\r\n });\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.#subscription.add(\r\n this.formControl.sdChanges.subscribe(() => {\r\n this.#ref.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(this.formControl.valueChanges.subscribe(this.#onChange));\r\n\r\n const formGroup = this.form();\r\n formGroup?.addControl(this.name(), this.formControl);\r\n\r\n this.#ref.detectChanges();\r\n }\r\n\r\n ngOnDestroy() {\r\n const formGroup = this.form();\r\n formGroup?.removeControl(this.name());\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n reValidate = () => {\r\n this.formControl.updateValueAndValidity();\r\n };\r\n\r\n #updateValidator = (\r\n req: boolean,\r\n min: number | undefined,\r\n max: number | undefined,\r\n pat: string | undefined,\r\n inl: string | undefined,\r\n val: SdCustomValidator | undefined\r\n ) => {\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n\r\n if (req) validators.push(Validators.required);\r\n if (min && min > 0) validators.push(Validators.minLength(min));\r\n if (max && max > 0) validators.push(Validators.maxLength(max));\r\n if (pat) validators.push(Validators.pattern(pat));\r\n if (inl) validators.push(this.customInlineErrorValidator());\r\n if (val) asyncValidators.push(HandleSdCustomValidator(val));\r\n\r\n this.formControl.setValidators(validators.length ? validators : null);\r\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n };\r\n\r\n customInlineErrorValidator(): ValidatorFn {\r\n return (): Record<string, any> | null => ({ inlineError: true });\r\n }\r\n\r\n getCurrentLength = (): number => {\r\n return (this.formControl.value ?? '').toString().length;\r\n };\r\n\r\n isMaxlengthExceeded = (): boolean => {\r\n const max = this.maxlength();\r\n return !!(max && max > 0 && this.getCurrentLength() > max);\r\n };\r\n\r\n #onChange = () => {\r\n const value = this.formControl.value ?? '';\r\n\r\n this.valueModel.set(value);\r\n this.sdChange.emit(value);\r\n };\r\n\r\n onKeyupEnter = () => {\r\n const val: string = (this.formControl.value ?? '').toString();\r\n if (val.length > val.trim().length) {\r\n this.formControl.setValue(val.trim());\r\n }\r\n this.keyupEnter.emit(this.formControl.value);\r\n if (this.blurOnEnter()) {\r\n this.blur();\r\n }\r\n };\r\n\r\n onFocus = () => {\r\n this.isFocused = true;\r\n this.sdFocus.emit(); // Gọi .emit() y hệt như cũ\r\n\r\n if (this.sdFocusForceBlur.observed) {\r\n this.blur();\r\n this.sdFocusForceBlur.emit();\r\n }\r\n };\r\n\r\n onBlur = () => {\r\n this.isFocused = false;\r\n const val: string = (this.formControl.value ?? '').toString();\r\n if (val.length > val.trim().length) {\r\n this.formControl.setValue(val.trim());\r\n }\r\n this.sdBlur.emit(this.formControl.value);\r\n };\r\n\r\n onClick = () => {\r\n // 🚨 GỌI SIGNAL: Phải thêm () vào sdViewDef\r\n if (this.sdViewDef()?.templateRef) {\r\n if (!this.formControl.disabled && !this.isFocused) {\r\n this.focus();\r\n }\r\n }\r\n };\r\n\r\n blur = () => {\r\n this.isFocused = false;\r\n // 🚨 GỌI SIGNAL: Phải thêm () vào control\r\n this.control()?.nativeElement?.blur();\r\n };\r\n\r\n focus = () => {\r\n this.isFocused = true;\r\n setTimeout(() => {\r\n // 🚨 GỌI SIGNAL: Phải thêm () vào control\r\n this.control()?.nativeElement?.focus();\r\n }, 100);\r\n };\r\n}\r\n\r\nexport function backendErrorValidator(backendErrorMessage: string): ValidatorFn {\r\n return (control: AbstractControl): Record<string, any> | null => {\r\n const value = control.value as string;\r\n if (value === backendErrorMessage) {\r\n return { backendError: true };\r\n }\r\n return null;\r\n };\r\n}\r\n","@let _label = label();\r\n@let _appearance = appearance();\r\n@let _hideInlineError = hideInlineError();\r\n@let _viewDef = sdViewDef();\r\n@let _helperText = helperText();\r\n@let _tooltip = tooltip();\r\n@let _maxLength = maxlength();\r\n@let _errorMessage = errorTooltipMessage;\r\n@let _required = required();\r\n\r\n@if (viewed()) {\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"formControl.value\"\r\n [display]=\"formControl.value\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"sdValueTemplate()\">\r\n </sd-view>\r\n} @else {\r\n @if (!_appearance) {\r\n <ng-content select=\"[sdLabel]\">\r\n @if (_label) {\r\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\r\n }\r\n </ng-content>\r\n }\r\n\r\n <div\r\n class=\"d-flex align-items-center sd-input-container\"\r\n [class.sd-view]=\"!!_viewDef?.templateRef\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\"\r\n aria-hidden=\"true\">\r\n @if (_viewDef?.templateRef && !isFocused) {\r\n <ng-container *ngTemplateOutlet=\"_viewDef!.templateRef; context: { value: formControl.value }\"> </ng-container>\r\n } @else {\r\n <div class=\"sd-input-field-wrap\">\r\n <mat-form-field\r\n [class.sd-md]=\"size() === 'md'\"\r\n [class.sd-sm]=\"size() === 'sm'\"\r\n [class.hide-inline-error]=\"_hideInlineError\"\r\n [class.sd-form-tooltip]=\"!!_tooltip\"\r\n [appearance]=\"_appearance!\"\r\n [floatLabel]=\"floatLabel()\">\r\n @if (_appearance && _label) {\r\n <mat-label style=\"display: inline-block\">\r\n <div style=\"display: flex; align-items: center; gap: 4px\">\r\n <span>{{ _label }}</span>\r\n @if (_helperText) {\r\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\r\n }\r\n </div>\r\n </mat-label>\r\n }\r\n\r\n <input\r\n aria-hidden=\"true\"\r\n [id]=\"id\"\r\n [formControl]=\"formControl\"\r\n [type]=\"type()\"\r\n #control\r\n matInput\r\n [placeholder]=\"placeholder() || _label || ''\"\r\n (keyup.enter)=\"onKeyupEnter()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n [required]=\"_required\"\r\n [readonly]=\"readonly()\"\r\n [autocomplete]=\"id\"\r\n autocorrect=\"off\"\r\n [step]=\"1\"\r\n [attr.data-autoId]=\"autoId()\" />\r\n\r\n @if (_hideInlineError && _errorMessage && formControl.touched) {\r\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\r\n }\r\n\r\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\r\n <mat-error>{{ _errorMessage }}</mat-error>\r\n }\r\n\r\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\r\n <ng-container matSuffix>\r\n <ng-container *ngTemplateOutlet=\"suffixRef\"></ng-container>\r\n </ng-container>\r\n }\r\n <!-- <ng-container matSuffix>\r\n <ng-content select=\"[sdSuffix]\"></ng-content>\r\n </ng-container> -->\r\n </mat-form-field>\r\n\r\n @if (_maxLength && !_hideInlineError && !formControl.disabled) {\r\n <div\r\n class=\"sd-maxlength-counter\"\r\n [class.sd-maxlength-counter--visible]=\"isFocused\"\r\n [class.sd-maxlength-counter--exceeded]=\"isMaxlengthExceeded()\"\r\n [attr.title]=\"isMaxlengthExceeded() ? ('core.form.input.exceeded' | translate) : null\">\r\n {{ getCurrentLength() }}/{{ _maxLength }}\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (_tooltip) {\r\n <div class=\"sd-tooltip\">\r\n <mat-icon (click)=\"sdTooltip.toggle()\" [matTooltip]=\"formControl.value || _tooltip\" matSuffix #sdTooltip=\"matTooltip\">info</mat-icon>\r\n </div>\r\n }\r\n }\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -56,6 +56,13 @@ const EN_MESSAGES = {
56
56
  'core.docx.invalid-format': 'Invalid format. Please select a template in DOC or DOCX format',
57
57
  'core.docx.size-exceeded': 'Template file size exceeds the supported limit. Please try again',
58
58
  'core.docx.convert-error': 'An error occurred while converting the DOCX file',
59
+ // ---- Service: notify (toast) ----
60
+ 'core.notify.type.success': 'Success',
61
+ 'core.notify.type.info': 'Information',
62
+ 'core.notify.type.warning': 'Warning',
63
+ 'core.notify.type.error': 'Error',
64
+ 'core.notify.show-more': 'Show more ({count})',
65
+ 'core.notify.show-less': 'Show less',
59
66
  // ---- Service: confirm ----
60
67
  'core.confirm.title': 'Confirm',
61
68
  'core.confirm.yes': 'OK',
@@ -495,6 +502,13 @@ const JA_MESSAGES = {
495
502
  'core.docx.invalid-format': '形式が正しくありません。DOCまたはDOCX形式のテンプレートを選択してください',
496
503
  'core.docx.size-exceeded': 'テンプレートファイルのサイズが上限を超えています。もう一度お試しください',
497
504
  'core.docx.convert-error': 'DOCXファイルの変換中にエラーが発生しました',
505
+ // ---- Service: notify (toast) ----
506
+ 'core.notify.type.success': '成功',
507
+ 'core.notify.type.info': '情報',
508
+ 'core.notify.type.warning': '警告',
509
+ 'core.notify.type.error': 'エラー',
510
+ 'core.notify.show-more': 'もっと見る ({count})',
511
+ 'core.notify.show-less': '折りたたむ',
498
512
  // ---- Service: confirm ----
499
513
  'core.confirm.title': '確認',
500
514
  'core.confirm.yes': 'OK',
@@ -934,6 +948,13 @@ const KO_MESSAGES = {
934
948
  'core.docx.invalid-format': '형식이 올바르지 않습니다. DOC 또는 DOCX 형식의 템플릿을 선택해 주세요',
935
949
  'core.docx.size-exceeded': '템플릿 파일 크기가 지원 한도를 초과했습니다. 다시 시도해 주세요',
936
950
  'core.docx.convert-error': 'DOCX 파일 변환 중 오류가 발생했습니다',
951
+ // ---- Service: notify (toast) ----
952
+ 'core.notify.type.success': '성공',
953
+ 'core.notify.type.info': '정보',
954
+ 'core.notify.type.warning': '경고',
955
+ 'core.notify.type.error': '오류',
956
+ 'core.notify.show-more': '더 보기 ({count})',
957
+ 'core.notify.show-less': '접기',
937
958
  // ---- Service: confirm ----
938
959
  'core.confirm.title': '확인',
939
960
  'core.confirm.yes': '확인',
@@ -1373,6 +1394,13 @@ const VI_MESSAGES = {
1373
1394
  'core.docx.invalid-format': 'Định dạng không hợp lệ. Vui lòng chọn Mẫu có định dạng DOC hoặc DOCX',
1374
1395
  'core.docx.size-exceeded': 'Kích thước tệp mẫu vượt quá tiêu chuẩn hỗ trợ của hệ thống. Vui lòng thử lại',
1375
1396
  'core.docx.convert-error': 'Có lỗi xảy ra khi chuyển đổi file DOCX',
1397
+ // ---- Service: notify (toast) ----
1398
+ 'core.notify.type.success': 'Thành công',
1399
+ 'core.notify.type.info': 'Thông tin',
1400
+ 'core.notify.type.warning': 'Cảnh báo',
1401
+ 'core.notify.type.error': 'Lỗi',
1402
+ 'core.notify.show-more': 'Hiện thêm ({count})',
1403
+ 'core.notify.show-less': 'Thu gọn',
1376
1404
  // ---- Service: confirm ----
1377
1405
  'core.confirm.title': 'Xác nhận',
1378
1406
  'core.confirm.yes': 'Đồng ý',
@@ -1812,6 +1840,13 @@ const ZH_MESSAGES = {
1812
1840
  'core.docx.invalid-format': '格式不正确,请选择 DOC 或 DOCX 格式的模板',
1813
1841
  'core.docx.size-exceeded': '模板文件大小超出支持范围,请重试',
1814
1842
  'core.docx.convert-error': '转换 DOCX 文件时发生错误',
1843
+ // ---- Service: notify (toast) ----
1844
+ 'core.notify.type.success': '成功',
1845
+ 'core.notify.type.info': '信息',
1846
+ 'core.notify.type.warning': '警告',
1847
+ 'core.notify.type.error': '错误',
1848
+ 'core.notify.show-more': '显示更多 ({count})',
1849
+ 'core.notify.show-less': '收起',
1815
1850
  // ---- Service: confirm ----
1816
1851
  'core.confirm.title': '确认',
1817
1852
  'core.confirm.yes': '确定',