angular-cc-library
Version:
angular credit card library
144 lines • 16.5 kB
JavaScript
import { Directive, HostListener, Optional, Self } from '@angular/core';
import { CreditCard } from '../credit-card';
import { BehaviorSubject } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
export class CreditCardFormatDirective {
constructor(el, control) {
this.el = el;
this.control = control;
this.cards = CreditCard.cards();
this.resolvedScheme$ = new BehaviorSubject('unknown');
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.isCardNumber(e.which, this.target)) {
this.formatCardNumber(e);
}
}
else {
e.preventDefault();
}
}
onKeydown(e) {
this.formatBackCardNumber(e);
this.reFormatCardNumber();
}
onKeyup() {
this.setCardType();
}
onPaste() {
this.reFormatCardNumber();
}
onChange() {
this.reFormatCardNumber();
}
onInput() {
this.reFormatCardNumber();
this.setCardType();
}
formatCardNumber(e) {
const digit = String.fromCharCode(e.which);
if (!/^\d+$/.test(digit)) {
return;
}
const value = this.target.value;
const card = CreditCard.cardFromNumber(value + digit);
const length = (value.replace(/\D/g, '') + digit).length;
const upperLength = card ? card.length[card.length.length - 1] : 19;
if (length >= upperLength) {
return;
}
}
formatBackCardNumber(e) {
const value = this.target.value;
const selStart = this.target.selectionStart;
if (e.which !== 8) {
return;
}
if (selStart != null
&& selStart === this.target.selectionEnd
&& selStart > 0
&& selStart !== value.length
&& value[selStart - 1] === ' ') {
e.preventDefault();
if (selStart <= 2) {
this.updateValue(value.slice(selStart));
this.target.selectionStart = 0;
this.target.selectionEnd = 0;
}
else {
this.updateValue(value.slice(0, selStart - 2) + value.slice(selStart));
this.target.selectionStart = selStart - 2;
this.target.selectionEnd = selStart - 2;
}
}
}
setCardType() {
const cardType = CreditCard.cardType(this.target.value) || 'unknown';
this.resolvedScheme$.next(cardType);
if (!this.target.classList.contains(cardType)) {
this.cards.forEach((card) => {
this.target.classList.remove(card.type);
});
this.target.classList.remove('unknown');
this.target.classList.add(cardType);
this.target.classList.toggle('identified', cardType !== 'unknown');
}
}
reFormatCardNumber() {
const value = CreditCard.formatCardNumber(CreditCard.replaceFullWidthChars(this.target.value));
const oldValue = this.target.value;
if (value !== oldValue) {
this.target.selectionStart = this.target.selectionEnd = CreditCard.safeVal(value, this.target, (safeVal => {
this.updateValue(safeVal);
}));
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: CreditCardFormatDirective, 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: CreditCardFormatDirective, isStandalone: true, selector: "[ccNumber]", host: { listeners: { "keypress": "onKeypress($event)", "keydown": "onKeydown($event)", "keyup": "onKeyup()", "paste": "onPaste()", "change": "onChange()", "input": "onInput()" } }, exportAs: ["ccNumber"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: CreditCardFormatDirective, decorators: [{
type: Directive,
args: [{
selector: '[ccNumber]',
exportAs: 'ccNumber',
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']]
}], onKeyup: [{
type: HostListener,
args: ['keyup']
}], onPaste: [{
type: HostListener,
args: ['paste']
}], onChange: [{
type: HostListener,
args: ['change']
}], onInput: [{
type: HostListener,
args: ['input']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGl0LWNhcmQtZm9ybWF0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY2MtbGlicmFyeS9zcmMvbGliL2RpcmVjdGl2ZXMvY3JlZGl0LWNhcmQtZm9ybWF0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFPdkMsTUFBTSxPQUFPLHlCQUF5QjtJQU1wQyxZQUNVLEVBQWMsRUFDTSxPQUFrQjtRQUR0QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ00sWUFBTyxHQUFQLE9BQU8sQ0FBVztRQU54QyxVQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTVCLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVMsU0FBUyxDQUFDLENBQUM7UUFNOUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssV0FBVyxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBR00sVUFBVSxDQUFDLENBQWdCO1FBQ2hDLElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFD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LEtBQUssQ0FBQyxDQUNwRCxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbkMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN4RyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO0lBQ0gsQ0FBQzs4R0FuSVUseUJBQXlCO2tHQUF6Qix5QkFBeUI7OzJGQUF6Qix5QkFBeUI7a0JBTHJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFFBQVEsRUFBRSxVQUFVO29CQUNwQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OzBCQVNJLElBQUk7OzBCQUFJLFFBQVE7eUNBa0JaLFVBQVU7c0JBRGhCLFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVk3QixTQUFTO3NCQURmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU81QixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTztnQkFNZCxPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTztnQkFNZCxRQUFRO3NCQURkLFlBQVk7dUJBQUMsUUFBUTtnQkFNZixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPcHRpb25hbCwgU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3JlZGl0Q2FyZCB9IGZyb20gJy4uL2NyZWRpdC1jYXJkJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2NOdW1iZXJdJyxcbiAgZXhwb3J0QXM6ICdjY051bWJlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIENyZWRpdENhcmRGb3JtYXREaXJlY3RpdmUge1xuICBwcml2YXRlIHRhcmdldDogSFRNTElucHV0RWxlbWVudDtcbiAgcHJpdmF0ZSBjYXJkcyA9IENyZWRpdENhcmQuY2FyZHMoKTtcblxuICBwdWJsaWMgcmVzb2x2ZWRTY2hlbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCd1bmtub3duJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBAU2VsZigpIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbDogTmdDb250cm9sLFxuICApIHtcbiAgICB0aGlzLnRhcmdldCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSB0byB0YXJnZXQgZWxlbWVudCwgb3IgRm9ybUNvbnRyb2wgaWYgZXhpc3RzLlxuICAgKiBAcGFyYW0gdmFsdWUgTmV3IGlucHV0IHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhcmdldC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXByZXNzJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uS2V5cHJlc3MoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChDcmVkaXRDYXJkLnJlc3RyaWN0TnVtZXJpYyhlKSkge1xuICAgICAgaWYgKENyZWRpdENhcmQuaXNDYXJkTnVtYmVyKGUud2hpY2gsIHRoaXMudGFyZ2V0KSkge1xuICAgICAgICB0aGlzLmZvcm1hdENhcmROdW1iZXIoZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uS2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5mb3JtYXRCYWNrQ2FyZE51bWJlcihlKTtcbiAgICB0aGlzLnJlRm9ybWF0Q2FyZE51bWJlcigpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5dXAnKVxuICBwdWJsaWMgb25LZXl1cCgpIHtcbiAgICB0aGlzLnNldENhcmRUeXBlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdwYXN0ZScpXG4gIHB1YmxpYyBvblBhc3RlKCkge1xuICAgIHRoaXMucmVGb3JtYXRDYXJkTnVtYmVyKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnKVxuICBwdWJsaWMgb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5yZUZvcm1hdENhcmROdW1iZXIoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JylcbiAgcHVibGljIG9uSW5wdXQoKSB7XG4gICAgdGhpcy5yZUZvcm1hdENhcmROdW1iZXIoKTtcbiAgICB0aGlzLnNldENhcmRUeXBlKCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdENhcmROdW1iZXIoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGRpZ2l0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShlLndoaWNoKTtcbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QoZGlnaXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRhcmdldC52YWx1ZTtcbiAgICBjb25zdCBjYXJkID0gQ3JlZGl0Q2FyZC5jYXJkRnJvbU51bWJlcih2YWx1ZSArIGRpZ2l0KTtcbiAgICBjb25zdCBsZW5ndGggPSAodmFsdWUucmVwbGFjZSgvXFxEL2csICcnKSArIGRpZ2l0KS5sZW5ndGg7XG4gICAgY29uc3QgdXBwZXJMZW5ndGggPSBjYXJkID8gY2FyZC5sZW5ndGhbY2FyZC5sZW5ndGgubGVuZ3RoIC0gMV0gOiAxOTtcblxuICAgIGlmIChsZW5ndGggPj0gdXBwZXJMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEJhY2tDYXJkTnVtYmVyKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGFyZ2V0LnZhbHVlO1xuICAgIGNvbnN0IHNlbFN0YXJ0ID0gdGhpcy50YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XG5cbiAgICBpZiAoZS53aGljaCAhPT0gOCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWxTdGFydCAhPSBudWxsXG4gICAgICAmJiBzZWxTdGFydCA9PT0gdGhpcy50YXJnZXQuc2VsZWN0aW9uRW5kXG4gICAgICAmJiBzZWxTdGFydCA+IDBcbiAgICAgICYmIHNlbFN0YXJ0ICE9PSB2YWx1ZS5sZW5ndGhcbiAgICAgICYmIHZhbHVlW3NlbFN0YXJ0IC0gMV0gPT09ICcgJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHNlbFN0YXJ0IDw9IDIpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZS5zbGljZShzZWxTdGFydCkpO1xuICAgICAgICB0aGlzLnRhcmdldC5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgICAgIHRoaXMudGFyZ2V0LnNlbGVjdGlvbkVuZCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHZhbHVlLnNsaWNlKDAsIHNlbFN0YXJ0IC0gMikgKyB2YWx1ZS5zbGljZShzZWxTdGFydCkpO1xuICAgICAgICB0aGlzLnRhcmdldC5zZWxlY3Rpb25TdGFydCA9IHNlbFN0YXJ0IC0gMjtcbiAgICAgICAgdGhpcy50YXJnZXQuc2VsZWN0aW9uRW5kID0gc2VsU3RhcnQgLSAyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2FyZFR5cGUoKSB7XG4gICAgY29uc3QgY2FyZFR5cGUgPSBDcmVkaXRDYXJkLmNhcmRUeXBlKHRoaXMudGFyZ2V0LnZhbHVlKSB8fCAndW5rbm93bic7XG5cbiAgICB0aGlzLnJlc29sdmVkU2NoZW1lJC5uZXh0KGNhcmRUeXBlKTtcblxuICAgIGlmICghdGhpcy50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKGNhcmRUeXBlKSkge1xuICAgICAgdGhpcy5jYXJkcy5mb3JFYWNoKChjYXJkKSA9PiB7XG4gICAgICAgIHRoaXMudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoY2FyZC50eXBlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCd1bmtub3duJyk7XG4gICAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QuYWRkKGNhcmRUeXBlKTtcbiAgICAgIHRoaXMudGFyZ2V0LmNsYXNzTGlzdC50b2dnbGUoJ2lkZW50aWZpZWQnLCBjYXJkVHlwZSAhPT0gJ3Vua25vd24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlRm9ybWF0Q2FyZE51bWJlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IENyZWRpdENhcmQuZm9ybWF0Q2FyZE51bWJlcihcbiAgICAgIENyZWRpdENhcmQucmVwbGFjZUZ1bGxXaWR0aENoYXJzKHRoaXMudGFyZ2V0LnZhbHVlKSxcbiAgICApO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy50YXJnZXQudmFsdWU7XG4gICAgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgICAgdGhpcy50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLnRhcmdldC5zZWxlY3Rpb25FbmQgPSBDcmVkaXRDYXJkLnNhZmVWYWwodmFsdWUsIHRoaXMudGFyZ2V0LCAoc2FmZVZhbCA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoc2FmZVZhbCk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XG59XG4iXX0=