{"version":3,"file":"pv-frontend-pv-shared-components-bin-input.mjs","sources":["../../../projects/pv-shared-components/bin-input/bin-input.component.ts","../../../projects/pv-shared-components/bin-input/bin-input.component.html","../../../projects/pv-shared-components/bin-input/bin-input.module.ts","../../../projects/pv-shared-components/bin-input/pv-frontend-pv-shared-components-bin-input.ts"],"sourcesContent":["import {\n  Component,\n  ElementRef,\n  Input,\n  QueryList,\n  ViewChildren,\n} from '@angular/core';\nimport {\n  ControlValueAccessor,\n  FormArray,\n  FormControl,\n  NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { OverrideStyleConfig } from '@pv-frontend/pv-shared-components/common/types';\nimport { BinInputVariant } from '@pv-frontend/pv-shared-services/common';\n\nexport interface BinConfig {\n  disabled?: boolean;\n  placeholder?: string;\n  length?: number;\n}\n\nexport interface VariantConfig {\n  inputsConfig: [BinConfig, BinConfig, BinConfig, BinConfig];\n  firstFocussableIndex: number;\n  lastFocussableIndex: number;\n}\n\nexport interface BinValue {\n  bin: string;\n  binType: BinInputVariant;\n}\n\nexport interface BinInputStyleOverride {\n  container?: OverrideStyleConfig;\n  label?: OverrideStyleConfig;\n  inputContainer?: OverrideStyleConfig;\n  input?: OverrideStyleConfig;\n  error?: OverrideStyleConfig;\n}\n\n@Component({\n  selector: 'pv-bin-input',\n  templateUrl: './bin-input.component.html',\n  styleUrls: ['./bin-input.component.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: BinInput,\n      multi: true,\n    },\n  ],\n})\nexport class BinInput implements ControlValueAccessor {\n  public onChange?: (value: BinValue) => void;\n  public onTouched?: () => void;\n\n  public variantConfig: Record<BinInputVariant, VariantConfig> = {\n    first4: {\n      inputsConfig: [\n        { length: 4 },\n        { disabled: true },\n        { disabled: true },\n        { disabled: true },\n      ],\n      firstFocussableIndex: 0,\n      lastFocussableIndex: 0,\n    },\n    first6: {\n      inputsConfig: [\n        { length: 4 },\n        { length: 2 },\n        { disabled: true },\n        { disabled: true },\n      ],\n      firstFocussableIndex: 0,\n      lastFocussableIndex: 1,\n    },\n    first8: {\n      inputsConfig: [\n        { length: 4 },\n        { length: 4 },\n        { disabled: true },\n        { disabled: true },\n      ],\n      firstFocussableIndex: 0,\n      lastFocussableIndex: 1,\n    },\n    first9: {\n      inputsConfig: [\n        { length: 4 },\n        { length: 4 },\n        { length: 1 },\n        { disabled: true },\n      ],\n      firstFocussableIndex: 0,\n      lastFocussableIndex: 2,\n    },\n    first4_last4: {\n      inputsConfig: [\n        { length: 4 },\n        { disabled: true },\n        { disabled: true },\n        { length: 4 },\n      ],\n      firstFocussableIndex: 0,\n      lastFocussableIndex: 3,\n    },\n    first6_last4: {\n      inputsConfig: [\n        { length: 4 },\n        { length: 2 },\n        { disabled: true },\n        { length: 4 },\n      ],\n      firstFocussableIndex: 0,\n      lastFocussableIndex: 3,\n    },\n    last4: {\n      inputsConfig: [\n        { disabled: true },\n        { disabled: true },\n        { disabled: true },\n        { length: 4 },\n      ],\n      firstFocussableIndex: 3,\n      lastFocussableIndex: 3,\n    },\n    last8: {\n      inputsConfig: [\n        { disabled: true },\n        { disabled: true },\n        { length: 4 },\n        { length: 4 },\n      ],\n      firstFocussableIndex: 2,\n      lastFocussableIndex: 3,\n    },\n  };\n  public TOTAL_INPUT_BOXES = 4;\n  public DEFAULT_BIN_VARIANT: BinInputVariant = 'first8';\n\n  public currentVariant: BinInputVariant = this.DEFAULT_BIN_VARIANT;\n  public inputs: FormArray = this.getFormArray(\n    this.TOTAL_INPUT_BOXES,\n    this.currentVariant\n  );\n\n  // there is a way to do this without maintaining a variable for focus\n  // but safari has an issue where the order of events (keydown, input, keyup) might get jumbled in some scenarios\n  // hence we are sticking with using a variable here for referencing the position to be focussed on\n  #scheduledFocus: number | null = null;\n\n  @ViewChildren('binInputEl')\n  public inputEls!: QueryList<ElementRef<HTMLInputElement>>;\n\n  @Input()\n  public label: string = '';\n\n  @Input()\n  public set variant(value: BinInputVariant) {\n    this.currentVariant = value;\n    this.inputs = this.getFormArray(\n      this.TOTAL_INPUT_BOXES,\n      this.currentVariant\n    );\n  }\n\n  @Input()\n  public separator: string = '';\n\n  @Input()\n  public isInvalid: boolean = false;\n\n  @Input()\n  public errorMessage: string = '';\n\n  @Input()\n  public style?: BinInputStyleOverride = {};\n\n  public handleInput(): void {\n    this.#updateWiredValue();\n    if (this.#scheduledFocus !== null) {\n      this.#focusInput(this.#scheduledFocus);\n      this.#scheduledFocus = null;\n    }\n  }\n\n  public handleFocus(e: FocusEvent): void {\n    (e.target as HTMLInputElement).focus();\n  }\n\n  public handleKeyDown(event: KeyboardEvent, index: number): void {\n    const currentVariantConfig = this.variantConfig[this.currentVariant];\n\n    // allow tabs to switch between inputs\n    if (event.key === 'Tab') {\n      return;\n    }\n\n    if (event.key === 'Backspace' || event.key === 'Delete') {\n      // In case the input is already filled, delete the value and focus on the same input only\n      if (this.inputs.controls[index].value) {\n        this.#scheduledFocus = index;\n      } else {\n        // In case of delete or backspace queue up the focus to be done on previous index if the current input isn't filled\n        if (index > currentVariantConfig.firstFocussableIndex) {\n          this.#focusInput(this.findNextFocusIndex(index, true));\n        }\n      }\n\n      return;\n    }\n\n    const isDigit = /\\d/.test(event.key);\n\n    // Safari fires Cmd + V through keyPress event as well\n    // So we need to handle it here and let it through, this is then handled by the paste handler\n    if (event.key === 'v' && event.metaKey) {\n      // TODO - should we handle paste?\n      // currently skipping it, not a p0, will understand the priority and include this in a separate PR\n      event.preventDefault();\n      return;\n    }\n\n    // return if a non-numeric and unallowed character is pressed\n    if (!isDigit) {\n      event.preventDefault();\n      return;\n    }\n\n    if (isDigit && this.inputs.controls[index].value) {\n      if (\n        this.inputs.controls[index].value.length >=\n        (currentVariantConfig.inputsConfig[index].length ?? 0)\n      ) {\n        // If input box already has maximum allowed characters, don't allow user input and focus on next input box\n        // only do this if current index is not the last focussable index\n        event.preventDefault();\n        if (index !== currentVariantConfig.lastFocussableIndex) {\n          this.#focusInput(this.findNextFocusIndex(index));\n        }\n      } else if (\n        this.inputs.controls[index].value.length ===\n        (currentVariantConfig.inputsConfig[index].length ?? 0) - 1\n      ) {\n        // After input of current character, focus should shift to the next allowable input\n        // Allow user to give input and schedule the focus to move to the next index when this occurs\n        if (index !== currentVariantConfig.lastFocussableIndex) {\n          this.#scheduledFocus = this.findNextFocusIndex(index);\n        }\n      }\n    }\n  }\n\n  public writeValue(obj: BinValue): void {\n    if (obj && obj.bin) {\n      const binValue = obj.bin.replaceAll(this.separator, '');\n      let currIndex = 0;\n      for (let index = 0; index < this.TOTAL_INPUT_BOXES; index++) {\n        const currentIndexInputConfig =\n          this.variantConfig[this.currentVariant].inputsConfig[index];\n        if (!currentIndexInputConfig.disabled) {\n          this.inputs\n            .at(index)\n            .setValue(\n              binValue.slice(\n                currIndex,\n                currIndex + (currentIndexInputConfig.length ?? 0)\n              )\n            );\n          currIndex += currentIndexInputConfig.length ?? 0;\n        }\n      }\n    }\n  }\n\n  public registerOnChange(fn: (value: BinValue) => void): void {\n    this.onChange = fn;\n  }\n\n  public registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  public setDisabledState?(isDisabled: boolean): void {\n    // only enable or disable the boxes which can be enabled/disabled as per config\n    // those input boxes which always stay disabled will still always remain disabled\n    for (let i = 0; i < this.TOTAL_INPUT_BOXES; i++) {\n      if (!this.variantConfig[this.currentVariant].inputsConfig[i].disabled) {\n        isDisabled ? this.inputs.at(i)?.disable : this.inputs.at(i)?.enable;\n      }\n    }\n  }\n\n  private findNextFocusIndex(\n    currentIndex: number,\n    isBackspace: boolean = false\n  ): number {\n    let currInd;\n    if (isBackspace) {\n      currInd = currentIndex - 1;\n      // until the next input box is enabled and within range, keep on going left to find the index of such input box\n      while (\n        currInd >= 0 &&\n        !!this.variantConfig[this.currentVariant].inputsConfig[currInd].disabled\n      ) {\n        currInd--;\n      }\n    } else {\n      currInd = currentIndex + 1;\n      // until the next input box is enabled and within range, keep on going right to find the index of such input box\n      while (\n        currInd <= this.TOTAL_INPUT_BOXES - 1 &&\n        !!this.variantConfig[this.currentVariant].inputsConfig[currInd].disabled\n      ) {\n        currInd++;\n      }\n    }\n\n    return currInd;\n  }\n\n  private getFormArray(_size: number, variant: BinInputVariant): FormArray {\n    const arr = [];\n    for (let i = 0; i < _size; i++) {\n      arr.push(\n        new FormControl({\n          value: '',\n          disabled:\n            this.variantConfig[variant].inputsConfig[i].disabled ?? false,\n        })\n      );\n    }\n\n    return new FormArray(arr);\n  }\n\n  #focusInput(index: number): void {\n    // in case focus is asked for overflowing index, ignore the same\n    if (index < 0 || index > this.TOTAL_INPUT_BOXES - 1) {\n      return;\n    }\n    // In order not to interfere with the input we setTimeout before advancing the focus\n    // Without setTimeout this would create issues\n    setTimeout(() => this.inputEls.get(index)?.nativeElement.focus());\n  }\n\n  #updateWiredValue(): void {\n    // We want to expose the value as a plain string\n    setTimeout(() =>\n      this.onChange?.({\n        bin: this.inputs.value.join(this.separator),\n        binType: this.currentVariant,\n      })\n    );\n  }\n}\n","<div\n  class=\"pv-bin-input-container flex flex-column gap-1 w-max\"\n  [style]=\"this.style?.container\">\n  <span\n    *ngIf=\"this.label\"\n    class=\"pv-bin-input-label mb-3 surface-text-subtle-low-contrast text-sm\"\n    [style]=\"this.style?.label\">\n    {{ this.label }}\n  </span>\n  <div\n    class=\"pv-bin-input flex flex-row gap-2\"\n    [style]=\"this.style?.inputContainer\">\n    <input\n      #binInputEl\n      [class.is-invalid-bin]=\"\n        !this.variantConfig[this.currentVariant].inputsConfig[i].disabled &&\n        this.isInvalid\n      \"\n      class=\"pv-bin-input-ele text-base w-6rem h-3rem text-left font-bold py-3 px-4\"\n      *ngFor=\"let input of this.inputs.controls; let i = index\"\n      [formControl]=\"$any(input)\"\n      type=\"text\"\n      inputmode=\"numeric\"\n      [placeholder]=\"\n        this.variantConfig[this.currentVariant].inputsConfig[i].disabled\n          ? 'XXXX'\n          : ''\n      \"\n      (input)=\"this.handleInput()\"\n      (keydown)=\"this.handleKeyDown($event, i)\"\n      (focus)=\"this.handleFocus($event)\"\n      [style]=\"this.style?.input\" />\n  </div>\n  <span\n    *ngIf=\"this.isInvalid\"\n    class=\"pv-invalid-bin-label feedback-text-negative w-max text-sm mt-2\"\n    [style]=\"this.style?.error\">\n    {{ this.errorMessage }}\n  </span>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { BinInput } from './bin-input.component';\n\n@NgModule({\n  imports: [CommonModule, ReactiveFormsModule],\n  declarations: [BinInput],\n  exports: [BinInput],\n})\nexport class PvBinInputModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}