{"version":3,"file":"ngx-t-forms-token-text-input.component-B1I95sk3.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/token-text-input/token-text-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/token-text-input/token-text-input.component.html"],"sourcesContent":["import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  Input,\n  Optional,\n  Self,\n  ViewEncapsulation,\n  computed,\n  forwardRef,\n  output,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\nimport {\n  BaseCustomInput,\n  BaseCustomInputConfig,\n} from '../../../../services/core/t-input-controller/functions/baseCustomInput';\nimport type { EditorBinding } from '../json-editor/json-editor.component';\nimport { TokenBindingMenuComponent, type TokenMenuAnchor } from '../token-binding-menu/token-binding-menu.component';\n\nconst tokenTextInputConfig: BaseCustomInputConfig = {\n  controlType: 'lib-token-text-input',\n  nextId: 0,\n};\n\n/**\n * Single-line text with the `$`-trigger token picker.\n *\n * WHY THIS EXISTS\n * ---------------\n * The `$` gesture — type `$`, pick a field, get its `{{token}}` inserted — was\n * only ever implemented inside {@link JsonEditorComponent}, welded to a JSON\n * textarea with syntax highlighting and a caret-offset model. Every consumer of\n * it (the payload, header and query template editors) authors JSON.\n *\n * An email subject is plain text, and `ElementEditorTypes.Input` renders a bare\n * `matInput` with no picker at all — so an element carrying the hint \"Press $ to\n * insert a document value\" silently promised something that could not happen.\n * This is the same gesture over a plain string.\n *\n * WHY IT IS A `MatFormFieldControl`\n * ---------------------------------\n * `t-dynamic-data-edit` renders every editor that IS one inside a shared\n * `<mat-form-field>` (the label, outline, hint and error row all come from\n * there) and everything else outside it. A plain `<input matInput>` sitting in\n * THIS component's view is not *content* of that field, so Material cannot see\n * it and throws `mat-form-field must contain a MatFormFieldControl` — the field\n * then fails to render at all. Registering as the control, exactly as\n * `InputCustomComponent` and `QuillInputComponent` do, is what makes the field\n * appear.\n *\n * WHAT IS SHARED, AND WHAT IS NOT\n * -------------------------------\n * The option list itself is {@link TokenBindingMenuComponent}, shared with\n * `QuillInputComponent` so the gesture looks and behaves identically wherever\n * it appears. The binding data is shared too — {@link EditorBinding} plus the\n * derivation in `_shared/field-bindings.ts` — so every editor offers the same\n * fields under the same labels and inserts the same spelling.\n *\n * The CARET handling is not shared and should not be: a text input addresses\n * `selectionStart` on a string, Quill addresses an index into a Delta, and the\n * JSON editor tracks an offset into a highlighted backdrop. Those three have\n * nothing in common beyond \"find the `$` before the cursor\", so each host owns\n * its own few lines rather than an abstraction that fits none of them.\n */\n@Component({\n  selector: 'lib-token-text-input',\n  imports: [MatInputModule, TokenBindingMenuComponent],\n  templateUrl: './token-text-input.component.html',\n  styleUrl: './token-text-input.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.Emulated,\n  host: {\n    '[class.floating]': 'shouldLabelFloat',\n    '[id]': 'id',\n  },\n  providers: [\n    {\n      provide: MatFormFieldControl,\n      useExisting: forwardRef(() => TokenTextInputComponent),\n    },\n  ],\n})\nexport class TokenTextInputComponent\n  extends BaseCustomInput<string>\n  implements AfterViewInit\n{\n  /**\n   * Insertable bindings for the `$` menu. When empty the menu never opens.\n   *\n   * A classic `@Input` rather than a signal input, mirroring\n   * `InputCustomComponent.inputConfig`: the base class exposes\n   * `value`/`required`/`disabled`/`placeholder` as setter-backed `@Input`s tied\n   * to `stateChanges`, and mixing the two styles on one component is the trap\n   * that comment warns about. The setter feeds a signal so `filtered` can stay a\n   * `computed`.\n   */\n  @Input()\n  set bindings(value: readonly EditorBinding[] | undefined) {\n    this.#bindings.set(value ?? []);\n  }\n  get bindings(): readonly EditorBinding[] {\n    return this.#bindings();\n  }\n  readonly #bindings = signal<readonly EditorBinding[]>([]);\n\n  /** Emitted on every keystroke and on insertion. */\n  readonly valueChange = output<string>();\n\n  /**\n   * Current text, tokens included.\n   *\n   * Re-declared as an `@Input` because `BaseCustomInput.value` is a plain\n   * accessor, not an input — a subclass that wants `[value]` bound has to say\n   * so. `QuillInputComponent` does exactly this for the same reason.\n   */\n  @Input()\n  override set value(next: string | null) {\n    super.value = next;\n    // The @Input path never calls writeValue, so the DOM is synced here too.\n    // Guarded, so the echo of the author's own keystrokes is a no-op.\n    this.syncInputFromModel();\n  }\n  override get value(): string | null {\n    return super.value;\n  }\n\n  // The native input is left uncontrolled while the user types. Binding the\n  // (debounced, therefore lagging) model to `[value]` makes Angular overwrite the\n  // DOM mid-keystroke and drop characters — the same reasoning, and the same\n  // remedy, as `InputCustomComponent`. TS `private`, not ES `#private`: Angular\n  // signal queries cannot sit on an ES-private field.\n  private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n\n  /** Whether the `$` menu is open. */\n  protected readonly menuOpen = signal(false);\n  /** Text typed after the `$` that opened the menu. */\n  protected readonly filter = signal('');\n  /** Index of the highlighted option. */\n  protected readonly activeIndex = signal(0);\n  /**\n   * Viewport position of the menu.\n   *\n   * Fixed positioning, not absolute: the menu lives inside a `<mat-form-field>`,\n   * whose infix and subscript wrappers clip an absolutely-positioned child, so\n   * the list would be cut off after a row or two.\n   */\n  protected readonly anchor = signal<TokenMenuAnchor | null>(null);\n\n  /**\n   * Characters that keep the menu open after a dollar trigger.\n   *\n   * WIDER than the JSON editor's word-chars-only filter on purpose: this menu\n   * also offers server-resolved namespace tokens whose ids contain dots\n   * (`$doc.reference`), and form-control ids may carry hyphens — the original\n   * pattern CLOSED the menu the moment either was typed. Punctuation outside\n   * this set still reads as a literal dollar (a currency amount) and dismisses\n   * the menu.\n   */\n  static readonly FILTER_PATTERN = /^[a-zA-Z0-9_.\\s-]*$/;\n\n  /** Bindings matching the active filter, capped so the list stays usable. */\n  protected readonly filtered = computed(() => {\n    const term = this.filter().trim().toLowerCase();\n    const all = this.#bindings();\n    if (!term) {\n      return all.slice(0, 50);\n    }\n    return all\n      .filter((binding) =>\n        `${binding.searchText ?? ''} ${binding.label}`.toLowerCase().includes(term),\n      )\n      .slice(0, 50);\n  });\n\n  constructor(\n    @Optional() @Self() ngControl: NgControl,\n    elementRef: ElementRef<HTMLElement>,\n  ) {\n    super(ngControl, elementRef, tokenTextInputConfig);\n  }\n\n  override get empty(): boolean {\n    const current = this.value;\n    return current === null || current === undefined || current === '';\n  }\n\n  override get shouldLabelFloat(): boolean {\n    return true;\n  }\n\n  ngAfterViewInit(): void {\n    // Reflect any value the form set before the view existed.\n    this.syncInputFromModel();\n  }\n\n  override writeValue(value: string): void {\n    super.writeValue(value);\n    // External model change (patchValue / reset). Never fires in response to the\n    // user's own typing, so it cannot clobber the caret.\n    this.syncInputFromModel();\n  }\n\n  /** Re-emits on every keystroke and decides whether the `$` menu should be open. */\n  protected onInput(): void {\n    const element = this.inputEl()?.nativeElement;\n    if (!element) {\n      return;\n    }\n    super.value = element.value;\n    this.valueChange.emit(element.value);\n    this.syncMenu(element);\n  }\n\n  /**\n   * Keyboard handling while the menu is open: navigate, accept, dismiss.\n   *\n   * Returns early when the menu is closed so ordinary typing — including Enter\n   * inside a form — is untouched.\n   */\n  protected onKeydown(event: KeyboardEvent): void {\n    if (!this.menuOpen()) {\n      return;\n    }\n    const options = this.filtered();\n    if (event.key === 'Escape') {\n      this.menuOpen.set(false);\n      event.stopPropagation();\n      event.preventDefault();\n      return;\n    }\n    if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n      if (options.length > 0) {\n        const step = event.key === 'ArrowDown' ? 1 : -1;\n        this.activeIndex.set((this.activeIndex() + step + options.length) % options.length);\n      }\n      event.preventDefault();\n      return;\n    }\n    if (event.key === 'Enter' || event.key === 'Tab') {\n      const chosen = options[this.activeIndex()];\n      if (chosen) {\n        this.insert(chosen);\n        event.preventDefault();\n      }\n    }\n  }\n\n  /** Closing is deferred so a click on an option still registers before blur. */\n  protected onBlur($event: FocusEvent): void {\n    this.touched = true;\n    this.onTouched();\n    this.blur.emit($event);\n    setTimeout(() => this.menuOpen.set(false), 150);\n  }\n\n  /**\n   * Replaces the `$filter` run at the caret with the binding's token.\n   *\n   * @param binding - The chosen menu entry.\n   */\n  protected insert(binding: EditorBinding): void {\n    const element = this.inputEl()?.nativeElement;\n    if (!element) {\n      return;\n    }\n    const caret = element.selectionStart ?? element.value.length;\n    const dollar = element.value.lastIndexOf('$', Math.max(0, caret - 1));\n    if (dollar < 0) {\n      this.menuOpen.set(false);\n      return;\n    }\n    const next = element.value.slice(0, dollar) + binding.insert + element.value.slice(caret);\n    element.value = next;\n    const cursor = dollar + binding.insert.length;\n    element.setSelectionRange(cursor, cursor);\n    this.menuOpen.set(false);\n    this.filter.set('');\n    super.value = next;\n    this.valueChange.emit(next);\n    element.focus();\n  }\n\n  /** Pushes the model onto the DOM. Only ever runs for EXTERNAL writes. */\n  private syncInputFromModel(): void {\n    const element = this.inputEl()?.nativeElement;\n    if (!element) {\n      return;\n    }\n    const current = this.value ?? '';\n    // Only write on a genuine difference: assigning to input.value resets the\n    // caret to the end even when the string is unchanged.\n    if (element.value !== String(current)) {\n      element.value = String(current);\n    }\n  }\n\n  /** Opens, filters or closes the menu based on the text between the last `$` and the caret. */\n  private syncMenu(element: HTMLInputElement): void {\n    if (this.disabled || this.#bindings().length === 0) {\n      this.menuOpen.set(false);\n      return;\n    }\n    const caret = element.selectionStart ?? element.value.length;\n    const beforeCaret = element.value.slice(0, caret);\n    const dollar = beforeCaret.lastIndexOf('$');\n    if (dollar < 0) {\n      this.menuOpen.set(false);\n      return;\n    }\n    const term = beforeCaret.slice(dollar + 1);\n    if (!TokenTextInputComponent.FILTER_PATTERN.test(term)) {\n      this.menuOpen.set(false);\n      return;\n    }\n    const rect = element.getBoundingClientRect();\n    this.anchor.set({ top: rect.bottom + 4, left: rect.left, width: Math.max(rect.width, 240) });\n    this.filter.set(term);\n    this.activeIndex.set(0);\n    this.menuOpen.set(true);\n  }\n}\n","<input\n  matInput\n  #inputEl\n  type=\"text\"\n  [readonly]=\"disabled\"\n  [required]=\"required\"\n  [placeholder]=\"placeholder || ''\"\n  (input)=\"onInput()\"\n  (click)=\"onInput()\"\n  (keydown)=\"onKeydown($event)\"\n  (blur)=\"onBlur($event)\" />\n\n@if (menuOpen()) {\n  <lib-token-binding-menu\n    [options]=\"filtered()\"\n    [activeIndex]=\"activeIndex()\"\n    [anchor]=\"anchor()\"\n    (pick)=\"insert($event)\" />\n}\n"],"names":[],"mappings":"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"}