@tapsellorg/angular-material-library
Version:
Angular library for Tapsell
1 lines • 26.7 kB
Source Map (JSON)
{"version":3,"file":"tapsellorg-angular-material-library-src-lib-pin-input.mjs","sources":["../../projects/pegah-library/src/lib/pin-input/pin-input.component.config.ts","../../projects/pegah-library/src/lib/pin-input/pin-input.component.ts","../../projects/pegah-library/src/lib/pin-input/pin-input.component.html","../../projects/pegah-library/src/lib/pin-input/tapsellorg-angular-material-library-src-lib-pin-input.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const CodeInputComponentConfigToken = new InjectionToken<CodeInputComponentConfig>(\n 'CodeInputComponentConfig',\n);\n\nexport interface CodeInputComponentConfig {\n codeLength: number;\n inputType: string;\n inputMode: string;\n initialFocusField: number;\n isCharsCode: boolean;\n isCodeHidden: boolean;\n isPrevFocusableAfterClearing: boolean;\n isFocusingOnLastByClickIfFilled: boolean;\n code: string | number;\n disabled: boolean;\n autocapitalize: string;\n}\n\nexport const defaultComponentConfig: CodeInputComponentConfig = {\n codeLength: 4,\n inputType: 'tel',\n inputMode: 'numeric',\n initialFocusField: 0,\n isCharsCode: false,\n isCodeHidden: false,\n isPrevFocusableAfterClearing: true,\n isFocusingOnLastByClickIfFilled: false,\n code: '',\n disabled: false,\n autocapitalize: '',\n};\n","import {\n AfterViewChecked,\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n input,\n OnDestroy,\n OnInit,\n output,\n QueryList,\n ViewChildren,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { defaultComponentConfig } from './pin-input.component.config';\nimport { CommonModule } from '@angular/common';\n\nenum InputState {\n ready = 0,\n reset = 1,\n}\n\n@Component({\n selector: 'pgh-pin-input',\n imports: [CommonModule],\n templateUrl: './pin-input.component.html',\n styleUrl: './pin-input.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PghPinInputComponent implements AfterViewInit, OnInit, OnDestroy, AfterViewChecked {\n @ViewChildren('input') inputsList!: QueryList<ElementRef>;\n\n readonly codeLength = input<number>(defaultComponentConfig.codeLength);\n readonly inputType = input<string>(defaultComponentConfig.inputType);\n readonly inputMode = input<string>(defaultComponentConfig.inputMode);\n readonly initialFocusField = input<number>(defaultComponentConfig.initialFocusField);\n readonly isCharsCode = input<boolean>(defaultComponentConfig.isCharsCode);\n readonly isCodeHidden = input<boolean>(defaultComponentConfig.isCodeHidden);\n readonly isPrevFocusableAfterClearing = input<boolean>(\n defaultComponentConfig.isPrevFocusableAfterClearing,\n );\n readonly isFocusingOnLastByClickIfFilled = input<boolean>(\n defaultComponentConfig.isFocusingOnLastByClickIfFilled,\n );\n readonly disabled = input<boolean>(defaultComponentConfig.disabled);\n readonly autocapitalize = input<string>(defaultComponentConfig.autocapitalize);\n readonly code = input<string | number>(defaultComponentConfig.code);\n readonly codeChanged = output<string>();\n readonly codeCompleted = output<string>();\n\n codeLengthEffect = effect(() => this.onCodeLengthChanges(this.codeLength()));\n codeEffect = effect(() => this.onInputCodeChanges(this.code()));\n\n placeholders: number[] = [];\n private inputs: HTMLInputElement[] = [];\n private inputsStates: InputState[] = [];\n private inputsListSubscription!: Subscription;\n private state = {\n isFocusingAfterAppearingCompleted: false,\n isInitialFocusFieldEnabled: false,\n };\n\n ngOnInit(): void {\n // defining the state\n this.state.isInitialFocusFieldEnabled = !this.isEmpty(this.initialFocusField());\n // initiating the code\n this.onCodeLengthChanges(this.codeLength());\n }\n\n ngAfterViewInit(): void {\n // initiation of the inputs\n this.inputsListSubscription = this.inputsList.changes.subscribe(\n this.onInputsListChanges.bind(this),\n );\n this.onInputsListChanges(this.inputsList);\n }\n\n ngAfterViewChecked(): void {\n this.focusOnInputAfterAppearing();\n }\n\n ngOnDestroy(): void {\n if (this.inputsListSubscription) {\n this.inputsListSubscription.unsubscribe();\n }\n }\n\n reset(isChangesEmitting = false): void {\n // resetting the code to its initial value or to an empty value\n this.onInputCodeChanges(this.code());\n\n if (this.state.isInitialFocusFieldEnabled) {\n // tslint:disable-next-line:no-non-null-assertion\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();\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());\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();\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 // tslint:disable-next-line:no-non-null-assertion\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();\n }\n }\n\n private onInputCodeChanges(code: string | number): void {\n if (!this.inputs.length) {\n return;\n }\n\n if (this.isEmpty(code)) {\n this.inputs.forEach((input: HTMLInputElement) => {\n this.setInputValue(input, null);\n });\n return;\n }\n\n const chars = (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(codeLength: number): void {\n if (!codeLength) {\n return;\n }\n\n if (codeLength > this.placeholders.length) {\n const numbers = Array(codeLength - this.placeholders.length).fill(1);\n this.placeholders.splice(this.placeholders.length - 1, 0, ...numbers);\n } else if (codeLength < this.placeholders.length) {\n this.placeholders.splice(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 } 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(this.code());\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 =\n this.initialFocusField() !== undefined &&\n this.initialFocusField() !== null &&\n 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 =\n (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 } 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();\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","<div class=\"wrapper-input\">\n @for (holder of placeholders; track $index) {\n <span [class.code-hidden]=\"isCodeHidden()\">\n <input\n #input\n (click)=\"onClick($event)\"\n (paste)=\"onPaste($event, $index)\"\n (input)=\"onInput($event, $index)\"\n (keydown)=\"onKeydown($event, $index)\"\n [type]=\"inputType()\"\n [disabled]=\"disabled()\"\n [attr.inputmode]=\"inputMode()\"\n [attr.autocapitalize]=\"autocapitalize()\"\n autocomplete=\"one-time-code\"\n />\n </span>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}