@ng-dl/numeric-input
Version:
override browser's default behavior & localization on numeric inputs
1 lines • 23.8 kB
Source Map (JSON)
{"version":3,"file":"ng-dl-numeric-input.mjs","sources":["../../../projects/numeric-input/src/lib/numeric-input.utils.ts","../../../projects/numeric-input/src/lib/locale.tokens.ts","../../../projects/numeric-input/src/lib/locale.service.ts","../../../projects/numeric-input/src/lib/numeric-input.directive.ts","../../../projects/numeric-input/src/lib/numeric-input.module.ts","../../../projects/numeric-input/src/public-api.ts","../../../projects/numeric-input/src/ng-dl-numeric-input.ts"],"sourcesContent":["const UNSIGNED_INTEGER_REGEX = '^[0-9]*$';\nconst SIGNED_DOUBLE_REGEX = '^-?[0-9]+(.[0-9]+)?$';\nconst NUMBERS_REGEX = /\\d/g;\nconst CHROME_MIN_VALIDATION_MESSAGE = 'Value must be greater than or equal to';\nconst CHROME_MAX_VALIDATION_MESSAGE = 'Value must be less than or equal to';\nconst DEFAULT_NUMERIC_VALUE = 0;\nconst DEFAULT_ACTION_KEYS = ['a', 'c', 'v', 'x'];\nconst DEFAULT_ALLOWED_KEYS = [\n 'Backspace',\n 'ArrowLeft',\n 'ArrowRight',\n 'Escape',\n 'Tab',\n 'Enter'\n];\n\n\n/**\n * Override input attributes for validation and mobile support.\n * @param input - input element\n */\nexport function overrideInputType(input: HTMLInputElement): void {\n input.setAttribute('type', 'text');\n input.setAttribute('inputmode', 'decimal');\n input.removeAttribute('pattern');\n}\n\n/**\n * Get formatted value, if the value is a valid numeric value it will be formatted if not a default value will be returned.\n * @param value - value to format.\n * @param decimalSeparator - decimal separator to replace (if needed).\n * @param thousandsSeparator - thousands separator to remove (if needed).\n */\nexport function getFormattedValue(\n value: string,\n decimalSeparator: string,\n thousandsSeparator: string\n): number {\n const formatted = Number(\n parseValue(value, decimalSeparator, thousandsSeparator).replace(decimalSeparator, '.')\n );\n return isNaN(formatted) ? DEFAULT_NUMERIC_VALUE : formatted;\n}\n\n/**\n * Check if the pressed key is allowed in the numeric input field.\n * @param e - keyboard event.\n * @param decimalSeparators - array of supported separators.\n */\nexport function isAllowedKey(\n e: KeyboardEvent,\n decimalSeparators: string[]\n): boolean {\n const key: string = getKeyName(e);\n const allowedKeys = getAllowedKeys(e, decimalSeparators);\n return (\n allowedKeys.includes(key) ||\n (DEFAULT_ACTION_KEYS.includes(key) && isActionKey(e)) ||\n isNumberKey(e)\n );\n}\n\n/**\n * Align all browsers to validate as same as Chrome browser does.\n * Validation will be after the field loose focus and with Chrome default messages.\n * @param el - input element.\n * @param value - input value.\n * @param min - minimum valid value.\n * @param max - maximum valid value.\n */\nexport function validate(\n el: HTMLInputElement,\n value: number,\n min?: number,\n max?: number\n): boolean {\n if (value < min) {\n el.setCustomValidity(`${CHROME_MIN_VALIDATION_MESSAGE} ${min}.`);\n return false;\n }\n\n if (value > max) {\n el.setCustomValidity(`${CHROME_MAX_VALIDATION_MESSAGE} ${max}.`);\n return false;\n }\n\n el.setCustomValidity('');\n return true;\n}\n\n/**\n * support for old browsers.\n */\nfunction mapKeyCodeToKeyName(keyCode: number): string {\n if (keyCode && String.fromCharCode) {\n switch (keyCode) {\n case 8:\n return 'Backspace';\n case 9:\n return 'Tab';\n case 27:\n return 'Escape';\n case 37:\n return 'ArrowLeft';\n case 39:\n return 'ArrowRight';\n case 188:\n return ',';\n case 190:\n return '.';\n case 109:\n case 173:\n case 189:\n return '-';\n default:\n return String.fromCharCode(keyCode);\n }\n }\n return '';\n}\n\n/**\n * Add zero to decimal values, replaces the decimal separator and remove the thousand separator.\n * If the value is a numeric value the parsed value will be returned, if not - the default numeric value.\n * @param value - value to parse.\n * @param decimalSeparator - decimal separator to replace (if needed).\n * @param thousandsSeparator - thousands separator to remove (if needed).\n */\nfunction parseValue(value: string, decimalSeparator: string, thousandSeparator: string): string {\n value = replaceDecimalSeparator(value, decimalSeparator);\n value = appendZeroToDecimal(value, decimalSeparator);\n value = removeThousandsSeparator(value, thousandSeparator);\n const isValid: boolean = new RegExp(SIGNED_DOUBLE_REGEX).test(value);\n return isValid ? value : DEFAULT_NUMERIC_VALUE.toString();\n}\n\nfunction replaceDecimalSeparator(value: string, decimalSeparator: string): string {\n const separator = value.replace('-', '').replace(NUMBERS_REGEX, '');\n return value.replace(separator || decimalSeparator, decimalSeparator);\n}\n\nfunction appendZeroToDecimal(value: string, decimalSeparator: string): string {\n const firstCharacter = value.charAt(0);\n if (firstCharacter === decimalSeparator) {\n return 0 + value;\n }\n\n const lastCharacter = value.charAt(value.length - 1);\n if (lastCharacter === decimalSeparator) {\n return value + 0;\n }\n\n return value;\n}\n\nfunction removeThousandsSeparator(value: string, thousandsSeparator: string): string {\n return value.replace(thousandsSeparator, '');\n}\n\nfunction isActionKey(e: KeyboardEvent): boolean {\n return e.ctrlKey || e.metaKey;\n}\n\nfunction getKeyName(e: KeyboardEvent): string {\n return e.key || mapKeyCodeToKeyName(e.keyCode);\n}\n\nfunction isNumberKey(e: KeyboardEvent): boolean {\n const key = getKeyName(e);\n return new RegExp(UNSIGNED_INTEGER_REGEX).test(key);\n}\n\nfunction getAllowedKeys(\n e: KeyboardEvent,\n decimalSeparators: string[]\n): string[] {\n const allowedKeys = [...DEFAULT_ALLOWED_KEYS];\n const originalValue: string = (e.target as HTMLInputElement).value;\n const cursorPosition: number =\n (e.target as HTMLInputElement).selectionStart || 0;\n const signExists = originalValue.includes('-');\n const separatorExists = decimalSeparators.some((separator) =>\n originalValue.includes(separator)\n );\n\n const separatorIsCloseToSign = signExists && cursorPosition <= 1;\n if (!separatorIsCloseToSign && !separatorExists) {\n allowedKeys.push(...decimalSeparators);\n }\n\n const firstCharacterIsSeparator = decimalSeparators.some(\n (separator) => originalValue.charAt(0) === separator\n );\n\n if (!signExists && !firstCharacterIsSeparator && cursorPosition === 0) {\n allowedKeys.push('-');\n }\n\n return allowedKeys;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const NUMERIC_INPUT_LOCALE: InjectionToken<string | string[]> = new InjectionToken<string | string[]>(\n 'NUMERIC_INPUT_LOCALE'\n);\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { NUMERIC_INPUT_LOCALE } from './locale.tokens';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocaleService {\n\n constructor(@Inject(NUMERIC_INPUT_LOCALE) @Optional() private locales?: string | string[]) { }\n\n public getDecimalSeparators(): string[] {\n const locales = this.getLocales();\n const options: Intl.NumberFormatOptions = { useGrouping: false };\n return locales.map(locale => this.localizedToDecimalSeparator(this.localizeDecimal(1.1, locale, options)));\n }\n\n public getThousandSeparators(): string[] {\n const locales = this.getLocales();\n const options: Intl.NumberFormatOptions = { useGrouping: true };\n return locales.map(locale => this.localizedToThousandSeparator(this.localizeDecimal(12345.6, locale, options)));\n }\n\n public localizeNumber(value: number): string {\n return value.toLocaleString(this.getLocales());\n }\n\n private localizedToDecimalSeparator(localizedParts: Intl.NumberFormatPart[]): string {\n return localizedParts.find(part => part.type === 'decimal').value;\n }\n\n private localizedToThousandSeparator(localizedParts: Intl.NumberFormatPart[]): string {\n return localizedParts.find(part => part.type === 'group').value;\n }\n\n private localizeDecimal(value: number, locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormatPart[] {\n return Intl.NumberFormat(locale, options).formatToParts(value);\n }\n\n private get localeFromBrowser(): string {\n return navigator.languages ? navigator.languages[0] : navigator.language;\n }\n\n private getLocales(): string[] {\n try {\n const supportedLocales: string[] = Intl.NumberFormat.supportedLocalesOf(this.locales);\n return supportedLocales;\n } catch {\n return [this.localeFromBrowser];\n }\n }\n\n}\n","import {\n AfterViewInit,\n Directive,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Optional,\n Output,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { fromEvent, merge, Observable, Subject } from 'rxjs';\nimport { map, takeUntil, tap } from 'rxjs/operators';\nimport { LocaleService } from './locale.service';\nimport {\n getFormattedValue,\n isAllowedKey,\n overrideInputType,\n validate,\n} from './numeric-input.utils';\n\n@Directive({\n selector: '[dlNumericInput]',\n})\nexport class NumericInputDirective implements AfterViewInit, OnDestroy {\n @Input() min: number;\n @Input() max: number;\n @Output() localized = new EventEmitter<string>();\n\n private readonly decimalSeparators = this.localeService.getDecimalSeparators();\n private readonly thousandSeparators = this.localeService.getThousandSeparators();\n private readonly destroy$ = new Subject<void>();\n\n constructor(\n private hostElement: ElementRef,\n private localeService: LocaleService,\n @Optional() private control?: NgControl\n ) {}\n\n ngAfterViewInit(): void {\n overrideInputType(this.el);\n this.onKeyDown();\n this.onFormSubmit();\n this.onValueChange();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n }\n\n private setValue(value: string): void {\n const formattedValue = getFormattedValue(value, this.decimalSeparator, this.thousandsSeparator);\n this.localized.emit(this.localeService.localizeNumber(formattedValue));\n this.el.value = formattedValue.toString();\n if (this.control) {\n this.control.control?.patchValue(formattedValue);\n }\n }\n\n private onChange(): Observable<string> {\n return fromEvent(this.el, 'change').pipe(map(() => this.el.value));\n }\n\n private onPaste(): Observable<string> {\n return fromEvent(this.el, 'paste').pipe(\n tap((e: ClipboardEvent) => e.preventDefault()),\n map((e: ClipboardEvent) => e.clipboardData?.getData('text/plain') || '')\n );\n }\n\n private onDrop(): Observable<string> {\n return fromEvent(this.el, 'drop').pipe(\n tap((e: DragEvent) => e.preventDefault()),\n map((e: DragEvent) => e.dataTransfer?.getData('text') || '')\n );\n }\n\n private onKeyDown(): void {\n fromEvent(this.el, 'keydown')\n .pipe(\n takeUntil(this.destroy$),\n tap((e: KeyboardEvent) => {\n this.el.setCustomValidity('');\n if (isAllowedKey(e, this.decimalSeparators)) {\n return;\n }\n e.preventDefault();\n })\n )\n .subscribe();\n }\n\n private onFormSubmit(): void {\n if (this.el.form) {\n fromEvent(this.el.form, 'submit')\n .pipe(\n takeUntil(this.destroy$),\n tap((e) => {\n const formattedValue = getFormattedValue(\n this.el.value,\n this.decimalSeparator,\n this.thousandsSeparator\n );\n const isValid = validate(this.el, formattedValue, this.min, this.max);\n if (!isValid) {\n e.preventDefault();\n this.el.reportValidity();\n }\n })\n )\n .subscribe();\n }\n }\n\n private onValueChange(): void {\n merge(this.onChange(), this.onDrop(), this.onPaste())\n .pipe(takeUntil(this.destroy$))\n .subscribe((value) => this.setValue(value));\n }\n\n private get el(): HTMLInputElement {\n return this.hostElement.nativeElement;\n }\n\n private get decimalSeparator(): string {\n return this.decimalSeparators[0];\n }\n\n private get thousandsSeparator(): string {\n return this.thousandSeparators[0];\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NumericInputDirective } from './numeric-input.directive';\n\n@NgModule({\n declarations: [NumericInputDirective],\n imports: [\n ],\n exports: [NumericInputDirective]\n})\nexport class NumericInputModule { }\n","/*\n * Public API Surface of numeric-input\n */\n\nexport * from './lib/numeric-input.module';\nexport * from './lib/locale.tokens';\nexport * from './lib/numeric-input.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.LocaleService"],"mappings":"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"}