ng-form-helper
Version:
Feature set to use in your angular form
201 lines • 17 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 * as tslib_1 from "tslib";
import { Directive, ElementRef, forwardRef, HostListener, Input, Renderer2 } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { FormFieldDirective } from './form-field.directive';
var FieldMaskDirective = /** @class */ (function (_super) {
tslib_1.__extends(FieldMaskDirective, _super);
function FieldMaskDirective(element, renderer) {
var _this = _super.call(this) || this;
_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 = {};
return _this;
}
Object.defineProperty(FieldMaskDirective.prototype, "setFormFieldMask", {
set: /**
* @param {?} formFieldMask
* @return {?}
*/
function (formFieldMask) {
this.generatedMaskConfig = this.generateMaskConfig(formFieldMask);
},
enumerable: true,
configurable: true
});
/**
* @private
* @param {?} formFieldMask
* @return {?}
*/
FieldMaskDirective.prototype.generateMaskConfig = /**
* @private
* @param {?} formFieldMask
* @return {?}
*/
function (formFieldMask) {
if (this.MASK_SHOULD_NOT_HAVE_NUMBERS.test(formFieldMask)) {
throw new Error("Can't generate mask: \"" + formFieldMask + "\". Invalid charactere found.\n 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.\n The mask must finish with a numeric character (9).");
}
/** @type {?} */
var generatedMaskConfig = {};
/** @type {?} */
var decomposeGivenMask = formFieldMask.match(/(9+|[^9]+)/g);
if (!decomposeGivenMask) {
throw new Error("Can't generate mask: \"" + formFieldMask + "\". Invalid format found.\n You must have at least one 9 character in the mask.");
}
/** @type {?} */
var isNumeric = /^\d+$/;
/** @type {?} */
var composeMask = '';
/** @type {?} */
var numberMapper = '';
/** @type {?} */
var numberGroup = 1;
/** @type {?} */
var numericLength = 0;
decomposeGivenMask.forEach((/**
* @param {?} textGroup
* @return {?}
*/
function (textGroup) {
if (isNumeric.test(textGroup)) {
numericLength += textGroup.length;
composeMask += "$" + numberGroup++;
/** @type {?} */
var 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 {?}
*/
FieldMaskDirective.prototype.getPartialMask = /**
* @private
* @param {?} currentValue
* @return {?}
*/
function (currentValue) {
/** @type {?} */
var lengths = Object.keys(this.generatedMaskConfig);
/** @type {?} */
var length = lengths.find((/**
* @param {?} maxLength
* @return {?}
*/
function (maxLength) { return currentValue.length <= Number(maxLength); }));
length = length || lengths.pop() || '';
/** @type {?} */
var maskConfig = this.generatedMaskConfig[length];
return {
valueStructure: maskConfig.valueStructure,
maskStructure: maskConfig.maskStructure,
maxLength: Number(length)
};
};
/**
* @param {?} event
* @return {?}
*/
FieldMaskDirective.prototype.onInput = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var 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 {?} */
var currentValue = currentMaskedValue.replace(/[^0-9]/g, '');
/** @type {?} */
var maskConfig = this.getPartialMask(currentValue);
if (currentValue.length > maskConfig.maxLength) {
this.resetField();
return;
}
/** @type {?} */
var 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 {?}
*/
function () { return FieldMaskDirective; })),
multi: true
}
]
},] }
];
/** @nocollapse */
FieldMaskDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 }
]; };
FieldMaskDirective.propDecorators = {
setFormFieldMask: [{ type: Input, args: ['formFieldMask',] }],
onInput: [{ type: HostListener, args: ['input', ['$event'],] }]
};
return FieldMaskDirective;
}(FormFieldDirective));
export { FieldMaskDirective };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtbWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1mb3JtLWhlbHBlci8iLCJzb3VyY2VzIjpbImxpYi9maWVsZC1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQ7SUFVd0MsOENBQWtCO0lBcUJ4RCw0QkFDWSxPQUFtQixFQUNuQixRQUFtQjtRQUYvQixZQUlFLGlCQUFPLFNBQ1I7UUFKVyxhQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGNBQVEsR0FBUixRQUFRLENBQVc7Ozs7UUFsQmQsa0NBQTRCLEdBQUcsU0FBUyxDQUFDO1FBQ3pDLG9DQUE4QixHQUFHLEtBQUssQ0FBQztRQUVoRCx5QkFBbUIsR0FLdkIsRUFBRSxDQUFDOztJQWFQLENBQUM7SUFWRCxzQkFDSSxnREFBZ0I7Ozs7O1FBRHBCLFVBQ3FCLGFBQXFCO1lBQ3hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEUsQ0FBQzs7O09BQUE7Ozs7OztJQVNPLCtDQUFrQjs7Ozs7SUFBMUIsVUFBMkIsYUFBcUI7UUFNOUMsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQ2IsNEJBQXlCLGFBQWEsMkdBQzBCLENBQ2pFLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lB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O29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVTs7OzRCQUFDLGNBQU0sT0FBQSxrQkFBa0IsRUFBbEIsQ0FBa0IsRUFBQzs0QkFDakQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7Ozs7Z0JBYm1CLFVBQVU7Z0JBQTJDLFNBQVM7OzttQ0E4Qi9FLEtBQUssU0FBQyxlQUFlOzBCQTBGckIsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7SUFvQm5DLHlCQUFDO0NBQUEsQUF4SUQsQ0FVd0Msa0JBQWtCLEdBOEh6RDtTQTlIWSxrQkFBa0I7Ozs7Ozs7SUFLN0IsMERBQTBEOzs7OztJQUMxRCw0REFBd0Q7Ozs7O0lBRXhELGlEQUtPOzs7OztJQVNMLHFDQUE2Qjs7Ozs7SUFDN0Isc0NBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtRmllbGREaXJlY3RpdmUgfSBmcm9tICcuL2Zvcm0tZmllbGQuZGlyZWN0aXZlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Zvcm1GaWVsZE1hc2tdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGaWVsZE1hc2tEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRmllbGRNYXNrRGlyZWN0aXZlIGV4dGVuZHMgRm9ybUZpZWxkRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICAvKipcbiAgICogVGhlIG1hc2sgY2FuJ3QgY29udGFpbiBudW1iZXJzXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BU0tfU0hPVUxEX05PVF9IQVZFX05VTUJFUlMgPSAvWzAtOF0vZ2k7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUFTS19NVVNUX0ZJTklTSF9XSVRIX0FfTlVNQkVSID0gL1xcZCQvO1xuXG4gIHByaXZhdGUgZ2VuZXJhdGVkTWFza0NvbmZpZzoge1xuICAgIFttYXhMZW5ndGg6IHN0cmluZ106IHtcbiAgICAgIHZhbHVlU3RydWN0dXJlOiBSZWdFeHA7XG4gICAgICBtYXNrU3RydWN0dXJlOiBzdHJpbmc7XG4gICAgfVxuICB9ID0ge307XG5cblxuICBASW5wdXQoJ2Zvcm1GaWVsZE1hc2snKVxuICBzZXQgc2V0Rm9ybUZpZWxkTWFzayhmb3JtRmllbGRNYXNrOiBzdHJpbmcpIHtcbiAgICB0aGlzLmdlbmVyYXRlZE1hc2tDb25maWcgPSB0aGlzLmdlbmVyYXRlTWFza0NvbmZpZyhmb3JtRmllbGRNYXNrKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlTWFza0NvbmZpZyhmb3JtRmllbGRNYXNrOiBzdHJpbmcpOiB7XG4gICAgW21heExlbmd0aDogbnVtYmVyXToge1xuICAgICAgdmFsdWVTdHJ1Y3R1cmU6IFJlZ0V4cDtcbiAgICAgIG1hc2tTdHJ1Y3R1cmU6IHN0cmluZztcbiAgICB9XG4gIH0ge1xuICAgIGlmICh0aGlzLk1BU0tfU0hPVUxEX05PVF9IQVZFX05VTUJFUlMudGVzdChmb3JtRmllbGRNYXNrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FuJ3QgZ2VuZXJhdGUgbWFzazogXCIke2Zvcm1GaWVsZE1hc2t9XCIuIEludmFsaWQgY2hhcmFjdGVyZSBmb3VuZC5cbiAgICAgICAgWW91IHNob3VsZCBub3QgdXNlIG51bWVyaWMgY2hhcmFjdGVyIHRvIGNvbXBvc2UgdGhlIGZpZWxkIG1hc2suYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuTUFTS19NVVNUX0ZJTklTSF9XSVRIX0FfTlVNQkVSLnRlc3QoZm9ybUZpZWxkTWFzaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbid0IGdlbmVyYXRlIG1hc2s6IFwiJHtmb3JtRmllbGRNYXNrfVwiLiBJbnZhbGlkIGZvcm1hdCBmb3VuZC5cbiAgICAgICAgVGhlIG1hc2sgbXVzdCBmaW5pc2ggd2l0aCBhIG51bWVyaWMgY2hhcmFjdGVyICg5KS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbmVyYXRlZE1hc2tDb25maWc6IHtcbiAgICAgIFttYXhMZW5ndGg6IHN0cmluZ106IHtcbiAgICAgICAgdmFsdWVTdHJ1Y3R1cmU6IFJlZ0V4cDtcbiAgICAgICAgbWFza1N0cnVjdHVyZTogc3RyaW5nO1xuICAgICAgfVxuICAgIH0gPSB7fTtcblxuICAgIGNvbnN0IGRlY29tcG9zZUdpdmVuTWFzayA9IGZvcm1GaWVsZE1hc2subWF0Y2goLyg5K3xbXjldKykvZyk7XG4gICAgaWYgKCFkZWNvbXBvc2VHaXZlbk1hc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbid0IGdlbmVyYXRlIG1hc2s6IFwiJHtmb3JtRmllbGRNYXNrfVwiLiBJbnZhbGlkIGZvcm1hdCBmb3VuZC5cbiAgICAgICAgWW91IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgOSBjaGFyYWN0ZXIgaW4gdGhlIG1hc2suYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc051bWVyaWMgPSAvXlxcZCskLztcbiAgICBsZXQgY29tcG9zZU1hc2sgPSAnJztcbiAgICBsZXQgbnVtYmVyTWFwcGVyID0gJyc7XG4gICAgbGV0IG51bWJlckdyb3VwID0gMTtcbiAgICBsZXQgbnVtZXJpY0xlbmd0aCA9IDA7XG5cbiAgICBkZWNvbXBvc2VHaXZlbk1hc2suZm9yRWFjaCh0ZXh0R3JvdXAgPT4ge1xuICAgICAgaWYgKGlzTnVtZXJpYy50ZXN0KHRleHRHcm91cCkpIHtcbiAgICAgICAgbnVtZXJpY0xlbmd0aCArPSB0ZXh0R3JvdXAubGVuZ3RoO1xuICAgICAgICBjb21wb3NlTWFzayArPSBgXFwkJHtudW1iZXJHcm91cCsrfWA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROdW1iZXJNYXBwZXIgPSBgJHtudW1iZXJNYXBwZXJ9KFswLTldezEsJHt0ZXh0R3JvdXAubGVuZ3RofX0pYDtcbiAgICAgICAgbnVtYmVyTWFwcGVyICs9IGAoWzAtOV17JHt0ZXh0R3JvdXAubGVuZ3RofX0pYDtcblxuICAgICAgICBnZW5lcmF0ZWRNYXNrQ29uZmlnW1N0cmluZyhudW1lcmljTGVuZ3RoKV0gPSB7XG4gICAgICAgICAgdmFsdWVTdHJ1Y3R1cmU6IG5ldyBSZWdFeHAoY3VycmVudE51bWJlck1hcHBlciwgJ2cnKSxcbiAgICAgICAgICBtYXNrU3RydWN0dXJlOiBjb21wb3NlTWFza1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbXBvc2VNYXNrICs9IHRleHRHcm91cDtcbiAgICB9KTtcblxuICAgIHJldHVybiBnZW5lcmF0ZWRNYXNrQ29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJ0aWFsTWFzayhjdXJyZW50VmFsdWU6IHN0cmluZyk6IHtcbiAgICB2YWx1ZVN0cnVjdHVyZTogUmVnRXhwO1xuICAgIG1hc2tTdHJ1Y3R1cmU6IHN0cmluZztcbiAgICBtYXhMZW5ndGg6IG51bWJlcjtcbiAgfSB7XG4gICAgY29uc3QgbGVuZ3RocyA9IE9iamVjdC5rZXlzKHRoaXMuZ2VuZXJhdGVkTWFza0NvbmZpZyk7XG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aHMuZmluZChtYXhMZW5ndGggPT4gY3VycmVudFZhbHVlLmxlbmd0aCA8PSBOdW1iZXIobWF4TGVuZ3RoKSk7XG4gICAgbGVuZ3RoID0gbGVuZ3RoIHx8IGxlbmd0aHMucG9wKCkgfHwgJyc7XG4gICAgY29uc3QgbWFza0NvbmZpZyA9IHRoaXMuZ2VuZXJhdGVkTWFza0NvbmZpZ1tsZW5ndGhdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlU3RydWN0dXJlOiBtYXNrQ29uZmlnLnZhbHVlU3RydWN0dXJlLFxuICAgICAgbWFza1N0cnVjdHVyZTogbWFza0NvbmZpZy5tYXNrU3RydWN0dXJlLFxuICAgICAgbWF4TGVuZ3RoOiBOdW1iZXIobGVuZ3RoKVxuICAgIH07XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXG4gIG9uSW5wdXQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50TWFza2VkVmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbUtleWJvYXJkRXZlbnQoZXZlbnQpO1xuICAgIC8vICB0aGlzIHZhbGlkYXRpb24gaXMgaGVyZSBmb3IgSUUxMSBvciBsb3dlci4uLiBpdCBlbW1pdHMgdGhlIGlucHV0IGV2ZW50IGZvciBhbnl0aGluZ1xuICAgIC8vICBhbmQgY3JlYXRlIGEgbG9vcFxuICAgIGlmIChjdXJyZW50TWFza2VkVmFsdWUgPT09IHRoaXMub2xkU3RhdGUudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjdXJyZW50TWFza2VkVmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKTtcbiAgICBjb25zdCBtYXNrQ29uZmlnID0gdGhpcy5nZXRQYXJ0aWFsTWFzayhjdXJyZW50VmFsdWUpO1xuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5sZW5ndGggPiBtYXNrQ29uZmlnLm1heExlbmd0aCkge1xuICAgICAgdGhpcy5yZXNldEZpZWxkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFza2VkVmFsdWUgPSBjdXJyZW50VmFsdWUucmVwbGFjZShtYXNrQ29uZmlnLnZhbHVlU3RydWN0dXJlLCBtYXNrQ29uZmlnLm1hc2tTdHJ1Y3R1cmUpO1xuICAgIHRoaXMudXBkYXRlRmllbGRWYWx1ZShtYXNrZWRWYWx1ZSk7XG4gIH1cbn1cbiJdfQ==