{"version":3,"file":"ngx-t-forms-validators-config.component-0_Y6bvtE.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/validators-config/validators-config.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/validators-config/validators-config.component.html"],"sourcesContent":["import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  type OnDestroy,\r\n  ViewEncapsulation,\r\n  computed,\r\n  inject,\r\n  input,\r\n  output,\r\n  signal,\r\n} from '@angular/core';\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport type {\r\n  DraftFormControlCustomValidator,\r\n  FormColumnInputs,\r\n  FormControlCustomValidatorsInterface,\r\n} from 'ngx-t-forms-types';\r\nimport { CalculationFunctions, InputDataTypes, InputTypes } from 'ngx-t-forms-types';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Subject } from 'rxjs';\r\n\r\nimport { evaluatePredicate } from '../../../../shared/functions/array-access/predicate-dsl';\r\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport {\r\n  type FieldBinding,\r\n  PREDICATE_OPERATORS,\r\n  type ValidatorCondition,\r\n  type ValidatorConditionGroup,\r\n  deriveObservedInputs,\r\n  emptyCondition,\r\n  parseConditions,\r\n  referencedTokens,\r\n  serializeConditions,\r\n} from './validator-condition';\r\n\r\n/** A selectable field in the condition builder's field/value dropdowns. */\r\ninterface FieldOption {\r\n  readonly variable: string;\r\n  readonly label: string;\r\n  readonly isSelf: boolean;\r\n  /** A multiple-input column (lives inside a repeatable group). */\r\n  readonly isMultiple: boolean;\r\n  /** Whether the field holds a numeric value (gates numeric aggregates). */\r\n  readonly numeric: boolean;\r\n  /** The input read at runtime: a primary input id, or a list sub-item id. */\r\n  readonly inputId: string;\r\n  /** Row-array container id, for multiple-input columns. */\r\n  readonly parentInputId?: string;\r\n}\r\n\r\n/** A friendly aggregate choice shown for a referenced list field. */\r\ninterface AggregateOption {\r\n  readonly value: CalculationFunctions;\r\n  readonly label: string;\r\n}\r\n\r\n/**\r\n * Internal editor implementing `MatFormFieldControl<FormControlCustomValidatorsInterface[]>`\r\n * for authoring a form input's custom validators.\r\n *\r\n * Rendered by `t-dynamic-data-edit` inside its `<mat-form-field>`, which supplies\r\n * the surrounding field label, hint, and validation errors — so this component\r\n * owns only the validator chip list and the inline draft editor.\r\n *\r\n * ### Authoring model\r\n * A validator's `expression` is evaluated by the shared predicate DSL where\r\n * **`true` means the field is invalid** (the error message is then shown). The\r\n * editor captures that condition through a **guided builder** — `field operator\r\n * value` rows joined by All/Any — that serialises to the expression string and\r\n * auto-derives `inputsObservedForChanges` from the fields it references. An\r\n * **Advanced** raw editor is the escape hatch for expressions the builder cannot\r\n * represent (grouping, mixed connectors, negation); these round-trip unchanged.\r\n *\r\n * The bound `value` may contain both string entries (legacy validator-name\r\n * references such as `'required'`, which are read-only) and object entries\r\n * ({@link FormControlCustomValidatorsInterface}, which are editable). Only object\r\n * entries open the draft editor.\r\n *\r\n * NOTE: `MatFormFieldControl<T>` mandates plain mutable `value` / `disabled` /\r\n * `required` / `placeholder` / `id` members, `@Input()` decorators, the\r\n * `focused` / `touched` / `stateChanges` members, and the `useExisting`\r\n * provider. These are framework wiring, not defects — the CLAUDE.md bans on\r\n * `@Input()` / `useExisting` do not apply to MatFormFieldControl integration.\r\n */\r\n@Component({\r\n  selector: 'lib-validators-config',\r\n  templateUrl: './validators-config.component.html',\r\n  styleUrls: ['./validators-config.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  imports: [\r\n    CommonModule,\r\n    MatIconModule,\r\n    MatChipsModule,\r\n    MatCardModule,\r\n    MatToolbarModule,\r\n    MatButtonModule,\r\n    MatButtonToggleModule,\r\n    MatSlideToggleModule,\r\n    MatTooltipModule,\r\n  ],\r\n  providers: [{ provide: MatFormFieldControl, useExisting: ValidatorsConfigComponent }],\r\n  host: {\r\n    'class': 'lib-validators-config',\r\n    '[attr.id]': 'id',\r\n  },\r\n})\r\nexport class ValidatorsConfigComponent\r\n  implements MatFormFieldControl<FormControlCustomValidatorsInterface[]>, OnDestroy\r\n{\r\n  static nextId = 0;\r\n\r\n  /** Emits whenever a piece of `MatFormFieldControl` state changes. */\r\n  readonly stateChanges = new Subject<void>();\r\n  readonly controlType = 'lib-validators-config';\r\n\r\n  id = `lib-validators-config-${ValidatorsConfigComponent.nextId++}`;\r\n  placeholder = '';\r\n  focused = false;\r\n  touched = false;\r\n  required = false;\r\n  describedBy = '';\r\n  autofilled: boolean | undefined = undefined;\r\n  userAriaDescribedBy: string | undefined = undefined;\r\n  disableAutomaticLabeling: boolean | undefined = undefined;\r\n\r\n  /** Whether the editor is inert. Kept as `@Input()` for the MFC contract. */\r\n  @Input() disabled = false;\r\n  /** Current validator list. Kept as `@Input()` for the MFC contract. */\r\n  @Input() value: FormControlCustomValidatorsInterface[] = [];\r\n  /** Validation errors surfaced by the parent for error-state derivation. */\r\n  @Input() errors: IConfigElementError[] | undefined = [];\r\n\r\n  /** Source input that owns this validator config (for multiple-input scopes). */\r\n  readonly mapToData = input<FormColumnInputs | undefined>(undefined);\r\n  /** Available form inputs offered as variables. */\r\n  readonly formInputs = input<Array<FormColumnInputs>>([]);\r\n\r\n  /** Emits the full validator list whenever it changes. */\r\n  readonly valueChanged = output<FormControlCustomValidatorsInterface[]>();\r\n\r\n  /** Operator choices shared with the array-access predicate builder. */\r\n  protected readonly operators = PREDICATE_OPERATORS;\r\n\r\n  /** Aggregate choices for a list field, with non-technical labels. */\r\n  protected readonly aggregates: readonly AggregateOption[] = [\r\n    { value: CalculationFunctions.Sum, label: 'total' },\r\n    { value: CalculationFunctions.Avg, label: 'average' },\r\n    { value: CalculationFunctions.Min, label: 'lowest' },\r\n    { value: CalculationFunctions.Max, label: 'highest' },\r\n    { value: CalculationFunctions.Count, label: 'count' },\r\n  ];\r\n\r\n  readonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n  readonly ngControl = inject(NgControl, { self: true, optional: true });\r\n\r\n  /** Draft currently open in the inline editor, or `null` when closed. */\r\n  readonly #edit = signal<DraftFormControlCustomValidator | null>(null);\r\n  /** Read-only view of the open draft for the template. */\r\n  protected readonly edit = this.#edit.asReadonly();\r\n\r\n  /** Guided builder model mirroring the open draft's expression. */\r\n  readonly #group = signal<ValidatorConditionGroup>({ connector: '&&', conditions: [] });\r\n  protected readonly group = this.#group.asReadonly();\r\n\r\n  /** Whether the draft is being edited as a raw expression instead of guided rows. */\r\n  readonly #raw = signal(false);\r\n  protected readonly raw = this.#raw.asReadonly();\r\n\r\n  /** Chosen aggregate per referenced list variable (keyed by variable name). */\r\n  readonly #functions = signal<Record<string, CalculationFunctions>>({});\r\n\r\n  /** Whether the validator being authored lives on a multiple-input sub-item. */\r\n  protected readonly validatorOnList = computed<boolean>(\r\n    () => !!this.mapToData()?.multipleInputInEditId,\r\n  );\r\n\r\n  /**\r\n   * Fields the builder can reference: every primary input plus every\r\n   * multiple-input column. A multiple column carries its row-array container\r\n   * (`parentInputId`); whether it must be aggregated is decided per condition\r\n   * (see {@link requiredAggregateVariables}), not by the field itself.\r\n   */\r\n  protected readonly fieldOptions = computed<readonly FieldOption[]>(() => {\r\n    const self = this.mapToData();\r\n    const selfId = self?.id;\r\n    const options: FieldOption[] = [];\r\n    for (const input of this.formInputs()) {\r\n      if (!input.formControlName) continue;\r\n      const group = input.multipleInputInEditId;\r\n      options.push({\r\n        variable: input.formControlName,\r\n        label: input.label || input.formControlName,\r\n        isSelf: input.id === selfId,\r\n        isMultiple: !!group,\r\n        numeric: this.#isNumeric(input),\r\n        inputId: group ? input.id : (input.originalId ?? input.id),\r\n        parentInputId: group,\r\n      });\r\n    }\r\n    return options;\r\n  });\r\n\r\n  /** Primary (scalar) fields, for the first dropdown group. */\r\n  protected readonly directFields = computed<readonly FieldOption[]>(() =>\r\n    this.fieldOptions().filter((f) => !f.isMultiple),\r\n  );\r\n\r\n  /** Multiple-input columns, for the second dropdown group. */\r\n  protected readonly listFields = computed<readonly FieldOption[]>(() =>\r\n    this.fieldOptions().filter((f) => f.isMultiple),\r\n  );\r\n\r\n  /** Field option keyed by its expression variable, for operand lookups. */\r\n  readonly #fieldByVariable = computed<ReadonlyMap<string, FieldOption>>(\r\n    () => new Map(this.fieldOptions().map((f) => [f.variable, f])),\r\n  );\r\n\r\n  /** Multiple-input columns actually referenced by the current expression. */\r\n  protected readonly referencedListFields = computed<readonly FieldOption[]>(() => {\r\n    const tokens = referencedTokens(this.#edit()?.expression ?? '');\r\n    return this.listFields().filter((f) => tokens.has(f.variable));\r\n  });\r\n\r\n  /**\r\n   * Multiple-input variables that MUST be aggregated: a list column compared\r\n   * against a non-list operand (a primary field or a typed value) has to be\r\n   * reduced to a single value. A list-vs-list comparison leaves the aggregate\r\n   * optional (the columns are row-aligned). In raw mode operand pairing cannot\r\n   * be analysed, so every referenced list column is treated as required.\r\n   */\r\n  protected readonly requiredAggregateVariables = computed<ReadonlySet<string>>(() => {\r\n    if (this.#raw()) {\r\n      return new Set(this.referencedListFields().map((f) => f.variable));\r\n    }\r\n    const byVariable = this.#fieldByVariable();\r\n    const required = new Set<string>();\r\n    for (const cond of this.#group().conditions) {\r\n      const left = byVariable.get(cond.field);\r\n      const right = cond.compareTo === 'field' ? byVariable.get(cond.value) : undefined;\r\n      const leftMultiple = !!left?.isMultiple;\r\n      const rightMultiple = !!right?.isMultiple;\r\n      if (leftMultiple && !rightMultiple) required.add(cond.field);\r\n      if (rightMultiple && !leftMultiple && right) required.add(right.variable);\r\n    }\r\n    return required;\r\n  });\r\n\r\n  /** Whether every list column that MUST be aggregated has an aggregate chosen. */\r\n  protected readonly aggregatesResolved = computed<boolean>(() => {\r\n    const functions = this.#functions();\r\n    const required = this.requiredAggregateVariables();\r\n    return [...required].every((variable) => !!functions[variable]);\r\n  });\r\n\r\n  /** Aggregates offered for a field: numeric columns get all, others only count. */\r\n  protected aggregatesFor(field: FieldOption): readonly AggregateOption[] {\r\n    return field.numeric\r\n      ? this.aggregates\r\n      : this.aggregates.filter((a) => a.value === CalculationFunctions.Count);\r\n  }\r\n\r\n  /** Whether a referenced list column is required to have an aggregate. */\r\n  protected isAggregateRequired(variable: string): boolean {\r\n    return this.requiredAggregateVariables().has(variable);\r\n  }\r\n\r\n  /**\r\n   * Whether a guided condition is fully specified (field, operator and a value\r\n   * all set). Incomplete conditions are otherwise silently dropped on save, so\r\n   * this gates {@link canSave}.\r\n   */\r\n  protected isConditionComplete(condition: ValidatorCondition): boolean {\r\n    return (\r\n      condition.field.trim() !== '' &&\r\n      condition.operator.trim() !== '' &&\r\n      condition.value.trim() !== ''\r\n    );\r\n  }\r\n\r\n  /** Whether the guided builder has at least one condition and all are complete. */\r\n  protected readonly conditionsComplete = computed<boolean>(() => {\r\n    if (this.#raw()) return true; // raw mode is gated by syntaxError + non-empty\r\n    const conditions = this.#group().conditions;\r\n    return conditions.length > 0 && conditions.every((c) => this.isConditionComplete(c));\r\n  });\r\n\r\n  /** Whether the current draft expression can be edited in the guided builder. */\r\n  protected readonly canUseGuided = computed<boolean>(\r\n    () => parseConditions(this.#edit()?.expression ?? '', this.#fieldNameSet()) !== null,\r\n  );\r\n\r\n  /** Human-readable syntax error for the raw editor, or `null` when valid/empty. */\r\n  protected readonly syntaxError = computed<string | null>(() => {\r\n    const expression = this.#edit()?.expression ?? '';\r\n    if (expression.trim() === '') return null;\r\n    try {\r\n      evaluatePredicate(expression, {});\r\n      return null;\r\n    } catch (error: unknown) {\r\n      return error instanceof Error ? error.message : 'The expression syntax is invalid.';\r\n    }\r\n  });\r\n\r\n  /** Whether the open draft can be saved (message, a complete/valid rule, aggregates chosen). */\r\n  protected readonly canSave = computed<boolean>(() => {\r\n    const draft = this.#edit();\r\n    return (\r\n      !!draft &&\r\n      !!draft.message &&\r\n      !!draft.expression &&\r\n      this.syntaxError() === null &&\r\n      this.conditionsComplete() &&\r\n      this.aggregatesResolved()\r\n    );\r\n  });\r\n\r\n  /** A one-line reason the rule cannot be saved yet, or `null` when it can. */\r\n  protected readonly saveHint = computed<string | null>(() => {\r\n    const draft = this.#edit();\r\n    if (!draft) return null;\r\n    if (!draft.message) return 'Add an error message.';\r\n    if (!this.#raw() && !this.conditionsComplete()) {\r\n      return 'Finish every condition — choose a field, a condition and a value.';\r\n    }\r\n    if (!draft.expression) return 'Add at least one condition.';\r\n    if (this.#raw() && this.syntaxError() !== null) return this.syntaxError();\r\n    if (!this.aggregatesResolved()) return 'Choose how to combine each list field.';\r\n    return null;\r\n  });\r\n\r\n  // MatFormFieldControl reads these as plain getters during its own change\r\n  // detection, so they stay getters rather than `computed()` signals.\r\n\r\n  get empty(): boolean {\r\n    return this.value.length === 0;\r\n  }\r\n\r\n  get shouldLabelFloat(): boolean {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  get errorState(): boolean {\r\n    const ngControlError = this.ngControl?.errors != null;\r\n    const externalError = (this.errors?.length ?? 0) > 0 && this.touched;\r\n    const requiredUnset = this.empty && this.required;\r\n    return requiredUnset || ngControlError || externalError;\r\n  }\r\n\r\n  setDescribedByIds(ids: string[]): void {\r\n    this.describedBy = ids.join(' ');\r\n    const el = this.#elementRef.nativeElement;\r\n    const controlElement = el.querySelector('.lib-validators-config__list');\r\n    controlElement?.setAttribute('aria-describedby', this.describedBy);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  onContainerClick(): void {\r\n    this.markAsTouched();\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  onTouched: () => void = () => {};\r\n\r\n  markAsTouched(): void {\r\n    if (!this.touched) {\r\n      this.touched = true;\r\n      this.onTouched();\r\n      this.stateChanges.next();\r\n    }\r\n  }\r\n\r\n  /** Tear down the MFC state stream so subscribers do not leak. */\r\n  ngOnDestroy(): void {\r\n    this.stateChanges.complete();\r\n  }\r\n\r\n  /** `@for` track key: object validators by id, string validators by value. */\r\n  protected trackValidator(\r\n    validator: string | FormControlCustomValidatorsInterface,\r\n  ): string {\r\n    return typeof validator === 'string' ? validator : validator.id;\r\n  }\r\n\r\n  /** Resolve the label shown on a validator chip. */\r\n  protected validatorLabel(validator: string | FormControlCustomValidatorsInterface): string {\r\n    return typeof validator === 'string' ? validator : validator.message;\r\n  }\r\n\r\n  /** Whether a validator chip is the one currently being edited. */\r\n  protected isEditing(validator: string | FormControlCustomValidatorsInterface): boolean {\r\n    if (typeof validator === 'string') {\r\n      return false;\r\n    }\r\n    return this.#edit()?.id === validator.id;\r\n  }\r\n\r\n  /**\r\n   * Open a validator for editing. String entries are read-only legacy\r\n   * references and are ignored. Editing the open validator again closes it.\r\n   * The draft is a clone, so edits only land in `value` on Save.\r\n   *\r\n   * DEFECT FIX (discard semantics): the editor is an inline panel with an\r\n   * explicit Close/Save toolbar, not a transient overlay that vanishes on an\r\n   * outside click. Opening a different validator (or {@link addValidator})\r\n   * deliberately replaces the open draft — an explicit, documented discard,\r\n   * never a silent loss mid-edit.\r\n   */\r\n  protected editV(validator: string | FormControlCustomValidatorsInterface): void {\r\n    if (typeof validator === 'string') {\r\n      return;\r\n    }\r\n    if (this.#edit()?.id === validator.id) {\r\n      this.#edit.set(null);\r\n      return;\r\n    }\r\n    this.#edit.set(this.#cloneValidator(validator));\r\n    this.#initBuilderFromDraft();\r\n  }\r\n\r\n  /** Begin a brand-new validator draft (id assigned on save). */\r\n  protected addValidator(): void {\r\n    this.#edit.set(this.#emptyDraft());\r\n    this.#initBuilderFromDraft();\r\n  }\r\n\r\n  /** Discard the open draft without persisting it. */\r\n  protected closeEditor(): void {\r\n    this.#edit.set(null);\r\n  }\r\n\r\n  /** Remove a validator (string or object) from the list and emit. */\r\n  protected remove(validator: string | FormControlCustomValidatorsInterface): void {\r\n    const next = this.value.filter((item) => !this.#sameValidator(item, validator));\r\n    this.#commit(next);\r\n    if (this.isEditing(validator)) {\r\n      this.#edit.set(null);\r\n    }\r\n  }\r\n\r\n  /** Update the draft's message, or replace its raw expression as the user types. */\r\n  protected onTextChange(event: Event, key: 'message' | 'expression'): void {\r\n    const value = (event.target as HTMLInputElement).value;\r\n    if (key === 'expression') {\r\n      this.#syncExpression(value);\r\n      return;\r\n    }\r\n    this.#edit.update((draft) => {\r\n      const base = draft ?? this.#emptyDraft();\r\n      return { ...base, message: value };\r\n    });\r\n  }\r\n\r\n  /** Toggle whether users may override (warn instead of block) this validator. */\r\n  protected setCanOverride(checked: boolean): void {\r\n    this.#edit.update((draft) => (draft ? { ...draft, canOverride: checked } : draft));\r\n  }\r\n\r\n  /**\r\n   * Persist the open draft. A new draft (no id) is appended with a fresh uuid;\r\n   * an existing draft (has id) replaces the matching entry. Emits the new list.\r\n   */\r\n  protected saveVariable(): void {\r\n    const draft = this.#edit();\r\n    if (!draft || !draft.message || !draft.expression) {\r\n      return;\r\n    }\r\n    if (draft.id !== undefined) {\r\n      const id = draft.id;\r\n      const saved: FormControlCustomValidatorsInterface = { ...draft, id };\r\n      this.#commit(\r\n        this.value.map((item) =>\r\n          typeof item !== 'string' && item.id === id ? saved : item,\r\n        ),\r\n      );\r\n    } else {\r\n      const saved: FormControlCustomValidatorsInterface = { ...draft, id: uuidv4() };\r\n      this.#commit([...this.value, saved]);\r\n    }\r\n    this.#edit.set(null);\r\n  }\r\n\r\n  // ---- guided condition builder ------------------------------------------\r\n\r\n  /** Switch the All/Any connector joining the conditions. */\r\n  protected setConnector(connector: '&&' | '||'): void {\r\n    this.#applyGroup({ ...this.#group(), connector });\r\n  }\r\n\r\n  /** Append a fresh condition, defaulting its field to the owning input. */\r\n  protected addCondition(): void {\r\n    const fallback =\r\n      this.directFields().find((f) => f.isSelf) ??\r\n      this.directFields()[0] ??\r\n      this.fieldOptions()[0];\r\n    const group = this.#group();\r\n    this.#applyGroup({\r\n      ...group,\r\n      conditions: [...group.conditions, emptyCondition(fallback?.variable ?? '')],\r\n    });\r\n  }\r\n\r\n  /** Apply a partial change to the condition at `index`. */\r\n  protected updateCondition(index: number, patch: Partial<ValidatorCondition>): void {\r\n    const group = this.#group();\r\n    const conditions = group.conditions.map((c, i) => (i === index ? { ...c, ...patch } : c));\r\n    this.#applyGroup({ ...group, conditions });\r\n  }\r\n\r\n  /** Flip a condition between comparing to a typed value and another field. */\r\n  protected toggleCompareTo(index: number): void {\r\n    const condition = this.#group().conditions[index];\r\n    if (!condition) return;\r\n    if (condition.compareTo === 'value') {\r\n      const field = this.fieldOptions().find((f) => f.variable !== condition.field);\r\n      this.updateCondition(index, { compareTo: 'field', value: field?.variable ?? '' });\r\n    } else {\r\n      this.updateCondition(index, { compareTo: 'value', value: '' });\r\n    }\r\n  }\r\n\r\n  /** Remove the condition at `index`. */\r\n  protected removeCondition(index: number): void {\r\n    const group = this.#group();\r\n    this.#applyGroup({ ...group, conditions: group.conditions.filter((_, i) => i !== index) });\r\n  }\r\n\r\n  /**\r\n   * Choose (or clear, by re-clicking) the aggregate that reduces a referenced\r\n   * list field to a single value.\r\n   */\r\n  protected setFunction(variable: string, fn: CalculationFunctions): void {\r\n    this.#functions.update((current) => {\r\n      const next = { ...current };\r\n      if (next[variable] === fn) {\r\n        delete next[variable];\r\n      } else {\r\n        next[variable] = fn;\r\n      }\r\n      return next;\r\n    });\r\n    // The expression text is unchanged, but the observed deps now carry the\r\n    // aggregate — re-sync so inputsObservedForChanges reflects the choice.\r\n    this.#syncExpression(this.#edit()?.expression ?? '');\r\n  }\r\n\r\n  /** The aggregate currently chosen for a list variable, if any. */\r\n  protected currentFunction(variable: string): CalculationFunctions | undefined {\r\n    return this.#functions()[variable];\r\n  }\r\n\r\n  /** Switch to the raw expression editor. */\r\n  protected useRaw(): void {\r\n    this.#raw.set(true);\r\n  }\r\n\r\n  /** Switch back to the guided builder, reparsing the current expression. */\r\n  protected useGuided(): void {\r\n    if (!this.canUseGuided()) return;\r\n    this.#initGroupFromExpression();\r\n    this.#raw.set(false);\r\n  }\r\n\r\n  /** Read the value-event target as a string. */\r\n  protected inputValue(event: Event): string {\r\n    return (event.target as HTMLInputElement | HTMLSelectElement).value;\r\n  }\r\n\r\n  // ---- internal ----------------------------------------------------------\r\n\r\n  #emptyDraft(): DraftFormControlCustomValidator {\r\n    return {\r\n      message: '',\r\n      expression: '',\r\n      canOverride: false,\r\n      inputsObservedForChanges: [],\r\n    };\r\n  }\r\n\r\n  #cloneValidator(\r\n    validator: FormControlCustomValidatorsInterface,\r\n  ): DraftFormControlCustomValidator {\r\n    return {\r\n      ...validator,\r\n      inputsObservedForChanges: validator.inputsObservedForChanges.map((i) => ({ ...i })),\r\n    };\r\n  }\r\n\r\n  #sameValidator(\r\n    item: string | FormControlCustomValidatorsInterface,\r\n    target: string | FormControlCustomValidatorsInterface,\r\n  ): boolean {\r\n    if (typeof item === 'string' || typeof target === 'string') {\r\n      return item === target;\r\n    }\r\n    return item.id === target.id;\r\n  }\r\n\r\n  /** Set of field variable names the builder recognises (for parsing). */\r\n  #fieldNameSet(): ReadonlySet<string> {\r\n    return new Set(this.fieldOptions().map((f) => f.variable));\r\n  }\r\n\r\n  /** Whether an input carries a numeric data type. */\r\n  #isNumeric(input: FormColumnInputs): boolean {\r\n    return input.dataType === InputDataTypes.Number || input.type === InputTypes.Number;\r\n  }\r\n\r\n  /** Recover the per-variable aggregate choices from a draft's observed inputs. */\r\n  #functionsFromDraft(): Record<string, CalculationFunctions> {\r\n    const map: Record<string, CalculationFunctions> = {};\r\n    for (const observed of this.#edit()?.inputsObservedForChanges ?? []) {\r\n      if (observed.function) map[observed.variable] = observed.function;\r\n    }\r\n    return map;\r\n  }\r\n\r\n  /** Seed the builder state when a draft opens: guided if parseable, else raw. */\r\n  #initBuilderFromDraft(): void {\r\n    this.#functions.set(this.#functionsFromDraft());\r\n    const parsed = parseConditions(this.#edit()?.expression ?? '', this.#fieldNameSet());\r\n    if (parsed) {\r\n      this.#group.set(parsed);\r\n      this.#raw.set(false);\r\n    } else {\r\n      this.#raw.set(true);\r\n    }\r\n  }\r\n\r\n  /** Reparse the current draft expression into the guided model. */\r\n  #initGroupFromExpression(): void {\r\n    const parsed = parseConditions(this.#edit()?.expression ?? '', this.#fieldNameSet());\r\n    if (parsed) {\r\n      this.#group.set(parsed);\r\n    }\r\n  }\r\n\r\n  /** Store a builder change: update the model, then serialise into the draft. */\r\n  #applyGroup(next: ValidatorConditionGroup): void {\r\n    this.#group.set(next);\r\n    this.#syncExpression(serializeConditions(next));\r\n  }\r\n\r\n  /** Write an expression onto the draft and re-derive its observed-input deps. */\r\n  #syncExpression(expression: string): void {\r\n    const fields: readonly FieldBinding[] = this.fieldOptions();\r\n    const functions = this.#functions();\r\n    this.#edit.update((draft) => {\r\n      const base = draft ?? this.#emptyDraft();\r\n      return {\r\n        ...base,\r\n        expression,\r\n        inputsObservedForChanges: deriveObservedInputs(expression, fields, functions),\r\n      };\r\n    });\r\n  }\r\n\r\n  /** Single mutation path: store the new list and notify the parent. */\r\n  #commit(next: FormControlCustomValidatorsInterface[]): void {\r\n    this.value = next;\r\n    this.markAsTouched();\r\n    this.stateChanges.next();\r\n    this.valueChanged.emit([...next]);\r\n  }\r\n}\r\n","<section class=\"lib-validators-config__list\">\r\n  <h5 class=\"lib-validators-config__title\">Validation rules</h5>\r\n\r\n  <p class=\"lib-validators-config__hint\">\r\n    <mat-icon class=\"lib-validators-config__hint-icon\">lightbulb</mat-icon>\r\n    <span>Each rule shows its message when its condition is true — describe when the entry is\r\n      <strong>wrong</strong>.</span>\r\n  </p>\r\n\r\n  <mat-chip-listbox [disabled]=\"disabled\" aria-label=\"Validation rules\">\r\n    @for (validator of value; track trackValidator(validator)) {\r\n    <mat-chip-option\r\n      class=\"lib-validators-config__chip\"\r\n      [selected]=\"isEditing(validator)\"\r\n      (click)=\"editV(validator)\"\r\n    >\r\n      <span class=\"lib-validators-config__chip-label\">\r\n        {{ validatorLabel(validator) | titlecase }}\r\n      </span>\r\n\r\n      @if (isEditing(validator)) {\r\n      <mat-icon matChipTrailingIcon>check_circle</mat-icon>\r\n      } @else {\r\n      <button matChipRemove [attr.aria-label]=\"'remove validator'\" (click)=\"remove(validator)\">\r\n        <mat-icon>cancel</mat-icon>\r\n      </button>\r\n      }\r\n    </mat-chip-option>\r\n    }\r\n\r\n    @if (!edit()) {\r\n    <mat-chip-option\r\n      class=\"lib-validators-config__add\"\r\n      matTooltip=\"Add a new validation rule\"\r\n      [selectable]=\"false\"\r\n      [disabled]=\"disabled\"\r\n      (click)=\"addValidator()\"\r\n    >\r\n      Add rule\r\n      <mat-icon matChipTrailingIcon>add</mat-icon>\r\n    </mat-chip-option>\r\n    }\r\n  </mat-chip-listbox>\r\n</section>\r\n\r\n@if (edit(); as draft) {\r\n<mat-card class=\"lib-validators-config__editor\" (click)=\"$event.stopPropagation()\">\r\n  <label class=\"lib-validators-config__field\">\r\n    <span class=\"lib-validators-config__f-label\">Error message</span>\r\n    <textarea\r\n      class=\"lib-validators-config__control lib-validators-config__textarea\"\r\n      rows=\"2\"\r\n      [value]=\"draft.message\"\r\n      (input)=\"onTextChange($event, 'message')\"\r\n      placeholder=\"e.g. End date must be after the start date\"\r\n    ></textarea>\r\n  </label>\r\n\r\n  <div class=\"lib-validators-config__condition-head\">\r\n    <span class=\"lib-validators-config__f-label\">Show this error when</span>\r\n    @if (!raw() && group().conditions.length > 1) {\r\n    <div class=\"lib-validators-config__match\">\r\n      <mat-button-toggle-group\r\n        class=\"lib-validators-config__seg\"\r\n        [value]=\"group().connector\"\r\n        hideSingleSelectionIndicator\r\n        (change)=\"setConnector($event.value)\"\r\n        aria-label=\"Combine conditions\"\r\n      >\r\n        <mat-button-toggle value=\"&&\">All</mat-button-toggle>\r\n        <mat-button-toggle value=\"||\">Any</mat-button-toggle>\r\n      </mat-button-toggle-group>\r\n      <span class=\"lib-validators-config__muted\">of these match</span>\r\n    </div>\r\n    }\r\n  </div>\r\n\r\n  @if (raw()) {\r\n  <label class=\"lib-validators-config__field\">\r\n    <span class=\"lib-validators-config__f-label\">Expression</span>\r\n    <textarea\r\n      class=\"lib-validators-config__control lib-validators-config__textarea lib-validators-config__mono\"\r\n      rows=\"2\"\r\n      [value]=\"draft.expression\"\r\n      (input)=\"onTextChange($event, 'expression')\"\r\n      placeholder='e.g. endDate < startDate'\r\n    ></textarea>\r\n  </label>\r\n  @if (syntaxError(); as error) {\r\n  <p class=\"lib-validators-config__error\">\r\n    <mat-icon class=\"lib-validators-config__error-icon\">error_outline</mat-icon>\r\n    <span>{{ error }}</span>\r\n  </p>\r\n  } @else {\r\n  <p class=\"lib-validators-config__sub-hint\">\r\n    True means the entry is invalid. Reference a field by its name; comparisons use\r\n    <code>===</code>, <code>&gt;</code>, <code>includes</code> …\r\n  </p>\r\n  }\r\n  } @else {\r\n  @if (fieldOptions().length === 0) {\r\n  <p class=\"lib-validators-config__sub-hint\">\r\n    No fields available yet — switch to Advanced to type an expression.\r\n  </p>\r\n  }\r\n  @for (cond of group().conditions; track $index; let first = $first) {\r\n  @if (!first) {\r\n  <div class=\"lib-validators-config__connector\" aria-hidden=\"true\">\r\n    <span>{{ group().connector === '&&' ? 'AND' : 'OR' }}</span>\r\n  </div>\r\n  }\r\n  <div class=\"lib-validators-config__cond\">\r\n    <div class=\"lib-validators-config__cond-body\">\r\n      <label class=\"lib-validators-config__field\">\r\n        <span class=\"lib-validators-config__f-label\">Field</span>\r\n        <select\r\n          class=\"lib-validators-config__control\"\r\n          [class.lib-validators-config__control--invalid]=\"!cond.field\"\r\n          (change)=\"updateCondition($index, { field: inputValue($event) })\"\r\n        >\r\n          <option value=\"\" disabled [selected]=\"!cond.field\">Choose a field</option>\r\n          @if (directFields().length) {\r\n          <optgroup label=\"Fields\">\r\n            @for (f of directFields(); track f.variable) {\r\n            <option [value]=\"f.variable\" [selected]=\"f.variable === cond.field\">\r\n              {{ f.label }}{{ f.isSelf ? ' (this field)' : '' }}\r\n            </option>\r\n            }\r\n          </optgroup>\r\n          }\r\n          @if (listFields().length) {\r\n          <optgroup label=\"List fields (totalled)\">\r\n            @for (f of listFields(); track f.variable) {\r\n            <option [value]=\"f.variable\" [selected]=\"f.variable === cond.field\">{{ f.label }}</option>\r\n            }\r\n          </optgroup>\r\n          }\r\n        </select>\r\n      </label>\r\n\r\n      <div class=\"lib-validators-config__cond-pair\">\r\n        <label class=\"lib-validators-config__field\">\r\n          <span class=\"lib-validators-config__f-label\">Condition</span>\r\n          <select\r\n            class=\"lib-validators-config__control\"\r\n            (change)=\"updateCondition($index, { operator: inputValue($event) })\"\r\n          >\r\n            @for (op of operators; track op.value) {\r\n            <option [value]=\"op.value\" [selected]=\"op.value === cond.operator\">{{ op.label }}</option>\r\n            }\r\n          </select>\r\n        </label>\r\n\r\n        <div class=\"lib-validators-config__field\">\r\n          <span class=\"lib-validators-config__f-label\">\r\n            {{ cond.compareTo === 'field' ? 'Other field' : 'Value' }}\r\n          </span>\r\n          <div class=\"lib-validators-config__value\">\r\n            @if (cond.compareTo === 'field') {\r\n            <select\r\n              class=\"lib-validators-config__control\"\r\n              [class.lib-validators-config__control--invalid]=\"!cond.value\"\r\n              (change)=\"updateCondition($index, { value: inputValue($event) })\"\r\n            >\r\n              <option value=\"\" disabled [selected]=\"!cond.value\">Choose a field</option>\r\n              @if (directFields().length) {\r\n              <optgroup label=\"Fields\">\r\n                @for (f of directFields(); track f.variable) {\r\n                <option [value]=\"f.variable\" [selected]=\"f.variable === cond.value\">\r\n                  {{ f.label }}{{ f.isSelf ? ' (this field)' : '' }}\r\n                </option>\r\n                }\r\n              </optgroup>\r\n              }\r\n              @if (listFields().length) {\r\n              <optgroup label=\"List fields (totalled)\">\r\n                @for (f of listFields(); track f.variable) {\r\n                <option [value]=\"f.variable\" [selected]=\"f.variable === cond.value\">{{ f.label }}</option>\r\n                }\r\n              </optgroup>\r\n              }\r\n            </select>\r\n            } @else {\r\n            <input\r\n              class=\"lib-validators-config__control\"\r\n              [class.lib-validators-config__control--invalid]=\"!cond.value\"\r\n              [value]=\"cond.value\"\r\n              (input)=\"updateCondition($index, { value: inputValue($event) })\"\r\n              placeholder=\"e.g. 18\"\r\n            />\r\n            }\r\n            <button\r\n              type=\"button\"\r\n              class=\"lib-validators-config__value-toggle\"\r\n              (click)=\"toggleCompareTo($index)\"\r\n              [attr.aria-label]=\"\r\n                cond.compareTo === 'field' ? 'Compare to a typed value' : 'Compare to another field'\r\n              \"\r\n              [matTooltip]=\"\r\n                cond.compareTo === 'field' ? 'Compare to a typed value' : 'Compare to another field'\r\n              \"\r\n            >\r\n              <mat-icon>{{ cond.compareTo === 'field' ? 'edit' : 'link' }}</mat-icon>\r\n            </button>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <button\r\n      type=\"button\"\r\n      class=\"lib-validators-config__cond-remove\"\r\n      mat-icon-button\r\n      (click)=\"removeCondition($index)\"\r\n      matTooltip=\"Remove condition\"\r\n      aria-label=\"Remove condition\"\r\n    >\r\n      <mat-icon>close</mat-icon>\r\n    </button>\r\n  </div>\r\n  }\r\n\r\n  <button type=\"button\" class=\"lib-validators-config__link\" (click)=\"addCondition()\">\r\n    <mat-icon>add</mat-icon> Add condition\r\n  </button>\r\n  }\r\n\r\n  @if (referencedListFields().length) {\r\n  <div class=\"lib-validators-config__lists\">\r\n    <span class=\"lib-validators-config__f-label\">Combine each list</span>\r\n    <p class=\"lib-validators-config__sub-hint\">\r\n      A list field has many rows. Choose how to reduce it to one value when comparing against a\r\n      single field or value — optional when comparing two lists.\r\n    </p>\r\n    @for (f of referencedListFields(); track f.variable) {\r\n    <div\r\n      class=\"lib-validators-config__list-row\"\r\n      [class.lib-validators-config__list-row--unset]=\"\r\n        isAggregateRequired(f.variable) && !currentFunction(f.variable)\r\n      \"\r\n    >\r\n      <span class=\"lib-validators-config__list-name\">\r\n        {{ f.label }}\r\n        @if (!isAggregateRequired(f.variable)) {\r\n        <span class=\"lib-validators-config__list-optional\">optional</span>\r\n        }\r\n      </span>\r\n      <div class=\"lib-validators-config__agg\" role=\"group\" [attr.aria-label]=\"'Combine ' + f.label\">\r\n        @for (agg of aggregatesFor(f); track agg.value) {\r\n        <button\r\n          type=\"button\"\r\n          class=\"lib-validators-config__agg-chip\"\r\n          [class.lib-validators-config__agg-chip--on]=\"currentFunction(f.variable) === agg.value\"\r\n          (click)=\"setFunction(f.variable, agg.value)\"\r\n        >\r\n          {{ agg.label }}\r\n        </button>\r\n        }\r\n      </div>\r\n    </div>\r\n    }\r\n  </div>\r\n  }\r\n\r\n  @if (draft.expression) {\r\n  <div class=\"lib-validators-config__preview\">\r\n    <span class=\"lib-validators-config__f-label\">Generated</span>\r\n    <code>{{ draft.expression }}</code>\r\n  </div>\r\n  }\r\n\r\n  <div class=\"lib-validators-config__override\">\r\n    <mat-slide-toggle\r\n      name=\"canOverride\"\r\n      [checked]=\"draft.canOverride\"\r\n      (change)=\"setCanOverride($event.checked)\"\r\n    >\r\n      <span class=\"lib-validators-config__toggle-label\">Users can override this rule</span>\r\n    </mat-slide-toggle>\r\n    <span class=\"lib-validators-config__sub-hint\">\r\n      @if (draft.canOverride) { Shown as a warning — the form can still be submitted. } @else { Blocks\r\n      submission until the entry is fixed. }\r\n    </span>\r\n  </div>\r\n\r\n  <div class=\"lib-validators-config__foot\">\r\n    @if (raw()) {\r\n    <button\r\n      type=\"button\"\r\n      class=\"lib-validators-config__link\"\r\n      [disabled]=\"!canUseGuided()\"\r\n      [matTooltip]=\"canUseGuided() ? '' : 'This expression is too advanced for the guided builder'\"\r\n      (click)=\"useGuided()\"\r\n    >\r\n      <mat-icon>view_module</mat-icon> Guided\r\n    </button>\r\n    } @else {\r\n    <button type=\"button\" class=\"lib-validators-config__link\" (click)=\"useRaw()\">\r\n      <mat-icon>code</mat-icon> Advanced\r\n    </button>\r\n    }\r\n  </div>\r\n\r\n  @if (saveHint(); as hint) {\r\n  <p class=\"lib-validators-config__save-hint\">\r\n    <mat-icon class=\"lib-validators-config__save-hint-icon\">info</mat-icon>\r\n    <span>{{ hint }}</span>\r\n  </p>\r\n  }\r\n\r\n  <mat-toolbar class=\"lib-validators-config__toolbar\">\r\n    <span class=\"lib-validators-config__spacer\"></span>\r\n    <button mat-button (click)=\"closeEditor()\">Close</button>\r\n    <button mat-raised-button color=\"accent\" [disabled]=\"!canSave()\" (click)=\"saveVariable()\">\r\n      Save rule\r\n    </button>\r\n  </mat-toolbar>\r\n</mat-card>\r\n}\r\n"],"names":["uuidv4","i1","i2","i3","i4","i5","i6","i8","i9"],"mappings":"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"}