{"version":3,"file":"ngx-t-forms-workflow-adjudication.component-CZZX1hYU.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/adjudication-chart/adjudication-chart.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/adjudication-chart/adjudication-chart.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/adjudication-docs/adjudication-docs.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/adjudication-docs/adjudication-docs.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/adjudication-shell/adjudication-shell.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/adjudication-shell/adjudication-shell.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/points-creation/points-creation.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/points-creation/points-creation.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/microflow-fetch.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/price-preference.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/mapColors.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/quill-notes.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/elements/submission-review-dialog/submission-review-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/elements/submission-review-dialog/submission-review-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/submission-review.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/submission-review.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/point-assignment.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/point-assignment.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/supplier-selection/supplier-selection.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/supplier-selection/supplier-selection.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/workflow-adjudication.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/workflow-adjudication.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n/** A vertical reference line on the chart's shared axis. */\nexport interface AdjChartRef {\n  /** Microscopic label drawn at the line (e.g. \"median\", \"−15%\"). */\n  label: string;\n  /** Position as % of the axis. */\n  pct: number;\n  kind: 'neutral' | 'warning';\n}\n\n/** One legend entry; `kind` maps to the swatch colour. */\nexport interface AdjChartLegendItem {\n  label: string;\n  kind: 'primary' | 'secondary' | 'warning';\n}\n\n/** One row of the chart: a primary bar, an optional thin secondary bar. */\nexport interface AdjChartRow {\n  id: string;\n  name: string;\n  /** Primary bar width as % of the axis. */\n  primaryPct: number;\n  /** Figure shown for the primary bar (right column, tabular). */\n  primaryLabel: string;\n  /** Optional thin bar on its own scale (e.g. points). */\n  secondaryPct?: number;\n  secondaryLabel?: string;\n  /** Compact annotation under the track (e.g. drift, exclusion). */\n  note?: string;\n  /** normal = accent bar · warning = amber bar + note · muted = struck out. */\n  state: 'normal' | 'warning' | 'muted';\n}\n\n/** Everything the chart renders; built by the step components. */\nexport interface AdjChartVm {\n  /** One-line reading aid above the plot. */\n  caption?: string;\n  /** Shaded zone from 0 to this % of the axis (e.g. the abnormally-low zone). */\n  zonePct?: number;\n  refs: AdjChartRef[];\n  legend: AdjChartLegendItem[];\n  rows: AdjChartRow[];\n  footnote?: string;\n}\n\n/**\n * Compact horizontal-bar chart shared by the adjudication steps: one aligned\n * grid of name · track · figures per row, reference lines and a shaded zone\n * spanning the whole track column, and per-row notes for anything that needs\n * a reviewer's eye. Pure presentation — every number arrives precomputed on\n * the {@link AdjChartVm}.\n *\n * @example\n *   <lib-adjudication-chart [vm]=\"chart\" />\n */\n@Component({\n  selector: 'lib-adjudication-chart',\n  templateUrl: './adjudication-chart.component.html',\n  styleUrl: './adjudication-chart.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: { 'class': 'lib-adjudication-chart' },\n  imports: [MatTooltipModule],\n})\nexport class AdjudicationChartComponent {\n  /** The prepared chart model. */\n  readonly vm = input.required<AdjChartVm>();\n}\n","@if (vm().caption) {\n  <p class=\"chart-caption\">{{ vm().caption }}</p>\n}\n\n<div class=\"plot\">\n  <!-- Zone + reference lines span the track column only (the fixed name and\n       figure columns are excluded via the CSS column variables). -->\n  <div class=\"overlay\" aria-hidden=\"true\">\n    @if (vm().zonePct != null) {\n      <div class=\"zone\" [style.width.%]=\"vm().zonePct\"></div>\n    }\n    @for (ref of vm().refs; track ref.label) {\n      <div class=\"ref\" [class.warning]=\"ref.kind === 'warning'\" [style.left.%]=\"ref.pct\">\n        <span>{{ ref.label }}</span>\n      </div>\n    }\n  </div>\n\n  @for (row of vm().rows; track row.id) {\n    <div class=\"row\"\n      [class.warning]=\"row.state === 'warning'\"\n      [class.muted]=\"row.state === 'muted'\">\n      <span class=\"name\" [matTooltip]=\"row.name\">{{ row.name }}</span>\n      <div class=\"track\">\n        <div class=\"bar primary\" [style.width.%]=\"row.primaryPct\"></div>\n        @if (row.secondaryPct != null) {\n          <div class=\"bar secondary\" [style.width.%]=\"row.secondaryPct\"></div>\n        }\n      </div>\n      <span class=\"figures\">\n        <span class=\"figure\">{{ row.primaryLabel }}</span>\n        @if (row.secondaryLabel) {\n          <span class=\"figure secondary-figure\">{{ row.secondaryLabel }}</span>\n        }\n      </span>\n      @if (row.note) {\n        <span class=\"note\">{{ row.note }}</span>\n      }\n    </div>\n  }\n</div>\n\n@if (vm().legend.length) {\n  <div class=\"legend\">\n    @for (item of vm().legend; track item.label) {\n      <span class=\"legend-item\">\n        <span class=\"swatch\" [class]=\"'swatch ' + item.kind\"></span>{{ item.label }}\n      </span>\n    }\n  </div>\n}\n@if (vm().footnote) {\n  <p class=\"footnote\">{{ vm().footnote }}</p>\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, input } from '@angular/core';\nimport { AdjudicationSteps } from 'ngx-t-forms-types';\n\n/**\n * Everything the guide adapts to: the adjudication step type plus the live\n * step configuration, so each line states what applies HERE, not generic\n * theory.\n */\nexport interface AdjudicationDocsContext {\n  step: AdjudicationSteps;\n  /** \"80/20\" | \"90/10\" when the price engine resolved a system. */\n  system?: string;\n  /** Form key prices are read from, when the engine is active. */\n  priceKey?: string;\n  /** Configured cap on compliant bids (`maxLength` on the review step). */\n  complianceLimit?: number;\n  /** Whether a score sheet feeds this step. */\n  hasScoreSheet?: boolean;\n}\n\n/** One compact term → explanation line of the guide. */\ninterface DocsRule {\n  term: string;\n  text: string;\n}\n\n/**\n * The in-component guide to the adjudication rules: one compact term/text list\n * per step type, assembled from {@link AdjudicationDocsContext} so the content\n * matches the step in view (its system, its price key, its compliance limit).\n * Short by design — every line is one sentence a reviewer can act on.\n *\n * @example\n *   <lib-adjudication-docs [context]=\"{ step: AdjudicationSteps.SubMissionReview }\" />\n */\n@Component({\n  selector: 'lib-adjudication-docs',\n  templateUrl: './adjudication-docs.component.html',\n  styleUrl: './adjudication-docs.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: { 'class': 'lib-adjudication-docs' },\n  imports: [],\n})\nexport class AdjudicationDocsComponent {\n  /** The step to explain, plus its live configuration. */\n  readonly context = input.required<AdjudicationDocsContext>();\n\n  protected readonly heading = computed(() => {\n    switch (this.context().step) {\n      case AdjudicationSteps.ScoreCreation: return 'Building the score sheet';\n      case AdjudicationSteps.PointAssignment: return 'Assigning points';\n      case AdjudicationSteps.SupplierSelection: return 'Selecting the supplier';\n      default: return 'Reviewing submissions';\n    }\n  });\n\n  /** The step-specific rule lines, shortest useful form. */\n  protected readonly rules = computed<DocsRule[]>(() => {\n    const ctx = this.context();\n    switch (ctx.step) {\n      case AdjudicationSteps.ScoreCreation:\n        return [\n          { term: 'Score sheet', text: 'The criteria reviewers will score every compliant bid against; each carries its maximum points.' },\n          { term: 'Point types', text: 'Group criteria (e.g. technical, price) — each group becomes its own tab at point assignment.' },\n          { term: 'Linked fields', text: 'Link a criterion to a form field to score what bidders actually submitted; or type a custom one.' },\n          { term: 'Practice', text: 'Finalise the sheet before bids open, keep descriptions unambiguous, keep totals realistic.' },\n        ];\n      case AdjudicationSteps.PointAssignment:\n        return [\n          { term: 'Task', text: 'Score every compliant bid against the score sheet, one criterion at a time.' },\n          { term: 'Groups', text: 'Criteria appear grouped by point type; a bid\\'s total is the sum across all groups.' },\n          { term: 'Feeds into', text: 'Totals carry into supplier selection, scaled onto the specific-goals portion of the final score.' },\n          { term: 'Practice', text: 'Score all bids on one criterion before moving to the next, and note the reasoning as you go.' },\n        ];\n      case AdjudicationSteps.SupplierSelection: {\n        const split = ctx.system ?? '80/20 or 90/10';\n        return [\n          { term: 'Final score', text: `Points for price plus score-sheet points scaled onto the ${split} split — a total out of 100.` },\n          { term: 'Award', text: 'The highest total is appointed; equal totals fall to the higher specific-goals score.' },\n          { term: 'Practice', text: 'Resolve every open flag before appointing, and record resolution notes with the appointment.' },\n        ];\n      }\n      default: {\n        const scale = ctx.system?.slice(0, 2) ?? '80';\n        const rules: DocsRule[] = [\n          { term: 'Benchmark', text: `The lowest compliant price earns the full ${scale} points; each 1% above it costs 0.${scale} points, floored at 0, shown to two decimals.` },\n          { term: 'System', text: 'R50 million or less → 80/20; above → 90/10. Picked from the step\\'s formula, else the tender estimate, else the lowest compliant bid.' },\n          { term: 'Non-compliant', text: 'The verdict removes a bid from the pool. If it held the lowest price, the benchmark shifts and every score — including saved ones — recalculates instantly.' },\n          { term: 'Abnormally low', text: 'A bid more than 15% below the median compliant price (the middle price — immune to one extreme bid) is flagged amber. The flag means investigate; it never auto-rejects.' },\n          { term: 'Practice', text: 'Preview before judging · investigate every amber flag · note each verdict · never hand-adjust scores.' },\n        ];\n        if (ctx.complianceLimit) {\n          rules.splice(3, 0, {\n            term: 'Limit',\n            text: `At most ${ctx.complianceLimit} bid(s) may end compliant — once reached, the rest are marked non-compliant automatically.`,\n          });\n        }\n        return rules;\n      }\n    }\n  });\n\n  /** Live-config chips shown under the heading, one per known fact. */\n  protected readonly facts = computed<string[]>(() => {\n    const ctx = this.context();\n    const facts: string[] = [];\n    if (ctx.system) facts.push(`${ctx.system} system in effect`);\n    if (ctx.priceKey) facts.push(`prices read from “${ctx.priceKey}”`);\n    if (ctx.complianceLimit) facts.push(`compliance limit ${ctx.complianceLimit}`);\n    if (ctx.hasScoreSheet) facts.push('score sheet configured');\n    return facts;\n  });\n}\n","<section class=\"docs\">\n  <span class=\"eyebrow\">Guide</span>\n  <h4 class=\"heading\">{{ heading() }}</h4>\n  @if (facts().length) {\n    <div class=\"facts\">\n      @for (fact of facts(); track fact) {\n        <span class=\"fact\">{{ fact }}</span>\n      }\n    </div>\n  }\n\n  <dl class=\"rules\">\n    @for (rule of rules(); track rule.term) {\n      <div class=\"rule\">\n        <dt>{{ rule.term }}</dt>\n        <dd>{{ rule.text }}</dd>\n      </div>\n    }\n  </dl>\n\n  <p class=\"fineprint\">PPR 2022 regs 3–5 · National Treasury Implementation Guide, March 2023.\n    Abnormally-low detection uses the 15% best-practice band; SA guidance requires judgment, not automatic rejection.</p>\n</section>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { AdjudicationChartComponent, AdjChartVm } from '../adjudication-chart/adjudication-chart.component';\nimport { AdjudicationDocsComponent, AdjudicationDocsContext } from '../adjudication-docs/adjudication-docs.component';\n\n/**\n * The frame every adjudication step renders inside: a thin identity bar\n * (step label + system chip), the view switch (working view · chart · guide),\n * and a fullscreen toggle for dense pools. The working view is projected; the\n * chart and the guide are rendered here from their prepared models, so all\n * four step types share one behaviour and one look.\n *\n * Fullscreen is a CSS takeover (fixed, inset 0) rather than the browser\n * Fullscreen API — SSR-safe, no permission prompt, Escape exits.\n *\n * @example\n *   <lib-adjudication-shell label=\"Submission review\" [system]=\"vm.priceSystem\"\n *     [docsContext]=\"vm.docsContext\" [chart]=\"vm.priceChart\">\n *     ...working view...\n *   </lib-adjudication-shell>\n */\n@Component({\n  selector: 'lib-adjudication-shell',\n  templateUrl: './adjudication-shell.component.html',\n  styleUrl: './adjudication-shell.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: {\n    'class': 'lib-adjudication-shell',\n    '[class.fullscreen]': 'fullscreen()',\n    '(document:keydown.escape)': 'onEscape()',\n  },\n  imports: [MatButtonModule, MatIconModule, MatTooltipModule, AdjudicationChartComponent, AdjudicationDocsComponent],\n})\nexport class AdjudicationShellComponent {\n  /** Step name shown in the identity bar (e.g. \"Submission review\"). */\n  readonly label = input.required<string>();\n\n  /** Preference point system chip (\"80/20\" / \"90/10\"), when known. */\n  readonly system = input<string | undefined>(undefined);\n\n  /** Context the guide adapts its content to. */\n  readonly docsContext = input.required<AdjudicationDocsContext>();\n\n  /** Chart model; the chart button only appears when one is provided. */\n  readonly chart = input<AdjChartVm | undefined>(undefined);\n\n  /** Which face is showing. Presentational only — no step state changes. */\n  protected readonly view = signal<'main' | 'chart' | 'docs'>('main');\n\n  /** CSS takeover state; host gets the `fullscreen` class. */\n  protected readonly fullscreen = signal(false);\n\n  protected onEscape(): void {\n    if (this.fullscreen()) this.fullscreen.set(false);\n  }\n}\n","<header class=\"shell-bar\">\n  <div class=\"shell-id\">\n    <span class=\"shell-label\">{{ label() }}</span>\n    @if (system()) {\n      <span class=\"shell-system\"\n        matTooltip=\"Preference point system in effect (PPR 2022): points for price are computed automatically against the lowest compliant bid.\">\n        {{ system() }}\n      </span>\n    }\n  </div>\n  <div class=\"shell-actions\">\n    <button mat-icon-button type=\"button\" [class.active]=\"view() === 'main'\"\n      matTooltip=\"Review table\" aria-label=\"Review table\"\n      [attr.aria-pressed]=\"view() === 'main'\" (click)=\"view.set('main')\">\n      <mat-icon>table_rows</mat-icon>\n    </button>\n    @if (chart()) {\n      <button mat-icon-button type=\"button\" [class.active]=\"view() === 'chart'\"\n        matTooltip=\"Chart\" aria-label=\"Records by price chart\"\n        [attr.aria-pressed]=\"view() === 'chart'\" (click)=\"view.set('chart')\">\n        <mat-icon>insights</mat-icon>\n      </button>\n    }\n    <button mat-icon-button type=\"button\" [class.active]=\"view() === 'docs'\"\n      matTooltip=\"Guide\" aria-label=\"How scoring works\"\n      [attr.aria-pressed]=\"view() === 'docs'\" (click)=\"view.set('docs')\">\n      <mat-icon>menu_book</mat-icon>\n    </button>\n    <button mat-icon-button type=\"button\" class=\"fullscreen-toggle\"\n      [matTooltip]=\"fullscreen() ? 'Exit full screen (Esc)' : 'Full screen'\"\n      [attr.aria-label]=\"fullscreen() ? 'Exit full screen' : 'Full screen'\"\n      [attr.aria-pressed]=\"fullscreen()\" (click)=\"fullscreen.set(!fullscreen())\">\n      <mat-icon>{{ fullscreen() ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n    </button>\n  </div>\n</header>\n\n<div class=\"shell-body\">\n  @switch (view()) {\n    @case ('docs') {\n      <lib-adjudication-docs [context]=\"docsContext()\" />\n    }\n    @case ('chart') {\n      @if (chart(); as chartVm) {\n        <lib-adjudication-chart [vm]=\"chartVm\" />\n      }\n    }\n    @default {\n      <ng-content />\n    }\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, computed, effect, inject, input, output } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TextFieldModule } from '@angular/cdk/text-field';\r\n\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { tap } from 'rxjs';\r\nimport { AdjudicationSteps, FormColumnInputs, ITowerStepColumn, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { AdjudicationDocsContext } from '../adjudication-docs/adjudication-docs.component';\r\nimport { AdjudicationShellComponent } from '../adjudication-shell/adjudication-shell.component';\r\nimport { getInputIcon } from '../../../../../../shared/functions/getInputIcon';\r\n\r\n@Component({\r\n  selector: 'lib-points-creation',\r\n  templateUrl: './points-creation.component.html',\r\n  styleUrls: ['./points-creation.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    FormsModule,\r\n    TextFieldModule,\r\n    MatAutocompleteModule,\r\n    MatButtonModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatSelectModule,\r\n    MatSortModule,\r\n    MatTableModule,\r\n    MatTooltipModule,\r\n    AdjudicationShellComponent,\r\n  ],\r\n})\r\nexport class PointsCreationComponent {\r\n  readonly #config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n  readonly #destroyRef = inject(DestroyRef);\r\n\r\n  /** Static guide context: this step authors the sheet, nothing dynamic yet. */\r\n  protected readonly docsContext: AdjudicationDocsContext = {\r\n    step: AdjudicationSteps.ScoreCreation,\r\n  };\r\n\r\n  /** Tower step column config that drives column layout, types, and disabled/readonly state. */\r\n  readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\r\n\r\n  /** Existing points list pushed in from the parent (workflow-adjudication-reactive-input). */\r\n  // NOTE(phase-4): Trap 6 — parent (`workflow-adjudication-reactive-input`) binds a\r\n  // `WorkflowAdjudicationValue | null` union of three incompatible shapes. Until the parent\r\n  // template is split per adjudication step type, this input must remain `any`.\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step, then narrow this input.\r\n  readonly value = input<any>(null);\r\n\r\n  /** Emits the updated points list whenever the user saves, edits, or removes a row. */\r\n  readonly pointsChange = output<WorkflowAdjudicationScoreSheetValue[]>();\r\n\r\n  protected pointRow: WorkflowAdjudicationScoreSheetValue = this.#createDefaultPointRow();\r\n  protected selectAllWorkflowInputs: FormColumnInputs[] = [];\r\n  #points: WorkflowAdjudicationScoreSheetValue[] = [];\r\n\r\n  /** Material table columns derived from the input config. */\r\n  protected readonly cols = computed(() => {\r\n    const cfg = this.inputConfig();\r\n    let cols: string[] = (cfg?.adjudicationPointTypes?.length || 0) > 0\r\n      ? ['description', 'totalPoints', 'pointType', 'actions']\r\n      : ['description', 'totalPoints', 'actions'];\r\n    if (cfg?.disabled || !!cfg?.readonly) {\r\n      cols = cols.filter(col => col !== 'actions');\r\n    }\r\n    return cols;\r\n  });\r\n\r\n  /** Mirrors the legacy `set value` setter — pushes incoming `value` into the internal `#points` buffer. */\r\n  protected readonly valueBridge = effect(() => {\r\n    const next = this.value();\r\n    this.#points = (next || []) as WorkflowAdjudicationScoreSheetValue[];\r\n  });\r\n\r\n  constructor() {\r\n    this.#config.formBuilder.getCurrentFormAvailableInputOptions().pipe(\r\n      tap((inputs: FormColumnInputs[]) => {\r\n        this.selectAllWorkflowInputs = inputs;\r\n      }),\r\n      takeUntilDestroyed(this.#destroyRef),\r\n    ).subscribe();\r\n  }\r\n\r\n  protected get points(): WorkflowAdjudicationScoreSheetValue[] {\r\n    const cfg = this.inputConfig();\r\n    if (cfg?.disabled || !!cfg?.readonly) {\r\n      return this.#points;\r\n    }\r\n    return [...this.#points, this.pointRow];\r\n  }\r\n\r\n  protected get filteredInputs(): FormColumnInputs[] {\r\n    const description = this.pointRow.description?.toLowerCase() || '';\r\n    if (!description) {\r\n      return this.selectAllWorkflowInputs;\r\n    }\r\n    const regex = new RegExp(description.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'i');\r\n    return this.selectAllWorkflowInputs.filter((input: FormColumnInputs) =>\r\n      (typeof input.label === 'string' && regex.test(input.label)) ||\r\n      (typeof input.hintLabel === 'string' && regex.test(input.hintLabel)),\r\n    );\r\n  }\r\n\r\n  protected get pointInEditIsValid(): boolean {\r\n    const cfg = this.inputConfig();\r\n    const typeRequired = (cfg?.adjudicationPointTypes?.length || 0) > 0;\r\n    return !!this.pointRow.description && this.pointRow.totalPoints > 0 && (!typeRequired || !!this.pointRow.pointType);\r\n  }\r\n\r\n  #createDefaultPointRow(): WorkflowAdjudicationScoreSheetValue {\r\n    return {\r\n      id: '',\r\n      formControlName: '',\r\n      totalPoints: 0,\r\n      description: '',\r\n      pointType: '',\r\n      inputId: undefined,\r\n      isEditRow: true,\r\n    };\r\n  }\r\n\r\n  #resetPointRow(): void {\r\n    this.pointRow = this.#createDefaultPointRow();\r\n  }\r\n\r\n  protected selectActiveInput(input: FormColumnInputs): void {\r\n    const cfg = this.inputConfig();\r\n    this.pointRow = {\r\n      ...this.pointRow,\r\n      totalPoints: 0,\r\n      description: input.label || '',\r\n      id: input.id,\r\n      formControlName: input.formControlName,\r\n      pointType: this.pointRow.pointType || cfg?.adjudicationPointTypes[0] || '',\r\n      inputId: input.id,\r\n    };\r\n  }\r\n\r\n  protected selectPointType(pointType: MatSelectChange): void {\r\n    this.pointRow = {\r\n      ...this.pointRow,\r\n      pointType: pointType.value,\r\n    };\r\n  }\r\n\r\n  protected savePoints(): void {\r\n    const pointToSave: WorkflowAdjudicationScoreSheetValue = {\r\n      ...this.pointRow,\r\n      id: this.pointRow.id || uuidv4(),\r\n      formControlName: this.pointRow.formControlName || this.pointRow.description,\r\n      isEditRow: undefined,\r\n    };\r\n    this.#points = [...this.#points, pointToSave];\r\n    this.pointsChange.emit(this.#points);\r\n    this.#resetPointRow();\r\n  }\r\n\r\n  protected edit(element: WorkflowAdjudicationScoreSheetValue): void {\r\n    this.pointRow = {\r\n      ...element,\r\n      isEditRow: true,\r\n    };\r\n    this.#points = this.#points.filter(p => p.id !== element.id);\r\n    this.pointsChange.emit(this.#points);\r\n  }\r\n\r\n  protected remove(element: WorkflowAdjudicationScoreSheetValue): void {\r\n    this.#points = this.#points.filter(p => p.id !== element.id);\r\n    this.pointsChange.emit(this.#points);\r\n  }\r\n\r\n  protected getInputIcon(input: FormColumnInputs): string {\r\n    return getInputIcon(input.element);\r\n  }\r\n}\r\n","<lib-adjudication-shell label=\"Score sheet\" [docsContext]=\"docsContext\">\r\n<div style=\"resize: both; overflow: auto;\">\r\n    @if (!points || points.length === 1) {\r\n    <h5 style=\"margin-bottom: 5px; margin-top: 0px;\">\r\n        &#8505;&#65039; To add a scoring item:\r\n    </h5>\r\n    <ol>\r\n        <li>\r\n            <strong>Enter Description:</strong>\r\n            <ul style=\"margin-top: 5px; margin-bottom: 5px; padding-left: 20px; list-style-type: disc;\">\r\n                <li>\r\n                    To <strong>link</strong> a field: You <strong>must select it</strong> from the list first (you can\r\n                    edit it after).\r\n                </li>\r\n                <li>\r\n                    For a <strong>custom</strong> point: <strong>Ignore the list</strong> and just type your own\r\n                    description.\r\n                </li>\r\n            </ul>\r\n        </li>\r\n        <li>\r\n            <strong>Set Details:</strong>\r\n            Assign the <strong>Points</strong> and select the <strong>Point Type</strong>.\r\n        </li>\r\n        <li>\r\n            <strong>Save:</strong>\r\n            Click the <strong>\"Save\"</strong> button to add the item.\r\n        </li>\r\n    </ol>\r\n    }\r\n    <table mat-table [dataSource]=\"points\" matSort>\r\n        <ng-container matColumnDef=\"description\">\r\n            <th mat-header-cell *matHeaderCellDef>Description</th>\r\n            <td mat-cell *matCellDef=\"let element\">\r\n                @if (element.isEditRow) {\r\n                    <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n                        <textarea [matAutocomplete]=\"auto\" [(ngModel)]=\"pointRow.description\" matInput cdkTextareaAutosize\r\n                            cdkAutosizeMinRows=\"1\" placeholder=\"Enter point description\"></textarea>\r\n                        <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n                            @for (input of filteredInputs; track input.id) {\r\n                            <mat-option [value]=\"input.label\" (click)=\"selectActiveInput(input)\">\r\n                                <div style=\"display: flex;align-items: center;gap:8px\">\r\n                                    <mat-icon style=\"font-size:24px; width:24px; height:24px;\"\r\n                                        [attr.aria-label]=\"input.label\">\r\n                                        {{ getInputIcon(input) }}\r\n                                    </mat-icon>\r\n                                    <span>\r\n                                        <div style=\"font-size: 0.75em;\">\r\n                                            <strong>\r\n                                                {{ input.label }}\r\n                                            </strong>\r\n                                        </div>\r\n                                        <div\r\n                                            style=\"font-size: 0.75em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n                                            {{ input.hintLabel || input.formControlName }}\r\n                                        </div>\r\n                                    </span>\r\n                                </div>\r\n                            </mat-option>\r\n                            }\r\n                        </mat-autocomplete>\r\n                    </mat-form-field>\r\n                } @else {\r\n                    {{ element.description }}\r\n                }\r\n            </td>\r\n        </ng-container>\r\n        <ng-container matColumnDef=\"totalPoints\">\r\n            <th mat-header-cell *matHeaderCellDef>Points</th>\r\n            <td mat-cell *matCellDef=\"let element\">\r\n                @if (element.isEditRow) {\r\n                    <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n                        <input matInput [(ngModel)]=\"pointRow.totalPoints\"\r\n                            placeholder=\"Enter points , eg 50\" type=\"number\">\r\n                    </mat-form-field>\r\n                } @else {\r\n                    {{ element.totalPoints }}\r\n                }\r\n            </td>\r\n        </ng-container>\r\n        <ng-container matColumnDef=\"pointType\">\r\n            <th mat-header-cell *matHeaderCellDef>Point Type</th>\r\n            <td mat-cell *matCellDef=\"let element\">\r\n                @if (element.isEditRow) {\r\n                    <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n                        <mat-select (selectionChange)=\"selectPointType($event)\" ngDefaultControl\r\n                            [value]=\"pointRow.pointType\"\r\n                            placeholder=\"Select\">\r\n                            @for (type of inputConfig()?.adjudicationPointTypes || []; track $index) {\r\n                            <mat-option [value]=\"type\">{{ type }}</mat-option>\r\n                            }\r\n                        </mat-select>\r\n                    </mat-form-field>\r\n                } @else {\r\n                    {{ element.pointType }}\r\n                }\r\n            </td>\r\n        </ng-container>\r\n        <ng-container matColumnDef=\"actions\" [stickyEnd]=\"true\">\r\n            <th mat-header-cell *matHeaderCellDef></th>\r\n            <td mat-cell *matCellDef=\"let element\">\r\n                <span style=\"display: flex; justify-content: center;\">\r\n                    @if (element.isEditRow) {\r\n                    <button matTooltip=\"Save Point in Edit\" color=\"primary\" style=\"white-space: nowrap;\r\n    height: 26px;\r\n    margin-bottom: 0px;\" mat-flat-button (click)=\"savePoints()\" [disabled]=\"!pointInEditIsValid || inputConfig()?.disabled || inputConfig()?.readonly\">\r\n                        <span style=\"font-size: 0.875em;\">\r\n                            save\r\n                        </span>\r\n                    </button>\r\n                    } @else {\r\n                    <button mat-icon-button (click)=\"edit(element)\">\r\n                        <mat-icon>edit</mat-icon>\r\n                    </button>\r\n                    <button mat-icon-button (click)=\"remove(element)\">\r\n                        <mat-icon>delete_forever</mat-icon>\r\n                    </button>\r\n                    }\r\n                </span>\r\n            </td>\r\n        </ng-container>\r\n        <tr mat-header-row *matHeaderRowDef=\"cols()\"></tr>\r\n        <tr mat-row *matRowDef=\"let row; columns: cols()\"></tr>\r\n    </table>\r\n</div>\r\n</lib-adjudication-shell>\r\n","import { Observable, catchError, map, of, shareReplay, startWith, switchMap, take } from 'rxjs';\n\nimport type { AdjResponseReviewColumnMapping, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\n\nimport type { ISubmission } from './elements/submission-review/submission-review.component';\n\n/**\n * The `formBuilder.getCurrentStepMicroflowSubmissions()` payload as the\n * adjudication steps read it. Mirrors the `IStoreFunctions` contract, with\n * `submissions` narrowed from `any[]` to the row shape the tables index into.\n * Each step consumes a subset (submission-review ignores the score-sheet\n * fields; supplier-selection reads all four).\n */\nexport interface MicroflowSubmissionsPayload {\n  submissions: ISubmission[];\n  columnMapping: AdjResponseReviewColumnMapping;\n  scoreSheet?: WorkflowAdjudicationScoreSheetValue[];\n  adjudicationPricePreferenceCalculationFormula?: string;\n  /**\n   * \"Rand value\" of the procurement (PPR 2022 reg 1: estimated contract value\n   * at invitation, taxes included). Feeds 80/20 vs 90/10 auto-selection and\n   * abnormally-low-tender flagging in the price preference engine.\n   */\n  estimatedProcurementValue?: number;\n}\n\n/**\n * Lifecycle of one micro-flow submissions fetch attempt. Modelled as data\n * (instead of letting the error propagate) so a failed fetch cannot complete a\n * step's `vm$` — the stream, and with it the \"Try Again\" refetch, must outlive\n * every failure.\n */\nexport type MicroflowFetchState =\n  | { readonly status: 'loading' }\n  | { readonly status: 'loaded'; readonly payload: MicroflowSubmissionsPayload }\n  | { readonly status: 'failed'; readonly reason: string };\n\n/** Human-readable reason for an unknown thrown value, for the error card. */\nexport function describeError(error: unknown): string {\n  if (error instanceof Error && error.message) return error.message;\n  if (typeof error === 'string' && error.length > 0) return error;\n  return 'Unknown error';\n}\n\n/**\n * One fetch per trigger emission, surfaced as {@link MicroflowFetchState}.\n *\n * Errors are caught INSIDE the `switchMap`, so a failed request completes only\n * its own inner observable: the trigger subscription survives and the next\n * trigger genuinely refetches. (The historical defect placed `catchError` on\n * the consuming `vm$` itself — the first error tore the whole chain down and\n * \"Try Again\" pushed into a dead trigger.) `startWith` re-enters the loading\n * state on every trigger, so a retry shows the spinner instead of a stale\n * error card.\n *\n * @param trigger$ - Emits whenever a (re)fetch should run.\n * @param fetch - The `getCurrentStepMicroflowSubmissions` call, deferred so\n *   each trigger issues a fresh request.\n * @returns Replayed (`shareReplay(1)`) state stream for a step's `vm$`.\n */\nexport function microflowFetchStates(\n  trigger$: Observable<void>,\n  fetch: () => Observable<MicroflowSubmissionsPayload>,\n): Observable<MicroflowFetchState> {\n  return trigger$.pipe(\n    switchMap(() =>\n      fetch().pipe(\n        take(1),\n        map((payload): MicroflowFetchState => ({ status: 'loaded', payload })),\n        catchError((error: unknown) =>\n          of<MicroflowFetchState>({ status: 'failed', reason: describeError(error) })),\n        startWith<MicroflowFetchState>({ status: 'loading' }),\n      ),\n    ),\n    shareReplay(1),\n  );\n}\n","import type { ISubmission } from './elements/submission-review/submission-review.component';\n\n/**\n * PPPFA price preference calculation engine.\n *\n * Computes the \"points for price\" of the South African preferential\n * procurement framework ORGANICALLY inside the library, from the tendered\n * prices and the reviewers' live compliance verdicts — the host consumer no\n * longer pre-computes or stamps scores (though stamped scores remain the\n * fallback when no price data reaches the library).\n *\n * ## Legal basis (verified against the primary sources, 2026-08)\n *\n * - Preferential Procurement Policy Framework Act 5 of 2000 (PPPFA).\n * - Preferential Procurement Regulations, 2022 (GN 2721, Gazette 47452,\n *   4 Nov 2022; in force 16 Jan 2023) — \"PPR 2022\".\n * - National Treasury (OCPO) Implementation Guide: PPR 2022, v1 March 2023.\n *\n * Reg 4(1): points out of 80 for price, tenders with Rand value ≤ R50 million\n * (all applicable taxes included):  `Ps = 80 × (1 − (Pt − Pmin) / Pmin)`.\n * Reg 5(1): points out of 90 for price, Rand value > R50 million:\n * `Ps = 90 × (1 − (Pt − Pmin) / Pmin)`. Where Ps = points scored for price of\n * the tender under consideration, Pt = its price, and Pmin = price of the\n * LOWEST ACCEPTABLE tender. PPR 2022 reg 1 defines \"lowest acceptable tender\"\n * as one that \"complies with all specifications and conditions of tender and\n * that has lowest price\", \"price\" as tax-inclusive less unconditional\n * discounts, and \"Rand value\" as the total ESTIMATED contract value at the\n * time of the tender invitation.\n *\n * ## The five engine rules this module enforces\n *\n * 1. **Zero floor.** The raw formula goes negative once `Pt > 2 × Pmin`; the\n *    lowest possible price score is 0, so results are capped with\n *    `Math.max(0, ps)`. (Practice endorsed by Treasury-aligned guidance — the\n *    regulation text itself is silent on the negative branch.)\n * 2. **Conditional Pmin recalculation.** Pmin is derived ONLY from responsive\n *    bids. A bid the reviewer marks non-compliant is excluded and the next\n *    lowest responsive bid becomes Pmin; every score is recomputed from the\n *    new Pmin on the same pass. Unreviewed bids count as provisionally\n *    responsive until a verdict lands.\n * 3. **Abnormally-low-tender (ALT) flagging.** A bid priced more than\n *    {@link DEFAULT_ABNORMALLY_LOW_FRACTION} below the median responsive\n *    price — or below the estimated Rand value, when provided — is FLAGGED,\n *    never auto-excluded: SA guidance (NT construction procurement standards\n *    via ISO 10845) requires a judgment call on unrealistic offers, so\n *    exclusion stays a reviewer decision (which then shifts Pmin via rule 2).\n * 4. **Decimal precision.** Internal arithmetic keeps full float precision;\n *    only the final score is rounded, half-up, to exactly two decimals —\n *    matching regs 4(3)/5(3), which round the combined price+goals total \"to\n *    the nearest two decimal places\".\n * 5. **Scale auto-selection.** 80/20 vs 90/10 by the R50 million threshold\n *    (regs 4(1)/5(1)), resolved in precedence order: the system the tender\n *    was advertised under (explicit override) → the estimated Rand value at\n *    invitation (reg 1 \"Rand value\") → the lowest acceptable tender received\n *    (reg 3(b), the route for tenders advertised under both systems).\n */\n\n/** The price portion of the two statutory preference point systems. */\nexport type PricePreferenceScale = 80 | 90;\n\n/**\n * R50 million: the Rand-value boundary between the 80/20 and 90/10 systems\n * (PPR 2022 regs 4(1) and 5(1); ≤ threshold → 80/20, above → 90/10).\n */\nexport const RAND_VALUE_SCALE_THRESHOLD = 50_000_000;\n\n/**\n * Default form key holding each submission's tendered price. Matches the\n * `totalBidPrice` token the published formula strings are written against;\n * hosts override per tender via `AdjResponseReviewColumnMapping.responsePriceKey`.\n */\nexport const DEFAULT_RESPONSE_PRICE_KEY = 'totalBidPrice';\n\n/**\n * Default ALT sensitivity: a bid more than 15% below the median responsive\n * price (or below the estimated Rand value) is flagged for investigation.\n * A best-practice heuristic — SA guidance prescribes judgment, not a fixed\n * percentage — chosen at the sensitive end of the common 15–20% band so\n * borderline under-quotes surface rather than slip through.\n */\nexport const DEFAULT_ABNORMALLY_LOW_FRACTION = 0.15;\n\n/** Row key the engine writes its ALT flag to (read by the review template). */\nexport const ABNORMALLY_LOW_FLAG_KEY = 'adj_priceScore_abnormallyLow';\n\n/** Inputs to {@link computePricePreference}. */\nexport interface PricePreferenceOptions {\n  /** Form key holding each row's price. Default {@link DEFAULT_RESPONSE_PRICE_KEY}. */\n  priceKey?: string;\n  /**\n   * Ids of bids the reviewers have marked non-compliant. Excluded from Pmin,\n   * the ALT median, and scored 0 (rule 2 — they are not \"acceptable tenders\").\n   */\n  nonResponsiveIds?: ReadonlySet<string>;\n  /**\n   * \"Rand value\" of the procurement (estimated contract value at invitation,\n   * taxes included). Drives scale auto-selection ahead of Pmin and anchors\n   * ALT detection. Optional.\n   */\n  estimatedProcurementValue?: number;\n  /**\n   * The system the tender was advertised under, when fixed up front. Wins\n   * over every auto-selection route (rule 5 precedence).\n   */\n  scaleOverride?: PricePreferenceScale;\n  /** ALT sensitivity as a fraction. Default {@link DEFAULT_ABNORMALLY_LOW_FRACTION}. */\n  abnormallyLowFraction?: number;\n}\n\n/** Per-bid outcome of one calculation pass. */\nexport interface PricePreferenceScore {\n  /**\n   * Points for price: zero-floored, rounded half-up to two decimals (rules\n   * 1 & 4). 0 for non-responsive bids and bids without a usable price.\n   */\n  readonly points: number;\n  /** Rule 3: priced suspiciously far below the responsive median / estimate. */\n  readonly abnormallyLow: boolean;\n  /** Excluded from Pmin because a reviewer marked the bid non-compliant. */\n  readonly nonResponsive: boolean;\n  /** The row carried no finite positive price under the price key. */\n  readonly priceMissing: boolean;\n}\n\n/** Outcome of one {@link computePricePreference} pass over the bid pool. */\nexport interface PricePreferenceResult {\n  /**\n   * False when no row at all carried a usable price — price data is not\n   * reaching the library, and the caller must keep whatever scores the host\n   * stamped. (An empty RESPONSIVE pool with prices present is still computed:\n   * no acceptable tender means every price score is 0.)\n   */\n  readonly computed: boolean;\n  /** The system applied (80 or 90), or null when nothing was computed. */\n  readonly scale: PricePreferenceScale | null;\n  /**\n   * Price of the lowest acceptable (responsive) tender; null when nothing was\n   * computed or every priced bid was disqualified.\n   */\n  readonly pMin: number | null;\n  /**\n   * Median of the responsive prices — the anchor abnormally-low detection\n   * measures drift against (rule 3). Exposed so the review UI can SHOW the\n   * anchor and each bid's drift from it, keeping the flag auditable rather\n   * than a black box. Null when no responsive bid carried a usable price.\n   */\n  readonly median: number | null;\n  /** Per-bid scores keyed by submission id. Empty when `computed` is false. */\n  readonly scores: ReadonlyMap<string, PricePreferenceScore>;\n}\n\n/**\n * Reads the 80/90 base out of a stored formula string such as\n * `80(1-((totalBidPrice-Pmin)/(Pmin)))` — the shape workflow steps persist in\n * `adjudicationPricePreferenceCalculationFormula`. Returns undefined for\n * anything else so auto-selection (rule 5) takes over.\n */\nexport function parsePreferenceScale(formula: string | undefined): PricePreferenceScale | undefined {\n  const match = /^\\s*(80|90)\\s*\\(/.exec(formula ?? '');\n  if (match?.[1] === '80') return 80;\n  if (match?.[1] === '90') return 90;\n  return undefined;\n}\n\n/**\n * Rule 5 precedence: advertised system → estimated Rand value → lowest\n * acceptable tender (reg 3(b)). Exported for the spec; `pMin` may be null\n * only while nothing is computable, in which case the default is 80/20 (the\n * band the overwhelming majority of tenders fall in).\n */\nexport function selectPreferenceScale(\n  scaleOverride: PricePreferenceScale | undefined,\n  estimatedProcurementValue: number | undefined,\n  pMin: number | null,\n): PricePreferenceScale {\n  if (scaleOverride) return scaleOverride;\n  if (Number.isFinite(estimatedProcurementValue) && (estimatedProcurementValue as number) > 0) {\n    return (estimatedProcurementValue as number) <= RAND_VALUE_SCALE_THRESHOLD ? 80 : 90;\n  }\n  if (pMin !== null) {\n    return pMin <= RAND_VALUE_SCALE_THRESHOLD ? 80 : 90;\n  }\n  return 80;\n}\n\n/** Rule 4: full precision internally; final figure only, two decimals, half-up. */\nfunction roundToTwoDecimals(value: number): number {\n  return Math.round((value + Number.EPSILON) * 100) / 100;\n}\n\n/** Median of a non-empty list (mean of the middle pair for even lengths). */\nfunction median(sortedAscending: readonly number[]): number {\n  const mid = Math.floor(sortedAscending.length / 2);\n  return sortedAscending.length % 2 === 1\n    ? sortedAscending[mid]!\n    : (sortedAscending[mid - 1]! + sortedAscending[mid]!) / 2;\n}\n\n/**\n * One full calculation pass over the bid pool.\n *\n * Pure and synchronous: feed it the current rows and the current review\n * verdicts and every score comes back consistent with that state — which is\n * what makes rule 2's \"recalculate instantly on disqualification\" a matter of\n * simply calling it again from reactive state.\n *\n * @param rows - The submission rows (each must carry `id`; prices are read\n *   from `options.priceKey`).\n * @param options - See {@link PricePreferenceOptions}.\n * @returns See {@link PricePreferenceResult}; check `computed` before use.\n */\nexport function computePricePreference(\n  rows: readonly ISubmission[],\n  options?: PricePreferenceOptions,\n): PricePreferenceResult {\n  const priceKey = options?.priceKey || DEFAULT_RESPONSE_PRICE_KEY;\n  const nonResponsiveIds = options?.nonResponsiveIds ?? new Set<string>();\n  const altFraction = options?.abnormallyLowFraction ?? DEFAULT_ABNORMALLY_LOW_FRACTION;\n\n  const priceOf = (row: ISubmission): number | undefined => {\n    const price = Number(row[priceKey]);\n    return Number.isFinite(price) && price > 0 ? price : undefined;\n  };\n\n  // The engine only stands down when price data simply is not reaching the\n  // library: no row at all carries a usable price under the price key. Then\n  // the caller keeps host-stamped scores (the pre-engine behaviour).\n  const anyUsablePrice = rows.some(row => priceOf(row) !== undefined);\n  if (!anyUsablePrice) {\n    return { computed: false, scale: null, pMin: null, median: null, scores: new Map() };\n  }\n\n  // Rule 2: the acceptable pool is responsive bids with a usable price. An\n  // EMPTY pool (every priced bid disqualified) is still a computed state —\n  // with no acceptable tender there is no Pmin and every price score is 0.\n  const responsivePrices = rows\n    .filter(row => !nonResponsiveIds.has(row.id))\n    .map(priceOf)\n    .filter((price): price is number => price !== undefined)\n    .sort((a, b) => a - b);\n\n  const pMin = responsivePrices.length > 0 ? responsivePrices[0]! : null;\n  const scale = selectPreferenceScale(\n    options?.scaleOverride,\n    options?.estimatedProcurementValue,\n    pMin,\n  );\n\n  // Rule 3 anchors: the responsive median, plus the estimate when provided.\n  const responsiveMedian = responsivePrices.length > 0 ? median(responsivePrices) : undefined;\n  const altBelowMedian =\n    responsiveMedian !== undefined ? responsiveMedian * (1 - altFraction) : undefined;\n  const estimate = options?.estimatedProcurementValue;\n  const altBelowEstimate =\n    Number.isFinite(estimate) && (estimate as number) > 0\n      ? (estimate as number) * (1 - altFraction)\n      : undefined;\n\n  const scores = new Map<string, PricePreferenceScore>();\n  for (const row of rows) {\n    const nonResponsive = nonResponsiveIds.has(row.id);\n    const price = priceOf(row);\n    const priceMissing = price === undefined;\n\n    let points = 0;\n    if (!nonResponsive && price !== undefined && pMin !== null) {\n      // Regs 4(1)/5(1): Ps = scale × (1 − (Pt − Pmin) / Pmin), floored at 0\n      // (rule 1) and rounded last (rule 4).\n      points = roundToTwoDecimals(Math.max(0, scale * (1 - (price - pMin) / pMin)));\n    }\n\n    // A disqualified bid is never flagged: it is already out of the pool and\n    // cannot hold Pmin, which is the risk the flag exists to surface.\n    const abnormallyLow =\n      !nonResponsive &&\n      price !== undefined &&\n      ((altBelowMedian !== undefined && price < altBelowMedian) ||\n        (altBelowEstimate !== undefined && price < altBelowEstimate));\n\n    scores.set(row.id, { points, abnormallyLow, nonResponsive, priceMissing });\n  }\n\n  return { computed: true, scale, pMin, median: responsiveMedian ?? null, scores };\n}\n","export function getColorForNumber(targetNumber: number, numbers: number[], asc = true): string {\r\n    if (numbers.length === 0) {\r\n        throw new Error(\"The numbers array must not be empty.\");\r\n    }\r\n\r\n    // Avoid sorting the original array\r\n    const sortedNumbers = [...numbers].sort((a, b) => asc ? a - b : b - a);\r\n    const min = sortedNumbers[0];\r\n    const max = sortedNumbers[sortedNumbers.length - 1];\r\n    if (!min || !max) {\r\n        return \"rgb(173, 173, 173)\";\r\n    }\r\n    if (min === max) {\r\n        return \"rgb(173, 173, 173)\"; // Return gray if there is no range\r\n    }\r\n\r\n    const interpolateColor = (value: number): string => {\r\n        const fraction = (value - min) / (max - min);\r\n        const colors = [\r\n            { color: [247, 0, 0], pos: 0.0 },    // Red\r\n            { color: [247, 187, 0], pos: 0.25 }, // Orange\r\n            { color: [247, 247, 0], pos: 0.5 },  // Yellow\r\n            { color: [207, 247, 0], pos: 0.75 }, // Light green\r\n            { color: [96, 247, 0], pos: 1.0 }    // Green\r\n        ];\r\n\r\n        for (let i = 0; i < colors.length - 1; i++) {\r\n            const nextColor = colors[i + 1]\r\n            const currentColor = colors[i]\r\n            if (currentColor && nextColor && fraction <= nextColor.pos) {\r\n\r\n                const range = nextColor.pos - currentColor.pos;\r\n                const localFraction = (fraction - currentColor.pos) / range;\r\n                const r = Math.round(currentColor.color[0]! + localFraction * (nextColor.color[0]! - currentColor.color[0]!));\r\n                const g = Math.round(currentColor.color[1]! + localFraction * (nextColor.color[1]! - currentColor.color[1]!));\r\n                const b = Math.round(currentColor.color[2]! + localFraction * (nextColor.color[2]! - currentColor.color[2]!));\r\n                return `rgb(${r}, ${g}, ${b})`;\r\n            }\r\n        }\r\n\r\n        return `rgb(${colors[colors.length - 1]?.color[0]}, ${colors[colors.length - 1]?.color[1]}, ${colors[colors.length - 1]?.color[2]},0.6)`;\r\n    };\r\n\r\n    return interpolateColor(targetNumber);\r\n}\r\n","import type { Op } from 'quill';\n\nimport type { QuillContent } from '../../../editor-input-element/core/quill-input/quill.config';\n\n/**\n * Normalises whatever is stored under `adj_microFlow_review_notes` — or\n * configured as a step's `adjudicationReviewFeedbackTemplate` — into the\n * Quill Delta shape the notes editor consumes.\n *\n * The notes editor used to be EditorJS, so live documents hold EditorJS\n * `OutputData` (`{ blocks: [...] }`) and workflow steps hold EditorJS-shaped\n * feedback templates. Those must keep opening readably, so this converter is\n * the single migration boundary:\n *\n * - a Quill payload (`{ ops: [...] }`) passes through untouched;\n * - a legacy EditorJS document is flattened block-by-block (paragraphs,\n *   headers, lists, quotes, tables, code, delimiters) with inline HTML\n *   stripped — formatting fidelity is best-effort, the TEXT is what survives;\n * - a bare string becomes a single paragraph;\n * - anything else (including `{}` from an unconfigured template) → undefined.\n *\n * A document saved after this change is Quill-native and round-trips exactly.\n */\nexport function toQuillNotes(value: unknown): QuillContent | undefined {\n  if (value === null || value === undefined) return undefined;\n\n  if (typeof value === 'string') {\n    const text = value.trim();\n    return text ? { ops: [{ insert: text.endsWith('\\n') ? text : `${text}\\n` }] } : undefined;\n  }\n\n  if (typeof value !== 'object') return undefined;\n  const record = value as Record<string, unknown>;\n\n  if (Array.isArray(record['ops'])) {\n    // Same reference back, not a re-wrap: identity survives, so equality\n    // guards downstream (`_isEqual` short-circuits) see an unchanged value.\n    return (record['ops'] as Op[]).length > 0 ? (value as QuillContent) : undefined;\n  }\n\n  if (Array.isArray(record['blocks'])) {\n    const ops = (record['blocks'] as unknown[]).flatMap(blockToOps);\n    return ops.length > 0 ? { ops } : undefined;\n  }\n\n  return undefined;\n}\n\n/** One legacy EditorJS block → the Delta ops that carry its text. */\nfunction blockToOps(block: unknown): Op[] {\n  if (typeof block !== 'object' || block === null) return [];\n  const { type, data } = block as { type?: unknown; data?: Record<string, unknown> };\n\n  switch (type) {\n    case 'header': {\n      const text = plainText(data?.['text']);\n      if (!text) return [];\n      const level = Number(data?.['level']);\n      return [\n        { insert: text },\n        { insert: '\\n', attributes: { header: level >= 1 && level <= 6 ? level : 2 } },\n      ];\n    }\n    case 'list': {\n      const style = data?.['style'] === 'ordered' ? 'ordered' : 'bullet';\n      const items = Array.isArray(data?.['items']) ? (data['items'] as unknown[]) : [];\n      return items.flatMap((item): Op[] => {\n        // Items are plain strings in old documents, `{ content }` in newer ones.\n        const text = plainText(\n          typeof item === 'object' && item !== null\n            ? (item as Record<string, unknown>)['content']\n            : item,\n        );\n        return text ? [{ insert: text }, { insert: '\\n', attributes: { list: style } }] : [];\n      });\n    }\n    case 'quote': {\n      const text = plainText(data?.['text']);\n      return text ? [{ insert: text }, { insert: '\\n', attributes: { blockquote: true } }] : [];\n    }\n    case 'code': {\n      const code = typeof data?.['code'] === 'string' ? data['code'] : '';\n      return code ? [{ insert: code }, { insert: '\\n', attributes: { 'code-block': true } }] : [];\n    }\n    case 'table': {\n      // Rows flatten to \"cell | cell\" lines — legible, if no longer a table.\n      const content = Array.isArray(data?.['content']) ? (data['content'] as unknown[]) : [];\n      return content.flatMap((row): Op[] => {\n        if (!Array.isArray(row)) return [];\n        const line = row.map((cell) => plainText(cell)).filter(Boolean).join(' | ');\n        return line ? [{ insert: `${line}\\n` }] : [];\n      });\n    }\n    case 'delimiter':\n      return [{ insert: '---\\n' }];\n    default: {\n      // Paragraphs, and any unknown block that carries a `text` field.\n      const text = plainText(data?.['text']);\n      return text ? [{ insert: `${text}\\n` }] : [];\n    }\n  }\n}\n\n/** Strips EditorJS inline HTML down to text; `<br>` survives as a newline. */\nfunction plainText(value: unknown): string {\n  if (typeof value !== 'string') return '';\n  return value\n    .replace(/<br\\s*\\/?>/gi, '\\n')\n    .replace(/<[^>]+>/g, '')\n    .replace(/&nbsp;/g, ' ')\n    .replace(/&amp;/g, '&')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .trim();\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { QuillInputComponent } from '../../../../../editor-input-element/core/quill-input/quill-input.component';\r\nimport type { QuillContent } from '../../../../../editor-input-element/core/quill-input/quill.config';\r\nimport { toQuillNotes } from '../../quill-notes';\r\n\r\nexport interface SubmissionReviewDialogData {\r\n  readonly: boolean;\r\n  respondentNameKey: string;\r\n  respondentCodeKey: string;\r\n  /**\r\n   * The step's interpolated feedback template. `unknown` because live configs\r\n   * are EditorJS-shaped — `toQuillNotes` migrates whatever arrives.\r\n   */\r\n  activeRowNotes: unknown;\r\n  row: {\r\n    nameOfBidder: string;\r\n    [key: string]: unknown;\r\n    /** Saved notes: Quill going forward, EditorJS `OutputData` in legacy rows. */\r\n    adj_microFlow_review_notes: unknown;\r\n    adj_microFlow_assignedScore: Record<string, number>;\r\n  };\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-submission-review-dialog',\r\n  templateUrl: './submission-review-dialog.component.html',\r\n  styleUrl: './submission-review-dialog.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  imports: [MatDialogModule, MatFormFieldModule, MatButtonModule, QuillInputComponent],\r\n})\r\nexport class SubmissionReviewDialogComponent {\r\n  protected readonly dialogRef = inject<MatDialogRef<SubmissionReviewDialogComponent>>(MatDialogRef);\r\n  protected readonly data = inject<SubmissionReviewDialogData>(MAT_DIALOG_DATA);\r\n\r\n  /**\r\n   * What the Quill editor opens with: the saved notes when any exist, else the\r\n   * step's feedback template — each migrated from its stored shape (legacy\r\n   * EditorJS documents included) by {@link toQuillNotes}.\r\n   */\r\n  protected readonly initialNotes: QuillContent | undefined =\r\n    toQuillNotes(this.data.row['adj_microFlow_review_notes']) ?? toQuillNotes(this.data.activeRowNotes);\r\n\r\n  protected changedNotes: QuillContent | undefined;\r\n\r\n  protected get notesInputConfig(): ITowerStepColumn {\r\n    return {\r\n      id: 'adj_microFlow_review_notes',\r\n      label: 'Notes',\r\n      readonly: this.data.readonly,\r\n      required: false,\r\n      formControlName: 'adj_microFlow_review_notes',\r\n    } as ITowerStepColumn;\r\n  }\r\n\r\n  protected get respondentName(): string {\r\n    const raw = this.data.row[this.data.respondentNameKey];\r\n    return typeof raw === 'string' ? raw : '';\r\n  }\r\n\r\n  protected notesChanged(notes: QuillContent | undefined): void {\r\n    this.changedNotes = notes;\r\n  }\r\n}\r\n","<span mat-dialog-title>\r\n    Review Feedback For <span class=\"bidder-name\">{{  respondentName }}</span>\r\n</span>\r\n\r\n<div class=\"dialog-instructions\">\r\n    <p>\r\n        Your notes will be visible to the respondent. Provide <strong>clear, constructive feedback</strong> to\r\n        guide their future submissions.\r\n    </p>\r\n</div>\r\n<mat-dialog-content style=\"padding-bottom: 8px;padding-bottom: 8px\">\r\n    <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n                  display: absolute;\r\n                  left: 0;\r\n                  margin-bottom: 8px;\r\n                  margin-top: 8px;\r\n                  border-radius:16px;\" appearance=\"outline\">\r\n        <lib-quill-input [value]=\"initialNotes\"\r\n            (valueChanged)=\"notesChanged($event)\" ngDefaultControl [inputConfig]=\"notesInputConfig\"\r\n            [required]=\"notesInputConfig.required\">\r\n        </lib-quill-input>\r\n        <mat-hint>\r\n            <strong>Tip:</strong> Use bold, lists, and tables to structure your feedback.\r\n        </mat-hint>\r\n    </mat-form-field>\r\n</mat-dialog-content>\r\n\r\n\r\n<mat-dialog-actions align=\"end\">\r\n    <button mat-dialog-close mat-button >\r\n        Cancel\r\n    </button>\r\n        @if( !data.readonly){\r\n    <button mat-flat-button\r\n        [mat-dialog-close]=\"changedNotes\"\r\n    >\r\n        Save Feedback\r\n    </button>}\r\n</mat-dialog-actions>","import { AsyncPipe, DecimalPipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, computed, effect, inject, input, output, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { BehaviorSubject, Observable, combineLatest, map, shareReplay, take, tap } from 'rxjs';\r\n\r\nimport { AdjudicationSteps, InputDataTypes, ITowerStepColumn, IWorkflowDocListCols, AdjResponseReviewColumnMapping, WorkflowAdjudicationMicroFlowReviewValue } from 'ngx-t-forms-types';\r\n\r\nimport type { QuillContent } from '../../../editor-input-element/core/quill-input/quill.config';\r\n\r\n/**\r\n * Internal review status union for adjudication micro-flow rows.\r\n * Mirrors the shared `WorkflowAdjudicationMicroFlowReviewValue.adj_microFlow_review`\r\n * optional literal union and includes `undefined` for the \"not yet reviewed\" branch.\r\n */\r\ntype AdjMicroFlowReviewStatus = 'compliant' | 'non-compliant' | undefined;\r\n\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens/index';\r\nimport { AdjChartVm } from '../adjudication-chart/adjudication-chart.component';\r\nimport { AdjudicationDocsContext } from '../adjudication-docs/adjudication-docs.component';\r\nimport { AdjudicationShellComponent } from '../adjudication-shell/adjudication-shell.component';\r\nimport { MicroflowSubmissionsPayload, describeError, microflowFetchStates } from '../../microflow-fetch';\r\nimport {\r\n  ABNORMALLY_LOW_FLAG_KEY,\r\n  DEFAULT_ABNORMALLY_LOW_FRACTION,\r\n  DEFAULT_RESPONSE_PRICE_KEY,\r\n  PricePreferenceResult,\r\n  PricePreferenceScale,\r\n  computePricePreference,\r\n  parsePreferenceScale,\r\n} from '../../price-preference';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { SubmissionReviewDialogComponent } from './elements/submission-review-dialog/submission-review-dialog.component';\r\n\r\n// --- TYPE DEFINITIONS FOR ROBUSTNESS ---\r\n\r\nexport interface ISubmission extends Record<string, any> {\r\n  id: string;\r\n  adjudicationPricePreferenceCalculationColor?: string;\r\n  backgroundShades?: Record<string, string>;\r\n}\r\n/**\r\n * Column of an adjudication table.\r\n *\r\n * Deliberately standalone rather than derived from `IWorkflowDocListCols`: these\r\n * columns are declared inline by the adjudication components and never address a\r\n * stored document, so the document `path` that the workflow-list columns require\r\n * would have no meaning here.\r\n */\r\nexport interface tableCols {\r\n  label: string;\r\n  formControlName: string;\r\n  /** Includes the internal `'actions'` cell type used by this template's @switch. */\r\n  type?: IWorkflowDocListCols['type'] | 'actions';\r\n  showColor?: boolean;\r\n  maxWidth?: string;\r\n}\r\ninterface IViewModel {\r\n  submissions: ISubmission[];\r\n  columnMapping: AdjResponseReviewColumnMapping;\r\n  displayColumns?: tableCols[];\r\n  displayCols: string[];\r\n  loading: boolean;\r\n  error?: string;\r\n  /**\r\n   * The preference point system the engine applied, as \"80/20\" / \"90/10\"\r\n   * (PPR 2022 regs 4–5). Undefined while scores come host-stamped instead of\r\n   * from the library engine.\r\n   */\r\n  priceSystem?: string;\r\n  /**\r\n   * The \"records by price\" chart, present only while the engine is computing\r\n   * (it needs real prices and the median anchor). Undefined in host-stamped\r\n   * mode — the shell's chart button hides with it.\r\n   */\r\n  priceChart?: AdjChartVm;\r\n  /** Live context the shell's guide adapts its content to. */\r\n  docsContext: AdjudicationDocsContext;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-submission-review',\r\n  templateUrl: './submission-review.component.html',\r\n  styleUrls: ['./submission-review.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  imports: [\r\n    AsyncPipe,\r\n    DecimalPipe,\r\n    FormsModule,\r\n    OverlayModule,\r\n    MatButtonModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatProgressSpinnerModule,\r\n    MatRippleModule,\r\n    MatSelectModule,\r\n    MatTableModule,\r\n    MatTooltipModule,\r\n    DaysAgoPipe,\r\n    AdjudicationShellComponent,\r\n  ],\r\n})\r\nexport class SubmissionReviewComponent {\r\n  readonly #config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n  readonly #destroyRef = inject(DestroyRef);\r\n  readonly dialog = inject(MatDialog);\r\n\r\n  readonly #refreshTrigger = new BehaviorSubject<void>(undefined);\r\n  // A stream to push updates of the review values (`this.value`)\r\n  readonly #valueChanges$ = new BehaviorSubject<WorkflowAdjudicationMicroFlowReviewValue[] | null>([]);\r\n\r\n  readonly #valueSignal = signal<WorkflowAdjudicationMicroFlowReviewValue[] | null>([]);\r\n  #value: WorkflowAdjudicationMicroFlowReviewValue[] | null = [];\r\n\r\n  readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\r\n  /** The current review payload. Null while loading. */\r\n  // Parent (`workflow-adjudication-reactive-input`) passes a `WorkflowAdjudicationValue | null`\r\n  // union that includes three incompatible shapes (score-sheet array, micro-flow review array,\r\n  // response-elected-supplier object). This component only consumes the micro-flow branch; the\r\n  // input must remain `any` until parent template typing is split per micro-flow.\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step type, then narrow this input.\r\n  readonly value = input<any>(null);\r\n\r\n  protected readonly valueBridge = effect(() => {\r\n    const raw: unknown = this.value();\r\n    // `?? []` is NOT enough here: an unsaved control reaches this input as the\r\n    // empty string (`formGenerator`'s `value || ''` seed), and any non-array\r\n    // slipping through crashes the enrich pass (`''.find is not a function`) —\r\n    // which the old vm$ catchError then misreported as a fetch failure.\r\n    // Same guard as the sibling steps (point-assignment / supplier-selection).\r\n    const next: WorkflowAdjudicationMicroFlowReviewValue[] = Array.isArray(raw)\r\n      ? (raw as WorkflowAdjudicationMicroFlowReviewValue[])\r\n      : [];\r\n    if (_isEqual(next, this.#value)) return;\r\n    this.#value = next;\r\n    this.#valueSignal.set(next);\r\n    this.#valueChanges$.next(next);\r\n  });\r\n\r\n  readonly reviewChange = output<WorkflowAdjudicationMicroFlowReviewValue[]>();\r\n\r\n  protected selected: string = '';\r\n  protected columnMapping: AdjResponseReviewColumnMapping | undefined = undefined;\r\n  protected submissions: ISubmission[] = [];\r\n\r\n  readonly #initialState: IViewModel = {\r\n    loading: true,\r\n    submissions: [],\r\n    columnMapping: { respondentNameKey: '', respondentCodeKey: '' },\r\n    displayCols: [],\r\n    displayColumns: [],\r\n    error: undefined,\r\n    docsContext: { step: AdjudicationSteps.SubMissionReview },\r\n  };\r\n\r\n  // One fetch per trigger; failures become 'failed' states instead of killing\r\n  // the stream, so \"Try Again\" genuinely refetches. See `microflowFetchStates`.\r\n  readonly #fetchedData$ = microflowFetchStates(this.#refreshTrigger, () =>\r\n    this.#config.formBuilder.getCurrentStepMicroflowSubmissions(),\r\n  );\r\n\r\n  /**\r\n   * Combines the fetched data with the ongoing stream of local review changes\r\n   * (`valueChanges$`), so a status/note edit re-projects without re-fetching.\r\n   *\r\n   * Failure is reported per branch: a fetch error and a projection error render\r\n   * different messages, so a bug in the enrich/sort pass can never masquerade\r\n   * as \"the server call failed\" (which is exactly how the `''.find` crash from\r\n   * a non-array `value` used to surface).\r\n   */\r\n  protected readonly vm$: Observable<IViewModel> = combineLatest([\r\n    this.#fetchedData$,\r\n    this.#valueChanges$\r\n  ]).pipe(\r\n    map(([fetched, reviewValues]): IViewModel => {\r\n      if (fetched.status === 'loading') {\r\n        return this.#initialState;\r\n      }\r\n      if (fetched.status === 'failed') {\r\n        return {\r\n          ...this.#initialState,\r\n          loading: false,\r\n          error: `Could not load submissions: ${fetched.reason}`,\r\n        };\r\n      }\r\n      try {\r\n        return this.#buildViewModel(fetched.payload, reviewValues);\r\n      } catch (error: unknown) {\r\n        // The data DID arrive — say so, and surface the real reason instead of\r\n        // swallowing it into a generic load-failure message.\r\n        return {\r\n          ...this.#initialState,\r\n          loading: false,\r\n          error: `Submissions were received but could not be displayed: ${describeError(error)}`,\r\n        };\r\n      }\r\n    }),\r\n    shareReplay(1)\r\n  );\r\n\r\n  /**\r\n   * Projects a successful fetch plus the current local review values into the\r\n   * view model. A throw here is caught by `vm$` and reported as a display\r\n   * failure — never as a load failure.\r\n   */\r\n  #buildViewModel(\r\n    payload: MicroflowSubmissionsPayload,\r\n    reviewValues: WorkflowAdjudicationMicroFlowReviewValue[] | null,\r\n  ): IViewModel {\r\n    const { columnMapping } = payload;\r\n\r\n    this.columnMapping = columnMapping;\r\n\r\n    // PPPFA engine pass (see ../../price-preference.ts): points for price are\r\n    // recomputed here, from the tendered prices and the CURRENT verdicts, on\r\n    // every projection — so marking a bid non-compliant re-derives Pmin and\r\n    // every other score in the same pass (engine rule 2). Host-stamped scores\r\n    // remain the fallback when no price data reaches the library.\r\n    const { rows, scale, chart } = this.#applyPricePreference(payload, reviewValues);\r\n    this.submissions = rows;\r\n\r\n    const enrichedSubmissions = this.#enrichSubmissionsData(rows, columnMapping, reviewValues);\r\n    const calcKey = columnMapping.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation';\r\n    const sortedSubmissions = [...enrichedSubmissions].sort((a, b) => Number(b[calcKey]) - Number(a[calcKey]));\r\n    return {\r\n      loading: false,\r\n      submissions: sortedSubmissions,\r\n      columnMapping: columnMapping,\r\n      priceSystem: scale ? `${scale}/${100 - scale}` : undefined,\r\n      priceChart: chart,\r\n      docsContext: {\r\n        step: AdjudicationSteps.SubMissionReview,\r\n        system: scale ? `${scale}/${100 - scale}` : undefined,\r\n        priceKey: scale ? columnMapping.responsePriceKey || DEFAULT_RESPONSE_PRICE_KEY : undefined,\r\n        complianceLimit: this.maxLimit(),\r\n      },\r\n      displayCols: [columnMapping.respondentNameKey, 'adjudicationPricePreferenceCalculation', 'status', 'actions'],\r\n      displayColumns: [\r\n        { label: 'name', formControlName: columnMapping.respondentNameKey, type: InputDataTypes.String },\r\n        { label: 'Preference', formControlName: 'adjudicationPricePreferenceCalculation', type: InputDataTypes.Number, showColor: true },\r\n        { label: 'Actions', formControlName: 'actions', type: InputDataTypes.String },\r\n        { label: 'status and Notes', formControlName: 'status', type: 'actions' },\r\n      ],\r\n      error: undefined,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Latest per-id points for price computed by the engine, or null while the\r\n   * engine is not computing (no usable prices → host-stamped mode). Read by\r\n   * {@link #withCurrentScores} so every emission carries current figures.\r\n   */\r\n  #priceScores: ReadonlyMap<string, number> | null = null;\r\n\r\n  /**\r\n   * Runs the PPPFA price preference engine over the fetched rows and writes\r\n   * the outcome onto copies of them: the points under the preference\r\n   * calculation key (so sorting, colour banding and review records all read\r\n   * the engine's figure) and the abnormally-low flag under\r\n   * `ABNORMALLY_LOW_FLAG_KEY` (rendered as the amber warning in the points\r\n   * column — flagged for investigation, never auto-excluded).\r\n   *\r\n   * Scale precedence (engine rule 5): the step's configured formula string\r\n   * (the advertised system) → the estimated Rand value → the lowest\r\n   * acceptable tender (PPR 2022 reg 3(b)).\r\n   *\r\n   * When no responsive row carries a usable price under\r\n   * `columnMapping.responsePriceKey` (default `totalBidPrice`), the rows pass\r\n   * through untouched and host-stamped scores keep working — the pre-engine\r\n   * behaviour.\r\n   */\r\n  #applyPricePreference(\r\n    payload: MicroflowSubmissionsPayload,\r\n    reviewValues: WorkflowAdjudicationMicroFlowReviewValue[] | null,\r\n  ): { rows: ISubmission[]; scale: PricePreferenceScale | null; chart?: AdjChartVm } {\r\n    const { submissions, columnMapping } = payload;\r\n    const nonResponsiveIds = new Set(\r\n      (reviewValues ?? [])\r\n        .filter((v) => v.adj_microFlow_review === 'non-compliant')\r\n        .map((v) => v.id),\r\n    );\r\n    const result = computePricePreference(submissions, {\r\n      priceKey: columnMapping.responsePriceKey,\r\n      nonResponsiveIds,\r\n      estimatedProcurementValue: payload.estimatedProcurementValue,\r\n      scaleOverride: parsePreferenceScale(payload.adjudicationPricePreferenceCalculationFormula),\r\n    });\r\n    if (!result.computed) {\r\n      this.#priceScores = null;\r\n      return { rows: submissions, scale: null };\r\n    }\r\n    const calcKey = columnMapping.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation';\r\n    this.#priceScores = new Map(\r\n      Array.from(result.scores, ([id, score]) => [id, score.points] as const),\r\n    );\r\n    return {\r\n      scale: result.scale,\r\n      chart: this.#buildPriceChart(submissions, columnMapping, result),\r\n      rows: submissions.map((row) => {\r\n        const score = result.scores.get(row.id);\r\n        if (!score) return row;\r\n        return { ...row, [calcKey]: score.points, [ABNORMALLY_LOW_FLAG_KEY]: score.abnormallyLow };\r\n      }),\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Projects an engine pass into the shared adjudication chart: one price bar\r\n   * and one points bar per bid on a shared axis, the responsive median and\r\n   * the abnormally-low cutoff (median − 15%) as reference lines, and a\r\n   * per-bid drift note so the chart SAYS why a bid is flagged, not just\r\n   * paints it amber. Rows without a usable price are left off and counted in\r\n   * the footnote.\r\n   */\r\n  #buildPriceChart(\r\n    submissions: ISubmission[],\r\n    columnMapping: AdjResponseReviewColumnMapping,\r\n    result: PricePreferenceResult,\r\n  ): AdjChartVm | undefined {\r\n    if (result.scale === null) return undefined;\r\n    const scale = result.scale;\r\n    const priceKey = columnMapping.responsePriceKey || DEFAULT_RESPONSE_PRICE_KEY;\r\n\r\n    const priced = submissions\r\n      .map((row) => {\r\n        const price = Number(row[priceKey]);\r\n        const score = result.scores.get(row.id);\r\n        if (!Number.isFinite(price) || price <= 0 || !score) return null;\r\n        return { row, price, score };\r\n      })\r\n      .filter((entry): entry is NonNullable<typeof entry> => entry !== null)\r\n      .sort((a, b) => a.price - b.price);\r\n    if (priced.length === 0) return undefined;\r\n\r\n    const median = result.median;\r\n    const cutoff = median !== null ? median * (1 - DEFAULT_ABNORMALLY_LOW_FRACTION) : null;\r\n    // 5% headroom so the longest bar never kisses the edge; the median line\r\n    // must always sit inside the axis even when every bid is below it.\r\n    const axisMax = Math.max(priced[priced.length - 1]!.price, median ?? 0) * 1.05;\r\n    const pct = (value: number): number => Math.round((value / axisMax) * 1000) / 10;\r\n    const rand = (value: number): string =>\r\n      `R ${value.toLocaleString('en-ZA', { maximumFractionDigits: 2 })}`;\r\n\r\n    const unpriced = submissions.length - priced.length;\r\n    return {\r\n      caption: `Thick bar = tendered price · thin bar = points for price (0–${scale}). ` +\r\n        (median !== null\r\n          ? 'Bids left of the −15% line sit in the shaded zone: abnormally low against the median.'\r\n          : ''),\r\n      zonePct: cutoff !== null ? pct(cutoff) : undefined,\r\n      refs: [\r\n        ...(median !== null ? [{ label: 'median', pct: pct(median), kind: 'neutral' as const }] : []),\r\n        ...(cutoff !== null ? [{ label: '−15%', pct: pct(cutoff), kind: 'warning' as const }] : []),\r\n      ],\r\n      legend: [\r\n        { label: 'Tendered price', kind: 'primary' },\r\n        { label: 'Abnormally low — investigate', kind: 'warning' },\r\n        { label: `Points for price (0–${scale})`, kind: 'secondary' },\r\n      ],\r\n      footnote: unpriced > 0\r\n        ? `${unpriced} submission(s) carry no usable price under “${priceKey}” and are not charted.`\r\n        : undefined,\r\n      rows: priced.map(({ row, price, score }) => {\r\n        const drift = median !== null ? ((price - median) / median) * 100 : null;\r\n        return {\r\n          id: row.id,\r\n          name: String(row[columnMapping.respondentNameKey] ?? row.id),\r\n          primaryPct: pct(price),\r\n          primaryLabel: rand(price),\r\n          secondaryPct: Math.round((score.points / scale) * 1000) / 10,\r\n          secondaryLabel: `${score.points.toFixed(2)} pts`,\r\n          state: score.nonResponsive ? 'muted' : score.abnormallyLow ? 'warning' : 'normal',\r\n          note: score.nonResponsive\r\n            ? 'non-compliant — excluded from benchmark'\r\n            : score.abnormallyLow && drift !== null\r\n              ? `${Number((-drift).toFixed(1))}% below median — investigate`\r\n              : undefined,\r\n        };\r\n      }),\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Single funnel for every review emission. Re-stamps each record with the\r\n   * engine's CURRENT points before it leaves the component, so a verdict that\r\n   * shifted Pmin updates the committed score of EVERY record in the same\r\n   * emission — the saved value can never carry a score computed against a\r\n   * superseded Pmin (engine rule 2, extended to the audit trail). A no-op in\r\n   * host-stamped mode.\r\n   */\r\n  #emitReview(\r\n    values: WorkflowAdjudicationMicroFlowReviewValue[],\r\n  ): WorkflowAdjudicationMicroFlowReviewValue[] {\r\n    const scores = this.#priceScores;\r\n    const stamped = !scores\r\n      ? values\r\n      : values.map((v) => {\r\n          const points = scores.get(v.id);\r\n          return points === undefined || v.adjudicationPricePreferenceCalculation === points\r\n            ? v\r\n            : { ...v, adjudicationPricePreferenceCalculation: points };\r\n        });\r\n    this.reviewChange.emit(stamped);\r\n    return stamped;\r\n  }\r\n\r\n  loadMicroSubmissions(): void {\r\n    this.#refreshTrigger.next();\r\n  }\r\n\r\n  /**\r\n   * REFACTORED: Now accepts `reviewValues` as a parameter instead of relying on `this.value`.\r\n   */\r\n  #enrichSubmissionsData(\r\n    submissions: ISubmission[],\r\n    cols: AdjResponseReviewColumnMapping,\r\n    reviewValues: WorkflowAdjudicationMicroFlowReviewValue[] | null\r\n  ): ISubmission[] {\r\n    const numberSets = new Map<string, number[]>();\r\n    numberSets.set(\r\n      cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation',\r\n      submissions.map((s) => Number(s[cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'] || 0))\r\n    );\r\n    // NOTE(phase-4): the legacy fallback assigns review-value rows into a submission-shaped slot —\r\n    // the two only share `id`, so most downstream property reads degrade to undefined. Preserved\r\n    // for behavioural parity. `ISubmission` extends `Record<string, any>`, so review-value entries\r\n    // satisfy the structural shape (with most fields as undefined). Flagged as a pre-existing\r\n    // latent defect — out of scope for Phase 4 type tightening.\r\n    const list: ReadonlyArray<ISubmission> = submissions.length > 0\r\n      ? submissions\r\n      : ((this.#value ?? []) as ReadonlyArray<ISubmission>);\r\n    return list.map((submission: ISubmission) => {\r\n      const priceCalcKey = cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation';\r\n      const numbers = numberSets.get(priceCalcKey) || [];\r\n      const color = numbers.length === 0 ? submission.adjudicationPricePreferenceCalculationColor : this.#getColorString(submission[priceCalcKey], numbers);\r\n      const backgroundShades = numbers.length === 0 ? submission['backgroundShades'] : { [priceCalcKey]: this.#getScoreShade(color ?? '') };\r\n      // Use the passed `reviewValues` argument. Notes stay `unknown` here —\r\n      // they are forwarded as stored (legacy EditorJS payloads included); the\r\n      // notes dialog migrates to Quill format on open via `toQuillNotes`.\r\n      const submissionReview: Partial<WorkflowAdjudicationMicroFlowReviewValue> =\r\n        reviewValues?.find((v) => v.id === submission.id) ?? {};\r\n\r\n      return {\r\n        ...submission,\r\n        submissionIsReviewed: !!submissionReview,\r\n        adj_microFlow_review_notes: submissionReview?.adj_microFlow_review_notes || '',\r\n        submissionHasReviewNotes: !!submissionReview?.adj_microFlow_review_notes,\r\n        adj_microFlow_review: submissionReview?.['adj_microFlow_review'],\r\n        adjudicationPricePreferenceCalculationColor: color,\r\n        adjudicationPricePreferenceCalculation: submission[cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'],\r\n        backgroundShades\r\n      };\r\n    });\r\n  }\r\n\r\n  #getColorString(target: number, numbers: number[]): string {\r\n    return getColorForNumber(target, numbers, true);\r\n  }\r\n\r\n  #getScoreShade(rgbColor: string): string {\r\n    if (!rgbColor) return '';\r\n    return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n  }\r\n\r\n  viewMicroSubmission(res: ISubmission): void {\r\n    const alreadyInValue = this.#value?.find((v) => v.id === res.id);\r\n    if (!alreadyInValue) {\r\n      const newReview: WorkflowAdjudicationMicroFlowReviewValue = this.#buildReviewRecord(res, undefined);\r\n      this.#emitReview([...(this.#value || []), newReview]);\r\n    }\r\n    this.#config.formBuilder['previewWorkflowDocument'](res.id);\r\n  }\r\n\r\n  /**\r\n   * Builds a review record from a submission row. Status, createdAt and updatedAt are\r\n   * all optional on the shared `WorkflowAdjudicationMicroFlowReviewValue` type, so\r\n   * `undefined` flows through naturally without any casts.\r\n   */\r\n  #buildReviewRecord(res: ISubmission, status: AdjMicroFlowReviewStatus): WorkflowAdjudicationMicroFlowReviewValue {\r\n    const cm = this.columnMapping;\r\n    const createdAt: Date | undefined = res[cm?.responseDateKey || 'createdAt'] || undefined;\r\n    const updatedAt: Date | undefined = res[cm?.responseDateKey || 'updatedAt'] || undefined;\r\n    return {\r\n      id: res.id,\r\n      adj_microFlow_review: status,\r\n      nameOfBidder: res[cm?.respondentNameKey || ''] || '',\r\n      supplierNumber: res[cm?.respondentCodeKey || ''] || '',\r\n      createdAt,\r\n      updatedAt,\r\n      adjudicationPricePreferenceCalculation: res[cm?.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'] || 0,\r\n      reference: res['reference'] || '',\r\n    };\r\n  }\r\n\r\n  protected reviewStatuses = [\r\n    {\r\n      label: '✅ Compliant',\r\n      value: 'compliant',\r\n      color: 'var(--mat-sys-primary)',\r\n    },\r\n    {\r\n      label: '❌ Non-compliant',\r\n      value: 'non-compliant',\r\n      color: 'var(--mat-sys-error)',\r\n    },\r\n  ];\r\n\r\n  setResponseStatus(res: ISubmission, status: MatSelectChange): void {\r\n    const alreadyInValue = this.#value?.find((v) => v.id === res.id);\r\n    const statusValue = status.value as AdjMicroFlowReviewStatus;\r\n\r\n    if (!alreadyInValue) {\r\n      const newReview = this.#buildReviewRecord(res, statusValue);\r\n      this.reachedMax(this.#emitReview([...(this.#value || []), newReview]));\r\n      return;\r\n    }\r\n    const newValue = (this.#value || []).map((v) => {\r\n      if (v.id === res.id) {\r\n        return { ...v, adj_microFlow_review: statusValue };\r\n      }\r\n      return v;\r\n    });\r\n\r\n    this.reachedMax(this.#emitReview(newValue));\r\n  }\r\n\r\n  protected readonly maxLimit = computed(() => {\r\n    const hasMax = this.inputConfig()?.maxLength;\r\n    if (!hasMax || isNaN(Number(hasMax))) {\r\n      return undefined;\r\n    }\r\n    return Number(hasMax);\r\n  });\r\n\r\n  reachedMax(newValue: WorkflowAdjudicationMicroFlowReviewValue[] | null): void {\r\n    const hasMax = this.inputConfig()?.maxLength;\r\n    if (!hasMax || isNaN(Number(hasMax))) {\r\n      return; // No limit set, do nothin\r\n    }\r\n    const allCompetentSubmissions = newValue?.filter((v) => (v.adj_microFlow_review as unknown) === 'compliant').length || 0;\r\n    if (!(allCompetentSubmissions >= (Number(hasMax) || 1))) {\r\n      return;\r\n    }\r\n    const missingSubmission = this.submissions\r\n      .filter((s) => !newValue?.find((v) => v.id === s.id))\r\n      .map((s) => this.#buildReviewRecord(s, 'non-compliant'));\r\n    const unique = new Set([...(newValue || []), ...missingSubmission]);\r\n    this.#emitReview(Array.from(unique));\r\n  }\r\n\r\n  protected notesOpenForRowId: string | null = null;\r\n  // FIX: A Map to hold notes being edited, keyed by row ID. This prevents shared state.\r\n\r\n  /**\r\n   * REFACTORED: Saves the notes from the `notesBeingEdited` map.\r\n   */\r\n  notesBlur(notesToSave: QuillContent | undefined): void {\r\n    if (!this.notesOpenForRowId || !notesToSave) {\r\n      this.notesOpenForRowId = null;\r\n      return;\r\n    }\r\n\r\n    const alreadyInValue = this.#value?.find((v) => v.id === this.notesOpenForRowId);\r\n\r\n    if (!alreadyInValue) {\r\n      const newReview: WorkflowAdjudicationMicroFlowReviewValue = {\r\n        id: this.notesOpenForRowId,\r\n        adj_microFlow_review_notes: notesToSave,\r\n        adj_microFlow_review: undefined,\r\n        nameOfBidder: '',\r\n        supplierNumber: '',\r\n        createdAt: undefined,\r\n        updatedAt: undefined,\r\n        adjudicationPricePreferenceCalculation: 0,\r\n        reference: '',\r\n      };\r\n      this.#emitReview([...(this.#value || []), newReview]);\r\n    } else {\r\n      const newValue = (this.#value ?? []).map((v) => {\r\n        if (v.id === this.notesOpenForRowId) {\r\n          return { ...v, adj_microFlow_review_notes: notesToSave };\r\n        }\r\n        return v;\r\n      });\r\n      this.#emitReview(newValue);\r\n    }\r\n\r\n    // Clean up and close the overlay\r\n  }\r\n\r\n  protected bulkOperations = [\r\n    {\r\n      label: '✅ Set all to Compliant',\r\n      value: 'compliant',\r\n      color: 'var(--mat-sys-primary)',\r\n    },\r\n    {\r\n      label: '❌ Set all to Non-compliant',\r\n      value: 'non-compliant',\r\n      color: 'var(--mat-sys-error)',\r\n    },\r\n    {\r\n      label: '🔄 Reset all ',\r\n      value: 'reset',\r\n      color: 'var(--mat-sys-secondary)',\r\n    }\r\n  ];\r\n\r\n  protected readonly bulkStatus = computed(() => {\r\n    // Re-read on submissions and value changes via the signal\r\n    void this.#valueSignal();\r\n    const allCompliant = this.submissions.every((s) => s['adj_microFlow_review'] === 'compliant');\r\n\r\n    if (allCompliant) {\r\n      return 'compliant';\r\n    }\r\n\r\n    const allNonCompliant = this.submissions.every((s) => s['adj_microFlow_review'] === 'non-compliant');\r\n    if (allNonCompliant) {\r\n      return 'non-compliant';\r\n    }\r\n\r\n    return 'mixed';\r\n  });\r\n\r\n  bulkStatusChanged(event: MatSelectChange): void {\r\n    const newStatus = event.value;\r\n    if (newStatus === 'reset') {\r\n      this.#emitReview([]);\r\n      return;\r\n    }\r\n    // Create a Map of existing values for efficient O(1) lookup\r\n    const existingValueMap = new Map((this.#value ?? []).map(v => [v.id, v]));\r\n\r\n    // Destructure column keys with fallbacks for cleaner access\r\n    const {\r\n      respondentNameKey = '',\r\n      respondentCodeKey = '',\r\n      responseDateKey = 'createdAt',\r\n      responsePreferenceCalculationKey = 'adjudicationPricePreferenceCalculation',\r\n    } = this.columnMapping || {};\r\n\r\n    let allItems = this.submissions.map(s => {\r\n      // Efficiently look up the existing value using the Map\r\n      const existingValue = existingValueMap.get(s.id);\r\n\r\n      // If it exists, spread its properties to preserve them and update the status\r\n      if (existingValue) {\r\n        return { ...existingValue, adj_microFlow_review: newStatus };\r\n      }\r\n\r\n      // Otherwise, create a new object from the submission data\r\n      return {\r\n        id: s.id,\r\n        adj_microFlow_review: newStatus,\r\n        nameOfBidder: s[respondentNameKey] || '',\r\n        supplierNumber: s[respondentCodeKey] || '',\r\n        createdAt: s[responseDateKey] || undefined,\r\n        updatedAt: s[this.columnMapping?.responseDateKey || 'updatedAt'] || undefined,\r\n        adjudicationPricePreferenceCalculation: s[responsePreferenceCalculationKey] || 0,\r\n        reference: s['reference'] || '',\r\n      };\r\n    });\r\n\r\n    // Apply the compliance limit if necessary\r\n    const limit = this.maxLimit();\r\n    if (limit !== undefined && newStatus === 'compliant') {\r\n      // Sort by preference calculation, highest first\r\n      allItems.sort((a, b) =>\r\n        (b.adjudicationPricePreferenceCalculation ?? 0) - (a.adjudicationPricePreferenceCalculation ?? 0)\r\n      );\r\n\r\n      // Mark items beyond the limit as 'non-compliant'\r\n      allItems = allItems.map((item, index) => {\r\n        if (index >= limit) {\r\n          return { ...item, adj_microFlow_review: 'non-compliant' };\r\n        }\r\n        return item;\r\n      });\r\n    }\r\n\r\n    this.#emitReview(allItems as WorkflowAdjudicationMicroFlowReviewValue[]);\r\n  }\r\n\r\n  openNotes(row: ISubmission): void {\r\n    this.notesOpenForRowId = row.id;\r\n\r\n    const stringfiedTemplate = JSON.stringify(this.inputConfig()?.adjudicationReviewFeedbackTemplate);\r\n    const template = stringfiedTemplate?.replace(/\\$bidderName/g, row[this.columnMapping?.respondentNameKey || ''])\r\n      ?.replace(/\\$bidderCode/g, row[this.columnMapping?.respondentCodeKey || ''])\r\n      ?.replace(/\\$responseDate/g, row[this.columnMapping?.responseDateKey || ''])\r\n      ?.replace(/\\$responsePreferenceCalculation/g, row[this.columnMapping?.responsePreferenceCalculationKey || ''] || '0');\r\n\r\n    this.dialog.open(\r\n      SubmissionReviewDialogComponent, {\r\n      height: 'fit-content',\r\n      data: {\r\n        row,\r\n        respondentNameKey: this.columnMapping?.respondentNameKey || '',\r\n        respondentCodeKey: this.columnMapping?.respondentCodeKey || '',\r\n        readonly: this.inputConfig()?.readonly || false,\r\n        // EditorJS-shaped in legacy step configs — the dialog migrates it.\r\n        activeRowNotes: JSON.parse(template || '{}') as unknown\r\n      },\r\n      autoFocus: false,\r\n      disableClose: true\r\n    }).afterClosed().pipe(\r\n      take(1),\r\n      tap((result: QuillContent | undefined) => {\r\n        this.notesBlur(result);\r\n      }),\r\n      takeUntilDestroyed(this.#destroyRef),\r\n    ).subscribe();\r\n  }\r\n\r\n  canChangeStatus(row: ISubmission): boolean {\r\n    if (row['adj_microFlow_review'] === 'compliant') return true;\r\n    const maxLength = this.inputConfig()?.maxLength;\r\n    // check if max exists and is a number\r\n    if (!maxLength || isNaN(Number(maxLength))) {\r\n      return true; // No limit set, allow status change\r\n    }\r\n    const allCompetentSubmissions = this.#value?.filter((v) => (v.adj_microFlow_review as unknown) === 'compliant').length || 0;\r\n    return allCompetentSubmissions < (Number(maxLength) || 1);\r\n  }\r\n}\r\n","@if (vm$ | async; as vm) {\r\n\r\n  @if (vm.loading) {\r\n    <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n      <mat-spinner></mat-spinner>\r\n    </div>\r\n  } @else if (vm.error) {\r\n    <div class=\"info-card error-card\">\r\n      <!-- Heading stays cause-neutral: vm.error states WHICH half failed\r\n           (the fetch vs. displaying data that did arrive). -->\r\n      <h5 class=\"info-title\">❌ Unable to show submissions</h5>\r\n      <p>{{ vm.error }}</p>\r\n      <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n        Try Again\r\n      </button>\r\n    </div>\r\n  } @else {\r\n    <lib-adjudication-shell label=\"Submission review\" [system]=\"vm.priceSystem\"\r\n      [docsContext]=\"vm.docsContext\" [chart]=\"vm.priceChart\">\r\n    @if (!vm.displayCols.length) {\r\n      <div class=\"info-card\">\r\n        <h5 class=\"info-title\">⚙️ This step needs to be configured to show data.</h5>\r\n        <ol>\r\n          <li>\r\n            <strong>Why you're seeing this:</strong>\r\n            <ul>\r\n              <li>This component is designed for a <strong>\"Submission Review\"</strong> workflow step.</li>\r\n              <li>It's currently missing the required column setup.</li>\r\n            </ul>\r\n          </li>\r\n          <li>\r\n            <strong>What to do (for Administrators):</strong>\r\n            To fix this, go to the <strong>Workflow Builder</strong> and for this specific step, <strong>map the display\r\n              columns</strong> to the desired submission data (e.g., form fields or document keys).\r\n          </li>\r\n        </ol>\r\n      </div>\r\n    } @else if (!vm.submissions.length) {\r\n      <div class=\"info-card\">\r\n        <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n        <ul>\r\n          <li>This can happen if <strong>no one has responded</strong> yet, or if the <strong>submission closing date has\r\n              passed</strong>.</li>\r\n          <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n        </ul>\r\n        <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n          Refresh\r\n        </button>\r\n      </div>\r\n    } @else {\r\n      @if (!value() || (value()?.length ?? 0) === 0) {\r\n        <!-- value() typed `any` per parent's mixed union; length check survives null -->\r\n\r\n        <div class=\"info-card\">\r\n          <h5 class=\"info-title\">📝 How to Review Submissions</h5>\r\n          <ol>\r\n            <li>\r\n              <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n                class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n            </li>\r\n            <li>\r\n              <strong>Set Status:</strong> Use the dropdown to select <strong>Compliant</strong> or\r\n              <strong>Non-compliant</strong>.\r\n            </li>\r\n            <li>\r\n              <strong>Add Note (If Non-compliant):</strong>\r\n              <ul>\r\n                <li>If you select <strong>Non-compliant</strong>, you <strong>must</strong> add a note.</li>\r\n                <li>Click the <strong>Add Note</strong> (<mat-icon class=\"smallIcon\">add_comment</mat-icon>) icon, write your\r\n                  feedback, and hit <strong>Save Feedback</strong>. Your note will be visible to the applicant.</li>\r\n              </ul>\r\n            </li>\r\n          </ol>\r\n        </div>\r\n      }\r\n      <table mat-table [dataSource]=\"vm.submissions\">\r\n        @for (col of vm.displayColumns; track col.formControlName) {\r\n          <ng-container [matColumnDef]=\"col.formControlName\">\r\n            <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n\r\n              @if (col.formControlName === 'status' && !inputConfig()?.readonly) {\r\n                <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n                    margin-bottom: 8px;\r\n                    margin-top: 8px;\r\n                    border-radius:16px;\" appearance=\"outline\">\r\n                  <mat-label>\r\n                    Bulk Status Selection\r\n                  </mat-label>\r\n                  <mat-select\r\n                    [style.color]=\"bulkStatus() === 'non-compliant' ? 'var(--mat-sys-error)' : bulkStatus()==='compliant'? 'var(--mat-sys-primary)' : ''\"\r\n                    (selectionChange)=\"bulkStatusChanged($event)\" ngDefaultControl [value]=\"bulkStatus()\"\r\n                    placeholder=\" Select Status\">\r\n                    @for (type of bulkOperations || []; track type) {\r\n                      <mat-option [value]=\"type.value\">{{type.label}}</mat-option>\r\n                    }\r\n                  </mat-select>\r\n                </mat-form-field>\r\n              } @else {\r\n                {{ col.label }}\r\n              }\r\n            </th>\r\n            <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" [class.selected-row]=\"selected === row.id\"\r\n              (click)=\"$event.stopPropagation()\" [class.price-preference-cell]=\"true\"\r\n              [style.border-bottom-color]=\"row.adjudicationPricePreferenceCalculationColor\"\r\n              [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n\r\n              @if (col.formControlName === 'actions') {\r\n                <span style=\"display: flex; align-items: center;\">\r\n                  <button matTooltipPosition=\"before\"\r\n                    [matTooltip]=\"`View and review **` + row[vm.columnMapping.respondentNameKey]+ `** 's' Submission`\"\r\n                    (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n                    <mat-icon>preview</mat-icon>\r\n                  </button>\r\n                  @if (!(inputConfig()?.readonly) || (inputConfig()?.readonly) && !!row['submissionHasReviewNotes']) {\r\n                    <button (click)=\"openNotes(row)\" cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\" matTooltipPosition=\"after\"\r\n                      [matTooltip]=\"\r\n                        `Add a review note for **` + row[vm.columnMapping.respondentNameKey] + `**`\" mat-icon-button>\r\n                      <mat-icon [style.color]=\"\r\n                        notesOpenForRowId === row.id ? 'var(--mat-sys-primary)' : (row['adj_microFlow_review']==='non-compliant' && !row['adj_microFlow_review_notes']?'var(--mat-sys-error)':'')\r\n                        \">\r\n                        {{ !row['submissionHasReviewNotes']? 'add_comment' : 'comment' }}\r\n                      </mat-icon>\r\n                    </button>\r\n                  }\r\n                </span>\r\n              } @else if (col.formControlName === 'status') {\r\n                <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n                    margin-bottom: 8px;\r\n                    margin-top: 8px;\r\n                    border-radius:16px;\" appearance=\"outline\">\r\n                  <mat-select [disabled]=\"!canChangeStatus(row) ||  inputConfig()?.readonly === true\"\r\n                    [style.color]=\"row['adj_microFlow_review'] === 'non-compliant' ? 'var(--mat-sys-error)' : row['adj_microFlow_review']==='compliant'? 'var(--mat-sys-primary)' : ''\"\r\n                    (selectionChange)=\"setResponseStatus(row,$event)\" ngDefaultControl [value]=\"row.adj_microFlow_review\"\r\n                    placeholder=\" Select Status\">\r\n                    @for (type of reviewStatuses || []; track type) {\r\n                      <mat-option [value]=\"type.value\">{{type.label}}</mat-option>\r\n                    }\r\n                  </mat-select>\r\n                  @if (row['adj_microFlow_review']==='non-compliant' && !row['adj_microFlow_review_notes']) {\r\n                    <mat-hint style=\"color:var(--mat-sys-error)\">\r\n                      Rejection reason is required. Add a review note.\r\n                    </mat-hint>\r\n                  }\r\n                </mat-form-field>\r\n              } @else {\r\n                @switch (col?.type) {\r\n                  @case ('daysAgo') {\r\n                    {{ row[col.formControlName] | daysAgo }}\r\n                  }\r\n                  @case ('number') {\r\n                    <div class=\"number-cell\">\r\n                      <span>\r\n                        {{ (row[col.formControlName] | number:'0.0-2' ) || 'N/A' }}\r\n                      </span>\r\n                      @if (row['adj_priceScore_abnormallyLow']) {\r\n                        <!-- Abnormally low tender: flagged for investigation,\r\n                             never auto-excluded (amber = act, no blame). -->\r\n                        <mat-icon class=\"alt-flag\"\r\n                          matTooltip=\"Abnormally low tender: this bid is priced well below the responsive pool. Investigate sustainability before scoring — if found non-responsive, mark it non-compliant and every score recalculates against the next lowest compliant bid.\">\r\n                          warning_amber\r\n                        </mat-icon>\r\n                      }\r\n                      @if (col.showColor) {\r\n                        <mat-icon [style.color]=\"row.adjudicationPricePreferenceCalculationColor\">\r\n                          fiber_manual_record\r\n                        </mat-icon>\r\n                      }\r\n                    </div>\r\n                  }\r\n                  @default {\r\n                    @if ($index === 0) {\r\n                      <span class=\"main-submission-text\">\r\n                        <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n                        <strong>\r\n                          {{ row[col.formControlName] }}\r\n                        </strong>\r\n                      </span>\r\n                      <span class=\"secondary-text\">\r\n                        <mat-icon>fingerprint</mat-icon>\r\n                        {{row[vm.columnMapping.respondentCodeKey]}}\r\n                        <mat-icon>more_time</mat-icon>\r\n                        {{ row[vm.columnMapping.responseDateKey ||''] | daysAgo}}\r\n                      </span>\r\n                    } @else {\r\n                      {{ row[col.formControlName] }}\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            </td>\r\n          </ng-container>\r\n        }\r\n        <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n        <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n      </table>\r\n    }\r\n    </lib-adjudication-shell>\r\n  }\r\n\r\n}\r\n","import { AsyncPipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, OnInit, ViewEncapsulation, inject } from '@angular/core';\r\nimport {\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  FormGroupDirective,\r\n  NgForm,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { Observable, map, startWith } from 'rxjs';\r\nimport { WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\n\r\nexport interface ScoreSheetGroup {\r\n  key: string;\r\n  name: string;\r\n}\r\n\r\nexport interface PointAssignmentDialogData {\r\n  readonly: boolean;\r\n  row: { nameOfBidder: string; adj_microFlow_assignedScore: Record<string, number> };\r\n  scoreSheetGroups: ScoreSheetGroup[];\r\n  groupedScoreSheet: Record<string, WorkflowAdjudicationScoreSheetValue[]>;\r\n  existingScores: Record<string, Record<string, number | null>>;\r\n}\r\n\r\n/** Shows validation errors as soon as the control becomes dirty + invalid. */\r\nexport class ShowErrorOnDirtyMatcher implements ErrorStateMatcher {\r\n  isErrorState(control: FormControl | null, _form: FormGroupDirective | NgForm | null): boolean {\r\n    return !!(control && control.invalid && control.dirty);\r\n  }\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-point-assignment-dialog',\r\n  templateUrl: './point-assignment-dialog.component.html',\r\n  styleUrl: './point-assignment-dialog.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  imports: [\r\n    AsyncPipe,\r\n    ReactiveFormsModule,\r\n    MatDialogModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    MatButtonModule,\r\n    MatProgressBarModule,\r\n    MatExpansionModule,\r\n    MatDividerModule,\r\n  ],\r\n})\r\nexport class PointAssignmentDialogComponent implements OnInit {\r\n  protected readonly dialogRef = inject<MatDialogRef<PointAssignmentDialogComponent>>(MatDialogRef);\r\n  protected readonly data = inject<PointAssignmentDialogData>(MAT_DIALOG_DATA);\r\n  readonly #fb = inject(FormBuilder);\r\n\r\n  protected pointsForm!: FormGroup;\r\n  protected totalPoints$!: Observable<number>;\r\n  protected maxPossiblePoints = 0;\r\n  protected readonly matcher = new ShowErrorOnDirtyMatcher();\r\n\r\n  ngOnInit(): void {\r\n    this.#calculateMaxPoints();\r\n    this.pointsForm = this.#buildForm();\r\n    this.totalPoints$ = this.#createTotalPointsObservable();\r\n  }\r\n\r\n  protected correctMaxValue(event: Event, groupKey: string, controlId: string, maxPoints: number): void {\r\n    const inputElement = event.target as HTMLInputElement;\r\n    const currentValue = parseFloat(inputElement.value);\r\n\r\n    if (currentValue > maxPoints) {\r\n      this.pointsForm.get([groupKey, controlId])?.patchValue(maxPoints);\r\n    }\r\n  }\r\n\r\n  #buildForm(): FormGroup {\r\n    const groupOfGroups = this.data.scoreSheetGroups.reduce((acc, group) => {\r\n      const scoresInGroup = this.data.groupedScoreSheet[group.key] || [];\r\n      const groupControls = scoresInGroup.reduce((ctrls, score) => {\r\n        const existingScore = this.data.row.adj_microFlow_assignedScore?.[score.id] ?? null;\r\n        ctrls[score.id] = new FormControl(existingScore, [\r\n          Validators.required,\r\n          Validators.min(0),\r\n          Validators.max(score.totalPoints),\r\n        ]);\r\n        return ctrls;\r\n      }, {} as Record<string, FormControl>);\r\n      acc[group.key] = this.#fb.group(groupControls);\r\n      return acc;\r\n    }, {} as Record<string, FormGroup>);\r\n    return this.#fb.group(groupOfGroups);\r\n  }\r\n\r\n  #calculateMaxPoints(): void {\r\n    this.maxPossiblePoints = Object.values(this.data.groupedScoreSheet)\r\n      .flat()\r\n      .reduce((acc, score) => acc + score.totalPoints, 0);\r\n  }\r\n\r\n  #createTotalPointsObservable(): Observable<number> {\r\n    return this.pointsForm.valueChanges.pipe(\r\n      startWith(this.pointsForm.value),\r\n      map(formValue => {\r\n        let total = 0;\r\n        Object.values(formValue || {}).forEach((group: unknown) => {\r\n          if (group && typeof group === 'object') {\r\n            Object.values(group).forEach(score => {\r\n              total += Number(score) || 0;\r\n            });\r\n          }\r\n        });\r\n        return total;\r\n      }),\r\n    );\r\n  }\r\n}\r\n","<span mat-dialog-title>\r\n    Assign Points for <span class=\"bidder-name\">{{ data.row['nameOfBidder'] }}</span>\r\n</span>\r\n  @if( !data.readonly){\r\n<div class=\"dialog-instructions\">\r\n    @if(!pointsForm.dirty && !pointsForm.touched){\r\n    <div class=\"info-card\">\r\n        <h5 class=\"info-title\">💯 How to Assign Points\r\n\r\n        </h5>\r\n        <ol>\r\n            <li>\r\n                <strong>Enter a score</strong> for each item listed below.\r\n            </li>\r\n            <li>\r\n                <strong>Follow the rules:</strong>\r\n                <ul>\r\n                    <li>Your score cannot be higher than the maximum points shown (e.g., / 10).</li>\r\n                    <li>The <strong>\"Save Points\"</strong> button at the bottom will turn blue when everything is filled\r\n                        out correctly.</li>\r\n                </ul>\r\n            </li>\r\n            <li>\r\n                <strong>Click the blue \"Save Points\" button</strong> to finish.\r\n            </li>\r\n        </ol>\r\n    </div>\r\n    }\r\n    @else {\r\n    <div class=\"info-card\">\r\n        <h5 class=\"info-title\">✍️ Editing Your Scores</h5>\r\n        <ol>\r\n            <li>\r\n                <strong>You are viewing saved scores.</strong> To make a change, simply click on a score and type in a\r\n                new number.\r\n            </li>\r\n            <li>\r\n                The <strong>Total Points</strong> bar at the top will update as you make edits.\r\n            </li>\r\n            <li>\r\n                Click <strong>\"Save Points\"</strong> to confirm your changes when you're done.\r\n            </li>\r\n        </ol>\r\n    </div>\r\n    }\r\n</div>\r\n\r\n  }\r\n\r\n\r\n<mat-dialog-content style=\"padding-bottom: 8px;padding-bottom: 8px\" [formGroup]=\"pointsForm\">\r\n    <div class=\"summary-bar\">\r\n        <h3>Total Points: {{ totalPoints$ | async }} / {{ maxPossiblePoints }}</h3>\r\n        <mat-progress-bar mode=\"determinate\"\r\n            [value]=\"((totalPoints$ | async) || 0) / maxPossiblePoints * 100\"></mat-progress-bar>\r\n    </div>\r\n\r\n    <mat-accordion multi>\r\n        @for (group of data.scoreSheetGroups; track group.key) {\r\n        <mat-expansion-panel [expanded]=\"true\" [formGroupName]=\"group.key\">\r\n            <mat-expansion-panel-header>\r\n                <mat-panel-title>{{ group.name }}</mat-panel-title>\r\n            </mat-expansion-panel-header>\r\n\r\n            @for (score of data.groupedScoreSheet[group.key] || []; track score.id) {\r\n            <div class=\"score-item\">\r\n                <label [for]=\"score.id\" class=\"score-description\">{{ score.description }}</label>\r\n\r\n                <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"score-input\">\r\n                    <mat-label>Score</mat-label>\r\n                    <input [disabled]=\"data.readonly\" matInput type=\"number\" placeholder=\"0\" [id]=\"score.id\"\r\n                        [formControlName]=\"score.id\" [max]=\"score.totalPoints\" min=\"0\" [errorStateMatcher]=\"matcher\"\r\n                        (input)=\"correctMaxValue($event, group.key, score.id, score.totalPoints)\" />\r\n                    <span matSuffix>\r\n                        <span style=\"min-width: 58px; display:flex\">\r\n                            / {{ score.totalPoints }}\r\n                        </span>\r\n                    </span>\r\n\r\n                    @if (pointsForm.get(group.key)?.get(score.id)?.hasError('required')) {\r\n                    <mat-error>A score is required.</mat-error>\r\n                    }\r\n                    @if (pointsForm.get(group.key)?.get(score.id)?.hasError('max')) {\r\n                    <mat-error>Score cannot exceed {{ score.totalPoints }}.</mat-error>\r\n                    }\r\n                    @if (pointsForm.get(group.key)?.get(score.id)?.hasError('min')) {\r\n                    <mat-error>Score cannot be negative.</mat-error>\r\n                    }\r\n                </mat-form-field>\r\n            </div>\r\n            <mat-divider></mat-divider>\r\n            }\r\n        </mat-expansion-panel>\r\n        }\r\n    </mat-accordion>\r\n\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions align=\"end\">\r\n    <button mat-button mat-dialog-close>Cancel</button>\r\n    @if( !data.readonly){\r\n    <button mat-flat-button color=\"primary\" \r\n    [mat-dialog-close]=\"pointsForm.getRawValue()\"\r\n        [disabled]=\"pointsForm.invalid\">\r\n        Save Points\r\n    </button>\r\n    }\r\n\r\n</mat-dialog-actions>","import { AsyncPipe, DecimalPipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, computed, effect, inject, input, output, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { BehaviorSubject, Observable, combineLatest, map, of, shareReplay, switchMap, take, tap } from 'rxjs';\r\n\r\nimport { AdjResponseReviewColumnMapping, AdjudicationSteps, ITowerStepColumn, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\n\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { AdjChartVm } from '../adjudication-chart/adjudication-chart.component';\r\nimport { AdjudicationDocsContext } from '../adjudication-docs/adjudication-docs.component';\r\nimport { AdjudicationShellComponent } from '../adjudication-shell/adjudication-shell.component';\r\nimport { MicroflowSubmissionsPayload, describeError, microflowFetchStates } from '../../microflow-fetch';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { ISubmission, tableCols } from '../submission-review/submission-review.component';\r\nimport { PointAssignmentDialogComponent } from './elements/point-assignment-dialog/point-assignment-dialog.component';\r\n\r\nexport interface IViewModel {\r\n  submissions: ISubmission[];\r\n  columnMapping: AdjResponseReviewColumnMapping;\r\n  displayColumns?: tableCols[];\r\n  displayCols: string[];\r\n  loading: boolean;\r\n  groupedScoreSheet?: Record<string, WorkflowAdjudicationScoreSheetValue[]>;\r\n  scoreSheetGroups?: { name: string; key: string }[];\r\n  error?: string;\r\n  /** Context the shell's guide adapts its content to. */\r\n  docsContext: AdjudicationDocsContext;\r\n  /** Points chart for the shell; undefined when there is nothing to plot. */\r\n  chart?: AdjChartVm;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-point-assignment',\r\n  templateUrl: './point-assignment.component.html',\r\n  styleUrls: ['./point-assignment.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  imports: [\r\n    AsyncPipe,\r\n    DecimalPipe,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatProgressSpinnerModule,\r\n    MatRippleModule,\r\n    MatTableModule,\r\n    MatTooltipModule,\r\n    DaysAgoPipe,\r\n    AdjudicationShellComponent,\r\n  ],\r\n})\r\nexport class PointAssignmentComponent {\r\n  readonly #config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n  readonly #dialog = inject(MatDialog);\r\n  readonly #destroyRef = inject(DestroyRef);\r\n\r\n  readonly #refreshTrigger = new BehaviorSubject<void>(undefined);\r\n  // A stream to push updates of the review values (`this.value`)\r\n  readonly #valueChanges$ = new BehaviorSubject<unknown[] | null>([]);\r\n\r\n  readonly #initialState: IViewModel = {\r\n    loading: true,\r\n    submissions: [],\r\n    columnMapping: {} as AdjResponseReviewColumnMapping,\r\n    displayCols: [],\r\n    displayColumns: [],\r\n    error: undefined,\r\n    docsContext: { step: AdjudicationSteps.PointAssignment },\r\n  };\r\n\r\n  readonly #valueSignal = signal<unknown[] | null>([]);\r\n\r\n  readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\r\n  // NOTE(phase-4): Trap 6 — parent (`workflow-adjudication-reactive-input`) binds a\r\n  // `WorkflowAdjudicationValue | null` union of three incompatible shapes. Until the parent\r\n  // template is split per adjudication step type, this input must remain `any`; narrow\r\n  // inside `valueBridge`.\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step, then narrow this input.\r\n  readonly value = input<any>(null);\r\n\r\n  protected readonly valueBridge = effect(() => {\r\n    const raw = this.value();\r\n    const next: unknown[] = Array.isArray(raw) ? raw : [];\r\n    if (_isEqual(next, this.#valueSignal())) return;\r\n    this.#valueSignal.set(next);\r\n    this.#valueChanges$.next(next);\r\n  });\r\n\r\n  // NOTE(phase-4): Trap 6 — emitter forwards enriched `ISubmission[]` rows (with score-sheet\r\n  // augmentation) back to the parent which then writes through the `WorkflowAdjudicationValue`\r\n  // union. D-013: the parent (`workflow-adjudication-reactive-input`) `(pointsChange)=\"setValue($event)\"`\r\n  // binding only typechecks under strictTemplates if `$event` is assignable to that union; the\r\n  // enriched `ISubmission[]` payload matches no single branch (missing formControlName/totalPoints/\r\n  // description), so the emitted type must stay `any[]` to preserve parity. Narrows when the parent\r\n  // template is split per adjudication step type.\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step, then narrow this emitter.\r\n  readonly pointsChange = output<any[]>();\r\n\r\n  // One fetch per trigger; failures become 'failed' states instead of killing\r\n  // the stream, so \"Try Again\" genuinely refetches. See `microflowFetchStates`.\r\n  readonly #fetchedData$ = microflowFetchStates(this.#refreshTrigger, () =>\r\n    this.#config.formBuilder.getCurrentStepMicroflowSubmissions(),\r\n  );\r\n\r\n  /**\r\n   * Combines the fetched data with the ongoing stream of local score changes.\r\n   * Failure is reported per branch — a fetch error and a projection error\r\n   * render different messages, so a bug in the enrich pass can never\r\n   * masquerade as \"the server call failed\".\r\n   */\r\n  protected readonly vm$: Observable<IViewModel> = combineLatest([\r\n    this.#fetchedData$,\r\n    this.#valueChanges$,\r\n  ]).pipe(\r\n    map(([fetched, reviewValues]): IViewModel => {\r\n      if (fetched.status === 'loading') {\r\n        return this.#initialState;\r\n      }\r\n      if (fetched.status === 'failed') {\r\n        return {\r\n          ...this.#initialState,\r\n          loading: false,\r\n          error: `Could not load submissions: ${fetched.reason}`,\r\n        };\r\n      }\r\n      try {\r\n        return this.#buildViewModel(fetched.payload, reviewValues);\r\n      } catch (error: unknown) {\r\n        // The data DID arrive — surface a display failure with the real\r\n        // reason instead of swallowing it into a generic load message.\r\n        return {\r\n          ...this.#initialState,\r\n          loading: false,\r\n          error: `Submissions were received but could not be displayed: ${describeError(error)}`,\r\n        };\r\n      }\r\n    }),\r\n    shareReplay(1),\r\n  );\r\n\r\n  /**\r\n   * Projects a successful fetch plus the current local score values into the\r\n   * view model. A throw here is caught by `vm$` and reported as a display\r\n   * failure — never as a load failure.\r\n   */\r\n  #buildViewModel(payload: MicroflowSubmissionsPayload, reviewValues: unknown[] | null): IViewModel {\r\n    const { columnMapping, submissions, scoreSheet } = payload;\r\n    // group scoresheet by pointType\r\n    const groupedScoreSheet = (scoreSheet || []).reduce((acc, curr) => {\r\n      const pointType = curr.pointType || 'default';\r\n      if (!acc[pointType]) {\r\n        acc[pointType] = [];\r\n      }\r\n      acc[pointType].push(curr);\r\n      return acc;\r\n    }, {} as Record<string, WorkflowAdjudicationScoreSheetValue[]>);\r\n\r\n    const enriched = this.#enrichSubmissionsData(submissions || [], reviewValues);\r\n    return {\r\n      docsContext: {\r\n        step: AdjudicationSteps.PointAssignment,\r\n        hasScoreSheet: (scoreSheet?.length ?? 0) > 0,\r\n      },\r\n      chart: this.#buildPointsChart(enriched, columnMapping, scoreSheet),\r\n      submissions: enriched,\r\n      loading: false,\r\n      error: undefined,\r\n      groupedScoreSheet,\r\n      scoreSheetGroups: Object.keys(groupedScoreSheet).map((key) => ({\r\n        name: key.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/([A-Z])([A-Z][a-z])/g, '$1 $2'),\r\n        key,\r\n      })),\r\n      columnMapping,\r\n      displayCols: [\r\n        'nameOfBidder',\r\n        'adj_microFlow_review',\r\n        'adjudicationPricePreferenceCalculation',\r\n        'adj_microFlow_scoreSheetTotalPoints',\r\n        'actions',\r\n      ],\r\n      displayColumns: [\r\n        { label: 'name', formControlName: 'nameOfBidder', type: 'string' } as tableCols,\r\n        { label: 'Pref Calc', formControlName: 'adjudicationPricePreferenceCalculation', type: 'number', showColor: true } as tableCols,\r\n        { label: 'status', formControlName: 'adj_microFlow_review', type: 'string' } as tableCols,\r\n        { label: 'Score', formControlName: 'adj_microFlow_scoreSheetTotalPoints', type: 'number', showColor: true } as tableCols,\r\n        { label: '', formControlName: 'actions', type: 'string' } as tableCols,\r\n      ],\r\n    };\r\n  }\r\n\r\n  protected readonly readonly = computed(() => this.inputConfig()?.readonly ?? false);\r\n\r\n  /**\r\n   * Points chart for the shell: score-sheet points as the primary bar (axis\r\n   * 0–total possible) and points for price as the thin secondary bar (its own\r\n   * 0–100 scale), sorted best score first. Undefined when no sheet total\r\n   * exists — the chart button hides with it.\r\n   */\r\n  #buildPointsChart(\r\n    rows: ISubmission[],\r\n    columnMapping: AdjResponseReviewColumnMapping,\r\n    scoreSheet: WorkflowAdjudicationScoreSheetValue[] | undefined,\r\n  ): AdjChartVm | undefined {\r\n    const totalPossible = (scoreSheet ?? []).reduce((acc, s) => acc + (Number(s.totalPoints) || 0), 0);\r\n    if (rows.length === 0 || totalPossible <= 0) return undefined;\r\n\r\n    const pct = (value: number, max: number): number =>\r\n      Math.max(0, Math.min(100, Math.round((value / max) * 1000) / 10));\r\n    const sorted = [...rows].sort(\r\n      (a, b) =>\r\n        Number(b['adj_microFlow_scoreSheetTotalPoints'] ?? 0) -\r\n        Number(a['adj_microFlow_scoreSheetTotalPoints'] ?? 0),\r\n    );\r\n    return {\r\n      caption: `Bar = score-sheet points awarded (0–${totalPossible}) · thin bar = points for price (0–100 scale).`,\r\n      refs: [],\r\n      legend: [\r\n        { label: `Score-sheet points (0–${totalPossible})`, kind: 'primary' },\r\n        { label: 'Points for price (0–100)', kind: 'secondary' },\r\n      ],\r\n      rows: sorted.map((row) => {\r\n        const points = Number(row['adj_microFlow_scoreSheetTotalPoints'] ?? 0);\r\n        const price = Number(row['adjudicationPricePreferenceCalculation'] ?? 0);\r\n        // Enrich maps the review verdict to ✅/❌ for the table.\r\n        const nonCompliant = row['adj_microFlow_review'] === '❌';\r\n        return {\r\n          id: row.id,\r\n          name: String(row[columnMapping?.respondentNameKey || 'nameOfBidder'] ?? row['nameOfBidder'] ?? row.id),\r\n          primaryPct: pct(points, totalPossible),\r\n          primaryLabel: `${Number(points.toFixed(2))}/${totalPossible} pts`,\r\n          secondaryPct: pct(price, 100),\r\n          secondaryLabel: `${Number(price.toFixed(2))} price pts`,\r\n          state: nonCompliant ? 'muted' : 'normal',\r\n          note: nonCompliant ? 'non-compliant' : undefined,\r\n        };\r\n      }),\r\n    };\r\n  }\r\n\r\n  loadMicroSubmissions(): void {\r\n    this.#refreshTrigger.next();\r\n  }\r\n\r\n  viewMicroSubmission(res: { id: string }): void {\r\n    this.#config.formBuilder['previewWorkflowDocument'](res.id);\r\n  }\r\n\r\n  #enrichSubmissionsData(submissions: ISubmission[], reviewValues: unknown[] | null): ISubmission[] {\r\n    const numberSets = new Map<string, number[]>();\r\n    numberSets.set(\r\n      'adjudicationPricePreferenceCalculation',\r\n      submissions.map((s) => Number(s['adjudicationPricePreferenceCalculation'] || 0)),\r\n    );\r\n    const list = submissions.length > 0 ? submissions : ((reviewValues as ISubmission[]) || []);\r\n    return list.map((submission) => {\r\n      const numbers = numberSets.get('adjudicationPricePreferenceCalculation') || [];\r\n      const color = numbers.length === 0\r\n        ? submission['adjudicationPricePreferenceCalculationColor']\r\n        : this.#getColorString(submission['adjudicationPricePreferenceCalculation'], numbers);\r\n      const backgroundShades = { ['adjudicationPricePreferenceCalculation']: this.#getScoreShade(color ?? '') };\r\n      const existing = (this.#valueSignal() as ISubmission[] | null)?.find((v) => v.id === submission.id);\r\n      return {\r\n        ...submission,\r\n        adj_microFlow_review: submission['adj_microFlow_review'] === 'compliant' ? '✅' : '❌',\r\n        adjudicationPricePreferenceCalculationColor: color,\r\n        backgroundShades,\r\n        ...existing,\r\n      };\r\n    });\r\n  }\r\n\r\n  #getScoreShade(rgbColor: string): string {\r\n    if (!rgbColor) return '';\r\n    return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n  }\r\n\r\n  #getColorString(target: number, numbers: number[]): string {\r\n    return getColorForNumber(target, numbers, true);\r\n  }\r\n\r\n  openPointAssignmentDialog(\r\n    row: ISubmission,\r\n    groupedScoreSheet: Record<string, WorkflowAdjudicationScoreSheetValue[]> | undefined,\r\n    scoreSheetGroups: { name: string; key: string }[] | undefined,\r\n  ): void {\r\n    this.#dialog\r\n      .open(PointAssignmentDialogComponent, {\r\n        height: 'fit-content',\r\n        data: {\r\n          row,\r\n          groupedScoreSheet,\r\n          scoreSheetGroups,\r\n          readonly: this.inputConfig()?.readonly || false,\r\n        },\r\n        autoFocus: false,\r\n        disableClose: true,\r\n      })\r\n      .afterClosed()\r\n      .pipe(\r\n        take(1),\r\n        switchMap((result: Record<string, Record<string, number>> | undefined) => {\r\n          if (!result) return of(null);\r\n          // Update the value with the new point assignments\r\n          const assignment = Object.values(result).reduce((acc, curr) => {\r\n            acc = { ...acc, ...curr };\r\n            return acc;\r\n          }, {} as Record<string, number>);\r\n          row['adj_microFlow_assignedScore'] = assignment;\r\n          const currentList = (this.#valueSignal() as ISubmission[] | null) ?? [];\r\n          const alreadyInValue = currentList.find((v) => v.id === row.id);\r\n          let newValue: ISubmission[];\r\n          if (!alreadyInValue) {\r\n            newValue = [\r\n              ...currentList,\r\n              {\r\n                ...row,\r\n                adj_microFlow_assignedScore: assignment,\r\n                adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce((acc, curr) => acc + curr, 0),\r\n              },\r\n            ];\r\n          } else {\r\n            newValue = currentList.map((v) => {\r\n              if (v.id === row.id) {\r\n                return {\r\n                  ...v,\r\n                  adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce((acc, curr) => acc + curr, 0),\r\n                  adj_microFlow_assignedScore: assignment,\r\n                };\r\n              }\r\n              return v;\r\n            });\r\n          }\r\n          return of(newValue);\r\n        }),\r\n        tap((newValue) => {\r\n          if (!newValue || this.inputConfig()?.readonly) return;\r\n          this.pointsChange.emit(newValue);\r\n        }),\r\n        takeUntilDestroyed(this.#destroyRef),\r\n      )\r\n      .subscribe();\r\n  }\r\n}\r\n","@if (vm$ | async; as vm) {\r\n  @if (vm.loading) {\r\n    <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n      <mat-spinner></mat-spinner>\r\n    </div>\r\n  } @else if (vm.error) {\r\n    <div class=\"info-card error-card\">\r\n      <!-- Heading stays cause-neutral: vm.error states WHICH half failed\r\n           (the fetch vs. displaying data that did arrive). -->\r\n      <h5 class=\"info-title\">❌ Unable to show submissions</h5>\r\n      <p>{{ vm.error }}</p>\r\n      <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n        Try Again\r\n      </button>\r\n    </div>\r\n  } @else {\r\n    <lib-adjudication-shell label=\"Point assignment\" [docsContext]=\"vm.docsContext\" [chart]=\"vm.chart\">\r\n    @if (vm.submissions.length === 0) {\r\n      <div class=\"info-card\">\r\n        <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n        <ul>\r\n          <li>This can happen if <strong>no one has responded</strong> yet, or if <strong>none of the submission were\r\n              compliant </strong>.</li>\r\n          <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n        </ul>\r\n        <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n          Refresh\r\n        </button>\r\n      </div>\r\n    } @else {\r\n      @if (!value || value.length === 0) {\r\n        <div class=\"info-card\">\r\n          <h5 class=\"info-title\">📝 How to Review Submissions</h5>\r\n          <ol>\r\n            <li>\r\n              <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n                class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n            </li>\r\n            <li>\r\n              <strong>Set Status:</strong> Use the dropdown to select <strong>Compliant</strong> or\r\n              <strong>Non-compliant</strong>.\r\n            </li>\r\n            <li>\r\n              <strong>Add Note (If Non-compliant):</strong>\r\n              <ul>\r\n                <li>If you select <strong>Non-compliant</strong>, you <strong>must</strong> add a note.</li>\r\n                <li>Click the <strong>Add Note</strong> (<mat-icon class=\"smallIcon\">add_comment</mat-icon>) icon, write your\r\n                  feedback, and hit <strong>Save Feedback</strong>. Your note will be visible to the applicant.</li>\r\n              </ul>\r\n            </li>\r\n          </ol>\r\n        </div>\r\n      }\r\n      <table mat-table [dataSource]=\"vm.submissions\">\r\n        @for (col of vm.displayColumns; track col.formControlName) {\r\n          <ng-container [matColumnDef]=\"col.formControlName\">\r\n            <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n              {{ col.label }}\r\n            </th>\r\n            <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" (click)=\"$event.stopPropagation()\"\r\n              [class.price-preference-cell]=\"true\"\r\n              [style.border-bottom-color]=\"row.adjudicationPricePreferenceCalculationColor\"\r\n              [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n              @if (col.formControlName === 'actions') {\r\n                <span style=\"display: flex; align-items: center;\">\r\n                  <button matTooltipPosition=\"before\"\r\n                    [matTooltip]=\"'View and review **' + row[vm.columnMapping.respondentNameKey] + '\\'s\\' Submission'\"\r\n                    (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n                    <mat-icon>preview</mat-icon>\r\n                  </button>\r\n                </span>\r\n              } @else if (col.formControlName === 'adj_microFlow_scoreSheetTotalPoints') {\r\n                <button\r\n                  (click)=\"openPointAssignmentDialog(row, vm?.groupedScoreSheet, vm.scoreSheetGroups)\"\r\n                  [id]=\"row.id\" mat-stroked-button>\r\n                  {{ (row[col.formControlName] | number:'0.0-0') || 'Assign Points' }}\r\n                </button>\r\n              } @else {\r\n                @switch (col?.type) {\r\n                  @case ('daysAgo') {\r\n                    {{ row[col.formControlName] | daysAgo }}\r\n                  }\r\n                  @case ('number') {\r\n                    {{ (row[col.formControlName] | number:'0.0-0') || 'N/A' }}\r\n                  }\r\n                  @default {\r\n                    @if ($index === 0) {\r\n                      <span class=\"main-submission-text\">\r\n                        <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n                        <strong>\r\n                          {{ row[col.formControlName] }}\r\n                        </strong>\r\n                      </span>\r\n                      <span class=\"secondary-text\">\r\n                        <mat-icon>fingerprint</mat-icon>\r\n                        {{ row[vm.columnMapping.respondentCodeKey] }}\r\n                        <mat-icon>more_time</mat-icon>\r\n                        {{ row[vm.columnMapping.responseDateKey || ''] | daysAgo }}\r\n                      </span>\r\n                    } @else {\r\n                      {{ row[col.formControlName] }}\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            </td>\r\n          </ng-container>\r\n        }\r\n        <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n        <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n      </table>\r\n    }\r\n    </lib-adjudication-shell>\r\n  }\r\n}\r\n","import { AsyncPipe, DecimalPipe } from '@angular/common';\r\nimport {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  DestroyRef,\r\n  effect,\r\n  inject,\r\n  input,\r\n  output,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n  AdjResponseReviewColumnMapping,\r\n  AdjudicationSteps,\r\n  InputDataTypes,\r\n  ITowerStepColumn,\r\n  WorkflowAdjudicationScoreSheetValue,\r\n} from 'ngx-t-forms-types';\r\nimport {\r\n  BehaviorSubject,\r\n  Observable,\r\n  combineLatest,\r\n  map,\r\n  of,\r\n  shareReplay,\r\n  switchMap,\r\n  take,\r\n  tap,\r\n} from 'rxjs';\r\n\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { AdjChartVm } from '../adjudication-chart/adjudication-chart.component';\r\nimport { AdjudicationShellComponent } from '../adjudication-shell/adjudication-shell.component';\r\nimport { MicroflowSubmissionsPayload, describeError, microflowFetchStates } from '../../microflow-fetch';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { IViewModel } from '../point-assignment/point-assignment.component';\r\nimport { PointAssignmentDialogComponent } from '../point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component';\r\nimport { ISubmission } from '../submission-review/submission-review.component';\r\n\r\n/**\r\n * NOTE(phase-4): the parent `workflow-adjudication-reactive-input` binds `value` from a union\r\n * of three adjudication payloads (score-sheet, micro-flow review, elected-supplier). This\r\n * component consumes the micro-flow review branch — until the parent splits its template by\r\n * `adjudicationStep` (Trap 6), the input must accept the broader shape (`unknown`) and narrow\r\n * via the `toSupplierValue` guard.\r\n *\r\n * NOTE(phase-4 shared-type drift): the shared `WorkflowAdjudicationMicroFlowReviewValue` does\r\n * not declare `adj_microFlow_supplierAppointed`, `adj_microFlow_assignedScore`, or\r\n * `adj_microFlow_scoreSheetTotalPoints`, but the runtime payload carries them through this\r\n * component. `SupplierRow` extends `ISubmission` (a `Record<string, any>`) and adds the known\r\n * fields for editor support; the shared type should be widened in a follow-up.\r\n */\r\ntype SupplierRow = ISubmission & {\r\n  adj_microFlow_supplierAppointed?: boolean;\r\n  adj_microFlow_assignedScore?: Record<string, number>;\r\n  adj_microFlow_scoreSheetTotalPoints?: number;\r\n  adj_microFlow_pointsAwarded?: number;\r\n  adj_microFlow_pricePointCalculation?: number;\r\n  colColors?: Record<string, string>;\r\n};\r\n\r\nfunction toSupplierValue(input: unknown): SupplierRow[] {\r\n  // Runtime guard — the parent supplies a union of array / object payloads.\r\n  return Array.isArray(input) ? (input as SupplierRow[]) : [];\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-supplier-selection',\r\n  templateUrl: './supplier-selection.component.html',\r\n  styleUrl: './supplier-selection.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  imports: [\r\n    AsyncPipe,\r\n    DecimalPipe,\r\n    FormsModule,\r\n    MatButtonModule,\r\n    MatDialogModule,\r\n    MatIconModule,\r\n    MatProgressSpinnerModule,\r\n    MatRippleModule,\r\n    MatTableModule,\r\n    MatTooltipModule,\r\n    DaysAgoPipe,\r\n    AdjudicationShellComponent,\r\n  ],\r\n})\r\nexport class SupplierSelectionComponent {\r\n  readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\r\n\r\n  // Phase-4 TODO: parent (workflow-adjudication-reactive-input) accepts broader `WorkflowAdjudicationValue` union.\r\n  // Emitting narrower `SupplierRow[]` is structurally compatible at runtime; output widened to `any` for template typecheck (Trap 6).\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n  readonly supplierSelection = output<any>();\r\n\r\n  readonly #config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n  readonly #destroyRef = inject(DestroyRef);\r\n  readonly #dialog = inject(MatDialog);\r\n\r\n  readonly #refreshTrigger = new BehaviorSubject<void>(undefined);\r\n  // A stream to push updates of the review values (`this.value`)\r\n  readonly #valueChanges$ = new BehaviorSubject<SupplierRow[]>([]);\r\n\r\n  readonly #initialState: IViewModel = {\r\n    loading: true,\r\n    submissions: [],\r\n    columnMapping: {} as AdjResponseReviewColumnMapping,\r\n    displayCols: [],\r\n    displayColumns: [],\r\n    error: undefined,\r\n    docsContext: { step: AdjudicationSteps.SupplierSelection },\r\n  };\r\n\r\n  #value: SupplierRow[] = [];\r\n\r\n  // NOTE(phase-4): Trap 6 — parent (`workflow-adjudication-reactive-input`) binds a\r\n  // `WorkflowAdjudicationValue | null` union of three incompatible shapes. The template\r\n  // also reads `value.length` directly. Until parent template is split per adjudication step\r\n  // the input must remain `any`; narrow inside the `valueBridge` via `toSupplierValue`.\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step, then narrow this input.\r\n  readonly value = input<any>(null);\r\n\r\n  protected readonly valueBridge = effect(() => {\r\n    const next = toSupplierValue(this.value());\r\n    if (_isEqual(next, this.#value)) return;\r\n    this.#value = next;\r\n    this.#valueChanges$.next(this.#value);\r\n  });\r\n\r\n  // One fetch per trigger; failures become 'failed' states instead of killing\r\n  // the stream, so \"Try Again\" genuinely refetches. See `microflowFetchStates`.\r\n  readonly #fetchedData$ = microflowFetchStates(this.#refreshTrigger, () =>\r\n    this.#config.formBuilder.getCurrentStepMicroflowSubmissions(),\r\n  );\r\n\r\n  protected loadMicroSubmissions(): void {\r\n    this.#refreshTrigger.next();\r\n  }\r\n\r\n  /**\r\n   * Combines the fetched data with the ongoing stream of local appointment\r\n   * changes. Failure is reported per branch — a fetch error and a projection\r\n   * error render different messages, so a bug in the enrich/scoring pass can\r\n   * never masquerade as \"the server call failed\".\r\n   */\r\n  protected readonly vm$: Observable<IViewModel> = combineLatest([\r\n    this.#fetchedData$,\r\n    this.#valueChanges$,\r\n  ]).pipe(\r\n    map(([fetched, reviewValues]): IViewModel => {\r\n      if (fetched.status === 'loading') {\r\n        return this.#initialState;\r\n      }\r\n      if (fetched.status === 'failed') {\r\n        return {\r\n          ...this.#initialState,\r\n          loading: false,\r\n          error: `Could not load submissions: ${fetched.reason}`,\r\n        };\r\n      }\r\n      try {\r\n        return this.#buildViewModel(fetched.payload, reviewValues);\r\n      } catch (error: unknown) {\r\n        // The data DID arrive — surface a display failure with the real\r\n        // reason instead of swallowing it into a generic load message.\r\n        return {\r\n          ...this.#initialState,\r\n          loading: false,\r\n          error: `Submissions were received but could not be displayed: ${describeError(error)}`,\r\n        };\r\n      }\r\n    }),\r\n    shareReplay(1),\r\n  );\r\n\r\n  /**\r\n   * Projects a successful fetch plus the current local appointment values into\r\n   * the view model. A throw here is caught by `vm$` and reported as a display\r\n   * failure — never as a load failure.\r\n   */\r\n  #buildViewModel(payload: MicroflowSubmissionsPayload, reviewValues: SupplierRow[]): IViewModel {\r\n    const {\r\n      columnMapping,\r\n      submissions,\r\n      scoreSheet,\r\n      adjudicationPricePreferenceCalculationFormula,\r\n    } = payload;\r\n    //group scoreSheet by pointType\r\n    const groupedScoreSheet = (scoreSheet || []).reduce(\r\n      (acc, curr) => {\r\n        const pointType = curr.pointType || 'default';\r\n        if (!acc[pointType]) {\r\n          acc[pointType] = [];\r\n        }\r\n        acc[pointType].push(curr);\r\n        return acc;\r\n      },\r\n      {} as Record<string, WorkflowAdjudicationScoreSheetValue[]>,\r\n    );\r\n    const totalPossibleScore = (scoreSheet || []).reduce(\r\n      (acc, curr) => acc + curr.totalPoints,\r\n      0,\r\n    );\r\n\r\n    const maxPointsAwarded: number =\r\n      adjudicationPricePreferenceCalculationFormula ===\r\n      '80(1-((totalBidPrice-Pmin)/(Pmin)))'\r\n        ? 20\r\n        : adjudicationPricePreferenceCalculationFormula ===\r\n            '90(1-((totalBidPrice-Pmin)/(Pmin)))'\r\n          ? 10\r\n          : 100;\r\n    const enriched = this.#enrichSubmissionsData(\r\n      submissions || [],\r\n      reviewValues,\r\n      totalPossibleScore,\r\n      maxPointsAwarded,\r\n    );\r\n    return {\r\n      docsContext: {\r\n        step: AdjudicationSteps.SupplierSelection,\r\n        system: `${100 - maxPointsAwarded}/${maxPointsAwarded}`,\r\n        hasScoreSheet: (scoreSheet?.length ?? 0) > 0,\r\n      },\r\n      chart: this.#buildTotalsChart(enriched, columnMapping, maxPointsAwarded),\r\n      submissions: enriched,\r\n      loading: false,\r\n      error: undefined,\r\n      groupedScoreSheet,\r\n\r\n      scoreSheetGroups: Object.keys(groupedScoreSheet).map((key) => ({\r\n        name: key\r\n          .replace(/([a-z])([A-Z])/g, '$1 $2')\r\n          .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2'),\r\n        key: key,\r\n      })),\r\n      maxPointsAwarded,\r\n      totalPossibleScore,\r\n      columnMapping: columnMapping,\r\n      displayCols: [\r\n        'nameOfBidder',\r\n        'adjudicationPricePreferenceCalculation',\r\n        'adj_microFlow_pointsAwarded',\r\n        'adj_microFlow_pricePointCalculation',\r\n\r\n        'actions',\r\n        'adj_microFlow_supplierAppointed',\r\n      ],\r\n      displayColumns: [\r\n        { label: 'name', formControlName: 'nameOfBidder', type: InputDataTypes.String },\r\n        {\r\n          label: `${100 - maxPointsAwarded}`,\r\n          formControlName: 'adjudicationPricePreferenceCalculation',\r\n          type: InputDataTypes.Number,\r\n        },\r\n        {\r\n          label: `${maxPointsAwarded}`,\r\n          formControlName: 'adj_microFlow_pointsAwarded',\r\n          type: InputDataTypes.Number,\r\n        },\r\n        {\r\n          label: 'Total',\r\n          formControlName: 'adj_microFlow_pricePointCalculation',\r\n          type: InputDataTypes.Number,\r\n        },\r\n        // `actions` is an internal cell type used by the template `@switch`; widened locally in `tableCols`.\r\n        { label: '', formControlName: 'actions', type: 'actions' as const },\r\n        {\r\n          label: 'Appointed',\r\n          formControlName: 'adj_microFlow_supplierAppointed',\r\n          type: InputDataTypes.Boolean,\r\n          showColor: true,\r\n        },\r\n      ],\r\n    } as IViewModel;\r\n  }\r\n\r\n  protected viewMicroSubmission(res: ISubmission): void {\r\n    this.#config.formBuilder['previewWorkflowDocument'](res.id);\r\n  }\r\n\r\n  /**\r\n   * Final-score chart for the shell: the combined price + points total as the\r\n   * primary bar (axis 0–100) and the scaled score-sheet award as the thin\r\n   * secondary bar (0–maxPointsAwarded), sorted best total first. The\r\n   * appointed supplier is annotated on its row.\r\n   */\r\n  #buildTotalsChart(\r\n    rows: SupplierRow[],\r\n    columnMapping: AdjResponseReviewColumnMapping,\r\n    maxPointsAwarded: number,\r\n  ): AdjChartVm | undefined {\r\n    if (rows.length === 0) return undefined;\r\n    const pct = (value: number, max: number): number =>\r\n      Math.max(0, Math.min(100, Math.round((value / max) * 1000) / 10));\r\n    const sorted = [...rows].sort(\r\n      (a, b) =>\r\n        Number(b['adj_microFlow_pricePointCalculation'] ?? 0) -\r\n        Number(a['adj_microFlow_pricePointCalculation'] ?? 0),\r\n    );\r\n    return {\r\n      caption: `Bar = final score out of 100 (price + scaled score-sheet points) · thin bar = score-sheet award (0–${maxPointsAwarded}).`,\r\n      refs: [],\r\n      legend: [\r\n        { label: 'Final score (0–100)', kind: 'primary' },\r\n        { label: `Score-sheet award (0–${maxPointsAwarded})`, kind: 'secondary' },\r\n      ],\r\n      rows: sorted.map((row) => {\r\n        const total = Number(row['adj_microFlow_pricePointCalculation'] ?? 0);\r\n        const awarded = Number(row['adj_microFlow_pointsAwarded'] ?? 0);\r\n        return {\r\n          id: row.id,\r\n          name: String(row[columnMapping?.respondentNameKey || 'nameOfBidder'] ?? row['nameOfBidder'] ?? row.id),\r\n          primaryPct: pct(total, 100),\r\n          primaryLabel: `${Number(total.toFixed(2))}/100`,\r\n          secondaryPct: pct(awarded, maxPointsAwarded),\r\n          secondaryLabel: `${Number(awarded.toFixed(2))}/${maxPointsAwarded} awarded`,\r\n          state: 'normal' as const,\r\n          note: row['adj_microFlow_supplierAppointed'] === true ? 'Appointed' : undefined,\r\n        };\r\n      }),\r\n    };\r\n  }\r\n\r\n  #enrichSubmissionsData(\r\n    submissions: ISubmission[],\r\n    value: SupplierRow[],\r\n    totalPossibleScore: number,\r\n    maxPointsAwarded: number,\r\n  ): SupplierRow[] {\r\n    // 1. Handle edge cases first for clarity.\r\n\r\n    // 2. Improve performance by creating a lookup map to avoid O(n^2) complexity.\r\n    // This is much faster than using .find() inside a loop.\r\n    const valueMap = new Map<string, SupplierRow>(\r\n      this.#value?.map((v) => [v.id, v]) || [],\r\n    );\r\n    const list: ISubmission[] = submissions.length > 0 ? submissions : (value || []);\r\n    // 3. First pass: Enrich submissions with calculated scores.\r\n    const enrichedSubmissions: SupplierRow[] = list.map((submission) => {\r\n      const v = valueMap.get(submission.id);\r\n\r\n      // Use nullish coalescing (??) for cleaner fallback logic.\r\n      const totalPoints =\r\n        (v?.['adj_microFlow_scoreSheetTotalPoints'] as number | undefined) ??\r\n        (submission?.['adj_microFlow_scoreSheetTotalPoints'] as number | undefined) ??\r\n        0;\r\n\r\n      // Simplify calculation: remove unnecessary try-catch. Division by zero in JS results\r\n      // in Infinity, not an error. The check for totalPossibleScore > 0 handles this.\r\n      const pointsAwarded =\r\n        totalPossibleScore > 0\r\n          ? (totalPoints / totalPossibleScore) * maxPointsAwarded\r\n          : 0;\r\n\r\n      const pricePointCalculation =\r\n        (Number(submission['adjudicationPricePreferenceCalculation'] ?? 0)) + pointsAwarded;\r\n\r\n      return {\r\n        ...submission,\r\n        ...v,\r\n        adj_microFlow_pointsAwarded: pointsAwarded,\r\n        adj_microFlow_pricePointCalculation: pricePointCalculation,\r\n      };\r\n    });\r\n\r\n    // 4. Define keys to process to avoid repetition (DRY principle).\r\n    const keysToColor = ['adj_microFlow_pricePointCalculation'] as const;\r\n\r\n    // 5. Correctly build the number sets from the *newly enriched* data.\r\n    const numberSets = new Map<string, number[]>();\r\n    for (const key of keysToColor) {\r\n      const values = enrichedSubmissions.map((s) => Number(s[key] ?? 0));\r\n      numberSets.set(key, values);\r\n    }\r\n\r\n    // 6. Second pass: Add colors and shades based on the complete dataset.\r\n    return enrichedSubmissions.map((submission) => {\r\n      const colColors: Record<string, string> = {};\r\n      const backgroundShades: Record<string, string> = {\r\n        ...(submission.backgroundShades ?? {}),\r\n      };\r\n\r\n      for (const key of keysToColor) {\r\n        const scoreValue = Number(submission[key] ?? 0);\r\n        const allScores = numberSets.get(key) || [];\r\n        const color = this.#getColorString(scoreValue, allScores);\r\n\r\n        colColors[key] = color;\r\n        backgroundShades[key] = this.#getScoreShade(color);\r\n      }\r\n      backgroundShades['adjudicationPricePreferenceCalculation'] = '';\r\n\r\n      return {\r\n        ...submission,\r\n        colColors,\r\n        backgroundShades,\r\n      };\r\n    });\r\n  }\r\n\r\n  #getScoreShade(rgbColor: string): string {\r\n    if (!rgbColor) return '';\r\n    return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n  }\r\n\r\n  #getColorString(target: number, numbers: number[]): string {\r\n    return getColorForNumber(target, numbers, true);\r\n  }\r\n\r\n  protected openPointAssignmentDialog(\r\n    row: SupplierRow,\r\n    groupedScoreSheet:\r\n      | Record<string, WorkflowAdjudicationScoreSheetValue[]>\r\n      | undefined,\r\n    scoreSheetGroups:\r\n      | {\r\n          name: string;\r\n          key: string;\r\n        }[]\r\n      | undefined,\r\n  ): void {\r\n    this.#dialog\r\n      .open(PointAssignmentDialogComponent, {\r\n        height: 'fit-content',\r\n        data: {\r\n          row,\r\n          groupedScoreSheet,\r\n          scoreSheetGroups,\r\n        },\r\n        autoFocus: false,\r\n        disableClose: true,\r\n      })\r\n      .afterClosed()\r\n      .pipe(\r\n        take(1),\r\n        switchMap((result: Record<string, Record<string, number>>) => {\r\n          if (!result) return of(null);\r\n          // Update the value with the new point assignments\r\n          const assignment = Object.values(result).reduce(\r\n            (acc, curr) => {\r\n              acc = {\r\n                ...acc,\r\n                ...curr,\r\n              };\r\n              return acc;\r\n            },\r\n            {} as Record<string, number>,\r\n          );\r\n          row['adj_microFlow_assignedScore'] = assignment;\r\n          const alreadyInValue = this.#value?.find((v) => v.id === row.id);\r\n          let newValue: SupplierRow[];\r\n          if (!alreadyInValue) {\r\n            newValue = [\r\n              ...(this.#value || []),\r\n              {\r\n                ...row,\r\n                adj_microFlow_assignedScore: assignment,\r\n                adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce(\r\n                  (acc, curr) => acc + curr,\r\n                  0,\r\n                ),\r\n              },\r\n            ];\r\n          } else {\r\n            newValue =\r\n              this.#value?.map((v) => {\r\n                if (v.id === row.id) {\r\n                  return {\r\n                    ...v,\r\n                    adj_microFlow_scoreSheetTotalPoints: Object.values(\r\n                      assignment,\r\n                    ).reduce((acc, curr) => acc + curr, 0),\r\n                    adj_microFlow_assignedScore: assignment,\r\n                  };\r\n                }\r\n                return v;\r\n              }) || [];\r\n          }\r\n\r\n          return of(newValue);\r\n        }),\r\n        tap((newValue) => {\r\n          if (!newValue) return;\r\n          this.supplierSelection.emit(newValue);\r\n        }),\r\n        takeUntilDestroyed(this.#destroyRef),\r\n      )\r\n      .subscribe();\r\n  }\r\n\r\n  protected appointASupplier(row: ISubmission): void {\r\n    if (this.inputConfig()?.readonly || this.inputConfig()?.disabled) {\r\n      return;\r\n    }\r\n    if (row['adj_microFlow_supplierAppointed']) {\r\n      row['adj_microFlow_supplierAppointed'] = false;\r\n    } else {\r\n      row['adj_microFlow_supplierAppointed'] = true;\r\n    }\r\n    const alreadyInValue = this.#value?.find((v) => v.id === row.id);\r\n    let newValue: SupplierRow[] | undefined;\r\n    if (!alreadyInValue) {\r\n      const otherRows = this.#value?.map((v) => ({\r\n        ...v,\r\n        adj_microFlow_supplierAppointed: false,\r\n      }));\r\n      newValue = [...(otherRows || []), row];\r\n    } else {\r\n      newValue =\r\n        this.#value?.map((v) => {\r\n          if (v.id === row.id) {\r\n            return {\r\n              ...v,\r\n              adj_microFlow_supplierAppointed: row['adj_microFlow_supplierAppointed'],\r\n            };\r\n          }\r\n          return {\r\n            ...v,\r\n            adj_microFlow_supplierAppointed: false,\r\n          };\r\n        }) || [];\r\n    }\r\n    if (newValue) {\r\n      this.supplierSelection.emit(newValue);\r\n    }\r\n  }\r\n}\r\n","@if (vm$ | async; as vm) {\r\n  @if (vm.loading) {\r\n    <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n      <mat-spinner></mat-spinner>\r\n    </div>\r\n  } @else if (vm.error) {\r\n    <div class=\"info-card error-card\">\r\n      <!-- Heading stays cause-neutral: vm.error states WHICH half failed\r\n           (the fetch vs. displaying data that did arrive). -->\r\n      <h5 class=\"info-title\">❌ Unable to show submissions</h5>\r\n      <p>{{ vm.error }}</p>\r\n      <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n        Try Again\r\n      </button>\r\n    </div>\r\n  } @else {\r\n    <lib-adjudication-shell label=\"Supplier selection\" [system]=\"vm.docsContext.system\" [docsContext]=\"vm.docsContext\" [chart]=\"vm.chart\">\r\n\r\n    @if (vm.submissions.length === 0) {\r\n      <div class=\"info-card\">\r\n        <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n        <ul>\r\n          <li>This can happen if <strong>no one has responded</strong> yet, or if <strong>none of the submission were\r\n              compliant </strong>.</li>\r\n          <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n        </ul>\r\n        <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n          Refresh\r\n        </button>\r\n      </div>\r\n    } @else {\r\n\r\n      @if (!value || value.length === 0) {\r\n        <div class=\"info-card\">\r\n          <h5 class=\"info-title\">📝 How to Appoint</h5>\r\n          <ol>\r\n            <li>\r\n              <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n                class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n            </li>\r\n            <li>\r\n              <strong>Appoint:</strong> Click the  <strong>Appoint</strong>  button to appoint the supplier.\r\n            </li>\r\n\r\n          </ol>\r\n        </div>\r\n      }\r\n      <table mat-table [dataSource]=\"vm.submissions\">\r\n        @for (col of vm.displayColumns; track col.formControlName) {\r\n          <ng-container [matColumnDef]=\"col.formControlName\">\r\n            <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n              {{ col.label }}\r\n            </th>\r\n            <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" (click)=\"$event.stopPropagation()\"\r\n              [class.price-preference-cell]=\"true\" [style.border-bottom-color]=\"row.colColors[col.formControlName]\"\r\n              [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n              @if (col.formControlName === 'actions') {\r\n                <span style=\"display: flex; align-items: center;\">\r\n                  <button matTooltipPosition=\"before\"\r\n                    [matTooltip]=\"`View and review **` + row[vm.columnMapping.respondentNameKey]+ `** 's' Submission`\"\r\n                    (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n                    <mat-icon>preview</mat-icon>\r\n                  </button>\r\n                </span>\r\n              } @else if (col.formControlName === 'adj_microFlow_supplierAppointed') {\r\n                @if (row[col.formControlName] === true) {\r\n                  <button (click)=\"appointASupplier(row)\" mat-flat-button color=\"primary\">\r\n                    <mat-icon>\r\n                      check_circle\r\n                    </mat-icon>\r\n                    Appointed\r\n                  </button>\r\n                } @else {\r\n                  <button (click)=\"appointASupplier(row)\" mat-stroked-button>\r\n                    Appoint\r\n                  </button>\r\n                }\r\n              } @else {\r\n                @switch (col?.type) {\r\n                  @case ('daysAgo') {\r\n                    {{ row[col.formControlName] | daysAgo }}\r\n                  }\r\n                  @case ('number') {\r\n                    {{ (row[col.formControlName] | number:'0.0-0' ) || 'N/A' }}\r\n                  }\r\n                  @default {\r\n                    @if ($index === 0) {\r\n                      <span class=\"main-submission-text\">\r\n                        <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n                        <strong>\r\n                          {{ row[col.formControlName] }}\r\n                        </strong>\r\n                      </span>\r\n                      <span class=\"secondary-text\">\r\n                        <mat-icon>fingerprint</mat-icon>\r\n                        {{ row[vm.columnMapping.respondentCodeKey] }}\r\n                        <mat-icon>more_time</mat-icon>\r\n                        {{ row[vm.columnMapping.responseDateKey ||''] | daysAgo }}\r\n                      </span>\r\n                    } @else {\r\n                      {{ row[col.formControlName] }}\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            </td>\r\n          </ng-container>\r\n        }\r\n        <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n        <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n      </table>\r\n    }\r\n    </lib-adjudication-shell>\r\n  }\r\n}\r\n","import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ElementRef,\r\n  ViewEncapsulation,\r\n  inject,\r\n  input,\r\n} from '@angular/core';\r\nimport { TitleCasePipe } from '@angular/common';\r\nimport { NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport {\r\n  AdjudicationSteps,\r\n  FormBuilderFunctions,\r\n  ITowerStepColumn,\r\n  WorkflowAdjudicationMicroFlowReviewValue,\r\n  WorkflowAdjudicationResponseElectedSupplierSelectionValue,\r\n  WorkflowAdjudicationScoreSheetValue,\r\n} from 'ngx-t-forms-types';\r\n\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { PointsCreationComponent } from '../points-creation/points-creation.component';\r\nimport { SubmissionReviewComponent } from '../submission-review/submission-review.component';\r\nimport { PointAssignmentComponent } from '../point-assignment/point-assignment.component';\r\nimport { SupplierSelectionComponent } from '../supplier-selection/supplier-selection.component';\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n  controlType: 'lib-workflow-adjudication-reactive-input',\r\n  nextId: 0,\r\n};\r\n\r\ntype WorkflowAdjudicationValue =\r\n  | WorkflowAdjudicationScoreSheetValue[]\r\n  | WorkflowAdjudicationMicroFlowReviewValue[]\r\n  | WorkflowAdjudicationResponseElectedSupplierSelectionValue;\r\n\r\n@Component({\r\n  selector: 'lib-workflow-adjudication-reactive-input',\r\n  templateUrl: './workflow-adjudication-reactive-input.component.html',\r\n  styleUrl: './workflow-adjudication-reactive-input.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  host: {\r\n    '[class.floating]': 'shouldLabelFloat',\r\n    '[id]': 'id',\r\n  },\r\n  imports: [\r\n    TitleCasePipe,\r\n    PointsCreationComponent,\r\n    SubmissionReviewComponent,\r\n    SupplierSelectionComponent,\r\n    PointAssignmentComponent,\r\n  ],\r\n  providers: [{ provide: MatFormFieldControl, useExisting: WorkflowAdjudicationReactiveInputComponent }],\r\n})\r\nexport class WorkflowAdjudicationReactiveInputComponent extends BaseCustomInput<WorkflowAdjudicationValue> {\r\n  override get empty(): boolean {\r\n    return this.value === null || this.value === undefined || Object.keys(this.value).length === 0;\r\n  }\r\n\r\n  override get shouldLabelFloat(): boolean {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  readonly inputConfig = input.required<ITowerStepColumn>();\r\n  readonly editorMode = input<boolean>(false);\r\n  readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n\r\n  protected readonly adjudicationSteps = AdjudicationSteps;\r\n\r\n  constructor() {\r\n    super(\r\n      inject(NgControl, { self: true, optional: true }) as NgControl,\r\n      inject<ElementRef<HTMLElement>>(ElementRef),\r\n      customInputConfig,\r\n    );\r\n  }\r\n\r\n  protected setValue(value: WorkflowAdjudicationValue): void {\r\n    this.value = value;\r\n    this.onChange(value);\r\n    this.onTouched();\r\n  }\r\n}\r\n","@switch (inputConfig().adjudicationStep) {\r\n@case (adjudicationSteps.ScoreCreation) {\r\n<lib-points-creation [inputConfig]=\"inputConfig()\" [value]=\"value\" (pointsChange)=\"setValue($event)\">\r\n</lib-points-creation>\r\n}\r\n@case (adjudicationSteps.SubMissionReview) {\r\n<lib-submission-review [inputConfig]=\"inputConfig()\" [value]=\"value\"\r\n    (reviewChange)=\"setValue($event)\"></lib-submission-review>\r\n}\r\n@case (adjudicationSteps.SupplierSelection) {\r\n<lib-supplier-selection [inputConfig]=\"inputConfig()\" [value]=\"value\"\r\n    (supplierSelection)=\"setValue($event)\"></lib-supplier-selection>\r\n}\r\n@case (adjudicationSteps.PointAssignment) {\r\n<lib-point-assignment [inputConfig]=\"inputConfig()\" [value]=\"value\"\r\n    (pointsChange)=\"setValue($event)\"></lib-point-assignment>\r\n}\r\n@default {\r\n<h6>\r\n    {{ inputConfig().adjudicationStep | titlecase }} is not implemented yet.\r\n</h6>\r\n}\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { FormBuilderFunctions, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { WorkflowAdjudicationReactiveInputComponent } from './elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n/** Wraps a workflow-adjudication reactive control inside a `mat-form-field`. */\r\n@Component({\r\n  selector: 'lib-workflow-adjudication',\r\n  templateUrl: './workflow-adjudication.component.html',\r\n  styleUrl: './workflow-adjudication.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatButtonModule,\r\n    MatTooltipModule,\r\n    TFormInputStatusComponent,\r\n    WorkflowAdjudicationReactiveInputComponent,\r\n  ],\r\n})\r\nexport class WorkflowAdjudicationComponent {\r\n  readonly inputConfig = input.required<ITowerStepColumn>();\r\n  readonly formGroup = input.required<FormGroup>();\r\n  readonly editorMode = input<boolean>(false);\r\n  readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n  readonly reload = output<void>();\r\n\r\n  protected readonly errorMessage = computed(() =>\r\n    getInputErrorMessage(this.inputConfig(), this.formGroup()),\r\n  );\r\n}\r\n","<form [formGroup]=\"formGroup()\">\r\n  @if (inputConfig(); as inputConfig) {\r\n    <mat-form-field\r\n      [appearance]=\"inputConfig.appearance || 'fill'\"\r\n      [floatLabel]=\"'always'\"\r\n      subscriptSizing=\"dynamic\"\r\n    >\r\n      <mat-label>\r\n        {{ inputConfig.label }}\r\n        <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\r\n      </mat-label>\r\n\r\n      <lib-workflow-adjudication-reactive-input\r\n        [inputConfig]=\"inputConfig\"\r\n        [formControlName]=\"inputConfig.id\"\r\n        [required]=\"inputConfig.required\"\r\n        [formGroup]=\"formGroup()\"\r\n        [editorMode]=\"editorMode()\"\r\n        [formBuilderFunctions]=\"formBuilderFunctions()\"\r\n      ></lib-workflow-adjudication-reactive-input>\r\n\r\n      @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\r\n        <mat-hint class=\"inputHint\">\r\n          {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\r\n        </mat-hint>\r\n      }\r\n\r\n      @if (!!errorMessage()) {\r\n        <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\r\n      }\r\n\r\n      @if (inputConfig.canReload?.canReload) {\r\n        <button\r\n          mat-icon-button\r\n          style=\"margin-right: 4px;\"\r\n          matTooltip=\"Click to refresh this field.\"\r\n          class=\"input-sync-button\"\r\n          (click)=\"inputConfig.canReload.emit()\"\r\n          matSuffix\r\n        >\r\n          <mat-icon style=\"color: var(--mat-sys-primary)\">sync</mat-icon>\r\n        </button>\r\n      }\r\n\r\n      @if (inputConfig.prefixIcon) {\r\n        <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n      }\r\n\r\n      @if (inputConfig.suffixIcon && inputConfig.id !== 'password') {\r\n        <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\r\n      }\r\n\r\n      @if (inputConfig.prefixText) {\r\n        <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n      }\r\n      @if (inputConfig.suffixText) {\r\n        <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\r\n      }\r\n\r\n      @if (inputConfig.maxLength && formGroup()) {\r\n        <mat-hint align=\"end\">\r\n          {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\r\n        </mat-hint>\r\n      }\r\n    </mat-form-field>\r\n  }\r\n</form>\r\n"],"names":["i1","i2","i3","uuidv4","i4","i5","i6","i7","i8","i9","i10","i11"],"mappings":"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"}