@sdcorejs/angular 20.1.3 → 20.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +17 -14
  2. package/components/audit-diff/index.d.ts +74 -0
  3. package/components/badge/index.d.ts +1 -1
  4. package/components/breadcrumb/index.d.ts +53 -0
  5. package/components/data-state/index.d.ts +44 -0
  6. package/components/document-builder/index.d.ts +5 -5
  7. package/components/form-generic/index.d.ts +67 -104
  8. package/components/import-excel/index.d.ts +4 -14
  9. package/components/index.d.ts +4 -0
  10. package/components/job-progress/index.d.ts +38 -0
  11. package/components/mini-editor/index.d.ts +9 -9
  12. package/components/modal/index.d.ts +7 -1
  13. package/components/preview/index.d.ts +181 -28
  14. package/components/side-drawer/index.d.ts +7 -1
  15. package/components/tab/index.d.ts +9 -2
  16. package/components/table/index.d.ts +8 -7
  17. package/components/tree/index.d.ts +24 -2
  18. package/components/upload-file/index.d.ts +5 -4
  19. package/directives/index.d.ts +10 -8
  20. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  21. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  23. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  24. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  25. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  27. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  28. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  29. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  30. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +18 -23
  31. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  33. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +495 -838
  35. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +24 -34
  37. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  39. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  40. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +10 -20
  41. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-modal.mjs +61 -4
  43. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components-preview.mjs +1438 -218
  45. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +4 -4
  47. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  49. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +39 -2
  51. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +16 -22
  53. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-components-tab.mjs +48 -4
  55. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-components-table.mjs +96 -63
  57. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-components-tree.mjs +186 -17
  59. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +15 -22
  61. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  63. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  65. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +7 -7
  67. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -83
  69. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +6 -3
  71. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-chip.mjs +6 -3
  73. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -13
  75. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-date.mjs +42 -65
  77. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +51 -66
  79. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  81. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  82. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +1 -1
  83. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +7 -5
  85. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-forms-input.mjs +290 -56
  87. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  89. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -78
  91. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -20
  93. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -76
  95. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +6 -5
  97. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +280 -0
  99. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  100. package/fesm2022/sdcorejs-angular-forms-time.mjs +310 -0
  101. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  102. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  103. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  104. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  105. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
  107. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  109. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-modules-layout.mjs +861 -80
  111. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  113. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  115. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  117. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  119. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  121. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-services-loading.mjs +339 -74
  123. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  125. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  127. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  128. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  129. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  131. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  132. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  133. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  134. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  135. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  136. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  137. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  138. package/forms/autocomplete/index.d.ts +3 -4
  139. package/forms/checkbox/index.d.ts +4 -8
  140. package/forms/date/index.d.ts +2 -2
  141. package/forms/date-range/index.d.ts +6 -7
  142. package/forms/datetime/index.d.ts +2 -2
  143. package/forms/entity-picker/index.d.ts +128 -0
  144. package/forms/index.d.ts +15 -5
  145. package/forms/input/index.d.ts +74 -11
  146. package/forms/input-number/index.d.ts +1 -1
  147. package/forms/models/index.d.ts +86 -3
  148. package/forms/radio/index.d.ts +12 -8
  149. package/forms/switch/index.d.ts +4 -7
  150. package/forms/time/index.d.ts +117 -0
  151. package/forms/time-range/index.d.ts +98 -0
  152. package/forms/tree-select/index.d.ts +76 -0
  153. package/i18n/index.d.ts +68 -2
  154. package/interceptors/index.d.ts +5 -6
  155. package/modules/layout/index.d.ts +288 -15
  156. package/package.json +49 -1
  157. package/pipes/index.d.ts +2 -2
  158. package/services/api/index.d.ts +68 -24
  159. package/services/cache/index.d.ts +52 -16
  160. package/services/confirm/index.d.ts +3 -2
  161. package/services/docx/index.d.ts +2 -3
  162. package/services/index.d.ts +4 -0
  163. package/services/loading/index.d.ts +16 -8
  164. package/services/persistence/index.d.ts +159 -0
  165. package/services/storage/index.d.ts +26 -8
  166. package/services/task/index.d.ts +104 -0
  167. package/services/unsaved-changes/index.d.ts +83 -0
  168. package/services/viewport/index.d.ts +42 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-forms-date.mjs","sources":["../../../projects/sdcorejs-angular/forms/date/src/date.component.ts","../../../projects/sdcorejs-angular/forms/date/src/date.component.html","../../../projects/sdcorejs-angular/forms/date/sdcorejs-angular-forms-date.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n input,\n model,\n computed,\n effect,\n untracked,\n OnDestroy,\n OnInit,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n} from '@angular/core';\nimport { AbstractControl, FormGroup, FormsModule, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\nimport { provideDateFnsAdapter } from '@angular/material-date-fns-adapter';\nimport { MAT_DATE_LOCALE } from '@angular/material/core';\nimport { MatDatepicker, MatDatepickerInputEvent, MatDatepickerModule } from '@angular/material/datepicker';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdLabelDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n SD_FORM_CONFIGURATION,\n SdFormControl,\n SdInlineErrorValidator,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { sdFormControlState } from '@sdcorejs/angular/forms/models';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { Size } from '@sdcorejs/utils/models';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { parse as parseDate } from 'date-fns';\nimport { enUS as dfEnUS } from 'date-fns/locale';\nimport { Subscription } from 'rxjs';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-date',\n templateUrl: './date.component.html',\n styleUrl: './date.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.sd-bare]': 'isInline()', '[class.sd-viewed]': 'isViewed() || isInline()', '[class.sd-has-label]': '!!label()' },\n providers: [\n // DateFnsAdapter inject MAT_DATE_LOCALE; nếu undefined sẽ throw khi format/parse.\n // Provide locale en-US tại scope component để hành vi giống Moment cũ (English default).\n { provide: MAT_DATE_LOCALE, useValue: dfEnUS },\n provideDateFnsAdapter({\n parse: { dateInput: 'dd/MM/yyyy' },\n display: {\n dateInput: 'dd/MM/yyyy',\n monthYearLabel: 'MMM yyyy',\n dateA11yLabel: 'PP',\n monthYearA11yLabel: 'MMMM yyyy',\n },\n }),\n ],\n standalone: true,\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatDatepickerModule,\n SdLabel,\n SdView,\n ],\n})\nexport class SdDate implements OnDestroy, OnInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n inputRef = viewChild<ElementRef<HTMLInputElement>>('input');\n datePicker = viewChild<MatDatepicker<Date>>(MatDatepicker);\n\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdViewDef = contentChild(SdViewDefDirective);\n sdLabelDef = contentChild(SdLabelDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private ref = inject(ChangeDetectorRef);\n private formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 3. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-date-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (calendar). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n /** Whether to show the value-gated clear button in edit and inline modes. */\n clearable = input(false, { transform: booleanAttribute });\n\n // Tri-state `viewed` — shared primitive. In `'inline'` the calendar editor is always mounted\n // (chrome hidden via CSS); the sd-view text face opens the calendar on click.\n readonly #viewedState = sdViewedInline(this.viewed, () => this.open(), this.disabled);\n /** `true` when `viewed === 'inline'`. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` (static view, no editor). */\n readonly isViewed = this.#viewedState.isViewed;\n /** Open the calendar from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n /** View display template: `sdViewDef` overrides the projected `#sdValue` (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.date.required');\n if (errors['matDatepickerMin']) {\n const d = this.resolvedMin();\n return this.#i18n.t('core.form.date.min-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['matDatepickerMax']) {\n const d = this.resolvedMax();\n return this.#i18n.t('core.form.date.max-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['matDatetimePickerParse'])\n return this.#i18n.t('core.form.date.parse-error', { text: errors['matDatetimePickerParse']?.text ?? '' });\n if (errors['date']) return errors['date'] as string;\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n hyperlink = input<string | null | undefined>();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n // Xử lý thông minh Gom min/minDate và max/maxDate\n minInput = input<any>(undefined, { alias: 'min' });\n minDateInput = input<any>(undefined, { alias: 'minDate' });\n resolvedMin = computed(() => this.#parseDateBoundary(this.minInput() ?? this.minDateInput()));\n\n maxInput = input<any>(undefined, { alias: 'max' });\n maxDateInput = input<any>(undefined, { alias: 'maxDate' });\n resolvedMax = computed(() => this.#parseDateBoundary(this.maxInput() ?? this.maxDateInput()));\n\n valueModel = model<string | number | Date | undefined | null>(undefined, { alias: 'model' });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>();\n\n // ==========================================\n // 5. INTERNAL STATE & STREAMS\n // ==========================================\n isMobileOrTablet = BrowserUtilities.isMobile();\n formControl = new SdFormControl();\n isFocused = false;\n isValid?: boolean;\n\n #date: string | undefined | null;\n #subscription = new Subscription();\n\n constructor() {\n // EFFECT 1: Sync model thay đổi từ bên ngoài (String/Date -> Date)\n // Material date-fns adapter dùng native Date làm internal type cho FormControl.\n effect(() => {\n let val = this.valueModel();\n untracked(() => {\n if (!DateUtilities.isDate(val)) {\n val = null;\n }\n val = DateUtilities.toFormat(val, 'yyyy/MM/dd');\n if (this.#date !== val) {\n this.#date = val;\n const dateObj = DateUtilities.isDate(this.#date)\n ? parseDate(DateUtilities.toFormat(this.#date, 'yyyy/MM/dd'), 'yyyy/MM/dd', new Date())\n : null;\n this.formControl.setValue(dateObj, { emitEvent: false });\n }\n });\n });\n\n // EFFECT 2: Sync Disable\n effect(() => {\n if (this.disabled()) this.formControl.disable({ emitEvent: false });\n else this.formControl.enable({ emitEvent: false });\n });\n\n // EFFECT 3: Update Validators\n effect(() => {\n const req = this.required();\n const inl = this.inlineError();\n\n untracked(() => {\n const validators: ValidatorFn[] = [];\n if (req) validators.push(Validators.required);\n if (inl) validators.push(SdInlineErrorValidator);\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n });\n });\n }\n\n ngOnInit() {\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n const formGroup = this.form();\n formGroup?.addControl(this.name(), this.formControl);\n }\n\n ngOnDestroy() {\n const formGroup = this.form();\n formGroup?.removeControl(this.name());\n this.#subscription.unsubscribe();\n }\n\n // Hàm private tái sử dụng cho parse Min/Max Date\n #parseDateBoundary(val: any): Date | null {\n if (val === 'TODAY') return new Date();\n if (val && DateUtilities.isDate(val)) return new Date(val);\n return null;\n }\n\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit();\n };\n\n onBlur = () => {\n this.isFocused = false;\n };\n\n onClick = () => {\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.inputRef()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n setTimeout(() => {\n this.inputRef()?.nativeElement?.focus();\n this.datePicker()?.open();\n }, 100);\n };\n\n /** Open the datepicker calendar programmatically (anchors to the field input). */\n open = () => {\n if (this.formControl.disabled) return;\n this.datePicker()?.open();\n };\n\n focusInputElement() {\n this.inputRef()?.nativeElement?.focus();\n }\n\n onKeyDown = (event: KeyboardEvent) => {\n const key = event.keyCode || event.charCode;\n const isShift = key === 16;\n\n if (event.ctrlKey && (key === 67 || key === 86)) return true;\n\n if (\n ((key >= 48 && key <= 57) ||\n key === 8 ||\n key <= 37 ||\n key <= 39 ||\n (key >= 96 && key <= 105) ||\n key === 191 ||\n key === 186 ||\n key === 59) &&\n !isShift\n ) {\n return true;\n }\n return false;\n };\n\n onKeyup = (event: any) => {\n const currentVal: string = event.target.value;\n const formControl: AbstractControl = this.formControl;\n const regex = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d$/g;\n\n if (currentVal && !regex.test(currentVal)) {\n setTimeout(() => {\n this.isValid = true;\n formControl.markAsDirty();\n formControl.markAsTouched();\n formControl.setErrors({ ...formControl.errors, date: this.#i18n.t('core.form.date.invalid-format') });\n }, 0);\n } else {\n setTimeout(() => {\n this.isValid = false;\n formControl.setErrors({ ...formControl.errors, date: null });\n this.formControl.updateValueAndValidity();\n }, 0);\n }\n };\n\n onChange = (event: MatDatepickerInputEvent<Date>) => {\n // event.value giờ là native Date (date-fns adapter), không cần .toDate() như Moment.\n const value = DateUtilities.toFormat(event.value, 'yyyy/MM/dd');\n this.inputRef()?.nativeElement?.focus();\n\n if (!this.isValid) {\n if (this.#date !== value) {\n this.valueModel.set(value);\n this.sdChange.emit(value);\n }\n } else {\n this.isValid = false;\n this.formControl.setValue(null);\n this.valueModel.set(null);\n this.sdChange.emit(null);\n }\n };\n\n clear = ($event: any) => {\n $event?.stopPropagation();\n if (this.formControl.value) {\n this.formControl.setValue(null);\n this.valueModel.set(null);\n this.sdChange.emit(null);\n }\n };\n}\n","@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _required = required();\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = !!formControl.value;\n\n@let _resolvedMin = resolvedMin();\n@let _resolvedMax = resolvedMax();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | date: 'dd/MM/yyyy'\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view là \"mặt\" + trigger; calendar editor render ẩn (.sd-inline-editor) chỉ để mở panel. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | date: 'dd/MM/yyyy'\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n class=\"c-form-field-date-input\"\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label class=\"sd-form-field-label\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\n }\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n matInput\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeyDown($event)\"\n (dateChange)=\"onChange($event)\"\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [formControl]=\"formControl\"\n [required]=\"_required\"\n [matDatepicker]=\"picker\"\n [placeholder]=\"placeholder() || _label || ''\"\n [min]=\"_resolvedMin\"\n [max]=\"_resolvedMax\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n #input\n [maxLength]=\"10\" />\n\n <mat-datepicker #picker [touchUi]=\"isMobileOrTablet\"></mat-datepicker>\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (clearable() && formControl.value && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" (click)=\"!formControl.disabled && picker.open()\" #btn matSuffix name=\"today\"></sd-icon>\n </mat-form-field>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["parseDate","dfEnUS"],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-forms-date.mjs","sources":["../../../projects/sdcorejs-angular/forms/date/src/date.component.ts","../../../projects/sdcorejs-angular/forms/date/src/date.component.html","../../../projects/sdcorejs-angular/forms/date/sdcorejs-angular-forms-date.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n input,\n model,\n computed,\n OnDestroy,\n OnInit,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n} from '@angular/core';\nimport { AbstractControl, FormGroup, FormsModule, NgForm, ReactiveFormsModule } from '@angular/forms';\nimport { provideDateFnsAdapter } from '@angular/material-date-fns-adapter';\nimport { MAT_DATE_LOCALE } from '@angular/material/core';\nimport { MatDatepicker, MatDatepickerInputEvent, MatDatepickerModule } from '@angular/material/datepicker';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdLabelDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n SD_FORM_CONFIGURATION,\n SdFormControl,\n SdInlineErrorValidator,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n ɵsdFormControlConnector,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { sdFormControlState } from '@sdcorejs/angular/forms/models';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { Size } from '@sdcorejs/utils/models';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { parse as parseDate } from 'date-fns';\nimport { enUS as dfEnUS } from 'date-fns/locale';\nimport { Subscription } from 'rxjs';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ntype SdDateModelValue = string | number | Date | undefined | null;\n\nfunction normalizeDateModel(value: SdDateModelValue): string | null {\n if (!DateUtilities.isDate(value)) return null;\n return DateUtilities.toFormat(value, 'yyyy/MM/dd') || null;\n}\n\nfunction dateModelToControl(value: SdDateModelValue): Date | null {\n const normalized = normalizeDateModel(value);\n return normalized ? parseDate(normalized, 'yyyy/MM/dd', new Date()) : null;\n}\n\nfunction dateControlToModel(value: Date | null): SdDateModelValue {\n return value ? normalizeDateModel(value) : null;\n}\n\nfunction dateControlsEqual(left: Date | null, right: Date | null): boolean {\n return left === right || normalizeDateModel(left) === normalizeDateModel(right);\n}\n\n@Component({\n selector: 'sd-date',\n templateUrl: './date.component.html',\n styleUrl: './date.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.sd-bare]': 'isInline()', '[class.sd-viewed]': 'isViewed() || isInline()', '[class.sd-has-label]': '!!label()' },\n providers: [\n // DateFnsAdapter inject MAT_DATE_LOCALE; nếu undefined sẽ throw khi format/parse.\n // Provide locale en-US tại scope component để hành vi giống Moment cũ (English default).\n { provide: MAT_DATE_LOCALE, useValue: dfEnUS },\n provideDateFnsAdapter({\n parse: { dateInput: 'dd/MM/yyyy' },\n display: {\n dateInput: 'dd/MM/yyyy',\n monthYearLabel: 'MMM yyyy',\n dateA11yLabel: 'PP',\n monthYearA11yLabel: 'MMMM yyyy',\n },\n }),\n ],\n standalone: true,\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatDatepickerModule,\n SdLabel,\n SdView,\n ],\n})\nexport class SdDate implements OnDestroy, OnInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n inputRef = viewChild<ElementRef<HTMLInputElement>>('input');\n datePicker = viewChild<MatDatepicker<Date>>(MatDatepicker);\n\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdViewDef = contentChild(SdViewDefDirective);\n sdLabelDef = contentChild(SdLabelDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private ref = inject(ChangeDetectorRef);\n private formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 3. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-date-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (calendar). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n /** Whether to show the value-gated clear button in edit and inline modes. */\n clearable = input(false, { transform: booleanAttribute });\n\n // Tri-state `viewed` — shared primitive. In `'inline'` the calendar editor is always mounted\n // (chrome hidden via CSS); the sd-view text face opens the calendar on click.\n readonly #viewedState = sdViewedInline(this.viewed, () => this.open(), this.disabled);\n /** `true` when `viewed === 'inline'`. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` (static view, no editor). */\n readonly isViewed = this.#viewedState.isViewed;\n /** Open the calendar from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n /** View display template: `sdViewDef` overrides the projected `#sdValue` (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.date.required');\n if (errors['matDatepickerMin']) {\n const d = this.resolvedMin();\n return this.#i18n.t('core.form.date.min-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['matDatepickerMax']) {\n const d = this.resolvedMax();\n return this.#i18n.t('core.form.date.max-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['matDatetimePickerParse'])\n return this.#i18n.t('core.form.date.parse-error', { text: errors['matDatetimePickerParse']?.text ?? '' });\n if (errors['date']) return errors['date'] as string;\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n hyperlink = input<string | null | undefined>();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n // Xử lý thông minh Gom min/minDate và max/maxDate\n minInput = input<any>(undefined, { alias: 'min' });\n minDateInput = input<any>(undefined, { alias: 'minDate' });\n resolvedMin = computed(() => this.#parseDateBoundary(this.minInput() ?? this.minDateInput()));\n\n maxInput = input<any>(undefined, { alias: 'max' });\n maxDateInput = input<any>(undefined, { alias: 'maxDate' });\n resolvedMax = computed(() => this.#parseDateBoundary(this.maxInput() ?? this.maxDateInput()));\n\n valueModel = model<SdDateModelValue>(undefined, { alias: 'model' });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>();\n\n // ==========================================\n // 5. INTERNAL STATE & STREAMS\n // ==========================================\n isMobileOrTablet = BrowserUtilities.isMobile();\n formControl = new SdFormControl();\n readonly #formConnector = ɵsdFormControlConnector<SdDateModelValue, Date | null>({\n form: this.form,\n name: this.name,\n control: computed<AbstractControl<Date | null>>(() => this.formControl),\n model: this.valueModel,\n writeModel: value => {\n this.valueModel.set(value);\n this.sdChange.emit(value);\n },\n modelToControl: dateModelToControl,\n controlToModel: dateControlToModel,\n modelEquals: (left, right) => normalizeDateModel(left) === normalizeDateModel(right),\n controlEquals: dateControlsEqual,\n validators: computed(() => (this.inlineError() ? SdInlineErrorValidator : null)),\n required: this.required,\n disabled: this.disabled,\n viewed: this.viewed,\n validationError: computed(() => this.errorMessage()),\n });\n isFocused = false;\n isValid?: boolean;\n\n #subscription = new Subscription();\n\n ngOnInit() {\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n // Hàm private tái sử dụng cho parse Min/Max Date\n #parseDateBoundary(val: any): Date | null {\n if (val === 'TODAY') return new Date();\n if (val && DateUtilities.isDate(val)) return new Date(val);\n return null;\n }\n\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit();\n };\n\n onBlur = () => {\n this.isFocused = false;\n };\n\n onClick = () => {\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.inputRef()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n setTimeout(() => {\n this.inputRef()?.nativeElement?.focus();\n this.datePicker()?.open();\n }, 100);\n };\n\n /** Open the datepicker calendar programmatically (anchors to the field input). */\n open = () => {\n if (this.formControl.disabled) return;\n this.datePicker()?.open();\n };\n\n focusInputElement() {\n this.inputRef()?.nativeElement?.focus();\n }\n\n onKeyDown = (event: KeyboardEvent) => {\n const key = event.keyCode || event.charCode;\n const isShift = key === 16;\n\n if (event.ctrlKey && (key === 67 || key === 86)) return true;\n\n if (\n ((key >= 48 && key <= 57) ||\n key === 8 ||\n key <= 37 ||\n key <= 39 ||\n (key >= 96 && key <= 105) ||\n key === 191 ||\n key === 186 ||\n key === 59) &&\n !isShift\n ) {\n return true;\n }\n return false;\n };\n\n onKeyup = (event: any) => {\n const currentVal: string = event.target.value;\n const formControl: AbstractControl = this.formControl;\n const regex = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d$/g;\n\n if (currentVal && !regex.test(currentVal)) {\n setTimeout(() => {\n this.isValid = true;\n formControl.markAsDirty();\n formControl.markAsTouched();\n formControl.setErrors({ ...formControl.errors, date: this.#i18n.t('core.form.date.invalid-format') });\n }, 0);\n } else {\n setTimeout(() => {\n this.isValid = false;\n formControl.setErrors({ ...formControl.errors, date: null });\n this.formControl.updateValueAndValidity();\n }, 0);\n }\n };\n\n onChange = (event: MatDatepickerInputEvent<Date>) => {\n this.inputRef()?.nativeElement?.focus();\n const value = this.isValid ? null : event.value;\n this.isValid = false;\n\n if (!dateControlsEqual(this.formControl.value as Date | null, value)) {\n this.formControl.setValue(value);\n }\n };\n\n clear = ($event: any) => {\n $event?.stopPropagation();\n if (this.formControl.value) {\n this.formControl.setValue(null);\n }\n };\n}\n","@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _required = required();\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = !!formControl.value;\n\n@let _resolvedMin = resolvedMin();\n@let _resolvedMax = resolvedMax();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | date: 'dd/MM/yyyy'\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view là \"mặt\" + trigger; calendar editor render ẩn (.sd-inline-editor) chỉ để mở panel. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | date: 'dd/MM/yyyy'\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n class=\"c-form-field-date-input\"\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label class=\"sd-form-field-label\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\n }\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n matInput\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeyDown($event)\"\n (dateChange)=\"onChange($event)\"\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [formControl]=\"formControl\"\n [required]=\"_required\"\n [matDatepicker]=\"picker\"\n [placeholder]=\"placeholder() || _label || ''\"\n [min]=\"_resolvedMin\"\n [max]=\"_resolvedMax\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n #input\n [maxLength]=\"10\" />\n\n <mat-datepicker #picker [touchUi]=\"isMobileOrTablet\"></mat-datepicker>\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (clearable() && formControl.value && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" (click)=\"!formControl.disabled && picker.open()\" #btn matSuffix name=\"today\"></sd-icon>\n </mat-form-field>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["parseDate","ɵsdFormControlConnector","dfEnUS"],"mappings":"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"}
@@ -2,9 +2,9 @@ import { Platform } from '@angular/cdk/platform';
2
2
  import * as i5 from '@angular/common';
3
3
  import { CommonModule } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
- import { viewChild, contentChild, inject, ChangeDetectorRef, ElementRef, input, computed, booleanAttribute, model, output, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
5
+ import { viewChild, contentChild, inject, ChangeDetectorRef, ElementRef, input, computed, booleanAttribute, model, output, ChangeDetectionStrategy, Component } from '@angular/core';
6
6
  import * as i1 from '@angular/forms';
7
- import { NgForm, FormGroup, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
7
+ import { NgForm, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
8
8
  import * as i2 from '@angular/material/button';
9
9
  import { MatButtonModule } from '@angular/material/button';
10
10
  import { MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
@@ -16,7 +16,7 @@ import { MatTooltipModule } from '@angular/material/tooltip';
16
16
  import { SdView } from '@sdcorejs/angular/components/view';
17
17
  import { SdViewDefDirective } from '@sdcorejs/angular/forms/directives';
18
18
  import { SdLabel } from '@sdcorejs/angular/forms/label';
19
- import { SD_FORM_CONFIGURATION, sdFormControlState, sdViewedTransform, sdViewedInline, SdFormControl, SdInlineErrorValidator } from '@sdcorejs/angular/forms/models';
19
+ import { SD_FORM_CONFIGURATION, sdFormControlState, sdViewedTransform, sdViewedInline, SdFormControl, ɵsdFormControlConnector as _sdFormControlConnector, SdInlineErrorValidator } from '@sdcorejs/angular/forms/models';
20
20
  import { sdIsEmpty, sdSerializeDataValue } from '@sdcorejs/angular/utilities/data-state';
21
21
  import { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';
22
22
  import { DateUtilities } from '@sdcorejs/angular/utilities/extensions';
@@ -38,6 +38,27 @@ function parseFirstValid(value, formats) {
38
38
  }
39
39
  return null;
40
40
  }
41
+ function datetimeModelToControl(value, showSeconds) {
42
+ if (!DateUtilities.isDate(value))
43
+ return null;
44
+ const normalized = DateUtilities.toFormat(value, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm');
45
+ if (!normalized)
46
+ return null;
47
+ return DateUtilities.toFormat(normalized, showSeconds ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm') || null;
48
+ }
49
+ function datetimeControlToStored(value, showSeconds) {
50
+ if (!value)
51
+ return null;
52
+ const parsed = parseFirstValid(value, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);
53
+ if (!parsed)
54
+ return null;
55
+ return DateUtilities.toFormat(parsed, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00') || null;
56
+ }
57
+ function normalizeDatetimeModel(value, showSeconds) {
58
+ if (!DateUtilities.isDate(value))
59
+ return null;
60
+ return DateUtilities.toFormat(value, showSeconds ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00') || null;
61
+ }
41
62
  class SdDatetime {
42
63
  id = `I${Utilities.generateUuid()}`;
43
64
  // ==========================================
@@ -187,62 +208,35 @@ class SdDatetime {
187
208
  // ==========================================
188
209
  isMobileOrTablet = BrowserUtilities.isMobile();
189
210
  formControl = new SdFormControl();
211
+ #formConnector = _sdFormControlConnector({
212
+ form: this.form,
213
+ name: this.name,
214
+ control: computed(() => this.formControl),
215
+ model: this.valueModel,
216
+ writeModel: value => {
217
+ this.valueModel.set(value);
218
+ this.sdChange.emit(value);
219
+ },
220
+ modelToControl: value => datetimeModelToControl(value, this.showSeconds()),
221
+ controlToModel: value => (value ? (datetimeControlToStored(value, this.showSeconds()) ?? this.valueModel()) : null),
222
+ modelEquals: (left, right) => normalizeDatetimeModel(left, this.showSeconds()) === normalizeDatetimeModel(right, this.showSeconds()),
223
+ validators: computed(() => (this.inlineError() ? SdInlineErrorValidator : null)),
224
+ required: this.required,
225
+ disabled: this.disabled,
226
+ viewed: this.viewed,
227
+ validationError: computed(() => this.errorMessage()),
228
+ });
190
229
  isFocused = false;
191
230
  isValid;
192
231
  /** State popup — true khi picker package đang mở. */
193
232
  pickerOpened = computed(() => this.dateTimePicker()?.opened() ?? false, ...(ngDevMode ? [{ debugName: "pickerOpened" }] : []));
194
- #date;
195
233
  #subscription = new Subscription();
196
- constructor() {
197
- // EFFECT 1: Sync model thay đổi từ bên ngoài → cập nhật hiển thị
198
- effect(() => {
199
- let val = this.valueModel();
200
- untracked(() => {
201
- if (!DateUtilities.isDate(val)) {
202
- val = null;
203
- }
204
- val = DateUtilities.toFormat(val, 'yyyy/MM/dd HH:mm');
205
- if (this.#date !== val) {
206
- this.#date = val;
207
- // Cập nhật formControl với chuỗi hiển thị dd/MM/yyyy HH:mm
208
- const fmt = this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm';
209
- const displayStr = DateUtilities.isDate(this.#date) ? DateUtilities.toFormat(this.#date, fmt) : null;
210
- this.formControl.setValue(displayStr, { emitEvent: false });
211
- }
212
- });
213
- });
214
- // EFFECT 2: Sync Disable
215
- effect(() => {
216
- if (this.disabled())
217
- this.formControl.disable({ emitEvent: false });
218
- else
219
- this.formControl.enable({ emitEvent: false });
220
- });
221
- // EFFECT 3: Update Validators
222
- effect(() => {
223
- const req = this.required();
224
- const inl = this.inlineError();
225
- untracked(() => {
226
- const validators = [];
227
- if (req)
228
- validators.push(Validators.required);
229
- if (inl)
230
- validators.push(SdInlineErrorValidator);
231
- this.formControl.setValidators(validators.length ? validators : null);
232
- this.formControl.updateValueAndValidity({ emitEvent: false });
233
- });
234
- });
235
- }
236
234
  ngOnInit() {
237
235
  this.#subscription.add(this.formControl.sdChanges.subscribe(() => {
238
236
  this.ref.markForCheck();
239
237
  }));
240
- const formGroup = this.form();
241
- formGroup?.addControl(this.name(), this.formControl);
242
238
  }
243
239
  ngOnDestroy() {
244
- const formGroup = this.form();
245
- formGroup?.removeControl(this.name());
246
240
  this.#subscription.unsubscribe();
247
241
  }
248
242
  // ==========================================
@@ -266,12 +260,9 @@ class SdDatetime {
266
260
  this.dateTimePicker()?.close();
267
261
  }
268
262
  onPickerConfirm(value) {
269
- const fmt = this.showSeconds() ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00';
270
- // value native Date từ package, không cần .toDate() như Moment.
271
- const stored = DateUtilities.toFormat(value, fmt);
272
- if (this.#date !== stored) {
273
- this.valueModel.set(stored);
274
- this.sdChange.emit(stored);
263
+ const display = DateUtilities.toFormat(value, this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm') || null;
264
+ if (this.formControl.value !== display) {
265
+ this.formControl.setValue(display);
275
266
  }
276
267
  }
277
268
  /** Lấy giá trị hiện tại dưới dạng native Date để truyền vào popup. */
@@ -364,30 +355,24 @@ class SdDatetime {
364
355
  formControl.setErrors({ ...formControl.errors, date: null });
365
356
  this.formControl.updateValueAndValidity();
366
357
  }, 0);
367
- // Đồng bộ ngược về model nếu hợp lệ.
368
- // date-fns không có multi-format strict parse như moment, dùng helper parseFirstValid.
358
+ // Đồng bộ qua canonical control; connector sở hữu conversion và model/output timing.
369
359
  if (currentVal) {
370
360
  const parsed = parseFirstValid(currentVal, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);
371
361
  if (parsed) {
372
- const fmt = this.showSeconds() ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00';
373
- const stored = DateUtilities.toFormat(parsed, fmt);
374
- if (this.#date !== stored) {
375
- this.valueModel.set(stored);
376
- this.sdChange.emit(stored);
362
+ const display = DateUtilities.toFormat(parsed, this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm');
363
+ if (this.formControl.value !== display) {
364
+ this.formControl.setValue(display);
377
365
  }
378
366
  }
379
367
  }
380
368
  else if (this.valueModel()) {
381
- this.valueModel.set(null);
382
- this.sdChange.emit(null);
369
+ this.formControl.setValue(null);
383
370
  }
384
371
  };
385
372
  clear = ($event) => {
386
373
  $event?.stopPropagation();
387
374
  if (this.formControl.value) {
388
375
  this.formControl.setValue(null);
389
- this.valueModel.set(null);
390
- this.sdChange.emit(null);
391
376
  }
392
377
  };
393
378
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdDatetime, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -429,7 +414,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
429
414
  SdDatetimePickerCancel,
430
415
  SdDatetimePickerNow,
431
416
  ], template: "@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _required = required();\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = !!formControl.value;\n\n@let _resolvedMin = resolvedMin();\n@let _resolvedMax = resolvedMax();\n\n@let _viewedDate = viewedDate();\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_viewedDate\"\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; datetime editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF overlay. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_viewedDate\"\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n class=\"c-form-field-datetime-input\"\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance || 'outline'\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label class=\"sd-form-field-label\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\n }\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n [id]=\"id\"\n (blur)=\"onConfirmInput($event)\"\n (keyup.enter)=\"onConfirmInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [formControl]=\"formControl\"\n [required]=\"_required\"\n [placeholder]=\"placeholder() || _label || ''\"\n [min]=\"_resolvedMin\"\n [max]=\"_resolvedMax\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n #input\n matInput />\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (clearable() && formControl.value && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n\n <span class=\"cursor-pointer sd-suffix-icon\" (click)=\"!formControl.disabled && open()\" matSuffix\n ><svg fill=\"currentColor\" viewBox=\"0 0 24 24\" fill=\"currentColor\" focusable=\"false\">\n <path\n d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\"></path></svg\n ></span>\n </mat-form-field>\n\n <sd-datetime-picker\n [showSeconds]=\"showSeconds()\"\n [disabled]=\"formControl.disabled\"\n [minDate]=\"_resolvedMin\"\n [maxDate]=\"_resolvedMax\"\n [startAt]=\"_viewedDate\"\n (applied)=\"onPickerConfirm($event)\">\n <sd-datetime-picker-actions>\n <button mat-button type=\"button\" sdDatetimePickerNow>\n <sd-icon name=\"schedule\"></sd-icon>\n <span>{{ 'core.form.datetime.now' | translate }}</span>\n </button>\n <button mat-button type=\"button\" sdDatetimePickerCancel>{{ 'core.common.cancel' | translate }}</button>\n <button mat-flat-button type=\"button\" sdDatetimePickerApply>{{ 'core.form.datetime.confirm' | translate }}</button>\n </sd-datetime-picker-actions>\n </sd-datetime-picker>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-primary-contrast{color:var(--sd-primary-contrast)!important}.bg-primary-contrast{background:var(--sd-primary-contrast)!important}.border-primary-contrast{border-color:var(--sd-primary-contrast)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-secondary-contrast{color:var(--sd-secondary-contrast)!important}.bg-secondary-contrast{background:var(--sd-secondary-contrast)!important}.border-secondary-contrast{border-color:var(--sd-secondary-contrast)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-info-contrast{color:var(--sd-info-contrast)!important}.bg-info-contrast{background:var(--sd-info-contrast)!important}.border-info-contrast{border-color:var(--sd-info-contrast)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-success-contrast{color:var(--sd-success-contrast)!important}.bg-success-contrast{background:var(--sd-success-contrast)!important}.border-success-contrast{border-color:var(--sd-success-contrast)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-warning-contrast{color:var(--sd-warning-contrast)!important}.bg-warning-contrast{background:var(--sd-warning-contrast)!important}.border-warning-contrast{border-color:var(--sd-warning-contrast)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-error-contrast{color:var(--sd-error-contrast)!important}.bg-error-contrast{background:var(--sd-error-contrast)!important}.border-error-contrast{border-color:var(--sd-error-contrast)!important}.text-surface{color:var(--sd-surface)!important}.bg-surface{background:var(--sd-surface)!important}.border-surface{border-color:var(--sd-surface)!important}.text-surface-muted{color:var(--sd-surface-muted)!important}.bg-surface-muted{background:var(--sd-surface-muted)!important}.border-surface-muted{border-color:var(--sd-surface-muted)!important}.text-text{color:var(--sd-text)!important}.bg-text{background:var(--sd-text)!important}.border-text{border-color:var(--sd-text)!important}.text-text-secondary{color:var(--sd-text-secondary)!important}.bg-text-secondary{background:var(--sd-text-secondary)!important}.border-text-secondary{border-color:var(--sd-text-secondary)!important}.text-text-muted{color:var(--sd-text-muted)!important}.bg-text-muted{background:var(--sd-text-muted)!important}.border-text-muted{border-color:var(--sd-text-muted)!important}.text-border{color:var(--sd-border)!important}.bg-border{background:var(--sd-border)!important}.border-border{border-color:var(--sd-border)!important}.text-border-strong{color:var(--sd-border-strong)!important}.bg-border-strong{background:var(--sd-border-strong)!important}.border-border-strong{border-color:var(--sd-border-strong)!important}.text-disabled-bg{color:var(--sd-disabled-bg)!important}.bg-disabled-bg{background:var(--sd-disabled-bg)!important}.border-disabled-bg{border-color:var(--sd-disabled-bg)!important}.text-disabled-text{color:var(--sd-disabled-text)!important}.bg-disabled-text{background:var(--sd-disabled-text)!important}.border-disabled-text{border-color:var(--sd-disabled-text)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.text-secondary{color:var(--sd-text-secondary)!important}.text-muted{color:var(--sd-text-muted)!important}.text-body{color:var(--sd-text)!important}.bg-muted{background:var(--sd-surface-muted)!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-disabled-bg)}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}:host(.sd-bare){position:relative}.sd-inline-view{cursor:pointer;display:inline-flex;align-items:center;width:100%;padding:1px 6px;border-radius:4px;background-color:#0000000a;transition:background-color .15s ease}.sd-inline-view:hover{background-color:#00000014}.sd-inline-view .sd-inline-clear{display:none;align-items:center;margin-left:4px;padding:0;border:0;background:transparent;cursor:pointer;line-height:0;color:var(--sd-text-secondary, #6b7280);transition:color .15s ease}.sd-inline-view .sd-inline-clear sd-icon{font-size:16px;width:16px;height:16px}.sd-inline-view .sd-inline-clear:hover{color:var(--sd-error, #b32626)}.sd-inline-view:hover .sd-inline-clear{display:inline-flex}.sd-inline-editor{position:absolute;inset:0;opacity:0;pointer-events:none}.sd-inline-editor ::ng-deep *{pointer-events:none!important}:host(.sd-bare){display:inline-flex;align-items:center}:host(.sd-bare) ::ng-deep .mat-mdc-form-field{width:auto}:host(.sd-bare) ::ng-deep .mat-mdc-text-field-wrapper{padding:0;background:transparent}:host(.sd-bare) ::ng-deep .mat-mdc-form-field-flex{padding:0;align-items:center}:host(.sd-bare) ::ng-deep .mdc-notched-outline{display:none}:host(.sd-bare) ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host(.sd-bare) ::ng-deep .mat-mdc-form-field-infix{padding:0;min-height:0;width:auto;border:0;display:inline-flex;align-items:center}\n"] }]
432
- }], ctorParameters: () => [], propDecorators: { inputRef: [{ type: i0.ViewChild, args: ['input', { isSignal: true }] }], dateTimePicker: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SdDatetimePicker), { isSignal: true }] }], sdLabelTemplate: [{ type: i0.ContentChild, args: ['sdLabel', { isSignal: true }] }], sdValueTemplate: [{ type: i0.ContentChild, args: ['sdValue', { isSignal: true }] }], sdViewDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdViewDefDirective), { isSignal: true }] }], autoIdInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoId", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], form: [{ type: i0.Input, args: [{ isSignal: true, alias: "form", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], helperText: [{ type: i0.Input, args: [{ isSignal: true, alias: "helperText", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hideInlineError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideInlineError", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], viewed: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewed", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], inlineError: [{ type: i0.Input, args: [{ isSignal: true, alias: "inlineError", required: false }] }], hyperlink: [{ type: i0.Input, args: [{ isSignal: true, alias: "hyperlink", required: false }] }], appearanceInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], floatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatLabel", required: false }] }], minInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], minDateInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], maxDateInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], valueModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: false }] }, { type: i0.Output, args: ["modelChange"] }], sdChange: [{ type: i0.Output, args: ["sdChange"] }], sdFocus: [{ type: i0.Output, args: ["sdFocus"] }] } });
417
+ }], propDecorators: { inputRef: [{ type: i0.ViewChild, args: ['input', { isSignal: true }] }], dateTimePicker: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SdDatetimePicker), { isSignal: true }] }], sdLabelTemplate: [{ type: i0.ContentChild, args: ['sdLabel', { isSignal: true }] }], sdValueTemplate: [{ type: i0.ContentChild, args: ['sdValue', { isSignal: true }] }], sdViewDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SdViewDefDirective), { isSignal: true }] }], autoIdInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoId", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], form: [{ type: i0.Input, args: [{ isSignal: true, alias: "form", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], helperText: [{ type: i0.Input, args: [{ isSignal: true, alias: "helperText", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hideInlineError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideInlineError", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], viewed: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewed", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], inlineError: [{ type: i0.Input, args: [{ isSignal: true, alias: "inlineError", required: false }] }], hyperlink: [{ type: i0.Input, args: [{ isSignal: true, alias: "hyperlink", required: false }] }], appearanceInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], floatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatLabel", required: false }] }], minInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], minDateInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], maxDateInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], valueModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: false }] }, { type: i0.Output, args: ["modelChange"] }], sdChange: [{ type: i0.Output, args: ["sdChange"] }], sdFocus: [{ type: i0.Output, args: ["sdFocus"] }] } });
433
418
 
434
419
  /**
435
420
  * Generated bundle index. Do not edit.