@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
129 lines • 17.5 kB
JavaScript
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==