{"version":3,"file":"ngx-t-forms-date-time-picker-input-element.component-D2kj-knT.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-time-picker-input-element/core/date-time-picker-reactive-input/date-time-picker-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-time-picker-input-element/core/date-time-picker-reactive-input/date-time-picker-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-time-picker-input-element/date-time-picker-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-time-picker-input-element/date-time-picker-input-element.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ElementRef, computed, inject, input } from '@angular/core';\nimport { NgControl, ReactiveFormsModule } from '@angular/forms';\nimport { DateAdapter } from '@angular/material/core';\nimport { MatDatepicker, MatDatepickerInputEvent, MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTimepicker, MatTimepickerModule } from '@angular/material/timepicker';\nimport type { ITowerStepColumn } from 'ngx-t-forms-types';\n\nimport {\n  BaseCustomInput,\n  BaseCustomInputConfig,\n} from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\n\nconst customInputConfig: BaseCustomInputConfig = {\n  controlType: 'lib-date-time-picker-reactive-input',\n  nextId: 0,\n};\n\n/**\n * The `MatFormFieldControl` behind `dateTimePicker`: two native inputs — a date\n * one driven by `matDatepicker`, a time one driven by `matTimepicker` — that\n * together read and write **a single `Date`** on one form control.\n *\n * ## Why the merge is done here rather than left to Material\n *\n * Material's two directives each own only their own half of the value and\n * disagree about the other half:\n *\n * - Picking a day in the calendar yields a `Date` at midnight, so it would\n *   silently discard a time the user had already chosen.\n * - The timepicker generates its options from `adapter.today()`, so a time\n *   picked before a date is chosen carries *today's* date.\n *\n * Both halves are therefore recombined explicitly by {@link combine}: the\n * calendar contributes year/month/day, the clock contributes hours/minutes/\n * seconds, and the control emits one `Date`. Doing it here — rather than\n * relying on `MatTimepickerInput`'s own \"apply the time onto my current value\"\n * behaviour — keeps the result the same whichever half the user edits first,\n * and whether or not the other half is set yet.\n *\n * ## Why the clock does not open on click\n *\n * Inside a `mat-form-field`, `MatTimepickerInput` listens for `click` on the\n * WHOLE field (`getConnectedOverlayOrigin()`), not on its own input — so under\n * the default `matTimepickerOpenOnClick` every click anywhere in the field opens\n * the clock: the reload button, a suffix icon, and worst of all the calendar\n * toggle, which would raise both overlays at once. That listener is\n * all-or-nothing, so the option is turned off here. The clock opens from its own\n * `mat-timepicker-toggle` or with the arrow keys (`_handleKeydown` ignores the\n * flag), and the time can still be typed straight into the field.\n *\n * Everything reaches the form through the single `Date`, so calculations,\n * value-fetch APIs, dependency resolution and pre-population all see the same\n * one value they see for a plain `datePicker`.\n */\n@Component({\n  selector: 'lib-date-time-picker-reactive-input',\n  imports: [\n    MatDatepickerModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatTimepickerModule,\n    ReactiveFormsModule,\n  ],\n  host: {\n    '[class.floating]': 'shouldLabelFloat',\n    '[id]': 'id',\n  },\n  providers: [{ provide: MatFormFieldControl, useExisting: DateTimePickerReactiveInputComponent }],\n  templateUrl: './date-time-picker-reactive-input.component.html',\n  styleUrl: './date-time-picker-reactive-input.component.css',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DateTimePickerReactiveInputComponent extends BaseCustomInput<Date> {\n  /** Calendar overlay owned by the wrapping element renderer. */\n  readonly datePicker = input.required<MatDatepicker<Date>>();\n\n  /** Clock overlay owned by the wrapping element renderer. */\n  readonly timePicker = input.required<MatTimepicker<Date>>();\n\n  /** The column this control renders. */\n  readonly inputConfig = input.required<ITowerStepColumn>();\n\n  readonly #adapter = inject<DateAdapter<Date>>(DateAdapter);\n\n  constructor() {\n    super(\n      inject(NgControl, { optional: true, self: true }) as NgControl,\n      inject<ElementRef<HTMLElement>>(ElementRef),\n      customInputConfig,\n    );\n  }\n\n  /**\n   * True while the column forbids editing. `readonly` is folded into `disabled`\n   * because a `matDatepicker`/`matTimepicker` input left merely read-only still\n   * opens its overlay on click, which would let a \"read-only\" field be changed.\n   */\n  protected readonly isDisabled = computed<boolean>(\n    () => !!this.inputConfig().disabled || !!this.inputConfig().readonly,\n  );\n\n  /**\n   * `min`/`max` as calendar bounds, or `null` when the column declares none the\n   * adapter can read.\n   *\n   * They are bound to the **calendar only**. `matTimepickerMin`/`Max` compare\n   * time-of-day alone, so a datetime bound applied there would forbid, on every\n   * other day, the hours that only the boundary day actually excludes. The true\n   * datetime bound is enforced by the engine's `datetime` constraint validators\n   * (`configConstraintValidators`), which see the whole value.\n   */\n  protected readonly minDate = computed<Date | null>(() => this.#bound(this.inputConfig().min));\n  protected readonly maxDate = computed<Date | null>(() => this.#bound(this.inputConfig().max));\n\n  /** Accessible name for the date half — the two inputs share one `mat-label`. */\n  protected readonly dateAriaLabel = computed<string>(() => `${this.inputConfig().label ?? ''} date`.trim());\n\n  /** Accessible name for the time half. */\n  protected readonly timeAriaLabel = computed<string>(() => `${this.inputConfig().label ?? ''} time`.trim());\n\n  override get empty(): boolean {\n    const value = this.value;\n    // null / undefined / legacy empty string, but a real date at epoch 0 counts.\n    return value === null || value === undefined || (value as unknown) === '';\n  }\n\n  override get shouldLabelFloat(): boolean {\n    return true;\n  }\n\n  /**\n   * Coerces whatever the form control holds into a `Date` before it reaches the\n   * two halves.\n   *\n   * A pre-populated form, a value-fetch API response and an import row all seed\n   * the control with an ISO string rather than a `Date`, and the merge below\n   * needs real date arithmetic on both halves. Unreadable values become `null`\n   * rather than an `Invalid Date` the adapter would then format as junk.\n   */\n  override writeValue(value: Date): void {\n    // Assigns the protected field directly rather than calling `super`, whose\n    // parameter is typed `T` even though the field it writes is `T | null`:\n    // an unreadable seed legitimately coerces to null. Same two steps as the\n    // base — seed the value, announce the state change — nothing else.\n    this._value = this.#coerce(value);\n    this.stateChanges.next();\n  }\n\n  /** The user picked or typed a day: keep the time already chosen. */\n  protected dateChanged(event: MatDatepickerInputEvent<Date, unknown>): void {\n    this.#commit(this.combine(event.value, this.value));\n  }\n\n  /**\n   * The user picked or typed a time. Clearing the time keeps the day and falls\n   * back to midnight rather than destroying the value — an empty clock on a\n   * chosen day means \"that day\", not \"no day\".\n   */\n  protected timeChanged(time: Date | null): void {\n    const current = this.value;\n    if (!time) {\n      this.#commit(current ? this.#adapter.setTime(current, 0, 0, 0) : null);\n      return;\n    }\n    this.#commit(this.combine(current ?? this.#adapter.today(), time));\n  }\n\n  /**\n   * Year/month/day from `datePart`, hours/minutes/seconds from `timePart`.\n   *\n   * A null `datePart` is the whole value cleared — there is no moment without a\n   * day. A null (or unreadable) `timePart` contributes midnight.\n   *\n   * @param datePart - Source of the calendar half.\n   * @param timePart - Source of the clock half.\n   * @returns The single combined moment, or `null` when there is no day.\n   */\n  combine(datePart: Date | null, timePart: Date | null): Date | null {\n    const day = this.#coerce(datePart);\n    if (!day) return null;\n    const time = this.#coerce(timePart);\n    return this.#adapter.setTime(\n      day,\n      time ? this.#adapter.getHours(time) : 0,\n      time ? this.#adapter.getMinutes(time) : 0,\n      time ? this.#adapter.getSeconds(time) : 0,\n    );\n  }\n\n  /**\n   * Publishes a merged value. The assignment alone notifies the form — the\n   * base class's `value` setter is what calls `onChange`, and calling it again\n   * here would emit the same edit twice (the defect pinned on the sibling\n   * date-picker control's spec).\n   */\n  #commit(next: Date | null): void {\n    this.value = next;\n    this.stateChanges.next();\n  }\n\n  /** A readable `Date`, or `null` for anything the adapter cannot interpret. */\n  #coerce(value: unknown): Date | null {\n    if (value === null || value === undefined || value === '') return null;\n    return this.#adapter.getValidDateOrNull(this.#adapter.deserialize(value));\n  }\n\n  /**\n   * A configured bound as a `Date`. Returns `null` for the `MaxMinCustomScripts`\n   * sentinels and any other value the adapter cannot read, so an unresolved\n   * host script never collapses the calendar to an empty range.\n   */\n  #bound(raw: unknown): Date | null {\n    return typeof raw === 'number' ? null : this.#coerce(raw);\n  }\n}\n","<div class=\"lib-date-time-picker-fields\">\n  <input\n    class=\"lib-date-time-picker-reactive-input lib-date-time-picker-date\"\n    matInput\n    [matDatepicker]=\"datePicker()\"\n    [value]=\"value\"\n    [required]=\"inputConfig().required\"\n    [disabled]=\"isDisabled()\"\n    [min]=\"minDate()\"\n    [max]=\"maxDate()\"\n    [attr.aria-label]=\"dateAriaLabel()\"\n    (dateChange)=\"dateChanged($event)\"\n  />\n\n  <span class=\"lib-date-time-picker-separator\" aria-hidden=\"true\">at</span>\n\n  <input\n    class=\"lib-date-time-picker-time\"\n    matInput\n    [matTimepicker]=\"timePicker()\"\n    [matTimepickerOpenOnClick]=\"false\"\n    [value]=\"value\"\n    [required]=\"inputConfig().required\"\n    [disabled]=\"isDisabled()\"\n    [attr.aria-label]=\"timeAriaLabel()\"\n    (valueChange)=\"timeChanged($event)\"\n  />\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { provideNativeDateAdapter } from '@angular/material/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTimepickerModule } from '@angular/material/timepicker';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { ITowerStepColumn } from 'ngx-t-forms-types';\n\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\nimport { DateTimePickerReactiveInputComponent } from './core/date-time-picker-reactive-input/date-time-picker-reactive-input.component';\n\n/**\n * Wraps the composite date-and-time control inside a `mat-form-field`.\n *\n * The two overlays are declared here and handed down, exactly as the plain\n * date-picker element hands down its calendar: the field owns the toggles that\n * open them, the control owns the value they write. Both halves resolve to one\n * `Date` on the single control named by `inputConfig.id`, so this element needs\n * none of the multi-control plumbing `dateRangePicker` carries.\n */\n@Component({\n  selector: 'lib-date-time-picker-input-element',\n  templateUrl: './date-time-picker-input-element.component.html',\n  styleUrl: './date-time-picker-input-element.component.css',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [provideNativeDateAdapter()],\n  imports: [\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatIconModule,\n    MatButtonModule,\n    MatTooltipModule,\n    MatDatepickerModule,\n    MatTimepickerModule,\n    TFormInputStatusComponent,\n    DateTimePickerReactiveInputComponent,\n  ],\n})\nexport class DateTimePickerInputElementComponent {\n  readonly inputConfig = input.required<ITowerStepColumn>();\n  readonly formGroup = input.required<FormGroup>();\n  readonly reload = output<void>();\n\n  protected readonly errorMessage = computed(() =>\n    getInputErrorMessage(this.inputConfig(), this.formGroup()),\n  );\n}\n","<form [formGroup]=\"formGroup()\">\n  @if (inputConfig(); as inputConfig) {\n    <mat-form-field [appearance]=\"inputConfig.appearance || 'fill'\" subscriptSizing=\"dynamic\">\n      <mat-label>\n        {{ inputConfig.label }}\n        <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\n      </mat-label>\n\n      <lib-date-time-picker-reactive-input\n        [inputConfig]=\"inputConfig\"\n        [required]=\"inputConfig.required\"\n        [formControlName]=\"inputConfig.id\"\n        [datePicker]=\"datePicker\"\n        [timePicker]=\"timePicker\"\n      ></lib-date-time-picker-reactive-input>\n\n      <mat-datepicker-toggle matIconSuffix [for]=\"datePicker\"></mat-datepicker-toggle>\n      <mat-datepicker #datePicker>\n        <button mat-button matDatepickerCancel>Cancel</button>\n        <button mat-raised-button color=\"primary\" matDatepickerApply>Apply</button>\n      </mat-datepicker>\n\n      <mat-timepicker-toggle matIconSuffix [for]=\"timePicker\"></mat-timepicker-toggle>\n      <mat-timepicker #timePicker />\n\n      @if (inputConfig.canReload?.canReload) {\n        <button\n          mat-icon-button\n          style=\"margin-right: 4px;\"\n          matTooltip=\"Click to refresh this field.\"\n          class=\"input-sync-button\"\n          (click)=\"inputConfig.canReload.emit()\"\n          matSuffix\n        >\n          <mat-icon style=\"color: var(--mat-sys-primary)\">sync</mat-icon>\n        </button>\n      }\n\n      @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\n        <mat-hint class=\"inputHint\">\n          {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\n        </mat-hint>\n      }\n\n      @if (!!errorMessage()) {\n        <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\n      }\n\n      @if (inputConfig.prefixIcon) {\n        <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\n      }\n\n      @if (inputConfig.suffixIcon) {\n        <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\n      }\n\n      @if (inputConfig.prefixText) {\n        <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\n      }\n      @if (inputConfig.suffixText) {\n        <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\n      }\n    </mat-form-field>\n  }\n</form>\n"],"names":["i1","i3","i2","i4"],"mappings":"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"}