{"version":3,"file":"ngx-t-forms-mat-chip-list-editor.component-wskkKr4y.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mat-chip-list-editor/mat-chip-list-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mat-chip-list-editor/mat-chip-list-editor.component.html"],"sourcesContent":["import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ViewEncapsulation,\r\n  computed,\r\n  input,\r\n  linkedSignal,\r\n  output,\r\n  signal,\r\n} from '@angular/core';\r\nimport { MatChipListboxChange, MatChipsModule } from '@angular/material/chips';\r\nimport { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { SearchFieldComponent } from '../_shared/search-field/search-field.component';\r\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\r\n\r\ninterface ChipOption {\r\n  label: string;\r\n  value: unknown;\r\n  group?: string;\r\n}\r\n\r\n/**\r\n * A run of chips sharing one `group` key. `label` is `''` for options that carry\r\n * no group — that run renders headless at the top level, so an ungrouped option\r\n * set looks exactly as it did before grouping existed.\r\n */\r\ninterface ChipOptionGroup {\r\n  readonly key: string;\r\n  readonly label: string;\r\n  readonly options: readonly ChipOption[];\r\n}\r\n\r\n/** A group with the collapse state and selection summary the template renders. */\r\ninterface RenderedChipGroup extends ChipOptionGroup {\r\n  /** Headless runs are never collapsible — there is no heading to collapse into. */\r\n  readonly collapsible: boolean;\r\n  readonly expanded: boolean;\r\n  /** How many of this group's options are currently selected. */\r\n  readonly selectedCount: number;\r\n  readonly toggleLabel: string;\r\n}\r\n\r\n/**\r\n * Joins group keys into a single primitive for the collapse-state source. A\r\n * control character, so it can never collide with a real group label.\r\n */\r\nconst GROUP_KEY_SEPARATOR = '\\u0000';\r\n\r\n/**\r\n * Chip-select editor: a searchable {@link MatChipsModule} listbox over a set of\r\n * options, single- or multi-select. Renders inside `t-dynamic-data-edit`, which\r\n * supplies the field label, hint, and validation errors — so this component owns\r\n * only the search + chip content.\r\n *\r\n * Options carrying a `group` key are gathered under a collapsible heading for\r\n * that key — the first group open, the rest closed. Options without a group stay\r\n * at the top level, headless and always visible, so a set with no groups at all\r\n * renders exactly as it did before grouping existed.\r\n *\r\n * Grouping is presentational only: the chips remain a single listbox, so\r\n * single/multi-select and the emitted value are unchanged.\r\n */\r\n@Component({\r\n  selector: 'lib-mat-chip-list-editor',\r\n  imports: [MatChipsModule, SearchFieldComponent, EmptyStateComponent],\r\n  templateUrl: './mat-chip-list-editor.component.html',\r\n  styleUrl: './mat-chip-list-editor.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  host: {\r\n    'class': 'lib-mat-chip-list-editor',\r\n    '[id]': 'hostId()',\r\n  },\r\n})\r\nexport class MatChipListEditorComponent {\r\n  static nextId = 0;\r\n\r\n  protected readonly hostId = signal<string>(\r\n    `lib-mat-chip-list-editor-${MatChipListEditorComponent.nextId++}`,\r\n  );\r\n\r\n  readonly disabled = input<boolean>(false);\r\n  readonly multiple = input<boolean>(false);\r\n  readonly required = input<boolean>(false);\r\n  readonly errors = input<IConfigElementError[] | undefined>([]);\r\n  // Internal `any` retained — wrapper templates bind heterogeneous value types\r\n  // (DataSources, string[], etc.); narrowing here would force wrapper changes.\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- wrappers bind heterogeneous chip-value payloads (DataSources, string[]).\r\n  readonly value = input<any>(undefined);\r\n  readonly options = input<ChipOption[] | undefined>([]);\r\n\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- emits whatever shape `value` was bound to; narrows once wrappers tighten.\r\n  readonly valueChange = output<any>();\r\n\r\n  /** Free-text search term (two-way bound to the search field). */\r\n  protected readonly search = signal<string>('');\r\n\r\n  /**\r\n   * Options matching the search term. Matches the visible label, the group, and\r\n   * a string value (the same reachable-string-leaf semantics the old\r\n   * `searchList` pipe applied, minus its now-removed nested-object scan).\r\n   */\r\n  protected readonly filteredOptions = computed<ChipOption[]>(() => {\r\n    const term = this.search().trim().toLowerCase();\r\n    const all = this.options() ?? [];\r\n    if (!term) return all;\r\n    return all.filter((option) => {\r\n      const haystacks = [\r\n        option.label,\r\n        option.group,\r\n        typeof option.value === 'string' ? option.value : undefined,\r\n      ];\r\n      return haystacks.some(\r\n        (text): text is string => typeof text === 'string' && text.toLowerCase().includes(term),\r\n      );\r\n    });\r\n  });\r\n\r\n  /**\r\n   * The matching options gathered into groups. Options sharing a `group` key end\r\n   * up in the same run even when they are not adjacent in the source list, and\r\n   * groups keep the order in which they first appear — so the ungrouped run sits\r\n   * where its first option was, rather than being relabelled or pushed to the end.\r\n   */\r\n  protected readonly groupedOptions = computed<readonly ChipOptionGroup[]>(() =>\r\n    this.#group(this.filteredOptions()),\r\n  );\r\n\r\n  /**\r\n   * Labelled group keys of the *unfiltered* set, joined into one primitive so the\r\n   * collapse state below only resets when the option set itself changes — not on\r\n   * every keystroke in the search box.\r\n   */\r\n  readonly #groupSignature = computed<string>(() =>\r\n    this.#group(this.options() ?? [])\r\n      .filter((group) => group.label)\r\n      .map((group) => group.key)\r\n      .join(GROUP_KEY_SEPARATOR),\r\n  );\r\n\r\n  /**\r\n   * Expanded group keys. Defaults to the first labelled group — the rest start\r\n   * closed — and stays user-controlled until the option set changes.\r\n   */\r\n  protected readonly expandedKeys = linkedSignal<string, ReadonlySet<string>>({\r\n    source: this.#groupSignature,\r\n    computation: (signature) =>\r\n      new Set(signature ? signature.split(GROUP_KEY_SEPARATOR).slice(0, 1) : []),\r\n  });\r\n\r\n  /** Selected values, normalised across the single- and multi-select shapes. */\r\n  readonly #selectedValues = computed<readonly unknown[]>(() => {\r\n    const value = this.value();\r\n    if (Array.isArray(value)) {\r\n      return value;\r\n    }\r\n    return value === undefined || value === null || value === '' ? [] : [value];\r\n  });\r\n\r\n  /**\r\n   * What the template renders. A headless run is always open, and a search query\r\n   * opens every group — matches must never hide behind a collapsed heading.\r\n   */\r\n  protected readonly renderedGroups = computed<readonly RenderedChipGroup[]>(() => {\r\n    const expandedKeys = this.expandedKeys();\r\n    const searching = this.search().trim().length > 0;\r\n    const selectedValues = this.#selectedValues();\r\n    return this.groupedOptions().map((group) => {\r\n      const collapsible = group.label !== '';\r\n      const selectedCount = group.options.filter((option) =>\r\n        selectedValues.includes(option.value),\r\n      ).length;\r\n      const selectedLabel = selectedCount ? `, ${selectedCount} selected` : '';\r\n      return {\r\n        ...group,\r\n        collapsible,\r\n        expanded: !collapsible || searching || expandedKeys.has(group.key),\r\n        selectedCount,\r\n        toggleLabel: `${group.label}, ${group.options.length} options${selectedLabel}`,\r\n      };\r\n    });\r\n  });\r\n\r\n  /** Open or close one group. Headless runs never reach this — they have no toggle. */\r\n  protected toggleGroup(key: string): void {\r\n    this.expandedKeys.update((keys) => {\r\n      const next = new Set(keys);\r\n      if (!next.delete(key)) {\r\n        next.add(key);\r\n      }\r\n      return next;\r\n    });\r\n  }\r\n\r\n  protected valueListChanged($event: MatChipListboxChange): void {\r\n    this.valueChange.emit($event.value);\r\n  }\r\n\r\n  /** Buckets options by `group`, preserving first-appearance order of both. */\r\n  #group(options: readonly ChipOption[]): readonly ChipOptionGroup[] {\r\n    const byGroup = new Map<string, ChipOption[]>();\r\n    for (const option of options) {\r\n      const label = option.group?.trim() ?? '';\r\n      const run = byGroup.get(label);\r\n      if (run) {\r\n        run.push(option);\r\n      } else {\r\n        byGroup.set(label, [option]);\r\n      }\r\n    }\r\n    return [...byGroup].map(([label, grouped]) => ({\r\n      key: label || '__ungrouped',\r\n      label,\r\n      options: grouped,\r\n    }));\r\n  }\r\n}\r\n","<lib-search-field\r\n  [(value)]=\"search\"\r\n  placeholder=\"Search options\"\r\n  [resultCount]=\"filteredOptions().length\" />\r\n\r\n@if (filteredOptions().length) {\r\n<mat-chip-listbox\r\n  class=\"lib-mat-chip-list-editor__listbox\"\r\n  [multiple]=\"multiple()\"\r\n  [value]=\"value()\"\r\n  [disabled]=\"disabled()\"\r\n  (change)=\"valueListChanged($event)\"\r\n  aria-label=\"Chip select options\">\r\n  @for (group of renderedGroups(); track group.key; let groupIndex = $index) {\r\n  <div\r\n    class=\"lib-mat-chip-list-editor__group\"\r\n    [attr.role]=\"group.collapsible ? 'group' : 'presentation'\"\r\n    [attr.aria-label]=\"group.label || null\">\r\n    @if (group.collapsible) {\r\n    <button\r\n      type=\"button\"\r\n      class=\"lib-mat-chip-list-editor__group-toggle\"\r\n      [attr.aria-expanded]=\"group.expanded\"\r\n      [attr.aria-controls]=\"hostId() + '-group-' + groupIndex\"\r\n      [attr.aria-label]=\"group.toggleLabel\"\r\n      (click)=\"toggleGroup(group.key)\">\r\n      <span\r\n        class=\"lib-mat-chip-list-editor__chevron\"\r\n        [class.lib-mat-chip-list-editor__chevron--open]=\"group.expanded\"\r\n        aria-hidden=\"true\"></span>\r\n      <span class=\"lib-mat-chip-list-editor__group-label\">{{ group.label }}</span>\r\n      @if (group.selectedCount) {\r\n      <span class=\"lib-mat-chip-list-editor__group-dot\" aria-hidden=\"true\"></span>\r\n      }\r\n      <span class=\"lib-mat-chip-list-editor__group-count\" aria-hidden=\"true\">\r\n        {{ group.options.length }}\r\n      </span>\r\n    </button>\r\n    }\r\n    @if (group.expanded) {\r\n    <div\r\n      class=\"lib-mat-chip-list-editor__group-body\"\r\n      [class.lib-mat-chip-list-editor__group-body--indented]=\"group.collapsible\"\r\n      [id]=\"hostId() + '-group-' + groupIndex\">\r\n      @for (option of group.options; track option.value+'-'+$index) {\r\n      <mat-chip-option [value]=\"option.value\">{{ option.label }}</mat-chip-option>\r\n      }\r\n    </div>\r\n    }\r\n  </div>\r\n  }\r\n</mat-chip-listbox>\r\n} @else {\r\n<lib-empty-state\r\n  icon=\"search_off\"\r\n  [message]=\"(options() || []).length ? 'No options match your search' : 'No options available'\" />\r\n}\r\n"],"names":["i1"],"mappings":"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"}