{"version":3,"file":"ngx-t-forms-selection-options-editor.component-BhmmJOco.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/selection-options-editor/selection-options-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/selection-options-editor/selection-options-editor.component.html"],"sourcesContent":["import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  PLATFORM_ID,\r\n  ViewEncapsulation,\r\n  computed,\r\n  inject,\r\n  input,\r\n  output,\r\n  signal,\r\n} from '@angular/core';\r\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n  FormControl,\r\n  FormGroup,\r\n  NonNullableFormBuilder,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\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 single selectable option managed by the editor. */\r\ninterface Option {\r\n  /** Stable identifier, generated once per option and never reassigned. */\r\n  id: string;\r\n  /** Display text the end user sees in the rendered form. */\r\n  label: string;\r\n  /** Stored value persisted when the option is chosen. */\r\n  value: string;\r\n}\r\n\r\n/** Reactive form shape backing the add/edit card. */\r\ntype OptionForm = FormGroup<{\r\n  label: FormControl<string>;\r\n  value: FormControl<string>;\r\n}>;\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * Editor for a list of selectable `{ id, label, value }` options. Renders inside\r\n * `t-dynamic-data-edit`, which supplies the field label, hint, and validation\r\n * errors — so this component owns only the chip list plus the add/edit card.\r\n *\r\n * @example\r\n *   <lib-selection-options-editor\r\n *     [options]=\"options()\"\r\n *     [disabled]=\"disabled()\"\r\n *     (valueChanged)=\"onOptions($event)\" />\r\n */\r\n@Component({\r\n  selector: 'lib-selection-options-editor',\r\n  templateUrl: './selection-options-editor.component.html',\r\n  styleUrl: './selection-options-editor.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  host: {\r\n    'class': 'lib-selection-options-editor',\r\n    '[attr.id]': 'hostId',\r\n  },\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatButtonModule,\r\n    MatCardModule,\r\n    MatChipsModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatToolbarModule,\r\n    MatTooltipModule,\r\n    EmptyStateComponent,\r\n  ],\r\n})\r\nexport class SelectionOptionsEditorComponent {\r\n  /** Validation errors surfaced by the parent (kept for contract parity). */\r\n  readonly errors = input<IConfigElementError[] | undefined>([]);\r\n\r\n  /** Disables interaction with the chip list and the add control. */\r\n  readonly disabled = input<boolean>(false);\r\n\r\n  /** Current set of options to edit. */\r\n  readonly options = input<readonly Option[]>([]);\r\n\r\n  /** Fires the full option list whenever it is added to, edited, or pruned. */\r\n  readonly valueChanged = output<Option[]>();\r\n\r\n  /** Stable host id used by the parent's `[attr.id]` binding. */\r\n  readonly hostId = `app-selection-options-editor-${nextUniqueId++}`;\r\n\r\n  readonly #platformId = inject(PLATFORM_ID);\r\n  readonly #document = inject(DOCUMENT);\r\n  readonly #fb = inject(NonNullableFormBuilder);\r\n\r\n  /** Option being edited (existing) or added (no id yet); `null` when closed. */\r\n  protected readonly inEdit = signal<Option | null>(null);\r\n\r\n  /** Whether the editor is in \"add new\" mode (open card, no existing id). */\r\n  protected readonly isAdding = signal<boolean>(false);\r\n\r\n  /** When true, an empty value auto-fills from the camelCased label on blur. */\r\n  protected readonly isAutoCamelCase = signal<boolean>(true);\r\n\r\n  /** Live snapshot of the upstream options, defensively normalised to an array. */\r\n  protected readonly optionList = computed<readonly Option[]>(() => this.options() ?? []);\r\n\r\n  /** Whether the add/edit card is currently open. */\r\n  protected readonly isEditing = computed<boolean>(\r\n    () => this.isAdding() || this.inEdit() !== null,\r\n  );\r\n\r\n  /** Reactive form for the open add/edit card. */\r\n  protected readonly form: OptionForm = this.#fb.group({\r\n    label: this.#fb.control('', Validators.required),\r\n    value: this.#fb.control('', Validators.required),\r\n  });\r\n\r\n  /** Opens the card to add a new option. */\r\n  protected add(): void {\r\n    this.inEdit.set(null);\r\n    this.isAdding.set(true);\r\n    this.#resetForm('', '');\r\n  }\r\n\r\n  /** Opens the card to edit an existing option. */\r\n  protected startEdit(option: Option): void {\r\n    this.isAdding.set(false);\r\n    this.inEdit.set(option);\r\n    this.#resetForm(option.label, option.value);\r\n  }\r\n\r\n  /** Closes the card without persisting changes. */\r\n  protected closeEdit(): void {\r\n    this.inEdit.set(null);\r\n    this.isAdding.set(false);\r\n  }\r\n\r\n  /** Removes an option after browser confirmation, then emits the new list. */\r\n  protected remove(option: Option): void {\r\n    if (!isPlatformBrowser(this.#platformId)) return;\r\n    const win = this.#document.defaultView;\r\n    if (!win) return;\r\n    if (!win.confirm(`Are you sure you want to delete the option \"${option.label}\"?`)) return;\r\n\r\n    this.valueChanged.emit(this.optionList().filter((o) => o.id !== option.id));\r\n    if (this.inEdit()?.id === option.id) this.closeEdit();\r\n  }\r\n\r\n  /** Persists the open card as a new or updated option, then emits the list. */\r\n  protected save(): void {\r\n    if (this.form.invalid) return;\r\n\r\n    const { label, value } = this.form.getRawValue();\r\n    const editing = this.inEdit();\r\n    const next = editing\r\n      ? this.optionList().map((o) => (o.id === editing.id ? { ...o, label, value } : o))\r\n      : [...this.optionList(), { id: uuidv4(), label, value }];\r\n\r\n    this.valueChanged.emit(next);\r\n    this.closeEdit();\r\n  }\r\n\r\n  /** Toggles auto-camelCase generation of an empty value from the label. */\r\n  protected toggleAutoCamelCase(): void {\r\n    this.isAutoCamelCase.update((on) => !on);\r\n  }\r\n\r\n  /**\r\n   * Fills an empty `value` with the camelCased `label` on label blur. A value\r\n   * the user already set is never overwritten.\r\n   */\r\n  protected autoFillValueFromLabel(): void {\r\n    if (!this.isAutoCamelCase()) return;\r\n    const label = this.form.controls.label.value.trim();\r\n    if (label && !this.form.controls.value.value) {\r\n      this.form.controls.value.setValue(this.#camelCase(label));\r\n    }\r\n  }\r\n\r\n  /** Resets the form to the supplied label/value pair. */\r\n  #resetForm(label: string, value: string): void {\r\n    this.form.reset({ label, value });\r\n  }\r\n\r\n  /** Native camelCase: identical output to the previous lodash dependency. */\r\n  #camelCase(input: string): string {\r\n    const words = input\r\n      .replace(/[^A-Za-z0-9]+/g, ' ')\r\n      .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\r\n      .trim()\r\n      .toLowerCase()\r\n      .split(/\\s+/)\r\n      .filter((w) => w.length > 0);\r\n    return words\r\n      .map((word, i) => (i === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\r\n      .join('');\r\n  }\r\n}\r\n","@if (optionList().length) {\r\n  <mat-chip-listbox\r\n    class=\"lib-selection-options-editor__listbox\"\r\n    aria-label=\"Option selection\"\r\n    [disabled]=\"disabled()\">\r\n    @for (option of optionList(); track option.id) {\r\n      <mat-chip-option\r\n        class=\"lib-selection-options-editor__chip\"\r\n        color=\"accent\"\r\n        [value]=\"option.value\"\r\n        [selected]=\"inEdit()?.id === option.id\"\r\n        (click)=\"startEdit(option)\">\r\n        {{ option.label }}\r\n        <button\r\n          matChipRemove\r\n          [attr.aria-label]=\"'Remove ' + option.label\"\r\n          (click)=\"$event.stopPropagation(); remove(option)\">\r\n          <mat-icon>cancel</mat-icon>\r\n        </button>\r\n      </mat-chip-option>\r\n    }\r\n  </mat-chip-listbox>\r\n} @else if (!isEditing()) {\r\n  <lib-empty-state icon=\"list_alt\" message=\"No options yet\" />\r\n}\r\n\r\n@if (!isEditing()) {\r\n  <mat-toolbar class=\"lib-selection-options-editor__toolbar\">\r\n    <button\r\n      class=\"lib-selection-options-editor__add\"\r\n      mat-stroked-button\r\n      [disabled]=\"disabled()\"\r\n      (click)=\"add()\">\r\n      Add an option <mat-icon>add</mat-icon>\r\n    </button>\r\n  </mat-toolbar>\r\n} @else {\r\n  <mat-card class=\"lib-selection-options-editor__card\" appearance=\"outlined\">\r\n    <mat-card-header>\r\n      <mat-card-subtitle>{{ inEdit() ? 'Edit Option' : 'Add New Option' }}</mat-card-subtitle>\r\n    </mat-card-header>\r\n\r\n    <mat-card-content>\r\n      <form [formGroup]=\"form\">\r\n        <mat-form-field\r\n          class=\"lib-selection-options-editor__field\"\r\n          subscriptSizing=\"dynamic\"\r\n          floatLabel=\"always\"\r\n          appearance=\"outline\">\r\n          <mat-label>Display Text</mat-label>\r\n          <input\r\n            type=\"text\"\r\n            matInput\r\n            formControlName=\"label\"\r\n            placeholder=\"Enter option text\"\r\n            (blur)=\"autoFillValueFromLabel()\" />\r\n          <mat-hint>The text users will see and select from the list.</mat-hint>\r\n        </mat-form-field>\r\n\r\n        <mat-form-field\r\n          class=\"lib-selection-options-editor__field\"\r\n          subscriptSizing=\"dynamic\"\r\n          floatLabel=\"always\"\r\n          appearance=\"outline\">\r\n          <mat-label>Stored Value</mat-label>\r\n          <input type=\"text\" matInput formControlName=\"value\" placeholder=\"Enter data value\" />\r\n          <button\r\n            matSuffix\r\n            mat-icon-button\r\n            matTooltip=\"Toggle auto-creation of value from display text\"\r\n            [color]=\"isAutoCamelCase() ? 'primary' : ''\"\r\n            (click)=\"toggleAutoCamelCase()\">\r\n            <mat-icon>{{ isAutoCamelCase() ? 'drive_file_rename_outline' : 'edit_off' }}</mat-icon>\r\n          </button>\r\n          <mat-hint>The value saved when this option is chosen. (Often an ID or code)</mat-hint>\r\n        </mat-form-field>\r\n      </form>\r\n    </mat-card-content>\r\n\r\n    <mat-card-actions>\r\n      <button mat-button (click)=\"closeEdit()\">Cancel</button>\r\n      <button mat-flat-button [disabled]=\"form.invalid\" (click)=\"save()\">\r\n        {{ inEdit() ? 'Save Changes' : 'Add Option' }}\r\n      </button>\r\n    </mat-card-actions>\r\n  </mat-card>\r\n}\r\n"],"names":["uuidv4","i5","i6","i9"],"mappings":"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"}