{"version":3,"file":"ngx-t-forms-mscoa-config.component-BqgTVHRS.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-config/mscoa-config.logic.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-config/mscoa-config-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-config/mscoa-config-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-config/mscoa-config.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-config/mscoa-config.component.html"],"sourcesContent":["import { MSCOA_ACCOUNT_VALUE_LABEL_OPTIONS } from 'ngx-t-forms-types';\nimport type {\n  DualCashExclusionMatchMode,\n  IDualCashExclusionRule,\n  IIncludedSegmentConfig,\n  IScoaInputConfig,\n} from 'ngx-t-forms-types';\n\n/**\n * Pure derivations shared by the inline MSCOA summary (`MscoaConfigComponent`)\n * and the guided setup dialog (`MscoaConfigDialogComponent`), so the two\n * surfaces can never disagree about what a configuration contains or what it\n * will ask the user for.\n *\n * Mirrors `api-endpoint-config.logic.ts`, which plays the same role for the\n * centralised API endpoint editor.\n */\n\n/** The accounting bases an MSCOA input can capture. */\nexport type BasisKey = 'accrual' | 'cash' | 'dual';\n\n/** One entry in the readiness rail. */\nexport interface ReadinessItem {\n  readonly label: string;\n  readonly state: 'done' | 'pending' | 'skip';\n}\n\n/** Human copy for each basis, and what it means for the person filling the form. */\nexport const BASIS_OPTIONS: ReadonlyArray<{\n  readonly value: BasisKey;\n  readonly label: string;\n  readonly detail: string;\n}> = [\n  {\n    value: 'accrual',\n    label: 'Performance (Accrual)',\n    detail: 'Budget moves on commitments and invoices. One set of accounts.',\n  },\n  {\n    value: 'cash',\n    label: 'Liquidity (Cash)',\n    detail: 'Budget moves only on actual bank movements. One set of accounts.',\n  },\n  {\n    value: 'dual',\n    label: 'Dual (Both)',\n    detail: 'Captures both bases for full reporting. Two sets of accounts.',\n  },\n];\n\n/** Token colour per basis (dark-mode safe; never a hex literal). */\nexport const BASIS_COLOR: Readonly<Record<BasisKey, string>> = {\n  accrual: 'var(--sem-blue)',\n  cash: 'var(--sem-emerald)',\n  dual: 'var(--sem-premium)',\n};\n\n/** Short badge copy per basis. */\nexport const BASIS_BADGE: Readonly<Record<BasisKey, string>> = {\n  accrual: 'ACCRUAL',\n  cash: 'CASH',\n  dual: 'DUAL',\n};\n\n/**\n * The configured basis, normalised. `undefined` when nothing has been chosen —\n * the state the setup dialog treats as \"not started\".\n */\nexport function basisOf(config: IScoaInputConfig | undefined): BasisKey | undefined {\n  const raw = ((config?.accountingBasis as string) ?? '').toString().toLowerCase();\n  return raw === 'dual' || raw === 'cash' || raw === 'accrual' ? raw : undefined;\n}\n\n/** Token colour for a config's basis badge; `currentColor` when unset. */\nexport function basisColorOf(config: IScoaInputConfig | undefined): string {\n  const basis = basisOf(config);\n  return basis ? BASIS_COLOR[basis] : 'currentColor';\n}\n\n/** Whether this basis captures cash accounts. */\nexport function usesCash(basis: BasisKey | undefined): boolean {\n  return basis === 'cash' || basis === 'dual';\n}\n\n/** Configured accrual segments, empty when none. */\nexport function segmentsOf(config: IScoaInputConfig | undefined): IIncludedSegmentConfig[] {\n  return config?.segments ?? [];\n}\n\n/** Configured cash segments, empty when none. */\nexport function cashSegmentsOf(config: IScoaInputConfig | undefined): IIncludedSegmentConfig[] {\n  return config?.cashSegments ?? [];\n}\n\n/** Cash-exclusion rules that carry a usable pattern (blank ones never evaluate). */\nexport function usableRulesOf(config: IScoaInputConfig | undefined): IDualCashExclusionRule[] {\n  return (config?.dualCashExclusion?.rules ?? []).filter(\n    (rule): rule is IDualCashExclusionRule =>\n      !!rule && typeof rule.pattern === 'string' && rule.pattern.trim().length > 0,\n  );\n}\n\n/** How the cash-exclusion rules combine; \"any\" unless explicitly set to \"all\". */\nexport function matchModeOf(config: IScoaInputConfig | undefined): DualCashExclusionMatchMode {\n  return config?.dualCashExclusion?.matchMode === 'all' ? 'all' : 'any';\n}\n\n/**\n * The scope key a segment's selected accounts are stored under. Mirrors\n * `setSegmentAccount` and `isDualCashExcluded`, both of which upper-case\n * `customSegment || segment`.\n */\nfunction segmentKeyOf(segment: { segment?: string; customSegment?: string }): string {\n  return (segment.customSegment || segment.segment || '').trim().toUpperCase();\n}\n\n/**\n * Options for a cash-exclusion rule's \"Limit to segment\" picker: the no-scope\n * default, then every configured accrual segment, then any scope a saved rule\n * still references that the input no longer declares.\n *\n * The option VALUE is the scope key the runtime evaluator compares against, so\n * a scope that can never match is not selectable in the first place.\n *\n * Stale scopes stay listed on purpose. A chip whose value is absent from the\n * option list renders as nothing selected, so dropping them would hide a saved\n * (and now permanently non-matching) scope behind an apparently empty field.\n *\n * A scope saved in a different case than the configured key does not render as\n * selected; picking the segment again re-stores it in canonical case. The\n * evaluator matches case-insensitively either way, so behaviour is unchanged.\n *\n * @param config - The MSCOA configuration being edited.\n * @returns The option list, always led by the no-scope default.\n */\nexport function segmentScopeOptions(\n  config: IScoaInputConfig | undefined,\n): Array<{ label: string; value: string }> {\n  const configured = new Map<string, string>();\n  for (const segment of config?.segments ?? []) {\n    const key = segmentKeyOf(segment ?? {});\n    if (!key || configured.has(key)) continue;\n    // Show the administrator's own label. The scope key is appended only when\n    // the label does not already read as that key, because the evaluator\n    // matches on the key and a label like \"Line item\" would otherwise give no\n    // clue which segment (\"ITEM\") the rule will actually be tested against.\n    const label = (segment?.label ?? '').trim();\n    if (!label) configured.set(key, key);\n    else configured.set(key, label.toUpperCase() === key ? label : `${label} (${key})`);\n  }\n\n  const options = [\n    { label: 'Every accrual segment', value: '' },\n    ...[...configured].map(([value, label]) => ({ label, value })),\n  ];\n\n  for (const rule of config?.dualCashExclusion?.rules ?? []) {\n    const key = (rule?.segment ?? '').trim().toUpperCase();\n    if (!key || options.some((option) => option.value === key)) continue;\n    options.push({ label: `${key} — no longer configured`, value: key });\n  }\n\n  return options;\n}\n\n/**\n * Options for a cash-exclusion rule's \"Test against field\" picker: the default\n * entry, then the shared pool of account fields, then any field a saved rule\n * names that the pool does not offer.\n *\n * The default entry is labelled with the field this input actually displays\n * accounts by, because \"the configured one\" is only a useful default if the\n * administrator can see what it resolves to. Its VALUE stays the empty string —\n * the evaluator reads an absent `matchField` as \"use `accountValueLabel`\", and\n * stamping the resolved field onto the rule instead would freeze it: changing\n * the input's label later would then silently leave the rule testing the old\n * field.\n *\n * Unknown saved fields stay listed for the same reason stale segment scopes do\n * (see {@link segmentScopeOptions}): a chip whose value is absent from the list\n * renders as nothing selected, which would read as \"the default\" — the one\n * thing it is not.\n *\n * @param config - The MSCOA configuration being edited.\n * @returns The option list, always led by the default entry.\n */\nexport function matchFieldOptions(\n  config: IScoaInputConfig | undefined,\n): Array<{ label: string; value: string }> {\n  const configured = (config?.accountValueLabel ?? '').trim();\n  const known = MSCOA_ACCOUNT_VALUE_LABEL_OPTIONS.find((option) => option.value === configured);\n  const configuredLabel = known?.label ?? configured;\n\n  const options = [\n    {\n      label: configuredLabel\n        ? `Configured field · ${configuredLabel}`\n        : 'Configured account value label',\n      value: '',\n    },\n    ...MSCOA_ACCOUNT_VALUE_LABEL_OPTIONS,\n  ];\n\n  for (const rule of config?.dualCashExclusion?.rules ?? []) {\n    const field = (rule?.matchField ?? '').trim();\n    if (!field || options.some((option) => option.value === field)) continue;\n    options.push({ label: `${field} — not a listed account field`, value: field });\n  }\n\n  return options;\n}\n\n/**\n * The setup checklist: what is configured, what still needs the administrator,\n * and what does not apply to the chosen basis at all.\n *\n * `skip` is deliberately distinct from `pending` — a cash segment set is not\n * \"missing\" on an accrual-only input, it is irrelevant, and an editor that\n * cannot say the difference nags about work that must never be done.\n *\n * @param config - The MSCOA configuration being edited.\n * @returns One entry per setup area, in setup order.\n */\nexport function readinessOf(config: IScoaInputConfig | undefined): readonly ReadinessItem[] {\n  const basis = basisOf(config);\n  const accrual = segmentsOf(config).length;\n  const cash = cashSegmentsOf(config).length;\n  const rules = usableRulesOf(config).length;\n  const extensions = config?.extensionAccountsForSegments?.length ?? 0;\n\n  return [\n    { label: basis ? `Basis · ${BASIS_BADGE[basis]}` : 'Basis', state: basis ? 'done' : 'pending' },\n    {\n      // Required by every basis: the cash side of a dual input is authored\n      // against the accrual set, and `MscoaInputConfigSchema` demands at least\n      // one segment whatever the basis.\n      label: accrual > 0 ? `Accrual segments · ${accrual}` : 'Accrual segments',\n      state: accrual > 0 ? 'done' : 'pending',\n    },\n    {\n      label: cash > 0 ? `Cash segments · ${cash}` : 'Cash segments',\n      state: !usesCash(basis) ? 'skip' : cash > 0 ? 'done' : 'pending',\n    },\n    {\n      // Optional even on a dual basis — none means \"always require cash\", which\n      // is a complete configuration, not an unfinished one.\n      label: rules > 0 ? `Cash rules · ${rules}` : 'Cash rules',\n      state: basis === 'dual' ? (rules > 0 ? 'done' : 'skip') : 'skip',\n    },\n    {\n      label: extensions > 0 ? `Extensions · ${extensions}` : 'Extensions',\n      state: extensions > 0 ? 'done' : 'skip',\n    },\n  ];\n}\n\n/** True once nothing in the checklist is still waiting on the administrator. */\nexport function isConfigured(config: IScoaInputConfig | undefined): boolean {\n  return readinessOf(config).every((item) => item.state !== 'pending');\n}\n\n/**\n * One sentence describing what this configuration will ask the person filling\n * the form for — the MSCOA counterpart of the API card's \"waits for\" line, and\n * the fastest way for an administrator to catch a basis they did not intend.\n *\n * @param config - The MSCOA configuration being edited.\n * @returns Plain-language copy, never empty.\n */\nexport function requirementSentence(config: IScoaInputConfig | undefined): string {\n  const basis = basisOf(config);\n  if (!basis) return 'No accounting basis chosen yet — the picker has nothing to ask for.';\n  if (basis === 'accrual') return 'Asks for accrual accounts only.';\n  if (basis === 'cash') return 'Asks for cash accounts only.';\n\n  const rules = usableRulesOf(config).length;\n  if (rules === 0) return 'Asks for both accrual and cash accounts, every time.';\n  const every = matchModeOf(config) === 'all' ? 'all' : 'any';\n  const plural = rules === 1 ? '' : 's';\n  return `Asks for accrual accounts always, and for cash accounts unless ${every} of the ${rules} condition${plural} match the accrual selection.`;\n}\n\n/**\n * The configuration that must follow a basis change.\n *\n * The eight rows this editor replaced relied on `clearOnChange` to drop work\n * authored against the previous basis. One row bound to the whole object has no\n * per-key path to clear, so that guarantee lives here instead.\n *\n * Guarded the same way `clearOnChange` was: a FIRST choice clears nothing (there\n * is no earlier work to discard) and re-picking the current basis is a no-op.\n * Accrual segments always survive — every basis is authored against them, and a\n * basis switch must not cost the administrator the whole segment set.\n *\n * @param config - The configuration before the change.\n * @param next - The newly chosen basis.\n * @returns The configuration to emit.\n */\nexport function configForBasis(\n  config: IScoaInputConfig | undefined,\n  next: BasisKey,\n): IScoaInputConfig {\n  const current = (config ?? {}) as IScoaInputConfig;\n  const basisValue = next as unknown as IScoaInputConfig['accountingBasis'];\n  const previous = basisOf(config);\n  if (!previous || previous === next) return { ...current, accountingBasis: basisValue };\n\n  return {\n    ...current,\n    accountingBasis: basisValue,\n    // Cash accounts only exist on a basis that captures them.\n    cashSegments: usesCash(next) ? current.cashSegments : undefined,\n    // Cash-exclusion rules only exist for a dual basis.\n    dualCashExclusion: next === 'dual' ? current.dualCashExclusion : undefined,\n  };\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ViewEncapsulation,\n  computed,\n  inject,\n  linkedSignal,\n} from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { Observable } from 'rxjs';\n\nimport {\n  ElementEditorTypes,\n  MSCOA_ACCOUNT_VALUE_LABEL_OPTIONS,\n  MSCOA_DUAL_CASH_EXCLUSION_RULE_EDITOR,\n  SpecialElementKeys,\n} from 'ngx-t-forms-types';\nimport type {\n  DualCashExclusionMatchMode,\n  ElementEditorInnerSectionElementInterface,\n  FormColumnInputs,\n  IDualCashExclusionRule,\n  IGetTreeResponse,\n  IIncludedSegmentConfig,\n  IScoaInput,\n  IScoaInputConfig,\n  ScoaInnerInput,\n} from 'ngx-t-forms-types';\n\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\nimport { ChipOptionsCreatorEditorComponent } from '../chip-options-creator-editor/chip-options-creator-editor.component';\nimport { MatChipListEditorComponent } from '../mat-chip-list-editor/mat-chip-list-editor.component';\nimport { MscoaSegmentConfigComponent } from '../mscoa-segment-config/mscoa-segment-config.component';\nimport { RecordListManagerComponent } from '../record-list-manager/record-list-manager.component';\nimport {\n  BASIS_BADGE,\n  BASIS_OPTIONS,\n  basisColorOf,\n  basisOf,\n  cashSegmentsOf,\n  matchFieldOptions,\n  matchModeOf,\n  readinessOf,\n  requirementSentence,\n  segmentScopeOptions,\n  segmentsOf,\n  usableRulesOf,\n  usesCash,\n  type BasisKey,\n} from './mscoa-config.logic';\n\n/**\n * Everything the setup dialog needs from its opener. Signals keep the dialog\n * live against the host's state (an autoSave merge the parent hands back flows\n * straight into the open dialog), and the callbacks keep the HOST the single\n * owner of every mutation — the dialog itself never patches the config.\n */\nexport interface MscoaDialogContext {\n  /** The live MSCOA configuration. */\n  config: Signal<IScoaInputConfig | undefined>;\n  /** The whole input being edited — the segment editor reads its extensions. */\n  dataValue: Signal<IScoaInput | undefined>;\n  /** Account tree behind the segment pickers. */\n  getMscoaTree: Signal<Observable<IGetTreeResponse | undefined> | undefined>;\n  /** All form inputs, forwarded to the hosted record-list editor. */\n  formInputs: Signal<readonly FormColumnInputs[]>;\n  /** Disables every hosted editor (the dialog stays viewable read-only). */\n  disabled: Signal<boolean>;\n  /** Validation errors surfaced by the parent editor. */\n  errors: Signal<IConfigElementError[] | undefined>;\n  /** Host hook: persist a custom input authored against a segment. */\n  saveCustomInput: Signal<\n    | ((\n        sectionId: string,\n        scoaInputId: string,\n        config: Pick<\n          ScoaInnerInput,\n          'element' | 'label' | 'formControlName' | 'singleSelect' | 'readonly'\n        > & { id?: string },\n      ) => void)\n    | undefined\n  >;\n  /** Host hook: open the advanced editor for a segment-scoped custom input. */\n  editSegmentInput: Signal<((input: FormColumnInputs) => void) | undefined>;\n  /** Host hook: delete a segment-scoped custom input. */\n  deleteSegmentInput: Signal<((input: FormColumnInputs) => void) | undefined>;\n  basisChanged(basis: BasisKey): void;\n  accountValueLabelChanged(label: string): void;\n  showAllSegmentsChanged(showAll: boolean): void;\n  segmentsChanged(segments: IIncludedSegmentConfig[]): void;\n  cashSegmentsChanged(segments: IIncludedSegmentConfig[]): void;\n  rulesChanged(rules: IDualCashExclusionRule[]): void;\n  matchModeChanged(mode: DualCashExclusionMatchMode): void;\n  extensionsChanged(accounts: string[] | undefined): void;\n}\n\n/** Tab order — fixed, so indices are meaningful across the template. */\nexport const enum MscoaTab {\n  Basis = 0,\n  Accrual = 1,\n  Cash = 2,\n  Rules = 3,\n  Extensions = 4,\n}\n\n/**\n * Guided setup for a whole `mscoaConfig`, arranged in the order the decisions\n * actually depend on each other: the accounting basis first (it decides which\n * later panels apply at all), then the accrual accounts every basis is authored\n * against, then the cash accounts, then — for a dual basis — when the cash side\n * is required, and finally the optional counter-account extensions.\n *\n * Opened by {@link MscoaConfigComponent}, which passes a\n * {@link MscoaDialogContext} and remains the single owner of every mutation —\n * this dialog only renders state and forwards edits. Tabs that do not apply to\n * the chosen basis are disabled rather than hidden, so the shape of the whole\n * setup stays legible from the first screen.\n *\n * Internal editor; not part of the public API.\n */\n@Component({\n  selector: 'lib-mscoa-config-dialog',\n  templateUrl: './mscoa-config-dialog.component.html',\n  styleUrl: './mscoa-config-dialog.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: { class: 'lib-mscoa-config-dialog' },\n  imports: [\n    MatDialogModule,\n    MatButtonModule,\n    MatIconModule,\n    MatSlideToggleModule,\n    MatTabsModule,\n    MatTooltipModule,\n    ChipOptionsCreatorEditorComponent,\n    MatChipListEditorComponent,\n    MscoaSegmentConfigComponent,\n    RecordListManagerComponent,\n  ],\n})\nexport class MscoaConfigDialogComponent {\n  /** The opener-supplied context; see {@link MscoaDialogContext}. */\n  protected readonly data = inject(MAT_DIALOG_DATA) as MscoaDialogContext;\n\n  /** The live configuration, read through the opener's signal. */\n  protected readonly config = computed(() => this.data.config());\n\n  /** The chosen basis, or `undefined` before the first choice. */\n  protected readonly basis = computed<BasisKey | undefined>(() => basisOf(this.config()));\n\n  /** Short badge copy for the chosen basis (avoids an UpperCasePipe import). */\n  protected readonly basisBadge = computed<string>(() => {\n    const basis = this.basis();\n    return basis ? BASIS_BADGE[basis] : '';\n  });\n\n  /** Token colour for the basis badge. */\n  protected readonly basisColor = computed<string>(() => basisColorOf(this.config()));\n\n  /** Whether the chosen basis captures cash accounts. */\n  protected readonly hasCash = computed<boolean>(() => usesCash(this.basis()));\n\n  /** Whether the chosen basis is dual — the only one with cash rules. */\n  protected readonly isDual = computed<boolean>(() => this.basis() === 'dual');\n\n  /** The setup checklist rendered in the footer. */\n  protected readonly readiness = computed(() => readinessOf(this.config()));\n\n  /** One sentence on what the picker will ask the user for. */\n  protected readonly requirement = computed<string>(() => requirementSentence(this.config()));\n\n  protected readonly segments = computed<IIncludedSegmentConfig[]>(() => segmentsOf(this.config()));\n\n  protected readonly cashSegments = computed<IIncludedSegmentConfig[]>(() =>\n    cashSegmentsOf(this.config()),\n  );\n\n  protected readonly rules = computed<IDualCashExclusionRule[]>(\n    () => this.config()?.dualCashExclusion?.rules ?? [],\n  );\n\n  protected readonly ruleCount = computed<number>(() => usableRulesOf(this.config()).length);\n\n  protected readonly matchMode = computed<DualCashExclusionMatchMode>(() =>\n    matchModeOf(this.config()),\n  );\n\n  protected readonly showAllSegments = computed<boolean>(() => !!this.config()?.showAllSegments);\n\n  protected readonly accountValueLabel = computed<string>(\n    () => this.config()?.accountValueLabel ?? '',\n  );\n\n  protected readonly extensions = computed<string[]>(\n    () => this.config()?.extensionAccountsForSegments ?? [],\n  );\n\n  /** No form inputs reach the rules editor; a stable empty list avoids churn. */\n  protected readonly noFormInputs: FormColumnInputs[] = [];\n\n  /** Basis choices, rendered as cards rather than bare chips. */\n  protected readonly basisOptions = BASIS_OPTIONS;\n\n  /** The field every account is displayed by. */\n  protected readonly labelOptions = MSCOA_ACCOUNT_VALUE_LABEL_OPTIONS;\n\n  /** How the cash-exclusion rules combine. */\n  protected readonly matchModeOptions: Array<{ label: string; value: DualCashExclusionMatchMode }> = [\n    { label: 'Any must pass', value: 'any' },\n    { label: 'All must pass', value: 'all' },\n  ];\n\n  /**\n   * The record-list element the rules panel is driven by: the shared per-rule\n   * editor from `ngx-t-forms-types`, with two rows' options filled from THIS\n   * input — the segment scope from its accrual segments, and the \"test against\n   * field\" default from the account label it displays accounts by.\n   *\n   * Built here rather than injected at the form-builder seam because this dialog\n   * already holds the whole `mscoaConfig` — the segments and the rules that\n   * reference them are one object.\n   */\n  protected readonly ruleListElement = computed<ElementEditorInnerSectionElementInterface>(() => {\n    const config = this.config();\n    const runtimeOptions: Record<string, Array<{ label: string; value: string }>> = {\n      segment: segmentScopeOptions(config),\n      matchField: matchFieldOptions(config),\n    };\n    const sections = MSCOA_DUAL_CASH_EXCLUSION_RULE_EDITOR().map((section) => ({\n      ...section,\n      elements: section.elements.map((element) => {\n        const key = element.deepBind?.length === 1 ? element.deepBind[0] : undefined;\n        const options = key ? runtimeOptions[key] : undefined;\n        return options ? { ...element, options } : element;\n      }),\n    }));\n    return {\n      id: 'mscoa-cash-rules',\n      name: SpecialElementKeys.Default,\n      deepBind: ['rules'],\n      editType: ElementEditorTypes.RecordListManager,\n      label: 'Conditions that make cash accounting optional',\n      secondaryElementEditorConfig: sections,\n      options: [\n        { label: 'Expression', value: 'pattern' },\n        { label: 'Segment', value: 'segment' },\n        { label: 'Description', value: 'description' },\n      ],\n    };\n  });\n\n  /**\n   * Active tab. A `linkedSignal` (per the library decision tree — follows a\n   * source, the user overrides locally): the choice sticks while a basis exists,\n   * and losing the basis snaps back to Basis, where every other tab is disabled\n   * and nothing else would be honest to show. No `effect()` writes.\n   */\n  protected readonly selectedTab = linkedSignal<boolean, number>({\n    source: computed(() => !!this.basis()),\n    computation: (has, previous) => (has ? (previous?.value ?? MscoaTab.Basis) : MscoaTab.Basis),\n  });\n\n  /** Exposes the tab indices to the template. */\n  protected readonly Tab = {\n    Basis: MscoaTab.Basis as number,\n    Accrual: MscoaTab.Accrual as number,\n    Cash: MscoaTab.Cash as number,\n    Rules: MscoaTab.Rules as number,\n    Extensions: MscoaTab.Extensions as number,\n  };\n\n  /**\n   * Forwards a basis choice and moves the administrator to the next panel that\n   * needs them — the accrual segments, which every basis is authored against.\n   * Re-picking the basis already in force only forwards it (the host no-ops the\n   * write), so it never yanks the tab away from someone reviewing a setting.\n   */\n  protected onBasisChanged(basis: BasisKey): void {\n    const changed = this.basis() !== basis;\n    this.data.basisChanged(basis);\n    if (changed) this.selectedTab.set(MscoaTab.Accrual);\n  }\n\n  protected onAccountValueLabelChanged(label: unknown): void {\n    if (typeof label === 'string') this.data.accountValueLabelChanged(label);\n  }\n\n  protected onMatchModeChanged(mode: unknown): void {\n    if (mode === 'any' || mode === 'all') this.data.matchModeChanged(mode);\n  }\n\n  protected onRulesChanged(rows: unknown): void {\n    this.data.rulesChanged(Array.isArray(rows) ? (rows as IDualCashExclusionRule[]) : []);\n  }\n}\n","<header class=\"mcd__header\">\n  <div class=\"mcd__heading\">\n    <h2 class=\"mcd__title\">MSCOA account setup</h2>\n    <p class=\"mcd__subtitle\">What this account picker asks the user for</p>\n  </div>\n  <button mat-icon-button mat-dialog-close class=\"mcd__close\" aria-label=\"Close MSCOA setup\">\n    <mat-icon aria-hidden=\"true\">close</mat-icon>\n  </button>\n</header>\n\n@if (basis(); as chosen) {\n  <!-- Basis bar — the anchor every later decision hangs off. -->\n  <div class=\"mcd__basis-bar\">\n    <span class=\"mcd__basis\" [style.color]=\"basisColor()\">{{ basisBadge() }}</span>\n    <p class=\"mcd__requirement\">{{ requirement() }}</p>\n    <button\n      mat-stroked-button\n      class=\"mcd__change\"\n      [disabled]=\"data.disabled()\"\n      (click)=\"selectedTab.set(Tab.Basis)\">\n      <mat-icon aria-hidden=\"true\">swap_horiz</mat-icon>\n      Change basis\n    </button>\n  </div>\n} @else {\n  <!-- First-run guide: the whole flow in one glance. -->\n  <ol class=\"mcd__steps\" aria-label=\"Setup steps\">\n    <li class=\"mcd__step mcd__step--active\"><span class=\"mcd__step-n\">1</span>Choose the basis</li>\n    <li class=\"mcd__step\"><span class=\"mcd__step-n\">2</span>Pick the segments</li>\n    <li class=\"mcd__step\"><span class=\"mcd__step-n\">3</span>Refine the rules</li>\n  </ol>\n}\n\n<mat-dialog-content class=\"mcd__content\">\n  <mat-tab-group\n    class=\"mcd__tabs\"\n    [mat-stretch-tabs]=\"false\"\n    animationDuration=\"150ms\"\n    [selectedIndex]=\"selectedTab()\"\n    (selectedIndexChange)=\"selectedTab.set($event)\">\n\n    <!-- 1 · BASIS -->\n    <mat-tab label=\"Basis\">\n      <section class=\"mcd__pane\">\n        <p class=\"mcd__hint\">\n          This decides when the budget is affected, and how many sets of accounts the user has to\n          capture. Everything else in this setup follows from it.\n        </p>\n\n        <div class=\"mcd__cards\" role=\"radiogroup\" aria-label=\"Accounting basis\">\n          @for (option of basisOptions; track option.value) {\n            <button\n              type=\"button\"\n              role=\"radio\"\n              class=\"mcd__card\"\n              [class.mcd__card--selected]=\"basis() === option.value\"\n              [attr.aria-checked]=\"basis() === option.value\"\n              [disabled]=\"data.disabled()\"\n              (click)=\"onBasisChanged(option.value)\">\n              <span class=\"mcd__card-title\">{{ option.label }}</span>\n              <span class=\"mcd__card-detail\">{{ option.detail }}</span>\n              @if (basis() === option.value) {\n                <mat-icon class=\"mcd__card-tick\" aria-hidden=\"true\">check_circle</mat-icon>\n              }\n            </button>\n          }\n        </div>\n\n        <div class=\"mcd__field\">\n          <h3 class=\"mcd__field-label\">Account value label</h3>\n          <p class=\"mcd__field-hint\">\n            The field every selected account is displayed by — in the picker and in everything\n            downstream that reads the captured value.\n          </p>\n          <lib-mat-chip-list-editor\n            [options]=\"labelOptions\"\n            [value]=\"accountValueLabel()\"\n            [disabled]=\"data.disabled()\"\n            (valueChange)=\"onAccountValueLabelChanged($event)\" />\n        </div>\n      </section>\n    </mat-tab>\n\n    <!-- 2 · ACCRUAL SEGMENTS -->\n    <mat-tab [disabled]=\"!basis()\">\n      <ng-template mat-tab-label>\n        Accrual segments\n        @if (segments().length) {\n          <span class=\"mcd__badge\">{{ segments().length }}</span>\n        }\n      </ng-template>\n      <section class=\"mcd__pane\">\n        <p class=\"mcd__hint\">\n          The SCOA segments the user picks an account for. Every basis is authored against this\n          set — a cash-only input still captures its accounts here.\n        </p>\n\n        <div class=\"mcd__toggle-row\">\n          <mat-slide-toggle\n            [checked]=\"showAllSegments()\"\n            [disabled]=\"data.disabled()\"\n            (change)=\"data.showAllSegmentsChanged($event.checked)\">\n            Allow selection from all SCOA segments\n          </mat-slide-toggle>\n          <p class=\"mcd__field-hint\">\n            On: every segment in the chart of accounts can be added. Off: only the standard set.\n          </p>\n        </div>\n\n        <lib-mscoa-segment-config\n          [value]=\"segments()\"\n          [dataValue]=\"data.dataValue()\"\n          [disabled]=\"data.disabled()\"\n          [errors]=\"data.errors() || []\"\n          [getMscoaTree]=\"data.getMscoaTree()\"\n          [showAllSegments]=\"showAllSegments()\"\n          [saveCustomInput]=\"data.saveCustomInput()\"\n          [editSegmentInput]=\"data.editSegmentInput()\"\n          [deleteSegmentInput]=\"data.deleteSegmentInput()\"\n          (valueChanged)=\"data.segmentsChanged($event)\" />\n      </section>\n    </mat-tab>\n\n    <!-- 3 · CASH SEGMENTS -->\n    <mat-tab [disabled]=\"!hasCash()\">\n      <ng-template mat-tab-label>\n        Cash segments\n        @if (cashSegments().length) {\n          <span class=\"mcd__badge\">{{ cashSegments().length }}</span>\n        }\n      </ng-template>\n      <section class=\"mcd__pane\">\n        @if (hasCash()) {\n          <p class=\"mcd__hint\">\n            The segments captured on the cash side. A segment set to inherit takes its accounts\n            from the matching accrual segment instead of asking again.\n          </p>\n          <lib-mscoa-segment-config\n            [value]=\"cashSegments()\"\n            [dataValue]=\"data.dataValue()\"\n            [isCashSegmentConfig]=\"true\"\n            [disabled]=\"data.disabled()\"\n            [errors]=\"data.errors() || []\"\n            [getMscoaTree]=\"data.getMscoaTree()\"\n            [showAllSegments]=\"showAllSegments()\"\n            [saveCustomInput]=\"data.saveCustomInput()\"\n            [editSegmentInput]=\"data.editSegmentInput()\"\n            [deleteSegmentInput]=\"data.deleteSegmentInput()\"\n            (valueChanged)=\"data.cashSegmentsChanged($event)\" />\n        }\n      </section>\n    </mat-tab>\n\n    <!-- 4 · CASH RULES (dual only) -->\n    <mat-tab [disabled]=\"!isDual()\">\n      <ng-template mat-tab-label>\n        Cash rules\n        @if (ruleCount()) {\n          <span class=\"mcd__badge\">{{ ruleCount() }}</span>\n        }\n      </ng-template>\n      <section class=\"mcd__pane\">\n        @if (isDual()) {\n          <p class=\"mcd__hint\">\n            By default a dual input requires BOTH sets of accounts. Add conditions here to make the\n            cash side optional: each is a regular expression tested against the accrual accounts the\n            user selected. When the conditions pass, the cash table is hidden, any cash accounts\n            already captured are cleared, and only the accrual side is required.\n          </p>\n\n          <lib-record-list-manager\n            [editorConfig]=\"ruleListElement()\"\n            [formInputs]=\"noFormInputs\"\n            [value]=\"rules()\"\n            [disabled]=\"data.disabled()\"\n            (valueChange)=\"onRulesChanged($event)\" />\n\n          @if (ruleCount() > 1) {\n            <div class=\"mcd__field\">\n              <h3 class=\"mcd__field-label\">How the conditions combine</h3>\n              <lib-mat-chip-list-editor\n                [options]=\"matchModeOptions\"\n                [value]=\"matchMode()\"\n                [disabled]=\"data.disabled()\"\n                (valueChange)=\"onMatchModeChanged($event)\" />\n            </div>\n          }\n\n          <p class=\"mcd__outcome\">{{ requirement() }}</p>\n        }\n      </section>\n    </mat-tab>\n\n    <!-- 5 · EXTENSIONS -->\n    <mat-tab [disabled]=\"!basis()\">\n      <ng-template mat-tab-label>\n        Extensions\n        @if (extensions().length) {\n          <span class=\"mcd__badge\">{{ extensions().length }}</span>\n        }\n      </ng-template>\n      <section class=\"mcd__pane\">\n        <p class=\"mcd__hint\">\n          Optional extra account columns offered alongside debit and credit — bank charges or\n          retention, for example. Each name becomes a pair of columns a segment can opt into.\n        </p>\n        <lib-chip-options-creator-editor\n          [value]=\"extensions()\"\n          [disabled]=\"data.disabled()\"\n          [errors]=\"data.errors() || []\"\n          placeholder=\"e.g. bankCharges\"\n          (valueChange)=\"data.extensionsChanged($event)\" />\n      </section>\n    </mat-tab>\n  </mat-tab-group>\n</mat-dialog-content>\n\n<footer class=\"mcd__footer\">\n  <ul class=\"mcd__readiness\" aria-label=\"Setup checklist\">\n    @for (item of readiness(); track item.label) {\n      <li class=\"mcd__ready\" [attr.data-state]=\"item.state\">\n        <!-- Glyph + colour + border style: state is never colour-only. -->\n        <span class=\"mcd__ready-mark\" aria-hidden=\"true\">{{\n          item.state === 'done' ? '✓' : item.state === 'pending' ? '•' : '–'\n        }}</span>\n        {{ item.label }}\n      </li>\n    }\n  </ul>\n  <button mat-flat-button mat-dialog-close class=\"mcd__done\">Done</button>\n</footer>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  Injector,\n  ViewEncapsulation,\n  computed,\n  inject,\n  input,\n  linkedSignal,\n  output,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { Observable } from 'rxjs';\n\nimport type {\n  DualCashExclusionMatchMode,\n  FormColumnInputs,\n  IDualCashExclusionRule,\n  IGetTreeResponse,\n  IIncludedSegmentConfig,\n  IScoaInput,\n  IScoaInputConfig,\n  ScoaInnerInput,\n} from 'ngx-t-forms-types';\n\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\nimport { ErrorListComponent } from '../_shared/error-list/error-list.component';\nimport {\n  MscoaConfigDialogComponent,\n  type MscoaDialogContext,\n} from './mscoa-config-dialog.component';\nimport {\n  basisColorOf,\n  basisOf,\n  cashSegmentsOf,\n  configForBasis,\n  matchModeOf,\n  readinessOf,\n  requirementSentence,\n  segmentsOf,\n  usesCash,\n  type BasisKey,\n  type ReadinessItem,\n} from './mscoa-config.logic';\n\n/**\n * Entry point for a whole `mscoaConfig`.\n *\n * Replaces the eight separate sidebar rows an MSCOA input used to be configured\n * through — accounting basis, account value label, \"show all segments\", the\n * accrual and cash segment sets, the dual-basis cash rules and their match mode,\n * and the counter-account extensions. Those rows were scattered through the\n * element editor in declaration order rather than in the order the decisions\n * depend on each other, and half of them silently did nothing until the basis\n * above them was right.\n *\n * The sidebar is too narrow to make that legible, so this component renders only\n * the CURRENT STATE — an invitation card before a basis is chosen, a summary\n * card (basis badge, what the picker will ask for, per-area chips) after — and\n * opens {@link MscoaConfigDialogComponent} for the actual editing. It remains\n * the single owner of every mutation: the dialog reads live state through\n * signals and forwards edits back into the patch methods here.\n *\n * Emits the COMPLETE `mscoaConfig` on every change. Changing the basis clears\n * the work that basis invalidates — the guarantee the removed rows got from\n * `clearOnChange`, now owned by {@link configForBasis}.\n *\n * Internal editor consumed by `t-dynamic-data-edit`; not part of the public API.\n *\n * @example\n *   <lib-mscoa-config [value]=\"mscoaConfig()\" [dataValue]=\"input()\"\n *     (valueChanged)=\"onConfig($event)\" />\n */\n@Component({\n  selector: 'lib-mscoa-config',\n  templateUrl: './mscoa-config.component.html',\n  styleUrl: './mscoa-config.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: { class: 'lib-mscoa-config' },\n  imports: [\n    EmptyStateComponent,\n    ErrorListComponent,\n    MatButtonModule,\n    MatIconModule,\n    MatTooltipModule,\n  ],\n})\nexport class MscoaConfigComponent {\n  readonly #dialog = inject(MatDialog);\n  readonly #destroyRef = inject(DestroyRef);\n  /**\n   * The editor's own injector, handed to the dialog so the hosted record-list\n   * editor still resolves `NESTED_EDITOR_COMPONENT` — a dialog opened without it\n   * would attach under the root injector, where that token is not provided.\n   */\n  readonly #injector = inject(Injector);\n\n  /** Current MSCOA configuration (`undefined` on a freshly added input). */\n  readonly value = input<IScoaInputConfig | undefined>(undefined);\n\n  /** The whole input being edited — the segment editor reads its extensions. */\n  readonly dataValue = input<IScoaInput | undefined>(undefined);\n\n  /** Account tree behind the segment pickers. */\n  readonly getMscoaTree = input<Observable<IGetTreeResponse | undefined> | undefined>(undefined);\n\n  /** All form inputs, forwarded to the hosted editors. */\n  readonly formInputs = input<readonly FormColumnInputs[]>([]);\n\n  /** Disables editing; the dialog stays openable for read-only review. */\n  readonly disabled = input<boolean>(false);\n\n  /** Validation errors surfaced by the parent editor. */\n  readonly errors = input<IConfigElementError[] | undefined>([]);\n\n  /** Optional id supplied by the parent editor. */\n  readonly id = input<string | undefined>(undefined);\n\n  /** Host hook: persist a custom input authored against a segment. */\n  readonly saveCustomInput = input<\n    | ((\n        sectionId: string,\n        scoaInputId: string,\n        config: Pick<\n          ScoaInnerInput,\n          'element' | 'label' | 'formControlName' | 'singleSelect' | 'readonly'\n        > & { id?: string },\n      ) => void)\n    | undefined\n  >(undefined);\n\n  /** Host hook: open the advanced editor for a segment-scoped custom input. */\n  readonly editSegmentInput = input<((input: FormColumnInputs) => void) | undefined>(undefined);\n\n  /** Host hook: delete a segment-scoped custom input. */\n  readonly deleteSegmentInput = input<((input: FormColumnInputs) => void) | undefined>(undefined);\n\n  /** Emits the complete MSCOA configuration on every change. */\n  readonly valueChanged = output<IScoaInputConfig>();\n\n  /**\n   * The configuration being edited: follows the parent `value`, and local\n   * patches override it until the parent hands a new value down (autoSave\n   * merge-back). `linkedSignal` per the library decision tree — a source the\n   * user can override locally.\n   */\n  protected readonly config = linkedSignal<IScoaInputConfig | undefined>(() => this.value());\n\n  /** The chosen basis, or `undefined` before the first choice. */\n  protected readonly basis = computed<BasisKey | undefined>(() => basisOf(this.config()));\n\n  /** Token colour for the summary card's basis badge. */\n  protected readonly basisColor = computed<string>(() => basisColorOf(this.config()));\n\n  /** Short badge copy for the chosen basis. */\n  protected readonly basisBadge = computed<string>(() => {\n    const basis = this.basis();\n    return basis ? basis.toUpperCase() : '';\n  });\n\n  /** One sentence on what the picker will ask the person filling the form for. */\n  protected readonly requirement = computed<string>(() => requirementSentence(this.config()));\n\n  /**\n   * Summary chips: every setup area with its state, minus the basis (the badge\n   * above already carries it) — one glance answers \"what is configured, what\n   * still needs me, and what does not apply here at all\".\n   */\n  protected readonly summaryChips = computed<readonly ReadinessItem[]>(() =>\n    readinessOf(this.config()).filter((item) => !item.label.startsWith('Basis')),\n  );\n\n  /** The open editor dialog, if any — guards against double-opening. */\n  #dialogRef: MatDialogRef<MscoaConfigDialogComponent> | null = null;\n\n  constructor() {\n    this.#destroyRef.onDestroy(() => this.#dialogRef?.close());\n  }\n\n  /**\n   * Opens the guided setup dialog. The dialog reads live state through the\n   * context's signals and forwards every edit back into this component's patch\n   * methods, so the emit semantics match the rows it replaced. Opening while\n   * `disabled` is allowed — the hosted editors render read-only, which is how a\n   * locked configuration is reviewed.\n   */\n  protected openDialog(): void {\n    if (this.#dialogRef) return;\n\n    const context: MscoaDialogContext = {\n      config: this.config.asReadonly(),\n      dataValue: this.dataValue,\n      getMscoaTree: this.getMscoaTree,\n      formInputs: this.formInputs,\n      disabled: this.disabled,\n      errors: this.errors,\n      saveCustomInput: this.saveCustomInput,\n      editSegmentInput: this.editSegmentInput,\n      deleteSegmentInput: this.deleteSegmentInput,\n      basisChanged: (basis) => this.onBasisChanged(basis),\n      accountValueLabelChanged: (label) => this.#patch({ accountValueLabel: label }),\n      showAllSegmentsChanged: (showAll) => this.onShowAllSegmentsChanged(showAll),\n      segmentsChanged: (segments) => this.#patch({ segments }),\n      cashSegmentsChanged: (cashSegments) => this.#patch({ cashSegments }),\n      rulesChanged: (rules) => this.onRulesChanged(rules),\n      matchModeChanged: (mode) => this.onMatchModeChanged(mode),\n      extensionsChanged: (accounts) => this.#patch({ extensionAccountsForSegments: accounts }),\n    };\n\n    this.#dialogRef = this.#dialog.open(MscoaConfigDialogComponent, {\n      data: context,\n      injector: this.#injector,\n      width: 'min(1080px, 96vw)',\n      maxWidth: '96vw',\n      maxHeight: '92vh',\n      autoFocus: 'first-tabbable',\n      panelClass: 'lib-mscoa-config-dialog-panel',\n    });\n    this.#dialogRef\n      .afterClosed()\n      .pipe(takeUntilDestroyed(this.#destroyRef))\n      .subscribe(() => (this.#dialogRef = null));\n  }\n\n  /**\n   * Applies a basis change, dropping the work that basis invalidates — see\n   * {@link configForBasis} for exactly what survives and why.\n   */\n  protected onBasisChanged(basis: BasisKey): void {\n    const next = configForBasis(this.config(), basis);\n    this.config.set(next);\n    this.valueChanged.emit(next);\n  }\n\n  /**\n   * The segment sets are authored against the pool this flag selects, so a\n   * change to it invalidates both — the same clear the removed toggle row\n   * declared through `clearOnChange`. Guarded: turning the flag to the value it\n   * already holds clears nothing.\n   */\n  protected onShowAllSegmentsChanged(showAllSegments: boolean): void {\n    if (!!this.config()?.showAllSegments === showAllSegments) return;\n    this.#patch({ showAllSegments, segments: undefined, cashSegments: undefined });\n  }\n\n  /** Writes the cash-exclusion rules, preserving the match mode beside them. */\n  protected onRulesChanged(rules: IDualCashExclusionRule[]): void {\n    this.#patch({\n      dualCashExclusion: { ...this.config()?.dualCashExclusion, rules },\n    });\n  }\n\n  /** Writes the match mode, preserving the rules beside it. */\n  protected onMatchModeChanged(matchMode: DualCashExclusionMatchMode): void {\n    this.#patch({\n      dualCashExclusion: { ...this.config()?.dualCashExclusion, matchMode },\n    });\n  }\n\n  /** Merges a partial change into the configuration and emits the whole object. */\n  #patch(partial: Partial<IScoaInputConfig>): void {\n    const next = { ...(this.config() ?? {}), ...partial } as IScoaInputConfig;\n    this.config.set(next);\n    this.valueChanged.emit(next);\n  }\n\n  /** Exposed for the template's summary counts. */\n  protected readonly segmentCount = computed<number>(() => segmentsOf(this.config()).length);\n  protected readonly cashSegmentCount = computed<number>(() => cashSegmentsOf(this.config()).length);\n  protected readonly hasCash = computed<boolean>(() => usesCash(this.basis()));\n  protected readonly matchMode = computed<DualCashExclusionMatchMode>(() =>\n    matchModeOf(this.config()),\n  );\n\n  /** The account-value label in force, for the summary line. */\n  protected readonly accountValueLabel = computed<string>(\n    () => this.config()?.accountValueLabel ?? '',\n  );\n\n  /** Segment definitions, exposed so the template can show the first few names. */\n  protected readonly segmentNames = computed<readonly string[]>(() =>\n    segmentsOf(this.config())\n      .map((segment: IIncludedSegmentConfig) => segment.label || segment.customSegment || segment.segment || '')\n      .filter((name): name is string => name.length > 0),\n  );\n}\n","<div class=\"mcc\">\n  @if (!basis()) {\n    <!-- INVITE — nothing configured yet; the dialog is where setup happens. -->\n    <div class=\"mcc-invite\">\n      <lib-empty-state\n        icon=\"account_tree\"\n        message=\"This account picker is not set up yet. Choose an accounting basis, pick the SCOA segments the user selects from, and set the rules — all in one guided setup.\" />\n      <button mat-flat-button class=\"mcc-invite__cta\" [disabled]=\"disabled()\" (click)=\"openDialog()\">\n        <mat-icon aria-hidden=\"true\">account_tree</mat-icon>\n        Set up MSCOA accounts\n      </button>\n    </div>\n  } @else {\n    <!-- SUMMARY — what is configured, at a glance; editing happens in the dialog. -->\n    <div class=\"mcc-summary\">\n      <div class=\"mcc-summary__head\">\n        <span class=\"mcc-summary__basis\" [style.color]=\"basisColor()\">{{ basisBadge() }}</span>\n        <div class=\"mcc-summary__id\">\n          <p class=\"mcc-summary__segments\">\n            {{ segmentCount() }} accrual segment{{ segmentCount() === 1 ? '' : 's' }}@if (hasCash()) {,\n            {{ cashSegmentCount() }} cash }\n          </p>\n          @if (segmentNames().length) {\n            <p class=\"mcc-summary__names\" [matTooltip]=\"segmentNames().join(', ')\">\n              {{ segmentNames().join(' · ') }}\n            </p>\n          }\n        </div>\n      </div>\n\n      <div class=\"mcc__chips\">\n        @for (item of summaryChips(); track item.label) {\n          <span class=\"mcc__chip\" [attr.data-state]=\"item.state\">\n            <!-- Glyph + colour + border style: state is never colour-only. -->\n            {{ item.state === 'done' ? '✓ ' : item.state === 'pending' ? '• ' : '' }}{{ item.label }}\n          </span>\n        }\n      </div>\n\n      <p class=\"mcc__requirement\">{{ requirement() }}</p>\n\n      @if (accountValueLabel()) {\n        <p class=\"mcc__meta\">Accounts shown by <strong>{{ accountValueLabel() }}</strong></p>\n      }\n\n      <div class=\"mcc-summary__actions\">\n        <button mat-flat-button (click)=\"openDialog()\">\n          <mat-icon aria-hidden=\"true\">tune</mat-icon>\n          {{ disabled() ? 'View setup' : 'Configure' }}\n        </button>\n      </div>\n    </div>\n  }\n\n  <lib-error-list [errors]=\"errors() || []\" />\n</div>\n"],"names":["i1","i2","i3"],"mappings":"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"}