ng-form-helper
Version:
Feature set to use in your angular form
185 lines • 16 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/field-mask.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, forwardRef, HostListener, Input, Renderer2 } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { FormFieldDirective } from './form-field.directive';
export class FieldMaskDirective extends FormFieldDirective {
/**
* @param {?} element
* @param {?} renderer
*/
constructor(element, renderer) {
super();
this.element = element;
this.renderer = renderer;
/**
* The mask can't contain numbers
*/
this.MASK_SHOULD_NOT_HAVE_NUMBERS = /[0-8]/gi;
this.MASK_MUST_FINISH_WITH_A_NUMBER = /\d$/;
this.generatedMaskConfig = {};
}
/**
* @param {?} formFieldMask
* @return {?}
*/
set setFormFieldMask(formFieldMask) {
this.generatedMaskConfig = this.generateMaskConfig(formFieldMask);
}
/**
* @private
* @param {?} formFieldMask
* @return {?}
*/
generateMaskConfig(formFieldMask) {
if (this.MASK_SHOULD_NOT_HAVE_NUMBERS.test(formFieldMask)) {
throw new Error(`Can't generate mask: "${formFieldMask}". Invalid charactere found.
You should not use numeric character to compose the field mask.`);
}
if (!this.MASK_MUST_FINISH_WITH_A_NUMBER.test(formFieldMask)) {
throw new Error(`Can't generate mask: "${formFieldMask}". Invalid format found.
The mask must finish with a numeric character (9).`);
}
/** @type {?} */
const generatedMaskConfig = {};
/** @type {?} */
const decomposeGivenMask = formFieldMask.match(/(9+|[^9]+)/g);
if (!decomposeGivenMask) {
throw new Error(`Can't generate mask: "${formFieldMask}". Invalid format found.
You must have at least one 9 character in the mask.`);
}
/** @type {?} */
const isNumeric = /^\d+$/;
/** @type {?} */
let composeMask = '';
/** @type {?} */
let numberMapper = '';
/** @type {?} */
let numberGroup = 1;
/** @type {?} */
let numericLength = 0;
decomposeGivenMask.forEach((/**
* @param {?} textGroup
* @return {?}
*/
textGroup => {
if (isNumeric.test(textGroup)) {
numericLength += textGroup.length;
composeMask += `\$${numberGroup++}`;
/** @type {?} */
const currentNumberMapper = `${numberMapper}([0-9]{1,${textGroup.length}})`;
numberMapper += `([0-9]{${textGroup.length}})`;
generatedMaskConfig[String(numericLength)] = {
valueStructure: new RegExp(currentNumberMapper, 'g'),
maskStructure: composeMask
};
return;
}
composeMask += textGroup;
}));
return generatedMaskConfig;
}
/**
* @private
* @param {?} currentValue
* @return {?}
*/
getPartialMask(currentValue) {
/** @type {?} */
const lengths = Object.keys(this.generatedMaskConfig);
/** @type {?} */
let length = lengths.find((/**
* @param {?} maxLength
* @return {?}
*/
maxLength => currentValue.length <= Number(maxLength)));
length = length || lengths.pop() || '';
/** @type {?} */
const maskConfig = this.generatedMaskConfig[length];
return {
valueStructure: maskConfig.valueStructure,
maskStructure: maskConfig.maskStructure,
maxLength: Number(length)
};
}
/**
* @param {?} event
* @return {?}
*/
onInput(event) {
/** @type {?} */
const currentMaskedValue = this.getValueFromKeyboardEvent(event);
// this validation is here for IE11 or lower... it emmits the input event for anything
// and create a loop
if (currentMaskedValue === this.oldState.value) {
return;
}
/** @type {?} */
const currentValue = currentMaskedValue.replace(/[^0-9]/g, '');
/** @type {?} */
const maskConfig = this.getPartialMask(currentValue);
if (currentValue.length > maskConfig.maxLength) {
this.resetField();
return;
}
/** @type {?} */
const maskedValue = currentValue.replace(maskConfig.valueStructure, maskConfig.maskStructure);
this.updateFieldValue(maskedValue);
}
}
FieldMaskDirective.decorators = [
{ type: Directive, args: [{
selector: '[formFieldMask]',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => FieldMaskDirective)),
multi: true
}
]
},] }
];
/** @nocollapse */
FieldMaskDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 }
];
FieldMaskDirective.propDecorators = {
setFormFieldMask: [{ type: Input, args: ['formFieldMask',] }],
onInput: [{ type: HostListener, args: ['input', ['$event'],] }]
};
if (false) {
/**
* The mask can't contain numbers
* @type {?}
* @private
*/
FieldMaskDirective.prototype.MASK_SHOULD_NOT_HAVE_NUMBERS;
/**
* @type {?}
* @private
*/
FieldMaskDirective.prototype.MASK_MUST_FINISH_WITH_A_NUMBER;
/**
* @type {?}
* @private
*/
FieldMaskDirective.prototype.generatedMaskConfig;
/**
* @type {?}
* @protected
*/
FieldMaskDirective.prototype.element;
/**
* @type {?}
* @protected
*/
FieldMaskDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtbWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1mb3JtLWhlbHBlci8iLCJzb3VyY2VzIjpbImxpYi9maWVsZC1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVk1RCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsa0JBQWtCOzs7OztJQXFCeEQsWUFDWSxPQUFtQixFQUNuQixRQUFtQjtRQUU3QixLQUFLLEVBQUUsQ0FBQztRQUhFLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVzs7OztRQWxCZCxpQ0FBNEIsR0FBRyxTQUFTLENBQUM7UUFDekMsbUNBQThCLEdBQUcsS0FBSyxDQUFDO1FBRWhELHdCQUFtQixHQUt2QixFQUFFLENBQUM7SUFhUCxDQUFDOzs7OztJQVZELElBQ0ksZ0JBQWdCLENBQUMsYUFBcUI7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRSxDQUFDOzs7Ozs7SUFTTyxrQkFBa0IsQ0FBQyxhQUFxQjtRQU05QyxJQUFJLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDekQsTUFBTSxJQUFJLEtBQUssQ0FDYix5QkFBeUIsYUFBYTt3RUFDMEIsQ0FDakUsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDNUQsTUFBTSxJ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QixTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVU7Ozt3QkFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBQzt3QkFDakQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7YUFDRjs7OztZQWJtQixVQUFVO1lBQTJDLFNBQVM7OzsrQkE4Qi9FLEtBQUssU0FBQyxlQUFlO3NCQTBGckIsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7SUFyR2pDLDBEQUEwRDs7Ozs7SUFDMUQsNERBQXdEOzs7OztJQUV4RCxpREFLTzs7Ozs7SUFTTCxxQ0FBNkI7Ozs7O0lBQzdCLHNDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9ybUZpZWxkRGlyZWN0aXZlIH0gZnJvbSAnLi9mb3JtLWZpZWxkLmRpcmVjdGl2ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmb3JtRmllbGRNYXNrXScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmllbGRNYXNrRGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkTWFza0RpcmVjdGl2ZSBleHRlbmRzIEZvcm1GaWVsZERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXNrIGNhbid0IGNvbnRhaW4gbnVtYmVyc1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBNQVNLX1NIT1VMRF9OT1RfSEFWRV9OVU1CRVJTID0gL1swLThdL2dpO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BU0tfTVVTVF9GSU5JU0hfV0lUSF9BX05VTUJFUiA9IC9cXGQkLztcblxuICBwcml2YXRlIGdlbmVyYXRlZE1hc2tDb25maWc6IHtcbiAgICBbbWF4TGVuZ3RoOiBzdHJpbmddOiB7XG4gICAgICB2YWx1ZVN0cnVjdHVyZTogUmVnRXhwO1xuICAgICAgbWFza1N0cnVjdHVyZTogc3RyaW5nO1xuICAgIH1cbiAgfSA9IHt9O1xuXG5cbiAgQElucHV0KCdmb3JtRmllbGRNYXNrJylcbiAgc2V0IHNldEZvcm1GaWVsZE1hc2soZm9ybUZpZWxkTWFzazogc3RyaW5nKSB7XG4gICAgdGhpcy5nZW5lcmF0ZWRNYXNrQ29uZmlnID0gdGhpcy5nZW5lcmF0ZU1hc2tDb25maWcoZm9ybUZpZWxkTWFzayk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1hc2tDb25maWcoZm9ybUZpZWxkTWFzazogc3RyaW5nKToge1xuICAgIFttYXhMZW5ndGg6IG51bWJlcl06IHtcbiAgICAgIHZhbHVlU3RydWN0dXJlOiBSZWdFeHA7XG4gICAgICBtYXNrU3RydWN0dXJlOiBzdHJpbmc7XG4gICAgfVxuICB9IHtcbiAgICBpZiAodGhpcy5NQVNLX1NIT1VMRF9OT1RfSEFWRV9OVU1CRVJTLnRlc3QoZm9ybUZpZWxkTWFzaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbid0IGdlbmVyYXRlIG1hc2s6IFwiJHtmb3JtRmllbGRNYXNrfVwiLiBJbnZhbGlkIGNoYXJhY3RlcmUgZm91bmQuXG4gICAgICAgIFlvdSBzaG91bGQgbm90IHVzZSBudW1lcmljIGNoYXJhY3RlciB0byBjb21wb3NlIHRoZSBmaWVsZCBtYXNrLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLk1BU0tfTVVTVF9GSU5JU0hfV0lUSF9BX05VTUJFUi50ZXN0KGZvcm1GaWVsZE1hc2spKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW4ndCBnZW5lcmF0ZSBtYXNrOiBcIiR7Zm9ybUZpZWxkTWFza31cIi4gSW52YWxpZCBmb3JtYXQgZm91bmQuXG4gICAgICAgIFRoZSBtYXNrIG11c3QgZmluaXNoIHdpdGggYSBudW1lcmljIGNoYXJhY3RlciAoOSkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBnZW5lcmF0ZWRNYXNrQ29uZmlnOiB7XG4gICAgICBbbWF4TGVuZ3RoOiBzdHJpbmddOiB7XG4gICAgICAgIHZhbHVlU3RydWN0dXJlOiBSZWdFeHA7XG4gICAgICAgIG1hc2tTdHJ1Y3R1cmU6IHN0cmluZztcbiAgICAgIH1cbiAgICB9ID0ge307XG5cbiAgICBjb25zdCBkZWNvbXBvc2VHaXZlbk1hc2sgPSBmb3JtRmllbGRNYXNrLm1hdGNoKC8oOSt8W145XSspL2cpO1xuICAgIGlmICghZGVjb21wb3NlR2l2ZW5NYXNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW4ndCBnZW5lcmF0ZSBtYXNrOiBcIiR7Zm9ybUZpZWxkTWFza31cIi4gSW52YWxpZCBmb3JtYXQgZm91bmQuXG4gICAgICAgIFlvdSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIDkgY2hhcmFjdGVyIGluIHRoZSBtYXNrLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNOdW1lcmljID0gL15cXGQrJC87XG4gICAgbGV0IGNvbXBvc2VNYXNrID0gJyc7XG4gICAgbGV0IG51bWJlck1hcHBlciA9ICcnO1xuICAgIGxldCBudW1iZXJHcm91cCA9IDE7XG4gICAgbGV0IG51bWVyaWNMZW5ndGggPSAwO1xuXG4gICAgZGVjb21wb3NlR2l2ZW5NYXNrLmZvckVhY2godGV4dEdyb3VwID0+IHtcbiAgICAgIGlmIChpc051bWVyaWMudGVzdCh0ZXh0R3JvdXApKSB7XG4gICAgICAgIG51bWVyaWNMZW5ndGggKz0gdGV4dEdyb3VwLmxlbmd0aDtcbiAgICAgICAgY29tcG9zZU1hc2sgKz0gYFxcJCR7bnVtYmVyR3JvdXArK31gO1xuICAgICAgICBjb25zdCBjdXJyZW50TnVtYmVyTWFwcGVyID0gYCR7bnVtYmVyTWFwcGVyfShbMC05XXsxLCR7dGV4dEdyb3VwLmxlbmd0aH19KWA7XG4gICAgICAgIG51bWJlck1hcHBlciArPSBgKFswLTldeyR7dGV4dEdyb3VwLmxlbmd0aH19KWA7XG5cbiAgICAgICAgZ2VuZXJhdGVkTWFza0NvbmZpZ1tTdHJpbmcobnVtZXJpY0xlbmd0aCldID0ge1xuICAgICAgICAgIHZhbHVlU3RydWN0dXJlOiBuZXcgUmVnRXhwKGN1cnJlbnROdW1iZXJNYXBwZXIsICdnJyksXG4gICAgICAgICAgbWFza1N0cnVjdHVyZTogY29tcG9zZU1hc2tcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb21wb3NlTWFzayArPSB0ZXh0R3JvdXA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdGVkTWFza0NvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFydGlhbE1hc2soY3VycmVudFZhbHVlOiBzdHJpbmcpOiB7XG4gICAgdmFsdWVTdHJ1Y3R1cmU6IFJlZ0V4cDtcbiAgICBtYXNrU3RydWN0dXJlOiBzdHJpbmc7XG4gICAgbWF4TGVuZ3RoOiBudW1iZXI7XG4gIH0ge1xuICAgIGNvbnN0IGxlbmd0aHMgPSBPYmplY3Qua2V5cyh0aGlzLmdlbmVyYXRlZE1hc2tDb25maWcpO1xuICAgIGxldCBsZW5ndGggPSBsZW5ndGhzLmZpbmQobWF4TGVuZ3RoID0+IGN1cnJlbnRWYWx1ZS5sZW5ndGggPD0gTnVtYmVyKG1heExlbmd0aCkpO1xuICAgIGxlbmd0aCA9IGxlbmd0aCB8fCBsZW5ndGhzLnBvcCgpIHx8ICcnO1xuICAgIGNvbnN0IG1hc2tDb25maWcgPSB0aGlzLmdlbmVyYXRlZE1hc2tDb25maWdbbGVuZ3RoXTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZVN0cnVjdHVyZTogbWFza0NvbmZpZy52YWx1ZVN0cnVjdHVyZSxcbiAgICAgIG1hc2tTdHJ1Y3R1cmU6IG1hc2tDb25maWcubWFza1N0cnVjdHVyZSxcbiAgICAgIG1heExlbmd0aDogTnVtYmVyKGxlbmd0aClcbiAgICB9O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBvbklucHV0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudE1hc2tlZFZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21LZXlib2FyZEV2ZW50KGV2ZW50KTtcbiAgICAvLyAgdGhpcyB2YWxpZGF0aW9uIGlzIGhlcmUgZm9yIElFMTEgb3IgbG93ZXIuLi4gaXQgZW1taXRzIHRoZSBpbnB1dCBldmVudCBmb3IgYW55dGhpbmdcbiAgICAvLyAgYW5kIGNyZWF0ZSBhIGxvb3BcbiAgICBpZiAoY3VycmVudE1hc2tlZFZhbHVlID09PSB0aGlzLm9sZFN0YXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY3VycmVudE1hc2tlZFZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJyk7XG4gICAgY29uc3QgbWFza0NvbmZpZyA9IHRoaXMuZ2V0UGFydGlhbE1hc2soY3VycmVudFZhbHVlKTtcblxuICAgIGlmIChjdXJyZW50VmFsdWUubGVuZ3RoID4gbWFza0NvbmZpZy5tYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMucmVzZXRGaWVsZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hc2tlZFZhbHVlID0gY3VycmVudFZhbHVlLnJlcGxhY2UobWFza0NvbmZpZy52YWx1ZVN0cnVjdHVyZSwgbWFza0NvbmZpZy5tYXNrU3RydWN0dXJlKTtcbiAgICB0aGlzLnVwZGF0ZUZpZWxkVmFsdWUobWFza2VkVmFsdWUpO1xuICB9XG59XG4iXX0=