{"version":3,"file":"ngx-t-forms-form-input-selector.component-vCj2SCxs.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/form-input-selector/form-input-selector.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/form-input-selector/form-input-selector.component.html"],"sourcesContent":["import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ViewEncapsulation,\r\n  computed,\r\n  input,\r\n  output,\r\n} from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport type { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { getInputIcon } from '../../../../shared/functions/getInputIcon';\r\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\r\n\r\n/** A form input decorated with the derived view-model fields the list renders. */\r\ninterface FormInputOption {\r\n  readonly input: FormColumnInputs;\r\n  readonly id: string;\r\n  readonly label: string;\r\n  readonly icon: string;\r\n  readonly dataType: string;\r\n  readonly isSubItem: boolean;\r\n  readonly selected: boolean;\r\n  readonly ariaLabel: string;\r\n}\r\n\r\n/**\r\n * Single-select list that lets a user pick one form input by id. Child of\r\n * `t-dynamic-data-edit`, which supplies the field label, hint, and validation\r\n * errors — so this component owns only the selectable list content.\r\n *\r\n * Selecting an already-selected input deselects it (emits `undefined`). While a\r\n * value is set the list collapses to the selected-only view.\r\n */\r\n@Component({\r\n  selector: 'lib-form-input-selector',\r\n  imports: [MatIconModule, MatListModule, MatRippleModule, EmptyStateComponent],\r\n  templateUrl: './form-input-selector.component.html',\r\n  styleUrl: './form-input-selector.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  host: {\r\n    'class': 'lib-form-input-selector',\r\n    '[attr.id]': 'id()',\r\n  },\r\n})\r\nexport class FormInputSelectorComponent {\r\n  /**\r\n   * Validation errors passed down by the parent editor. Retained on the contract\r\n   * (the parent binds `[errors]`) but not rendered here — `t-dynamic-data-edit`\r\n   * owns error display, so rendering them again would double them.\r\n   */\r\n  readonly errors = input<IConfigElementError[] | undefined>([]);\r\n\r\n  /** Currently selected input id, or `undefined` when nothing is selected. */\r\n  readonly value = input<string | undefined>(undefined);\r\n\r\n  /** Available form inputs to choose from. */\r\n  readonly formInputs = input<readonly FormColumnInputs[]>([]);\r\n\r\n  /** Disable user interaction. */\r\n  readonly disabled = input<boolean>(false);\r\n\r\n  /** Optional id attribute supplied by the parent editor. */\r\n  readonly id = input<string | undefined>(undefined);\r\n\r\n  /** Emits the chosen input id, or `undefined` when the selection is cleared. */\r\n  readonly change = output<string | undefined>();\r\n\r\n  /**\r\n   * The list to render: the selected-only view once a value is set, otherwise\r\n   * every available input. Each entry carries its derived icon, sub-item flag,\r\n   * and accessible label.\r\n   */\r\n  protected readonly options = computed<readonly FormInputOption[]>(() => {\r\n    const value = this.value();\r\n    const inputs = this.formInputs();\r\n    const selected = value === undefined ? undefined : inputs.find((item) => item.id === value);\r\n    const source = selected ? [selected] : inputs;\r\n    return source.map((item) => this.#toOption(item, item.id === value));\r\n  });\r\n\r\n  /** Toggle selection: re-selecting the current value clears it. */\r\n  protected select(id: string): void {\r\n    if (this.disabled()) {\r\n      return;\r\n    }\r\n    this.change.emit(this.value() === id ? undefined : id);\r\n  }\r\n\r\n  #toOption(item: FormColumnInputs, selected: boolean): FormInputOption {\r\n    const isSubItem = Boolean(item.multipleInputInEditId);\r\n    const dataType = item.dataType ?? '';\r\n    const kind = isSubItem ? 'Sub-item input' : 'Primary input';\r\n    const dataTypeLabel = dataType ? `, ${dataType}` : '';\r\n    return {\r\n      input: item,\r\n      id: item.id,\r\n      label: item.label,\r\n      icon: getInputIcon(item.element),\r\n      dataType,\r\n      isSubItem,\r\n      selected,\r\n      ariaLabel: `${item.label}. ${kind}${dataTypeLabel}.${selected ? ' Selected.' : ''}`,\r\n    };\r\n  }\r\n}\r\n","@if (options().length) {\r\n<mat-nav-list class=\"lib-form-input-selector__list\" role=\"listbox\" aria-label=\"Form input selector\">\r\n  @for (option of options(); track option.id) {\r\n  <mat-list-item\r\n    class=\"lib-form-input-selector__item\"\r\n    matRipple\r\n    [disabled]=\"disabled()\"\r\n    [activated]=\"option.selected\"\r\n    [attr.aria-selected]=\"option.selected\"\r\n    [attr.aria-label]=\"option.ariaLabel\"\r\n    (click)=\"select(option.id)\">\r\n    <mat-icon matListItemAvatar class=\"lib-form-input-selector__avatar\" aria-hidden=\"true\">\r\n      {{ option.icon }}\r\n    </mat-icon>\r\n    <span matListItemTitle class=\"lib-form-input-selector__title\">{{ option.label }}</span>\r\n    <span matListItemLine class=\"lib-form-input-selector__meta-text\">\r\n      @if (option.isSubItem) {\r\n      <span>Sub-item</span>\r\n      }\r\n      @if (option.dataType) {\r\n      <span>{{ option.dataType }}</span>\r\n      }\r\n      @if (option.selected) {\r\n      <span class=\"lib-form-input-selector__selected-hint\">Selected</span>\r\n      }\r\n    </span>\r\n    <mat-icon\r\n      matListItemMeta\r\n      class=\"lib-form-input-selector__indicator\"\r\n      [class.lib-form-input-selector__indicator--on]=\"option.selected\"\r\n      aria-hidden=\"true\">\r\n      {{ option.selected ? 'check_circle' : 'radio_button_unchecked' }}\r\n    </mat-icon>\r\n  </mat-list-item>\r\n  }\r\n</mat-nav-list>\r\n} @else {\r\n<lib-empty-state icon=\"search_off\" message=\"No form inputs found\" />\r\n}\r\n"],"names":["i2","i3"],"mappings":"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"}