UNPKG

angular-cc-library

Version:
144 lines 16.5 kB
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=