UNPKG

@nakedobjects/gemini

Version:

Single Page Application client for a Naked Objects application.

129 lines 17.5 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { DateTime } from 'luxon'; import { debounceTime } from 'rxjs/operators'; import { focus, safeUnsubscribe } from '../helpers-components'; import { BehaviorSubject } from 'rxjs'; import { defaultShortTimeFormat, defaultTimeFormat, shortTimeFormat } from '@nakedobjects/services'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "../clear.directive"; export class TimePickerComponent { inputEvents; outputEvents; id; inputField; constructor() { this.outputEvents = new EventEmitter(); } timeValue = null; modelValue = ''; eventsSub; bSubject; sub; set model(s) { this.modelValue = s; if (this.bSubject) { this.bSubject.next(s); } } get model() { return this.modelValue; } get time() { return this.timeValue; } set time(time) { if (time && time.isValid) { this.timeValue = time; this.outputEvents.emit({ type: 'timeChanged', data: time.toFormat(defaultTimeFormat) }); } } validInputFormats = [defaultTimeFormat, defaultShortTimeFormat, shortTimeFormat]; validateTime(newValue) { let dt = DateTime.now(); for (const f of this.validInputFormats) { dt = DateTime.fromFormat(newValue, f); if (dt.isValid) { break; } } return dt; } sameTime(t1, t2) { return t2 && t1.hour === t2.hour && t1.minute === t2.minute && t1.second === t2.second; } setTimeIfChanged(newTime) { if (!this.sameTime(newTime, this.time)) { this.time = newTime; setTimeout(() => this.model = newTime.toFormat(defaultShortTimeFormat)); } } setTime(newValue) { if (newValue === '' || newValue == null) { this.timeValue = null; this.outputEvents.emit({ type: 'timeCleared', data: '' }); } else { const dt = this.validateTime(newValue); if (dt.isValid) { this.setTimeIfChanged(dt); } else { this.timeValue = null; this.outputEvents.emit({ type: 'timeInvalid', data: newValue }); } } } inputChanged(newValue) { this.setTime(newValue); } ngOnInit() { if (this.inputEvents) { this.eventsSub = this.inputEvents.subscribe((e) => { if (e.type === 'setTime') { this.setTime(e.data); } }); } } clear() { this.modelValue = ''; this.setTime(''); } get subject() { if (!this.bSubject) { const initialValue = this.model; this.bSubject = new BehaviorSubject(initialValue); this.sub = this.bSubject.pipe(debounceTime(200)).subscribe((data) => this.inputChanged(data)); } return this.bSubject; } ngOnDestroy() { safeUnsubscribe(this.sub); safeUnsubscribe(this.eventsSub); } focus() { return focus(this.inputField); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: TimePickerComponent, selector: "nof-time-picker", inputs: { inputEvents: "inputEvents", id: "id" }, outputs: { outputEvents: "outputEvents" }, viewQueries: [{ propertyName: "inputField", first: true, predicate: ["focus"], descendants: true }], ngImport: i0, template: "<input #focus type=\"text\" [id]=\"id\" [(ngModel)]=\"model\" [nofClear]=\"subject\" (clear)=\"clear()\">\n", styles: ["input{width:var(--field-value-width)}.ng-clearable{background-image:var(--clearable-image);background-repeat:no-repeat;background-position:right -10px;background-size:8px}.ng-clearable[class*=link-color]{background-image:var(--clearable-link-image)}.ng-clearable.ng-x{background-position:right 2px center}.ng-clearable.ng-onX{cursor:pointer}input::-ms-clear{display:none}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.ClearDirective, selector: "[nofClear]", inputs: ["nofClear"], outputs: ["clear"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TimePickerComponent, decorators: [{ type: Component, args: [{ selector: 'nof-time-picker', template: "<input #focus type=\"text\" [id]=\"id\" [(ngModel)]=\"model\" [nofClear]=\"subject\" (clear)=\"clear()\">\n", styles: ["input{width:var(--field-value-width)}.ng-clearable{background-image:var(--clearable-image);background-repeat:no-repeat;background-position:right -10px;background-size:8px}.ng-clearable[class*=link-color]{background-image:var(--clearable-link-image)}.ng-clearable.ng-x{background-position:right 2px center}.ng-clearable.ng-onX{cursor:pointer}input::-ms-clear{display:none}\n"] }] }], ctorParameters: () => [], propDecorators: { inputEvents: [{ type: Input, args: [{ required: true }] }], outputEvents: [{ type: Output }], id: [{ type: Input, args: [{ required: true }] }], inputField: [{ type: ViewChild, args: ['focus', { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZ2VtaW5pL3NyYy90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBcUMsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBaUJwRyxNQUFNLE9BQU8sbUJBQW1CO0lBRzVCLFdBQVcsQ0FBdUM7SUFHbEQsWUFBWSxDQUF1QztJQUduRCxFQUFFLENBQVU7SUFHWixVQUFVLENBQWM7SUFFeEI7UUFDSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO0lBQ25FLENBQUM7SUFFTyxTQUFTLEdBQW9CLElBQUksQ0FBQztJQUNsQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLFNBQVMsQ0FBaUI7SUFDMUIsUUFBUSxDQUEyQjtJQUNuQyxHQUFHLENBQWlCO0lBRTVCLElBQUksS0FBSyxDQUFDLENBQVM7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUs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LFVBQVUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7dUdBbklRLG1CQUFtQjsyRkFBbkIsbUJBQW1CLHlQQy9CaEMsNkdBQ0E7OzJGRDhCYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0ksaUJBQWlCO3dEQU8zQixXQUFXO3NCQURWLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUcsSUFBSSxFQUFDO2dCQUl4QixZQUFZO3NCQURYLE1BQU07Z0JBSVAsRUFBRTtzQkFERCxLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFHLElBQUksRUFBQztnQkFJeEIsVUFBVTtzQkFEVCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGZvY3VzLCBzYWZlVW5zdWJzY3JpYmUgfSBmcm9tICcuLi9oZWxwZXJzLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb25MaWtlIGFzIElTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlZmF1bHRTaG9ydFRpbWVGb3JtYXQsIGRlZmF1bHRUaW1lRm9ybWF0LCBzaG9ydFRpbWVGb3JtYXQgfSBmcm9tICdAbmFrZWRvYmplY3RzL3NlcnZpY2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBJVGltZVBpY2tlck91dHB1dEV2ZW50IHtcbiAgICB0eXBlOiAndGltZUNoYW5nZWQnIHwgJ3RpbWVDbGVhcmVkJyB8ICd0aW1lSW52YWxpZCc7XG4gICAgZGF0YTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUaW1lUGlja2VySW5wdXRFdmVudCB7XG4gICAgdHlwZTogJ3NldFRpbWUnO1xuICAgIGRhdGE6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdub2YtdGltZS1waWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAndGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWyd0aW1lLXBpY2tlci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVGltZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBJbnB1dCh7cmVxdWlyZWQgOiB0cnVlfSlcbiAgICBpbnB1dEV2ZW50cyE6IEV2ZW50RW1pdHRlcjxJVGltZVBpY2tlcklucHV0RXZlbnQ+O1xuXG4gICAgQE91dHB1dCgpXG4gICAgb3V0cHV0RXZlbnRzOiBFdmVudEVtaXR0ZXI8SVRpbWVQaWNrZXJPdXRwdXRFdmVudD47XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgaWQhOiBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKCdmb2N1cycsIHtzdGF0aWM6IGZhbHNlfSlcbiAgICBpbnB1dEZpZWxkPzogRWxlbWVudFJlZjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm91dHB1dEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8SVRpbWVQaWNrZXJPdXRwdXRFdmVudD4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRpbWVWYWx1ZTogRGF0ZVRpbWUgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIG1vZGVsVmFsdWUgPSAnJztcbiAgICBwcml2YXRlIGV2ZW50c1N1Yj86IElTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBiU3ViamVjdD86IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+O1xuICAgIHByaXZhdGUgc3ViPzogSVN1YnNjcmlwdGlvbjtcblxuICAgIHNldCBtb2RlbChzOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tb2RlbFZhbHVlID0gcztcblxuICAgICAgICBpZiAodGhpcy5iU3ViamVjdCkge1xuICAgICAgICAgICAgdGhpcy5iU3ViamVjdC5uZXh0KHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsVmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHRpbWUoKTogRGF0ZVRpbWUgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZVZhbHVlO1xuICAgIH1cblxuICAgIHNldCB0aW1lKHRpbWU6IERhdGVUaW1lIHwgbnVsbCkge1xuICAgICAgICBpZiAodGltZSAmJiB0aW1lLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlID0gdGltZTtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0RXZlbnRzLmVtaXQoeyB0eXBlOiAndGltZUNoYW5nZWQnLCBkYXRhOiB0aW1lLnRvRm9ybWF0KGRlZmF1bHRUaW1lRm9ybWF0KSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRJbnB1dEZvcm1hdHMgPSBbZGVmYXVsdFRpbWVGb3JtYXQsIGRlZmF1bHRTaG9ydFRpbWVGb3JtYXQsIHNob3J0VGltZUZvcm1hdF07XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlVGltZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBkdCA6IERhdGVUaW1lPHRydWU+IHwgRGF0ZVRpbWU8ZmFsc2U+ID0gRGF0ZVRpbWUubm93KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHRoaXMudmFsaWRJbnB1dEZvcm1hdHMpIHtcbiAgICAgICAgICAgIGR0ID0gRGF0ZVRpbWUuZnJvbUZvcm1hdChuZXdWYWx1ZSwgZik7XG4gICAgICAgICAgICBpZiAoZHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR0O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2FtZVRpbWUodDEgOiBEYXRlVGltZSwgdDIgOiBEYXRlVGltZSB8IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHQyICYmXG4gICAgICAgICAgICAgICB0MS5ob3VyID09PSB0Mi5ob3VyICYmXG4gICAgICAgICAgICAgICB0MS5taW51dGUgPT09IHQyLm1pbnV0ZSAmJlxuICAgICAgICAgICAgICAgdDEuc2Vjb25kID09PSB0Mi5zZWNvbmQ7XG4gICAgfVxuXG4gICAgc2V0VGltZUlmQ2hhbmdlZChuZXdUaW1lOiBEYXRlVGltZSkge1xuICAgICAgICBpZiAoIXRoaXMuc2FtZVRpbWUobmV3VGltZSwgdGhpcy50aW1lKSkge1xuICAgICAgICAgICAgdGhpcy50aW1lID0gbmV3VGltZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5tb2RlbCA9IG5ld1RpbWUudG9Gb3JtYXQoZGVmYXVsdFNob3J0VGltZUZvcm1hdCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGltZShuZXdWYWx1ZTogc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSAnJyB8fCBuZXdWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLm91dHB1dEV2ZW50cy5lbWl0KHsgdHlwZTogJ3RpbWVDbGVhcmVkJywgZGF0YTogJycgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMudmFsaWRhdGVUaW1lKG5ld1ZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKGR0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVJZkNoYW5nZWQoZHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRFdmVudHMuZW1pdCh7IHR5cGU6ICd0aW1lSW52YWxpZCcsIGRhdGE6IG5ld1ZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5wdXRDaGFuZ2VkKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuICAgICAgICBpZiAodGhpcy5pbnB1dEV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHNTdWIgPSB0aGlzLmlucHV0RXZlbnRzLnN1YnNjcmliZSgoZTogSVRpbWVQaWNrZXJJbnB1dEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ3NldFRpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGltZShlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubW9kZWxWYWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLnNldFRpbWUoJycpO1xuICAgIH1cblxuICAgIGdldCBzdWJqZWN0KCkge1xuICAgICAgICBpZiAoIXRoaXMuYlN1YmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHRoaXMubW9kZWw7XG4gICAgICAgICAgICB0aGlzLmJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsVmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLnN1YiA9IHRoaXMuYlN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKChkYXRhOiBzdHJpbmcpID0+IHRoaXMuaW5wdXRDaGFuZ2VkKGRhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmJTdWJqZWN0O1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzYWZlVW5zdWJzY3JpYmUodGhpcy5zdWIpO1xuICAgICAgICBzYWZlVW5zdWJzY3JpYmUodGhpcy5ldmVudHNTdWIpO1xuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICByZXR1cm4gZm9jdXModGhpcy5pbnB1dEZpZWxkKTtcbiAgICB9XG59XG4iLCI8aW5wdXQgI2ZvY3VzIHR5cGU9XCJ0ZXh0XCIgW2lkXT1cImlkXCIgWyhuZ01vZGVsKV09XCJtb2RlbFwiIFtub2ZDbGVhcl09XCJzdWJqZWN0XCIgKGNsZWFyKT1cImNsZWFyKClcIj5cbiJdfQ==