UNPKG

@ngodings/ngx-rupiah

Version:

Angular directive mask for currency Rupiah/IDR support for NgModule or Reactive forms, pipe for currency Rupiah/IDR & pipe for terbilang in Rupiah/IDR

125 lines 17.4 kB
import { InputService } from "./input.service"; export class InputHandler { constructor(htmlInputElement, options) { this.inputService = new InputService(htmlInputElement, options); } handleCut(event) { setTimeout(() => { this.inputService.updateFieldValue(); this.setValue(this.inputService.value); this.onModelChange(this.inputService.value); }, 0); } handleInput(event) { let selectionStart = this.inputService.inputSelection.selectionStart; let keyCode = this.inputService.rawValue.charCodeAt(selectionStart - 1); let rawValueLength = this.inputService.rawValue.length; let storedRawValueLength = this.inputService.storedRawValue.length; if (Math.abs(rawValueLength - storedRawValueLength) != 1) { this.inputService.updateFieldValue(selectionStart); this.onModelChange(this.inputService.value); return; } // Restore the old value. this.inputService.rawValue = this.inputService.storedRawValue; if (rawValueLength < storedRawValueLength) { // Chrome Android seems to move the cursor in response to a backspace AFTER processing the // input event, so we need to wrap this in a timeout. this.timer(() => { // Move the cursor to just after the deleted value. this.inputService.updateFieldValue(selectionStart + 1); // Then backspace it. this.inputService.removeNumber(8); this.onModelChange(this.inputService.value); }, 0); } if (rawValueLength > storedRawValueLength) { // Move the cursor to just before the new value. this.inputService.updateFieldValue(selectionStart - 1); // Process the character like a keypress. this.handleKeypressImpl(keyCode); } } handleKeydown(event) { let keyCode = event.which || event.charCode || event.keyCode; if (keyCode == 8 || keyCode == 46 || keyCode == 63272) { event.preventDefault(); if (this.inputService.inputSelection.selectionStart <= this.inputService.prefixLength() && this.inputService.inputSelection.selectionEnd >= this.inputService.rawValue.length - this.inputService.suffixLength()) { this.clearValue(); } else { this.inputService.removeNumber(keyCode); this.onModelChange(this.inputService.value); } } } clearValue() { this.setValue(this.inputService.isNullable() ? 0 : 0); this.onModelChange(this.inputService.value); } handleKeypress(event) { let keyCode = event.which || event.charCode || event.keyCode; event.preventDefault(); if (keyCode === 97 && event.ctrlKey) { return; } this.handleKeypressImpl(keyCode); } handleKeypressImpl(keyCode) { switch (keyCode) { case undefined: case 9: case 13: return; case 43: this.inputService.changeToPositive(); break; case 45: this.inputService.changeToNegative(); break; default: if (this.inputService.canInputMoreNumbers) { let selectionRangeLength = Math.abs(this.inputService.inputSelection.selectionEnd - this.inputService.inputSelection.selectionStart); if (selectionRangeLength == this.inputService.rawValue.length) { this.setValue(0); } this.inputService.addNumber(keyCode); } break; } this.onModelChange(this.inputService.value); } handlePaste(event) { setTimeout(() => { this.inputService.updateFieldValue(); this.setValue(this.inputService.value); this.onModelChange(this.inputService.value); }, 1); } updateOptions(options) { this.inputService.updateOptions(options); } getOnModelChange() { return this.onModelChange; } setOnModelChange(callbackFunction) { this.onModelChange = callbackFunction; } getOnModelTouched() { return this.onModelTouched; } setOnModelTouched(callbackFunction) { this.onModelTouched = callbackFunction; } setValue(value) { this.inputService.value = value; } /** * Passthrough to setTimeout that can be stubbed out in tests. */ timer(callback, delayMillis) { setTimeout(callback, delayMillis); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL25neC1ydXBpYWgvc3JjL2xpYi9pbnB1dC5oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxNQUFNLE9BQU8sWUFBWTtJQU1yQixZQUFZLGdCQUFrQyxFQUFFLE9BQVk7UUFDeEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQVU7UUFDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBVTtRQUNsQixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUM7UUFDckUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDdkQsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFFbkUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FB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O0lBQ1YsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFZO1FBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxnQkFBZ0I7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLGdCQUEwQjtRQUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLGdCQUFnQixDQUFDO0lBQzFDLENBQUM7SUFFRCxpQkFBaUI7UUFDYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUVELGlCQUFpQixDQUFDLGdCQUEwQjtRQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFFBQW9CLEVBQUUsV0FBbUI7UUFDbkQsVUFBVSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnB1dFNlcnZpY2UgfSBmcm9tIFwiLi9pbnB1dC5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbnB1dEhhbmRsZXIge1xuXG4gICAgcHJpdmF0ZSBpbnB1dFNlcnZpY2U6IElucHV0U2VydmljZTtcbiAgICBwcml2YXRlIG9uTW9kZWxDaGFuZ2UhOiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIG9uTW9kZWxUb3VjaGVkITogRnVuY3Rpb247XG5cbiAgICBjb25zdHJ1Y3RvcihodG1sSW5wdXRFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50LCBvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UgPSBuZXcgSW5wdXRTZXJ2aWNlKGh0bWxJbnB1dEVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGhhbmRsZUN1dChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UudXBkYXRlRmllbGRWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLmlucHV0U2VydmljZS52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBoYW5kbGVJbnB1dChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGxldCBzZWxlY3Rpb25TdGFydCA9IHRoaXMuaW5wdXRTZXJ2aWNlLmlucHV0U2VsZWN0aW9uLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICBsZXQga2V5Q29kZSA9IHRoaXMuaW5wdXRTZXJ2aWNlLnJhd1ZhbHVlLmNoYXJDb2RlQXQoc2VsZWN0aW9uU3RhcnQgLSAxKTtcbiAgICAgICAgbGV0IHJhd1ZhbHVlTGVuZ3RoID0gdGhpcy5pbnB1dFNlcnZpY2UucmF3VmFsdWUubGVuZ3RoO1xuICAgICAgICBsZXQgc3RvcmVkUmF3VmFsdWVMZW5ndGggPSB0aGlzLmlucHV0U2VydmljZS5zdG9yZWRSYXdWYWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHJhd1ZhbHVlTGVuZ3RoIC0gc3RvcmVkUmF3VmFsdWVMZW5ndGgpICE9IDEpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsdWUoc2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuaW5wdXRTZXJ2aWNlLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIG9sZCB2YWx1ZS5cbiAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UucmF3VmFsdWUgPSB0aGlzLmlucHV0U2VydmljZS5zdG9yZWRSYXdWYWx1ZTtcblxuICAgICAgICBpZiAocmF3VmFsdWVMZW5ndGggPCBzdG9yZWRSYXdWYWx1ZUxlbmd0aCkge1xuICAgICAgICAgICAgLy8gQ2hyb21lIEFuZHJvaWQgc2VlbXMgdG8gbW92ZSB0aGUgY3Vyc29yIGluIHJlc3BvbnNlIHRvIGEgYmFja3NwYWNlIEFGVEVSIHByb2Nlc3NpbmcgdGhlXG4gICAgICAgICAgICAvLyBpbnB1dCBldmVudCwgc28gd2UgbmVlZCB0byB3cmFwIHRoaXMgaW4gYSB0aW1lb3V0LlxuICAgICAgICAgICAgdGhpcy50aW1lcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIGp1c3QgYWZ0ZXIgdGhlIGRlbGV0ZWQgdmFsdWUuXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UudXBkYXRlRmllbGRWYWx1ZShzZWxlY3Rpb25TdGFydCArIDEpO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBiYWNrc3BhY2UgaXQuXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UucmVtb3ZlTnVtYmVyKDgpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLmlucHV0U2VydmljZS52YWx1ZSk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdWYWx1ZUxlbmd0aCA+IHN0b3JlZFJhd1ZhbHVlTGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8ganVzdCBiZWZvcmUgdGhlIG5ldyB2YWx1ZS5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsdWUoc2VsZWN0aW9uU3RhcnQgLSAxKTtcblxuICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVyIGxpa2UgYSBrZXlwcmVzcy5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlS2V5cHJlc3NJbXBsKGtleUNvZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlS2V5ZG93bihldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGxldCBrZXlDb2RlID0gZXZlbnQud2hpY2ggfHwgZXZlbnQuY2hhckNvZGUgfHwgZXZlbnQua2V5Q29kZTtcbiAgICAgICAgaWYgKGtleUNvZGUgPT0gOCB8fCBrZXlDb2RlID09IDQ2IHx8IGtleUNvZGUgPT0gNjMyNzIpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VydmljZS5pbnB1dFNlbGVjdGlvbi5zZWxlY3Rpb25TdGFydCA8PSB0aGlzLmlucHV0U2VydmljZS5wcmVmaXhMZW5ndGgoKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLmlucHV0U2VsZWN0aW9uLnNlbGVjdGlvbkVuZCA+PSB0aGlzLmlucHV0U2VydmljZS5yYXdWYWx1ZS5sZW5ndGggLSB0aGlzLmlucHV0U2VydmljZS5zdWZmaXhMZW5ndGgoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VydmljZS5yZW1vdmVOdW1iZXIoa2V5Q29kZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuaW5wdXRTZXJ2aWNlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyVmFsdWUoKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5pbnB1dFNlcnZpY2UuaXNOdWxsYWJsZSgpID8gMCA6IDApO1xuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpO1xuICAgIH1cblxuICAgIGhhbmRsZUtleXByZXNzKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgbGV0IGtleUNvZGUgPSBldmVudC53aGljaCB8fCBldmVudC5jaGFyQ29kZSB8fCBldmVudC5rZXlDb2RlO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gOTcgJiYgZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVLZXlwcmVzc0ltcGwoa2V5Q29kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlwcmVzc0ltcGwoa2V5Q29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgNDM6XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UuY2hhbmdlVG9Qb3NpdGl2ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VydmljZS5jaGFuZ2VUb05lZ2F0aXZlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VydmljZS5jYW5JbnB1dE1vcmVOdW1iZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3Rpb25SYW5nZUxlbmd0aCA9IE1hdGguYWJzKHRoaXMuaW5wdXRTZXJ2aWNlLmlucHV0U2VsZWN0aW9uLnNlbGVjdGlvbkVuZCAtIHRoaXMuaW5wdXRTZXJ2aWNlLmlucHV0U2VsZWN0aW9uLnNlbGVjdGlvblN0YXJ0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uUmFuZ2VMZW5ndGggPT0gdGhpcy5pbnB1dFNlcnZpY2UucmF3VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKDApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UuYWRkTnVtYmVyKGtleUNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLmlucHV0U2VydmljZS52YWx1ZSk7XG4gICAgfVxuXG4gICAgaGFuZGxlUGFzdGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuaW5wdXRTZXJ2aWNlLnZhbHVlKTtcbiAgICAgICAgfSwgMSk7XG4gICAgfVxuXG4gICAgdXBkYXRlT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UudXBkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBnZXRPbk1vZGVsQ2hhbmdlKCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25Nb2RlbENoYW5nZTtcbiAgICB9XG5cbiAgICBzZXRPbk1vZGVsQ2hhbmdlKGNhbGxiYWNrRnVuY3Rpb246IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSA9IGNhbGxiYWNrRnVuY3Rpb247XG4gICAgfVxuXG4gICAgZ2V0T25Nb2RlbFRvdWNoZWQoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5vbk1vZGVsVG91Y2hlZDtcbiAgICB9XG5cbiAgICBzZXRPbk1vZGVsVG91Y2hlZChjYWxsYmFja0Z1bmN0aW9uOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gY2FsbGJhY2tGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFzc3Rocm91Z2ggdG8gc2V0VGltZW91dCB0aGF0IGNhbiBiZSBzdHViYmVkIG91dCBpbiB0ZXN0cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHRpbWVyKGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1pbGxpczogbnVtYmVyKSB7XG4gICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5TWlsbGlzKTtcbiAgICB9XG59Il19