@sdcorejs/angular 19.1.4 → 19.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/components/preview/src/preview-pdf/pdf-worker-inline.generated.d.ts +7 -0
- package/components/table/src/services/table-export/table-export.service.d.ts +3 -1
- package/components/table/src/table.component.d.ts +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +31 -2
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +18 -3
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +3 -4
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +122 -27
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-models.mjs +54 -2
- package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-i18n.mjs +40 -0
- package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +367 -237
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/forms/date/src/date-input.util.d.ts +18 -0
- package/forms/date/src/date.component.d.ts +8 -1
- package/forms/models/index.d.ts +1 -0
- package/forms/models/src/sd-strict-date-adapter.d.ts +26 -0
- package/i18n/src/en.d.ts +8 -0
- package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +6 -1
- package/modules/layout/components/shared/search-field/search-field.component.d.ts +9 -0
- package/modules/layout/components/shared/user-menu/user-menu.component.d.ts +26 -6
- package/modules/layout/components/sidebar-mobile-v1/components/user/user.component.d.ts +3 -11
- package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +1 -0
- package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +3 -9
- package/modules/layout/components/sidebar-v1/main.component.d.ts +1 -0
- package/modules/layout/configurations/layout.configuration.d.ts +42 -3
- package/modules/layout/index.d.ts +1 -0
- package/modules/layout/utils/index.d.ts +1 -0
- package/modules/layout/utils/tab-name.util.d.ts +8 -0
- package/package.json +13 -5
|
@@ -4,7 +4,6 @@ import * as i0 from '@angular/core';
|
|
|
4
4
|
import { viewChild, contentChild, inject, ChangeDetectorRef, input, computed, booleanAttribute, model, output, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
5
5
|
import * as i2 from '@angular/forms';
|
|
6
6
|
import { NgForm, FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
7
|
-
import { provideDateFnsAdapter } from '@angular/material-date-fns-adapter';
|
|
8
7
|
import { MatNativeDateModule, MAT_DATE_LOCALE } from '@angular/material/core';
|
|
9
8
|
import * as i5 from '@angular/material/datepicker';
|
|
10
9
|
import { MatDateRangePicker, MatDatepickerModule } from '@angular/material/datepicker';
|
|
@@ -13,7 +12,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
|
|
|
13
12
|
import * as i3 from '@angular/material/tooltip';
|
|
14
13
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
15
14
|
import { SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';
|
|
16
|
-
import { SD_FORM_CONFIGURATION, sdFormControlState, sdViewedTransform, sdViewedInline, ɵsdFormControlConnector as _sdFormControlConnector } from '@sdcorejs/angular/forms/models';
|
|
15
|
+
import { SD_FORM_CONFIGURATION, sdFormControlState, sdViewedTransform, sdViewedInline, ɵsdFormControlConnector as _sdFormControlConnector, provideSdStrictDateFnsAdapter } from '@sdcorejs/angular/forms/models';
|
|
17
16
|
import { sdSerializeDataValue } from '@sdcorejs/angular/utilities/data-state';
|
|
18
17
|
import { SdLabel } from '@sdcorejs/angular/forms/label';
|
|
19
18
|
import { SdView } from '@sdcorejs/angular/components/view';
|
|
@@ -322,7 +321,7 @@ class SdDateRange {
|
|
|
322
321
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdDateRange, isStandalone: true, selector: "sd-date-range", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, helperText: { classPropertyName: "helperText", publicName: "helperText", isSignal: true, isRequired: false, transformFunction: null }, hideInlineError: { classPropertyName: "hideInlineError", publicName: "hideInlineError", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, appearanceInput: { classPropertyName: "appearanceInput", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, floatLabel: { classPropertyName: "floatLabel", publicName: "floatLabel", isSignal: true, isRequired: false, transformFunction: null }, minInput: { classPropertyName: "minInput", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, maxInput: { classPropertyName: "maxInput", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange", sdChange: "sdChange" }, host: { properties: { "class.sd-bare": "isInline()", "class.sd-viewed": "isViewed() || isInline()", "class.sd-has-label": "!!label()" } }, providers: [
|
|
323
322
|
// DateFnsAdapter inject MAT_DATE_LOCALE; cấp default en-US để parse/format hoạt động.
|
|
324
323
|
{ provide: MAT_DATE_LOCALE, useValue: enUS },
|
|
325
|
-
|
|
324
|
+
provideSdStrictDateFnsAdapter({
|
|
326
325
|
parse: { dateInput: 'dd/MM/yyyy' },
|
|
327
326
|
display: {
|
|
328
327
|
dateInput: 'dd/MM/yyyy',
|
|
@@ -338,7 +337,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
338
337
|
args: [{ selector: 'sd-date-range', changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class.sd-bare]': 'isInline()', '[class.sd-viewed]': 'isViewed() || isInline()', '[class.sd-has-label]': '!!label()' }, providers: [
|
|
339
338
|
// DateFnsAdapter inject MAT_DATE_LOCALE; cấp default en-US để parse/format hoạt động.
|
|
340
339
|
{ provide: MAT_DATE_LOCALE, useValue: enUS },
|
|
341
|
-
|
|
340
|
+
provideSdStrictDateFnsAdapter({
|
|
342
341
|
parse: { dateInput: 'dd/MM/yyyy' },
|
|
343
342
|
display: {
|
|
344
343
|
dateInput: 'dd/MM/yyyy',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-forms-date-range.mjs","sources":["../../../projects/sdcorejs-angular/forms/date-range/src/date-range.component.ts","../../../projects/sdcorejs-angular/forms/date-range/src/date-range.component.html","../../../projects/sdcorejs-angular/forms/date-range/sdcorejs-angular-forms-date-range.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n model,\n computed,\n effect,\n untracked,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n} from '@angular/core';\nimport { FormControl, FormGroup, FormsModule, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { provideDateFnsAdapter } from '@angular/material-date-fns-adapter';\nimport { MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core';\nimport { MatDatepickerInputEvent, MatDatepickerModule, MatDateRangePicker } from '@angular/material/datepicker';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';\nimport {\n SD_FORM_CONFIGURATION,\n sdFormControlState,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n ɵsdFormControlConnector,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue } from '@sdcorejs/angular/utilities/data-state';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { Size } from '@sdcorejs/utils/models';\nimport { parse as parseDate } from 'date-fns';\nimport { enUS as dfEnUS } from 'date-fns/locale';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\nexport interface SdDateRangeValue {\n from?: string | null;\n to?: string | null;\n}\n\n@Component({\n selector: 'sd-date-range',\n templateUrl: './date-range.component.html',\n styleUrl: './date-range.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; cấp default en-US để parse/format hoạt động.\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 MatTooltipModule,\n MatFormFieldModule,\n MatDatepickerModule,\n MatNativeDateModule,\n SdLabel,\n SdView,\n TranslatePipe,\n ],\n})\nexport class SdDateRange {\n id1 = `I${Utilities.generateUuid()}`;\n id2 = `I${Utilities.generateUuid()}`;\n #c1 = Utilities.generateUuid();\n #c2 = Utilities.generateUuid();\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n picker = viewChild<MatDateRangePicker<Date>>(MatDateRangePicker);\n sdLabelDef = contentChild(SdLabelDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private cdRef = 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-range-${this.autoIdInput()}` : undefined));\n fromAutoId = computed(() => {\n const id = this.autoId();\n return id ? `${id}-from` : undefined;\n });\n toAutoId = computed(() => {\n const id = this.autoId();\n return id ? `${id}-to` : undefined;\n });\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(() => {\n const v = this.#state().value as { from?: Date | null; to?: Date | null } | null | undefined;\n const empty = !v || !v.from || !v.to;\n return empty ? 'true' : 'false';\n });\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\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\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 outerErrors = this.formControl.errors;\n const c1Errors = this.control1?.errors;\n const c2Errors = this.control2?.errors;\n\n if (outerErrors?.['required'] || c1Errors?.['required'] || c2Errors?.['required']) {\n return this.#i18n.t('core.form.date-range.required');\n }\n if (outerErrors?.['matDatepickerMin'] || c1Errors?.['matDatepickerMin']) {\n return this.#i18n.t('core.form.date-range.invalid-min');\n }\n if (outerErrors?.['matDatepickerMax'] || c2Errors?.['matDatepickerMax']) {\n return this.#i18n.t('core.form.date-range.invalid-max');\n }\n return undefined;\n });\n\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (range picker). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n /** In `viewed='inline'`, show a hover clear-× on the text face. Set `false` when the host owns removal (chips). */\n clearable = input(true, { transform: booleanAttribute });\n\n // Tri-state `viewed` — shared primitive. In `'inline'` the range editor is always mounted\n // (chrome hidden via CSS); the sd-view text face opens the range picker 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 range picker from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n\n /** Optional <ng-template #sdValue> projected by consumer to override the viewed text. */\n sdValueTemplate = contentChild<TemplateRef<unknown>>('sdValue');\n\n /**\n * Formatted \"dd/MM/yyyy → dd/MM/yyyy\" string for the viewed-mode display.\n * why: viewed mode chỉ hiển thị text — cần format gọn cho cả 2 đầu range,\n * Returns empty when both ends are blank, \"from →\" when only from is set, and so on.\n */\n formatted = computed<string>(() => {\n const m = this.valueModel();\n const fmt = (d: unknown): string => {\n if (d == null || d === '') return '';\n const dt = d instanceof Date ? d : new Date(String(d));\n if (isNaN(dt.getTime())) return '';\n const dd = String(dt.getDate()).padStart(2, '0');\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n return `${dd}/${mm}/${dt.getFullYear()}`;\n };\n const a = fmt(m?.from);\n const b = fmt(m?.to);\n if (!a && !b) return '';\n return `${a} → ${b}`;\n });\n\n /** Open the range picker panel programmatically (for query-bar chip auto-open). */\n open = (): void => {\n if (this.formControl.disabled) return;\n this.picker()?.open();\n };\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 minInput = input<any>(undefined, { alias: 'min' });\n resolvedMin = computed(() => this.#parseDateBoundary(this.minInput()));\n\n maxInput = input<any>(undefined, { alias: 'max' });\n resolvedMax = computed(() => this.#parseDateBoundary(this.maxInput()));\n\n valueModel = model<SdDateRangeValue | undefined | null>(undefined, { alias: 'model' });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<SdDateRangeValue | undefined | null>();\n\n // ==========================================\n // 5. INTERNAL STATE & STREAMS\n // ==========================================\n isMobileOrTablet = BrowserUtilities.isMobile();\n formControl = new FormControl();\n control1 = new FormControl();\n control2 = new FormControl();\n readonly #fromConnector = ɵsdFormControlConnector<unknown, unknown>({\n form: this.form,\n name: computed(() => this.#c1),\n control: computed(() => this.control1),\n });\n readonly #toConnector = ɵsdFormControlConnector<unknown, unknown>({\n form: this.form,\n name: computed(() => this.#c2),\n control: computed(() => this.control2),\n });\n readonly #rangeConnector = ɵsdFormControlConnector<unknown, unknown>({\n form: this.form,\n name: this.name,\n control: computed(() => this.formControl),\n });\n\n #isFocus = false;\n #isModelChange = false;\n #isSdChangeEmittedByEnter = false;\n #isSdChangeEmittedByClear = false;\n\n constructor() {\n this.cdRef.markForCheck();\n\n // EFFECT 1: Sync model thay đổi từ bên ngoài vào control1 và control2\n effect(() => {\n const val = this.valueModel();\n untracked(() => {\n const fromStr = DateUtilities.isDate(val?.from) ? DateUtilities.toFormat(val?.from, 'yyyy/MM/dd') : null;\n const toStr = DateUtilities.isDate(val?.to) ? DateUtilities.toFormat(val?.to, 'yyyy/MM/dd') : null;\n\n // Chỉ set value nếu có sự khác biệt (tránh loop)\n // control1/control2 giờ giữ native Date (date-fns adapter), không cần .toDate() như Moment.\n const currentFrom = this.control1.value ? DateUtilities.toFormat(this.control1.value, 'yyyy/MM/dd') : null;\n const currentTo = this.control2.value ? DateUtilities.toFormat(this.control2.value, 'yyyy/MM/dd') : null;\n\n if (fromStr !== currentFrom) {\n this.control1.setValue(fromStr ? parseDate(fromStr, 'yyyy/MM/dd', new Date()) : null, { emitEvent: false });\n }\n if (toStr !== currentTo) {\n this.control2.setValue(toStr ? parseDate(toStr, 'yyyy/MM/dd', new Date()) : null, { emitEvent: false });\n }\n\n // Đồng bộ control tổng để required của form cha không bị invalid khi model default đã có giá trị.\n this.formControl.setValue({ from: this.control1.value, to: this.control2.value }, { emitEvent: false });\n this.formControl.updateValueAndValidity({ emitEvent: false });\n });\n });\n\n // EFFECT 2: Sync Disable\n effect(() => {\n if (this.disabled()) {\n this.formControl.disable({ emitEvent: false });\n this.control1.disable({ emitEvent: false });\n this.control2.disable({ emitEvent: false });\n } else {\n this.formControl.enable({ emitEvent: false });\n this.control1.enable({ emitEvent: false });\n this.control2.enable({ emitEvent: false });\n }\n });\n\n // EFFECT 3: Sync Required\n effect(() => {\n const isReq = this.required();\n untracked(() => {\n if (isReq) {\n this.formControl.setValidators([Validators.required]);\n this.control1.setValidators([Validators.required]);\n this.control2.setValidators([Validators.required]);\n } else {\n this.formControl.clearValidators();\n this.control1.clearValidators();\n this.control2.clearValidators();\n }\n this.formControl.updateValueAndValidity({ emitEvent: false });\n this.control1.updateValueAndValidity({ emitEvent: false });\n this.control2.updateValueAndValidity({ emitEvent: false });\n });\n });\n }\n\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 onStartChange = (event: MatDatepickerInputEvent<Date>) => {\n if (!this.#isFocus) this.#emit();\n };\n\n onEndChange = (event: MatDatepickerInputEvent<Date>) => {\n if (!this.#isFocus) this.#emit();\n };\n\n #emit = () => {\n // control1/control2 giờ giữ native Date, không cần .toDate().\n const from = this.control1.value || null;\n const to = this.control2.value || null;\n\n const currentModel = this.valueModel();\n const newFrom = DateUtilities.isDate(from) ? DateUtilities.toFormat(from, 'yyyy/MM/dd') : null;\n const newTo = DateUtilities.isDate(to) ? DateUtilities.toFormat(to, 'yyyy/MM/dd') : null;\n\n if (newFrom !== currentModel?.from || newTo !== currentModel?.to) {\n const nextModel = { from: newFrom, to: newTo };\n this.formControl.setValue({ from: this.control1.value, to: this.control2.value }, { emitEvent: false });\n this.valueModel.set(nextModel);\n this.#isModelChange = true;\n this.cdRef.markForCheck();\n }\n };\n\n clear = () => {\n const emptyModel = { from: null, to: null };\n this.control1.setValue(null, { emitEvent: false });\n this.control2.setValue(null, { emitEvent: false });\n this.formControl.setValue(emptyModel, { emitEvent: false });\n\n this.valueModel.set(emptyModel);\n this.sdChange.emit(emptyModel);\n\n this.#isSdChangeEmittedByClear = true;\n this.cdRef.markForCheck();\n };\n\n onEnter = () => {\n this.#emit();\n this.sdChange.emit(this.valueModel());\n this.#isSdChangeEmittedByEnter = true;\n };\n\n onFocus = () => {\n this.#isFocus = true;\n this.#isModelChange = false;\n this.#isSdChangeEmittedByEnter = false;\n this.#isSdChangeEmittedByClear = false;\n };\n\n onBlur = () => {\n this.#isFocus = false;\n this.#emit();\n setTimeout(() => {\n if (!this.#isFocus && this.#isModelChange && !(this.#isSdChangeEmittedByEnter || this.#isSdChangeEmittedByClear)) {\n this.sdChange.emit(this.valueModel());\n }\n });\n };\n\n onClosePicker = () => {\n this.sdChange.emit(this.valueModel());\n };\n\n onOpenPicker = (event: MouseEvent) => {\n event.stopPropagation();\n if (!this.formControl.disabled) {\n this.picker()?.open();\n }\n };\n}\n","@let _sdLabelDef = sdLabelDef();\n@let _label = label();\n@let _appearance = appearance();\n@let _required = required();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _resolvedMin = resolvedMin();\n@let _resolvedMax = resolvedMax();\n@let _size = size();\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = !!(control1.value || control2.value);\n@let _labelTemplate = _sdLabelDef?.templateRef ?? undefined;\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"_labelTemplate\"\n [value]=\"valueModel()\"\n [display]=\"formatted()\"\n [valueTemplate]=\"sdValueTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view là \"mặt\" + trigger; range editor render ẩn (.sd-inline-editor) chỉ để mở picker. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"_labelTemplate\"\n [value]=\"valueModel()\"\n [display]=\"formatted()\"\n [valueTemplate]=\"sdValueTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"$event.stopPropagation(); clear()\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n\n <div [class.sd-inline-editor]=\"_isInline\">\n @if (!_appearance && _sdLabelDef?.templateRef) {\n <ng-container *ngTemplateOutlet=\"_sdLabelDef!.templateRef\"> </ng-container>\n }\n @if (!_appearance && _label && !_sdLabelDef?.templateRef) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n\n <mat-form-field\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 <mat-date-range-input\n [max]=\"_resolvedMax\"\n [min]=\"_resolvedMin\"\n [rangePicker]=\"picker\"\n [disabled]=\"formControl.disabled\"\n [required]=\"_required\"\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 aria-hidden=\"true\"\n [id]=\"id1\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n matStartDate\n [formControl]=\"control1\"\n [placeholder]=\"formControl.disabled ? '' : ('core.form.date-range.from' | translate)\"\n (dateInput)=\"onStartChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keyup.enter)=\"onEnter()\"\n [attr.data-qclabel]=\"_label\"\n [attr.data-autoId]=\"fromAutoId()\" />\n\n <input\n aria-hidden=\"true\"\n [id]=\"id2\"\n [autocomplete]=\"id2\"\n autocorrect=\"off\"\n matEndDate\n [formControl]=\"control2\"\n [placeholder]=\"formControl.disabled ? '' : ('core.form.date-range.to' | translate)\"\n (dateInput)=\"onEndChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keyup.enter)=\"onEnter()\"\n [attr.data-qclabel]=\"_label\"\n [attr.data-autoId]=\"toAutoId()\" />\n </mat-date-range-input>\n\n @if (_hideInlineError && _errorMessage && (formControl.touched || control1.touched || control2.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 || control1.touched || control2.touched)) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if ((control1.value || control2.value) && !_bare) {\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" (click)=\"clear()\" matSuffix name=\"cancel\"></sd-icon>\n }\n\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" (click)=\"onOpenPicker($event)\" matSuffix name=\"today\"></sd-icon>\n\n <mat-date-range-picker [touchUi]=\"isMobileOrTablet\" (closed)=\"onClosePicker()\" #picker></mat-date-range-picker>\n </mat-form-field>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵsdFormControlConnector","parseDate","dfEnUS"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-forms-date-range.mjs","sources":["../../../projects/sdcorejs-angular/forms/date-range/src/date-range.component.ts","../../../projects/sdcorejs-angular/forms/date-range/src/date-range.component.html","../../../projects/sdcorejs-angular/forms/date-range/sdcorejs-angular-forms-date-range.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n model,\n computed,\n effect,\n untracked,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n} from '@angular/core';\nimport { FormControl, FormGroup, FormsModule, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core';\nimport { MatDatepickerInputEvent, MatDatepickerModule, MatDateRangePicker } from '@angular/material/datepicker';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { provideSdStrictDateFnsAdapter,\n SD_FORM_CONFIGURATION,\n sdFormControlState,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n ɵsdFormControlConnector,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue } from '@sdcorejs/angular/utilities/data-state';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { Size } from '@sdcorejs/utils/models';\nimport { parse as parseDate } from 'date-fns';\nimport { enUS as dfEnUS } from 'date-fns/locale';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\nexport interface SdDateRangeValue {\n from?: string | null;\n to?: string | null;\n}\n\n@Component({\n selector: 'sd-date-range',\n templateUrl: './date-range.component.html',\n styleUrl: './date-range.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; cấp default en-US để parse/format hoạt động.\n { provide: MAT_DATE_LOCALE, useValue: dfEnUS },\n provideSdStrictDateFnsAdapter({\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 MatTooltipModule,\n MatFormFieldModule,\n MatDatepickerModule,\n MatNativeDateModule,\n SdLabel,\n SdView,\n TranslatePipe,\n ],\n})\nexport class SdDateRange {\n id1 = `I${Utilities.generateUuid()}`;\n id2 = `I${Utilities.generateUuid()}`;\n #c1 = Utilities.generateUuid();\n #c2 = Utilities.generateUuid();\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n picker = viewChild<MatDateRangePicker<Date>>(MatDateRangePicker);\n sdLabelDef = contentChild(SdLabelDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private cdRef = 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-range-${this.autoIdInput()}` : undefined));\n fromAutoId = computed(() => {\n const id = this.autoId();\n return id ? `${id}-from` : undefined;\n });\n toAutoId = computed(() => {\n const id = this.autoId();\n return id ? `${id}-to` : undefined;\n });\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(() => {\n const v = this.#state().value as { from?: Date | null; to?: Date | null } | null | undefined;\n const empty = !v || !v.from || !v.to;\n return empty ? 'true' : 'false';\n });\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\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\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 outerErrors = this.formControl.errors;\n const c1Errors = this.control1?.errors;\n const c2Errors = this.control2?.errors;\n\n if (outerErrors?.['required'] || c1Errors?.['required'] || c2Errors?.['required']) {\n return this.#i18n.t('core.form.date-range.required');\n }\n if (outerErrors?.['matDatepickerMin'] || c1Errors?.['matDatepickerMin']) {\n return this.#i18n.t('core.form.date-range.invalid-min');\n }\n if (outerErrors?.['matDatepickerMax'] || c2Errors?.['matDatepickerMax']) {\n return this.#i18n.t('core.form.date-range.invalid-max');\n }\n return undefined;\n });\n\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (range picker). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n /** In `viewed='inline'`, show a hover clear-× on the text face. Set `false` when the host owns removal (chips). */\n clearable = input(true, { transform: booleanAttribute });\n\n // Tri-state `viewed` — shared primitive. In `'inline'` the range editor is always mounted\n // (chrome hidden via CSS); the sd-view text face opens the range picker 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 range picker from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n\n /** Optional <ng-template #sdValue> projected by consumer to override the viewed text. */\n sdValueTemplate = contentChild<TemplateRef<unknown>>('sdValue');\n\n /**\n * Formatted \"dd/MM/yyyy → dd/MM/yyyy\" string for the viewed-mode display.\n * why: viewed mode chỉ hiển thị text — cần format gọn cho cả 2 đầu range,\n * Returns empty when both ends are blank, \"from →\" when only from is set, and so on.\n */\n formatted = computed<string>(() => {\n const m = this.valueModel();\n const fmt = (d: unknown): string => {\n if (d == null || d === '') return '';\n const dt = d instanceof Date ? d : new Date(String(d));\n if (isNaN(dt.getTime())) return '';\n const dd = String(dt.getDate()).padStart(2, '0');\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n return `${dd}/${mm}/${dt.getFullYear()}`;\n };\n const a = fmt(m?.from);\n const b = fmt(m?.to);\n if (!a && !b) return '';\n return `${a} → ${b}`;\n });\n\n /** Open the range picker panel programmatically (for query-bar chip auto-open). */\n open = (): void => {\n if (this.formControl.disabled) return;\n this.picker()?.open();\n };\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 minInput = input<any>(undefined, { alias: 'min' });\n resolvedMin = computed(() => this.#parseDateBoundary(this.minInput()));\n\n maxInput = input<any>(undefined, { alias: 'max' });\n resolvedMax = computed(() => this.#parseDateBoundary(this.maxInput()));\n\n valueModel = model<SdDateRangeValue | undefined | null>(undefined, { alias: 'model' });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<SdDateRangeValue | undefined | null>();\n\n // ==========================================\n // 5. INTERNAL STATE & STREAMS\n // ==========================================\n isMobileOrTablet = BrowserUtilities.isMobile();\n formControl = new FormControl();\n control1 = new FormControl();\n control2 = new FormControl();\n readonly #fromConnector = ɵsdFormControlConnector<unknown, unknown>({\n form: this.form,\n name: computed(() => this.#c1),\n control: computed(() => this.control1),\n });\n readonly #toConnector = ɵsdFormControlConnector<unknown, unknown>({\n form: this.form,\n name: computed(() => this.#c2),\n control: computed(() => this.control2),\n });\n readonly #rangeConnector = ɵsdFormControlConnector<unknown, unknown>({\n form: this.form,\n name: this.name,\n control: computed(() => this.formControl),\n });\n\n #isFocus = false;\n #isModelChange = false;\n #isSdChangeEmittedByEnter = false;\n #isSdChangeEmittedByClear = false;\n\n constructor() {\n this.cdRef.markForCheck();\n\n // EFFECT 1: Sync model thay đổi từ bên ngoài vào control1 và control2\n effect(() => {\n const val = this.valueModel();\n untracked(() => {\n const fromStr = DateUtilities.isDate(val?.from) ? DateUtilities.toFormat(val?.from, 'yyyy/MM/dd') : null;\n const toStr = DateUtilities.isDate(val?.to) ? DateUtilities.toFormat(val?.to, 'yyyy/MM/dd') : null;\n\n // Chỉ set value nếu có sự khác biệt (tránh loop)\n // control1/control2 giờ giữ native Date (date-fns adapter), không cần .toDate() như Moment.\n const currentFrom = this.control1.value ? DateUtilities.toFormat(this.control1.value, 'yyyy/MM/dd') : null;\n const currentTo = this.control2.value ? DateUtilities.toFormat(this.control2.value, 'yyyy/MM/dd') : null;\n\n if (fromStr !== currentFrom) {\n this.control1.setValue(fromStr ? parseDate(fromStr, 'yyyy/MM/dd', new Date()) : null, { emitEvent: false });\n }\n if (toStr !== currentTo) {\n this.control2.setValue(toStr ? parseDate(toStr, 'yyyy/MM/dd', new Date()) : null, { emitEvent: false });\n }\n\n // Đồng bộ control tổng để required của form cha không bị invalid khi model default đã có giá trị.\n this.formControl.setValue({ from: this.control1.value, to: this.control2.value }, { emitEvent: false });\n this.formControl.updateValueAndValidity({ emitEvent: false });\n });\n });\n\n // EFFECT 2: Sync Disable\n effect(() => {\n if (this.disabled()) {\n this.formControl.disable({ emitEvent: false });\n this.control1.disable({ emitEvent: false });\n this.control2.disable({ emitEvent: false });\n } else {\n this.formControl.enable({ emitEvent: false });\n this.control1.enable({ emitEvent: false });\n this.control2.enable({ emitEvent: false });\n }\n });\n\n // EFFECT 3: Sync Required\n effect(() => {\n const isReq = this.required();\n untracked(() => {\n if (isReq) {\n this.formControl.setValidators([Validators.required]);\n this.control1.setValidators([Validators.required]);\n this.control2.setValidators([Validators.required]);\n } else {\n this.formControl.clearValidators();\n this.control1.clearValidators();\n this.control2.clearValidators();\n }\n this.formControl.updateValueAndValidity({ emitEvent: false });\n this.control1.updateValueAndValidity({ emitEvent: false });\n this.control2.updateValueAndValidity({ emitEvent: false });\n });\n });\n }\n\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 onStartChange = (event: MatDatepickerInputEvent<Date>) => {\n if (!this.#isFocus) this.#emit();\n };\n\n onEndChange = (event: MatDatepickerInputEvent<Date>) => {\n if (!this.#isFocus) this.#emit();\n };\n\n #emit = () => {\n // control1/control2 giờ giữ native Date, không cần .toDate().\n const from = this.control1.value || null;\n const to = this.control2.value || null;\n\n const currentModel = this.valueModel();\n const newFrom = DateUtilities.isDate(from) ? DateUtilities.toFormat(from, 'yyyy/MM/dd') : null;\n const newTo = DateUtilities.isDate(to) ? DateUtilities.toFormat(to, 'yyyy/MM/dd') : null;\n\n if (newFrom !== currentModel?.from || newTo !== currentModel?.to) {\n const nextModel = { from: newFrom, to: newTo };\n this.formControl.setValue({ from: this.control1.value, to: this.control2.value }, { emitEvent: false });\n this.valueModel.set(nextModel);\n this.#isModelChange = true;\n this.cdRef.markForCheck();\n }\n };\n\n clear = () => {\n const emptyModel = { from: null, to: null };\n this.control1.setValue(null, { emitEvent: false });\n this.control2.setValue(null, { emitEvent: false });\n this.formControl.setValue(emptyModel, { emitEvent: false });\n\n this.valueModel.set(emptyModel);\n this.sdChange.emit(emptyModel);\n\n this.#isSdChangeEmittedByClear = true;\n this.cdRef.markForCheck();\n };\n\n onEnter = () => {\n this.#emit();\n this.sdChange.emit(this.valueModel());\n this.#isSdChangeEmittedByEnter = true;\n };\n\n onFocus = () => {\n this.#isFocus = true;\n this.#isModelChange = false;\n this.#isSdChangeEmittedByEnter = false;\n this.#isSdChangeEmittedByClear = false;\n };\n\n onBlur = () => {\n this.#isFocus = false;\n this.#emit();\n setTimeout(() => {\n if (!this.#isFocus && this.#isModelChange && !(this.#isSdChangeEmittedByEnter || this.#isSdChangeEmittedByClear)) {\n this.sdChange.emit(this.valueModel());\n }\n });\n };\n\n onClosePicker = () => {\n this.sdChange.emit(this.valueModel());\n };\n\n onOpenPicker = (event: MouseEvent) => {\n event.stopPropagation();\n if (!this.formControl.disabled) {\n this.picker()?.open();\n }\n };\n}\n","@let _sdLabelDef = sdLabelDef();\n@let _label = label();\n@let _appearance = appearance();\n@let _required = required();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _resolvedMin = resolvedMin();\n@let _resolvedMax = resolvedMax();\n@let _size = size();\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = !!(control1.value || control2.value);\n@let _labelTemplate = _sdLabelDef?.templateRef ?? undefined;\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"_labelTemplate\"\n [value]=\"valueModel()\"\n [display]=\"formatted()\"\n [valueTemplate]=\"sdValueTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view là \"mặt\" + trigger; range editor render ẩn (.sd-inline-editor) chỉ để mở picker. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"_labelTemplate\"\n [value]=\"valueModel()\"\n [display]=\"formatted()\"\n [valueTemplate]=\"sdValueTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"$event.stopPropagation(); clear()\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n\n <div [class.sd-inline-editor]=\"_isInline\">\n @if (!_appearance && _sdLabelDef?.templateRef) {\n <ng-container *ngTemplateOutlet=\"_sdLabelDef!.templateRef\"> </ng-container>\n }\n @if (!_appearance && _label && !_sdLabelDef?.templateRef) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n\n <mat-form-field\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 <mat-date-range-input\n [max]=\"_resolvedMax\"\n [min]=\"_resolvedMin\"\n [rangePicker]=\"picker\"\n [disabled]=\"formControl.disabled\"\n [required]=\"_required\"\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 aria-hidden=\"true\"\n [id]=\"id1\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n matStartDate\n [formControl]=\"control1\"\n [placeholder]=\"formControl.disabled ? '' : ('core.form.date-range.from' | translate)\"\n (dateInput)=\"onStartChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keyup.enter)=\"onEnter()\"\n [attr.data-qclabel]=\"_label\"\n [attr.data-autoId]=\"fromAutoId()\" />\n\n <input\n aria-hidden=\"true\"\n [id]=\"id2\"\n [autocomplete]=\"id2\"\n autocorrect=\"off\"\n matEndDate\n [formControl]=\"control2\"\n [placeholder]=\"formControl.disabled ? '' : ('core.form.date-range.to' | translate)\"\n (dateInput)=\"onEndChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keyup.enter)=\"onEnter()\"\n [attr.data-qclabel]=\"_label\"\n [attr.data-autoId]=\"toAutoId()\" />\n </mat-date-range-input>\n\n @if (_hideInlineError && _errorMessage && (formControl.touched || control1.touched || control2.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 || control1.touched || control2.touched)) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if ((control1.value || control2.value) && !_bare) {\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" (click)=\"clear()\" matSuffix name=\"cancel\"></sd-icon>\n }\n\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" (click)=\"onOpenPicker($event)\" matSuffix name=\"today\"></sd-icon>\n\n <mat-date-range-picker [touchUi]=\"isMobileOrTablet\" (closed)=\"onClosePicker()\" #picker></mat-date-range-picker>\n </mat-form-field>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵsdFormControlConnector","parseDate","dfEnUS"],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ import * as i0 from '@angular/core';
|
|
|
4
4
|
import { viewChild, contentChild, inject, ChangeDetectorRef, input, computed, booleanAttribute, model, output, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
5
5
|
import * as i2 from '@angular/forms';
|
|
6
6
|
import { NgForm, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
7
|
-
import { provideDateFnsAdapter } from '@angular/material-date-fns-adapter';
|
|
8
7
|
import { MAT_DATE_LOCALE } from '@angular/material/core';
|
|
9
8
|
import * as i5 from '@angular/material/datepicker';
|
|
10
9
|
import { MatDatepicker, MatDatepickerModule } from '@angular/material/datepicker';
|
|
@@ -16,16 +15,66 @@ import { MatTooltipModule } from '@angular/material/tooltip';
|
|
|
16
15
|
import { SdView } from '@sdcorejs/angular/components/view';
|
|
17
16
|
import { SdViewDefDirective, SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';
|
|
18
17
|
import { SdLabel } from '@sdcorejs/angular/forms/label';
|
|
19
|
-
import { SD_FORM_CONFIGURATION, sdFormControlState, sdViewedTransform, sdViewedInline, SdFormControl, ɵsdFormControlConnector as _sdFormControlConnector, SdInlineErrorValidator } from '@sdcorejs/angular/forms/models';
|
|
18
|
+
import { SD_FORM_CONFIGURATION, sdFormControlState, sdViewedTransform, sdViewedInline, SdFormControl, ɵsdFormControlConnector as _sdFormControlConnector, SdInlineErrorValidator, provideSdStrictDateFnsAdapter } from '@sdcorejs/angular/forms/models';
|
|
20
19
|
import { sdIsEmpty, sdSerializeDataValue } from '@sdcorejs/angular/utilities/data-state';
|
|
21
20
|
import { I18nService } from '@sdcorejs/angular/i18n';
|
|
22
21
|
import { DateUtilities } from '@sdcorejs/angular/utilities/extensions';
|
|
23
22
|
import { Utilities, BrowserUtilities } from '@sdcorejs/utils/fns';
|
|
24
|
-
import { parse } from 'date-fns';
|
|
23
|
+
import { parse, isValid } from 'date-fns';
|
|
25
24
|
import { enUS } from 'date-fns/locale';
|
|
26
25
|
import { Subscription } from 'rxjs';
|
|
27
26
|
import { SdIcon } from '@sdcorejs/angular/modules/icon';
|
|
28
27
|
|
|
28
|
+
const DATE_DISPLAY_FORMAT = 'dd/MM/yyyy';
|
|
29
|
+
const DATE_DISPLAY_PATTERN = /^\d{2}\/\d{2}\/\d{4}$/;
|
|
30
|
+
const DATE_INPUT_MAX_DIGITS = 8;
|
|
31
|
+
/** Chèn `/` vào chuỗi số người dùng đang gõ: `22081991` → `22/08/1991`. */
|
|
32
|
+
function formatDateInput(value, addTrailingSeparator) {
|
|
33
|
+
const digits = value.replace(/\D/g, '').slice(0, DATE_INPUT_MAX_DIGITS);
|
|
34
|
+
let formatted = digits.slice(0, 2);
|
|
35
|
+
if (digits.length > 2)
|
|
36
|
+
formatted += `/${digits.slice(2, 4)}`;
|
|
37
|
+
if (digits.length > 4)
|
|
38
|
+
formatted += `/${digits.slice(4)}`;
|
|
39
|
+
if (addTrailingSeparator && (digits.length === 2 || digits.length === 4))
|
|
40
|
+
formatted += '/';
|
|
41
|
+
return formatted;
|
|
42
|
+
}
|
|
43
|
+
/** Chuỗi còn dở dang (đang gõ) — chưa đủ `dd/MM/yyyy` nhưng vẫn đúng khuôn. */
|
|
44
|
+
function isPartialDateInput(value) {
|
|
45
|
+
return /^(?:\d{0,2})(?:\/\d{0,2})?(?:\/\d{0,4})?$/.test(value);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Chỉ nhận đúng `dd/MM/yyyy` ĐẦY ĐỦ và có thật trên lịch.
|
|
49
|
+
*
|
|
50
|
+
* WHY chặt tay như vậy: `date-fns.parse(value, 'dd/MM/yyyy')` rất dễ dãi — nó
|
|
51
|
+
* nhận cả năm thiếu chữ số, nên `11/12/2` ra năm 0002 còn `11/12/20` ra năm
|
|
52
|
+
* 0020. Nếu để lọt, người dùng mới gõ nửa chừng đã bị coi là nhập xong.
|
|
53
|
+
*/
|
|
54
|
+
function parseDateInput(value) {
|
|
55
|
+
if (!DATE_DISPLAY_PATTERN.test(value))
|
|
56
|
+
return null;
|
|
57
|
+
const parsed = parse(value, DATE_DISPLAY_FORMAT, new Date());
|
|
58
|
+
return isValid(parsed) && DateUtilities.toFormat(parsed, DATE_DISPLAY_FORMAT) === value ? parsed : null;
|
|
59
|
+
}
|
|
60
|
+
/** Giữ con trỏ đứng đúng chỗ sau khi chuỗi được chèn thêm `/`. */
|
|
61
|
+
function getCaretPosition(value, selectionStart, formattedValue, addTrailingSeparator) {
|
|
62
|
+
const digitsBeforeCaret = value.slice(0, selectionStart).replace(/\D/g, '').length;
|
|
63
|
+
let formattedIndex = 0;
|
|
64
|
+
let digitCount = 0;
|
|
65
|
+
while (formattedIndex < formattedValue.length && digitCount < digitsBeforeCaret) {
|
|
66
|
+
if (/\d/.test(formattedValue[formattedIndex]))
|
|
67
|
+
digitCount++;
|
|
68
|
+
formattedIndex++;
|
|
69
|
+
}
|
|
70
|
+
if (addTrailingSeparator && digitCount === digitsBeforeCaret && formattedValue[formattedIndex] === '/')
|
|
71
|
+
formattedIndex++;
|
|
72
|
+
return formattedIndex;
|
|
73
|
+
}
|
|
74
|
+
function dateControlsEqual(left, right) {
|
|
75
|
+
return (left === right || (!!left && !!right && DateUtilities.toFormat(left, 'yyyy/MM/dd') === DateUtilities.toFormat(right, 'yyyy/MM/dd')));
|
|
76
|
+
}
|
|
77
|
+
|
|
29
78
|
function normalizeDateModel(value) {
|
|
30
79
|
if (!DateUtilities.isDate(value))
|
|
31
80
|
return null;
|
|
@@ -38,9 +87,6 @@ function dateModelToControl(value) {
|
|
|
38
87
|
function dateControlToModel(value) {
|
|
39
88
|
return value ? normalizeDateModel(value) : null;
|
|
40
89
|
}
|
|
41
|
-
function dateControlsEqual(left, right) {
|
|
42
|
-
return left === right || normalizeDateModel(left) === normalizeDateModel(right);
|
|
43
|
-
}
|
|
44
90
|
class SdDate {
|
|
45
91
|
id = `I${Utilities.generateUuid()}`;
|
|
46
92
|
// ==========================================
|
|
@@ -186,6 +232,7 @@ class SdDate {
|
|
|
186
232
|
});
|
|
187
233
|
isFocused = false;
|
|
188
234
|
isValid;
|
|
235
|
+
#hasInvalidInput = false;
|
|
189
236
|
#subscription = new Subscription();
|
|
190
237
|
ngOnInit() {
|
|
191
238
|
this.#subscription.add(this.formControl.sdChanges.subscribe(() => {
|
|
@@ -209,6 +256,23 @@ class SdDate {
|
|
|
209
256
|
};
|
|
210
257
|
onBlur = () => {
|
|
211
258
|
this.isFocused = false;
|
|
259
|
+
const input = this.inputRef()?.nativeElement;
|
|
260
|
+
const displayValue = input?.value ?? '';
|
|
261
|
+
const parsedValue = this.#hasInvalidInput ? null : parseDateInput(displayValue);
|
|
262
|
+
this.formControl.markAsTouched();
|
|
263
|
+
this.isValid = false;
|
|
264
|
+
this.#setDateError(false);
|
|
265
|
+
this.#hasInvalidInput = false;
|
|
266
|
+
if (parsedValue) {
|
|
267
|
+
if (!dateControlsEqual(this.formControl.value, parsedValue)) {
|
|
268
|
+
this.formControl.setValue(parsedValue);
|
|
269
|
+
}
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (input && displayValue)
|
|
273
|
+
input.value = '';
|
|
274
|
+
if (this.formControl.value !== null)
|
|
275
|
+
this.formControl.setValue(null);
|
|
212
276
|
};
|
|
213
277
|
onClick = () => {
|
|
214
278
|
if (this.sdViewDef()?.templateRef) {
|
|
@@ -254,30 +318,57 @@ class SdDate {
|
|
|
254
318
|
}
|
|
255
319
|
return false;
|
|
256
320
|
};
|
|
321
|
+
onInput = (event) => {
|
|
322
|
+
const input = event.target;
|
|
323
|
+
if (!input)
|
|
324
|
+
return;
|
|
325
|
+
const rawValue = input.value;
|
|
326
|
+
const inputType = event.inputType;
|
|
327
|
+
const isDeleting = inputType?.startsWith('delete') ?? false;
|
|
328
|
+
const addTrailingSeparator = !isDeleting;
|
|
329
|
+
const hasInvalidCharacters = /[^\d/]/.test(rawValue);
|
|
330
|
+
const selectionStart = input.selectionStart ?? rawValue.length;
|
|
331
|
+
const formattedValue = formatDateInput(rawValue, addTrailingSeparator);
|
|
332
|
+
if (formattedValue !== rawValue) {
|
|
333
|
+
input.value = formattedValue;
|
|
334
|
+
const caretPosition = getCaretPosition(rawValue, selectionStart, formattedValue, addTrailingSeparator);
|
|
335
|
+
input.setSelectionRange?.(caretPosition, caretPosition);
|
|
336
|
+
}
|
|
337
|
+
this.#hasInvalidInput = hasInvalidCharacters;
|
|
338
|
+
this.#validateDateInput(formattedValue, hasInvalidCharacters);
|
|
339
|
+
};
|
|
340
|
+
/** Kept as a compatibility entry point for callers that used the old keyup handler. */
|
|
257
341
|
onKeyup = (event) => {
|
|
258
|
-
const
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
342
|
+
const target = event.target;
|
|
343
|
+
const value = target?.value ?? '';
|
|
344
|
+
this.#validateDateInput(value, /[^\d/]/.test(value));
|
|
345
|
+
};
|
|
346
|
+
#validateDateInput(value, hasInvalidCharacters) {
|
|
347
|
+
const parsedValue = parseDateInput(value);
|
|
348
|
+
const invalid = !!value && (hasInvalidCharacters || (!parsedValue && !isPartialDateInput(value)));
|
|
349
|
+
this.isValid = !!value && !parsedValue;
|
|
350
|
+
if (invalid) {
|
|
351
|
+
this.formControl.markAsDirty();
|
|
352
|
+
this.#setDateError(true);
|
|
268
353
|
}
|
|
269
354
|
else {
|
|
270
|
-
|
|
271
|
-
this.isValid = false;
|
|
272
|
-
formControl.setErrors({ ...formControl.errors, date: null });
|
|
273
|
-
this.formControl.updateValueAndValidity();
|
|
274
|
-
}, 0);
|
|
355
|
+
this.#setDateError(false);
|
|
275
356
|
}
|
|
276
|
-
}
|
|
357
|
+
}
|
|
358
|
+
#setDateError(invalid) {
|
|
359
|
+
const errors = { ...(this.formControl.errors ?? {}) };
|
|
360
|
+
if (invalid)
|
|
361
|
+
errors['date'] = this.#i18n.t('core.form.date.invalid-format');
|
|
362
|
+
else
|
|
363
|
+
delete errors['date'];
|
|
364
|
+
this.formControl.setErrors(Object.keys(errors).length > 0 ? errors : null);
|
|
365
|
+
}
|
|
277
366
|
onChange = (event) => {
|
|
278
367
|
this.inputRef()?.nativeElement?.focus();
|
|
279
|
-
const value =
|
|
368
|
+
const value = event.value ?? null;
|
|
369
|
+
this.#hasInvalidInput = false;
|
|
280
370
|
this.isValid = false;
|
|
371
|
+
this.#setDateError(false);
|
|
281
372
|
if (!dateControlsEqual(this.formControl.value, value)) {
|
|
282
373
|
this.formControl.setValue(value);
|
|
283
374
|
}
|
|
@@ -293,7 +384,9 @@ class SdDate {
|
|
|
293
384
|
// DateFnsAdapter inject MAT_DATE_LOCALE; nếu undefined sẽ throw khi format/parse.
|
|
294
385
|
// Provide locale en-US tại scope component để hành vi giống Moment cũ (English default).
|
|
295
386
|
{ provide: MAT_DATE_LOCALE, useValue: enUS },
|
|
296
|
-
|
|
387
|
+
// Adapter parse chặt: Material parse lại ô nhập sau mỗi phím gõ, adapter mặc
|
|
388
|
+
// định nhận cả chuỗi dở dang nên `11/12/2` từng thành năm 0002.
|
|
389
|
+
provideSdStrictDateFnsAdapter({
|
|
297
390
|
parse: { dateInput: 'dd/MM/yyyy' },
|
|
298
391
|
display: {
|
|
299
392
|
dateInput: 'dd/MM/yyyy',
|
|
@@ -302,7 +395,7 @@ class SdDate {
|
|
|
302
395
|
monthYearA11yLabel: 'MMMM yyyy',
|
|
303
396
|
},
|
|
304
397
|
}),
|
|
305
|
-
], queries: [{ propertyName: "sdLabelTemplate", first: true, predicate: ["sdLabel"], descendants: true, isSignal: true }, { propertyName: "sdValueTemplate", first: true, predicate: ["sdValue"], descendants: true, isSignal: true }, { propertyName: "sdViewDef", first: true, predicate: SdViewDefDirective, descendants: true, isSignal: true }, { propertyName: "sdLabelDef", first: true, predicate: SdLabelDefDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "datePicker", first: true, predicate: MatDatepicker, descendants: true, isSignal: true }], ngImport: i0, 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@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 \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; calendar editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF 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\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-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\u00F3a\" aria-label=\"X\u00F3a\">\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", 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 ::ng-deep .mat-mdc-form-field-icon-suffix{display:flex}: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"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "component", type: SdView, selector: "sd-view", inputs: ["label", "value", "display", "hyperlink", "labelTemplate", "valueTemplate", "selectedItems"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
398
|
+
], queries: [{ propertyName: "sdLabelTemplate", first: true, predicate: ["sdLabel"], descendants: true, isSignal: true }, { propertyName: "sdValueTemplate", first: true, predicate: ["sdValue"], descendants: true, isSignal: true }, { propertyName: "sdViewDef", first: true, predicate: SdViewDefDirective, descendants: true, isSignal: true }, { propertyName: "sdLabelDef", first: true, predicate: SdLabelDefDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "datePicker", first: true, predicate: MatDatepicker, descendants: true, isSignal: true }], ngImport: i0, 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@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 \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; calendar editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF 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\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-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 (input)=\"onInput($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\u00F3a\" aria-label=\"X\u00F3a\">\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", 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 ::ng-deep .mat-mdc-form-field-icon-suffix{display:flex}: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"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "component", type: SdView, selector: "sd-view", inputs: ["label", "value", "display", "hyperlink", "labelTemplate", "valueTemplate", "selectedItems"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
306
399
|
}
|
|
307
400
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdDate, decorators: [{
|
|
308
401
|
type: Component,
|
|
@@ -310,7 +403,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
310
403
|
// DateFnsAdapter inject MAT_DATE_LOCALE; nếu undefined sẽ throw khi format/parse.
|
|
311
404
|
// Provide locale en-US tại scope component để hành vi giống Moment cũ (English default).
|
|
312
405
|
{ provide: MAT_DATE_LOCALE, useValue: enUS },
|
|
313
|
-
|
|
406
|
+
// Adapter parse chặt: Material parse lại ô nhập sau mỗi phím gõ, adapter mặc
|
|
407
|
+
// định nhận cả chuỗi dở dang nên `11/12/2` từng thành năm 0002.
|
|
408
|
+
provideSdStrictDateFnsAdapter({
|
|
314
409
|
parse: { dateInput: 'dd/MM/yyyy' },
|
|
315
410
|
display: {
|
|
316
411
|
dateInput: 'dd/MM/yyyy',
|
|
@@ -330,7 +425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
330
425
|
MatDatepickerModule,
|
|
331
426
|
SdLabel,
|
|
332
427
|
SdView,
|
|
333
|
-
], 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@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 \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; calendar editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF 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\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-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\u00F3a\" aria-label=\"X\u00F3a\">\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", 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 ::ng-deep .mat-mdc-form-field-icon-suffix{display:flex}: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"] }]
|
|
428
|
+
], 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@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 \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; calendar editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF 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\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-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 (input)=\"onInput($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\u00F3a\" aria-label=\"X\u00F3a\">\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", 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 ::ng-deep .mat-mdc-form-field-icon-suffix{display:flex}: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"] }]
|
|
334
429
|
}] });
|
|
335
430
|
|
|
336
431
|
/**
|