angular-cc-library
Version:
angular credit card library
134 lines • 15.3 kB
JavaScript
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