@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
135 lines • 17.1 kB
JavaScript
import { Directive, forwardRef, HostListener, Inject, Input, Optional } from "@angular/core";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import { RUPIAH_MASK_CONFIG, RupiahMaskInputMode } from "./rupiah-mask.config";
import { InputHandler } from "./input.handler";
import * as i0 from "@angular/core";
export const RUPIAHMASKDIRECTIVE_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RupiahMaskDirective),
multi: true,
};
export class RupiahMaskDirective {
constructor(currencyMaskConfig, elementRef, keyValueDiffers) {
this.currencyMaskConfig = currencyMaskConfig;
this.elementRef = elementRef;
this.keyValueDiffers = keyValueDiffers;
this.options = {};
this.optionsTemplate = {
align: "right",
allowNegative: true,
allowZero: true,
decimal: ".",
precision: 2,
prefix: "Rp ",
suffix: "",
thousands: ",",
nullable: false,
inputMode: RupiahMaskInputMode.FINANCIAL
};
if (currencyMaskConfig) {
this.optionsTemplate = currencyMaskConfig;
}
this.keyValueDiffer = keyValueDiffers.find({}).create();
}
ngAfterViewInit() {
this.elementRef.nativeElement.style.textAlign = this.options && this.options.align ? this.options.align : this.optionsTemplate.align;
}
ngDoCheck() {
if (this.keyValueDiffer.diff(this.options)) {
this.elementRef.nativeElement.style.textAlign = this.options.align ? this.options.align : this.optionsTemplate.align;
this.inputHandler.updateOptions(Object.assign({}, this.optionsTemplate, this.options));
}
}
ngOnInit() {
this.inputHandler = new InputHandler(this.elementRef.nativeElement, Object.assign({}, this.optionsTemplate, this.options));
}
handleBlur(event) {
this.inputHandler.getOnModelTouched().apply(event);
}
handleCut(event) {
if (!this.isChromeAndroid()) {
!this.isReadOnly() && this.inputHandler.handleCut(event);
}
}
handleInput(event) {
if (this.isChromeAndroid()) {
!this.isReadOnly() && this.inputHandler.handleInput(event);
}
}
handleKeydown(event) {
if (!this.isChromeAndroid()) {
!this.isReadOnly() && this.inputHandler.handleKeydown(event);
}
}
handleKeypress(event) {
if (!this.isChromeAndroid()) {
!this.isReadOnly() && this.inputHandler.handleKeypress(event);
}
}
handlePaste(event) {
if (!this.isChromeAndroid()) {
!this.isReadOnly() && this.inputHandler.handlePaste(event);
}
}
handleDrop(event) {
if (!this.isChromeAndroid()) {
event.preventDefault();
}
}
isChromeAndroid() {
return /chrome/i.test(navigator.userAgent) && /android/i.test(navigator.userAgent);
}
isReadOnly() {
return this.elementRef.nativeElement.hasAttribute('readonly');
}
registerOnChange(callbackFunction) {
this.inputHandler.setOnModelChange(callbackFunction);
}
registerOnTouched(callbackFunction) {
this.inputHandler.setOnModelTouched(callbackFunction);
}
setDisabledState(value) {
this.elementRef.nativeElement.disabled = value;
}
writeValue(value) {
this.inputHandler.setValue(value);
}
}
RupiahMaskDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: RupiahMaskDirective, deps: [{ token: RUPIAH_MASK_CONFIG, optional: true }, { token: i0.ElementRef }, { token: i0.KeyValueDiffers }], target: i0.ɵɵFactoryTarget.Directive });
RupiahMaskDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.4", type: RupiahMaskDirective, selector: "[rupiahMask]", inputs: { options: "options" }, host: { listeners: { "blur": "handleBlur($event)", "cut": "handleCut($event)", "input": "handleInput($event)", "keydown": "handleKeydown($event)", "keypress": "handleKeypress($event)", "paste": "handlePaste($event)", "drop": "handleDrop($event)" } }, providers: [RUPIAHMASKDIRECTIVE_VALUE_ACCESSOR], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: RupiahMaskDirective, decorators: [{
type: Directive,
args: [{
selector: "[rupiahMask]",
providers: [RUPIAHMASKDIRECTIVE_VALUE_ACCESSOR]
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [RUPIAH_MASK_CONFIG]
}] }, { type: i0.ElementRef }, { type: i0.KeyValueDiffers }]; }, propDecorators: { options: [{
type: Input
}], handleBlur: [{
type: HostListener,
args: ["blur", ["$event"]]
}], handleCut: [{
type: HostListener,
args: ["cut", ["$event"]]
}], handleInput: [{
type: HostListener,
args: ["input", ["$event"]]
}], handleKeydown: [{
type: HostListener,
args: ["keydown", ["$event"]]
}], handleKeypress: [{
type: HostListener,
args: ["keypress", ["$event"]]
}], handlePaste: [{
type: HostListener,
args: ["paste", ["$event"]]
}], handleDrop: [{
type: HostListener,
args: ["drop", ["$event"]]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVwaWFoLW1hc2suZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbmd4LXJ1cGlhaC9zcmMvbGliL3J1cGlhaC1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUdULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUdOLEtBQUssRUFFTCxRQUFRLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBb0Isa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFRO0lBQ25ELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztJQUNsRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFNRixNQUFNLE9BQU8sbUJBQW1CO0lBb0I1QixZQUE0RCxrQkFBb0MsRUFDcEYsVUFBc0IsRUFDdEIsZUFBZ0M7UUFGZ0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFrQjtRQUNwRixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQXBCbkMsWUFBTyxHQUE4QixFQUFFLENBQUM7UUFLMUMsb0JBQWUsR0FBcUI7WUFDdkMsS0FBSyxFQUFFLE9BQU87WUFDZCxhQUFhLEVBQUUsSUFBSTtZQUNuQixTQUFTLEVBQUUsSUFBSTtZQUNmLE9BQU8sRUFBRSxHQUFHO1lBQ1osU0FBUyxFQUFFLENBQUM7WUFDWixNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU0sRUFBRSxFQUFFO1lBQ1YsU0FBUyxFQUFFLEdB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LE1BQU07MkJBQUMsa0JBQWtCO21HQWxCekMsT0FBTztzQkFBZixLQUFLO2dCQTRDTixVQUFVO3NCQURULFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU1oQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVEvQixXQUFXO3NCQURWLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFqQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFuQyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFwQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFqQyxVQUFVO3NCQURULFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEtleVZhbHVlRGlmZmVyLFxuICAgIEtleVZhbHVlRGlmZmVycyxcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBSdXBpYWhNYXNrQ29uZmlnLCBSVVBJQUhfTUFTS19DT05GSUcsIFJ1cGlhaE1hc2tJbnB1dE1vZGUgfSBmcm9tIFwiLi9ydXBpYWgtbWFzay5jb25maWdcIjtcbmltcG9ydCB7IElucHV0SGFuZGxlciB9IGZyb20gXCIuL2lucHV0LmhhbmRsZXJcIjtcblxuZXhwb3J0IGNvbnN0IFJVUElBSE1BU0tESVJFQ1RJVkVfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSdXBpYWhNYXNrRGlyZWN0aXZlKSxcbiAgICBtdWx0aTogdHJ1ZSxcbn07XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiBcIltydXBpYWhNYXNrXVwiLFxuICAgIHByb3ZpZGVyczogW1JVUElBSE1BU0tESVJFQ1RJVkVfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIFJ1cGlhaE1hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRG9DaGVjaywgT25Jbml0IHtcblxuICAgIEBJbnB1dCgpIG9wdGlvbnM6IFBhcnRpYWw8UnVwaWFoTWFza0NvbmZpZz4gPSB7fTtcblxuICAgIHB1YmxpYyBpbnB1dEhhbmRsZXIhOiBJbnB1dEhhbmRsZXI7XG4gICAgcHVibGljIGtleVZhbHVlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxhbnksIGFueT47XG5cbiAgICBwdWJsaWMgb3B0aW9uc1RlbXBsYXRlOiBSdXBpYWhNYXNrQ29uZmlnID0ge1xuICAgICAgICBhbGlnbjogXCJyaWdodFwiLFxuICAgICAgICBhbGxvd05lZ2F0aXZlOiB0cnVlLFxuICAgICAgICBhbGxvd1plcm86IHRydWUsXG4gICAgICAgIGRlY2ltYWw6IFwiLlwiLFxuICAgICAgICBwcmVjaXNpb246IDIsXG4gICAgICAgIHByZWZpeDogXCJScCBcIixcbiAgICAgICAgc3VmZml4OiBcIlwiLFxuICAgICAgICB0aG91c2FuZHM6IFwiLFwiLFxuICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgIGlucHV0TW9kZTogUnVwaWFoTWFza0lucHV0TW9kZS5GSU5BTkNJQUxcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChSVVBJQUhfTUFTS19DT05GSUcpIHByaXZhdGUgY3VycmVuY3lNYXNrQ29uZmlnOiBSdXBpYWhNYXNrQ29uZmlnLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUga2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMpIHtcbiAgICAgICAgaWYgKGN1cnJlbmN5TWFza0NvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zVGVtcGxhdGUgPSBjdXJyZW5jeU1hc2tDb25maWc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtleVZhbHVlRGlmZmVyID0ga2V5VmFsdWVEaWZmZXJzLmZpbmQoe30pLmNyZWF0ZSgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUudGV4dEFsaWduID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5hbGlnbiA/IHRoaXMub3B0aW9ucy5hbGlnbiA6IHRoaXMub3B0aW9uc1RlbXBsYXRlLmFsaWduO1xuICAgIH1cblxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgaWYgKHRoaXMua2V5VmFsdWVEaWZmZXIuZGlmZih0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSB0aGlzLm9wdGlvbnMuYWxpZ24gPyB0aGlzLm9wdGlvbnMuYWxpZ24gOiB0aGlzLm9wdGlvbnNUZW1wbGF0ZS5hbGlnbjtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRIYW5kbGVyLnVwZGF0ZU9wdGlvbnMoKDxhbnk+T2JqZWN0KS5hc3NpZ24oe30sIHRoaXMub3B0aW9uc1RlbXBsYXRlLCB0aGlzLm9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmlucHV0SGFuZGxlciA9IG5ldyBJbnB1dEhhbmRsZXIodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICg8YW55Pk9iamVjdCkuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnNUZW1wbGF0ZSwgdGhpcy5vcHRpb25zKSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImJsdXJcIiwgW1wiJGV2ZW50XCJdKVxuICAgIGhhbmRsZUJsdXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmlucHV0SGFuZGxlci5nZXRPbk1vZGVsVG91Y2hlZCgpLmFwcGx5KGV2ZW50KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiY3V0XCIsIFtcIiRldmVudFwiXSlcbiAgICBoYW5kbGVDdXQoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaHJvbWVBbmRyb2lkKCkpIHtcbiAgICAgICAgICAgICF0aGlzLmlzUmVhZE9ubHkoKSAmJiB0aGlzLmlucHV0SGFuZGxlci5oYW5kbGVDdXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImlucHV0XCIsIFtcIiRldmVudFwiXSlcbiAgICBoYW5kbGVJbnB1dChldmVudDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2hyb21lQW5kcm9pZCgpKSB7XG4gICAgICAgICAgICAhdGhpcy5pc1JlYWRPbmx5KCkgJiYgdGhpcy5pbnB1dEhhbmRsZXIuaGFuZGxlSW5wdXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImtleWRvd25cIiwgW1wiJGV2ZW50XCJdKVxuICAgIGhhbmRsZUtleWRvd24oZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaHJvbWVBbmRyb2lkKCkpIHtcbiAgICAgICAgICAgICF0aGlzLmlzUmVhZE9ubHkoKSAmJiB0aGlzLmlucHV0SGFuZGxlci5oYW5kbGVLZXlkb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCBbXCIkZXZlbnRcIl0pXG4gICAgaGFuZGxlS2V5cHJlc3MoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaHJvbWVBbmRyb2lkKCkpIHtcbiAgICAgICAgICAgICF0aGlzLmlzUmVhZE9ubHkoKSAmJiB0aGlzLmlucHV0SGFuZGxlci5oYW5kbGVLZXlwcmVzcyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwicGFzdGVcIiwgW1wiJGV2ZW50XCJdKVxuICAgIGhhbmRsZVBhc3RlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lQW5kcm9pZCgpKSB7XG4gICAgICAgICAgICAhdGhpcy5pc1JlYWRPbmx5KCkgJiYgdGhpcy5pbnB1dEhhbmRsZXIuaGFuZGxlUGFzdGUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyb3BcIiwgW1wiJGV2ZW50XCJdKVxuICAgIGhhbmRsZURyb3AoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDaHJvbWVBbmRyb2lkKCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0Nocm9tZUFuZHJvaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAvY2hyb21lL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAvYW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgfVxuXG4gICAgaXNSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKVxuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoY2FsbGJhY2tGdW5jdGlvbjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dEhhbmRsZXIuc2V0T25Nb2RlbENoYW5nZShjYWxsYmFja0Z1bmN0aW9uKTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChjYWxsYmFja0Z1bmN0aW9uOiBGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0SGFuZGxlci5zZXRPbk1vZGVsVG91Y2hlZChjYWxsYmFja0Z1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRIYW5kbGVyLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG59Il19