{"version":3,"file":"ngx-t-forms-form-payload-projection.component-y9PSIeP1.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/form-payload-projection/projection-expression.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/form-payload-projection/form-payload-projection.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/form-payload-projection/form-payload-projection.component.html"],"sourcesContent":["/**\r\n * Parser/serialiser for the `projectFormData` submission expression.\r\n *\r\n * At runtime the expression is consumed by `destructureObject({ $formValue: form }, expr)`,\r\n * so the only token available is `$formValue` — the entire submitted form. The\r\n * sole authoring choice is therefore whether to send the form fields flat or to\r\n * nest the whole payload under one or more named keys. This module bridges that\r\n * raw string and the guided builder's structured model.\r\n */\r\n\r\n/** Token that resolves to the entire submitted form payload at runtime. */\r\nexport const FORM_VALUE_TOKEN = '$formValue';\r\n\r\n/** Default envelope: the whole form nested under a `data` key. */\r\nexport const DEFAULT_PROJECTION = `data:{${FORM_VALUE_TOKEN}}`;\r\n\r\n/**\r\n * Structured model behind the guided \"Project form data\" editor.\r\n *\r\n * @remarks `keys` empty ⇒ send fields at the top level; each key nests the whole\r\n * form under that name (`{ key: { ...form } }`).\r\n */\r\nexport interface ProjectionModel {\r\n  /** Keys to nest the whole form under. Empty ⇒ send fields at the top level. */\r\n  readonly keys: readonly string[];\r\n}\r\n\r\n/** Matches a single `alias:{token}` envelope entry. */\r\nconst ENVELOPE = /^([^:]+):\\{(.+)\\}$/;\r\n\r\n/**\r\n * Parses a `projectFormData` expression into the guided model (best-effort).\r\n * Unrecognised entries are kept as literal keys so nothing is silently dropped.\r\n */\r\nexport function parseProjection(expression: string | null | undefined): ProjectionModel {\r\n  if (!expression) return { keys: [] };\r\n  const keys = expression\r\n    .split(',')\r\n    .map((entry) => entry.trim())\r\n    .filter(Boolean)\r\n    .map((entry) => {\r\n      const match = ENVELOPE.exec(entry);\r\n      // `alias:{$formValue}` ⇒ alias; a bare token (or any other entry) ⇒ literal key.\r\n      return (match?.[1] ?? entry).trim();\r\n    })\r\n    .filter(Boolean);\r\n  return { keys };\r\n}\r\n\r\n/** Serialises the guided model back to a `projectFormData` expression. */\r\nexport function serializeProjection(model: ProjectionModel): string {\r\n  return model.keys\r\n    .map((key) => key.trim())\r\n    .filter(Boolean)\r\n    .map((key) => `${key}:{${FORM_VALUE_TOKEN}}`)\r\n    .join(', ');\r\n}\r\n","import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ViewEncapsulation,\r\n  computed,\r\n  effect,\r\n  input,\r\n  output,\r\n  signal,\r\n} from '@angular/core';\r\nimport { JsonPipe } from '@angular/common';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\n\r\nimport {\r\n  DEFAULT_PROJECTION,\r\n  parseProjection,\r\n  serializeProjection,\r\n} from './projection-expression';\r\n\r\n/** Validation error surfaced by the parent editor for display. */\r\ninterface ProjectionError {\r\n  readonly key: string;\r\n  readonly message: string;\r\n}\r\n\r\n/**\r\n * Guided editor for a form's `projectFormData` submission expression.\r\n *\r\n * Replaces the raw `data:{$formValue}` text field with a no-code chooser: send\r\n * the form fields flat, or wrap the whole payload under one or more named keys —\r\n * with a live preview of the resulting JSON shape. The runtime engine only\r\n * exposes the whole form (`$formValue`), so the model is intentionally a simple\r\n * list of envelope keys (see {@link parseProjection}).\r\n *\r\n * @example\r\n *   <lib-form-payload-projection [value]=\"expr()\" [formInputs]=\"inputs()\"\r\n *     (valueChanged)=\"onExpr($event)\" />\r\n */\r\n@Component({\r\n  selector: 'lib-form-payload-projection',\r\n  templateUrl: './form-payload-projection.component.html',\r\n  styleUrl: './form-payload-projection.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  host: { class: 'lib-form-payload-projection' },\r\n  imports: [JsonPipe, MatButtonModule, MatButtonToggleModule, MatIconModule, MatTooltipModule],\r\n})\r\nexport class FormPayloadProjectionComponent {\r\n  /** Current `projectFormData` expression. */\r\n  readonly value = input<string>('');\r\n\r\n  /** Whether the editor is read-only. */\r\n  readonly disabled = input<boolean>(false);\r\n\r\n  /** The form's inputs — used to sketch the payload shape in the preview. */\r\n  readonly formInputs = input<FormColumnInputs[]>([]);\r\n\r\n  /** Validation errors surfaced by the parent for display. */\r\n  readonly errors = input<ProjectionError[]>([]);\r\n\r\n  /** Emits the serialised expression whenever the user changes the mapping. */\r\n  readonly valueChanged = output<string>();\r\n\r\n  /** Envelope keys the whole form is nested under. Empty ⇒ sent flat. */\r\n  protected readonly keys = signal<string[]>([]);\r\n\r\n  /** 'flat' = top-level fields; 'wrap' = nested under key(s). */\r\n  protected readonly mode = computed<'flat' | 'wrap'>(() => (this.keys().length > 0 ? 'wrap' : 'flat'));\r\n\r\n  /**\r\n   * The last expression we synced from / emitted. Guards the input bridge so our\r\n   * own round-tripped emissions don't clobber in-progress edits (the parent\r\n   * debounces and echoes the value back through `value`).\r\n   */\r\n  #lastSynced: string | undefined = undefined;\r\n\r\n  protected readonly valueBridge = effect(() => {\r\n    const incoming = this.value() ?? '';\r\n    if (incoming === this.#lastSynced) return;\r\n    this.#lastSynced = incoming;\r\n    this.keys.set([...parseProjection(incoming).keys]);\r\n  });\r\n\r\n  /** A sample of the form payload (field name → placeholder) for the preview. */\r\n  readonly #sampleForm = computed<Record<string, unknown>>(() => {\r\n    const sample: Record<string, unknown> = {};\r\n    for (const column of this.formInputs()) {\r\n      if (column.multipleInputInEditId || !column.formControlName) continue;\r\n      sample[column.formControlName] = '…';\r\n      if (Object.keys(sample).length >= 8) break;\r\n    }\r\n    if (Object.keys(sample).length === 0) sample['field'] = '…';\r\n    return sample;\r\n  });\r\n\r\n  /** Live preview of the JSON shape sent to the endpoint. */\r\n  protected readonly preview = computed<unknown>(() => {\r\n    const keys = this.keys().map((k) => k.trim()).filter(Boolean);\r\n    const sample = this.#sampleForm();\r\n    if (keys.length === 0) return sample;\r\n    const out: Record<string, unknown> = {};\r\n    for (const key of keys) out[key] = sample;\r\n    return out;\r\n  });\r\n\r\n  /** Switches between flat and wrapped modes (seeding a default key on first wrap). */\r\n  protected setMode(mode: 'flat' | 'wrap'): void {\r\n    if (mode === 'flat') {\r\n      this.#apply([]);\r\n      return;\r\n    }\r\n    if (this.keys().length === 0) this.#apply(['data']);\r\n  }\r\n\r\n  protected addKey(): void {\r\n    this.#apply([...this.keys(), '']);\r\n  }\r\n\r\n  protected updateKey(index: number, key: string): void {\r\n    this.#apply(this.keys().map((k, i) => (i === index ? key : k)));\r\n  }\r\n\r\n  protected removeKey(index: number): void {\r\n    this.#apply(this.keys().filter((_, i) => i !== index));\r\n  }\r\n\r\n  /** Reads a native input's value from a DOM event (keeps the template `any`-free). */\r\n  protected inputValue(event: Event): string {\r\n    return (event.target as HTMLInputElement).value;\r\n  }\r\n\r\n  protected trackByIndex(index: number): number {\r\n    return index;\r\n  }\r\n\r\n  /** Reset to the recommended default (`data:{$formValue}`). */\r\n  protected resetToDefault(): void {\r\n    this.#apply([...parseProjection(DEFAULT_PROJECTION).keys]);\r\n  }\r\n\r\n  #apply(keys: string[]): void {\r\n    if (this.disabled()) return;\r\n    this.keys.set(keys);\r\n    const serialized = serializeProjection({ keys });\r\n    // Pre-record so the echoed value (see valueBridge) is ignored, preserving\r\n    // empty in-progress key rows that serialise away.\r\n    this.#lastSynced = serialized;\r\n    this.valueChanged.emit(serialized);\r\n  }\r\n}\r\n","<div class=\"projection\">\r\n  <p class=\"hint-line\">\r\n    <mat-icon class=\"info-icon\">help_outline</mat-icon>\r\n    <span>Choose how the submitted form is shaped before it is sent to the endpoint.</span>\r\n  </p>\r\n\r\n  <mat-button-toggle-group class=\"mode-toggle\" [value]=\"mode()\" hideSingleSelectionIndicator\r\n    [disabled]=\"disabled()\" (change)=\"setMode($event.value)\" aria-label=\"Payload shape\">\r\n    <mat-button-toggle value=\"flat\" matTooltip=\"Send each field at the top level\">\r\n      <mat-icon>list</mat-icon> Top level\r\n    </mat-button-toggle>\r\n    <mat-button-toggle value=\"wrap\" matTooltip=\"Nest the whole form under a key\">\r\n      <mat-icon>data_object</mat-icon> Wrap under key\r\n    </mat-button-toggle>\r\n  </mat-button-toggle-group>\r\n\r\n  @if (mode() === 'wrap') {\r\n    <div class=\"keys\">\r\n      <span class=\"field-label\">Wrap the form under</span>\r\n      @for (key of keys(); track trackByIndex($index); let i = $index) {\r\n        <div class=\"key-row\">\r\n          <span class=\"key-prefix\" aria-hidden=\"true\">&#123;</span>\r\n          <input class=\"key-input\" [value]=\"key\" [disabled]=\"disabled()\"\r\n            placeholder=\"e.g. data, payload\" [attr.aria-label]=\"'Wrapper key ' + (i + 1)\"\r\n            (input)=\"updateKey(i, inputValue($event))\">\r\n          <span class=\"key-suffix\" aria-hidden=\"true\">: form&#125;</span>\r\n          <button type=\"button\" class=\"key-remove\" [disabled]=\"disabled()\" matTooltip=\"Remove key\"\r\n            [attr.aria-label]=\"'Remove wrapper key ' + (i + 1)\" (click)=\"removeKey(i)\">\r\n            <mat-icon>close</mat-icon>\r\n          </button>\r\n        </div>\r\n      }\r\n      <button type=\"button\" class=\"link-btn\" [disabled]=\"disabled()\" (click)=\"addKey()\">\r\n        <mat-icon>add</mat-icon> Add another key\r\n      </button>\r\n    </div>\r\n  } @else {\r\n    <p class=\"hint-line subtle\">\r\n      <mat-icon class=\"info-icon\">info</mat-icon>\r\n      <span>Every field is sent at the top level of the request body.</span>\r\n    </p>\r\n  }\r\n\r\n  <div class=\"preview\">\r\n    <div class=\"preview-head\">\r\n      <span class=\"field-label\">Sent to the endpoint</span>\r\n      <button type=\"button\" class=\"link-btn\" [disabled]=\"disabled()\" matTooltip=\"Reset to the recommended shape\"\r\n        (click)=\"resetToDefault()\">\r\n        <mat-icon>restart_alt</mat-icon> Reset\r\n      </button>\r\n    </div>\r\n    <pre class=\"preview-json\">{{ preview() | json }}</pre>\r\n  </div>\r\n\r\n  @for (error of errors(); track $index) {\r\n    <p class=\"error-line\">{{ error.message }}</p>\r\n  }\r\n</div>\r\n"],"names":["i1","i2","i3"],"mappings":"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"}