{"version":3,"file":"ngx-t-forms-multiple-input-input-element.component-BbbRpwPw.mjs","sources":["../../../projects/ngx-t-forms/src/lib/services/core/t-input-controller/functions/colorCoding.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-input-controller/functions/configureCols.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/functions/openedAgo.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-view/multiple-input-table-view.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-view/multiple-input-table-view.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-edit/multiple-input-table-edit.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-edit/multiple-input-table-edit.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/functions/getListCalculated.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/functions/spreadsheetImport.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/spreadsheet-template/spreadsheet-template.service.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-import-dialog/multiple-input-import-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-import-dialog/multiple-input-import-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table/multiple-input-table.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table/multiple-input-table.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/multiple-input-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/multiple-input-input-element.component.html"],"sourcesContent":["export class ColorScale {\r\n  private min: number;\r\n  private max: number;\r\n  private alpha: number;\r\n  private colorStops: Color[];\r\n\r\n  constructor(\r\n    min: number,\r\n    max: number,\r\n    colorStops: string[],\r\n    alpha: number = 1\r\n  ) {\r\n    validateMinMaxValues(min, max);\r\n    validateColorStops(colorStops);\r\n    validateAlphaValue(alpha);\r\n\r\n    this.min = min;\r\n    this.max = max;\r\n    this.alpha = alpha;\r\n    this.colorStops = colorStops.map((colorStop) =>\r\n      hexToColor(colorStop, alpha)\r\n    );\r\n  }\r\n\r\n  getColor(value: number) {\r\n    const numOfColorStops = this.colorStops.length;\r\n    if (value < this.min) return this.colorStops[0];\r\n    if (value > this.max) return this.colorStops[numOfColorStops - 1];\r\n\r\n    const range = this.max - this.min;\r\n\r\n    let weight = (value - this.min) / range;\r\n    const colorStopIndex = Math.max(\r\n      Math.ceil(weight * (numOfColorStops - 1)),\r\n      1\r\n    );\r\n\r\n    const minColor = this.colorStops[colorStopIndex - 1];\r\n    const maxColor = this.colorStops[colorStopIndex];\r\n    if(maxColor === undefined) return minColor;\r\n    if(minColor === undefined) return maxColor;\r\n\r\n    weight = weight * (numOfColorStops - 1) - (colorStopIndex - 1);\r\n\r\n    const r = Math.floor(weight * maxColor.r + (1 - weight) * minColor.r);\r\n    const g = Math.floor(weight * maxColor.g + (1 - weight) * minColor.g);\r\n    const b = Math.floor(weight * maxColor.b + (1 - weight) * minColor.b);\r\n\r\n    return new Color(r, g, b, this.alpha);\r\n  }\r\n}\r\n\r\nexport function validateMinMaxValues(min: number, max: number) {\r\n  if (min > max) {\r\n    throw new Error('The minimum value must be less than the maximum value.');\r\n  }\r\n}\r\n\r\nexport function validateColorStops(colorStops: string[]) {\r\n  if (colorStops.length < 2) {\r\n    throw new Error('At least two colors must be provided.');\r\n  }\r\n\r\n  colorStops.forEach((str) => {\r\n    if (!isValidHexColor(str)) {\r\n      throw new Error(`${str} is not a valid hex color.`);\r\n    }\r\n  });\r\n}\r\n\r\nexport function validateAlphaValue(alpha: number) {\r\n  if (alpha < 0 || alpha > 1) {\r\n    throw new Error('The alpha value must be between 0 and 1.');\r\n  }\r\n}\r\n\r\nexport function hexToColor(hex: string, alpha: number) {\r\n  if (isValid3DigitHexColor(hex)) {\r\n    hex = convertTo6DigitHexColor(hex);\r\n  }\r\n\r\n  const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n  if (!!result?.[1] && !!result?.[2] && !!result?.[3]) {\r\n    return new Color(\r\n      parseInt(result[1], 16),\r\n      parseInt(result[2], 16),\r\n      parseInt(result[3], 16),\r\n      alpha\r\n    );\r\n  } else {\r\n    throw new Error(`${hex} is not a valid hex color.`);\r\n  }\r\n}\r\n\r\nexport function isValidHexColor(colorString: string) {\r\n  return (\r\n    isValid3DigitHexColor(colorString) || isValid6DigitHexColor(colorString)\r\n  );\r\n}\r\n\r\nfunction isValid3DigitHexColor(colorString: string) {\r\n  const hexColorRegex = /^#(?:[0-9a-fA-F]{3})$/;\r\n  return colorString.match(hexColorRegex);\r\n}\r\n\r\nfunction isValid6DigitHexColor(colorString: string) {\r\n  const hexColorRegex = /^#(?:[0-9a-fA-F]{6})$/;\r\n  return colorString.match(hexColorRegex);\r\n}\r\n\r\nfunction convertTo6DigitHexColor(threeDigitHex: string) {\r\n  return threeDigitHex\r\n    .substring(1)\r\n    .split('')\r\n    .map((char) => {\r\n      return char + char;\r\n    })\r\n    .join('');\r\n}\r\n\r\nfunction componentToHex(c: number) {\r\n  const hex = c.toString(16);\r\n  return hex.length === 1 ? '0' + hex : hex;\r\n}\r\n\r\nexport function rgbaToHex(color: Color) {\r\n  const r = Math.floor(color.r * color.a);\r\n  const g = Math.floor(color.g * color.a);\r\n  const b = Math.floor(color.b * color.a);\r\n  return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;\r\n}\r\n\r\nexport class Color {\r\n  public r: number;\r\n  public g: number;\r\n  public b: number;\r\n  public a: number;\r\n\r\n  constructor(r: number, g: number, b: number, a: number = 1) {\r\n    validateAlphaValue(a);\r\n\r\n    this.r = r;\r\n    this.g = g;\r\n    this.b = b;\r\n    this.a = a;\r\n  }\r\n\r\n  toRGBString() {\r\n    return `rgb(${Math.floor(this.r * this.a)},${Math.floor(\r\n      this.g * this.a\r\n    )},${Math.floor(this.b * this.a)})`;\r\n  }\r\n\r\n  toRGBAString() {\r\n    return `rgba(${this.r},${this.g},${this.b},${this.a})`;\r\n  }\r\n\r\n  toHexString() {\r\n    return rgbaToHex(this);\r\n  }\r\n}\r\n","\r\n\r\n\r\nimport { DocumentLitsLabelConfigInterfaceValueType, FormColumnInputs, InputDataTypes, InputPipeTypes } from \"ngx-t-forms-types\";\r\n\r\n/** Column metadata used by the multi-row table view. */\r\nexport interface ColumnConfigEntry {\r\n    property: string;\r\n    formControlName?: string;\r\n    label?: string;\r\n    dataType?: DocumentLitsLabelConfigInterfaceValueType | InputPipeTypes | InputDataTypes | string;\r\n    type?: string;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function configureCols(inputConfig:FormColumnInputs,tempLabels:string[]):{displayedColumnsInOrder:string[],columnsConfig:Record<string, any>}\r\n{\r\n    try {\r\n\r\n        const labelInputs = ((inputConfig?.formInputs || []) as  FormColumnInputs[]).filter(input=>input.showAsLabel || tempLabels.includes(input.formControlName) )\r\n        const cols = [];\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        const colConfigs: Record<string, any> = {};\r\n        for (\r\n          let index = 0;\r\n          index < ( labelInputs).length;\r\n          index++\r\n        ) {\r\n          const c = labelInputs [index]\r\n          const col = {...c} as FormColumnInputs;\r\n          cols.push(`${inputConfig.id}.${col.id}`);\r\n          if(!col.id){\r\n            continue\r\n          }\r\n          colConfigs[`${inputConfig.id}.${col.id}`]={\r\n           property :`${inputConfig.id}.${col.id}`,\r\n           formControlName: col.formControlName,\r\n           label: col.label,\r\n           dataType: getDataType(col)\r\n          }\r\n\r\n        }\r\n    \r\n        //add remove section config\r\n        cols.push('itemRemovalButton');\r\n        colConfigs['itemRemovalButton'] = {\r\n          property: 'itemRemovalButton',\r\n          label: '',\r\n          type: 'removal',\r\n        };\r\n        // end\r\n       return {\r\n        displayedColumnsInOrder : cols.filter((c) => !!c ) as string[],\r\n        columnsConfig : colConfigs}\r\n    } catch (error) {\r\n        const message = error instanceof Error ? error.message : 'Failed to configure columns';\r\n        throw new Error(message)\r\n        \r\n      }\r\n  \r\n}\r\n\r\nfunction getDataType(input:FormColumnInputs):DocumentLitsLabelConfigInterfaceValueType|InputPipeTypes | InputDataTypes{\r\n  try {\r\n    if(input.pipe?.pipeType){\r\n      return input.pipe.pipeType\r\n    }\r\n    const inputDataType = input.dataType;\r\n    switch (inputDataType) {\r\n\r\n\r\n      case  InputDataTypes.Number:\r\n\r\n        return DocumentLitsLabelConfigInterfaceValueType.number\r\n\r\n      case InputDataTypes.Date:\r\n        \r\n        return DocumentLitsLabelConfigInterfaceValueType.date\r\n      case InputDataTypes.Array:\r\n        return InputDataTypes.Array\r\n      case InputDataTypes.Boolean:\r\n        return InputDataTypes.Boolean\r\n      case InputDataTypes.Object:\r\n        return InputDataTypes.Object\r\n\r\n\r\n      \r\n      \r\n\r\n      default:\r\n        return DocumentLitsLabelConfigInterfaceValueType.string\r\n      \r\n      }\r\n    \r\n  } catch (error) {\r\n    const msg = error instanceof Error ? error.message : 'Failed to get data type'\r\n    throw new Error(msg)\r\n  }\r\n}","/**\n * Relative-age labels for the table's \"opened\" column.\n *\n * A long list is edited row by row, and the single question the author keeps asking is *have I\n * already been in this one?* The column answers it in the smallest amount of ink that can:\n * a two-or-three character token in the row, and the full sentence in its tooltip.\n *\n * Pure and Angular-free so the thresholds can be tested directly — the component only supplies\n * the elapsed milliseconds.\n */\n\n/** A row's age since it was last opened, in the two lengths the table renders. */\nexport interface OpenedAgo {\n  /** Column token — at most three characters, e.g. `now`, `7m`, `3h`, `2d`. */\n  readonly short: string;\n  /** Tooltip sentence, e.g. `Opened 7 minutes ago`. */\n  readonly long: string;\n}\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\nconst YEAR = 365 * DAY;\n\n/**\n * Anything fresher than this reads as \"now\". A whole minute exactly, so the minutes branch below\n * can never produce a bare `0m` — the first token after \"now\" is always `1m`.\n */\nconst JUST_NOW = MINUTE;\n\n/** `1 minute` / `4 minutes` — the tooltip is a sentence, so it agrees in number. */\nfunction plural(count: number, unit: string): string {\n  return `${count} ${unit}${count === 1 ? '' : 's'} ago`;\n}\n\n/**\n * Formats how long ago a row was opened.\n *\n * @param elapsedMs milliseconds since the row was last opened. A negative value (a clock that\n *                  moved backwards) is treated as zero rather than rendering a future age.\n *\n * @example\n *   openedAgo(0);          // { short: 'now', long: 'Opened just now' }\n *   openedAgo(7 * 60_000); // { short: '7m',  long: 'Opened 7 minutes ago' }\n */\nexport function openedAgo(elapsedMs: number): OpenedAgo {\n  const elapsed = Number.isFinite(elapsedMs) ? Math.max(elapsedMs, 0) : 0;\n\n  if (elapsed < JUST_NOW) {\n    return { short: 'now', long: 'Opened just now' };\n  }\n  if (elapsed < HOUR) {\n    const minutes = Math.floor(elapsed / MINUTE);\n    return { short: `${minutes}m`, long: `Opened ${plural(minutes, 'minute')}` };\n  }\n  if (elapsed < DAY) {\n    const hours = Math.floor(elapsed / HOUR);\n    return { short: `${hours}h`, long: `Opened ${plural(hours, 'hour')}` };\n  }\n  if (elapsed < WEEK) {\n    const days = Math.floor(elapsed / DAY);\n    return { short: `${days}d`, long: `Opened ${plural(days, 'day')}` };\n  }\n  if (elapsed < YEAR) {\n    const weeks = Math.floor(elapsed / WEEK);\n    return { short: `${weeks}w`, long: `Opened ${plural(weeks, 'week')}` };\n  }\n  const years = Math.floor(elapsed / YEAR);\n  return { short: `${years}y`, long: `Opened ${plural(years, 'year')}` };\n}\n","import { CdkConnectedOverlay } from '@angular/cdk/overlay';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  Injector,\n  OnDestroy,\n  TemplateRef,\n  ViewContainerRef,\n  ViewEncapsulation,\n  afterNextRender,\n  computed,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n  CalculationFunctions,\n  DocumentLitsLabelConfigInterfaceValueType,\n  IMultiple,\n  InputDataTypes,\n  InputPipeTypes,\n  ITowerStepColumn,\n  MultipleInputAvailableOperations,\n} from 'ngx-t-forms-types';\n\nimport { ColorScale } from '../../../../../../services/core/t-input-controller/functions/colorCoding';\nimport { configureCols } from '../../../../../../services/core/t-input-controller/functions/configureCols';\nimport { FormatDataPipe } from '../../../../../../../lib/shared/pipes/format-Data.pipe';\nimport { TDynamicDataViewComponent } from '../../../../../t-dynamic-data-view/t-dynamic-data-view.component';\nimport { openedAgo } from '../../functions/openedAgo';\n\n/**\n * Row of a multiple-input data source. Each row is a heterogeneous record indexed by composite\n * column keys (`${parentId}.${inputId}`) plus the calculation-function system key. Cell values\n * are dynamic — narrowed at usage sites.\n */\ntype MultipleInputRow = Record<string, unknown> & { id?: string };\n\n/** The display type `FormatDataPipe` accepts for a cell. */\ntype CellDataType = DocumentLitsLabelConfigInterfaceValueType | InputDataTypes | InputPipeTypes | undefined;\n\n/** Column config emitted by `configureCols`. */\ninterface ColumnConfig {\n  property?: string;\n  formControlName?: string;\n  label?: string;\n  dataType?: CellDataType;\n  type?: string;\n  key?: string;\n  colorScale?: string;\n}\n\n/** Column key `configureCols` appends for the row-actions cell. */\nconst ACTIONS_COLUMN = 'itemRemovalButton';\n\n/**\n * Column key for the leading row-number column. Data columns are always `${parentId}.${inputId}`,\n * so a key with no dot in it can never collide with one.\n */\nconst INDEX_COLUMN = 'mitRowNumber';\n\n/** Column key for the trailing \"last opened\" column. Same collision argument as {@link INDEX_COLUMN}. */\nconst OPENED_COLUMN = 'mitLastOpened';\n\n/**\n * How often the relative \"opened\" labels are re-rendered. Half a minute keeps `now` -> `1m` honest\n * without the table repainting for no reason; the interval only runs once a row has been opened.\n */\nconst OPENED_TICK_MS = 30_000;\n\n/** Row key marking a calculation (total / average / …) row appended by `getCaluculatedTableData`. */\nconst CALCULATION_KEY = 'SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION';\n\n/** Row key a host may set to flag the row currently open in the editor. */\nconst IN_EDIT_KEY = 'SYSTEM_KEY_IN_EDIT';\n\n/** Page sizes offered by the paginator. */\nconst PAGE_SIZE_OPTIONS = [5, 10, 25, 50] as const;\n\n/** Rows per page before the user picks otherwise. */\nconst DEFAULT_PAGE_SIZE = 10;\n\n/**\n * The paginator is only worth its space once the rows outgrow the smallest page. Below this the\n * table shows everything and the toolbar count is the whole story.\n */\nconst PAGINATION_THRESHOLD: number = PAGE_SIZE_OPTIONS[0];\n\n/** Two-step delete: the row is removed this long after arming unless the user cancels. */\nconst DELETE_COUNTDOWN_MS = 3000;\n\n/**\n * Read-only table of a multiple-input field's rows, with per-row actions.\n *\n * Columns come from the field's `showAsLabel` inner inputs plus any the user toggles on from the\n * toolbar's column chooser. Rows page client-side through the shared `MatTableDataSource`, the\n * actions column stays pinned to the right edge when the table overflows, and the whole table can\n * be opened full screen. Full screen is a full-viewport Material dialog rather than the Fullscreen\n * API: this table's menus, tooltips and the paginator's page-size select all live in the CDK\n * overlay container, which native full screen (and top-layer popovers) would paint over.\n *\n * Two columns are the view's own rather than the field's: a leading row number, pinned to the\n * start so a row keeps its identity while a wide table scrolls, and a trailing \"opened\" age that\n * appears once the author has opened their first row — in a seventy-row list, knowing which rows\n * you have already been into is most of the navigation problem.\n *\n * Editing, duplicating and deleting are delegated to the parent through outputs — this component\n * owns no row state beyond which rows the author has opened in this session.\n *\n * @example\n *   <lib-multiple-input-table-view\n *     [inputConfig]=\"inputConfig()\"\n *     [dataSource]=\"dataSource\"\n *     (onEditItem)=\"editRow($event)\"\n *     (onDeleteItem)=\"removeRow($event)\"\n *   />\n */\n@Component({\n  selector: 'lib-multiple-input-table-view',\n  templateUrl: './multiple-input-table-view.component.html',\n  styleUrl: './multiple-input-table-view.component.css',\n  imports: [\n    CdkConnectedOverlay,\n    NgTemplateOutlet,\n    MatButtonModule,\n    MatChipsModule,\n    MatIconModule,\n    MatMenuModule,\n    MatPaginatorModule,\n    MatProgressBarModule,\n    MatProgressSpinnerModule,\n    MatTableModule,\n    MatTooltipModule,\n    FormatDataPipe,\n    TDynamicDataViewComponent,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: {\n    'class': 'lib-multiple-input-table-view',\n    '[class.lib-multiple-input-table-view--fullscreen]': 'fullscreen()',\n  },\n})\nexport class MultipleInputTableViewComponent implements OnDestroy {\n  /** The multiple-input field whose rows are shown. Drives columns, permissions and labels. */\n  readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\n\n  /** Shared data source; the parent owns its `data`, this view owns its `paginator`. */\n  readonly dataSource = input<MatTableDataSource<MultipleInputRow> | undefined>(\n    new MatTableDataSource<MultipleInputRow>(),\n  );\n\n  /** Row the parent is currently applying an action to (kept for the parent's bookkeeping). */\n  readonly applyOptionsTo = input<MultipleInputRow | undefined>(undefined);\n\n  /** Parent form group, used to spot the row currently open in the editor. */\n  readonly formGroup = input<FormGroup | null>(null);\n\n  /** Emits the id of the row to open in the editor. */\n  readonly onEditItem = output<string>();\n\n  /** Emits the row to delete once its countdown has run out. */\n  readonly onDeleteItem = output<MultipleInputRow>();\n\n  /** Emits the id of the row to duplicate. */\n  readonly onCopy = output<string>();\n\n  /** Emits the row whose action menu was opened, so the parent can target it. */\n  readonly onApplyOptionsTo = output<MultipleInputRow>();\n\n  /** Reserved for the parent's label toggle; never emitted by this view. */\n  readonly showItemAsLabel = output<void>();\n\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #dialog = inject(MatDialog);\n  readonly #viewContainerRef = inject(ViewContainerRef);\n  readonly #injector = inject(Injector);\n\n  // ── Columns ─────────────────────────────────────────────────────────────────\n  /** Inner inputs the user has switched on from the column chooser, by `formControlName`. */\n  readonly #tempLabels = signal<readonly string[]>([]);\n\n  protected readonly colConfig = computed(() => {\n    const cfg = this.inputConfig();\n    if (!cfg) {\n      return {\n        columnsConfig: {} as Record<string, ColumnConfig>,\n        displayedColumnsInOrder: [] as string[],\n      };\n    }\n    return configureCols(cfg, [...this.#tempLabels()]);\n  });\n\n  protected readonly columnsConfig = computed<Record<string, ColumnConfig>>(\n    () => this.colConfig().columnsConfig,\n  );\n\n  /**\n   * Render order: the row number, then the field's own columns, then — once anything has been\n   * opened — the \"opened\" column immediately before the actions column. Both of those are\n   * `stickyEnd`, and Material requires pinned columns to be contiguous at the end.\n   */\n  protected readonly displayedColumnsInOrderSig = computed(() => {\n    const base = this.colConfig().displayedColumnsInOrder;\n    if (!this.anyRowOpened()) {\n      return [INDEX_COLUMN, ...base];\n    }\n    // `configureCols` always appends the actions column last; guard anyway, so a future column\n    // order cannot silently break the sticky group.\n    const insertAt = base[base.length - 1] === ACTIONS_COLUMN ? base.length - 1 : base.length;\n    return [INDEX_COLUMN, ...base.slice(0, insertAt), OPENED_COLUMN, ...base.slice(insertAt)];\n  });\n\n  protected readonly allPossibleLabels = computed(() => {\n    const cfg = this.inputConfig();\n    const displayed = this.displayedColumnsInOrderSig();\n    return (\n      cfg?.formInputs?.map((inp) => ({\n        label: inp.label,\n        selected: displayed.includes(`${cfg?.id}.${inp.id}`),\n        formControlName: inp.formControlName,\n      })) || []\n    );\n  });\n\n  // ── Permissions ─────────────────────────────────────────────────────────────\n  protected readonly userCanEdit = computed(() => {\n    const cfg = this.inputConfig();\n    if (!cfg) return false;\n    if (!cfg.multipleInputAvailableOperations) return true;\n    return cfg.multipleInputAvailableOperations.includes(MultipleInputAvailableOperations.Update);\n  });\n\n  protected readonly userCanRemove = computed(() => {\n    const cfg = this.inputConfig();\n    if (!cfg) return false;\n    if (!cfg.multipleInputAvailableOperations) return true;\n    return cfg.multipleInputAvailableOperations.includes(MultipleInputAvailableOperations.Remove);\n  });\n\n  protected readonly userCanAdd = computed(() => {\n    const cfg = this.inputConfig();\n    if (!cfg) return false;\n    if (!cfg.multipleInputAvailableOperations) return true;\n    return cfg.multipleInputAvailableOperations.includes(MultipleInputAvailableOperations.Add);\n  });\n\n  protected readonly userCanApplyOptionsTo = computed(() => {\n    return this.userCanEdit() || this.userCanRemove() || this.userCanAdd();\n  });\n\n  /** A read-only or disabled field shows its rows but offers no actions at all. */\n  protected readonly isEditable = computed(() => {\n    const cfg = this.inputConfig();\n    return !!cfg && !cfg.readonly && !cfg.disabled;\n  });\n\n  protected readonly showRowActions = computed(() => this.isEditable() && this.userCanApplyOptionsTo());\n\n  /** Edit is the everyday action, so it gets its own button instead of hiding in the menu. */\n  protected readonly showRowEdit = computed(() => this.isEditable() && this.userCanEdit());\n\n  /** The overflow menu holds duplicate and delete; it is dropped when neither is allowed. */\n  protected readonly showRowMenu = computed(\n    () => this.isEditable() && (this.userCanAdd() || this.userCanRemove()),\n  );\n\n  // ── Pagination ──────────────────────────────────────────────────────────────\n  protected readonly pageSizeOptions: readonly number[] = PAGE_SIZE_OPTIONS;\n  protected readonly pageIndex = signal(0);\n  protected readonly pageSize = signal<number>(DEFAULT_PAGE_SIZE);\n\n  /**\n   * The live paginator. It is re-created when the table moves between its inline slot and the\n   * full-screen dialog, so it is read reactively rather than captured once.\n   */\n  protected readonly paginator = viewChild(MatPaginator);\n\n  // ── Full screen ─────────────────────────────────────────────────────────────\n  protected readonly fullscreen = signal(false);\n\n  /**\n   * Height the inline slot keeps while the table is in the dialog, so the surrounding form does not\n   * collapse and the page does not jump when full screen is left.\n   */\n  protected readonly reservedHeight = signal<number | null>(null);\n\n  protected readonly shellTemplate = viewChild<TemplateRef<unknown>>('shell');\n  protected readonly inlineHost = viewChild<ElementRef<HTMLElement>>('inlineHost');\n  // `read: ElementRef` — the ref sits on a `mat-icon-button`, which would otherwise resolve to\n  // the button component rather than its element.\n  protected readonly fullscreenToggle = viewChild<unknown, ElementRef<HTMLButtonElement>>(\n    'fullscreenToggle',\n    { read: ElementRef },\n  );\n\n  #dialogRef: MatDialogRef<unknown> | undefined;\n\n  constructor() {\n    // The data source pages whatever paginator is currently rendered — inline, in the dialog, or\n    // none while the rows fit on one page.\n    effect(() => {\n      const ds = this.dataSource();\n      const paginator = this.paginator() ?? null;\n      if (ds && ds.paginator !== paginator) {\n        ds.paginator = paginator;\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    // An armed delete must not fire from a component that no longer exists.\n    for (const handle of Object.values(this.#deletionTimers)) {\n      clearTimeout(handle);\n    }\n    this.#deletionTimers = {};\n    if (this.#openedTicker !== undefined) {\n      clearInterval(this.#openedTicker);\n      this.#openedTicker = undefined;\n    }\n    this.#dialogRef?.close();\n  }\n\n  // ── Column helpers (template) ───────────────────────────────────────────────\n  protected isActionsColumn(col: string): boolean {\n    return col === ACTIONS_COLUMN;\n  }\n\n  protected isIndexColumn(col: string): boolean {\n    return col === INDEX_COLUMN;\n  }\n\n  protected isOpenedColumn(col: string): boolean {\n    return col === OPENED_COLUMN;\n  }\n\n  protected columnLabel(col: string): string {\n    if (this.isActionsColumn(col)) {\n      return this.showRowActions() ? 'Actions' : '';\n    }\n    if (this.isOpenedColumn(col)) {\n      return 'Opened';\n    }\n    return this.columnsConfig()[col]?.label ?? '';\n  }\n\n  protected columnDataType(col: string): CellDataType {\n    return this.columnsConfig()[col]?.dataType;\n  }\n\n  protected isNumericColumn(col: string): boolean {\n    const type = this.columnDataType(col);\n    return type === 'number' || type === 'currency' || type === 'percent';\n  }\n\n  protected isStructuredColumn(col: string): boolean {\n    const type = this.columnDataType(col);\n    return type === 'array' || type === 'object';\n  }\n\n  // ── Row helpers (template) ──────────────────────────────────────────────────\n  protected isCalculationRow(row: MultipleInputRow): boolean {\n    return !!row[CALCULATION_KEY];\n  }\n\n  protected rowIsFlaggedInEdit(row: MultipleInputRow): boolean {\n    return !!row[IN_EDIT_KEY];\n  }\n\n  protected rowHasActions(row: MultipleInputRow): boolean {\n    // `row[''] !== 'true'` is a legacy host marker for rows that must not be acted on.\n    return this.showRowActions() && !this.isCalculationRow(row) && row[''] !== 'true';\n  }\n\n  /** A calculation row is labelled unless it is the one the editor currently has open. */\n  protected showsCalculationLabel(row: MultipleInputRow): boolean {\n    if (!this.isCalculationRow(row)) return false;\n    const inEditId = this.inputConfig()?.multipleInputInEditId;\n    return inEditId ? inEditId !== row['id'] : !row['id'];\n  }\n\n  /**\n   * The row's position in the whole list rather than in the page: the page offset plus the index\n   * Material hands the cell. A calculation row is a total, not an entry, so it carries no number.\n   */\n  protected rowNumber(row: MultipleInputRow, indexInPage: number): string {\n    if (this.isCalculationRow(row)) {\n      return '';\n    }\n    // Without a paginator every row is rendered, and a stale `pageIndex` from a larger data set\n    // would otherwise offset the numbering.\n    const offset = this.showPaginator() ? this.pageIndex() * this.pageSize() : 0;\n    return String(offset + indexInPage + 1);\n  }\n\n  protected totalRows(): number {\n    return this.dataSource()?.data.length ?? 0;\n  }\n\n  protected isEmpty(): boolean {\n    return this.totalRows() === 0;\n  }\n\n  protected showPaginator(): boolean {\n    return this.totalRows() > PAGINATION_THRESHOLD;\n  }\n\n  /** \"3 items\" — calculation rows are totals, not items, so they are left out of the count. */\n  protected rowSummary(): string {\n    const count = (this.dataSource()?.data ?? []).filter((row) => !this.isCalculationRow(row)).length;\n    return `${count} ${count === 1 ? 'item' : 'items'}`;\n  }\n\n  // ── Refresh ─────────────────────────────────────────────────────────────────\n  /**\n   * The host may offer a reload of the field's data. It used to hang off the form field as a\n   * `matSuffix`, which both floated it away from the table it refreshes and stole the width the\n   * table needed; it belongs with the table's own chrome.\n   */\n  protected readonly canReload = computed(() => !!this.inputConfig()?.canReload?.canReload);\n\n  protected reload(): void {\n    this.inputConfig()?.canReload?.emit();\n  }\n\n  // ── \"Opened\" tracking ───────────────────────────────────────────────────────\n  /*\n   * A long list is edited row by row, and the question the author keeps asking is \"have I already\n   * been in this one?\". Every open stamps the row, and the column reports the age of that stamp.\n   *\n   * In memory, deliberately: LIB-05 forbids the library reaching for `localStorage`, and the state\n   * answers a question about THIS editing session anyway. It costs one Map and one interval.\n   */\n  /** When each row was last opened, by row id. */\n  readonly #openedAt = signal<ReadonlyMap<string, number>>(new Map());\n\n  /** The clock the relative labels render against. Ticks only while something has been opened. */\n  readonly #nowMs = signal(Date.now());\n\n  #openedTicker: ReturnType<typeof setInterval> | undefined;\n\n  /** The column materialises on the first open, so an untouched table carries no extra ink. */\n  protected readonly anyRowOpened = computed(() => this.#openedAt().size > 0);\n\n  /** Column token for a row that has been opened, `''` for one that has not. */\n  protected openedShort(row: MultipleInputRow): string {\n    const at = this.#openedAtFor(row);\n    return at === undefined ? '' : openedAgo(this.#nowMs() - at).short;\n  }\n\n  /** The same age as a sentence, for the cell's tooltip. */\n  protected openedLong(row: MultipleInputRow): string {\n    const at = this.#openedAtFor(row);\n    return at === undefined ? '' : openedAgo(this.#nowMs() - at).long;\n  }\n\n  #openedAtFor(row: MultipleInputRow): number | undefined {\n    const id = this.#rowId(row);\n    return id ? this.#openedAt().get(id) : undefined;\n  }\n\n  /**\n   * Stamps a row as opened. Every open re-stamps it, so the column reads as \"what I touched last\"\n   * rather than \"what I touched first\".\n   */\n  #markOpened(row: MultipleInputRow): void {\n    const id = this.#rowId(row);\n    if (!id) {\n      return;\n    }\n    const next = new Map(this.#openedAt());\n    next.set(id, Date.now());\n    this.#openedAt.set(next);\n    this.#startOpenedTicker();\n  }\n\n  /** One interval for the whole table, started on the first open and stopped with the component. */\n  #startOpenedTicker(): void {\n    if (this.#openedTicker !== undefined) {\n      return;\n    }\n    this.#nowMs.set(Date.now());\n    this.#openedTicker = setInterval(() => this.#nowMs.set(Date.now()), OPENED_TICK_MS);\n  }\n\n  protected onPage(event: PageEvent): void {\n    this.pageIndex.set(event.pageIndex);\n    this.pageSize.set(event.pageSize);\n  }\n\n  // ── Full screen ─────────────────────────────────────────────────────────────\n  protected toggleFullscreen(): void {\n    if (this.fullscreen()) {\n      this.#dialogRef?.close();\n      return;\n    }\n    const shell = this.shellTemplate();\n    if (!shell) return;\n\n    this.reservedHeight.set(this.inlineHost()?.nativeElement.offsetHeight ?? null);\n    this.fullscreen.set(true);\n\n    const label = this.inputConfig()?.label;\n    const ref = this.#dialog.open(shell, {\n      viewContainerRef: this.#viewContainerRef,\n      width: 'calc(100vw - 3rem)',\n      height: 'calc(100vh - 3rem)',\n      maxWidth: '100vw',\n      maxHeight: '100vh',\n      panelClass: 'lib-multiple-input-table-view__dialog',\n      ariaLabel: label ? `${label} full screen` : 'Table full screen',\n      autoFocus: 'dialog',\n      // The inline toggle is re-created after the dialog closes, so focus is restored by hand.\n      restoreFocus: false,\n    });\n    this.#dialogRef = ref;\n\n    ref\n      .afterClosed()\n      .pipe(takeUntilDestroyed(this.#destroyRef))\n      .subscribe(() => {\n        if (this.#dialogRef === ref) this.#dialogRef = undefined;\n        this.fullscreen.set(false);\n        this.reservedHeight.set(null);\n        afterNextRender(\n          () => this.fullscreenToggle()?.nativeElement.focus({ preventScroll: true }),\n          { injector: this.#injector },\n        );\n      });\n  }\n\n  /** The editor opens in the form behind the dialog, so leave full screen before handing over. */\n  #leaveFullscreen(): void {\n    this.#dialogRef?.close();\n  }\n\n  // ── Actions ─────────────────────────────────────────────────────────────────\n  #rowId(row: MultipleInputRow): string {\n    return row[`${this.inputConfig()?.id}.id`] as string;\n  }\n\n  protected applyOptionsToFn(item: MultipleInputRow): void {\n    this.onApplyOptionsTo.emit(item);\n  }\n\n  protected editItem(row: MultipleInputRow): void {\n    this.#markOpened(row);\n    this.#leaveFullscreen();\n    this.onEditItem.emit(this.#rowId(row));\n  }\n\n  protected copy(row: MultipleInputRow): void {\n    this.#leaveFullscreen();\n    this.onCopy.emit(this.#rowId(row));\n  }\n\n  // ── Two-step delete ─────────────────────────────────────────────────────────\n  #armedDeletions: Record<string, boolean> = {};\n  #deletionTimers: Record<string, ReturnType<typeof setTimeout>> = {};\n  #countDownDate: Date = new Date();\n\n  protected isAboutToDeleteRow(row: MultipleInputRow): boolean {\n    return !!this.#armedDeletions[this.#rowId(row)];\n  }\n\n  protected getCountdownSeconds(): number {\n    const now = new Date();\n    const timeElapsed = (now.getTime() - this.#countDownDate.getTime()) / 1000;\n    return Math.min(Math.round((timeElapsed / (DELETE_COUNTDOWN_MS / 1000)) * 100), 100);\n  }\n\n  protected secondsCountDown(): string {\n    const total = DELETE_COUNTDOWN_MS / 1000;\n    return (total - (this.getCountdownSeconds() / 100) * total).toFixed(1);\n  }\n\n  protected multipleInputRemoveItem(event: Event, row: MultipleInputRow): void {\n    const rowId = this.#rowId(row);\n\n    if (this.#armedDeletions[rowId]) {\n      const handle = this.#deletionTimers[rowId];\n      if (handle) {\n        clearTimeout(handle);\n        delete this.#deletionTimers[rowId];\n      }\n      delete this.#armedDeletions[rowId];\n    } else {\n      this.#armedDeletions[rowId] = true;\n      this.#countDownDate = new Date();\n\n      this.#deletionTimers[rowId] = setTimeout(() => {\n        if (this.#armedDeletions[rowId]) {\n          this.onDeleteItem.emit(row);\n          delete this.#armedDeletions[rowId];\n          delete this.#deletionTimers[rowId];\n        }\n      }, DELETE_COUNTDOWN_MS);\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  // ── Cell presentation ───────────────────────────────────────────────────────\n  protected returnBackground(row: MultipleInputRow, columnsConfig?: ColumnConfig): string | undefined {\n    let background = '';\n    const ds = this.dataSource();\n    if (\n      ds\n        ? ds.data.length > 1\n          ? columnsConfig?.['colorScale']\n          : false\n        : false\n    ) {\n      const inputCfg = this.inputConfig() as IMultiple;\n      const colKey = columnsConfig?.['key'] ?? '';\n      const point = Number(row[colKey]);\n      const inputIsGrouped = inputCfg.groupBy;\n      const groupKey = inputCfg.groupBy?.[0] || '';\n      const dataSet = inputIsGrouped\n        ? ds?.data.filter(\n            (s) => (s as MultipleInputRow)[groupKey] === row[groupKey],\n          )\n        : new Array(ds?.data||[]);\n      const arrayValues: number[] = dataSet?.map((vr) => Number((vr as MultipleInputRow)[colKey]))||[];\n      const max = Math.max(...arrayValues);\n      const min = Math.min(...arrayValues);\n      const hasNun = isNaN(max) || isNaN(min);\n      if (!hasNun && Number(max) !== Number(min)) {\n        const colorScale = new ColorScale(\n          min,\n          max,\n          ['#2fdf75', '#FFA500', '#ff4961'],\n          0.8,\n        );\n\n        const color: string | undefined = colorScale.getColor(point)?.toRGBAString();\n        background = color ?? '';\n      }\n    }\n    return background;\n  }\n\n  protected hasTopBorder(row: MultipleInputRow): boolean {\n    const inputCfg = this.inputConfig() as IMultiple;\n    const inputIsGrouped = inputCfg?.groupBy;\n    const ds = this.dataSource();\n    if (inputIsGrouped && ds) {\n      const indexOfRow = ds.data.indexOf(row);\n      const rowIsFirstInTable = indexOfRow === 0;\n\n      if (!inputCfg.groupBy) {\n        return false;\n      }\n      const groupKey = inputCfg.groupBy?.[0] ?? '';\n      const isFirstInGroup = rowIsFirstInTable\n        ? true\n        : (ds.data[indexOfRow - 1] as MultipleInputRow)[groupKey] !==\n          row[groupKey];\n\n      return isFirstInGroup;\n    } else {\n      return false;\n    }\n  }\n\n  protected getCalculationFunction(row: MultipleInputRow): string {\n    const func = row[CALCULATION_KEY] as CalculationFunctions;\n\n    switch (func) {\n      case CalculationFunctions.Sum:\n        return 'TOTAL';\n      case CalculationFunctions.Avg:\n        return 'AVERAGE';\n      case CalculationFunctions.Max:\n        return 'MAX';\n      case CalculationFunctions.Min:\n        return 'MIN';\n      default:\n        return func;\n    }\n  }\n\n  // ── Column chooser ──────────────────────────────────────────────────────────\n  protected toggleTempLabel(event: Event, label: string): void {\n    this.#tempLabels.update((labels) =>\n      labels.includes(label) ? labels.filter((l) => l !== label) : [...labels, label],\n    );\n\n    // Keep the menu open so several columns can be toggled in one go.\n    event.stopPropagation();\n    event.preventDefault();\n  }\n\n  /** Column keys in display order — the removal column is always last. */\n  get displayedColumnsInOrder(): string[] {\n    return this.displayedColumnsInOrderSig();\n  }\n\n  protected rowIsInEdit(row: MultipleInputRow): boolean {\n    const cfg = this.inputConfig();\n    const fg = this.formGroup();\n    return (\n      !!cfg?.formIsOpen &&\n      fg?.controls[`${cfg?.id}.id`]?.value === row[`${cfg?.id}.id`]\n    );\n  }\n\n  // ── Structured-value popover ────────────────────────────────────────────────\n  protected readonly overlayOpen = signal(false);\n  protected readonly overlayData = signal<unknown>(null);\n  protected readonly overlayOrigin = signal<HTMLElement | null>(null);\n\n  protected openDataOverlay(event: MouseEvent, data: unknown): void {\n    event.stopPropagation();\n    this.overlayOrigin.set(event.currentTarget as HTMLElement);\n    this.overlayData.set(data);\n    this.overlayOpen.set(true);\n  }\n\n  protected closeDataOverlay(): void {\n    this.overlayOpen.set(false);\n    this.overlayData.set(null);\n    this.overlayOrigin.set(null);\n  }\n}\n","@defer (on viewport) {\n  <!--\n    The table shell is a template so the same markup renders in two places: inline in the form,\n    or inside the full-screen dialog. Only one instance exists at a time — the inline slot empties\n    while the dialog is open — so the shared data source always pages through a single paginator.\n  -->\n  <ng-template #shell>\n    <section class=\"mit-shell\" [class.mit-shell--fullscreen]=\"fullscreen()\">\n      <header class=\"mit-toolbar\">\n        <div class=\"mit-toolbar__lead\">\n          @if (fullscreen()) {\n            <h2 class=\"mit-toolbar__title\">{{ inputConfig()?.label }}</h2>\n          }\n          <span class=\"mit-toolbar__summary\">{{ rowSummary() }}</span>\n        </div>\n        <div class=\"mit-toolbar__actions\">\n          @if (canReload()) {\n            <button\n              type=\"button\"\n              mat-icon-button\n              class=\"mit-icon-button mit-reload\"\n              matTooltip=\"Refresh this list\"\n              aria-label=\"Refresh this list\"\n              (click)=\"reload()\"\n            >\n              <mat-icon>sync</mat-icon>\n            </button>\n          }\n          @if (allPossibleLabels().length > 0) {\n            <button\n              type=\"button\"\n              mat-icon-button\n              class=\"mit-icon-button mit-columns-trigger\"\n              matTooltip=\"Choose columns\"\n              aria-label=\"Choose columns\"\n              [matMenuTriggerFor]=\"colOptions\"\n            >\n              <mat-icon>view_column</mat-icon>\n            </button>\n          }\n          <button\n            #fullscreenToggle\n            type=\"button\"\n            mat-icon-button\n            class=\"mit-icon-button mit-fullscreen-toggle\"\n            [matTooltip]=\"fullscreen() ? 'Exit full screen' : 'Full screen'\"\n            [attr.aria-label]=\"fullscreen() ? 'Exit full screen' : 'Full screen'\"\n            [attr.aria-pressed]=\"fullscreen()\"\n            (click)=\"toggleFullscreen()\"\n          >\n            <mat-icon>{{ fullscreen() ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n          </button>\n        </div>\n      </header>\n\n      @if (displayedColumnsInOrder.length === 0) {\n        <div class=\"mit-state\">No columns</div>\n      }\n\n      <div class=\"mit-scroll\">\n        <table mat-table [dataSource]=\"dataSource() ?? []\" class=\"mit-table\">\n          @for (col of displayedColumnsInOrder; track col) {\n            <!--\n              The row number is pinned to the start and the \"opened\" age and actions to the end, so\n              a row keeps its identity and stays actionable however far a wide table is scrolled.\n              Material needs each pinned group contiguous at its edge, which is why the \"opened\"\n              column is inserted before the actions column rather than appended after it.\n            -->\n            <ng-container\n              [matColumnDef]=\"col\"\n              [sticky]=\"isIndexColumn(col)\"\n              [stickyEnd]=\"isActionsColumn(col) || isOpenedColumn(col)\"\n            >\n              <th\n                mat-header-cell\n                *matHeaderCellDef\n                scope=\"col\"\n                [attr.aria-label]=\"isIndexColumn(col) ? 'Row number' : null\"\n                [class.mit-th--index]=\"isIndexColumn(col)\"\n                [class.mit-th--opened]=\"isOpenedColumn(col)\"\n                [class.mit-th--numeric]=\"isNumericColumn(col)\"\n                [class.mit-th--actions]=\"isActionsColumn(col)\"\n              >\n                @if (isIndexColumn(col)) {\n                  <span class=\"mit-th-hash\" aria-hidden=\"true\">#</span>\n                } @else {\n                  <span class=\"mit-th-label\">{{ columnLabel(col) }}</span>\n                }\n              </th>\n              <td\n                mat-cell\n                *matCellDef=\"let row; let rowIndex = index\"\n                [class.mit-td--calc]=\"isCalculationRow(row)\"\n                [class.mit-td--index]=\"isIndexColumn(col)\"\n                [class.mit-td--opened]=\"isOpenedColumn(col)\"\n                [class.mit-td--actions]=\"isActionsColumn(col)\"\n                [class.mit-td--numeric]=\"isNumericColumn(col)\"\n                [style.background]=\"returnBackground(row, columnsConfig()[col])\"\n              >\n                @if (isIndexColumn(col)) {\n                  <span class=\"mit-index\">{{ rowNumber(row, rowIndex) }}</span>\n                } @else if (isOpenedColumn(col)) {\n                  <!-- Blank for a row nobody has been into: the column is a record of what the\n                       author touched, so an empty cell is the honest reading of \"not yet\". -->\n                  @let opened = openedShort(row);\n                  @if (opened) {\n                    <span class=\"mit-opened\" [matTooltip]=\"openedLong(row)\">{{ opened }}</span>\n                  }\n                } @else if (isActionsColumn(col)) {\n                  <div class=\"mit-actions\">\n                    @if (showsCalculationLabel(row)) {\n                      <span class=\"mit-calc-label\">{{ getCalculationFunction(row) }}</span>\n                    }\n                    @if (rowIsFlaggedInEdit(row)) {\n                      <mat-chip class=\"mit-chip\">In {{ inputConfig()?.readonly ? 'View' : 'Edit' }}</mat-chip>\n                    }\n                    @if (rowHasActions(row)) {\n                      @if (showRowEdit()) {\n                        <button\n                          type=\"button\"\n                          mat-icon-button\n                          class=\"mit-icon-button mit-row-edit\"\n                          [class.mit-icon-button--active]=\"rowIsInEdit(row)\"\n                          matTooltip=\"Edit\"\n                          aria-label=\"Edit row\"\n                          (click)=\"editItem(row)\"\n                        >\n                          <mat-icon>edit</mat-icon>\n                        </button>\n                      }\n                      @if (showRowMenu()) {\n                        <button\n                          type=\"button\"\n                          mat-icon-button\n                          class=\"mit-icon-button mit-row-trigger\"\n                          [class.mit-icon-button--active]=\"t.menuOpen\"\n                          matTooltip=\"More actions\"\n                          aria-label=\"More row actions\"\n                          [matMenuTriggerFor]=\"rowOptions\"\n                          [matMenuTriggerData]=\"{ row: row }\"\n                          #t=\"matMenuTrigger\"\n                          (click)=\"applyOptionsToFn(row)\"\n                        >\n                          <mat-icon>{{ t.menuOpen ? 'close' : 'more_horiz' }}</mat-icon>\n                        </button>\n                      }\n                    }\n                  </div>\n                } @else if (isStructuredColumn(col)) {\n                  <button\n                    type=\"button\"\n                    mat-icon-button\n                    class=\"mit-icon-button mit-data-button\"\n                    matTooltip=\"View data\"\n                    aria-label=\"View data\"\n                    (click)=\"openDataOverlay($event, row[col])\"\n                  >\n                    <mat-icon>data_object</mat-icon>\n                  </button>\n                } @else {\n                  @let text = row[col] | formatData: columnDataType(col);\n                  <span class=\"mit-cell-text\" [attr.title]=\"text\">{{ text }}</span>\n                }\n              </td>\n            </ng-container>\n          }\n\n          <tr mat-header-row *matHeaderRowDef=\"displayedColumnsInOrder; sticky: true\"></tr>\n          <tr\n            mat-row\n            *matRowDef=\"let row; columns: displayedColumnsInOrder\"\n            class=\"mit-row\"\n            [class.mit-row--group-start]=\"hasTopBorder(row)\"\n            [class.mit-row--calc]=\"isCalculationRow(row)\"\n            [class.mit-row--in-edit]=\"rowIsInEdit(row)\"\n          ></tr>\n        </table>\n\n        @if (isEmpty()) {\n          <div class=\"mit-empty\">\n            <strong class=\"mit-empty-title\">No items yet</strong>\n            <p class=\"mit-empty-text\">\n              Use the add button below to create a row. Each saved entry appears here.\n            </p>\n          </div>\n        }\n      </div>\n\n      @if (showPaginator()) {\n        <mat-paginator\n          class=\"mit-paginator\"\n          [pageIndex]=\"pageIndex()\"\n          [pageSize]=\"pageSize()\"\n          [pageSizeOptions]=\"pageSizeOptions\"\n          showFirstLastButtons\n          aria-label=\"Table pagination\"\n          (page)=\"onPage($event)\"\n        />\n      }\n    </section>\n  </ng-template>\n\n  <div class=\"mit-inline\" #inlineHost [style.min-height.px]=\"reservedHeight()\">\n    @if (!fullscreen()) {\n      <ng-container [ngTemplateOutlet]=\"shell\" />\n    }\n  </div>\n} @placeholder {\n  <div class=\"mit-placeholder\">\n    <mat-spinner diameter=\"32\" />\n  </div>\n}\n\n<!--\n  Structured (array / object) cell values open in a CDK overlay anchored to the button that was\n  clicked. An overlay, rather than a fixed-position panel, so it stacks correctly above the\n  full-screen dialog and is never clipped by a transformed ancestor.\n-->\n@if (overlayOrigin(); as origin) {\n  <ng-template\n    cdkConnectedOverlay\n    [cdkConnectedOverlayOrigin]=\"origin\"\n    [cdkConnectedOverlayOpen]=\"overlayOpen()\"\n    [cdkConnectedOverlayHasBackdrop]=\"true\"\n    cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n    [cdkConnectedOverlayPush]=\"true\"\n    (backdropClick)=\"closeDataOverlay()\"\n    (detach)=\"closeDataOverlay()\"\n  >\n    <div class=\"mit-data-panel\" role=\"dialog\" aria-label=\"Cell data\">\n      <div class=\"mit-data-panel__header\">\n        <span class=\"mit-data-panel__title\">Data</span>\n        <button\n          type=\"button\"\n          mat-icon-button\n          class=\"mit-icon-button mit-data-close\"\n          aria-label=\"Close\"\n          (click)=\"closeDataOverlay()\"\n        >\n          <mat-icon>close</mat-icon>\n        </button>\n      </div>\n      <div class=\"mit-data-panel__body\">\n        <lib-t-dynamic-data-view [data]=\"overlayData()\" />\n      </div>\n    </div>\n  </ng-template>\n}\n\n<mat-menu #colOptions=\"matMenu\">\n  <ng-template matMenuContent>\n    @for (label of allPossibleLabels(); track label.formControlName) {\n      <button\n        mat-menu-item\n        role=\"menuitemcheckbox\"\n        [attr.aria-checked]=\"label.selected\"\n        (click)=\"toggleTempLabel($event, label.formControlName)\"\n      >\n        <mat-icon>{{ label.selected ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n        {{ label.label }}\n      </button>\n    }\n  </ng-template>\n</mat-menu>\n\n<mat-menu #rowOptions=\"matMenu\">\n  <ng-template matMenuContent let-row=\"row\">\n    @if (isEditable()) {\n      @if (userCanAdd()) {\n        <button mat-menu-item (click)=\"copy(row)\">\n          <mat-icon>content_copy</mat-icon>\n          <div class=\"option-text\">\n            <div class=\"option-main-text\">Duplicate</div>\n            <div class=\"option-sub-text\">Create a copy with the same values</div>\n          </div>\n        </button>\n      }\n\n      @if (userCanRemove()) {\n        @if (isAboutToDeleteRow(row)) {\n          <button mat-menu-item (click)=\"multipleInputRemoveItem($event, row)\">\n            <mat-icon color=\"accent\">cancel</mat-icon>\n            <div class=\"option-text\">\n              <div class=\"option-main-text option-main-text--cancel\">Cancel Deletion</div>\n              <div class=\"option-sub-text\">Auto-deleting in {{ secondsCountDown() }} seconds...</div>\n            </div>\n          </button>\n          <div class=\"deletion-progress-container\">\n            <mat-progress-bar color=\"warn\" mode=\"determinate\" [value]=\"getCountdownSeconds()\"></mat-progress-bar>\n            @if (getCountdownSeconds() > 75) {\n              <div class=\"deletion-message\">Deleting soon...</div>\n            }\n          </div>\n        } @else {\n          <button mat-menu-item (click)=\"multipleInputRemoveItem($event, row)\">\n            <mat-icon color=\"warn\">delete_outline</mat-icon>\n            <div class=\"option-text\">\n              <div class=\"option-main-text\">Delete</div>\n              <div class=\"option-sub-text\">Removes after 3 seconds. Click again to cancel</div>\n            </div>\n          </button>\n        }\n      }\n    }\n  </ng-template>\n</mat-menu>\n","import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  DestroyRef,\r\n  OnDestroy,\r\n  ViewEncapsulation,\r\n  computed,\r\n  inject,\r\n  input,\r\n  output,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { TFormInputComponent } from '../../../../t-form-input.component';\r\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\nimport { Subject, takeUntil, tap, timer } from 'rxjs';\r\nimport { CalculationFunctions, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { IMultipleInputCal } from 'ngx-t-forms-types';\r\nimport { FormBuilderFunctions } from 'ngx-t-forms-types';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n\r\n@Component({\r\n  selector: 'lib-multiple-input-table-edit',\r\n  imports: [\r\n    CommonModule,\r\n    DragDropModule,\r\n    MatButtonModule,\r\n    MatCardModule,\r\n    MatDividerModule,\r\n    MatIconModule,\r\n    MatMenuModule,\r\n    MatProgressSpinnerModule,\r\n    MatTooltipModule,\r\n  ],\r\n  templateUrl: './multiple-input-table-edit.component.html',\r\n  styleUrl: './multiple-input-table-edit.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class MultipleInputTableEditComponent implements OnDestroy {\r\n  protected readonly InputComponent = TFormInputComponent;\r\n\r\n  readonly inputConfig = input.required<ITowerStepColumn>();\r\n  readonly editorMode = input<boolean>(false);\r\n  readonly formGroup = input<FormGroup | null>(null);\r\n  readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n\r\n  readonly onSaveMultipleInputForm = output<void>();\r\n  readonly editMultipleInput = output<ITowerStepColumn>();\r\n  readonly deleteInput = output<ITowerStepColumn>();\r\n  readonly showItemAsLabel = output<ITowerStepColumn>();\r\n  readonly addFunction = output<IMultipleInputCal>();\r\n  readonly reorderItems = output<CdkDragDrop<ITowerStepColumn[], unknown, unknown>>();\r\n\r\n  protected readonly calculationFunctions = Object.values(CalculationFunctions);\r\n\r\n  protected activeInput: string = '';\r\n  protected dragging: boolean = false;\r\n  protected overId: string | null = null;\r\n  protected areYouSure: boolean = false;\r\n\r\n  protected countdownSeconds: {\r\n    [key: string]: {\r\n      count: number | null;\r\n      stop$: Subject<void>;\r\n    };\r\n  } = {};\r\n\r\n  protected readonly innerInputs = computed(() => {\r\n    const cfg = this.inputConfig();\r\n    return (\r\n      cfg?.formInputs?.map(\r\n        (input) =>\r\n          ({\r\n            ...input,\r\n            originalId: input.id,\r\n            id: `${cfg?.id}.${input.id}`,\r\n          } as ITowerStepColumn),\r\n      ) || []\r\n    );\r\n  });\r\n\r\n  protected readonly rowInUpdate = computed(() => {\r\n    const cfg = this.inputConfig();\r\n    const fg = this.formGroup();\r\n    return !!cfg?.formIsOpen && !!fg?.controls[`${cfg?.id}.id`]?.value;\r\n  });\r\n\r\n  protected readonly formInvalid = computed(() => {\r\n    const cfg = this.inputConfig();\r\n    const fg = this.formGroup();\r\n    const allControls: AbstractControl<unknown, unknown>[] = [];\r\n    cfg?.formInputs?.forEach((input) => {\r\n      const control = fg?.controls[`${cfg?.id}.${input.id}`];\r\n      if (control) {\r\n        allControls.push(control);\r\n      }\r\n    });\r\n    return allControls.some((control) => control?.invalid || !control);\r\n  });\r\n\r\n  readonly #destroyRef = inject(DestroyRef);\r\n\r\n  ngOnDestroy(): void {\r\n    Object.values(this.countdownSeconds).forEach(({ stop$ }) => stop$.complete());\r\n  }\r\n\r\n  protected saveMultipleInputForm(): void {\r\n    this.onSaveMultipleInputForm.emit();\r\n  }\r\n\r\n  protected inputWillBeRemovedIn(id: string): number | null | undefined {\r\n    return this.countdownSeconds[id]?.count;\r\n  }\r\n\r\n  protected removeInput(item: ITowerStepColumn): void {\r\n    if (this.countdownSeconds[item.id]) {\r\n      this.stopDeletion(item.id);\r\n      return;\r\n    }\r\n\r\n    this.countdownSeconds[item.id] = {\r\n      count: 5,\r\n      stop$: new Subject<void>(),\r\n    };\r\n\r\n    const countdown$ = timer(0, 1000).pipe(\r\n      tap((secondsElapsed) => {\r\n        const data = this.countdownSeconds[item.id];\r\n        if (!data) {\r\n          return;\r\n        }\r\n\r\n        const remainingTime = 5 - secondsElapsed;\r\n        if (remainingTime <= 0) {\r\n          this.formDeleteInput(item);\r\n          this.stopDeletion(item.id);\r\n        } else {\r\n          data.count = remainingTime;\r\n        }\r\n      }),\r\n      takeUntil(this.countdownSeconds[item.id]!.stop$),\r\n      takeUntilDestroyed(this.#destroyRef),\r\n    );\r\n\r\n    countdown$.subscribe({\r\n      complete: () => {},\r\n    });\r\n  }\r\n\r\n  protected stopDeletion(id: string): void {\r\n    if (this.countdownSeconds[id]) {\r\n      this.countdownSeconds[id]?.stop$.next();\r\n      delete this.countdownSeconds[id];\r\n    }\r\n  }\r\n\r\n  protected formDeleteInput(item: ITowerStepColumn): void {\r\n    this.deleteInput.emit(item);\r\n  }\r\n\r\n  protected dropItems(event: CdkDragDrop<ITowerStepColumn[], unknown, unknown>): void {\r\n    this.reorderItems.emit(event);\r\n  }\r\n\r\n  protected editInput(input: ITowerStepColumn): void {\r\n    this.editMultipleInput.emit(input);\r\n  }\r\n\r\n  protected toggleLabel(item: ITowerStepColumn): void {\r\n    this.showItemAsLabel.emit(item);\r\n  }\r\n\r\n  protected toggleFunction(func: CalculationFunctions, _inputId: string): void {\r\n    const addFunction: IMultipleInputCal = {\r\n      id: uuidv4(),\r\n      inputId: this.activeInput,\r\n      func,\r\n    } as IMultipleInputCal;\r\n    this.addFunction.emit(addFunction);\r\n  }\r\n\r\n  protected selectedFunction(func: CalculationFunctions): IMultipleInputCal | undefined {\r\n    return this.inputConfig()?.calculateListFunctions?.find(\r\n      (f) => f.inputId === this.activeInput && f.func === func,\r\n    );\r\n  }\r\n\r\n  protected closeMultipleInput(): void {\r\n    if (this.areYouSure) {\r\n      this.formBuilderFunctions()?.multipleInputToggleForm(this.inputConfig().id, false);\r\n      this.areYouSure = false;\r\n      return;\r\n    }\r\n    this.areYouSure = true;\r\n  }\r\n}\r\n","<mat-card appearance=\"outlined\" class=\"edit-card mat-elevation-z4\">\r\n  <mat-card-content>\r\n    <div class=\"list row\" (cdkDropListDropped)=\"dropItems($event)\"\r\n      [cdkDropListData]=\"innerInputs()\" cdkDropList #InputList=\"cdkDropList\">\r\n      @for (innerInput of innerInputs(); track innerInput.id) {\r\n        <ng-container>\r\n          @if (editorMode()) {\r\n            @if (!!formGroup()) {\r\n              <mat-card (mouseover)=\"activeInput = innerInput.id\" cdkDrag\r\n                (cdkDragStarted)=\"dragging = true\" (cdkDragReleased)=\"dragging = false\"\r\n                [class.inputCardElevated]=\"activeInput === innerInput.id\"\r\n                [class.inputCard]=\"activeInput !== innerInput.id\"\r\n                [class]=\"'col-md-' + (dragging ? '12' : innerInput.colSize)\" class=\"box\">\r\n                <ng-container *ngComponentOutlet=\"InputComponent;\r\n                  inputs: {\r\n                    inputConfig: innerInput,\r\n                    formGroup: formGroup(),\r\n                    formBuilderFunctions: formBuilderFunctions(),\r\n                  }\">\r\n                </ng-container>\r\n                @if (activeInput === innerInput.id) {\r\n                  <mat-card-actions class=\"input-actions\">\r\n                    <span class=\"spacer\"></span>\r\n                    <button [matTooltip]=\"'Edit Input: ' + innerInput.label\"\r\n                      (click)=\"editInput(innerInput)\" mat-icon-button>\r\n                      <mat-icon>edit</mat-icon>\r\n                    </button>\r\n                    @if (!!inputWillBeRemovedIn(innerInput.id)) {\r\n                      <button (mouseover)=\"overId = innerInput.id\" (mouseout)=\"overId = null\"\r\n                        (click)=\"removeInput(innerInput)\" color=\"warn\" mat-stroked-button>\r\n                        <div class=\"countdown-button\">\r\n                          <mat-progress-spinner class=\"cancelProgress\" color=\"primary\"\r\n                            [value]=\"((inputWillBeRemovedIn(innerInput.id) || 0) / 5) * 100\">\r\n                          </mat-progress-spinner>\r\n                          {{ overId === innerInput.id ? 'Click to cancel' : 'Deleting in' }}\r\n                          {{ inputWillBeRemovedIn(innerInput.id) }}\r\n                        </div>\r\n                      </button>\r\n                    } @else if (inputConfig().systemDefault !== true && innerInput.systemDefault !== true) {\r\n                      <button [matTooltip]=\"'Delete input ' + innerInput.label\"\r\n                        (click)=\"removeInput(innerInput)\" mat-icon-button>\r\n                        <mat-icon>delete</mat-icon>\r\n                      </button>\r\n                    }\r\n                    <span class=\"action-divider\"></span>\r\n                    @if (!!innerInput.showAsLabel && innerInput.dataType === 'number' || !!innerInput.showAsLabel && innerInput.type === 'number') {\r\n                      <button\r\n                        [matMenuTriggerFor]=\"calculationMenu\"\r\n                        [matMenuTriggerData]=\"{inputId:innerInput.originalId || innerInput.id}\"\r\n                        [matTooltip]=\"'calculate sum,avg,min,max'\"\r\n                        mat-icon-button>\r\n                        <mat-icon>calculate</mat-icon>\r\n                      </button>\r\n                    }\r\n                    <button [color]=\"innerInput.showAsLabel ? 'primary' : ''\"\r\n                      (click)=\"toggleLabel(innerInput)\"\r\n                      [matTooltip]=\"innerInput.showAsLabel ? 'Hide as label' : 'Show as label'\"\r\n                      mat-icon-button>\r\n                      <mat-icon>label</mat-icon>\r\n                    </button>\r\n                    <span class=\"spacer\"></span>\r\n                  </mat-card-actions>\r\n                }\r\n              </mat-card>\r\n            }\r\n          } @else {\r\n            <div [class]=\"'col-md-' + (dragging ? '12' : innerInput.colSize)\" class=\"box\">\r\n              <ng-container *ngComponentOutlet=\"InputComponent;\r\n                inputs: {\r\n                  inputConfig: innerInput,\r\n                  formGroup: formGroup(),\r\n                  formBuilderFunctions: formBuilderFunctions(),\r\n                }\">\r\n              </ng-container>\r\n            </div>\r\n          }\r\n        </ng-container>\r\n      }\r\n      @if (!!editorMode() && innerInputs().length === 0) {\r\n        <div class=\"tree-instructions\">\r\n          <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n          <span>\r\n            <strong>Add Form Input</strong>\r\n            <br>\r\n            Manage your list by adding, editing, or removing items. Each item is customizable through a form.\r\n          </span>\r\n        </div>\r\n      }\r\n    </div>\r\n  </mat-card-content>\r\n  @if (innerInputs().length !== 0) {\r\n    <mat-divider></mat-divider>\r\n    <mat-card-actions align=\"end\" class=\"edit-card-actions\">\r\n      <button [color]=\"areYouSure ? 'warn' : ''\"\r\n        [class.confirm-leave]=\"areYouSure\" mat-button\r\n        (click)=\"closeMultipleInput()\">\r\n        {{ areYouSure ? \"leave without saving\" : \"cancel\" }}\r\n      </button>\r\n      @if (!inputConfig().readonly) {\r\n        <button [disabled]=\"!!formInvalid()\" class=\"save-button\" color=\"primary\"\r\n          (click)=\"saveMultipleInputForm()\" mat-raised-button>\r\n          {{ rowInUpdate() ? \"Update\" : \"Save\" }}\r\n        </button>\r\n      }\r\n    </mat-card-actions>\r\n  }\r\n</mat-card>\r\n\r\n\r\n<mat-menu #calculationMenu=\"matMenu\">\r\n  <ng-template matMenuContent let-inputId=\"sectionId\">\r\n    @for (func of calculationFunctions; track func) {\r\n      <button (click)=\"toggleFunction(func, inputId)\" mat-menu-item>\r\n        {{ func }}\r\n        @if (selectedFunction(func)) {\r\n          <mat-icon color=\"primary\">check_circle</mat-icon>\r\n        }\r\n      </button>\r\n    }\r\n  </ng-template>\r\n</mat-menu>\r\n","\r\nimport { calculateListOveralFunctions } from \"../../../../../services/core/t-form-controller/function/calculateInputValue\";\r\nimport { CalculationFunctions, FormColumnInputs } from \"ngx-t-forms-types\";\r\n\r\ntype CalculatedRow = Record<string, unknown> & {\r\n  SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION?: CalculationFunctions;\r\n};\r\n\r\nexport function getCaluculatedTableData(\r\n  inputConfig: FormColumnInputs | undefined,\r\n  data: Record<string, unknown>[],\r\n): Record<string, unknown>[] {\r\n  try {\r\n    if (!Array.isArray(data) || !inputConfig) return data;\r\n    const input: FormColumnInputs = inputConfig;\r\n    const funcs = (input?.calculateListFunctions || []);\r\n    const allUniqueFunctionNames = [\r\n      ...new Set(funcs.map((f: { inputId: string; func: CalculationFunctions }) => f.func)),\r\n    ];\r\n    const calculatedData: CalculatedRow[] = allUniqueFunctionNames.map((func) => {\r\n      const newCalculatedData: CalculatedRow = {\r\n        SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION: func,\r\n      };\r\n      funcs.filter((f) => f.func === func).forEach((f) => {\r\n        const arrayValues = data.map((d) => Number(d[f.inputId]));\r\n        newCalculatedData[f.inputId] = calculateListOveralFunctions(func, arrayValues);\r\n      });\r\n      return newCalculatedData;\r\n    });\r\n    return [...data, ...calculatedData];\r\n  } catch (error) {\r\n    return data;\r\n  }\r\n}","/**\n * Pure helpers behind the multiple-input spreadsheet import.\n *\n * Four concerns, all Angular-free so they can be tested directly:\n *\n * 1. {@link describeImportColumns} — which spreadsheet columns a field expects,\n *    derived from its child inputs the way the bulk-import template is: an\n *    mSCOA child expands into one debit/credit column per segment per active\n *    basis, a date range into start/end, and binary inputs (files, signatures,\n *    images) are listed so the user knows they are not importable. Each column\n *    carries a hint — what to type into its cells — read off the child's type\n *    and constraints. A choice column says its options may be named as the\n *    form shows them (the import swaps a label, or a table row's column value,\n *    for the stored value).\n * 2. {@link buildImportTemplate} — the workbook a host's writer serialises: a\n *    data sheet with exactly those headers, and a `Guide` sheet of the hints.\n * 3. {@link mapSpreadsheetRows} — matches a sheet's headers to those columns and\n *    re-keys the rows by `formControlName`, the shape `TFormImportController`\n *    validates.\n * 4. {@link coerceImportedRow} + {@link toMultipleInputRow} — turn a settled,\n *    valid row into the composite-keyed record the table stores, with cells\n *    coerced to the child's declared data type.\n */\nimport { ElementTypes, InputDataTypes, InputTypes } from 'ngx-t-forms-types';\nimport type { FormColumnInputs, IIncludedSegmentConfig } from 'ngx-t-forms-types';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { SpreadsheetTemplate, SpreadsheetTemplateSheet } from '../../../../../domain/spreadsheet-import.model';\nimport { resolveDateRangeControlNames } from '../../../../../shared/functions/dateRangeControlNames';\nimport { multipleInputRowIdKey } from '../../../../../services/core/t-form-tower-controller/functions/ensureMultipleInputRowIds';\n\n/** One spreadsheet column a multiple-input field can be fed from. */\nexport interface ImportColumn {\n  /**\n   * The header the column is read from — the child's `formControlName`, or an\n   * expanded key such as `glAccount.accrual.FUND.debit` for an mSCOA segment.\n   * Also the key the settled row reports the value (and any error) under.\n   */\n  readonly key: string;\n  /** Human label, shown beside the key in the expected-columns list. */\n  readonly label: string;\n  /** Whether the form requires a value in this column. */\n  readonly required: boolean;\n  /** `false` for values that cannot travel through a cell (files, signatures, images). */\n  readonly importable: boolean;\n  /** Other header spellings accepted for this column, matched case-insensitively. */\n  readonly aliases: readonly string[];\n  /** What to type into the column's cells, in a sentence or two. */\n  readonly hint: string;\n}\n\n/** Result of matching a sheet against a field's {@link ImportColumn}s. */\nexport interface SpreadsheetRowMapping {\n  /** Rows re-keyed by column key, ready for the import controller. Blank rows are dropped. */\n  readonly rows: Record<string, unknown>[];\n  /** Keys of the columns that found a header, in column order. */\n  readonly matched: readonly string[];\n  /** Sheet headers that fed no column, in sheet order. */\n  readonly ignored: readonly string[];\n  /** Labels of required, importable columns no header matched. */\n  readonly missingRequired: readonly string[];\n}\n\n/** The subset of a MultipleInput column the row helpers read. */\ntype MultipleInputColumn = Pick<FormColumnInputs, 'id' | 'formInputs'>;\n\n/** The subset of a MultipleInput column the template builder reads. */\ntype MultipleInputField = Pick<FormColumnInputs, 'id' | 'formInputs' | 'formControlName'>;\n\n/** Name of the template sheet that explains the data sheet's columns. */\nexport const TEMPLATE_GUIDE_SHEET = 'Guide';\n\n/** Headers of the guide sheet, in order. */\nconst GUIDE_HEADERS = ['Column', 'Label', 'Required', 'What to enter'] as const;\n\n/** Elements whose value is binary and cannot be typed into a cell. */\nconst BINARY_ELEMENTS: ReadonlySet<string> = new Set([\n  ElementTypes.FileUpload,\n  ElementTypes.Signature,\n  ElementTypes.ImageCapture,\n]);\n\n/** Cap on how many static option values a hint spells out. */\nconst MAX_LISTED_OPTIONS = 10;\n\n/** Hint for a column whose value cannot travel through a cell. */\nconst NOT_IMPORTABLE_HINT = 'Cannot be imported from a spreadsheet — add it in the row editor once the rows are in.';\n\n/** Header comparison key: trimmed and case-folded. */\nconst normalise = (header: string): string => header.trim().toLowerCase();\n\nconst isBlank = (value: unknown): boolean =>\n  value === null || value === undefined || (typeof value === 'string' && value.trim() === '');\n\nconst hasUsableId = (candidate: unknown): boolean =>\n  candidate !== undefined &&\n  candidate !== null &&\n  !(typeof candidate === 'string' && candidate.trim().length === 0);\n\n/**\n * Lists the columns a sheet should carry to fill `input`, one per child input\n * (or per expanded leaf for mSCOA and date-range children).\n *\n * Section titles and children without a `formControlName` own no column. The\n * order follows `formInputs`, so the list reads like the row editor.\n */\nexport function describeImportColumns(input: MultipleInputColumn): ImportColumn[] {\n  const columns: ImportColumn[] = [];\n  for (const child of input.formInputs ?? []) {\n    if (!child?.formControlName || child.element === ElementTypes.SectionTitle) continue;\n\n    const label = child.label || child.formControlName;\n    const required = !!child.required;\n    const aliases = label === child.formControlName ? [] : [label];\n\n    if (BINARY_ELEMENTS.has(child.element)) {\n      columns.push({ key: child.formControlName, label, required, importable: false, aliases, hint: NOT_IMPORTABLE_HINT });\n      continue;\n    }\n    if (child.element === ElementTypes.MscoaSelection) {\n      columns.push(...describeMscoaColumns(child, label, required));\n      continue;\n    }\n    if (child.element === ElementTypes.DateRangePicker) {\n      const { startKey, endKey } = resolveDateRangeControlNames(child);\n      columns.push(\n        {\n          key: startKey,\n          label: `${label} start date`,\n          required,\n          importable: true,\n          aliases: [`${label} start date`],\n          hint: `Date (YYYY-MM-DD). The start of the \"${label}\" range.`,\n        },\n        {\n          key: endKey,\n          label: `${label} end date`,\n          required,\n          importable: true,\n          aliases: [`${label} end date`],\n          hint: `Date (YYYY-MM-DD). The end of the \"${label}\" range, on or after its start.`,\n        },\n      );\n      continue;\n    }\n    columns.push({ key: child.formControlName, label, required, importable: true, aliases, hint: describeEntry(child) });\n  }\n  return columns;\n}\n\n/**\n * One `.debit` / `.credit` column per configured segment, per active accounting\n * basis — the keys `TFormImportController`'s mSCOA pre-processor reads\n * (`{formControlName}.{basis}.{SEGMENT}.{debit|credit}`).\n */\nfunction describeMscoaColumns(child: FormColumnInputs, label: string, required: boolean): ImportColumn[] {\n  const cfg = child.mscoaConfig;\n  if (!cfg) return [];\n\n  const basis = (cfg.accountingBasis ?? '').toLowerCase();\n  const isDual = basis === 'dual';\n  const isCashOnly = basis === 'cash';\n  const accountLabel = cfg.accountValueLabel || 'mSCOA account';\n\n  const bases: Array<{ basisKey: 'accrual' | 'cash'; segments: readonly IIncludedSegmentConfig[] }> = [];\n  if (!isCashOnly || isDual) bases.push({ basisKey: 'accrual', segments: cfg.segments ?? [] });\n  if (isCashOnly || isDual) bases.push({ basisKey: 'cash', segments: cfg.cashSegments ?? [] });\n\n  const columns: ImportColumn[] = [];\n  for (const { basisKey, segments } of bases) {\n    for (const seg of segments) {\n      const segKey = (seg.customSegment || seg.segment || '').toUpperCase();\n      if (!segKey) continue;\n      const segLabel = seg.label || segKey;\n      const pairRule = seg.singleSelect\n        ? 'Either the debit or the credit column of the segment is enough.'\n        : 'Both the debit and the credit column of the segment are expected.';\n      for (const side of ['debit', 'credit'] as const) {\n        columns.push({\n          key: `${child.formControlName}.${basisKey}.${segKey}.${side}`,\n          label: `${label} · ${segLabel} ${basisKey} ${side}`,\n          required,\n          importable: true,\n          aliases: [],\n          hint: `The ${accountLabel} value of the \"${segLabel}\" segment, ${basisKey} basis, ${side} side. ${pairRule}`,\n        });\n      }\n    }\n  }\n  return columns;\n}\n\n/**\n * What to type into a cell of `child`: the kind of value its declared type\n * calls for, then every constraint its configuration states — allowed values,\n * bounds, length, pattern — and a note when the form normally works the value\n * out itself.\n */\nfunction describeEntry(child: FormColumnInputs): string {\n  const parts: string[] = [`${describeValueKind(child)}.`];\n\n  const options = staticOptionLabels(child);\n  if (child.element === ElementTypes.PaginatedSelectionTable) {\n    parts.push(describeTableEntry(child));\n  } else if (options.length > 0) {\n    const shown = options.slice(0, MAX_LISTED_OPTIONS);\n    const tail = options.length > shown.length ? `, … (${options.length} in total)` : '';\n    parts.push(`One of: ${shown.join(' | ')}${tail} — as the form shows it, or its stored value.`);\n  } else if (child.matOptions?.fetch?.options) {\n    parts.push('The options are loaded by the form — enter one as its picker shows it, or its stored value.');\n  }\n  if (child.allowMultipleSelection || child.multiSelect) {\n    parts.push('Several values may be given as a JSON array.');\n  }\n\n  const min = describeBound(child.min);\n  const max = describeBound(child.max);\n  if (min && max) parts.push(`Between ${min} and ${max}.`);\n  else if (min) parts.push(`At least ${min}.`);\n  else if (max) parts.push(`At most ${max}.`);\n\n  const minLength = describeLength(child.minLength);\n  const maxLength = describeLength(child.maxLength);\n  if (minLength && maxLength) parts.push(`${minLength}–${maxLength} characters.`);\n  else if (minLength) parts.push(`At least ${minLength} characters.`);\n  else if (maxLength) parts.push(`At most ${maxLength} characters.`);\n\n  if (child.pattern) parts.push(`Must match the pattern ${child.pattern}.`);\n  if (child.isCalculatedField) parts.push('Normally calculated from the other columns — leave blank to let the form work it out.');\n  if (child.placeholder) parts.push(`Example: ${child.placeholder}.`);\n\n  return parts.join(' ');\n}\n\n/** The kind of value a cell should hold, from the HTML input type first, then the data type. */\nfunction describeValueKind(child: FormColumnInputs): string {\n  switch (child.type) {\n    case InputTypes.Email:\n      return 'Email address';\n    case InputTypes.Tel:\n      return 'Phone number';\n    case InputTypes.Url:\n      return 'URL';\n    case InputTypes.Time:\n      return 'Time (HH:mm)';\n    case InputTypes.Month:\n      return 'Month (YYYY-MM)';\n    case InputTypes.Week:\n      return 'Week (YYYY-Www)';\n    case InputTypes.DateTimeLocal:\n      return 'Date and time (YYYY-MM-DDTHH:mm)';\n    case InputTypes.Color:\n      return 'Colour (#RRGGBB)';\n    default:\n      break;\n  }\n  switch (child.dataType) {\n    case InputDataTypes.Number:\n      return 'Number (digits only — no currency symbol or thousands separator)';\n    case InputDataTypes.Boolean:\n      return 'TRUE or FALSE';\n    case InputDataTypes.Date:\n      return 'Date (YYYY-MM-DD)';\n    case InputDataTypes.Array:\n      return 'JSON array, e.g. [\"A\",\"B\"]';\n    case InputDataTypes.Object:\n      return 'JSON object, e.g. {\"key\":\"value\"}';\n    case InputDataTypes.NumberOrString:\n      return 'Number or text';\n    default:\n      return 'Text';\n  }\n}\n\n/**\n * What the form shows for each option of a static list — the label, falling\n * back to the value; empty when options are fetched or absent. The import\n * accepts either, so the guide lists what the user recognises.\n */\nfunction staticOptionLabels(child: FormColumnInputs): string[] {\n  const options = child.matOptions?.options;\n  if (!Array.isArray(options)) return [];\n  return options\n    .map((option: unknown): string => {\n      if (typeof option === 'string' || typeof option === 'number') return String(option);\n      if (!option || typeof option !== 'object') return '';\n      const record = option as Record<string, unknown>;\n      const label = typeof record['label'] === 'string' ? record['label'].trim() : '';\n      if (label) return label;\n      const value = record['value'];\n      return value === undefined || value === null ? '' : String(value);\n    })\n    .filter((value) => value.length > 0);\n}\n\n/**\n * What to type for a paginated selection table: any value of the columns the\n * table shows names its row; the import stores the row's identifier. A value\n * found in several rows is settled in the review.\n */\nfunction describeTableEntry(child: FormColumnInputs): string {\n  const columns = (child.paginationSelectionConfig?.columns ?? [])\n    .map((column) => (column?.label || column?.key || '').trim())\n    .filter((name) => name.length > 0);\n  const where = columns.length > 0 ? ` (${columns.join(', ')})` : '';\n  return `A row of the table — enter a value from one of its columns${where}, or the row's stored identifier. A value found in several rows is picked from in the review.`;\n}\n\n/**\n * A `min` / `max` bound as text. Numbers and dates are printed; any other\n * string is a script key resolved when the form is captured, so there is\n * nothing useful to print.\n */\nfunction describeBound(value: FormColumnInputs['min']): string | null {\n  if (value === undefined || value === null || value === '') return null;\n  if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value.toISOString().slice(0, 10);\n  if (typeof value === 'number') return String(value);\n  const text = String(value).trim();\n  if (text === '') return null;\n  if (Number.isFinite(Number(text))) return text;\n  return /^\\d{4}-\\d{2}-\\d{2}/.test(text) ? text.slice(0, 10) : null;\n}\n\nfunction describeLength(value: number | string | undefined): string | null {\n  if (value === undefined || value === null || value === '') return null;\n  return String(value);\n}\n\n/**\n * Builds the import template for `input`: a data sheet named after the field\n * that carries the importable headers and no rows, and a `Guide` sheet with one\n * row per column — key, label, whether it is required, what to enter.\n *\n * The data sheet leads so a workbook with the guide still opens on the sheet\n * to fill in, and it is named after the field so re-importing the template\n * picks it automatically.\n */\nexport function buildImportTemplate(input: MultipleInputField): SpreadsheetTemplate {\n  const columns = describeImportColumns(input);\n  const name = (input.formControlName ?? '').trim() || 'rows';\n\n  const data: SpreadsheetTemplateSheet = {\n    name,\n    headers: columns.filter((column) => column.importable).map((column) => column.key),\n    rows: [],\n  };\n  const guide: SpreadsheetTemplateSheet = {\n    name: TEMPLATE_GUIDE_SHEET,\n    headers: [...GUIDE_HEADERS],\n    rows: columns.map((column) => ({\n      [GUIDE_HEADERS[0]]: column.key,\n      [GUIDE_HEADERS[1]]: column.label,\n      [GUIDE_HEADERS[2]]: !column.importable ? 'Not importable' : column.required ? 'Yes' : 'No',\n      [GUIDE_HEADERS[3]]: column.hint,\n    })),\n  };\n\n  return { baseName: `Template-${name}`, sheets: [data, guide] };\n}\n\n/**\n * Matches a sheet's headers to `columns` and re-keys every row by column key.\n *\n * A header is claimed by the first column it matches — by exact key, then by\n * key or alias case-insensitively — and never by a second one. Headers that\n * claim nothing are reported as ignored rather than carried along, so an `id`\n * column or a bulk template's `$index` can never leak into a row. Cells that are\n * `null` / `undefined` are omitted (the field keeps its default); empty strings\n * are passed through, exactly as the bulk import receives them. A row whose\n * every mapped cell is blank is dropped.\n */\nexport function mapSpreadsheetRows(\n  columns: readonly ImportColumn[],\n  rawRows: readonly Record<string, unknown>[],\n): SpreadsheetRowMapping {\n  const headers = [...new Set(rawRows.flatMap((row) => (row && typeof row === 'object' ? Object.keys(row) : [])))];\n  const headerByNorm = new Map<string, string>();\n  for (const header of headers) {\n    const key = normalise(header);\n    if (key && !headerByNorm.has(key)) headerByNorm.set(key, header);\n  }\n\n  const claimed = new Set<string>();\n  const headerFor = new Map<string, string>();\n  for (const column of columns) {\n    if (!column.importable) continue;\n    let header: string | undefined;\n    if (headers.includes(column.key) && !claimed.has(column.key)) {\n      header = column.key;\n    } else {\n      for (const candidate of [column.key, ...column.aliases]) {\n        const found = headerByNorm.get(normalise(candidate));\n        if (found && !claimed.has(found)) {\n          header = found;\n          break;\n        }\n      }\n    }\n    if (header) {\n      claimed.add(header);\n      headerFor.set(column.key, header);\n    }\n  }\n\n  const rows: Record<string, unknown>[] = [];\n  for (const raw of rawRows) {\n    if (!raw || typeof raw !== 'object') continue;\n    const row: Record<string, unknown> = {};\n    let hasValue = false;\n    for (const [key, header] of headerFor) {\n      const value = raw[header];\n      if (value === null || value === undefined) continue;\n      if (!isBlank(value)) hasValue = true;\n      row[key] = value;\n    }\n    if (hasValue) rows.push(row);\n  }\n\n  return {\n    rows,\n    matched: [...headerFor.keys()],\n    ignored: headers.filter((header) => !claimed.has(header)),\n    missingRequired: columns\n      .filter((column) => column.importable && column.required && !headerFor.has(column.key))\n      .map((column) => column.label),\n  };\n}\n\n/**\n * Coerces one settled cell to the child's declared data type.\n *\n * Spreadsheet cells arrive as text; the form stores what its own inputs would\n * have produced — a number input a number, a toggle a boolean, a structured\n * input a parsed object. Anything that does not parse is returned unchanged\n * rather than blanked, and dates are left as the tower settled them (the\n * tower already accepts the string forms an export produces).\n */\nexport function coerceCell(value: unknown, dataType: InputDataTypes | undefined): unknown {\n  if (value === null || value === undefined) return value;\n\n  switch (dataType) {\n    case InputDataTypes.Number: {\n      if (typeof value !== 'string') return value;\n      const text = value.trim();\n      if (text === '') return value;\n      const parsed = Number(text);\n      return Number.isFinite(parsed) ? parsed : value;\n    }\n    case InputDataTypes.Boolean: {\n      if (typeof value === 'boolean') return value;\n      if (typeof value === 'number') return value !== 0;\n      if (typeof value !== 'string') return value;\n      const text = value.trim().toLowerCase();\n      if (['true', 'yes', 'y', '1'].includes(text)) return true;\n      if (['false', 'no', 'n', '0'].includes(text)) return false;\n      return value;\n    }\n    case InputDataTypes.Array:\n    case InputDataTypes.Object: {\n      if (typeof value !== 'string') return value;\n      const text = value.trim();\n      const looksStructured =\n        (text.startsWith('[') && text.endsWith(']')) || (text.startsWith('{') && text.endsWith('}'));\n      if (!looksStructured) return value;\n      try {\n        return JSON.parse(text);\n      } catch {\n        return value;\n      }\n    }\n    default:\n      return value;\n  }\n}\n\n/** Applies {@link coerceCell} to every cell of a settled row, by the matching child's `dataType`. */\nexport function coerceImportedRow(\n  input: MultipleInputColumn,\n  settled: Record<string, unknown>,\n): Record<string, unknown> {\n  const byKey = childrenByFormControlName(input);\n  const out: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(settled)) {\n    out[key] = coerceCell(value, byKey.get(key)?.dataType);\n  }\n  return out;\n}\n\n/**\n * Converts a settled row (keyed by child `formControlName`, plus `id`) into the\n * composite-keyed record the multiple-input table stores:\n * `{ \"<inputId>.id\": …, \"<inputId>.<childId>\": … }` — the same rewrite the tower\n * applies in `initializeFormValues`. A key that matches no child is kept\n * verbatim so nothing the tower produced is silently lost; a row without a\n * usable id is given a fresh one.\n */\nexport function toMultipleInputRow(\n  input: MultipleInputColumn,\n  settled: Record<string, unknown>,\n): Record<string, unknown> {\n  const byKey = childrenByFormControlName(input);\n  const row: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(settled)) {\n    if (key === 'id') continue;\n    const child = byKey.get(key);\n    row[child ? `${input.id}.${child.id}` : key] = value;\n  }\n  const id = settled['id'];\n  row[multipleInputRowIdKey(input.id)] = hasUsableId(id) ? id : uuidv4();\n  return row;\n}\n\nfunction childrenByFormControlName(input: MultipleInputColumn): Map<string, FormColumnInputs> {\n  return new Map(\n    (input.formInputs ?? [])\n      .filter((child): child is FormColumnInputs => !!child?.formControlName && !!child.id)\n      .map((child) => [child.formControlName, child]),\n  );\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport type { FormColumnInputs } from 'ngx-t-forms-types';\n\nimport type { SpreadsheetSource } from '../../../../../../domain/spreadsheet-import.model';\nimport { SPREADSHEET_WRITER } from '../../../../../../tokens/spreadsheet-writer.token';\nimport { buildImportTemplate } from '../../functions/spreadsheetImport';\n\n/** The subset of a MultipleInput column the template is built from. */\ntype MultipleInputField = Pick<FormColumnInputs, 'id' | 'formInputs' | 'formControlName'>;\n\n/** Type offered to the browser when the writer reported none. */\nconst FALLBACK_MIME_TYPE = 'application/octet-stream';\n\n/**\n * Offers the import template of a multiple-input field for download.\n *\n * Builds the template the library defines for the field (a data sheet with\n * the headers the import matches, plus a `Guide` sheet), has the host's writer\n * serialise it, and hands the file to the browser. Only reachable when the host\n * bound a writer through `withSpreadsheetImport(parser, { writer })`; the\n * add-row menu and the import dialog both ask {@link available} before\n * offering the download. Config-free, so root-provided.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpreadsheetTemplateService {\n  readonly #writer = inject(SPREADSHEET_WRITER, { optional: true });\n  readonly #platformId = inject(PLATFORM_ID);\n  readonly #document = inject(DOCUMENT);\n\n  /** Whether the host bound a writer, so a template can be offered at all. */\n  get available(): boolean {\n    return this.#writer !== null;\n  }\n\n  /**\n   * Builds the template for `input`, has the writer serialise it and offers the\n   * file for download. Rejects with the writer's error verbatim (its message is\n   * meant for the user) and does nothing outside a browser.\n   */\n  async download(input: MultipleInputField): Promise<void> {\n    if (!this.#writer) {\n      throw new Error('No spreadsheet writer is bound — pass one to withSpreadsheetImport().');\n    }\n    if (!isPlatformBrowser(this.#platformId)) return;\n    const file = await this.#writer(buildImportTemplate(input));\n    saveFile(this.#document, file);\n  }\n}\n\n/** Hands `file` to the browser as a download, through a transient anchor. */\nfunction saveFile(document: Document, file: SpreadsheetSource): void {\n  const win = document.defaultView;\n  if (!win) return;\n  const blob = new Blob([file.data], { type: file.mimeType || FALLBACK_MIME_TYPE });\n  const url = win.URL.createObjectURL(blob);\n  const link = document.createElement('a');\n  link.href = url;\n  link.download = file.fileName;\n  link.rel = 'noopener';\n  document.body.appendChild(link);\n  link.click();\n  link.remove();\n  win.URL.revokeObjectURL(url);\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  PLATFORM_ID,\n  ViewEncapsulation,\n  computed,\n  inject,\n  signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { FormColumnInputs, ImportOptionChoice, ImportProgress, ImportRowState, ImportRowStatus } from 'ngx-t-forms-types';\n\nimport type { SpreadsheetSheet } from '../../../../../../domain/spreadsheet-import.model';\nimport { TFormImportController } from '../../../../../../services/core/t-form-import-controller/t-form-import-controller';\nimport {\n  applyOptionChoice,\n  isMultiSelectInput,\n  normaliseOptionText,\n} from '../../../../../../services/core/t-form-import-controller/functions/optionValueResolution';\nimport { SPREADSHEET_PARSER } from '../../../../../../tokens/spreadsheet-parser.token';\nimport {\n  TEMPLATE_GUIDE_SHEET,\n  describeImportColumns,\n  mapSpreadsheetRows,\n  type ImportColumn,\n  type SpreadsheetRowMapping,\n} from '../../functions/spreadsheetImport';\nimport { SpreadsheetTemplateService } from '../spreadsheet-template/spreadsheet-template.service';\n\n/** Data handed to {@link MultipleInputImportDialogComponent} via `MAT_DIALOG_DATA`. */\nexport interface MultipleInputImportDialogData {\n  /** The multiple-input field being filled. Its `formInputs` define the columns. */\n  readonly input: FormColumnInputs;\n  /** Rows already in the table, for the summary line. */\n  readonly existingRowCount: number;\n}\n\n/**\n * What the dialog resolves with: the settled, valid rows keyed by child\n * `formControlName` (plus `id`), or `undefined` when nothing is to be added.\n */\nexport type MultipleInputImportDialogResult = Record<string, unknown>[] | undefined;\n\n/** Where the dialog is in its one-way flow. */\ntype Stage = 'idle' | 'reading' | 'validating' | 'reviewed';\n\n/** One cell of the review table. */\ninterface ReviewCell {\n  /** The column's key — the child's `formControlName` — for a pick. */\n  readonly key: string;\n  /** The column's label, for the picker's accessible name. */\n  readonly label: string;\n  readonly text: string;\n  readonly error?: string;\n  /** Texts of this cell that fit several options — the user picks one per text. */\n  readonly choices?: readonly ImportOptionChoice[];\n}\n\n/** How a review row is shown: its import status, or `choice` while an option pick is pending. */\ntype ReviewStatus = ImportRowStatus | 'choice';\n\n/** One row of the review table. */\ninterface ReviewRow {\n  readonly index: number;\n  readonly status: ReviewStatus;\n  readonly label: string;\n  readonly icon: string;\n  readonly cells: readonly ReviewCell[];\n  /** Errors that have no column of their own (system failures, nested-row messages), and which row a duplicate repeats. */\n  readonly message?: string;\n}\n\n/** Chip label + icon per row status. Colour is never the only signal (GDP §2c). */\nconst STATUS_META: Record<ReviewStatus, { label: string; icon: string }> = {\n  pending: { label: 'Queued', icon: 'schedule' },\n  processing: { label: 'Checking', icon: 'hourglass_top' },\n  valid: { label: 'Ready', icon: 'check_circle' },\n  overridable: { label: 'Needs attention', icon: 'flag' },\n  invalid: { label: 'Invalid', icon: 'error' },\n  error: { label: 'Failed', icon: 'report' },\n  duplicate: { label: 'Duplicate', icon: 'content_copy' },\n  choice: { label: 'Pick a match', icon: 'rule' },\n};\n\n/** Error key prefix of a choice cell whose text fits several options; shown as a picker, not as an error. */\nconst AMBIGUOUS_OPTION_KEY = 'ambiguousOption:';\n\n/** Short, user-facing wording for the validator keys the tower reports. */\nconst ERROR_LABELS: Record<string, string> = {\n  required: 'Required',\n  min: 'Too low',\n  max: 'Too high',\n  minlength: 'Too short',\n  maxlength: 'Too long',\n  pattern: 'Wrong format',\n  email: 'Not an email',\n  invalidDate: 'Not a date',\n  invalidOption: 'Not an option',\n  ambiguousOption: 'Several matches',\n};\n\nconst EMPTY_PROGRESS: ImportProgress = {\n  total: 0,\n  pending: 0,\n  processing: 0,\n  complete: 0,\n  valid: 0,\n  overridable: 0,\n  invalid: 0,\n  error: 0,\n  duplicate: 0,\n  rows: [],\n};\n\n/** Longest cell text rendered before it is cut with an ellipsis. */\nconst MAX_CELL_TEXT = 80;\n\n/**\n * Modal that fills a multiple-input table from a spreadsheet.\n *\n * Three steps on one surface: what the sheet should carry — a template to\n * download when the host bound a writer, otherwise the list of columns — the\n * file picker (with a sheet chooser when the workbook has several), and a\n * review table that fills in as\n * {@link TFormImportController.runMultipleInputImport} settles each row. Only\n * rows that settle `valid` can be added — the same bar the row editor's Save\n * button applies — so the dialog never puts a row in the table that the form\n * would have refused. Rows that need attention stay visible with their errors\n * against the user's own column headers. A choice cell whose text fits several\n * options — a label two options share, a table value found in two rows — gets\n * a picker in place; a pick re-checks that row alone.\n *\n * The parser comes from {@link SPREADSHEET_PARSER}; this component is only\n * reachable when one is bound. Internal to the multiple-input element; not part\n * of the public API.\n */\n@Component({\n  selector: 'lib-multiple-input-import-dialog',\n  templateUrl: './multiple-input-import-dialog.component.html',\n  styleUrl: './multiple-input-import-dialog.component.css',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: {\n    'class': 'lib-multiple-input-import-dialog',\n    '[attr.data-stage]': 'stage()',\n  },\n  imports: [MatDialogModule, MatButtonModule, MatIconModule, MatProgressBarModule, MatTooltipModule],\n})\nexport class MultipleInputImportDialogComponent {\n  readonly #platformId = inject(PLATFORM_ID);\n  readonly #data = inject<MultipleInputImportDialogData>(MAT_DIALOG_DATA);\n  readonly #dialogRef = inject<MatDialogRef<MultipleInputImportDialogComponent, MultipleInputImportDialogResult>>(MatDialogRef);\n  readonly #parser = inject(SPREADSHEET_PARSER);\n  readonly #importCtrl = inject(TFormImportController);\n  readonly #templates = inject(SpreadsheetTemplateService);\n\n  /** The columns the sheet should carry — frozen for the dialog's lifetime. */\n  protected readonly columns: readonly ImportColumn[] = describeImportColumns(this.#data.input);\n\n  /** The field's label, for the subtitle. */\n  protected readonly fieldLabel: string = this.#data.input.label || this.#data.input.formControlName || 'this list';\n\n  /** File types offered by the picker. The host's parser decides what it actually reads. */\n  protected readonly accept = '.xlsx,.xlsm,.xls,.csv';\n\n  /**\n   * Whether a template can be downloaded (the host bound a writer). When it\n   * can, the template stands in for the column list: the workbook carries the\n   * headers and a guide, so there is nothing left to read off the dialog.\n   */\n  protected readonly canDownloadTemplate: boolean = this.#templates.available;\n\n  /** Name of the template's guide sheet, for the wording beside the download. */\n  protected readonly guideSheet: string = TEMPLATE_GUIDE_SHEET;\n\n  protected readonly stage = signal<Stage>('idle');\n  protected readonly fileName = signal<string | undefined>(undefined);\n  protected readonly error = signal<string | undefined>(undefined);\n  protected readonly sheets = signal<readonly SpreadsheetSheet[]>([]);\n  protected readonly activeSheet = signal<string | undefined>(undefined);\n  protected readonly mapping = signal<SpreadsheetRowMapping | undefined>(undefined);\n  protected readonly downloadingTemplate = signal(false);\n  protected readonly templateError = signal<string | undefined>(undefined);\n  /** Rows being re-checked after an option pick; their pickers and the add button wait. */\n  protected readonly rechecking = signal<ReadonlySet<number>>(new Set());\n\n  /** Live per-row states from the controller; only read while a run belongs to this dialog. */\n  protected readonly progress = toSignal(this.#importCtrl.progress$, { initialValue: EMPTY_PROGRESS });\n\n  /** Reading the file or validating its rows — the picker and the sheet chooser wait. */\n  protected readonly busy = computed(() => this.stage() === 'reading' || this.stage() === 'validating');\n\n  protected readonly progressPct = computed(() => {\n    const p = this.progress();\n    return p.total ? Math.round(((p.complete + p.error) / p.total) * 100) : 0;\n  });\n\n  /** Row states of the current run, or none until the sheet has been mapped. */\n  readonly #states = computed<readonly ImportRowState[]>(() =>\n    this.stage() === 'validating' || this.stage() === 'reviewed' ? this.progress().rows : [],\n  );\n\n  /** Columns shown in the review: those a header fed, plus any that carry an error somewhere. */\n  protected readonly reviewColumns = computed<readonly ImportColumn[]>(() => {\n    const matched = new Set(this.mapping()?.matched ?? []);\n    const withErrors = new Set(this.#states().flatMap((s) => Object.keys(s.colErrors ?? {})));\n    return this.columns.filter((c) => matched.has(c.key) || withErrors.has(c.key));\n  });\n\n  protected readonly reviewRows = computed<readonly ReviewRow[]>(() => {\n    const columns = this.reviewColumns();\n    const known = new Set(columns.map((c) => c.key));\n    return this.#states().map((state) => {\n      const status: ReviewStatus = awaitsPick(state) ? 'choice' : state.status;\n      const meta = STATUS_META[status];\n      const strays = Object.entries(state.colErrors ?? {})\n        .filter(([key]) => !known.has(key))\n        .map(([key, keys]) => `${key}: ${formatErrorKeys(keys)}`);\n      const overridable = Object.values(state.overridableErrors ?? {}).flat();\n      const repeats = state.duplicateOf === undefined ? [] : [`Same record as row ${state.duplicateOf + 1} — left out`];\n      const message = state.errorMessage ?? [...repeats, ...strays, ...overridable].join(' · ');\n      return {\n        index: state.rowIndex,\n        status,\n        label: meta.label,\n        icon: meta.icon,\n        cells: columns.map((column) => cellFor(state, column)),\n        message: message || undefined,\n      };\n    });\n  });\n\n  /** The rows that can be added: settled with no error of any kind, and not a repeat of an earlier row. */\n  readonly #ready = computed(() =>\n    this.#states()\n      .filter((s) => s.status === 'valid' && s.duplicateOf === undefined && !!s.settledValue)\n      .map((s) => s.settledValue as Record<string, unknown>),\n  );\n\n  protected readonly canAdd = computed(\n    () => this.stage() === 'reviewed' && this.rechecking().size === 0 && this.#ready().length > 0,\n  );\n\n  protected readonly addLabel = computed(() => {\n    const n = this.#ready().length;\n    return n === 1 ? 'Add 1 row' : `Add ${n} rows`;\n  });\n\n  protected readonly summary = computed(() => {\n    const p = this.progress();\n    const stage = this.stage();\n    if (stage === 'validating') {\n      return `Checking row ${Math.min(p.complete + p.error + 1, p.total)} of ${p.total}…`;\n    }\n    if (stage !== 'reviewed') return '';\n    const ready = this.#ready().length;\n    const picking = this.#states().filter(awaitsPick).length;\n    const repeats = this.#states().filter((s) => s.status === 'duplicate').length;\n    const held = p.total - ready - picking - repeats;\n    const existing = this.#data.existingRowCount;\n    const parts = [`${ready} of ${p.total} ${p.total === 1 ? 'row' : 'rows'} can be added`];\n    if (picking > 0) parts.push(`${picking} ${picking === 1 ? 'needs' : 'need'} a match picked`);\n    if (repeats > 0) parts.push(`${repeats} ${repeats === 1 ? 'repeats' : 'repeat'} an earlier row and will be left out`);\n    if (held > 0) parts.push(`${held} ${held === 1 ? 'needs' : 'need'} attention and will be left out`);\n    if (ready > 0 && existing > 0) parts.push(`the table already holds ${existing}`);\n    return `${parts.join(' · ')}.`;\n  });\n\n  /** Tooltip for an expected column: what to type, and whether it is required. */\n  protected columnTooltip(column: ImportColumn): string {\n    if (!column.importable) return `${column.label} cannot be imported from a cell — add it in the row editor.`;\n    return `${column.label} — ${column.required ? 'required' : 'optional'}. ${column.hint}`;\n  }\n\n  /** Downloads the field's import template; the writer's failure is shown beside the button. */\n  protected async downloadTemplate(): Promise<void> {\n    if (!this.canDownloadTemplate || this.downloadingTemplate()) return;\n    this.templateError.set(undefined);\n    this.downloadingTemplate.set(true);\n    try {\n      await this.#templates.download(this.#data.input);\n    } catch (e) {\n      this.templateError.set(messageOf(e, 'The template could not be created.'));\n    } finally {\n      this.downloadingTemplate.set(false);\n    }\n  }\n\n  /** Reads the picked file. The input is cleared so choosing the same file again re-fires. */\n  protected async onFileSelected(event: Event): Promise<void> {\n    const target = event.target instanceof HTMLInputElement ? event.target : null;\n    const file = target?.files?.[0];\n    if (target) target.value = '';\n    if (!file || this.busy()) return;\n    await this.#load(file);\n  }\n\n  /** Switches to another sheet of the loaded workbook and validates it. */\n  protected async chooseSheet(sheet: SpreadsheetSheet): Promise<void> {\n    if (this.busy() || sheet.name === this.activeSheet()) return;\n    await this.#useSheet(sheet);\n  }\n\n  /**\n   * Applies the user's pick for a choice cell whose text fits several options\n   * and re-checks that row alone. The pick goes into the row's raw data under\n   * the column's key — the whole cell of a single select, the one matching\n   * entry of a multi-select — so the re-run resolves it by stored value while\n   * every other row stands.\n   */\n  protected async pickOption(rowIndex: number, cell: ReviewCell, choice: ImportOptionChoice, event: Event): Promise<void> {\n    const select = event.target instanceof HTMLSelectElement ? event.target : null;\n    const candidate = select && select.value !== '' ? choice.candidates[Number(select.value)] : undefined;\n    const state = this.#states().find((s) => s.rowIndex === rowIndex);\n    if (!candidate || !state || this.rechecking().has(rowIndex)) return;\n\n    const child = (this.#data.input.formInputs ?? []).find((c) => c?.formControlName === cell.key);\n    const multi = !!child && isMultiSelectInput(child);\n    const row = applyOptionChoice(state.originalData, cell.key, choice.text, candidate.value, multi);\n\n    this.error.set(undefined);\n    this.rechecking.update((set) => new Set([...set, rowIndex]));\n    try {\n      await this.#importCtrl.rerunMultipleInputRow(rowIndex, row);\n    } catch (e) {\n      this.error.set(messageOf(e, 'The row could not be re-checked.'));\n    } finally {\n      this.rechecking.update((set) => {\n        const next = new Set(set);\n        next.delete(rowIndex);\n        return next;\n      });\n    }\n  }\n\n  protected cancel(): void {\n    if (this.busy()) return;\n    this.#dialogRef.close(undefined);\n  }\n\n  protected add(): void {\n    if (!this.canAdd()) return;\n    this.#dialogRef.close(this.#ready());\n  }\n\n  async #load(file: File): Promise<void> {\n    if (!isPlatformBrowser(this.#platformId)) return;\n    this.error.set(undefined);\n    this.mapping.set(undefined);\n    this.sheets.set([]);\n    this.activeSheet.set(undefined);\n    this.fileName.set(file.name);\n    this.stage.set('reading');\n\n    let sheets: readonly SpreadsheetSheet[];\n    try {\n      const data = await readAsArrayBuffer(file);\n      sheets = await this.#parser({ fileName: file.name, mimeType: file.type || '', data });\n    } catch (e) {\n      this.#fail(messageOf(e, 'Could not read the spreadsheet.'));\n      return;\n    }\n\n    const usable = (sheets ?? []).filter((sheet) => !!sheet && Array.isArray(sheet.rows));\n    if (usable.length === 0) {\n      this.#fail('The spreadsheet has no sheets.');\n      return;\n    }\n    this.sheets.set(usable);\n    await this.#useSheet(this.#preferredSheet(usable));\n  }\n\n  /**\n   * The sheet named after the field's `formControlName` when there is one —\n   * the template's data sheet, or a bulk-import template's detail sheet —\n   * otherwise the first.\n   */\n  #preferredSheet(sheets: readonly SpreadsheetSheet[]): SpreadsheetSheet {\n    const wanted = (this.#data.input.formControlName ?? '').trim().toLowerCase();\n    const first = sheets[0] as SpreadsheetSheet;\n    if (!wanted) return first;\n    return sheets.find((sheet) => sheet.name.trim().toLowerCase() === wanted) ?? first;\n  }\n\n  async #useSheet(sheet: SpreadsheetSheet): Promise<void> {\n    this.error.set(undefined);\n    this.activeSheet.set(sheet.name);\n    const mapping = mapSpreadsheetRows(this.columns, sheet.rows);\n    this.mapping.set(mapping);\n\n    if (mapping.rows.length === 0) {\n      this.#fail(\n        sheet.rows.length === 0\n          ? `\"${sheet.name}\" has no rows below its headers.`\n          : mapping.matched.length === 0\n            ? `No header in \"${sheet.name}\" matches a column of ${this.fieldLabel}.`\n            : `\"${sheet.name}\" has no rows with a value in a recognised column.`,\n      );\n      return;\n    }\n\n    this.stage.set('validating');\n    this.#importCtrl.reset();\n    try {\n      await this.#importCtrl.runMultipleInputImport(this.#data.input, mapping.rows);\n    } catch (e) {\n      this.#fail(messageOf(e, 'The rows could not be checked.'));\n      return;\n    }\n    this.stage.set('reviewed');\n  }\n\n  #fail(message: string): void {\n    this.error.set(message);\n    this.stage.set('idle');\n  }\n}\n\n/** Reads a file's bytes through `FileReader`, the API the rest of the library already relies on. */\nfunction readAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      const result = reader.result;\n      if (result instanceof ArrayBuffer) resolve(result);\n      else reject(new Error('Could not read the file.'));\n    };\n    reader.onerror = () => reject(reader.error ?? new Error('Could not read the file.'));\n    reader.readAsArrayBuffer(file);\n  });\n}\n\nfunction messageOf(error: unknown, fallback: string): string {\n  return error instanceof Error && error.message ? error.message : fallback;\n}\n\n/** `'required.min'` → `'Required, Too low'`. Unknown keys are shown as they are. */\nfunction formatErrorKeys(keys: string): string {\n  return keys\n    .split('.')\n    .filter(Boolean)\n    .map((key) => {\n      const [head, ...rest] = key.split(':');\n      const label = ERROR_LABELS[head ?? ''] ?? key;\n      return rest.length ? `${label} (${rest.join(':')})` : label;\n    })\n    .join(', ');\n}\n\nfunction cellFor(state: ImportRowState, column: ImportColumn): ReviewCell {\n  const base = { key: column.key, label: column.label };\n  const source = state.settledValue ?? state.originalData;\n  const text = formatCell(source?.[column.key]);\n  const choices = state.optionChoices?.[column.key];\n  if (choices?.length) {\n    // The tie itself is shown as the picker; only the cell's OTHER errors read as errors.\n    const others = (state.colErrors?.[column.key] ?? '')\n      .split('.')\n      .filter((key) => key && !key.startsWith(AMBIGUOUS_OPTION_KEY))\n      .join('.');\n    return { ...base, text, error: others ? formatErrorKeys(others) : undefined, choices: choices.map(tellApart) };\n  }\n  const errorKeys = state.colErrors?.[column.key];\n  return errorKeys ? { ...base, text, error: formatErrorKeys(errorKeys) } : { ...base, text };\n}\n\n/** `true` while a row waits on the user to settle a choice cell (its only route out of `invalid` is a pick). */\nfunction awaitsPick(state: ImportRowState): boolean {\n  return state.status === 'invalid' && Object.values(state.optionChoices ?? {}).some((choices) => choices.length > 0);\n}\n\n/**\n * Makes a choice's candidates tell apart in a picker: two candidates that read\n * the same (two options labelled \"Beta\") show their stored value as well.\n */\nfunction tellApart(choice: ImportOptionChoice): ImportOptionChoice {\n  const labels = choice.candidates.map((candidate) => normaliseOptionText(candidate.label));\n  return {\n    text: choice.text,\n    candidates: choice.candidates.map((candidate, index) => {\n      const clashes = labels.some((label, other) => other !== index && label === labels[index]);\n      const label = clashes ? `${candidate.label} (${String(candidate.value)})` : candidate.label;\n      return { value: candidate.value, label: label.length > MAX_CELL_TEXT ? `${label.slice(0, MAX_CELL_TEXT - 1)}…` : label };\n    }),\n  };\n}\n\nfunction formatCell(value: unknown): string {\n  if (value === null || value === undefined) return '';\n  let text: string;\n  if (value instanceof Date) {\n    text = Number.isNaN(value.getTime()) ? '' : value.toISOString().slice(0, 10);\n  } else if (typeof value === 'object') {\n    try {\n      text = JSON.stringify(value);\n    } catch {\n      text = '';\n    }\n  } else {\n    text = String(value);\n  }\n  return text.length > MAX_CELL_TEXT ? `${text.slice(0, MAX_CELL_TEXT - 1)}…` : text;\n}\n","<div mat-dialog-title class=\"mii__header\">\n  <span class=\"mii__title\">Import rows from a spreadsheet</span>\n  <span class=\"mii__subtitle\">\n    {{ fieldLabel }} · every row is checked the way the form checks it, and only rows that pass are added.\n  </span>\n</div>\n\n<mat-dialog-content class=\"mii__content\">\n  <!-- 1 · What the sheet should carry: the template when the host can write one, else the columns -->\n  @if (canDownloadTemplate) {\n    <section class=\"mii-section\" aria-labelledby=\"mii-template-label\">\n      <span class=\"mii-section__label\" id=\"mii-template-label\">Template</span>\n      <div class=\"mii-template\">\n        <div class=\"mii-template__text\">\n          <span class=\"mii-template__title\">Start from the template</span>\n          <span class=\"mii-template__hint\">\n            Its first sheet carries the headers to fill in; the {{ guideSheet }} sheet says what goes in each column.\n            Other columns are ignored.\n          </span>\n        </div>\n        <button\n          type=\"button\"\n          mat-stroked-button\n          class=\"mii-template__button\"\n          [disabled]=\"downloadingTemplate()\"\n          (click)=\"downloadTemplate()\"\n        >\n          <mat-icon aria-hidden=\"true\">download</mat-icon>\n          Download template\n        </button>\n      </div>\n      @if (templateError(); as message) {\n        <p class=\"mii-alert mii-alert--error mii-template__error\" role=\"alert\">\n          <mat-icon aria-hidden=\"true\">error</mat-icon>\n          <span>{{ message }}</span>\n        </p>\n      }\n    </section>\n  } @else {\n    <section class=\"mii-section\" aria-labelledby=\"mii-columns-label\">\n      <span class=\"mii-section__label\" id=\"mii-columns-label\">Columns</span>\n      <ul class=\"mii-columns\" aria-describedby=\"mii-columns-hint\">\n        @for (column of columns; track column.key) {\n          <li\n            class=\"mii-column\"\n            [class.mii-column--required]=\"column.required && column.importable\"\n            [class.mii-column--skipped]=\"!column.importable\"\n            [matTooltip]=\"columnTooltip(column)\"\n          >\n            <span class=\"mii-column__key\">{{ column.key }}</span>\n            @if (column.label !== column.key) {\n              <span class=\"mii-column__label\">{{ column.label }}</span>\n            }\n            @if (column.required && column.importable) {\n              <span class=\"mii-column__flag\">required</span>\n            } @else if (!column.importable) {\n              <span class=\"mii-column__flag\">not importable</span>\n            }\n          </li>\n        }\n      </ul>\n      <p class=\"mii-section__hint\" id=\"mii-columns-hint\">\n        Row 1 holds the headers. A header may be the column name above or the field's label; other columns are ignored.\n      </p>\n    </section>\n  }\n\n  <!-- 2 · The file -->\n  <section class=\"mii-section\" aria-labelledby=\"mii-file-label\">\n    <span class=\"mii-section__label\" id=\"mii-file-label\">Spreadsheet</span>\n\n    <label class=\"mii-pick\" [class.mii-pick--busy]=\"busy()\">\n      <mat-icon class=\"mii-pick__icon\" aria-hidden=\"true\">upload_file</mat-icon>\n      <span class=\"mii-pick__text\">\n        @if (fileName(); as name) {\n          <span class=\"mii-pick__name\">{{ name }}</span>\n          <span class=\"mii-pick__hint\">Choose another file to start over</span>\n        } @else {\n          <span class=\"mii-pick__name\">Choose a file</span>\n          <span class=\"mii-pick__hint\">A workbook or CSV, with the headers in row 1</span>\n        }\n      </span>\n      <input\n        type=\"file\"\n        class=\"mii-pick__input\"\n        [accept]=\"accept\"\n        [disabled]=\"busy()\"\n        (change)=\"onFileSelected($event)\"\n        aria-label=\"Choose a spreadsheet file\"\n      />\n    </label>\n\n    @if (sheets().length > 1) {\n      <div class=\"mii-sheets\" role=\"group\" aria-label=\"Sheet to import\">\n        <span class=\"mii-sheets__label\">Sheet</span>\n        @for (sheet of sheets(); track sheet.name) {\n          <button\n            type=\"button\"\n            class=\"mii-sheet\"\n            [class.mii-sheet--active]=\"sheet.name === activeSheet()\"\n            [attr.aria-pressed]=\"sheet.name === activeSheet()\"\n            [disabled]=\"busy()\"\n            (click)=\"chooseSheet(sheet)\"\n          >\n            {{ sheet.name }}\n          </button>\n        }\n      </div>\n    }\n\n    @if (error(); as message) {\n      <p class=\"mii-alert mii-alert--error\" role=\"alert\">\n        <mat-icon aria-hidden=\"true\">error</mat-icon>\n        <span>{{ message }}</span>\n      </p>\n    }\n\n    @if (mapping(); as m) {\n      @if (m.missingRequired.length > 0) {\n        <p class=\"mii-alert mii-alert--warn\" role=\"status\">\n          <mat-icon aria-hidden=\"true\">warning</mat-icon>\n          <span>\n            No column for the required {{ m.missingRequired.length === 1 ? 'field' : 'fields' }}\n            {{ m.missingRequired.join(', ') }}. Rows will not pass until the sheet carries\n            {{ m.missingRequired.length === 1 ? 'it' : 'them' }}.\n          </span>\n        </p>\n      }\n      @if (m.ignored.length > 0) {\n        <p class=\"mii-note\" role=\"status\">\n          Ignored {{ m.ignored.length === 1 ? 'column' : 'columns' }}: {{ m.ignored.join(', ') }}\n        </p>\n      }\n    }\n  </section>\n\n  <!-- 3 · Review -->\n  @if (stage() === 'validating' || stage() === 'reviewed') {\n    <section class=\"mii-section\" aria-labelledby=\"mii-review-label\">\n      <span class=\"mii-section__label\" id=\"mii-review-label\">Review</span>\n\n      @if (stage() === 'validating') {\n        <mat-progress-bar\n          class=\"mii-progress\"\n          mode=\"determinate\"\n          [value]=\"progressPct()\"\n          aria-label=\"Validation progress\"\n        />\n      }\n      <p class=\"mii-summary\" role=\"status\" aria-live=\"polite\">{{ summary() }}</p>\n\n      <div class=\"mii-scroll\">\n        <table class=\"mii-table\">\n          <thead>\n            <tr>\n              <th scope=\"col\" class=\"mii-th mii-th--index\">\n                <span aria-hidden=\"true\">#</span>\n                <span class=\"mii-sr-only\">Row</span>\n              </th>\n              <th scope=\"col\" class=\"mii-th\">Status</th>\n              @for (column of reviewColumns(); track column.key) {\n                <th scope=\"col\" class=\"mii-th\">{{ column.label }}</th>\n              }\n            </tr>\n          </thead>\n          <tbody>\n            @for (row of reviewRows(); track row.index) {\n              <tr\n                class=\"mii-row\"\n                [class.mii-row--held]=\"row.status === 'invalid' || row.status === 'error' || row.status === 'overridable' || row.status === 'duplicate'\"\n              >\n                <td class=\"mii-td mii-td--index\">{{ row.index + 1 }}</td>\n                <td class=\"mii-td\">\n                  <span class=\"mii-status\" [attr.data-status]=\"row.status\">\n                    <mat-icon aria-hidden=\"true\">{{ row.icon }}</mat-icon>\n                    <span>{{ row.label }}</span>\n                  </span>\n                </td>\n                @for (cell of row.cells; track cell.key) {\n                  <td class=\"mii-td\" [class.mii-td--error]=\"!!cell.error\" [class.mii-td--choice]=\"!!cell.choices\">\n                    @if (cell.choices; as choices) {\n                      <!--\n                        The text fits several options. The pick is the whole\n                        cell of a single select, or the one matching entry of a\n                        multi-select; the row is re-checked as soon as it lands.\n                      -->\n                      <div class=\"mii-choice\" role=\"group\" [attr.aria-label]=\"'Pick a match for ' + cell.label\">\n                        @for (choice of choices; track choice.text) {\n                          <label class=\"mii-choice__item\">\n                            <span class=\"mii-choice__text\">“{{ choice.text }}”</span>\n                            <span class=\"mii-choice__field\">\n                              <select\n                                class=\"mii-choice__select\"\n                                [disabled]=\"rechecking().has(row.index)\"\n                                (change)=\"pickOption(row.index, cell, choice, $event)\"\n                              >\n                                <option value=\"\" selected disabled>{{ choice.candidates.length }} matches — pick one</option>\n                                @for (candidate of choice.candidates; track $index) {\n                                  <option [value]=\"$index\">{{ candidate.label }}</option>\n                                }\n                              </select>\n                              <mat-icon class=\"mii-choice__chevron\" aria-hidden=\"true\">expand_more</mat-icon>\n                            </span>\n                          </label>\n                        }\n                      </div>\n                    }\n                    @if (cell.error) {\n                      <span class=\"mii-cell-error\" [matTooltip]=\"cell.text ? 'Value: ' + cell.text : ''\">\n                        <mat-icon aria-hidden=\"true\">error</mat-icon>\n                        <span>{{ cell.error }}</span>\n                      </span>\n                    } @else if (!cell.choices) {\n                      <span class=\"mii-cell\" [attr.title]=\"cell.text\">{{ cell.text }}</span>\n                    }\n                  </td>\n                }\n              </tr>\n              @if (row.message) {\n                <tr class=\"mii-row-detail\">\n                  <td class=\"mii-td mii-td--detail\" [attr.colspan]=\"reviewColumns().length + 2\">\n                    {{ row.message }}\n                  </td>\n                </tr>\n              }\n            }\n          </tbody>\n        </table>\n      </div>\n    </section>\n  }\n</mat-dialog-content>\n\n<mat-dialog-actions class=\"mii__actions\">\n  <button type=\"button\" mat-button class=\"mii__cancel\" [disabled]=\"busy()\" (click)=\"cancel()\">Cancel</button>\n  <button\n    type=\"button\"\n    mat-flat-button\n    color=\"primary\"\n    class=\"mii__add\"\n    [disabled]=\"!canAdd()\"\n    (click)=\"add()\"\n  >\n    {{ addLabel() }}\n  </button>\n</mat-dialog-actions>\n","import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  DestroyRef,\r\n  ElementRef,\r\n  ErrorHandler,\r\n  ViewEncapsulation,\r\n  inject,\r\n  input,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormGroup, NgControl } from '@angular/forms';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\n\r\nimport { IMultiple, IMultipleInputCal, ITowerStepColumn, MultipleInputAvailableOperations } from 'ngx-t-forms-types';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\n\r\nimport { MultipleInputTableViewComponent } from '../multiple-input-table-view/multiple-input-table-view.component';\r\nimport { MultipleInputTableEditComponent } from '../multiple-input-table-edit/multiple-input-table-edit.component';\r\n\r\nimport { FormBuilderFunctions } from 'ngx-t-forms-types';\r\nimport { getCaluculatedTableData } from '../../functions/getListCalculated';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { CdkDragDrop } from '@angular/cdk/drag-drop';\r\n\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { SPREADSHEET_PARSER } from '../../../../../../tokens/spreadsheet-parser.token';\r\nimport {\r\n  MultipleInputImportDialogComponent,\r\n  type MultipleInputImportDialogData,\r\n  type MultipleInputImportDialogResult,\r\n} from '../multiple-input-import-dialog/multiple-input-import-dialog.component';\r\nimport { coerceImportedRow, toMultipleInputRow } from '../../functions/spreadsheetImport';\r\nimport { SpreadsheetTemplateService } from '../spreadsheet-template/spreadsheet-template.service';\r\n\r\n/**\r\n * A single row inside a multiple-input table. Keys are dynamic — composed from the input\r\n * config id plus child input ids — so values are typed as `unknown`. Narrow at access sites.\r\n */\r\ntype MultipleInputRow = Record<string, unknown> & { id?: string };\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n  controlType: 'app-multiple-input-table',\r\n  nextId: 0,\r\n};\r\n\r\n@Component({\r\n  selector: 'lib-multiple-input-table',\r\n  templateUrl: './multiple-input-table.component.html',\r\n  styleUrls: ['./multiple-input-table.component.css'],\r\n  imports: [\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatMenuModule,\r\n    MultipleInputTableEditComponent,\r\n    MultipleInputTableViewComponent,\r\n  ],\r\n  providers: [{ provide: MatFormFieldControl, useExisting: MultipleInputTableComponent }],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class MultipleInputTableComponent extends BaseCustomInput<MultipleInputRow[] | null> {\r\n  readonly editorMode = input<boolean>(false);\r\n  readonly formGroup = input.required<FormGroup>();\r\n  readonly inputConfig = input.required<ITowerStepColumn>();\r\n  readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n\r\n  readonly #destroyRef = inject(DestroyRef);\r\n  readonly #dialog = inject(MatDialog);\r\n  /** The host's spreadsheet parser, when it opted in through `withSpreadsheetImport()`. */\r\n  readonly #spreadsheetParser = inject(SPREADSHEET_PARSER, { optional: true });\r\n  readonly #templates = inject(SpreadsheetTemplateService);\r\n  readonly #errorHandler = inject(ErrorHandler);\r\n\r\n  constructor() {\r\n    super(\r\n      inject(NgControl, { self: true, optional: true })!,\r\n      inject<ElementRef<HTMLElement>>(ElementRef),\r\n      customInputConfig,\r\n    );\r\n    this.listenToValueChanges();\r\n  }\r\n\r\n  /**\r\n   * Manages custom validation errors on the form control.\r\n   * Intended to be called from the ngDoCheck lifecycle hook.\r\n   * This function handles both the 'required' error and the new\r\n   * 'multipleInputListMissingSomeFields' custom error.\r\n   */\r\n  override checkValidationsAnErrors() {\r\n    const control = this.ngControl?.control;\r\n\r\n    // 1. Early exit if there's no form control to work with.\r\n    if (!control) {\r\n      return;\r\n    }\r\n\r\n    // --- DEFINE THE DESIRED ERROR STATE ---\r\n\r\n    // 2. Determine if the custom \"multiple fields\" error should exist.\r\n    const missingFields = this.#missingRequiredFields();\r\n\r\n    // 3. Determine if the standard 'required' error should exist.\r\n    const shouldHaveRequiredError = this.required && this._isNilOrEmpty(this.value);\r\n\r\n\r\n    // --- APPLY THE ERROR STATE TO THE CONTROL ---\r\n\r\n    // 4. Preserve other errors that might be on the control (e.g., minlength, pattern).\r\n    const newErrors = { ...control.errors };\r\n    delete newErrors['required'];\r\n    delete newErrors['multipleInputListMissingSomeFields'];\r\n\r\n\r\n    // 5. Add our managed errors back if their conditions are met.\r\n    if (shouldHaveRequiredError) {\r\n      newErrors['required'] = true;\r\n    }\r\n    if (missingFields.length > 0) {\r\n      // `missing` names the offending rows/fields so the rendered message can\r\n      // tell the user exactly what to fix — see inputErrorMessage.ts.\r\n      newErrors['multipleInputListMissingSomeFields'] = { value: true, missing: missingFields };\r\n    }\r\n\r\n    // 6. Finalize the error object. If no errors, it must be null.\r\n    const finalErrors = Object.keys(newErrors).length > 0 ? newErrors : null;\r\n\r\n    // 7. IMPORTANT: Only update the control if the errors have actually changed.\r\n    // This prevents infinite loops within ngDoCheck. A simple stringify is a\r\n    // dependency-free way to compare the error objects.\r\n    if (JSON.stringify(control.errors) !== JSON.stringify(finalErrors)) {\r\n      control.setErrors(finalErrors);\r\n    }\r\n  }\r\n\r\n\r\n  override get empty() {\r\n    return !this.value;\r\n  }\r\n\r\n  override get shouldLabelFloat() {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  override get errorState(): boolean {\r\n    // 1. Check for standard validation errors from Angular's Forms API.\r\n    const hasStandardError = !!this.ngControl?.errors;\r\n\r\n    // 2. Check for custom validation errors specific to 'IMultiple' type.\r\n    const hasCustomError = this.#missingRequiredFields().length > 0;\r\n\r\n    // 3. The final error state is true if *any* validation fails,\r\n    //    AND the control has been \"touched\" by the user.\r\n    return (hasStandardError || hasCustomError) && this.touched;\r\n  }\r\n\r\n  private _isNilOrEmpty(value: unknown): boolean {\r\n    return value === null || value === undefined || value === '';\r\n  }\r\n\r\n  /**\r\n   * Rows (1-based, in value order) whose required child inputs are empty,\r\n   * each with the labels of the inputs still missing. Drives both `errorState`\r\n   * and the `multipleInputListMissingSomeFields` error payload.\r\n   */\r\n  #missingRequiredFields(): Array<{ row: number; fields: string[] }> {\r\n    const formInputs = (this.inputConfig() as IMultiple)?.formInputs;\r\n    if (!Array.isArray(formInputs) || !Array.isArray(this.value)) return [];\r\n\r\n    const requiredFields = formInputs.filter(i => i.required);\r\n    if (requiredFields.length === 0) return [];\r\n\r\n    const configId = this.inputConfig().id;\r\n    const missing: Array<{ row: number; fields: string[] }> = [];\r\n    this.value.forEach((item, index) => {\r\n      const fields = requiredFields\r\n        .filter(f => this._isNilOrEmpty(item?.[`${configId}.${f.id}`]))\r\n        .map(f => f.label || f.id);\r\n      if (fields.length > 0) {\r\n        missing.push({ row: index + 1, fields });\r\n      }\r\n    });\r\n    return missing;\r\n  }\r\n\r\n\r\n  /// En of implementations of MatFormFieldControl\r\n  applyOptionsTo: MultipleInputRow | undefined;\r\n  dataSource!: MatTableDataSource<MultipleInputRow>;\r\n\r\n  listenToValueChanges(): void {\r\n    this.stateChanges\r\n      .pipe(takeUntilDestroyed(this.#destroyRef))\r\n      .subscribe(() => {\r\n        this.checkItemList();\r\n      });\r\n  }\r\n\r\n  checkItemList(): boolean {\r\n    try {\r\n      if (this.value) {\r\n        const config = this.inputConfig();\r\n        const TableData: MultipleInputRow[] = ((config as IMultiple).groupBy?.length ?? 0) > 0\r\n          ? addGroups(\r\n              this.value,\r\n              (config as IMultiple).groupBy,\r\n            )\r\n          : this.value;\r\n        const data = getCaluculatedTableData(config, TableData) as MultipleInputRow[];\r\n\r\n        if (!this.dataSource) {\r\n          this.dataSource = new MatTableDataSource<MultipleInputRow>(data);\r\n          this.dataSource;\r\n        } else {\r\n          this.dataSource.data = data;\r\n        }\r\n      }\r\n      return true;\r\n    } catch {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  multipleInputRemoveItem(item: MultipleInputRow | undefined): void {\r\n    if (!item) return;\r\n    if (!this.value) return;\r\n    this.value = this.value.filter((i) => !_isEqual(i, item));\r\n\r\n    this.applyOptionsTo = undefined;\r\n    this.onChange(this.value);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n\r\n  generateMultipleInputForm(): void {\r\n    const id = this.inputConfig()?.id;\r\n    if (!id) return;\r\n    this.formBuilderFunctions()?.multipleInputToggleForm(id, true);\r\n  }\r\n\r\n  rowInViewOnly: string | undefined = undefined;\r\n\r\n  editRow(rowId: string): void {\r\n    if (!rowId) {\r\n      throw new Error('Row id not provided');\r\n    }\r\n\r\n    const config = this.inputConfig();\r\n    const fbf = this.formBuilderFunctions();\r\n    if (!fbf || !config) return;\r\n\r\n    fbf.multipleInputEditRow(config.id, rowId);\r\n\r\n    // if( !this.inputConfig?.multipleInputController){\r\n    //     return\r\n    // }\r\n    //   this.inputConfig.multipleInputInEditId = this.applyOptionsTo.id;\r\n    // this.inputConfig.applyMultipleInputValuesToForm(\r\n    //   this.applyOptionsTo\r\n    // );\r\n  }\r\n\r\n  copy(rowId: string): void {\r\n    const config = this.inputConfig();\r\n    const fbf = this.formBuilderFunctions();\r\n    if (!fbf || !config) return;\r\n    fbf.multipleInputDuplicateRow(config.id, rowId);\r\n    // this.generateMultipleInputForm();\r\n    // this.inputConfig?.applyMultipleInputValuesToForm(\r\n    //   this.applyOptionsTo\r\n    // );\r\n    // this.applyOptionsTo = undefined;\r\n  }\r\n\r\n  protected get handleLabel(): string | undefined {\r\n    return (this.inputConfig() as IMultiple)?.handleLabel;\r\n  }\r\n\r\n  handleIcon(): string {\r\n    // NOTE(phase-4): `handleIcon` is declared on `IBasicFormInput` but not on `IMultiple` directly;\r\n    // narrow through `ITowerStepColumn` (which extends FormColumnInputs) and provide a string fallback.\r\n    const cfg = this.inputConfig() as ITowerStepColumn & { handleIcon?: string };\r\n    return cfg?.handleIcon || 'add';\r\n  }\r\n\r\n  saveMultipleInputForm(): void {\r\n    this.formBuilderFunctions()?.multipleInputSaveForm(this.inputConfig().id);\r\n\r\n    //  const value: any = this.inputConfig?.multipleInputFormValue();\r\n\r\n    // value['id'] = uuidv4();\r\n\r\n    // if (!this.inputConfig) {\r\n    //   return\r\n    // }\r\n\r\n    //   const previousValue = this.value\r\n    //   if (!previousValue) {\r\n    //     this.value = [value];\r\n    //     this.inputConfig.multipleInputController = undefined;\r\n\r\n    //   } else {\r\n    //     if (this.inputConfig?.multipleInputInEditId) {\r\n    //       let inEdit = previousValue.find(\r\n    //         (i: { id: any }) =>\r\n    //           i.id === this.inputConfig?.multipleInputInEditId\r\n    //       );\r\n    //       Object.keys(inEdit).every((s) => {\r\n    //         s;\r\n    //         inEdit[s] = value[s];\r\n    //         return !!inEdit[s];\r\n    //       });\r\n\r\n    //        this.value =  [...previousValue],\r\n    //       this.inputConfig.multipleInputController = undefined;\r\n\r\n    //     } else {\r\n\r\n\r\n    //       this.value = [...previousValue, value];\r\n    //       this.inputConfig.multipleInputController = undefined;\r\n\r\n    //     }\r\n    //   }\r\n    //   this.onChange(this.value);\r\n    //   this.stateChanges.next();\r\n    //   this.checkItemList(this.value || []);\r\n    //   return\r\n\r\n\r\n  }\r\n\r\n  editInput(input: ITowerStepColumn): void {\r\n    const fbf = this.formBuilderFunctions();\r\n    if (typeof fbf?.editInput !== 'function') {\r\n      throw new Error('editInput function not defined in formBuilderFunctions');\r\n    }\r\n    fbf.editInput(input);\r\n  }\r\n\r\n  deleteItemInput(input: ITowerStepColumn): void {\r\n    this.formBuilderFunctions()?.deleteInput(input);\r\n  }\r\n\r\n  showItemAsLabel(input: ITowerStepColumn): void {\r\n    this.formBuilderFunctions()?.multipleInputToggleLabel(input);\r\n  }\r\n\r\n  addFunction(func: IMultipleInputCal): void {\r\n    this.formBuilderFunctions()?.addFunction(func, this.inputConfig()?.id);\r\n  }\r\n\r\n  // `FormBuilderFunctions.reorderItems` is now generic over the row shape; the\r\n  // container/data slots stay `unknown` (opaque drag payload).\r\n  reorderItems(event: CdkDragDrop<ITowerStepColumn[], unknown, unknown>): void {\r\n    const config = this.inputConfig();\r\n    const fbf = this.formBuilderFunctions();\r\n    if (!fbf || !config) return;\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Phase-4 TODO: deduplicate @angular/cdk peer dep in typings package; CdkDragDrop types are nominally distinct across copies.\r\n    (fbf.reorderItems as any)(event, config.id);\r\n  }\r\n\r\n  /**\r\n   * Whether the add button carries its menu (with \"Import from spreadsheet\"):\r\n   * the host bound a parser and the field allows adding rows. The template\r\n   * additionally hides the whole add-row bar for readonly / disabled /\r\n   * open-form fields.\r\n   */\r\n  protected get canImportRows(): boolean {\r\n    return this.#spreadsheetParser !== null && this.canAddRecords;\r\n  }\r\n\r\n  /**\r\n   * Whether the menu also offers \"Download import template\": the host bound a\r\n   * writer beside its parser. Never true without the import itself.\r\n   */\r\n  protected get canDownloadTemplate(): boolean {\r\n    return this.canImportRows && this.#templates.available;\r\n  }\r\n\r\n  /**\r\n   * Downloads the import template for this field: a workbook with the headers\r\n   * the import matches and a guide to each column. The writer's failure, if\r\n   * any, goes to the app's `ErrorHandler` — the menu has no surface of its own.\r\n   */\r\n  downloadImportTemplate(): void {\r\n    const config = this.inputConfig();\r\n    if (!this.canDownloadTemplate || !config) return;\r\n    void this.#templates.download(config).catch((error: unknown) => this.#errorHandler.handleError(error));\r\n  }\r\n\r\n  /**\r\n   * Opens the spreadsheet import for this field and appends the rows that\r\n   * validate. Each row is checked by the same per-row tower the bulk import\r\n   * uses for this field's sub-rows; only rows that settle valid come back.\r\n   */\r\n  importRowsFromSpreadsheet(): void {\r\n    const config = this.inputConfig();\r\n    if (!this.canImportRows || !config) return;\r\n\r\n    this.#dialog\r\n      .open<MultipleInputImportDialogComponent, MultipleInputImportDialogData, MultipleInputImportDialogResult>(\r\n        MultipleInputImportDialogComponent,\r\n        {\r\n          data: { input: config, existingRowCount: this.value?.length ?? 0 },\r\n          width: 'min(72rem, 94vw)',\r\n          maxWidth: '94vw',\r\n          maxHeight: '90vh',\r\n          autoFocus: 'first-tabbable',\r\n          restoreFocus: true,\r\n          // The dialog owns its own close paths; a stray Escape mid-validation\r\n          // must not orphan a running session.\r\n          disableClose: true,\r\n          panelClass: 'lib-multiple-input-import-dialog__panel',\r\n        },\r\n      )\r\n      .afterClosed()\r\n      .pipe(takeUntilDestroyed(this.#destroyRef))\r\n      .subscribe((rows) => this.#appendImportedRows(rows));\r\n  }\r\n\r\n  /**\r\n   * Appends settled rows (keyed by child `formControlName`) to the value in the\r\n   * composite shape the table stores, cells coerced to the child's data type.\r\n   * Goes through the same value path as delete, so the tower sees one change.\r\n   */\r\n  #appendImportedRows(rows: MultipleInputImportDialogResult): void {\r\n    if (!rows?.length) return;\r\n    const config = this.inputConfig();\r\n    const converted: MultipleInputRow[] = rows.map((row) =>\r\n      toMultipleInputRow(config, coerceImportedRow(config, row)),\r\n    );\r\n    this.value = [...(this.value ?? []), ...converted];\r\n    this.markAsTouched();\r\n  }\r\n\r\n  protected get parentFormGroup(): FormGroup | null {\r\n    return this.ngControl?.control?.parent as FormGroup;\r\n  }\r\n\r\n  protected get canAddRecords() {\r\n    const config = this.inputConfig();\r\n    if (!config) return false;\r\n    //NOTE: Temporary backward compatibility for older versions of the config that might not have the new property\r\n    if (!config.multipleInputAvailableOperations) return true;\r\n    return config.multipleInputAvailableOperations?.includes(MultipleInputAvailableOperations.Add);\r\n  }\r\n}\r\n\r\n\r\n\r\nfunction addGroups(tableValue: MultipleInputRow[], groupBy: string[] | undefined): MultipleInputRow[] {\r\n  throw new Error('Function not implemented.');\r\n}\r\n","<lib-multiple-input-table-view\n  [inputConfig]=\"inputConfig()\"\n  [dataSource]=\"dataSource\"\n  [applyOptionsTo]=\"applyOptionsTo\"\n  [formGroup]=\"parentFormGroup\"\n  (onEditItem)=\"editRow($event)\"\n  (showItemAsLabel)=\"showItemAsLabel(inputConfig())\"\n  (onDeleteItem)=\"multipleInputRemoveItem(applyOptionsTo)\"\n  (onCopy)=\"copy($event)\"\n  (onApplyOptionsTo)=\"applyOptionsTo = $event\"\n></lib-multiple-input-table-view>\n\n@if (!!inputConfig().formIsOpen || !!rowInViewOnly) {\n  <lib-multiple-input-table-edit\n    [editorMode]=\"editorMode()\"\n    (editMultipleInput)=\"editInput($event)\"\n    (deleteInput)=\"deleteItemInput($event)\"\n    (addFunction)=\"addFunction($event)\"\n    (showItemAsLabel)=\"showItemAsLabel($event)\"\n    (onSaveMultipleInputForm)=\"saveMultipleInputForm()\"\n    (reorderItems)=\"reorderItems($event)\"\n    [formBuilderFunctions]=\"formBuilderFunctions()\"\n    [formGroup]=\"parentFormGroup\"\n    [inputConfig]=\"inputConfig()\"\n  ></lib-multiple-input-table-edit>\n}\n\n@if (!inputConfig().readonly && !inputConfig().disabled && !inputConfig().formIsOpen && canAddRecords) {\n  <section class=\"add-row-bar\">\n    <!--\n      One dashed pill. The add button is the everyday action; once the host has\n      bound a spreadsheet parser a narrow chevron segment joins it, opening the\n      menu of other ways to add rows. Without a parser the pill is exactly the\n      add button it always was.\n    -->\n    <div class=\"add-row-group\" [class.add-row-group--split]=\"canImportRows\">\n      <button class=\"add-row-button\" (click)=\"generateMultipleInputForm()\" mat-stroked-button>\n        <mat-icon class=\"add-row-icon\">{{ handleIcon() }}</mat-icon>\n        <span class=\"add-row-label\">{{ handleLabel }}</span>\n      </button>\n      @if (canImportRows) {\n        <button\n          type=\"button\"\n          class=\"add-row-more\"\n          mat-stroked-button\n          aria-label=\"More ways to add rows\"\n          [attr.aria-expanded]=\"addRowMenuTrigger.menuOpen\"\n          [matMenuTriggerFor]=\"addRowMenu\"\n          #addRowMenuTrigger=\"matMenuTrigger\"\n        >\n          <mat-icon class=\"add-row-more-icon\">arrow_drop_down</mat-icon>\n        </button>\n      }\n    </div>\n  </section>\n}\n\n<mat-menu #addRowMenu=\"matMenu\">\n  <ng-template matMenuContent>\n    <button\n      type=\"button\"\n      mat-menu-item\n      class=\"add-row-menu-item add-row-menu-item--import\"\n      (click)=\"importRowsFromSpreadsheet()\"\n    >\n      <mat-icon>upload_file</mat-icon>\n      <div class=\"add-row-menu__text\">\n        <div class=\"add-row-menu__main\">Import from spreadsheet</div>\n        <div class=\"add-row-menu__sub\">Check the rows of a workbook and add the ones that pass</div>\n      </div>\n    </button>\n    @if (canDownloadTemplate) {\n      <button\n        type=\"button\"\n        mat-menu-item\n        class=\"add-row-menu-item add-row-menu-item--template\"\n        (click)=\"downloadImportTemplate()\"\n      >\n        <mat-icon>download</mat-icon>\n        <div class=\"add-row-menu__text\">\n          <div class=\"add-row-menu__main\">Download import template</div>\n          <div class=\"add-row-menu__sub\">A workbook with the headers to fill in and a guide to each column</div>\n        </div>\n      </button>\n    }\n  </ng-template>\n</mat-menu>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { FormBuilderFunctions, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { MultipleInputTableComponent } from './core/multiple-input-table/multiple-input-table.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n/** Wraps a multi-row input table inside a `mat-form-field`. */\r\n@Component({\r\n  selector: 'lib-multiple-input-input-element',\r\n  templateUrl: './multiple-input-input-element.component.html',\r\n  styleUrl: './multiple-input-input-element.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatButtonModule,\r\n    MatTooltipModule,\r\n    TFormInputStatusComponent,\r\n    MultipleInputTableComponent,\r\n  ],\r\n})\r\nexport class MultipleInputInputElementComponent {\r\n  readonly inputConfig = input.required<ITowerStepColumn>();\r\n  readonly formGroup = input.required<FormGroup>();\r\n  readonly editorMode = input<boolean>(false);\r\n  readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n  readonly reload = output<void>();\r\n\r\n  protected readonly errorMessage = computed(() =>\r\n    getInputErrorMessage(this.inputConfig(), this.formGroup()),\r\n  );\r\n}\r\n","<form [formGroup]=\"formGroup()\">\r\n  @if (inputConfig(); as inputConfig) {\r\n    <mat-form-field\r\n      class=\"multiple-input-field\"\r\n      [appearance]=\"inputConfig.appearance || 'fill'\"\r\n      subscriptSizing=\"dynamic\"\r\n      floatLabel=\"always\"\r\n    >\r\n      <mat-label>\r\n        {{ inputConfig.label }}\r\n        <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\r\n      </mat-label>\r\n\r\n      @if (inputConfig.id) {\r\n        <lib-multiple-input-table\r\n          [editorMode]=\"editorMode()\"\r\n          [required]=\"inputConfig.required\"\r\n          [formGroup]=\"formGroup()\"\r\n          [formBuilderFunctions]=\"formBuilderFunctions()\"\r\n          [formControlName]=\"inputConfig.id\"\r\n          [inputConfig]=\"inputConfig\"\r\n        ></lib-multiple-input-table>\r\n      }\r\n\r\n      @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\r\n        <mat-hint class=\"inputHint\">\r\n          {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\r\n        </mat-hint>\r\n      }\r\n\r\n      @if (!!errorMessage()) {\r\n        <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\r\n      }\r\n\r\n      @if (inputConfig.prefixIcon) {\r\n        <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n      }\r\n\r\n      @if (inputConfig.suffixIcon && inputConfig.id !== 'password') {\r\n        <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\r\n      }\r\n\r\n      @if (inputConfig.prefixText) {\r\n        <span class=\"affix-text\" matPrefix>{{ inputConfig.prefixText }}</span>\r\n      }\r\n      @if (inputConfig.suffixText) {\r\n        <span class=\"affix-text affix-text--suffix\" matSuffix>{{ inputConfig.suffixText }}</span>\r\n      }\r\n\r\n      @if (inputConfig.maxLength && formGroup()) {\r\n        <mat-hint align=\"end\">\r\n          {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\r\n        </mat-hint>\r\n      }\r\n    </mat-form-field>\r\n  }\r\n</form>\r\n"],"names":["i1","i2","i3","i4","i5","i6","i7","i8","i9","uuidv4"],"mappings":"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"}