{"version":3,"file":"ngx-t-forms-mscoa-segment-config.component-GyKF31Ve.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-segment-config/mscoa-segment-config.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mscoa-segment-config/mscoa-segment-config.component.html"],"sourcesContent":["import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  DestroyRef,\r\n  ViewEncapsulation,\r\n  computed,\r\n  effect,\r\n  inject,\r\n  input,\r\n  output,\r\n  signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n  FormBuilder,\r\n  FormGroup,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from '@angular/forms';\r\nimport { Observable, catchError, of, take, tap } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { MatSlideToggleChange, MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport type {\r\n  FormColumnInputs,\r\n  IGetTreeResponse,\r\n  IIncludedSegmentConfig,\r\n  IScoaInput,\r\n  ScoaInnerInput,\r\n} from 'ngx-t-forms-types';\r\nimport { ElementTypes } from 'ngx-t-forms-types';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport { _isEqual } from '../../../../shared/functions/isEqual';\r\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/** Discriminated edit-panel state: idle, adding a new segment, or editing an existing one. */\r\ntype EditState =\r\n  | { readonly mode: 'idle' }\r\n  | { readonly mode: 'add' }\r\n  | { readonly mode: 'edit'; readonly index: number };\r\n\r\nconst IDLE: EditState = { mode: 'idle' };\r\n\r\n/**\r\n * Internal editor element for configuring an MSCOA input's included account\r\n * segments. Child of `t-dynamic-data-edit`, which supplies the field label,\r\n * hint, and validation errors - so this component owns only the segment chip\r\n * row and the add/edit panel.\r\n *\r\n * The segment list is seeded from the MSCOA tree (`getMscoaTree`); each segment\r\n * carries flags such as single-select, read-only, VAT-selection and\r\n * inherit-from-accrual. In cash-segment mode (`isCashSegmentConfig`) every\r\n * non-`item` segment defaults to inherit-from-accrual + read-only.\r\n */\r\n@Component({\r\n  selector: 'lib-mscoa-segment-config',\r\n  templateUrl: './mscoa-segment-config.component.html',\r\n  styleUrl: './mscoa-segment-config.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  host: {\r\n    'class': 'lib-mscoa-segment-config',\r\n    '[attr.id]': 'hostId',\r\n  },\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatButtonModule,\r\n    MatCardModule,\r\n    MatChipsModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatSelectModule,\r\n    MatSlideToggleModule,\r\n    MatTooltipModule,\r\n    EmptyStateComponent,\r\n  ],\r\n})\r\nexport class MscoaSegmentConfigComponent {\r\n  /**\r\n   * Validation errors passed down by the parent editor. Retained on the contract\r\n   * but not rendered here - `t-dynamic-data-edit` owns error display.\r\n   */\r\n  readonly errors = input<IConfigElementError[] | undefined>([]);\r\n\r\n  /** The full MSCOA input config; supplies the extension-account options. */\r\n  readonly dataValue = input<IScoaInput | undefined>(undefined);\r\n\r\n  /** Disable user interaction. */\r\n  readonly disabled = input<boolean>(false);\r\n\r\n  /** Cash-segment mode: non-`item` segments default to inherit + read-only. */\r\n  readonly isCashSegmentConfig = input<boolean>(false);\r\n\r\n  /** Currently configured segments. */\r\n  readonly value = input<IIncludedSegmentConfig[] | undefined>(undefined);\r\n\r\n  /** When true, render every tree segment read-only (no add/remove). */\r\n  readonly showAllSegments = input<boolean>(false);\r\n\r\n  /**\r\n   * Stream that resolves the MSCOA account tree. Heterogeneous wrapper binding -\r\n   * the parent feeds whatever the editor config holds; narrowing here would force\r\n   * wrapper changes.\r\n   */\r\n  readonly getMscoaTree = input<Observable<IGetTreeResponse | undefined> | undefined>(undefined);\r\n\r\n  /**\r\n   * Creates or updates an account-level custom input (a peer of the segments) from\r\n   * the quick editor. Threaded through `t-dynamic-data-edit`; absent outside the\r\n   * builder, which hides the affordance.\r\n   */\r\n  readonly saveCustomInput = input<((sectionId: string, scoaInputId: string, config: Pick<ScoaInnerInput, 'element' | 'label' | 'formControlName' | 'singleSelect' | 'readonly'> & { id?: string }) => void) | undefined>(undefined);\r\n\r\n  /** Opens a custom input in the form-builder's input editor for advanced configuration. */\r\n  readonly editSegmentInput = input<((input: FormColumnInputs) => void) | undefined>(undefined);\r\n\r\n  /** Removes a custom input from the MSCOA config. */\r\n  readonly deleteSegmentInput = input<((input: FormColumnInputs) => void) | undefined>(undefined);\r\n\r\n  /** Emits the mutated segment list whenever the user adds, edits, or removes one. */\r\n  readonly valueChanged = output<IIncludedSegmentConfig[]>();\r\n\r\n  /** Host id attribute - stable, unique per instance. */\r\n  readonly hostId = `app-mscoa-segment-config-${nextUniqueId++}`;\r\n\r\n  readonly #fb = inject(FormBuilder);\r\n  readonly #destroyRef = inject(DestroyRef);\r\n\r\n  /** Tree-derived segment templates (drives the segment `mat-select`). */\r\n  readonly #treeSegments = signal<readonly IIncludedSegmentConfig[]>([]);\r\n\r\n  /** Error raised while fetching the tree (`null` until/unless the fetch fails). */\r\n  readonly #fetchError = signal<string | null>(null);\r\n\r\n  /** True while the tree stream is in flight. */\r\n  protected readonly loading = signal<boolean>(false);\r\n\r\n  /** Add/edit panel state. */\r\n  readonly #editState = signal<EditState>(IDLE);\r\n\r\n  /** Reactive form for the segment currently being added/edited. */\r\n  protected segmentForm: FormGroup = this.#createSegmentForm();\r\n\r\n  /** Add/edit panel state for account-level custom inputs. */\r\n  readonly #customInputState = signal<{ mode: 'idle' } | { mode: 'add' } | { mode: 'edit'; id: string }>({ mode: 'idle' });\r\n\r\n  /** Reactive form for the custom input currently being added/edited. */\r\n  protected customInputForm: FormGroup = this.#createCustomInputForm();\r\n\r\n  /** Curated input-type options for the custom-input quick editor. */\r\n  protected readonly customInputTypes: ReadonlyArray<{ value: ElementTypes; label: string }> = [\r\n    { value: ElementTypes.Input, label: 'Text / number' },\r\n    { value: ElementTypes.Select, label: 'Select' },\r\n    { value: ElementTypes.DatePicker, label: 'Date' },\r\n    { value: ElementTypes.Toggle, label: 'Toggle' },\r\n  ];\r\n\r\n  /** Guards single-shot tree load (mirrors the original take(1) one-time fetch). */\r\n  #treeRequested = false;\r\n\r\n  /**\r\n   * The configured segments, always a real array. The editor descriptor seeds\r\n   * an unconfigured segments value as `false` (its `defaultValue`), so guard\r\n   * against any non-array input — `?? []` alone would let `false`/objects\r\n   * through and break `.some` / `.map` / `@for` downstream.\r\n   */\r\n  protected readonly resolvedValue = computed<readonly IIncludedSegmentConfig[]>(\r\n    () => {\r\n      const value = this.value();\r\n      return Array.isArray(value) ? value : [];\r\n    },\r\n  );\r\n\r\n  /** Tree-derived segment templates for the picker. */\r\n  protected readonly treeSegments = this.#treeSegments.asReadonly();\r\n\r\n  /**\r\n   * Loader/tree error message; `null` when none. A fetch error takes priority,\r\n   * otherwise a missing loader surfaces the \"No loader provided\" notice.\r\n   */\r\n  protected readonly treeError = computed<string | null>(() => {\r\n    const fetchError = this.#fetchError();\r\n    if (fetchError) {\r\n      return fetchError;\r\n    }\r\n    return this.getMscoaTree() ? null : 'No loader provided';\r\n  });\r\n\r\n  /** Whether the add/edit panel is open. */\r\n  protected readonly isEditing = computed<boolean>(() => this.#editState().mode !== 'idle');\r\n\r\n  /** Whether the open panel is adding a brand-new segment. */\r\n  protected readonly isAddingNew = computed<boolean>(() => this.#editState().mode === 'add');\r\n\r\n  /** Whether the \"Add new segment\" toolbar button should show. */\r\n  protected readonly canAddNew = computed<boolean>(\r\n    () => !this.isEditing() && !this.showAllSegments(),\r\n  );\r\n\r\n  constructor() {\r\n    // One-time tree load. Mirrors the original `take(1)` fetch. The signal\r\n    // writes happen off the reactive tick (microtask) so the effect itself\r\n    // performs no synchronous signal mutation.\r\n    effect(() => {\r\n      const tree$ = this.getMscoaTree();\r\n      if (!tree$ || this.#treeRequested) {\r\n        return;\r\n      }\r\n      this.#treeRequested = true;\r\n      queueMicrotask(() => this.#loadMscoa(tree$));\r\n    });\r\n\r\n    // Reflect the full tree as read-only segments when `showAllSegments` is on.\r\n    effect(() => {\r\n      if (this.showAllSegments()) {\r\n        this.#syncAllSegments();\r\n      }\r\n    });\r\n  }\r\n\r\n  /** Fetch the tree once, build the segment templates, surface any error. */\r\n  #loadMscoa(tree$: Observable<IGetTreeResponse | undefined>): void {\r\n    this.#fetchError.set(null);\r\n    this.loading.set(true);\r\n    tree$\r\n      .pipe(\r\n        take(1),\r\n        tap((response) => {\r\n          this.#treeSegments.set(this.#buildTreeSegments(response));\r\n          this.loading.set(false);\r\n        }),\r\n        catchError(() => {\r\n          this.#fetchError.set('Failed to fetch mscoa tree');\r\n          this.loading.set(false);\r\n          return of(undefined);\r\n        }),\r\n        takeUntilDestroyed(this.#destroyRef),\r\n      )\r\n      .subscribe();\r\n  }\r\n\r\n  /** Map the tree account keys into seedable segment templates. */\r\n  #buildTreeSegments(response: IGetTreeResponse | undefined): readonly IIncludedSegmentConfig[] {\r\n    const isCash = this.isCashSegmentConfig();\r\n    const current = this.resolvedValue();\r\n    return (response?.accountTreeKeys ?? []).map((treeKey) => {\r\n      const isItem = treeKey.toLocaleLowerCase() === 'item';\r\n      return {\r\n        id: uuidv4(),\r\n        segment: treeKey,\r\n        singleSelect: true,\r\n        additionalAccounts: [],\r\n        inheritValueFromAccrual: isCash ? !isItem : undefined,\r\n        vatSelectonActive: isCash ? false : isItem,\r\n        segmentExtension: false,\r\n        label: this.#toTitleCase(treeKey),\r\n        readOnly:\r\n          current.find((v) => v.segment === treeKey)?.readOnly ||\r\n          (isCash && !isItem) ||\r\n          false,\r\n      };\r\n    });\r\n  }\r\n\r\n  /** Build the per-segment reactive form. */\r\n  #createSegmentForm(\r\n    segment: IIncludedSegmentConfig = {\r\n      segment: '',\r\n      label: '',\r\n      id: uuidv4(),\r\n      singleSelect: true,\r\n      segmentExtension: false,\r\n      additionalAccounts: [],\r\n      readOnly: false,\r\n    },\r\n  ): FormGroup {\r\n    const isItem = segment.segment?.toLocaleLowerCase() === 'item';\r\n    return this.#fb.group({\r\n      id: [segment.id],\r\n      segment: [segment.segment, Validators.required],\r\n      segmentExtension: [segment.segmentExtension, Validators.required],\r\n      readOnly: [segment.readOnly, Validators.required],\r\n      // Default to a concrete `false` in cash mode: `Validators.required` rejects\r\n      // `undefined` (but accepts `false`), so a brand-new segment whose toggle was\r\n      // never touched would otherwise keep the form invalid and the Save button\r\n      // permanently disabled. Existing values (true/false) pass through unchanged.\r\n      inheritValueFromAccrual: this.isCashSegmentConfig()\r\n        ? [segment.inheritValueFromAccrual ?? false, Validators.required]\r\n        : [segment.inheritValueFromAccrual],\r\n      vatSelectonActive: isItem\r\n        ? [Boolean(segment.vatSelectonActive), Validators.required]\r\n        : [Boolean(segment.vatSelectonActive)],\r\n      additionalAccounts: [segment.additionalAccounts ?? []],\r\n      label: [segment.label, Validators.required],\r\n      singleSelect: [segment.singleSelect, Validators.required],\r\n    });\r\n  }\r\n\r\n  protected startAddNew(): void {\r\n    this.segmentForm = this.#createSegmentForm();\r\n    this.#editState.set({ mode: 'add' });\r\n  }\r\n\r\n  protected startEdit(index: number): void {\r\n    const segment = this.resolvedValue().at(index);\r\n    if (!segment) {\r\n      return;\r\n    }\r\n    this.segmentForm = this.#createSegmentForm(segment);\r\n    this.#editState.set({ mode: 'edit', index });\r\n  }\r\n\r\n  protected cancelEdit(): void {\r\n    this.segmentForm.reset();\r\n    this.#editState.set(IDLE);\r\n  }\r\n\r\n  protected saveSegment(): void {\r\n    if (!this.segmentForm.valid) {\r\n      return;\r\n    }\r\n    const raw = this.segmentForm.getRawValue();\r\n    const label = this.#toTitleCase(String(raw.label ?? ''));\r\n    const newSegment: IIncludedSegmentConfig = {\r\n      id: typeof raw.id === 'string' && raw.id ? raw.id : uuidv4(),\r\n      segment: raw.segment,\r\n      // Multi-level segments derive their key from the (upper-cased) label.\r\n      customSegment: raw.segmentExtension ? label.toLocaleUpperCase() : undefined,\r\n      segmentExtension: Boolean(raw.segmentExtension),\r\n      inheritValueFromAccrual: Boolean(raw.inheritValueFromAccrual),\r\n      vatSelectonActive: Boolean(raw.vatSelectonActive),\r\n      additionalAccounts: Array.isArray(raw.additionalAccounts) ? raw.additionalAccounts : [],\r\n      label,\r\n      singleSelect: Boolean(raw.singleSelect),\r\n      readOnly: Boolean(raw.readOnly),\r\n    };\r\n\r\n    const state = this.#editState();\r\n    const updated = [...this.resolvedValue()];\r\n    if (state.mode === 'add') {\r\n      updated.push(newSegment);\r\n    } else if (state.mode === 'edit') {\r\n      updated[state.index] = newSegment;\r\n    } else {\r\n      return;\r\n    }\r\n\r\n    this.valueChanged.emit(updated);\r\n    this.cancelEdit();\r\n  }\r\n\r\n  protected readOnlyChanged(event: MatSlideToggleChange): void {\r\n    this.segmentForm.patchValue({ readOnly: event.checked });\r\n  }\r\n\r\n  protected singleSelectChange(event: MatSlideToggleChange): void {\r\n    this.segmentForm.patchValue({ singleSelect: event.checked });\r\n  }\r\n\r\n  protected setVatSelectionActive(event: MatSlideToggleChange): void {\r\n    this.segmentForm.patchValue({ vatSelectonActive: event.checked });\r\n  }\r\n\r\n  /** Inherit-from-accrual implies read-only (quirk: toggling on forces read-only). */\r\n  protected setInheritFromAccrual(event: MatSlideToggleChange): void {\r\n    this.segmentForm.patchValue({ inheritValueFromAccrual: event.checked });\r\n    if (event.checked) {\r\n      this.segmentForm.patchValue({ readOnly: true });\r\n    }\r\n  }\r\n\r\n  protected multiLevelSelectChange(event: MatSlideToggleChange): void {\r\n    this.segmentForm.patchValue({ segmentExtension: event.checked });\r\n  }\r\n\r\n  /** Pick a segment; auto-fill the label from it unless this is a multi-level extension. */\r\n  protected selectSegment(event: MatSelectChange): void {\r\n    this.segmentForm.patchValue({ segment: event.value });\r\n    if (!this.segmentForm.value.segmentExtension) {\r\n      this.segmentForm.patchValue({ label: this.#toTitleCase(String(event.value ?? '')) });\r\n    }\r\n  }\r\n\r\n  protected additionalAccountsChanged(event: MatSelectChange): void {\r\n    this.segmentForm.patchValue(\r\n      { additionalAccounts: [...event.value] },\r\n      { emitEvent: true },\r\n    );\r\n  }\r\n\r\n  protected removeSegment(index: number): void {\r\n    const updated = this.resolvedValue().filter((_, i) => i !== index);\r\n    this.valueChanged.emit(updated);\r\n  }\r\n\r\n  /** All account-level custom inputs (peers of the segments — not segment-linked). */\r\n  protected customInputs(): ScoaInnerInput[] {\r\n    return (this.dataValue()?.mscoaConfig?.inputs ?? []).filter((input) => !input.linkedSegmentId);\r\n  }\r\n\r\n  /** Whether custom inputs can be managed (builder callbacks present). */\r\n  protected get canManageInputs(): boolean {\r\n    return !!this.saveCustomInput() && !!this.dataValue()?.id;\r\n  }\r\n\r\n  /** Whether the custom-input add/edit panel is open. */\r\n  protected readonly isCustomInputPanelOpen = computed<boolean>(\r\n    () => this.#customInputState().mode !== 'idle',\r\n  );\r\n\r\n  /** Open the panel to add a new custom input. */\r\n  protected startAddCustomInput(): void {\r\n    this.cancelEdit();\r\n    this.customInputForm = this.#createCustomInputForm();\r\n    this.#customInputState.set({ mode: 'add' });\r\n  }\r\n\r\n  /** Open the panel to edit an existing custom input's basics. */\r\n  protected startEditCustomInput(input: ScoaInnerInput): void {\r\n    this.cancelEdit();\r\n    this.customInputForm = this.#createCustomInputForm(input);\r\n    this.#customInputState.set({ mode: 'edit', id: input.id });\r\n  }\r\n\r\n  /** Close the custom-input panel without saving. */\r\n  protected cancelCustomInput(): void {\r\n    this.customInputForm.reset();\r\n    this.#customInputState.set({ mode: 'idle' });\r\n  }\r\n\r\n  /** Persist the custom-input panel through the builder save callback. */\r\n  protected saveCustomInputPanel(): void {\r\n    const data = this.dataValue();\r\n    if (!this.customInputForm.valid || !data?.id) {\r\n      return;\r\n    }\r\n    const raw = this.customInputForm.getRawValue();\r\n    const label = String(raw.label ?? '').trim();\r\n    this.saveCustomInput()?.(data.sectionId, data.id, {\r\n      id: typeof raw.id === 'string' && raw.id ? raw.id : undefined,\r\n      element: raw.element,\r\n      label,\r\n      formControlName: this.#toControlName(label),\r\n      singleSelect: Boolean(raw.singleSelect),\r\n      readonly: Boolean(raw.readonly),\r\n    });\r\n    this.cancelCustomInput();\r\n  }\r\n\r\n  /** Open a custom input in the builder's input editor for advanced configuration. */\r\n  protected onEditAdvanced(input: ScoaInnerInput): void {\r\n    this.editSegmentInput()?.(input);\r\n  }\r\n\r\n  /** Remove a custom input from the MSCOA config. */\r\n  protected onDeleteInput(input: ScoaInnerInput): void {\r\n    this.deleteSegmentInput()?.(input);\r\n  }\r\n\r\n  /** Build the per-custom-input reactive form (type, label, single-value-selection, read-only). */\r\n  #createCustomInputForm(input?: ScoaInnerInput): FormGroup {\r\n    return this.#fb.group({\r\n      id: [input?.id ?? null],\r\n      element: [input?.element ?? ElementTypes.Input, Validators.required],\r\n      label: [input?.label ?? '', Validators.required],\r\n      singleSelect: [input?.singleSelect ?? true],\r\n      readonly: [input?.readonly ?? false],\r\n    });\r\n  }\r\n\r\n  /** camelCase control name derived from a label (e.g. \"Budget Value\" -> \"budgetValue\"). */\r\n  #toControlName(label: string): string {\r\n    const words = label.match(/[a-z0-9]+/gi) ?? [];\r\n    return words\r\n      .map((word, index) =>\r\n        index === 0\r\n          ? word.toLowerCase()\r\n          : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(),\r\n      )\r\n      .join('');\r\n  }\r\n\r\n  /**\r\n   * A tree template is \"already used\" (and so disabled in the picker) when a\r\n   * segment with the same key is already configured - except for multi-level\r\n   * extensions, which may reuse a key.\r\n   */\r\n  protected alreadyExists(segment: IIncludedSegmentConfig): boolean {\r\n    if (this.segmentForm.value.segmentExtension) {\r\n      return false;\r\n    }\r\n    return this.resolvedValue().some((v) => v.segment === segment.segment);\r\n  }\r\n\r\n  /** Extension-account options drawn from the MSCOA config. */\r\n  protected get extensionAccountsForSegments(): string[] {\r\n    return this.dataValue()?.mscoaConfig?.extensionAccountsForSegments ?? [];\r\n  }\r\n\r\n  /**\r\n   * When `showAllSegments` is on, reconcile the configured value against the full\r\n   * tree. Preserves the deliberate double-emit sync: emit a reset sentinel first,\r\n   * then the merged list on the next microtask so the parent re-renders cleanly.\r\n   */\r\n  #syncAllSegments(): void {\r\n    const templates = this.#treeSegments();\r\n    if (!this.#treeRequested || templates.length === 0) {\r\n      return;\r\n    }\r\n    const current = this.resolvedValue();\r\n    const merged = templates.map((segment) => ({\r\n      ...segment,\r\n      ...(current.find((v) => v.segment === segment.segment) ?? {}),\r\n    }));\r\n\r\n    if (!_isEqual(merged, current)) {\r\n      // Reset sentinel, then the real value, to force downstream re-binding.\r\n      this.valueChanged.emit([{} as IIncludedSegmentConfig]);\r\n      queueMicrotask(() => this.valueChanged.emit(merged));\r\n    }\r\n  }\r\n\r\n  #toTitleCase(str: string): string {\r\n    return str.replace(\r\n      /\\w\\S*/g,\r\n      (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase(),\r\n    );\r\n  }\r\n}\r\n","@if (loading()) {\r\n  <div class=\"mscoa-segment-config__notice\">\r\n    <mat-icon class=\"mscoa-segment-config__notice-icon\">hourglass_top</mat-icon>\r\n    <span>Loading account segments…</span>\r\n  </div>\r\n}\r\n\r\n@if (treeError(); as error) {\r\n  <div class=\"mscoa-segment-config__notice mscoa-segment-config__notice--error\">\r\n    <mat-icon class=\"mscoa-segment-config__notice-icon\">error_outline</mat-icon>\r\n    <span>{{ error }}</span>\r\n  </div>\r\n}\r\n\r\n@if (resolvedValue().length > 0) {\r\n  <div class=\"mscoa-segment-config__section\">\r\n    <p class=\"mscoa-segment-config__section-label\">Configured segments</p>\r\n    <mat-chip-listbox [disabled]=\"disabled()\" aria-label=\"Configured account segments\">\r\n      @for (segment of resolvedValue(); track segment.id; let i = $index) {\r\n        <mat-chip-option\r\n          (removed)=\"removeSegment(i)\"\r\n          (click)=\"startEdit(i)\"\r\n          [value]=\"segment.segment\"\r\n          [selected]=\"isEditing() && !isAddingNew()\">\r\n          <span class=\"mscoa-segment-config__chip-content\">\r\n            <span class=\"mscoa-segment-config__chip-label\">{{ segment.label }}</span>\r\n            <mat-icon class=\"mscoa-segment-config__chip-icon\">\r\n              {{ segment.singleSelect ? 'done' : 'done_all' }}\r\n            </mat-icon>\r\n            <mat-icon class=\"mscoa-segment-config__chip-icon\">\r\n              {{ segment.readOnly ? 'edit_off' : 'edit' }}\r\n            </mat-icon>\r\n          </span>\r\n\r\n          @if (showAllSegments() === false) {\r\n            <button matChipRemove aria-label=\"Remove segment\" [disabled]=\"disabled()\">\r\n              <mat-icon>cancel</mat-icon>\r\n            </button>\r\n          }\r\n        </mat-chip-option>\r\n      }\r\n    </mat-chip-listbox>\r\n  </div>\r\n} @else if (!loading()) {\r\n  <lib-empty-state\r\n    icon=\"account_tree\"\r\n    message=\"No segments configured yet. Add one to begin shaping this MSCOA input.\">\r\n    @if (canAddNew()) {\r\n      <button mat-stroked-button [disabled]=\"disabled()\" (click)=\"startAddNew()\">\r\n        <mat-icon>add</mat-icon>\r\n        Add segment\r\n      </button>\r\n    }\r\n  </lib-empty-state>\r\n}\r\n\r\n@if (canAddNew() && resolvedValue().length > 0) {\r\n  <button\r\n    class=\"mscoa-segment-config__add\"\r\n    mat-stroked-button\r\n    [disabled]=\"disabled()\"\r\n    (click)=\"startAddNew()\">\r\n    <mat-icon>add</mat-icon>\r\n    Add new segment\r\n  </button>\r\n}\r\n\r\n@if (canManageInputs) {\r\n  <!-- Account-level custom inputs (peers of the segments): list + consolidated add/edit panel. -->\r\n  <div class=\"mscoa-segment-config__section\">\r\n    <p class=\"mscoa-segment-config__section-label\">Custom inputs</p>\r\n    <p class=\"mscoa-segment-config__hint\">\r\n      Account-level inputs that sit alongside the segments (e.g. budget value,\r\n      department). Each is a full form input entered per leg; single value\r\n      selection applies one value across debit and credit.\r\n    </p>\r\n\r\n    @for (input of customInputs(); track input.id) {\r\n      <div class=\"mscoa-segment-config__custom-input-row\">\r\n        <mat-icon class=\"mscoa-segment-config__input-icon\">tune</mat-icon>\r\n        <span class=\"mscoa-segment-config__input-label\">\r\n          {{ input.label || input.formControlName || 'Untitled input' }}\r\n        </span>\r\n        <button\r\n          mat-icon-button\r\n          type=\"button\"\r\n          [disabled]=\"disabled()\"\r\n          matTooltip=\"Edit\"\r\n          aria-label=\"Edit input\"\r\n          (click)=\"startEditCustomInput(input)\">\r\n          <mat-icon>edit</mat-icon>\r\n        </button>\r\n        <button\r\n          mat-icon-button\r\n          type=\"button\"\r\n          [disabled]=\"disabled()\"\r\n          matTooltip=\"Advanced settings (validators, calculations, API)\"\r\n          aria-label=\"Advanced settings\"\r\n          (click)=\"onEditAdvanced(input)\">\r\n          <mat-icon>tune</mat-icon>\r\n        </button>\r\n        <button\r\n          mat-icon-button\r\n          type=\"button\"\r\n          [disabled]=\"disabled()\"\r\n          matTooltip=\"Remove\"\r\n          aria-label=\"Remove input\"\r\n          (click)=\"onDeleteInput(input)\">\r\n          <mat-icon>delete_outline</mat-icon>\r\n        </button>\r\n      </div>\r\n    } @empty {\r\n      <p class=\"mscoa-segment-config__hint mscoa-segment-config__hint--muted\">\r\n        No custom inputs yet.\r\n      </p>\r\n    }\r\n\r\n    @if (!isCustomInputPanelOpen()) {\r\n      <button\r\n        class=\"mscoa-segment-config__add-input\"\r\n        mat-stroked-button\r\n        type=\"button\"\r\n        [disabled]=\"disabled()\"\r\n        (click)=\"startAddCustomInput()\">\r\n        <mat-icon>add</mat-icon>\r\n        Add custom input\r\n      </button>\r\n    }\r\n\r\n    @if (isCustomInputPanelOpen()) {\r\n      <mat-card class=\"mscoa-segment-config__panel\" appearance=\"outlined\">\r\n        <mat-card-header>\r\n          <mat-card-subtitle>\r\n            {{ customInputForm.value.id ? 'Update' : 'Add a' }} custom input\r\n          </mat-card-subtitle>\r\n        </mat-card-header>\r\n\r\n        <mat-card-content>\r\n          <form [formGroup]=\"customInputForm\" (ngSubmit)=\"saveCustomInputPanel()\">\r\n            <div class=\"mscoa-segment-config__group\">\r\n              <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\r\n                <mat-label>Input type</mat-label>\r\n                <mat-select formControlName=\"element\" placeholder=\"Select input type\">\r\n                  @for (type of customInputTypes; track type.value) {\r\n                    <mat-option [value]=\"type.value\">{{ type.label }}</mat-option>\r\n                  }\r\n                </mat-select>\r\n                <mat-hint>Use Advanced settings for validators, calculations and API.</mat-hint>\r\n              </mat-form-field>\r\n            </div>\r\n\r\n            <div class=\"mscoa-segment-config__group\">\r\n              <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\r\n                <mat-label>Label</mat-label>\r\n                <input matInput formControlName=\"label\" placeholder=\"Enter label\" />\r\n                <mat-hint>A descriptive name (e.g. 'Budget value', 'Department').</mat-hint>\r\n              </mat-form-field>\r\n            </div>\r\n\r\n            <div class=\"mscoa-segment-config__group\">\r\n              <div class=\"mscoa-segment-config__toggle\">\r\n                <mat-slide-toggle formControlName=\"singleSelect\">Single value selection</mat-slide-toggle>\r\n              </div>\r\n              <p class=\"mscoa-segment-config__hint\">\r\n                When enabled, one value applies across debit and credit; when disabled, a value is\r\n                entered per leg.\r\n              </p>\r\n            </div>\r\n\r\n            <div class=\"mscoa-segment-config__group\">\r\n              <div class=\"mscoa-segment-config__toggle\">\r\n                <mat-slide-toggle formControlName=\"readonly\">Read only</mat-slide-toggle>\r\n              </div>\r\n              <p class=\"mscoa-segment-config__hint\">\r\n                Prevents users from changing the value after initial setup.\r\n              </p>\r\n            </div>\r\n\r\n            <mat-card-actions class=\"mscoa-segment-config__actions\">\r\n              <button mat-button type=\"button\" (click)=\"cancelCustomInput()\">Cancel</button>\r\n              <button mat-flat-button color=\"primary\" type=\"submit\" [disabled]=\"!customInputForm.valid\">\r\n                Save\r\n              </button>\r\n            </mat-card-actions>\r\n          </form>\r\n        </mat-card-content>\r\n      </mat-card>\r\n    }\r\n  </div>\r\n}\r\n\r\n@if (isEditing()) {\r\n  <mat-card class=\"mscoa-segment-config__panel\" appearance=\"outlined\">\r\n    <mat-card-header>\r\n      <mat-card-subtitle>\r\n        {{ isAddingNew() ? 'Add a new' : 'Update' }} segment\r\n      </mat-card-subtitle>\r\n    </mat-card-header>\r\n\r\n    <mat-card-content>\r\n      <form [formGroup]=\"segmentForm\" (ngSubmit)=\"saveSegment()\">\r\n        <div class=\"mscoa-segment-config__group\">\r\n          <div class=\"mscoa-segment-config__toggle\">\r\n            <mat-slide-toggle\r\n              (change)=\"multiLevelSelectChange($event)\"\r\n              [checked]=\"segmentForm.value.segmentExtension\">\r\n              Enable multi-level segmentation\r\n            </mat-slide-toggle>\r\n          </div>\r\n          <p class=\"mscoa-segment-config__hint\">\r\n            Allows sub-classifications within this segment for more detailed accounting hierarchies.\r\n          </p>\r\n\r\n          <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\r\n            <mat-label>Segment</mat-label>\r\n            <mat-select\r\n              (selectionChange)=\"selectSegment($event)\"\r\n              formControlName=\"segment\"\r\n              placeholder=\"Select segment\">\r\n              @for (segment of treeSegments(); track segment.id) {\r\n                <mat-option [disabled]=\"alreadyExists(segment)\" [value]=\"segment.segment\">\r\n                  {{ segment.label }}\r\n                </mat-option>\r\n              }\r\n            </mat-select>\r\n            <mat-hint>Select an account segment type from your chart of accounts.</mat-hint>\r\n          </mat-form-field>\r\n        </div>\r\n\r\n        @if (isCashSegmentConfig()) {\r\n          <div class=\"mscoa-segment-config__group\">\r\n            <div class=\"mscoa-segment-config__toggle\">\r\n              <mat-slide-toggle\r\n                (change)=\"setInheritFromAccrual($event)\"\r\n                [checked]=\"segmentForm.value.inheritValueFromAccrual\">\r\n                Inherit from accrual\r\n              </mat-slide-toggle>\r\n            </div>\r\n            <p class=\"mscoa-segment-config__hint\">\r\n              When enabled, changes to the accrual value reflect here automatically.\r\n            </p>\r\n          </div>\r\n        }\r\n\r\n        <div class=\"mscoa-segment-config__group\">\r\n          <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\r\n            <mat-label>Label</mat-label>\r\n            <input\r\n              matInput\r\n              formControlName=\"label\"\r\n              [readonly]=\"!segmentForm.value.segmentExtension\"\r\n              placeholder=\"Enter label\" />\r\n            <mat-hint>\r\n              A descriptive name for this segment (e.g. 'Department', 'Project', 'Cost Center').\r\n            </mat-hint>\r\n          </mat-form-field>\r\n        </div>\r\n\r\n        <div class=\"mscoa-segment-config__group\">\r\n          <div class=\"mscoa-segment-config__toggle\">\r\n            <mat-slide-toggle\r\n              (change)=\"singleSelectChange($event)\"\r\n              [checked]=\"segmentForm.value.singleSelect\">\r\n              Single value selection\r\n            </mat-slide-toggle>\r\n          </div>\r\n          <p class=\"mscoa-segment-config__hint\">\r\n            When enabled, transactions are assigned to one value within this segment; when disabled,\r\n            they can be split across multiple values.\r\n          </p>\r\n        </div>\r\n\r\n        @if (segmentForm.value.segment?.toLocaleLowerCase() === 'item') {\r\n          <div class=\"mscoa-segment-config__group\">\r\n            <div class=\"mscoa-segment-config__toggle\">\r\n              <mat-slide-toggle\r\n                (change)=\"setVatSelectionActive($event)\"\r\n                [checked]=\"segmentForm.value.vatSelectonActive\">\r\n                Require VAT account selection\r\n              </mat-slide-toggle>\r\n            </div>\r\n            <p class=\"mscoa-segment-config__hint\">\r\n              When active, users must specify a VAT account for taxable items.\r\n            </p>\r\n          </div>\r\n        }\r\n\r\n        <div class=\"mscoa-segment-config__group\">\r\n          <div class=\"mscoa-segment-config__toggle\">\r\n            <mat-slide-toggle\r\n              (change)=\"readOnlyChanged($event)\"\r\n              [checked]=\"segmentForm.value.readOnly\">\r\n              Read-only segment\r\n            </mat-slide-toggle>\r\n          </div>\r\n          <p class=\"mscoa-segment-config__hint\">\r\n            Prevents users from modifying segment values after initial setup. Use for regulatory or\r\n            policy-controlled segments.\r\n          </p>\r\n        </div>\r\n\r\n        <div class=\"mscoa-segment-config__group\">\r\n          <mat-form-field subscriptSizing=\"dynamic\" floatLabel=\"always\" appearance=\"outline\">\r\n            <mat-label>Additional accounts</mat-label>\r\n            <mat-select\r\n              (selectionChange)=\"additionalAccountsChanged($event)\"\r\n              formControlName=\"additionalAccounts\"\r\n              multiple\r\n              placeholder=\"Select counter accounts\">\r\n              @for (ext of extensionAccountsForSegments; track ext) {\r\n                <mat-option [value]=\"ext\">{{ ext }}</mat-option>\r\n              }\r\n            </mat-select>\r\n            <mat-hint>\r\n              Add supporting accounts for this segment (e.g. VAT or tax accounts).\r\n            </mat-hint>\r\n          </mat-form-field>\r\n        </div>\r\n\r\n        <mat-card-actions class=\"mscoa-segment-config__actions\">\r\n          <button mat-button type=\"button\" (click)=\"cancelEdit()\">Cancel</button>\r\n          <button mat-flat-button color=\"primary\" type=\"submit\" [disabled]=\"!segmentForm.valid\">\r\n            Save\r\n          </button>\r\n        </mat-card-actions>\r\n      </form>\r\n    </mat-card-content>\r\n  </mat-card>\r\n}\r\n"],"names":["uuidv4","i5","i6","i7","i9","i10"],"mappings":"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"}