UNPKG

angular-cc-library

Version:
134 lines 15.3 kB
import { Directive, HostListener, Optional, Self } from '@angular/core'; import { CreditCard } from '../credit-card'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; export class ExpiryFormatDirective { constructor(el, control) { this.el = el; this.control = control; this.target = this.el.nativeElement; } /** * Updates the value to target element, or FormControl if exists. * @param value New input value. */ updateValue(value) { if (this.control) { this.control.control.setValue(value); } else { this.target.value = value; } } onKeypress(e) { if (CreditCard.restrictNumeric(e)) { if (CreditCard.restrictExpiry(e.which, this.target)) { this.formatExpiry(e); this.formatForwardSlashAndSpace(e); this.formatForwardExpiry(e); } } else { e.preventDefault(); return false; } } onKeydown(e) { if (CreditCard.restrictNumeric(e) && CreditCard.restrictExpiry(e.which, this.target)) { this.formatBackExpiry(e); } } onChange() { this.reformatExpiry(); } onInput() { this.reformatExpiry(); } formatExpiry(e) { const digit = String.fromCharCode(e.which); const val = `${this.target.value}${digit}`; if (!/^\d+$/.test(digit)) { return; } if (/^\d$/.test(val) && (val !== '0' && val !== '1')) { e.preventDefault(); this.updateValue(`0${val} / `); } else if (/^\d\d$/.test(val)) { e.preventDefault(); const m1 = parseInt(val[0], 10); const m2 = parseInt(val[1], 10); if (m2 > 2 && m1 !== 0) { this.updateValue(`0${m1} / ${m2}`); } else { this.updateValue(`${val} / `); } } } formatForwardSlashAndSpace(e) { const which = String.fromCharCode(e.which); const val = this.target.value; if (!(which === '/' || which === ' ')) { return false; } if (/^\d$/.test(val) && val !== '0') { this.updateValue(`0${val} / `); } } formatForwardExpiry(e) { const digit = String.fromCharCode(e.which); const val = this.target.value; if (!/^\d+$/.test(digit) && /^\d\d$/.test(val)) { this.updateValue(this.target.value = `${val} / `); } } formatBackExpiry(e) { const val = this.target.valueOf; if (e.which !== 8) { return; } if ((this.target.selectionStart != null) && this.target.selectionStart !== val.length) { return; } if (/\d\s\/\s$/.test(val)) { e.preventDefault(); this.updateValue(val.replace(/\d\s\/\s$/, '')); } } reformatExpiry() { const val = CreditCard.formatExpiry(CreditCard.replaceFullWidthChars(this.target.value)); const oldVal = this.target.value; if (val !== oldVal) { this.target.selectionStart = this.target.selectionEnd = CreditCard.safeVal(val, this.target, (safeVal => { this.updateValue(safeVal); })); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ExpiryFormatDirective, deps: [{ token: i0.ElementRef }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.2", type: ExpiryFormatDirective, isStandalone: true, selector: "[ccExp]", host: { listeners: { "keypress": "onKeypress($event)", "keydown": "onKeydown($event)", "change": "onChange()", "input": "onInput()" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ExpiryFormatDirective, decorators: [{ type: Directive, args: [{ selector: '[ccExp]', standalone: true, }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.NgControl, decorators: [{ type: Self }, { type: Optional }] }], propDecorators: { onKeypress: [{ type: HostListener, args: ['keypress', ['$event']] }], onKeydown: [{ type: HostListener, args: ['keydown', ['$event']] }], onChange: [{ type: HostListener, args: ['change'] }], onInput: [{ type: HostListener, args: ['input'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwaXJ5LWZvcm1hdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNjLWxpYnJhcnkvc3JjL2xpYi9kaXJlY3RpdmVzL2V4cGlyeS1mb3JtYXQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFPNUMsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUNVLEVBQWMsRUFDTSxPQUFrQjtRQUR0QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ00sWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUU5QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsS0FBYTtRQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFHTSxVQUFVLENBQUMsQ0FBZ0I7UUFDaEMsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FB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R0FBRyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDdEcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztJQUNILENBQUM7OEdBNUhVLHFCQUFxQjtrR0FBckIscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQUpqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxTQUFTO29CQUNuQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OzBCQU1JLElBQUk7OzBCQUFJLFFBQVE7eUNBa0JaLFVBQVU7c0JBRGhCLFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWU3QixTQUFTO3NCQURmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVE1QixRQUFRO3NCQURkLFlBQVk7dUJBQUMsUUFBUTtnQkFNZixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPcHRpb25hbCwgU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3JlZGl0Q2FyZCB9IGZyb20gJy4uL2NyZWRpdC1jYXJkJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NjRXhwXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEV4cGlyeUZvcm1hdERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbnRyb2w6IE5nQ29udHJvbCxcbiAgKSB7XG4gICAgdGhpcy50YXJnZXQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdmFsdWUgdG8gdGFyZ2V0IGVsZW1lbnQsIG9yIEZvcm1Db250cm9sIGlmIGV4aXN0cy5cbiAgICogQHBhcmFtIHZhbHVlIE5ldyBpbnB1dCB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHRoaXMuY29udHJvbC5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YXJnZXQudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlwcmVzcycsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbktleXByZXNzKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoQ3JlZGl0Q2FyZC5yZXN0cmljdE51bWVyaWMoZSkpIHtcbiAgICAgIGlmIChDcmVkaXRDYXJkLnJlc3RyaWN0RXhwaXJ5KGUud2hpY2gsIHRoaXMudGFyZ2V0KSkge1xuICAgICAgICB0aGlzLmZvcm1hdEV4cGlyeShlKTtcbiAgICAgICAgdGhpcy5mb3JtYXRGb3J3YXJkU2xhc2hBbmRTcGFjZShlKTtcbiAgICAgICAgdGhpcy5mb3JtYXRGb3J3YXJkRXhwaXJ5KGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbktleWRvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChDcmVkaXRDYXJkLnJlc3RyaWN0TnVtZXJpYyhlKSAmJiBDcmVkaXRDYXJkLnJlc3RyaWN0RXhwaXJ5KGUud2hpY2gsIHRoaXMudGFyZ2V0KSkge1xuICAgICAgdGhpcy5mb3JtYXRCYWNrRXhwaXJ5KGUpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScpXG4gIHB1YmxpYyBvbkNoYW5nZSgpIHtcbiAgICB0aGlzLnJlZm9ybWF0RXhwaXJ5KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcpXG4gIHB1YmxpYyBvbklucHV0KCkge1xuICAgIHRoaXMucmVmb3JtYXRFeHBpcnkoKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RXhwaXJ5KGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBkaWdpdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZS53aGljaCk7XG4gICAgY29uc3QgdmFsID0gYCR7dGhpcy50YXJnZXQudmFsdWV9JHtkaWdpdH1gO1xuXG4gICAgaWYgKCEvXlxcZCskLy50ZXN0KGRpZ2l0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgvXlxcZCQvLnRlc3QodmFsKSAmJiAodmFsICE9PSAnMCcgJiYgdmFsICE9PSAnMScpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKGAwJHt2YWx9IC8gYCk7XG4gICAgfSBlbHNlIGlmICgvXlxcZFxcZCQvLnRlc3QodmFsKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgbTEgPSBwYXJzZUludCh2YWxbMF0sIDEwKTtcbiAgICAgIGNvbnN0IG0yID0gcGFyc2VJbnQodmFsWzFdLCAxMCk7XG4gICAgICBpZiAobTIgPiAyICYmIG0xICE9PSAwKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoYDAke20xfSAvICR7bTJ9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKGAke3ZhbH0gLyBgKTtcbiAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Rm9yd2FyZFNsYXNoQW5kU3BhY2UoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IHdoaWNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShlLndoaWNoKTtcbiAgICBjb25zdCB2YWwgPSB0aGlzLnRhcmdldC52YWx1ZTtcblxuICAgIGlmICghKHdoaWNoID09PSAnLycgfHwgd2hpY2ggPT09ICcgJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKC9eXFxkJC8udGVzdCh2YWwpICYmIHZhbCAhPT0gJzAnKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKGAwJHt2YWx9IC8gYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRGb3J3YXJkRXhwaXJ5KGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBkaWdpdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZS53aGljaCk7XG4gICAgY29uc3QgdmFsID0gdGhpcy50YXJnZXQudmFsdWU7XG5cbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QoZGlnaXQpICYmIC9eXFxkXFxkJC8udGVzdCh2YWwpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMudGFyZ2V0LnZhbHVlID0gYCR7dmFsfSAvIGApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0QmFja0V4cGlyeShlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy50YXJnZXQudmFsdWVPZiBhcyB1bmtub3duIGFzIHN0cmluZztcblxuICAgIGlmIChlLndoaWNoICE9PSA4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgodGhpcy50YXJnZXQuc2VsZWN0aW9uU3RhcnQgIT0gbnVsbCkgJiYgdGhpcy50YXJnZXQuc2VsZWN0aW9uU3RhcnQgIT09IHZhbC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKC9cXGRcXHNcXC9cXHMkLy50ZXN0KHZhbCkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsLnJlcGxhY2UoL1xcZFxcc1xcL1xccyQvLCAnJykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVmb3JtYXRFeHBpcnkoKSB7XG4gICAgY29uc3QgdmFsID0gQ3JlZGl0Q2FyZC5mb3JtYXRFeHBpcnkoXG4gICAgICBDcmVkaXRDYXJkLnJlcGxhY2VGdWxsV2lkdGhDaGFycyh0aGlzLnRhcmdldC52YWx1ZSksXG4gICAgKTtcblxuICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMudGFyZ2V0LnZhbHVlO1xuICAgIGlmICh2YWwgIT09IG9sZFZhbCkge1xuICAgICAgdGhpcy50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLnRhcmdldC5zZWxlY3Rpb25FbmQgPSBDcmVkaXRDYXJkLnNhZmVWYWwodmFsLCB0aGlzLnRhcmdldCwgKHNhZmVWYWwgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHNhZmVWYWwpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfVxufVxuIl19