UNPKG

ng-units

Version:

Angular component library for units of measurement.

138 lines 15.9 kB
import { Directive, forwardRef, HostListener, Input, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { defaultPrint } from './quantity'; import * as i0 from "@angular/core"; import * as i1 from "./system-of-units.service"; const CONTROL_VALUE_ACCESSOR = { name: 'ngQuantityValueAccessor', provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuantityDirective), multi: true }; export class QuantityDirective { elementRef; system; quantityAttr; ngUnit; quantity; inputElement; onTouch; onModelChange; currentModelValue; subscription; constructor(elementRef, system) { this.elementRef = elementRef; this.system = system; } ngOnInit() { this.inputElement = this.getInputElement(); this.initQuantity(); } initQuantity() { this.unsubscribe(); this.quantity = typeof this.quantityAttr === 'string' ? this.system.get(this.quantityAttr) : this.quantityAttr; this.subscribe(); this.updateUnit(); } subscribe() { if (this.quantity) { this.subscription = this.system.changes$.subscribe(m => { if (m.quantity === this.quantity) { this.updateUnit(); } }); } } updateUnit() { this.updateView(this.currentModelValue); } unsubscribe() { if (this.subscription) { this.subscription.unsubscribe(); } } ngOnDestroy() { this.unsubscribe(); } ngOnChanges(changes) { const change = changes['quantityAttr']; if (change && !change.isFirstChange()) { this.initQuantity(); } } registerOnTouched(fn) { this.onTouch = fn; } registerOnChange(fn) { this.onModelChange = fn; } // Parser: View to Model onControlInput() { const rawValue = this.inputElement.value; const modelValue = this.quantity ? this.quantity.toBase(rawValue, this.ngUnit) : rawValue; this.currentModelValue = modelValue; if (this.onTouch) { this.onTouch(); } if (this.onModelChange) { this.onModelChange(modelValue); } } // Formatter: Model to View writeValue(rawValue) { this.currentModelValue = rawValue; this.updateView(rawValue); } updateView(modelValue) { if (!this.quantity) { this.inputElement.value = defaultPrint(modelValue); return; } const converted = this.quantity.fromBase(modelValue, this.ngUnit); if (converted !== null && converted !== undefined) { this.inputElement.value = this.quantity.print(converted, false); } else { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.inputElement.value = null; } } getInputElement() { let input; const element = this.elementRef.nativeElement; if (element.tagName === 'INPUT') { input = element; } else { input = element.querySelector('input'); } if (!input) { throw new Error('ngQuantity only allowed on inputs or elements containing inputs.'); } return input; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: QuantityDirective, deps: [{ token: i0.ElementRef }, { token: i1.SystemOfUnits }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.2", type: QuantityDirective, selector: "[ngQuantity]", inputs: { quantityAttr: ["ngQuantity", "quantityAttr"], ngUnit: "ngUnit" }, host: { listeners: { "input": "onControlInput($event)" } }, providers: [ CONTROL_VALUE_ACCESSOR ], usesOnChanges: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: QuantityDirective, decorators: [{ type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[ngQuantity]', providers: [ CONTROL_VALUE_ACCESSOR ] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.SystemOfUnits }]; }, propDecorators: { quantityAttr: [{ type: Input, args: ['ngQuantity'] }], ngUnit: [{ type: Input }], onControlInput: [{ type: HostListener, args: ['input', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbnRpdHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdW5pdHMvc3JjL2xpYi9xdWFudGl0eS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUNILFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssR0FDUixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLFlBQVksQ0FBQzs7O0FBTXBELE1BQU0sc0JBQXNCLEdBQUc7SUFDM0IsSUFBSSxFQUFFLHlCQUF5QjtJQUMvQixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBU0YsTUFBTSxPQUFPLGlCQUFpQjtJQWFOO0lBQWdDO0lBWC9CLFlBQVksQ0FBcUI7SUFDN0MsTUFBTSxDQUFlO0lBRTlCLFFBQVEsQ0FBWTtJQUVaLFlBQVksQ0FBb0I7SUFDaEMsT0FBTyxDQUFjO0lBQ3JCLGFBQWEsQ0FBaUQ7SUFDOUQsaUJBQWlCLENBQXNCO0lBQ3ZDLFlBQVksQ0FBZ0I7SUFFcEMsWUFBb0IsVUFBc0IsRUFBVSxNQUFxQjtRQUFyRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBZTtJQUV6RSxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU8sWUFBWTtRQUNoQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFP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RyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbkU7YUFDSTtZQUNELG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFLLENBQUM7U0FDbkM7SUFDTCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLEtBQXVCLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUM3QixLQUFLLEdBQUcsT0FBTyxDQUFDO1NBQ25CO2FBQ0k7WUFDRCxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQztRQUVELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7U0FDdkY7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO3VHQTFIUSxpQkFBaUI7MkZBQWpCLGlCQUFpQiwrS0FKZjtZQUNQLHNCQUFzQjtTQUN6Qjs7MkZBRVEsaUJBQWlCO2tCQVA3QixTQUFTO21CQUFDO29CQUNQLDhDQUE4QztvQkFDOUMsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFNBQVMsRUFBRTt3QkFDUCxzQkFBc0I7cUJBQ3pCO2lCQUNKOzZIQUd3QixZQUFZO3NCQUFoQyxLQUFLO3VCQUFDLFlBQVk7Z0JBQ1YsTUFBTTtzQkFBZCxLQUFLO2dCQW9FTixjQUFjO3NCQURiLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIE9uSW5pdCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3lcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIERpcmVjdGl2ZSxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBmb3J3YXJkUmVmLFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgSW5wdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGRlZmF1bHRQcmludCwgUXVhbnRpdHkgfSBmcm9tICcuL3F1YW50aXR5JztcclxuaW1wb3J0IHsgU3lzdGVtT2ZVbml0cyB9IGZyb20gJy4vc3lzdGVtLW9mLXVuaXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVW5pdCB9IGZyb20gJy4vdW5pdCc7XHJcblxyXG5cclxuY29uc3QgQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUiA9IHtcclxuICAgIG5hbWU6ICduZ1F1YW50aXR5VmFsdWVBY2Nlc3NvcicsXHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFF1YW50aXR5RGlyZWN0aXZlKSxcclxuICAgIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICAgIHNlbGVjdG9yOiAnW25nUXVhbnRpdHldJyxcclxuICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIENPTlRST0xfVkFMVUVfQUNDRVNTT1JcclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFF1YW50aXR5RGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cclxuICAgIEBJbnB1dCgnbmdRdWFudGl0eScpIHF1YW50aXR5QXR0cj86IHN0cmluZyB8IFF1YW50aXR5O1xyXG4gICAgQElucHV0KCkgbmdVbml0Pzogc3RyaW5nfFVuaXQ7XHJcblxyXG4gICAgcXVhbnRpdHk/OiBRdWFudGl0eTtcclxuXHJcbiAgICBwcml2YXRlIGlucHV0RWxlbWVudCE6IEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIG9uVG91Y2g/OiAoKSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSBvbk1vZGVsQ2hhbmdlPzogKHZhbHVlOiBzdHJpbmd8bnVtYmVyfHVuZGVmaW5lZHxudWxsKSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50TW9kZWxWYWx1ZT86IHN0cmluZ3xudW1iZXJ8bnVsbDtcclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBzeXN0ZW06IFN5c3RlbU9mVW5pdHMpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQgPSB0aGlzLmdldElucHV0RWxlbWVudCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFF1YW50aXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UXVhbnRpdHkoKSB7XHJcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMucXVhbnRpdHkgPSB0eXBlb2YgdGhpcy5xdWFudGl0eUF0dHIgPT09ICdzdHJpbmcnID9cclxuICAgICAgICAgICAgdGhpcy5zeXN0ZW0uZ2V0KHRoaXMucXVhbnRpdHlBdHRyKSA6IHRoaXMucXVhbnRpdHlBdHRyO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVVbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucXVhbnRpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnN5c3RlbS5jaGFuZ2VzJC5zdWJzY3JpYmUobSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAobS5xdWFudGl0eSA9PT0gdGhpcy5xdWFudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVVbml0KCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlldyh0aGlzLmN1cnJlbnRNb2RlbFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuc3Vic2NyaWJlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZSA9IGNoYW5nZXNbJ3F1YW50aXR5QXR0ciddO1xyXG4gICAgICAgIGlmIChjaGFuZ2UgJiYgIWNoYW5nZS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0UXVhbnRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2ggPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZ3xudW1iZXJ8dW5kZWZpbmVkfG51bGwpID0+IHZvaWQpIHtcclxuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQYXJzZXI6IFZpZXcgdG8gTW9kZWxcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcclxuICAgIG9uQ29udHJvbElucHV0KCkge1xyXG5cclxuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLnF1YW50aXR5ID8gdGhpcy5xdWFudGl0eS50b0Jhc2UocmF3VmFsdWUsIHRoaXMubmdVbml0KSA6IHJhd1ZhbHVlO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE1vZGVsVmFsdWUgPSBtb2RlbFZhbHVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vblRvdWNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMub25Nb2RlbENoYW5nZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UobW9kZWxWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBGb3JtYXR0ZXI6IE1vZGVsIHRvIFZpZXdcclxuICAgIHdyaXRlVmFsdWUocmF3VmFsdWU6IHN0cmluZ3xudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb2RlbFZhbHVlID0gcmF3VmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KHJhd1ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVZpZXcobW9kZWxWYWx1ZTogc3RyaW5nfG51bWJlcnx1bmRlZmluZWR8bnVsbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5xdWFudGl0eSkge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC52YWx1ZSA9IGRlZmF1bHRQcmludChtb2RlbFZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB0aGlzLnF1YW50aXR5LmZyb21CYXNlKG1vZGVsVmFsdWUsIHRoaXMubmdVbml0KTtcclxuICAgICAgICBpZiAoY29udmVydGVkICE9PSBudWxsICYmIGNvbnZlcnRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gdGhpcy5xdWFudGl0eS5wcmludChjb252ZXJ0ZWQsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gbnVsbCE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SW5wdXRFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xyXG4gICAgICAgIGxldCBpbnB1dDogSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xyXG4gICAgICAgICAgICBpbnB1dCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpbnB1dCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaW5wdXQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZ1F1YW50aXR5IG9ubHkgYWxsb3dlZCBvbiBpbnB1dHMgb3IgZWxlbWVudHMgY29udGFpbmluZyBpbnB1dHMuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuXHJcbn1cclxuIl19