UNPKG

ng-form-helper

Version:

Feature set to use in your angular form

185 lines 16 kB
/** * @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=