{"version":3,"file":"fastenhealth-angular-code-input.mjs","sources":["../../../angular-code-input/src/lib/code-input.component.config.ts","../../../angular-code-input/src/lib/code-input.component.ts","../../../angular-code-input/src/lib/code-input.component.html","../../../angular-code-input/src/lib/code-input.module.ts","../../../angular-code-input/src/public-api.ts","../../../angular-code-input/src/fastenhealth-angular-code-input.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\r\n\r\nexport const CodeInputComponentConfigToken = new InjectionToken<CodeInputComponentConfig>('CodeInputComponentConfig');\r\n\r\nexport interface CodeInputComponentConfig {\r\n  codeLength?: number;\r\n  inputType?: string;\r\n  inputMode?: string;\r\n  initialFocusField?: number;\r\n  isCharsCode?: boolean;\r\n  isCodeHidden?: boolean;\r\n  isPrevFocusableAfterClearing?: boolean;\r\n  isFocusingOnLastByClickIfFilled?: boolean;\r\n  code?: string | number;\r\n  disabled?: boolean;\r\n  autocapitalize?: string;\r\n}\r\n\r\nexport const defaultComponentConfig: CodeInputComponentConfig = {\r\n  codeLength: 4,\r\n  inputType: 'tel',\r\n  inputMode: 'numeric',\r\n  initialFocusField: undefined,\r\n  isCharsCode: false,\r\n  isCodeHidden: false,\r\n  isPrevFocusableAfterClearing: true,\r\n  isFocusingOnLastByClickIfFilled: false,\r\n  code: undefined,\r\n  disabled: false,\r\n  autocapitalize: undefined\r\n};\r\n","import {\n  AfterViewChecked,\n  AfterViewInit,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Inject,\n  Input,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  QueryList,\n  SimpleChanges,\n  ViewChildren\n} from '@angular/core';\nimport {\n  CodeInputComponentConfig,\n  CodeInputComponentConfigToken,\n  defaultComponentConfig\n} from './code-input.component.config';\nimport type { Subscription } from 'rxjs';\n\nenum InputState {\n  ready = 0,\n  reset = 1\n}\n\n@Component({\n  selector: 'code-input',\n  templateUrl: 'code-input.component.html',\n  styleUrls: ['./code-input.component.scss']\n})\nexport class CodeInputComponent implements AfterViewInit, OnInit, OnChanges, OnDestroy, AfterViewChecked, CodeInputComponentConfig {\n\n  @ViewChildren('input') inputsList !: QueryList<ElementRef>;\n\n  @Input() codeLength !: number;\n  @Input() inputType !: string;\n  @Input() inputMode !: string;\n  @Input() initialFocusField?: number;\n  /** @deprecated Use isCharsCode prop instead. */\n  @Input() isNonDigitsCode = false;\n  @Input() isCharsCode !: boolean;\n  @Input() isCodeHidden !: boolean;\n  @Input() isPrevFocusableAfterClearing !: boolean;\n  @Input() isFocusingOnLastByClickIfFilled !: boolean;\n  @Input() code ?: string | number;\n  @Input() disabled !: boolean;\n  @Input() autocapitalize ?: string;\n\n  @Output() readonly codeChanged = new EventEmitter<string>();\n  @Output() readonly codeCompleted = new EventEmitter<string>();\n\n  public placeholders: number[] = [];\n\n  private inputs: HTMLInputElement[] = [];\n  private inputsStates: InputState[] = [];\n  private inputsListSubscription !: Subscription;\n\n  private _codeLength !: number;\n  private state = {\n    isFocusingAfterAppearingCompleted: false,\n    isInitialFocusFieldEnabled: false\n  };\n\n  constructor(@Optional() @Inject(CodeInputComponentConfigToken) config?: CodeInputComponentConfig) {\n    Object.assign(this, defaultComponentConfig);\n\n    if (!config) {\n      return;\n    }\n\n    // filtering for only valid config props\n    for (const prop of Object.keys(config) as Array<keyof CodeInputComponentConfig>) {\n      if (!Object.prototype.hasOwnProperty.call(defaultComponentConfig, prop)) {\n        continue;\n      }\n\n      Object.assign(this, {[prop]: config[prop]});\n    }\n  }\n\n  /**\n   * Life cycle\n   */\n\n  ngOnInit(): void {\n    // defining the state\n    this.state.isInitialFocusFieldEnabled = !this.isEmpty(this.initialFocusField);\n    // initiating the code\n    this.onCodeLengthChanges();\n  }\n\n  ngAfterViewInit(): void {\n    // initiation of the inputs\n    this.inputsListSubscription = this.inputsList.changes.subscribe(this.onInputsListChanges.bind(this));\n    this.onInputsListChanges(this.inputsList);\n  }\n\n  ngAfterViewChecked(): void {\n    this.focusOnInputAfterAppearing();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.code) {\n      this.onInputCodeChanges();\n    }\n    if (changes.codeLength) {\n      this.onCodeLengthChanges();\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.inputsListSubscription) {\n      this.inputsListSubscription.unsubscribe();\n    }\n  }\n\n  /**\n   * Methods\n   */\n\n  reset(isChangesEmitting = false): void {\n    // resetting the code to its initial value or to an empty value\n    this.onInputCodeChanges();\n\n    if (this.state.isInitialFocusFieldEnabled) {\n      this.focusOnField(this.initialFocusField!);\n    }\n\n    if (isChangesEmitting) {\n      this.emitChanges();\n    }\n  }\n\n  focusOnField(index: number): void {\n    if (index >= this._codeLength) {\n      throw new Error('The index of the focusing input box should be less than the codeLength.');\n    }\n\n    this.inputs[index].focus({ preventScroll: true });\n  }\n\n  onClick(e: any): void {\n    // handle click events only if the the prop is enabled\n    if (!this.isFocusingOnLastByClickIfFilled) {\n      return;\n    }\n\n    const target = e.target;\n    const last = this.inputs[this._codeLength - 1];\n    // already focused\n    if (target === last) {\n      return;\n    }\n\n    // check filling\n    const isFilled = this.getCurrentFilledCode().length >= this._codeLength;\n    if (!isFilled) {\n      return;\n    }\n\n    // focusing on the last input if is filled\n    setTimeout(() => last.focus({ preventScroll: true }));\n  }\n\n  onInput(e: any, i: number): void {\n    const target = e.target;\n    const value = e.data || target.value;\n\n    if (this.isEmpty(value)) {\n      return;\n    }\n\n    // only digits are allowed if isCharsCode flag is absent/false\n    if (!this.canInputValue(value)) {\n      e.preventDefault();\n      e.stopPropagation();\n      this.setInputValue(target, null);\n      this.setStateForInput(target, InputState.reset);\n      return;\n    }\n\n    const values = value.toString().trim().split('');\n    for (let j = 0; j < values.length; j++) {\n      const index = j + i;\n      if (index > this._codeLength - 1) {\n        break;\n      }\n\n      this.setInputValue(this.inputs[index], values[j]);\n    }\n    this.emitChanges();\n\n    const next = i + values.length;\n    if (next > this._codeLength - 1) {\n      target.blur();\n      return;\n    }\n\n    this.inputs[next].focus({ preventScroll: true });\n  }\n\n  onPaste(e: ClipboardEvent, i: number): void {\n    e.preventDefault();\n    e.stopPropagation();\n\n    const data = e.clipboardData ? e.clipboardData.getData('text').trim() : undefined;\n\n    if (this.isEmpty(data)) {\n      return;\n    }\n\n    // Convert paste text into iterable\n    const values = data!.split('');\n    let valIndex = 0;\n\n    for (let j = i; j < this.inputs.length; j++) {\n      // The values end is reached. Loop exit\n      if (valIndex === values.length) {\n        break;\n      }\n\n      const input = this.inputs[j];\n      const val = values[valIndex];\n\n      // Cancel the loop when a value cannot be used\n      if (!this.canInputValue(val)) {\n        this.setInputValue(input, null);\n        this.setStateForInput(input, InputState.reset);\n        return;\n      }\n\n      this.setInputValue(input, val.toString());\n      valIndex++;\n    }\n\n    this.inputs[i].blur();\n    this.emitChanges();\n  }\n\n  async onKeydown(e: any, i: number): Promise<void> {\n    const target = e.target;\n    const isTargetEmpty = this.isEmpty(target.value);\n    const prev = i - 1;\n\n    // processing only the backspace and delete key events\n    const isBackspaceKey = await this.isBackspaceKey(e);\n    const isDeleteKey = this.isDeleteKey(e);\n    if (!isBackspaceKey && !isDeleteKey) {\n      return;\n    }\n\n    e.preventDefault();\n\n    this.setInputValue(target, null);\n    if (!isTargetEmpty) {\n      this.emitChanges();\n    }\n\n    // preventing to focusing on the previous field if it does not exist or the delete key has been pressed\n    if (prev < 0 || isDeleteKey) {\n      return;\n    }\n\n    if (isTargetEmpty || this.isPrevFocusableAfterClearing) {\n      this.inputs[prev].focus({ preventScroll: true });\n    }\n  }\n\n  private onInputCodeChanges(): void {\n    if (!this.inputs.length) {\n      return;\n    }\n\n    if (this.isEmpty(this.code)) {\n      this.inputs.forEach((input: HTMLInputElement) => {\n        this.setInputValue(input, null);\n      });\n      return;\n    }\n\n    const chars = this.code!.toString().trim().split('');\n    // checking if all the values are correct\n    let isAllCharsAreAllowed = true;\n    for (const char of chars) {\n      if (!this.canInputValue(char)) {\n        isAllCharsAreAllowed = false;\n        break;\n      }\n    }\n\n    this.inputs.forEach((input: HTMLInputElement, index: number) => {\n      const value = isAllCharsAreAllowed ? chars[index] : null;\n      this.setInputValue(input, value);\n    });\n  }\n\n  private onCodeLengthChanges(): void {\n    if (!this.codeLength) {\n      return;\n    }\n\n    this._codeLength = this.codeLength;\n    if (this._codeLength > this.placeholders.length) {\n      const numbers = Array(this._codeLength - this.placeholders.length).fill(1);\n      this.placeholders.splice(this.placeholders.length - 1, 0, ...numbers);\n    }\n    else if (this._codeLength < this.placeholders.length) {\n      this.placeholders.splice(this._codeLength);\n    }\n  }\n\n  private onInputsListChanges(list: QueryList<ElementRef>): void {\n    if (list.length > this.inputs.length) {\n      const inputsToAdd = list.filter((item, index) => index > this.inputs.length - 1);\n      this.inputs.splice(this.inputs.length, 0, ...inputsToAdd.map(item => item.nativeElement));\n      const states = Array(inputsToAdd.length).fill(InputState.ready);\n      this.inputsStates.splice(this.inputsStates.length, 0, ...states);\n    }\n    else if (list.length < this.inputs.length) {\n      this.inputs.splice(list.length);\n      this.inputsStates.splice(list.length);\n    }\n\n    // filling the inputs after changing of their count\n    this.onInputCodeChanges();\n  }\n\n  private focusOnInputAfterAppearing(): void {\n    if (!this.state.isInitialFocusFieldEnabled) {\n      return;\n    }\n\n    if (this.state.isFocusingAfterAppearingCompleted) {\n      return;\n    }\n\n    this.focusOnField(this.initialFocusField!);\n    this.state.isFocusingAfterAppearingCompleted = document.activeElement === this.inputs[this.initialFocusField!];\n  }\n\n  private emitChanges(): void {\n    setTimeout(() => this.emitCode(), 50);\n  }\n\n  private emitCode(): void {\n    const code = this.getCurrentFilledCode();\n\n    this.codeChanged.emit(code);\n\n    if (code.length >= this._codeLength) {\n      this.codeCompleted.emit(code);\n    }\n  }\n\n  private getCurrentFilledCode(): string {\n    let code = '';\n\n    for (const input of this.inputs) {\n      if (!this.isEmpty(input.value)) {\n        code += input.value;\n      }\n    }\n\n    return code;\n  }\n\n  private isBackspaceKey(e: any): Promise<boolean> {\n    const isBackspace = (e.key && e.key.toLowerCase() === 'backspace') || (e.keyCode && e.keyCode === 8);\n    if (isBackspace) {\n      return Promise.resolve(true);\n    }\n\n    // process only key with placeholder keycode on android devices\n    if (!e.keyCode || e.keyCode !== 229) {\n      return Promise.resolve(false);\n    }\n\n    return new Promise<boolean>((resolve) => {\n      setTimeout(() => {\n        const input = e.target;\n        const isReset = this.getStateForInput(input) === InputState.reset;\n        if (isReset) {\n          this.setStateForInput(input, InputState.ready);\n        }\n        // if backspace key pressed the caret will have position 0 (for single value field)\n        resolve(input.selectionStart === 0 && !isReset);\n      });\n    });\n  }\n\n  private isDeleteKey(e: any): boolean {\n    return (e.key && e.key.toLowerCase() === 'delete') || (e.keyCode && e.keyCode === 46);\n  }\n\n  private setInputValue(input: HTMLInputElement, value: any): void {\n    const isEmpty = this.isEmpty(value);\n    const valueClassCSS = 'has-value';\n    const emptyClassCSS = 'empty';\n    if (isEmpty) {\n      input.value = '';\n      input.classList.remove(valueClassCSS);\n      input.parentElement!.classList.add(emptyClassCSS);\n    }\n    else {\n      input.value = value;\n      input.classList.add(valueClassCSS);\n      input.parentElement!.classList.remove(emptyClassCSS);\n    }\n  }\n\n  private canInputValue(value: any): boolean {\n    if (this.isEmpty(value)) {\n      return false;\n    }\n\n    const isDigitsValue = /^[0-9]+$/.test(value.toString());\n    return isDigitsValue || (this.isCharsCode || this.isNonDigitsCode);\n  }\n\n  private setStateForInput(input: HTMLInputElement, state: InputState): void {\n    const index = this.inputs.indexOf(input);\n    if (index < 0) {\n      return;\n    }\n\n    this.inputsStates[index] = state;\n  }\n\n  private getStateForInput(input: HTMLInputElement): InputState | undefined {\n    const index = this.inputs.indexOf(input);\n    return this.inputsStates[index];\n  }\n\n  private isEmpty(value: any): boolean {\n    return  value === null || value === undefined || !value.toString().length;\n  }\n}\n","<span *ngFor=\"let holder of placeholders; index as i\"\n      [class.code-hidden]=\"isCodeHidden\">\n  <input #input\n         (click)=\"onClick($event)\"\n         (paste)=\"onPaste($event, i)\"\n         (input)=\"onInput($event, i)\"\n         (keydown)=\"onKeydown($event, i)\"\n         [type]=\"inputType\"\n         [disabled]=\"disabled\"\n         [attr.inputmode]=\"inputMode\"\n         [attr.autocapitalize]=\"autocapitalize\"\n         autocomplete=\"one-time-code\"/>\n</span>\n","import {ModuleWithProviders, NgModule} from '@angular/core';\nimport {CodeInputComponent } from './code-input.component';\nimport {CommonModule} from '@angular/common';\nimport {CodeInputComponentConfig, CodeInputComponentConfigToken} from './code-input.component.config';\n\n@NgModule({\n  imports: [\n    CommonModule\n  ],\n  declarations: [\n    CodeInputComponent\n  ],\n  exports: [\n    CodeInputComponent\n  ]\n})\nexport class CodeInputModule {\n  static forRoot(config: CodeInputComponentConfig): ModuleWithProviders<CodeInputModule> {\n    return {\n      ngModule: CodeInputModule,\n      providers: [\n        {provide: CodeInputComponentConfigToken, useValue: config }\n      ]\n    };\n  }\n}\n","/*\n * Public API surface of @fastenhealth/angular-code-input\n */\n\nexport * from './lib/code-input.component';\nexport * from './lib/code-input.component.config';\nexport * from './lib/code-input.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}