@sdcorejs/angular 19.0.10 → 19.0.11
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/assets/STYLE-GUIDE.md +2 -2
- package/assets/scss/core/_inline-edit.scss +1 -1
- package/assets/scss/core/form.scss +1 -1
- package/assets/scss/themes/default.scss +2 -2
- package/components/badge/src/badge.component.d.ts +3 -14
- package/components/button/src/button.component.d.ts +5 -3
- package/components/inform/src/inform.component.d.ts +2 -8
- package/components/query-builder/src/query-builder.component.d.ts +3 -3
- package/components/query-builder/src/query-builder.model.d.ts +3 -3
- package/components/table/src/components/command/desktop-command.component.d.ts +0 -1
- package/components/table/src/models/table-command.model.d.ts +3 -3
- package/components/table/src/models/table-option-selector.model.d.ts +5 -5
- package/components/tree/src/tree.model.d.ts +3 -2
- package/fesm2022/sdcorejs-angular-components-anchor.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-badge.mjs +14 -12
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-button.mjs +10 -11
- package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-editor.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs +7 -13
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-history.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs +5 -7
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-inform.mjs +5 -15
- package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +7 -8
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs +24 -28
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-section.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-stepper.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +23 -27
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tree.mjs +6 -8
- package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs +8 -9
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +7 -9
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +7 -9
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +6 -8
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-inline-text.mjs +4 -5
- package/fesm2022/sdcorejs-angular-forms-inline-text.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-label.mjs +4 -5
- package/fesm2022/sdcorejs-angular-forms-label.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-radio.mjs +1 -3
- package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -8
- package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-icon.mjs +523 -0
- package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +24 -26
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules.mjs +1 -0
- package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-confirm.mjs +3 -4
- package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-excel.mjs +22 -14
- package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-utilities-models.mjs +3 -2
- package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
- package/modules/icon/index.d.ts +1 -0
- package/modules/icon/src/icon.component.d.ts +101 -0
- package/modules/icon/src/icon.model.d.ts +59 -0
- package/modules/icon/src/icon.provider.d.ts +33 -0
- package/modules/icon/src/index.d.ts +3 -0
- package/modules/index.d.ts +1 -0
- package/package.json +10 -5
- package/services/excel/src/lib/spreadsheet-formula-injection.util.d.ts +5 -0
- package/utilities/models/src/icon.model.d.ts +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-forms-datetime.mjs","sources":["../../../projects/sdcorejs-angular/forms/datetime/src/popup/sd-time-spinner.component.ts","../../../projects/sdcorejs-angular/forms/datetime/src/popup/sd-time-spinner.component.html","../../../projects/sdcorejs-angular/forms/datetime/src/popup/sd-datetime-picker.component.ts","../../../projects/sdcorejs-angular/forms/datetime/src/popup/sd-datetime-picker.component.html","../../../projects/sdcorejs-angular/forms/datetime/src/datetime.component.ts","../../../projects/sdcorejs-angular/forms/datetime/src/datetime.component.html","../../../projects/sdcorejs-angular/forms/datetime/sdcorejs-angular-forms-datetime.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, booleanAttribute, input, model } from '@angular/core';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\n\n/**\n * Time spinner — UI chọn giờ/phút/(giây) compact, modern.\n *\n * - Format 24h\n * - Mặc định hiển thị HH:MM, bật `showSeconds` để hiện thêm cột giây\n * - Hỗ trợ: click ▲▼, gõ trực tiếp, lăn chuột, mũi tên bàn phím\n * - Wrap vòng (23 → ▲ → 00)\n */\n@Component({\n selector: 'sd-time-spinner',\n standalone: true,\n imports: [CommonModule, TranslatePipe],\n templateUrl: './sd-time-spinner.component.html',\n styleUrl: './sd-time-spinner.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdTimeSpinner {\n // Hai-chiều: cha có thể đọc/ghi từng đơn vị qua signal model.\n hours = model<number>(0);\n minutes = model<number>(0);\n seconds = model<number>(0);\n\n showSeconds = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n\n // Cache hiển thị 2 chữ số — pad-left \"0\".\n pad(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n }\n\n // Bước nhảy ±1, wrap vòng quanh max.\n step(unit: 'h' | 'm' | 's', delta: number) {\n if (this.disabled()) return;\n if (unit === 'h') {\n const next = (this.hours() + delta + 24) % 24;\n this.hours.set(next);\n } else if (unit === 'm') {\n const next = (this.minutes() + delta + 60) % 60;\n this.minutes.set(next);\n } else {\n const next = (this.seconds() + delta + 60) % 60;\n this.seconds.set(next);\n }\n }\n\n /**\n * Buffer tích lũy chữ số đang gõ cho từng đơn vị.\n * Được reset khi: focus, commit (2 chữ số / auto-commit), blur.\n */\n private _buf: Record<'h' | 'm' | 's', string> = { h: '', m: '', s: '' };\n\n private _commitUnit(unit: 'h' | 'm' | 's', num: number) {\n if (unit === 'h') this.hours.set(num);\n else if (unit === 'm') this.minutes.set(num);\n else this.seconds.set(num);\n }\n\n /**\n * onInput chỉ xử lý các trường hợp không qua keydown:\n * paste, drag-drop, mobile soft-keyboard (không fire keydown).\n */\n onInput(unit: 'h' | 'm' | 's', event: Event) {\n if (this.disabled()) return;\n const raw = (event.target as HTMLInputElement).value.replace(/[^0-9]/g, '');\n if (!raw) {\n this._buf[unit] = '';\n return;\n }\n const max = unit === 'h' ? 23 : 59;\n const num = Math.min(parseInt(raw.slice(-2), 10), max);\n this._commitUnit(unit, num);\n this._buf[unit] = '';\n }\n\n // Lăn chuột trên input — cuộn lên = tăng.\n onWheel(unit: 'h' | 'm' | 's', event: WheelEvent) {\n if (this.disabled()) return;\n event.preventDefault();\n this._buf[unit] = '';\n this.step(unit, event.deltaY < 0 ? 1 : -1);\n }\n\n /**\n * Xử lý gõ phím:\n * - Chữ số: buffer 2 ký tự, auto-commit khi đủ hoặc chữ số đầu vượt ngưỡng\n * - Arrow: ±1, reset buffer\n * - Tab/Enter: commit buffer dở (nếu có)\n */\n onKeyDown(unit: 'h' | 'm' | 's', event: KeyboardEvent) {\n if (this.disabled()) return;\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n this._buf[unit] = '';\n this.step(unit, 1);\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this._buf[unit] = '';\n this.step(unit, -1);\n return;\n }\n\n if (/^\\d$/.test(event.key)) {\n event.preventDefault(); // Ta tự kiểm soát hiển thị\n const max = unit === 'h' ? 23 : 59;\n // Chữ số đầu tối đa để còn có thể nhập chữ số 2 hợp lệ:\n // giờ → max first digit = 2 (vd '3x' không hợp lệ vì max 23)\n // phút/giây → max first digit = 5\n const maxFirstDigit = unit === 'h' ? 2 : 5;\n const buf = this._buf[unit] + event.key;\n const el = event.target as HTMLInputElement;\n\n if (buf.length === 1) {\n const d = parseInt(event.key, 10);\n if (d > maxFirstDigit) {\n // Chữ số đầu không thể là hàng chục hợp lệ → commit ngay dạng 0X\n const num = Math.min(d, max);\n this._commitUnit(unit, num);\n el.value = this.pad(num);\n this._buf[unit] = '';\n } else {\n // Chờ chữ số thứ 2 — hiển thị ký tự đơn tạm thời\n this._buf[unit] = event.key;\n el.value = event.key;\n }\n } else {\n // Đã có 2 chữ số → commit\n const num = Math.min(parseInt(buf, 10), max);\n this._commitUnit(unit, num);\n el.value = this.pad(num);\n this._buf[unit] = '';\n }\n return;\n }\n\n if (event.key === 'Backspace' || event.key === 'Delete') {\n this._buf[unit] = '';\n return; // browser tự xử lý xóa ký tự\n }\n\n if (event.key === 'Tab' || event.key === 'Enter') {\n // Commit nếu còn buffer chữ số đơn\n if (this._buf[unit]) {\n const max = unit === 'h' ? 23 : 59;\n const num = Math.min(parseInt(this._buf[unit], 10), max);\n this._commitUnit(unit, num);\n this._buf[unit] = '';\n }\n }\n }\n\n // Khi blur: commit buffer dở (nếu có) + chuẩn hóa hiển thị.\n onBlur(unit: 'h' | 'm' | 's', event: FocusEvent) {\n if (this._buf[unit]) {\n const max = unit === 'h' ? 23 : 59;\n const num = Math.min(parseInt(this._buf[unit], 10), max);\n this._commitUnit(unit, num);\n this._buf[unit] = '';\n }\n const el = event.target as HTMLInputElement;\n if (unit === 'h') el.value = this.pad(this.hours());\n else if (unit === 'm') el.value = this.pad(this.minutes());\n else el.value = this.pad(this.seconds());\n }\n\n // Chọn toàn bộ text khi focus + reset buffer.\n onFocus(unit: 'h' | 'm' | 's', event: FocusEvent) {\n this._buf[unit] = '';\n (event.target as HTMLInputElement).select();\n }\n}\n","<div class=\"sd-time-spinner\" [class.disabled]=\"disabled()\">\n <!-- HOURS -->\n <div class=\"unit\">\n <button type=\"button\" class=\"step\" (click)=\"step('h', 1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.increase-hour' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </button>\n <input\n class=\"value\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"pad(hours())\"\n [disabled]=\"disabled()\"\n (input)=\"onInput('h', $event)\"\n (wheel)=\"onWheel('h', $event)\"\n (keydown)=\"onKeyDown('h', $event)\"\n (focus)=\"onFocus('h', $event)\"\n (blur)=\"onBlur('h', $event)\"\n [attr.aria-label]=\"'core.form.time-spinner.hour' | translate\" />\n <button type=\"button\" class=\"step\" (click)=\"step('h', -1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.decrease-hour' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n </div>\n\n <span class=\"sep\">:</span>\n\n <!-- MINUTES -->\n <div class=\"unit\">\n <button type=\"button\" class=\"step\" (click)=\"step('m', 1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.increase-minute' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </button>\n <input\n class=\"value\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"pad(minutes())\"\n [disabled]=\"disabled()\"\n (input)=\"onInput('m', $event)\"\n (wheel)=\"onWheel('m', $event)\"\n (keydown)=\"onKeyDown('m', $event)\"\n (focus)=\"onFocus('m', $event)\"\n (blur)=\"onBlur('m', $event)\"\n [attr.aria-label]=\"'core.form.time-spinner.minute' | translate\" />\n <button type=\"button\" class=\"step\" (click)=\"step('m', -1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.decrease-minute' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"sep\">:</span>\n <!-- SECONDS -->\n <div class=\"unit\">\n <button type=\"button\" class=\"step\" (click)=\"step('s', 1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.increase-second' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </button>\n <input\n class=\"value\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"pad(seconds())\"\n [disabled]=\"disabled()\"\n (input)=\"onInput('s', $event)\"\n (wheel)=\"onWheel('s', $event)\"\n (keydown)=\"onKeyDown('s', $event)\"\n (focus)=\"onFocus('s', $event)\"\n (blur)=\"onBlur('s', $event)\"\n [attr.aria-label]=\"'core.form.time-spinner.second' | translate\" />\n <button type=\"button\" class=\"step\" (click)=\"step('s', -1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.decrease-second' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Output, booleanAttribute, input, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { isValid as isValidDate } from 'date-fns';\nimport { SdTimeSpinner } from './sd-time-spinner.component';\n\n/**\n * Datetime picker popup — Calendar (Angular Material) + Time Spinner + Footer.\n *\n * Component này được render trong CDK Overlay từ `sd-datetime`.\n * Phát event `confirmed`/`cancelled` khi user thao tác trên footer.\n */\n@Component({\n selector: 'sd-datetime-picker',\n standalone: true,\n imports: [CommonModule, MatDatepickerModule, MatButtonModule, SdTimeSpinner, TranslatePipe],\n templateUrl: './sd-datetime-picker.component.html',\n styleUrl: './sd-datetime-picker.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdDatetimePicker {\n // ==========================================\n // INPUTS\n // ==========================================\n /** Giá trị khởi tạo của picker (native Date, có thể null). */\n initialValue = input<Date | null>(null);\n /** Min/max boundary (Date hoặc bất kỳ giá trị nào hợp lệ cho `new Date(...)`). */\n minDate = input<Date | string | number | null>(null);\n maxDate = input<Date | string | number | null>(null);\n /** Hiển thị thêm cột giây (mặc định ẩn — chỉ HH:MM). */\n showSeconds = input(false, { transform: booleanAttribute });\n /** Disabled state. */\n disabled = input(false, { transform: booleanAttribute });\n\n // ==========================================\n // OUTPUTS (legacy EventEmitter để tương thích Overlay subscription)\n // ==========================================\n @Output() confirmed = new EventEmitter<Date>();\n @Output() cancelled = new EventEmitter<void>();\n\n // ==========================================\n // STATE — signals nội bộ\n // ==========================================\n // date-fns là immutable — luôn cấp Date mới, không mutate.\n selectedDate = signal<Date>(new Date());\n hours = signal<number>(0);\n minutes = signal<number>(0);\n seconds = signal<number>(0);\n\n constructor() {\n // Khởi tạo từ initialValue khi component được tạo.\n // Effect không cần thiết vì input chỉ set một lần lúc mở popup.\n queueMicrotask(() => this.#hydrateFromInput());\n }\n\n #hydrateFromInput() {\n const init = this.initialValue();\n // Clone bằng new Date(getTime()) để không chia sẻ reference với caller.\n const d = init instanceof Date && isValidDate(init) ? new Date(init.getTime()) : new Date();\n this.selectedDate.set(d);\n this.hours.set(d.getHours());\n this.minutes.set(d.getMinutes());\n this.seconds.set(d.getSeconds());\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n\n /** Khi user chọn ngày trên MatCalendar. */\n onDateSelected(date: Date | null) {\n if (!date) return;\n // Giữ nguyên giờ/phút/giây hiện tại, chỉ thay đổi ngày.\n const next = new Date(date.getTime());\n next.setHours(this.hours(), this.minutes(), this.seconds(), 0);\n this.selectedDate.set(next);\n }\n\n onConfirm() {\n if (this.disabled()) return;\n // Tạo Date mới từ selectedDate + hours/minutes/seconds hiện tại.\n const base = this.selectedDate();\n const result = new Date(base.getTime());\n result.setHours(this.hours(), this.minutes(), this.showSeconds() ? this.seconds() : 0, 0);\n this.confirmed.emit(result);\n }\n\n onCancel() {\n this.cancelled.emit();\n }\n\n /** Đặt nhanh thời gian \"Bây giờ\". */\n onNow() {\n if (this.disabled()) return;\n const now = new Date();\n this.selectedDate.set(now);\n this.hours.set(now.getHours());\n this.minutes.set(now.getMinutes());\n this.seconds.set(now.getSeconds());\n }\n\n // Min/Max — chuyển về Date cho MatCalendar (date-fns adapter dùng native Date).\n get _minDate(): Date | null {\n const v = this.minDate();\n if (v === null || v === undefined) return null;\n if (v instanceof Date) return isValidDate(v) ? v : null;\n const d = new Date(v);\n return isValidDate(d) ? d : null;\n }\n get _maxDate(): Date | null {\n const v = this.maxDate();\n if (v === null || v === undefined) return null;\n if (v instanceof Date) return isValidDate(v) ? v : null;\n const d = new Date(v);\n return isValidDate(d) ? d : null;\n }\n}\n","<div class=\"sd-datetime-picker\">\n <!-- Calendar -->\n <div class=\"picker-calendar\">\n <mat-calendar\n [selected]=\"selectedDate()\"\n [minDate]=\"_minDate\"\n [maxDate]=\"_maxDate\"\n (selectedChange)=\"onDateSelected($event)\">\n </mat-calendar>\n </div>\n\n <!-- Divider mảnh -->\n <div class=\"picker-divider\"></div>\n\n <!-- Time Spinner -->\n <div class=\"picker-time\">\n <sd-time-spinner\n [(hours)]=\"hours\"\n [(minutes)]=\"minutes\"\n [(seconds)]=\"seconds\"\n [showSeconds]=\"showSeconds()\"\n [disabled]=\"disabled()\">\n </sd-time-spinner>\n </div>\n\n <!-- Footer: Bây giờ | Hủy | Xác nhận -->\n <div class=\"picker-footer\">\n <button type=\"button\" class=\"btn btn-ghost\" (click)=\"onNow()\" [disabled]=\"disabled()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\n <polyline points=\"12 7 12 12 15 14\"></polyline>\n </svg>\n <span>{{ 'core.form.datetime.now' | translate }}</span>\n </button>\n\n <div class=\"footer-actions\">\n <button type=\"button\" class=\"btn btn-text\" (click)=\"onCancel()\">{{ 'core.common.cancel' | translate }}</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onConfirm()\" [disabled]=\"disabled()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n <span>{{ 'core.form.datetime.confirm' | translate }}</span>\n </button>\n </div>\n </div>\n</div>\n","import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n input,\n model,\n computed,\n effect,\n untracked,\n OnDestroy,\n OnInit,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n signal,\n Injector,\n} from '@angular/core';\nimport { AbstractControl, FormGroup, FormsModule, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\nimport { provideDateFnsAdapter } from '@angular/material-date-fns-adapter';\nimport { MAT_DATE_LOCALE } from '@angular/material/core';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n SD_FORM_CONFIGURATION,\n SdFormControl,\n SdInlineErrorValidator,\n sdFormControlState,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { Size } from '@sdcorejs/utils/models';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { isValid as isValidDate, parse as parseDate } from 'date-fns';\nimport { enUS as dfEnUS } from 'date-fns/locale';\nimport { Subscription } from 'rxjs';\nimport { SdDatetimePicker } from './popup/sd-datetime-picker.component';\n\n/**\n * Format parse/display dùng cho MatDateAdapter (date-fns).\n * Note: format input là `dd/MM/yyyy HH:mm` (không có giây mặc định) —\n * giây chỉ được render khi `showSeconds` = true.\n * Token date-fns dùng chữ thường: `yyyy` (năm), `dd` (ngày), `HH` (giờ 24h).\n */\nconst SD_DATETIME_FORMATS = {\n parse: { dateInput: 'dd/MM/yyyy HH:mm' },\n display: {\n dateInput: 'dd/MM/yyyy HH:mm',\n monthYearLabel: 'MMM yyyy',\n dateA11yLabel: 'PP',\n monthYearA11yLabel: 'MMMM yyyy',\n },\n};\n\n/**\n * Thử parse `value` theo lần lượt nhiều format; trả về Date đầu tiên hợp lệ.\n * date-fns không hỗ trợ multi-format parse như moment(value, [fmt1, fmt2], true).\n */\nfunction parseFirstValid(value: string, formats: string[]): Date | null {\n for (const fmt of formats) {\n const d = parseDate(value, fmt, new Date());\n if (isValidDate(d)) return d;\n }\n return null;\n}\n\n@Component({\n selector: 'sd-datetime',\n templateUrl: './datetime.component.html',\n styleUrl: './datetime.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(SD_DATETIME_FORMATS),\n ],\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatIconModule,\n MatTooltipModule,\n MatFormFieldModule,\n SdLabel,\n SdView,\n ],\n})\nexport class SdDatetime implements OnDestroy, OnInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n inputRef = viewChild<ElementRef<HTMLInputElement>>('input');\n\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdViewDef = contentChild(SdViewDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private ref = inject(ChangeDetectorRef);\n private overlay = inject(Overlay);\n private elementRef = inject(ElementRef);\n private injector = inject(Injector);\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-datetime-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (datetime overlay). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n /** Hiển thị thêm cột giây trong picker. Mặc định: chỉ HH:MM. */\n showSeconds = input(false, { transform: booleanAttribute });\n\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 datetime editor is always mounted\n // (chrome hidden via CSS); the sd-view text face opens the overlay 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 datetime overlay from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n /** View display template: `sdViewDef` overrides the projected `#sdValue` (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.datetime.required');\n if (errors['matDatepickerMin']) {\n const d = this.resolvedMin();\n return this.#i18n.t('core.form.datetime.min-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['matDatepickerMax']) {\n const d = this.resolvedMax();\n return this.#i18n.t('core.form.datetime.max-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['date']) return errors['date'] as string;\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n hyperlink = input<string | null | undefined>();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n // Min/max — chấp nhận 'TODAY', Date, hoặc string ISO\n minInput = input<any>(undefined, { alias: 'min' });\n minDateInput = input<any>(undefined, { alias: 'minDate' });\n resolvedMin = computed(() => this.#parseDateBoundary(this.minInput() ?? this.minDateInput()));\n\n maxInput = input<any>(undefined, { alias: 'max' });\n maxDateInput = input<any>(undefined, { alias: 'maxDate' });\n resolvedMax = computed(() => this.#parseDateBoundary(this.maxInput() ?? this.maxDateInput()));\n\n valueModel = model<string | number | Date | undefined | null>(undefined, { alias: 'model' });\n\n // viewed-mode: formControl.value là chuỗi display (dd/MM/yyyy HH:mm) nên DatePipe không parse được.\n // Lấy thẳng từ valueModel (nguồn dữ liệu thật) rồi convert sang Date cho DatePipe.\n viewedDate = computed<Date | null>(() => {\n const v = this.valueModel();\n if (v == null || !DateUtilities.isDate(v)) return null;\n const iso = DateUtilities.toFormat(v as any, 'yyyy/MM/dd HH:mm:ss');\n if (!iso) return null;\n const d = parseDate(iso, 'yyyy/MM/dd HH:mm:ss', new Date());\n return isValidDate(d) ? d : null;\n });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>();\n\n // ==========================================\n // 5. INTERNAL STATE\n // ==========================================\n isMobileOrTablet = BrowserUtilities.isMobile();\n formControl = new SdFormControl();\n isFocused = false;\n isValid?: boolean;\n\n /** State popup — true khi đang mở. */\n pickerOpened = signal(false);\n\n #date: string | undefined | null;\n #subscription = new Subscription();\n #overlayRef: OverlayRef | null = null;\n\n constructor() {\n // EFFECT 1: Sync model thay đổi từ bên ngoài → cập nhật hiển thị\n effect(() => {\n let val = this.valueModel();\n untracked(() => {\n if (!DateUtilities.isDate(val)) {\n val = null;\n }\n val = DateUtilities.toFormat(val, 'yyyy/MM/dd HH:mm');\n if (this.#date !== val) {\n this.#date = val;\n // Cập nhật formControl với chuỗi hiển thị dd/MM/yyyy HH:mm\n const fmt = this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm';\n const displayStr = DateUtilities.isDate(this.#date) ? DateUtilities.toFormat(this.#date, fmt) : null;\n this.formControl.setValue(displayStr, { emitEvent: false });\n }\n });\n });\n\n // EFFECT 2: Sync Disable\n effect(() => {\n if (this.disabled()) this.formControl.disable({ emitEvent: false });\n else this.formControl.enable({ emitEvent: false });\n });\n\n // EFFECT 3: Update Validators\n effect(() => {\n const req = this.required();\n const inl = this.inlineError();\n\n untracked(() => {\n const validators: ValidatorFn[] = [];\n if (req) validators.push(Validators.required);\n if (inl) validators.push(SdInlineErrorValidator);\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n });\n });\n }\n\n ngOnInit() {\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n const formGroup = this.form();\n formGroup?.addControl(this.name(), this.formControl);\n }\n\n ngOnDestroy() {\n const formGroup = this.form();\n formGroup?.removeControl(this.name());\n this.#subscription.unsubscribe();\n this.#closeOverlay();\n }\n\n // ==========================================\n // 6. POPUP MANAGEMENT — CDK Overlay\n // ==========================================\n\n /** Mở popup chọn datetime, neo vào input. */\n open() {\n if (this.formControl.disabled || this.pickerOpened()) return;\n\n const origin = this.elementRef.nativeElement as HTMLElement;\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(origin)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n ])\n .withFlexibleDimensions(false)\n .withPush(true);\n\n const overlayConfig = new OverlayConfig({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'sd-datetime-backdrop',\n panelClass: 'sd-datetime-overlay-panel',\n });\n\n this.#overlayRef = this.overlay.create(overlayConfig);\n const portal = new ComponentPortal(SdDatetimePicker, null, this.injector);\n const ref = this.#overlayRef.attach(portal);\n\n // Đẩy state hiện tại vào popup\n ref.setInput('initialValue', this.#currentValueAsDate());\n ref.setInput('minDate', this.resolvedMin());\n ref.setInput('maxDate', this.resolvedMax());\n ref.setInput('showSeconds', this.showSeconds());\n\n // Subscribe events từ popup\n ref.instance.confirmed.subscribe((value: Date) => this.#onPickerConfirm(value));\n ref.instance.cancelled.subscribe(() => this.#onPickerCancel());\n\n // Đóng khi click backdrop\n this.#overlayRef.backdropClick().subscribe(() => this.#onPickerCancel());\n\n this.pickerOpened.set(true);\n this.ref.markForCheck();\n }\n\n /** Đóng popup (public — gọi từ template nếu cần). */\n close() {\n this.#closeOverlay();\n }\n\n #closeOverlay() {\n if (this.#overlayRef) {\n this.#overlayRef.dispose();\n this.#overlayRef = null;\n }\n if (this.pickerOpened()) {\n this.pickerOpened.set(false);\n this.ref.markForCheck();\n }\n }\n\n #onPickerConfirm(value: Date) {\n const fmt = this.showSeconds() ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00';\n // value giờ là native Date (date-fns), không cần .toDate() như Moment.\n const stored = DateUtilities.toFormat(value, fmt);\n if (this.#date !== stored) {\n this.valueModel.set(stored);\n this.sdChange.emit(stored);\n }\n this.#closeOverlay();\n }\n\n #onPickerCancel() {\n this.#closeOverlay();\n }\n\n /** Lấy giá trị hiện tại dưới dạng native Date để truyền vào popup. */\n #currentValueAsDate(): Date | null {\n const v = this.valueModel();\n if (!v || !DateUtilities.isDate(v)) return null;\n const fmtted = DateUtilities.toFormat(v as any, 'yyyy/MM/dd HH:mm:ss');\n if (!fmtted) return null;\n const parsed = parseDate(fmtted, 'yyyy/MM/dd HH:mm:ss', new Date());\n return isValidDate(parsed) ? parsed : null;\n }\n\n // ==========================================\n // 7. PARSE/VALIDATE HELPERS\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 // ==========================================\n // 8. INPUT EVENT HANDLERS\n // ==========================================\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit();\n };\n\n onBlur = () => {\n this.isFocused = false;\n };\n\n onClick = () => {\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.inputRef()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n setTimeout(() => {\n this.inputRef()?.nativeElement?.focus();\n this.open();\n }, 100);\n };\n\n focusInputElement() {\n this.inputRef()?.nativeElement?.focus();\n }\n\n onKeyDown = (event: KeyboardEvent) => {\n const key = event.keyCode || event.charCode;\n const isShift = key === 16;\n\n if (event.ctrlKey && (key === 67 || key === 86)) return true;\n\n if (\n ((key >= 48 && key <= 57) ||\n key === 8 ||\n key <= 37 ||\n key <= 39 ||\n (key >= 96 && key <= 105) ||\n key === 191 ||\n key === 186 ||\n key === 59) &&\n !isShift\n ) {\n return true;\n }\n return false;\n };\n\n /**\n * Khi user gõ trực tiếp vào input và rời focus → validate format dd/MM/yyyy HH:mm\n * Hỗ trợ cả format có giây.\n */\n onConfirmInput = (event: any) => {\n const currentVal: string = event.target.value;\n const formControl: AbstractControl = this.formControl;\n const regexToMinutes = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d [012]{0,1}[0-9]:[0-6][0-9]$/g;\n const regexToSecond = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d [012]{0,1}[0-9]:[0-6][0-9]:[0-6][0-9]$/g;\n\n if (currentVal && !(regexToMinutes.test(currentVal) || regexToSecond.test(currentVal))) {\n setTimeout(() => {\n formControl.markAsDirty();\n formControl.markAsTouched();\n formControl.setErrors({ ...formControl.errors, date: this.#i18n.t('core.form.datetime.invalid-format') });\n }, 0);\n return;\n }\n\n setTimeout(() => {\n formControl.setErrors({ ...formControl.errors, date: null });\n this.formControl.updateValueAndValidity();\n }, 0);\n\n // Đồng bộ ngược về model nếu hợp lệ.\n // date-fns không có multi-format strict parse như moment, dùng helper parseFirstValid.\n if (currentVal) {\n const parsed = parseFirstValid(currentVal, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);\n if (parsed) {\n const fmt = this.showSeconds() ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00';\n const stored = DateUtilities.toFormat(parsed, fmt);\n if (this.#date !== stored) {\n this.valueModel.set(stored);\n this.sdChange.emit(stored);\n }\n }\n } else if (this.valueModel()) {\n this.valueModel.set(null);\n this.sdChange.emit(null);\n }\n };\n\n clear = ($event: any) => {\n $event?.stopPropagation();\n if (this.formControl.value) {\n this.formControl.setValue(null);\n this.valueModel.set(null);\n this.sdChange.emit(null);\n }\n };\n}\n","@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _required = required();\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = !!formControl.value;\n\n@let _resolvedMin = resolvedMin();\n@let _resolvedMax = resolvedMax();\n\n@let _viewedDate = viewedDate();\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_viewedDate\"\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view là \"mặt\" + trigger; datetime editor render ẩn (.sd-inline-editor) chỉ để mở overlay. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_viewedDate\"\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </span>\n }\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n class=\"c-form-field-datetime-input\"\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance || 'outline'\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div class=\"d-flex align-items-center gap-4\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n [id]=\"id\"\n (blur)=\"onConfirmInput($event)\"\n (keyup.enter)=\"onConfirmInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [formControl]=\"formControl\"\n [required]=\"_required\"\n [placeholder]=\"placeholder() || _label || ''\"\n [min]=\"_resolvedMin\"\n [max]=\"_resolvedMax\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n #input\n matInput />\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (formControl.value && !_required && !formControl.disabled && !_bare) {\n <button\n type=\"button\"\n class=\"sd-clear-btn sd-hover\"\n matSuffix\n (click)=\"clear($event)\"\n title=\"Xóa\"\n aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <span class=\"cursor-pointer sd-suffix-icon\" (click)=\"!formControl.disabled && open()\" matSuffix\n ><svg fill=\"currentColor\" viewBox=\"0 0 24 24\" fill=\"currentColor\" focusable=\"false\">\n <path\n d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\"></path></svg\n ></span>\n </mat-form-field>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isValidDate","parseDate","dfEnUS","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-forms-datetime.mjs","sources":["../../../projects/sdcorejs-angular/forms/datetime/src/popup/sd-time-spinner.component.ts","../../../projects/sdcorejs-angular/forms/datetime/src/popup/sd-time-spinner.component.html","../../../projects/sdcorejs-angular/forms/datetime/src/popup/sd-datetime-picker.component.ts","../../../projects/sdcorejs-angular/forms/datetime/src/popup/sd-datetime-picker.component.html","../../../projects/sdcorejs-angular/forms/datetime/src/datetime.component.ts","../../../projects/sdcorejs-angular/forms/datetime/src/datetime.component.html","../../../projects/sdcorejs-angular/forms/datetime/sdcorejs-angular-forms-datetime.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, booleanAttribute, input, model } from '@angular/core';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\n\n/**\n * Time spinner — UI chọn giờ/phút/(giây) compact, modern.\n *\n * - Format 24h\n * - Mặc định hiển thị HH:MM, bật `showSeconds` để hiện thêm cột giây\n * - Hỗ trợ: click ▲▼, gõ trực tiếp, lăn chuột, mũi tên bàn phím\n * - Wrap vòng (23 → ▲ → 00)\n */\n@Component({\n selector: 'sd-time-spinner',\n standalone: true,\n imports: [CommonModule, TranslatePipe],\n templateUrl: './sd-time-spinner.component.html',\n styleUrl: './sd-time-spinner.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdTimeSpinner {\n // Hai-chiều: cha có thể đọc/ghi từng đơn vị qua signal model.\n hours = model<number>(0);\n minutes = model<number>(0);\n seconds = model<number>(0);\n\n showSeconds = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n\n // Cache hiển thị 2 chữ số — pad-left \"0\".\n pad(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n }\n\n // Bước nhảy ±1, wrap vòng quanh max.\n step(unit: 'h' | 'm' | 's', delta: number) {\n if (this.disabled()) return;\n if (unit === 'h') {\n const next = (this.hours() + delta + 24) % 24;\n this.hours.set(next);\n } else if (unit === 'm') {\n const next = (this.minutes() + delta + 60) % 60;\n this.minutes.set(next);\n } else {\n const next = (this.seconds() + delta + 60) % 60;\n this.seconds.set(next);\n }\n }\n\n /**\n * Buffer tích lũy chữ số đang gõ cho từng đơn vị.\n * Được reset khi: focus, commit (2 chữ số / auto-commit), blur.\n */\n private _buf: Record<'h' | 'm' | 's', string> = { h: '', m: '', s: '' };\n\n private _commitUnit(unit: 'h' | 'm' | 's', num: number) {\n if (unit === 'h') this.hours.set(num);\n else if (unit === 'm') this.minutes.set(num);\n else this.seconds.set(num);\n }\n\n /**\n * onInput chỉ xử lý các trường hợp không qua keydown:\n * paste, drag-drop, mobile soft-keyboard (không fire keydown).\n */\n onInput(unit: 'h' | 'm' | 's', event: Event) {\n if (this.disabled()) return;\n const raw = (event.target as HTMLInputElement).value.replace(/[^0-9]/g, '');\n if (!raw) {\n this._buf[unit] = '';\n return;\n }\n const max = unit === 'h' ? 23 : 59;\n const num = Math.min(parseInt(raw.slice(-2), 10), max);\n this._commitUnit(unit, num);\n this._buf[unit] = '';\n }\n\n // Lăn chuột trên input — cuộn lên = tăng.\n onWheel(unit: 'h' | 'm' | 's', event: WheelEvent) {\n if (this.disabled()) return;\n event.preventDefault();\n this._buf[unit] = '';\n this.step(unit, event.deltaY < 0 ? 1 : -1);\n }\n\n /**\n * Xử lý gõ phím:\n * - Chữ số: buffer 2 ký tự, auto-commit khi đủ hoặc chữ số đầu vượt ngưỡng\n * - Arrow: ±1, reset buffer\n * - Tab/Enter: commit buffer dở (nếu có)\n */\n onKeyDown(unit: 'h' | 'm' | 's', event: KeyboardEvent) {\n if (this.disabled()) return;\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n this._buf[unit] = '';\n this.step(unit, 1);\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this._buf[unit] = '';\n this.step(unit, -1);\n return;\n }\n\n if (/^\\d$/.test(event.key)) {\n event.preventDefault(); // Ta tự kiểm soát hiển thị\n const max = unit === 'h' ? 23 : 59;\n // Chữ số đầu tối đa để còn có thể nhập chữ số 2 hợp lệ:\n // giờ → max first digit = 2 (vd '3x' không hợp lệ vì max 23)\n // phút/giây → max first digit = 5\n const maxFirstDigit = unit === 'h' ? 2 : 5;\n const buf = this._buf[unit] + event.key;\n const el = event.target as HTMLInputElement;\n\n if (buf.length === 1) {\n const d = parseInt(event.key, 10);\n if (d > maxFirstDigit) {\n // Chữ số đầu không thể là hàng chục hợp lệ → commit ngay dạng 0X\n const num = Math.min(d, max);\n this._commitUnit(unit, num);\n el.value = this.pad(num);\n this._buf[unit] = '';\n } else {\n // Chờ chữ số thứ 2 — hiển thị ký tự đơn tạm thời\n this._buf[unit] = event.key;\n el.value = event.key;\n }\n } else {\n // Đã có 2 chữ số → commit\n const num = Math.min(parseInt(buf, 10), max);\n this._commitUnit(unit, num);\n el.value = this.pad(num);\n this._buf[unit] = '';\n }\n return;\n }\n\n if (event.key === 'Backspace' || event.key === 'Delete') {\n this._buf[unit] = '';\n return; // browser tự xử lý xóa ký tự\n }\n\n if (event.key === 'Tab' || event.key === 'Enter') {\n // Commit nếu còn buffer chữ số đơn\n if (this._buf[unit]) {\n const max = unit === 'h' ? 23 : 59;\n const num = Math.min(parseInt(this._buf[unit], 10), max);\n this._commitUnit(unit, num);\n this._buf[unit] = '';\n }\n }\n }\n\n // Khi blur: commit buffer dở (nếu có) + chuẩn hóa hiển thị.\n onBlur(unit: 'h' | 'm' | 's', event: FocusEvent) {\n if (this._buf[unit]) {\n const max = unit === 'h' ? 23 : 59;\n const num = Math.min(parseInt(this._buf[unit], 10), max);\n this._commitUnit(unit, num);\n this._buf[unit] = '';\n }\n const el = event.target as HTMLInputElement;\n if (unit === 'h') el.value = this.pad(this.hours());\n else if (unit === 'm') el.value = this.pad(this.minutes());\n else el.value = this.pad(this.seconds());\n }\n\n // Chọn toàn bộ text khi focus + reset buffer.\n onFocus(unit: 'h' | 'm' | 's', event: FocusEvent) {\n this._buf[unit] = '';\n (event.target as HTMLInputElement).select();\n }\n}\n","<div class=\"sd-time-spinner\" [class.disabled]=\"disabled()\">\n <!-- HOURS -->\n <div class=\"unit\">\n <button type=\"button\" class=\"step\" (click)=\"step('h', 1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.increase-hour' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </button>\n <input\n class=\"value\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"pad(hours())\"\n [disabled]=\"disabled()\"\n (input)=\"onInput('h', $event)\"\n (wheel)=\"onWheel('h', $event)\"\n (keydown)=\"onKeyDown('h', $event)\"\n (focus)=\"onFocus('h', $event)\"\n (blur)=\"onBlur('h', $event)\"\n [attr.aria-label]=\"'core.form.time-spinner.hour' | translate\" />\n <button type=\"button\" class=\"step\" (click)=\"step('h', -1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.decrease-hour' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n </div>\n\n <span class=\"sep\">:</span>\n\n <!-- MINUTES -->\n <div class=\"unit\">\n <button type=\"button\" class=\"step\" (click)=\"step('m', 1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.increase-minute' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </button>\n <input\n class=\"value\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"pad(minutes())\"\n [disabled]=\"disabled()\"\n (input)=\"onInput('m', $event)\"\n (wheel)=\"onWheel('m', $event)\"\n (keydown)=\"onKeyDown('m', $event)\"\n (focus)=\"onFocus('m', $event)\"\n (blur)=\"onBlur('m', $event)\"\n [attr.aria-label]=\"'core.form.time-spinner.minute' | translate\" />\n <button type=\"button\" class=\"step\" (click)=\"step('m', -1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.decrease-minute' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"sep\">:</span>\n <!-- SECONDS -->\n <div class=\"unit\">\n <button type=\"button\" class=\"step\" (click)=\"step('s', 1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.increase-second' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </button>\n <input\n class=\"value\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [value]=\"pad(seconds())\"\n [disabled]=\"disabled()\"\n (input)=\"onInput('s', $event)\"\n (wheel)=\"onWheel('s', $event)\"\n (keydown)=\"onKeyDown('s', $event)\"\n (focus)=\"onFocus('s', $event)\"\n (blur)=\"onBlur('s', $event)\"\n [attr.aria-label]=\"'core.form.time-spinner.second' | translate\" />\n <button type=\"button\" class=\"step\" (click)=\"step('s', -1)\" tabindex=\"-1\" [attr.aria-label]=\"'core.form.time-spinner.decrease-second' | translate\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Output, booleanAttribute, input, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { isValid as isValidDate } from 'date-fns';\nimport { SdTimeSpinner } from './sd-time-spinner.component';\n\n/**\n * Datetime picker popup — Calendar (Angular Material) + Time Spinner + Footer.\n *\n * Component này được render trong CDK Overlay từ `sd-datetime`.\n * Phát event `confirmed`/`cancelled` khi user thao tác trên footer.\n */\n@Component({\n selector: 'sd-datetime-picker',\n standalone: true,\n imports: [CommonModule, MatDatepickerModule, MatButtonModule, SdTimeSpinner, TranslatePipe],\n templateUrl: './sd-datetime-picker.component.html',\n styleUrl: './sd-datetime-picker.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdDatetimePicker {\n // ==========================================\n // INPUTS\n // ==========================================\n /** Giá trị khởi tạo của picker (native Date, có thể null). */\n initialValue = input<Date | null>(null);\n /** Min/max boundary (Date hoặc bất kỳ giá trị nào hợp lệ cho `new Date(...)`). */\n minDate = input<Date | string | number | null>(null);\n maxDate = input<Date | string | number | null>(null);\n /** Hiển thị thêm cột giây (mặc định ẩn — chỉ HH:MM). */\n showSeconds = input(false, { transform: booleanAttribute });\n /** Disabled state. */\n disabled = input(false, { transform: booleanAttribute });\n\n // ==========================================\n // OUTPUTS (legacy EventEmitter để tương thích Overlay subscription)\n // ==========================================\n @Output() confirmed = new EventEmitter<Date>();\n @Output() cancelled = new EventEmitter<void>();\n\n // ==========================================\n // STATE — signals nội bộ\n // ==========================================\n // date-fns là immutable — luôn cấp Date mới, không mutate.\n selectedDate = signal<Date>(new Date());\n hours = signal<number>(0);\n minutes = signal<number>(0);\n seconds = signal<number>(0);\n\n constructor() {\n // Khởi tạo từ initialValue khi component được tạo.\n // Effect không cần thiết vì input chỉ set một lần lúc mở popup.\n queueMicrotask(() => this.#hydrateFromInput());\n }\n\n #hydrateFromInput() {\n const init = this.initialValue();\n // Clone bằng new Date(getTime()) để không chia sẻ reference với caller.\n const d = init instanceof Date && isValidDate(init) ? new Date(init.getTime()) : new Date();\n this.selectedDate.set(d);\n this.hours.set(d.getHours());\n this.minutes.set(d.getMinutes());\n this.seconds.set(d.getSeconds());\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n\n /** Khi user chọn ngày trên MatCalendar. */\n onDateSelected(date: Date | null) {\n if (!date) return;\n // Giữ nguyên giờ/phút/giây hiện tại, chỉ thay đổi ngày.\n const next = new Date(date.getTime());\n next.setHours(this.hours(), this.minutes(), this.seconds(), 0);\n this.selectedDate.set(next);\n }\n\n onConfirm() {\n if (this.disabled()) return;\n // Tạo Date mới từ selectedDate + hours/minutes/seconds hiện tại.\n const base = this.selectedDate();\n const result = new Date(base.getTime());\n result.setHours(this.hours(), this.minutes(), this.showSeconds() ? this.seconds() : 0, 0);\n this.confirmed.emit(result);\n }\n\n onCancel() {\n this.cancelled.emit();\n }\n\n /** Đặt nhanh thời gian \"Bây giờ\". */\n onNow() {\n if (this.disabled()) return;\n const now = new Date();\n this.selectedDate.set(now);\n this.hours.set(now.getHours());\n this.minutes.set(now.getMinutes());\n this.seconds.set(now.getSeconds());\n }\n\n // Min/Max — chuyển về Date cho MatCalendar (date-fns adapter dùng native Date).\n get _minDate(): Date | null {\n const v = this.minDate();\n if (v === null || v === undefined) return null;\n if (v instanceof Date) return isValidDate(v) ? v : null;\n const d = new Date(v);\n return isValidDate(d) ? d : null;\n }\n get _maxDate(): Date | null {\n const v = this.maxDate();\n if (v === null || v === undefined) return null;\n if (v instanceof Date) return isValidDate(v) ? v : null;\n const d = new Date(v);\n return isValidDate(d) ? d : null;\n }\n}\n","<div class=\"sd-datetime-picker\">\n <!-- Calendar -->\n <div class=\"picker-calendar\">\n <mat-calendar\n [selected]=\"selectedDate()\"\n [minDate]=\"_minDate\"\n [maxDate]=\"_maxDate\"\n (selectedChange)=\"onDateSelected($event)\">\n </mat-calendar>\n </div>\n\n <!-- Divider mảnh -->\n <div class=\"picker-divider\"></div>\n\n <!-- Time Spinner -->\n <div class=\"picker-time\">\n <sd-time-spinner\n [(hours)]=\"hours\"\n [(minutes)]=\"minutes\"\n [(seconds)]=\"seconds\"\n [showSeconds]=\"showSeconds()\"\n [disabled]=\"disabled()\">\n </sd-time-spinner>\n </div>\n\n <!-- Footer: Bây giờ | Hủy | Xác nhận -->\n <div class=\"picker-footer\">\n <button type=\"button\" class=\"btn btn-ghost\" (click)=\"onNow()\" [disabled]=\"disabled()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\n <polyline points=\"12 7 12 12 15 14\"></polyline>\n </svg>\n <span>{{ 'core.form.datetime.now' | translate }}</span>\n </button>\n\n <div class=\"footer-actions\">\n <button type=\"button\" class=\"btn btn-text\" (click)=\"onCancel()\">{{ 'core.common.cancel' | translate }}</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onConfirm()\" [disabled]=\"disabled()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n <span>{{ 'core.form.datetime.confirm' | translate }}</span>\n </button>\n </div>\n </div>\n</div>\n","import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n input,\n model,\n computed,\n effect,\n untracked,\n OnDestroy,\n OnInit,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n signal,\n Injector,\n} from '@angular/core';\nimport { AbstractControl, FormGroup, FormsModule, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\nimport { provideDateFnsAdapter } from '@angular/material-date-fns-adapter';\nimport { MAT_DATE_LOCALE } from '@angular/material/core';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n SD_FORM_CONFIGURATION,\n SdFormControl,\n SdInlineErrorValidator,\n sdFormControlState,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { Size } from '@sdcorejs/utils/models';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { isValid as isValidDate, parse as parseDate } from 'date-fns';\nimport { enUS as dfEnUS } from 'date-fns/locale';\nimport { Subscription } from 'rxjs';\nimport { SdDatetimePicker } from './popup/sd-datetime-picker.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/**\n * Format parse/display dùng cho MatDateAdapter (date-fns).\n * Note: format input là `dd/MM/yyyy HH:mm` (không có giây mặc định) —\n * giây chỉ được render khi `showSeconds` = true.\n * Token date-fns dùng chữ thường: `yyyy` (năm), `dd` (ngày), `HH` (giờ 24h).\n */\nconst SD_DATETIME_FORMATS = {\n parse: { dateInput: 'dd/MM/yyyy HH:mm' },\n display: {\n dateInput: 'dd/MM/yyyy HH:mm',\n monthYearLabel: 'MMM yyyy',\n dateA11yLabel: 'PP',\n monthYearA11yLabel: 'MMMM yyyy',\n },\n};\n\n/**\n * Thử parse `value` theo lần lượt nhiều format; trả về Date đầu tiên hợp lệ.\n * date-fns không hỗ trợ multi-format parse như moment(value, [fmt1, fmt2], true).\n */\nfunction parseFirstValid(value: string, formats: string[]): Date | null {\n for (const fmt of formats) {\n const d = parseDate(value, fmt, new Date());\n if (isValidDate(d)) return d;\n }\n return null;\n}\n\n@Component({\n selector: 'sd-datetime',\n templateUrl: './datetime.component.html',\n styleUrl: './datetime.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(SD_DATETIME_FORMATS),\n ],\n standalone: true,\n imports: [SdIcon,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatTooltipModule,\n MatFormFieldModule,\n SdLabel,\n SdView,\n ],\n})\nexport class SdDatetime implements OnDestroy, OnInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n inputRef = viewChild<ElementRef<HTMLInputElement>>('input');\n\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdViewDef = contentChild(SdViewDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private ref = inject(ChangeDetectorRef);\n private overlay = inject(Overlay);\n private elementRef = inject(ElementRef);\n private injector = inject(Injector);\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-datetime-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (datetime overlay). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n /** Hiển thị thêm cột giây trong picker. Mặc định: chỉ HH:MM. */\n showSeconds = input(false, { transform: booleanAttribute });\n\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 datetime editor is always mounted\n // (chrome hidden via CSS); the sd-view text face opens the overlay 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 datetime overlay from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n /** View display template: `sdViewDef` overrides the projected `#sdValue` (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.datetime.required');\n if (errors['matDatepickerMin']) {\n const d = this.resolvedMin();\n return this.#i18n.t('core.form.datetime.min-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['matDatepickerMax']) {\n const d = this.resolvedMax();\n return this.#i18n.t('core.form.datetime.max-date', { date: d ? new Date(d).toLocaleDateString('vi-VN') : '' });\n }\n if (errors['date']) return errors['date'] as string;\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n hyperlink = input<string | null | undefined>();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n // Min/max — chấp nhận 'TODAY', Date, hoặc string ISO\n minInput = input<any>(undefined, { alias: 'min' });\n minDateInput = input<any>(undefined, { alias: 'minDate' });\n resolvedMin = computed(() => this.#parseDateBoundary(this.minInput() ?? this.minDateInput()));\n\n maxInput = input<any>(undefined, { alias: 'max' });\n maxDateInput = input<any>(undefined, { alias: 'maxDate' });\n resolvedMax = computed(() => this.#parseDateBoundary(this.maxInput() ?? this.maxDateInput()));\n\n valueModel = model<string | number | Date | undefined | null>(undefined, { alias: 'model' });\n\n // viewed-mode: formControl.value là chuỗi display (dd/MM/yyyy HH:mm) nên DatePipe không parse được.\n // Lấy thẳng từ valueModel (nguồn dữ liệu thật) rồi convert sang Date cho DatePipe.\n viewedDate = computed<Date | null>(() => {\n const v = this.valueModel();\n if (v == null || !DateUtilities.isDate(v)) return null;\n const iso = DateUtilities.toFormat(v as any, 'yyyy/MM/dd HH:mm:ss');\n if (!iso) return null;\n const d = parseDate(iso, 'yyyy/MM/dd HH:mm:ss', new Date());\n return isValidDate(d) ? d : null;\n });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>();\n\n // ==========================================\n // 5. INTERNAL STATE\n // ==========================================\n isMobileOrTablet = BrowserUtilities.isMobile();\n formControl = new SdFormControl();\n isFocused = false;\n isValid?: boolean;\n\n /** State popup — true khi đang mở. */\n pickerOpened = signal(false);\n\n #date: string | undefined | null;\n #subscription = new Subscription();\n #overlayRef: OverlayRef | null = null;\n\n constructor() {\n // EFFECT 1: Sync model thay đổi từ bên ngoài → cập nhật hiển thị\n effect(() => {\n let val = this.valueModel();\n untracked(() => {\n if (!DateUtilities.isDate(val)) {\n val = null;\n }\n val = DateUtilities.toFormat(val, 'yyyy/MM/dd HH:mm');\n if (this.#date !== val) {\n this.#date = val;\n // Cập nhật formControl với chuỗi hiển thị dd/MM/yyyy HH:mm\n const fmt = this.showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm';\n const displayStr = DateUtilities.isDate(this.#date) ? DateUtilities.toFormat(this.#date, fmt) : null;\n this.formControl.setValue(displayStr, { emitEvent: false });\n }\n });\n });\n\n // EFFECT 2: Sync Disable\n effect(() => {\n if (this.disabled()) this.formControl.disable({ emitEvent: false });\n else this.formControl.enable({ emitEvent: false });\n });\n\n // EFFECT 3: Update Validators\n effect(() => {\n const req = this.required();\n const inl = this.inlineError();\n\n untracked(() => {\n const validators: ValidatorFn[] = [];\n if (req) validators.push(Validators.required);\n if (inl) validators.push(SdInlineErrorValidator);\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n });\n });\n }\n\n ngOnInit() {\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n const formGroup = this.form();\n formGroup?.addControl(this.name(), this.formControl);\n }\n\n ngOnDestroy() {\n const formGroup = this.form();\n formGroup?.removeControl(this.name());\n this.#subscription.unsubscribe();\n this.#closeOverlay();\n }\n\n // ==========================================\n // 6. POPUP MANAGEMENT — CDK Overlay\n // ==========================================\n\n /** Mở popup chọn datetime, neo vào input. */\n open() {\n if (this.formControl.disabled || this.pickerOpened()) return;\n\n const origin = this.elementRef.nativeElement as HTMLElement;\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(origin)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n ])\n .withFlexibleDimensions(false)\n .withPush(true);\n\n const overlayConfig = new OverlayConfig({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'sd-datetime-backdrop',\n panelClass: 'sd-datetime-overlay-panel',\n });\n\n this.#overlayRef = this.overlay.create(overlayConfig);\n const portal = new ComponentPortal(SdDatetimePicker, null, this.injector);\n const ref = this.#overlayRef.attach(portal);\n\n // Đẩy state hiện tại vào popup\n ref.setInput('initialValue', this.#currentValueAsDate());\n ref.setInput('minDate', this.resolvedMin());\n ref.setInput('maxDate', this.resolvedMax());\n ref.setInput('showSeconds', this.showSeconds());\n\n // Subscribe events từ popup\n ref.instance.confirmed.subscribe((value: Date) => this.#onPickerConfirm(value));\n ref.instance.cancelled.subscribe(() => this.#onPickerCancel());\n\n // Đóng khi click backdrop\n this.#overlayRef.backdropClick().subscribe(() => this.#onPickerCancel());\n\n this.pickerOpened.set(true);\n this.ref.markForCheck();\n }\n\n /** Đóng popup (public — gọi từ template nếu cần). */\n close() {\n this.#closeOverlay();\n }\n\n #closeOverlay() {\n if (this.#overlayRef) {\n this.#overlayRef.dispose();\n this.#overlayRef = null;\n }\n if (this.pickerOpened()) {\n this.pickerOpened.set(false);\n this.ref.markForCheck();\n }\n }\n\n #onPickerConfirm(value: Date) {\n const fmt = this.showSeconds() ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00';\n // value giờ là native Date (date-fns), không cần .toDate() như Moment.\n const stored = DateUtilities.toFormat(value, fmt);\n if (this.#date !== stored) {\n this.valueModel.set(stored);\n this.sdChange.emit(stored);\n }\n this.#closeOverlay();\n }\n\n #onPickerCancel() {\n this.#closeOverlay();\n }\n\n /** Lấy giá trị hiện tại dưới dạng native Date để truyền vào popup. */\n #currentValueAsDate(): Date | null {\n const v = this.valueModel();\n if (!v || !DateUtilities.isDate(v)) return null;\n const fmtted = DateUtilities.toFormat(v as any, 'yyyy/MM/dd HH:mm:ss');\n if (!fmtted) return null;\n const parsed = parseDate(fmtted, 'yyyy/MM/dd HH:mm:ss', new Date());\n return isValidDate(parsed) ? parsed : null;\n }\n\n // ==========================================\n // 7. PARSE/VALIDATE HELPERS\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 // ==========================================\n // 8. INPUT EVENT HANDLERS\n // ==========================================\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit();\n };\n\n onBlur = () => {\n this.isFocused = false;\n };\n\n onClick = () => {\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.inputRef()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n setTimeout(() => {\n this.inputRef()?.nativeElement?.focus();\n this.open();\n }, 100);\n };\n\n focusInputElement() {\n this.inputRef()?.nativeElement?.focus();\n }\n\n onKeyDown = (event: KeyboardEvent) => {\n const key = event.keyCode || event.charCode;\n const isShift = key === 16;\n\n if (event.ctrlKey && (key === 67 || key === 86)) return true;\n\n if (\n ((key >= 48 && key <= 57) ||\n key === 8 ||\n key <= 37 ||\n key <= 39 ||\n (key >= 96 && key <= 105) ||\n key === 191 ||\n key === 186 ||\n key === 59) &&\n !isShift\n ) {\n return true;\n }\n return false;\n };\n\n /**\n * Khi user gõ trực tiếp vào input và rời focus → validate format dd/MM/yyyy HH:mm\n * Hỗ trợ cả format có giây.\n */\n onConfirmInput = (event: any) => {\n const currentVal: string = event.target.value;\n const formControl: AbstractControl = this.formControl;\n const regexToMinutes = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d [012]{0,1}[0-9]:[0-6][0-9]$/g;\n const regexToSecond = /^([1-9]|([012][0-9])|(3[01]))\\/([0]{0,1}[1-9]|1[012])\\/\\d\\d\\d\\d [012]{0,1}[0-9]:[0-6][0-9]:[0-6][0-9]$/g;\n\n if (currentVal && !(regexToMinutes.test(currentVal) || regexToSecond.test(currentVal))) {\n setTimeout(() => {\n formControl.markAsDirty();\n formControl.markAsTouched();\n formControl.setErrors({ ...formControl.errors, date: this.#i18n.t('core.form.datetime.invalid-format') });\n }, 0);\n return;\n }\n\n setTimeout(() => {\n formControl.setErrors({ ...formControl.errors, date: null });\n this.formControl.updateValueAndValidity();\n }, 0);\n\n // Đồng bộ ngược về model nếu hợp lệ.\n // date-fns không có multi-format strict parse như moment, dùng helper parseFirstValid.\n if (currentVal) {\n const parsed = parseFirstValid(currentVal, ['dd/MM/yyyy HH:mm:ss', 'dd/MM/yyyy HH:mm']);\n if (parsed) {\n const fmt = this.showSeconds() ? 'yyyy/MM/dd HH:mm:ss' : 'yyyy/MM/dd HH:mm:00';\n const stored = DateUtilities.toFormat(parsed, fmt);\n if (this.#date !== stored) {\n this.valueModel.set(stored);\n this.sdChange.emit(stored);\n }\n }\n } else if (this.valueModel()) {\n this.valueModel.set(null);\n this.sdChange.emit(null);\n }\n };\n\n clear = ($event: any) => {\n $event?.stopPropagation();\n if (this.formControl.value) {\n this.formControl.setValue(null);\n this.valueModel.set(null);\n this.sdChange.emit(null);\n }\n };\n}\n","@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _required = required();\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = !!formControl.value;\n\n@let _resolvedMin = resolvedMin();\n@let _resolvedMax = resolvedMax();\n\n@let _viewedDate = viewedDate();\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_viewedDate\"\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view là \"mặt\" + trigger; datetime editor render ẩn (.sd-inline-editor) chỉ để mở overlay. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_viewedDate\"\n [display]=\"_viewedDate | date: (showSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm')\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n class=\"c-form-field-datetime-input\"\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance || 'outline'\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div class=\"d-flex align-items-center gap-4\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\n }\n </div>\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n [id]=\"id\"\n (blur)=\"onConfirmInput($event)\"\n (keyup.enter)=\"onConfirmInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [formControl]=\"formControl\"\n [required]=\"_required\"\n [placeholder]=\"placeholder() || _label || ''\"\n [min]=\"_resolvedMin\"\n [max]=\"_resolvedMax\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n #input\n matInput />\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (formControl.value && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n\n <span class=\"cursor-pointer sd-suffix-icon\" (click)=\"!formControl.disabled && open()\" matSuffix\n ><svg fill=\"currentColor\" viewBox=\"0 0 24 24\" fill=\"currentColor\" focusable=\"false\">\n <path\n d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\"></path></svg\n ></span>\n </mat-form-field>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isValidDate","parseDate","dfEnUS"],"mappings":"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"}
|
|
@@ -3,8 +3,7 @@ import * as i0 from '@angular/core';
|
|
|
3
3
|
import { model, input, booleanAttribute, output, viewChild, signal, effect, afterNextRender, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
4
|
import * as i1 from '@angular/forms';
|
|
5
5
|
import { ReactiveFormsModule } from '@angular/forms';
|
|
6
|
-
import
|
|
7
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
+
import { SdIcon } from '@sdcorejs/angular/modules/icon';
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* Borderless, content-hugging text input — the seamless primitive shared by
|
|
@@ -147,16 +146,16 @@ class SdInlineText {
|
|
|
147
146
|
this.inputRef()?.nativeElement.blur();
|
|
148
147
|
}
|
|
149
148
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdInlineText, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
150
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdInlineText, isStandalone: true, selector: "sd-inline-text", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, chrome: { classPropertyName: "chrome", publicName: "chrome", isSignal: true, isRequired: false, transformFunction: null }, autoId: { classPropertyName: "autoId", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", cleared: "cleared", keyupEnter: "keyupEnter", keydownEscape: "keydownEscape", sdFocus: "sdFocus", sdBlur: "sdBlur", sdKeydown: "sdKeydown", sdPaste: "sdPaste", sdCompositionStart: "sdCompositionStart", sdCompositionEnd: "sdCompositionEnd" }, host: { properties: { "class.sd-inline-text--standalone": "chrome() === 'standalone'", "class.sd-inline-text--seamless": "chrome() === 'seamless'", "attr.data-state": "effectiveState()" }, classAttribute: "sd-inline-text" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "@let _autoId = autoId();\n@let _placeholder = placeholder();\n@let _sizeOf = sizeOf();\n@let _control = control();\n\n@if (_control) {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [formControl]=\"_control\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n} @else {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [value]=\"currentText()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n}\n\n@if (showClear()) {\n <button type=\"button\" class=\"sd-inline-text__clear\" (click)=\"clear($event)\" aria-label=\"Clear\" tabindex=\"-1\">\n <
|
|
149
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdInlineText, isStandalone: true, selector: "sd-inline-text", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, chrome: { classPropertyName: "chrome", publicName: "chrome", isSignal: true, isRequired: false, transformFunction: null }, autoId: { classPropertyName: "autoId", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", cleared: "cleared", keyupEnter: "keyupEnter", keydownEscape: "keydownEscape", sdFocus: "sdFocus", sdBlur: "sdBlur", sdKeydown: "sdKeydown", sdPaste: "sdPaste", sdCompositionStart: "sdCompositionStart", sdCompositionEnd: "sdCompositionEnd" }, host: { properties: { "class.sd-inline-text--standalone": "chrome() === 'standalone'", "class.sd-inline-text--seamless": "chrome() === 'seamless'", "attr.data-state": "effectiveState()" }, classAttribute: "sd-inline-text" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "@let _autoId = autoId();\n@let _placeholder = placeholder();\n@let _sizeOf = sizeOf();\n@let _control = control();\n\n@if (_control) {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [formControl]=\"_control\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n} @else {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [value]=\"currentText()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n}\n\n@if (showClear()) {\n <button type=\"button\" class=\"sd-inline-text__clear\" (click)=\"clear($event)\" aria-label=\"Clear\" tabindex=\"-1\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n}\n", styles: [":host{display:inline-flex;align-items:center;max-width:100%;font:inherit;color:inherit}.sd-inline-text__input{appearance:none;border:0;outline:0;background:transparent;font:inherit;color:inherit;padding:0;min-width:0;max-width:240px}:host(.sd-inline-text--standalone){border-radius:4px;padding:1px 6px;background-color:#0000000a;transition:background-color .15s ease,box-shadow .15s ease}:host(.sd-inline-text--standalone):hover{background-color:#00000014}:host(.sd-inline-text--standalone)[data-state=focus]{background-color:#0000000f;box-shadow:inset 0 0 0 1px var(--sd-primary, #1f6feb)}:host(.sd-inline-text--standalone)[data-state=error]{box-shadow:inset 0 0 0 1px var(--sd-error, #b32626)}:host(.sd-inline-text--standalone) .sd-inline-text__clear{display:none}:host(.sd-inline-text--standalone):hover .sd-inline-text__clear,:host(.sd-inline-text--standalone)[data-state=focus] .sd-inline-text__clear{display:inline-flex}:host(.sd-inline-text--seamless) .sd-inline-text__input{font-weight:500}:host(.sd-inline-text--seamless) .sd-inline-text__input::placeholder{font-style:italic}:host(.sd-inline-text--seamless)[data-state=active] .sd-inline-text__input{color:var(--sd-primary, #1f6feb)}:host(.sd-inline-text--seamless)[data-state=error] .sd-inline-text__input{color:var(--sd-error, #b32626)}.sd-inline-text__clear{display:inline-flex;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-text__clear sd-icon{font-size:16px;width:16px;height:16px}.sd-inline-text__clear:hover{color:var(--sd-error, #b32626)}\n"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
151
150
|
}
|
|
152
151
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdInlineText, decorators: [{
|
|
153
152
|
type: Component,
|
|
154
|
-
args: [{ selector: 'sd-inline-text', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, ReactiveFormsModule
|
|
153
|
+
args: [{ selector: 'sd-inline-text', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [SdIcon, CommonModule, ReactiveFormsModule], host: {
|
|
155
154
|
class: 'sd-inline-text',
|
|
156
155
|
'[class.sd-inline-text--standalone]': "chrome() === 'standalone'",
|
|
157
156
|
'[class.sd-inline-text--seamless]': "chrome() === 'seamless'",
|
|
158
157
|
'[attr.data-state]': 'effectiveState()',
|
|
159
|
-
}, template: "@let _autoId = autoId();\n@let _placeholder = placeholder();\n@let _sizeOf = sizeOf();\n@let _control = control();\n\n@if (_control) {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [formControl]=\"_control\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n} @else {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [value]=\"currentText()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n}\n\n@if (showClear()) {\n <button type=\"button\" class=\"sd-inline-text__clear\" (click)=\"clear($event)\" aria-label=\"Clear\" tabindex=\"-1\">\n <
|
|
158
|
+
}, template: "@let _autoId = autoId();\n@let _placeholder = placeholder();\n@let _sizeOf = sizeOf();\n@let _control = control();\n\n@if (_control) {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [formControl]=\"_control\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n} @else {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [value]=\"currentText()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n}\n\n@if (showClear()) {\n <button type=\"button\" class=\"sd-inline-text__clear\" (click)=\"clear($event)\" aria-label=\"Clear\" tabindex=\"-1\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n}\n", styles: [":host{display:inline-flex;align-items:center;max-width:100%;font:inherit;color:inherit}.sd-inline-text__input{appearance:none;border:0;outline:0;background:transparent;font:inherit;color:inherit;padding:0;min-width:0;max-width:240px}:host(.sd-inline-text--standalone){border-radius:4px;padding:1px 6px;background-color:#0000000a;transition:background-color .15s ease,box-shadow .15s ease}:host(.sd-inline-text--standalone):hover{background-color:#00000014}:host(.sd-inline-text--standalone)[data-state=focus]{background-color:#0000000f;box-shadow:inset 0 0 0 1px var(--sd-primary, #1f6feb)}:host(.sd-inline-text--standalone)[data-state=error]{box-shadow:inset 0 0 0 1px var(--sd-error, #b32626)}:host(.sd-inline-text--standalone) .sd-inline-text__clear{display:none}:host(.sd-inline-text--standalone):hover .sd-inline-text__clear,:host(.sd-inline-text--standalone)[data-state=focus] .sd-inline-text__clear{display:inline-flex}:host(.sd-inline-text--seamless) .sd-inline-text__input{font-weight:500}:host(.sd-inline-text--seamless) .sd-inline-text__input::placeholder{font-style:italic}:host(.sd-inline-text--seamless)[data-state=active] .sd-inline-text__input{color:var(--sd-primary, #1f6feb)}:host(.sd-inline-text--seamless)[data-state=error] .sd-inline-text__input{color:var(--sd-error, #b32626)}.sd-inline-text__clear{display:inline-flex;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-text__clear sd-icon{font-size:16px;width:16px;height:16px}.sd-inline-text__clear:hover{color:var(--sd-error, #b32626)}\n"] }]
|
|
160
159
|
}], ctorParameters: () => [] });
|
|
161
160
|
|
|
162
161
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-forms-inline-text.mjs","sources":["../../../projects/sdcorejs-angular/forms/inline-text/src/inline-text.component.ts","../../../projects/sdcorejs-angular/forms/inline-text/src/inline-text.component.html","../../../projects/sdcorejs-angular/forms/inline-text/sdcorejs-angular-forms-inline-text.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { SdFormControl } from '@sdcorejs/angular/forms/models';\n\n/** Visual / `data-state` of the inline input. `'auto'` derives from focus + value. */\nexport type SdInlineTextState = 'auto' | 'pending' | 'active' | 'focus' | 'error';\n/** `'standalone'` draws its own affordance (hover bg + focus ring); `'seamless'` defers all chrome to the host. */\nexport type SdInlineTextChrome = 'standalone' | 'seamless';\n\n/**\n * Borderless, content-hugging text input — the seamless primitive shared by\n * `sd-input` / `sd-input-number` (`viewed='inline'`) and the query-bar / query-builder chips.\n *\n * why: a native `<input>` inside `mat-form-field` cannot hug its content, so inline-edit\n * looked like a full-width input rather than text. This primitive renders a raw `<input>`\n * sized via the native `size` attribute (clamped) so the click/hover target tracks the value.\n *\n * It is intentionally unopinionated about commit/parse/format: it forwards the raw DOM events\n * (focus / blur / keydown / paste / composition / Enter / Escape) so each consumer keeps its own\n * logic (e.g. sd-input-number's vi-VN formatting). Two binding modes:\n * - **uncontrolled** via `[(value)]` — used by the chips' signal drafts;\n * - **controlled** via `[control]` (an external `SdFormControl`) — used by the form controls.\n */\n@Component({\n selector: 'sd-inline-text',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, ReactiveFormsModule, MatIconModule],\n templateUrl: './inline-text.component.html',\n styleUrl: './inline-text.component.scss',\n host: {\n class: 'sd-inline-text',\n '[class.sd-inline-text--standalone]': \"chrome() === 'standalone'\",\n '[class.sd-inline-text--seamless]': \"chrome() === 'seamless'\",\n '[attr.data-state]': 'effectiveState()',\n },\n})\nexport class SdInlineText {\n /** Uncontrolled value (two-way). Ignored when `[control]` is provided. */\n readonly value = model<string>('');\n /** Optional external FormControl (controlled mode) — used by sd-input / sd-input-number. */\n readonly control = input<SdFormControl | undefined>(undefined);\n readonly placeholder = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Show a hover/value-gated clear-× (default `true`). */\n readonly clearable = input(true, { transform: booleanAttribute });\n /** `'auto'` derives state from focus + value; pass an explicit value (e.g. `'error'`) to override. */\n readonly state = input<SdInlineTextState>('auto');\n readonly chrome = input<SdInlineTextChrome>('standalone');\n readonly autoId = input<string | undefined>(undefined);\n readonly autofocus = input(false, { transform: booleanAttribute });\n /** Lower bound (chars) so short/empty values keep a clickable target. */\n readonly minSize = input(2);\n\n readonly cleared = output<void>();\n readonly keyupEnter = output<void>();\n readonly keydownEscape = output<void>();\n readonly sdFocus = output<FocusEvent>();\n readonly sdBlur = output<FocusEvent>();\n readonly sdKeydown = output<KeyboardEvent>();\n readonly sdPaste = output<ClipboardEvent>();\n readonly sdCompositionStart = output<CompositionEvent>();\n readonly sdCompositionEnd = output<CompositionEvent>();\n\n private readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n\n /** Bumped on input/blur/composition + bound-control changes so size/state methods re-eval under OnPush. */\n protected readonly tick = signal(0);\n protected readonly focused = signal(false);\n\n constructor() {\n // why: a bound control's value can change programmatically (sd-input-number reformats\n // on blur) without a DOM input event — subscribe so the size/state still refresh.\n effect(onCleanup => {\n const c = this.control();\n if (!c) return;\n const sub = c.valueChanges.subscribe(() => this.tick.update(n => n + 1));\n onCleanup(() => sub.unsubscribe());\n });\n\n afterNextRender(() => {\n if (this.autofocus()) this.focus();\n });\n }\n\n /**\n * Current text — from the bound control in controlled mode, else the value model.\n * why: `tick` is a tracked dependency so the computed re-runs when a bound control's\n * value changes programmatically (control.value itself is not a signal).\n */\n protected readonly currentText = computed<string>(() => {\n this.tick();\n const c = this.control();\n const raw = c ? c.value : this.value();\n return raw == null ? '' : String(raw);\n });\n\n protected readonly hasValue = computed(() => this.currentText().length > 0);\n\n protected readonly sizeOf = computed(() => {\n const text = this.currentText();\n const base = text.length > 0 ? text.length : this.placeholder().length;\n return Math.max(this.minSize(), base);\n });\n\n protected readonly showClear = computed(() => this.clearable() && this.hasValue() && !this.disabled());\n\n protected readonly effectiveState = computed<SdInlineTextState>(() => {\n const s = this.state();\n if (s !== 'auto') return s;\n if (this.focused()) return 'focus';\n return this.hasValue() ? 'active' : 'pending';\n });\n\n // ── event handlers ─────────────────────────────────────────────────────────\n protected onInput(ev: Event): void {\n const el = ev.target as HTMLInputElement;\n // why: only the uncontrolled mode owns the value model; in controlled mode the bound\n // FormControl carries the value natively (ReactiveForms), so we must not double-write.\n if (!this.control()) this.value.set(el.value);\n this.tick.update(n => n + 1);\n }\n\n protected onFocus(ev: FocusEvent): void {\n this.focused.set(true);\n this.sdFocus.emit(ev);\n }\n\n protected onBlur(ev: FocusEvent): void {\n this.focused.set(false);\n this.tick.update(n => n + 1);\n this.sdBlur.emit(ev);\n }\n\n protected onKeyup(ev: KeyboardEvent): void {\n if (ev.key === 'Enter') this.keyupEnter.emit();\n }\n\n protected onKeydown(ev: KeyboardEvent): void {\n if (ev.key === 'Escape') this.keydownEscape.emit();\n this.sdKeydown.emit(ev);\n }\n\n protected onPaste(ev: ClipboardEvent): void {\n this.sdPaste.emit(ev);\n }\n\n protected onCompositionStart(ev: CompositionEvent): void {\n this.sdCompositionStart.emit(ev);\n }\n\n protected onCompositionEnd(ev: CompositionEvent): void {\n this.tick.update(n => n + 1);\n this.sdCompositionEnd.emit(ev);\n }\n\n protected clear(ev: Event): void {\n ev.stopPropagation();\n const c = this.control();\n if (c) c.setValue('');\n else this.value.set('');\n this.tick.update(n => n + 1);\n this.cleared.emit();\n }\n\n // ── public API ───────────────────────────────────────────────────────────\n /** Focus the native input. */\n focus(): void {\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Blur the native input. */\n blur(): void {\n this.inputRef()?.nativeElement.blur();\n }\n}\n","@let _autoId = autoId();\n@let _placeholder = placeholder();\n@let _sizeOf = sizeOf();\n@let _control = control();\n\n@if (_control) {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [formControl]=\"_control\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n} @else {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [value]=\"currentText()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n}\n\n@if (showClear()) {\n <button type=\"button\" class=\"sd-inline-text__clear\" (click)=\"clear($event)\" aria-label=\"Clear\" tabindex=\"-1\">\n <mat-icon>close</mat-icon>\n </button>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-forms-inline-text.mjs","sources":["../../../projects/sdcorejs-angular/forms/inline-text/src/inline-text.component.ts","../../../projects/sdcorejs-angular/forms/inline-text/src/inline-text.component.html","../../../projects/sdcorejs-angular/forms/inline-text/sdcorejs-angular-forms-inline-text.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SdFormControl } from '@sdcorejs/angular/forms/models';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/** Visual / `data-state` of the inline input. `'auto'` derives from focus + value. */\nexport type SdInlineTextState = 'auto' | 'pending' | 'active' | 'focus' | 'error';\n/** `'standalone'` draws its own affordance (hover bg + focus ring); `'seamless'` defers all chrome to the host. */\nexport type SdInlineTextChrome = 'standalone' | 'seamless';\n\n/**\n * Borderless, content-hugging text input — the seamless primitive shared by\n * `sd-input` / `sd-input-number` (`viewed='inline'`) and the query-bar / query-builder chips.\n *\n * why: a native `<input>` inside `mat-form-field` cannot hug its content, so inline-edit\n * looked like a full-width input rather than text. This primitive renders a raw `<input>`\n * sized via the native `size` attribute (clamped) so the click/hover target tracks the value.\n *\n * It is intentionally unopinionated about commit/parse/format: it forwards the raw DOM events\n * (focus / blur / keydown / paste / composition / Enter / Escape) so each consumer keeps its own\n * logic (e.g. sd-input-number's vi-VN formatting). Two binding modes:\n * - **uncontrolled** via `[(value)]` — used by the chips' signal drafts;\n * - **controlled** via `[control]` (an external `SdFormControl`) — used by the form controls.\n */\n@Component({\n selector: 'sd-inline-text',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, CommonModule, ReactiveFormsModule],\n templateUrl: './inline-text.component.html',\n styleUrl: './inline-text.component.scss',\n host: {\n class: 'sd-inline-text',\n '[class.sd-inline-text--standalone]': \"chrome() === 'standalone'\",\n '[class.sd-inline-text--seamless]': \"chrome() === 'seamless'\",\n '[attr.data-state]': 'effectiveState()',\n },\n})\nexport class SdInlineText {\n /** Uncontrolled value (two-way). Ignored when `[control]` is provided. */\n readonly value = model<string>('');\n /** Optional external FormControl (controlled mode) — used by sd-input / sd-input-number. */\n readonly control = input<SdFormControl | undefined>(undefined);\n readonly placeholder = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Show a hover/value-gated clear-× (default `true`). */\n readonly clearable = input(true, { transform: booleanAttribute });\n /** `'auto'` derives state from focus + value; pass an explicit value (e.g. `'error'`) to override. */\n readonly state = input<SdInlineTextState>('auto');\n readonly chrome = input<SdInlineTextChrome>('standalone');\n readonly autoId = input<string | undefined>(undefined);\n readonly autofocus = input(false, { transform: booleanAttribute });\n /** Lower bound (chars) so short/empty values keep a clickable target. */\n readonly minSize = input(2);\n\n readonly cleared = output<void>();\n readonly keyupEnter = output<void>();\n readonly keydownEscape = output<void>();\n readonly sdFocus = output<FocusEvent>();\n readonly sdBlur = output<FocusEvent>();\n readonly sdKeydown = output<KeyboardEvent>();\n readonly sdPaste = output<ClipboardEvent>();\n readonly sdCompositionStart = output<CompositionEvent>();\n readonly sdCompositionEnd = output<CompositionEvent>();\n\n private readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n\n /** Bumped on input/blur/composition + bound-control changes so size/state methods re-eval under OnPush. */\n protected readonly tick = signal(0);\n protected readonly focused = signal(false);\n\n constructor() {\n // why: a bound control's value can change programmatically (sd-input-number reformats\n // on blur) without a DOM input event — subscribe so the size/state still refresh.\n effect(onCleanup => {\n const c = this.control();\n if (!c) return;\n const sub = c.valueChanges.subscribe(() => this.tick.update(n => n + 1));\n onCleanup(() => sub.unsubscribe());\n });\n\n afterNextRender(() => {\n if (this.autofocus()) this.focus();\n });\n }\n\n /**\n * Current text — from the bound control in controlled mode, else the value model.\n * why: `tick` is a tracked dependency so the computed re-runs when a bound control's\n * value changes programmatically (control.value itself is not a signal).\n */\n protected readonly currentText = computed<string>(() => {\n this.tick();\n const c = this.control();\n const raw = c ? c.value : this.value();\n return raw == null ? '' : String(raw);\n });\n\n protected readonly hasValue = computed(() => this.currentText().length > 0);\n\n protected readonly sizeOf = computed(() => {\n const text = this.currentText();\n const base = text.length > 0 ? text.length : this.placeholder().length;\n return Math.max(this.minSize(), base);\n });\n\n protected readonly showClear = computed(() => this.clearable() && this.hasValue() && !this.disabled());\n\n protected readonly effectiveState = computed<SdInlineTextState>(() => {\n const s = this.state();\n if (s !== 'auto') return s;\n if (this.focused()) return 'focus';\n return this.hasValue() ? 'active' : 'pending';\n });\n\n // ── event handlers ─────────────────────────────────────────────────────────\n protected onInput(ev: Event): void {\n const el = ev.target as HTMLInputElement;\n // why: only the uncontrolled mode owns the value model; in controlled mode the bound\n // FormControl carries the value natively (ReactiveForms), so we must not double-write.\n if (!this.control()) this.value.set(el.value);\n this.tick.update(n => n + 1);\n }\n\n protected onFocus(ev: FocusEvent): void {\n this.focused.set(true);\n this.sdFocus.emit(ev);\n }\n\n protected onBlur(ev: FocusEvent): void {\n this.focused.set(false);\n this.tick.update(n => n + 1);\n this.sdBlur.emit(ev);\n }\n\n protected onKeyup(ev: KeyboardEvent): void {\n if (ev.key === 'Enter') this.keyupEnter.emit();\n }\n\n protected onKeydown(ev: KeyboardEvent): void {\n if (ev.key === 'Escape') this.keydownEscape.emit();\n this.sdKeydown.emit(ev);\n }\n\n protected onPaste(ev: ClipboardEvent): void {\n this.sdPaste.emit(ev);\n }\n\n protected onCompositionStart(ev: CompositionEvent): void {\n this.sdCompositionStart.emit(ev);\n }\n\n protected onCompositionEnd(ev: CompositionEvent): void {\n this.tick.update(n => n + 1);\n this.sdCompositionEnd.emit(ev);\n }\n\n protected clear(ev: Event): void {\n ev.stopPropagation();\n const c = this.control();\n if (c) c.setValue('');\n else this.value.set('');\n this.tick.update(n => n + 1);\n this.cleared.emit();\n }\n\n // ── public API ───────────────────────────────────────────────────────────\n /** Focus the native input. */\n focus(): void {\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Blur the native input. */\n blur(): void {\n this.inputRef()?.nativeElement.blur();\n }\n}\n","@let _autoId = autoId();\n@let _placeholder = placeholder();\n@let _sizeOf = sizeOf();\n@let _control = control();\n\n@if (_control) {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [formControl]=\"_control\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n} @else {\n <input\n #inputEl\n class=\"sd-inline-text__input\"\n type=\"text\"\n [value]=\"currentText()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"_placeholder\"\n [size]=\"_sizeOf\"\n [attr.data-autoId]=\"_autoId\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keyup)=\"onKeyup($event)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\" />\n}\n\n@if (showClear()) {\n <button type=\"button\" class=\"sd-inline-text__clear\" (click)=\"clear($event)\" aria-label=\"Clear\" tabindex=\"-1\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|