@elderbyte/ngx-starter 18.12.6 → 18.12.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/common/i18n/entity/elder-multi-translate-loader.mjs +4 -4
- package/esm2022/lib/common/utils/signal-input.mjs +3 -0
- package/esm2022/lib/components/time/elder-interval-picker/controller/interval-shift-controller.mjs +3 -3
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +13 -21
- package/esm2022/lib/components/time/elder-interval-picker/interval-picker-toggle/elder-interval-picker-toggle.component.mjs +2 -2
- package/esm2022/lib/components/time/elder-interval-picker/manager/interval-picker-state-manager.mjs +1 -1
- package/esm2022/lib/components/time/elder-interval-picker/util/interval-picker-util.mjs +1 -1
- package/fesm2022/elderbyte-ngx-starter.mjs +18 -25
- package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
- package/lib/common/utils/signal-input.d.ts +2 -0
- package/lib/components/time/elder-interval-picker/elder-interval-picker.component.d.ts +9 -11
- package/package.json +1 -1
package/esm2022/lib/components/time/elder-interval-picker/manager/interval-picker-state-manager.mjs
CHANGED
|
@@ -90,4 +90,4 @@ export default class IntervalPickerStateManager {
|
|
|
90
90
|
this._intervalChange.next(newInterval);
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwtcGlja2VyLXN0YXRlLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL21hbmFnZXIvaW50ZXJ2YWwtcGlja2VyLXN0YXRlLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXBELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzNELE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sYUFBYSxNQUFNLHlCQUF5QixDQUFBO0FBRW5ELE9BQU8sa0JBQWtCLE1BQU0sOEJBQThCLENBQUE7QUFFN0QsTUFBTSxDQUFDLE9BQU8sT0FBTywwQkFBMEI7SUFlN0M7Ozs7Z0ZBSTRFO0lBRTVFO1FBcEJBOzs7O29GQUk0RTtRQUUzRCxRQUFHLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXBELFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBYyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUMvRCxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFBO1FBQ3BELGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFBO1FBQ3hELG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUE7UUFDeEQsa0JBQWEsR0FBRyxLQUFLLENBQUE7SUFRYixDQUFDO0lBRWhCOzs7O2dGQUk0RTtJQUU1RSxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3RDLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3BDLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3hDLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ2xDLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ3BDLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzVDLENBQUM7SUFFRDs7OztnRkFJNEU7SUFFckUsU0FBUyxDQUFDLE1BQW1CO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxnQkFBd0M7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUNuQyxPQUFNO1FBQ1IsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQTtJQUNsRSxDQUFDO0lBRU0sbUJBQW1CLENBQUMsUUFBdUI7UUFDaEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUMvQyxPQUFNO1FBQ1IsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDL0MsT0FBTTtRQUNSLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFFTSxhQUFhLENBQUMsVUFBMkI7UUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUF1QjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtZQUN6QixrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUN4RSxDQUFDO1lBQ0QsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFFeEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJ0BlbGRlcmJ5dGUvdHMtbG9nZ2VyJ1xuaW1wb3J0IHsgVGVtcG9yYWwgfSBmcm9tICdAanMtdGVtcG9yYWwvcG9seWZpbGwnXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IEFuY2hvclN0YXRlIGZyb20gJy4uL21vZGVsL2FuY2hvci1zdGF0ZSdcbmltcG9ydCBJbnRlcnZhbFN0YXRlIGZyb20gJy4uL21vZGVsL2ludGVydmFsLXN0YXRlJ1xuaW1wb3J0IFNtYXJ0U2hpZnRTdGF0ZSBmcm9tICcuLi9tb2RlbC9zbWFydC1zaGlmdC1zdGF0ZSdcbmltcG9ydCBJbnRlcnZhbFBpY2tlclV0aWwgZnJvbSAnLi4vdXRpbC9pbnRlcnZhbC1waWNrZXItdXRpbCdcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWxQaWNrZXJTdGF0ZU1hbmFnZXIge1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSlcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hbmNob3IgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFuY2hvclN0YXRlPihBbmNob3JTdGF0ZS5lbXB0eSgpKVxuICBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcnZhbCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SW50ZXJ2YWxTdGF0ZT4obnVsbClcbiAgcHJpdmF0ZSByZWFkb25seSBfc21hcnRTaGlmdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U21hcnRTaGlmdFN0YXRlPihudWxsKVxuICBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcnZhbENoYW5nZSA9IG5ldyBTdWJqZWN0PEludGVydmFsU3RhdGU+KClcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgZ2V0IGludGVydmFsJCgpOiBPYnNlcnZhYmxlPEludGVydmFsU3RhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJ2YWwuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yJCgpOiBPYnNlcnZhYmxlPEFuY2hvclN0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FuY2hvci5hc09ic2VydmFibGUoKVxuICB9XG5cbiAgcHVibGljIGdldCBzbWFydFNoaWZ0JCgpOiBPYnNlcnZhYmxlPFNtYXJ0U2hpZnRTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLl9zbWFydFNoaWZ0LmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVydmFsVmFsdWUoKTogSW50ZXJ2YWxTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVydmFsLmdldFZhbHVlKClcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yVmFsdWUoKTogQW5jaG9yU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3IuZ2V0VmFsdWUoKVxuICB9XG5cbiAgcHVibGljIGdldCBzbWFydFNoaWZ0VmFsdWUoKTogU21hcnRTaGlmdFN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc21hcnRTaGlmdC5nZXRWYWx1ZSgpXG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVydmFsQ2hhbmdlKCk6IE9ic2VydmFibGU8SW50ZXJ2YWxTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcnZhbENoYW5nZS5hc09ic2VydmFibGUoKVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFB1YmxpYyBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIHNldEFuY2hvcihhbmNob3I6IEFuY2hvclN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5fYW5jaG9yLm5leHQoYW5jaG9yKVxuICB9XG5cbiAgcHVibGljIHNldEV4dGVybmFsQW5jaG9yKFRlbXBvcmFsRGF0ZVRpbWU6IFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUpOiB2b2lkIHtcbiAgICBpZiAoIVRlbXBvcmFsRGF0ZVRpbWUpIHtcbiAgICAgIHRoaXMuc2V0QW5jaG9yKEFuY2hvclN0YXRlLmVtcHR5KCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5zZXRBbmNob3IoQW5jaG9yU3RhdGUuY3JlYXRlRnJvbURhdGVUaW1lKFRlbXBvcmFsRGF0ZVRpbWUpKVxuICB9XG5cbiAgcHVibGljIHNldEV4dGVybmFsSW50ZXJ2YWwoaW50ZXJ2YWw6IEludGVydmFsU3RhdGUpOiB2b2lkIHtcbiAgICBpZiAoIWludGVydmFsKSB7XG4gICAgICB0aGlzLnNldEludGVydmFsKG5ldyBJbnRlcnZhbFN0YXRlKG51bGwsIG51bGwpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghaW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuc2V0SW50ZXJ2YWwobmV3IEludGVydmFsU3RhdGUobnVsbCwgbnVsbCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5zZXRJbnRlcnZhbChpbnRlcnZhbClcbiAgfVxuXG4gIHB1YmxpYyBzZXRTbWFydFNoaWZ0KHNtYXJ0U2hpZnQ6IFNtYXJ0U2hpZnRTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX3NtYXJ0U2hpZnQubmV4dChzbWFydFNoaWZ0KVxuICB9XG5cbiAgcHVibGljIHNldEludGVydmFsKGludGVydmFsOiBJbnRlcnZhbFN0YXRlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgIWludGVydmFsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9pbnRlcnZhbC5nZXRWYWx1ZSgpICYmXG4gICAgICBJbnRlcnZhbFBpY2tlclV0aWwuaXNJbnRlcnZhbEVxdWFscyh0aGlzLl9pbnRlcnZhbC5nZXRWYWx1ZSgpLCBpbnRlcnZhbClcbiAgICApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5ld0ludGVydmFsID0gaW50ZXJ2YWwgPyBJbnRlcnZhbFBpY2tlclV0aWwuc2V0TWlsbGlzZWNvbmRzVG9aZXJvKGludGVydmFsKSA6IG51bGxcblxuICAgIHRoaXMuX2ludGVydmFsLm5leHQobmV3SW50ZXJ2YWwpXG4gICAgdGhpcy5faW50ZXJ2YWxDaGFuZ2UubmV4dChuZXdJbnRlcnZhbClcbiAgfVxufVxuIl19
|
|
@@ -191,4 +191,4 @@ export default class IntervalPickerUtil {
|
|
|
191
191
|
calendarEnd.updateTodaysDate();
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwtcGlja2VyLXV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL3V0aWwvaW50ZXJ2YWwtcGlja2VyLXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUNBQXVDLENBQUE7QUFDcEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBQzVELE9BQU8sYUFBYSxNQUFNLHlCQUF5QixDQUFBO0FBRW5ELE1BQU0sQ0FBQyxPQUFPLE9BQU8sa0JBQWtCO0lBQzlCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxhQUE0QjtRQUM1RCxJQUFJLFlBQXFCLENBQUE7UUFDekIsSUFBSSxVQUFtQixDQUFBO1FBRXZCLElBQUksQ0FBQztZQUNILE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDNUYsWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDbEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxZQUFZLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3hGLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzlDLENBQUM7UUFB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QUFDO1lBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixXQUFXLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMzRSxDQUFDO1FBQ0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ1AsQ0FBQztJQUVNLE1BQU0sQ0FBQywwQkFBMEIsQ0FDdEMsYUFBNEMsRUFDNUMsV0FBMEM7UUFFMUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25DLE9BQU07UUFDUixDQUFDO1FBRUQsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDaEMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDaEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWF0Q2FsZW5kYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJ1xuaW1wb3J0IHsgSW5zdGFudCB9IGZyb20gJ0Bqcy1qb2RhL2NvcmUnXG5pbXBvcnQgeyBUZW1wb3JhbCB9IGZyb20gJ0Bqcy10ZW1wb3JhbC9wb2x5ZmlsbCdcbmltcG9ydCB7IEludGVydmFsIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL3RpbWUvaW50ZXJ2YWwnXG5pbXBvcnQgeyBUZW1wb3JhbFV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vdGltZS90ZW1wb3JhbC11dGlsJ1xuaW1wb3J0IHsgVGltZVV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vdGltZS90aW1lLXV0aWwnXG5pbXBvcnQgSW50ZXJ2YWxTdGF0ZSBmcm9tICcuLi9tb2RlbC9pbnRlcnZhbC1zdGF0ZSdcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWxQaWNrZXJVdGlsIHtcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVFbGRlckludGVydmFsKGludGVydmFsU3RhdGU6IEludGVydmFsU3RhdGUpIHtcbiAgICBsZXQgc3RhcnRJbnN0YW50OiBJbnN0YW50XG4gICAgbGV0IGVuZEluc3RhbnQ6IEluc3RhbnRcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydERhdGVUaW1lSlMgPSBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoaW50ZXJ2YWxTdGF0ZS5zdGFydERhdGVUaW1lKVxuICAgICAgc3RhcnRJbnN0YW50ID0gVGltZVV0aWwuaW5zdGFudChzdGFydERhdGVUaW1lSlMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhcnRJbnN0YW50ID0gbnVsbFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmREYXRlVGltZUpTID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKGludGVydmFsU3RhdGUuZW5kRGF0ZVRpbWUpXG4gICAgICBlbmRJbnN0YW50ID0gVGltZVV0aWwuaW5zdGFudChlbmREYXRlVGltZUpTKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVuZEluc3RhbnQgPSBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbnRlcnZhbChzdGFydEluc3RhbnQsIGVuZEluc3RhbnQpXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRyYW5zZm9ybVRvSW50ZXJ2YWxTdGF0ZShpbnRlcnZhbDogSW50ZXJ2YWwpOiBJbnRlcnZhbFN0YXRlIHtcbiAgICBpZiAoIWludGVydmFsKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0RGF0ZVRpbWVKUyA9IGludGVydmFsLnN0YXJ0ID8gVGltZVV0aWwuZGF0ZShpbnRlcnZhbC5zdGFydCkgOiBudWxsXG4gICAgY29uc3QgZW5kRGF0ZVRpbWVKUyA9IGludGVydmFsLmVuZCA/IFRpbWVVdGlsLmRhdGUoaW50ZXJ2YWwuZW5kKSA6IG51bGxcblxuICAgIGxldCBzdGFydERhdGU6IFRlbXBvcmFsLlBsYWluRGF0ZSA9IG51bGxcbiAgICBsZXQgZW5kRGF0ZTogVGVtcG9yYWwuUGxhaW5EYXRlID0gbnVsbFxuICAgIGxldCBzdGFydFRpbWU6IFRlbXBvcmFsLlBsYWluVGltZSA9IG51bGxcbiAgICBsZXQgZW5kVGltZTogVGVtcG9yYWwuUGxhaW5UaW1lID0gbnVsbFxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZVRpbWUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlVGltZUZyb21KU0RhdGUoc3RhcnREYXRlVGltZUpTKVxuICAgICAgc3RhcnREYXRlID0gc3RhcnREYXRlVGltZS50b1BsYWluRGF0ZSgpXG4gICAgICBzdGFydFRpbWUgPSBzdGFydERhdGVUaW1lLnRvUGxhaW5UaW1lKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGFydERhdGUgPSBudWxsXG4gICAgICBzdGFydFRpbWUgPSBudWxsXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZVRpbWVGcm9tSlNEYXRlKGVuZERhdGVUaW1lSlMpXG4gICAgICBlbmREYXRlID0gZW5kRGF0ZVRpbWUudG9QbGFpbkRhdGUoKVxuICAgICAgZW5kVGltZSA9IGVuZERhdGVUaW1lLnRvUGxhaW5UaW1lKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlbmREYXRlID0gbnVsbFxuICAgICAgZW5kVGltZSA9IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEludGVydmFsU3RhdGUoc3RhcnREYXRlLCBlbmREYXRlLCBzdGFydFRpbWUsIGVuZFRpbWUpXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVRlbXBvcmFsRGF0ZVRpbWUoXG4gICAgZGF0ZTogVGVtcG9yYWwuUGxhaW5EYXRlLFxuICAgIHRpbWU6IFRlbXBvcmFsLlBsYWluVGltZVxuICApOiBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUuZnJvbSh7XG4gICAgICB5ZWFyOiBkYXRlLnllYXIsXG4gICAgICBtb250aDogZGF0ZS5tb250aCxcbiAgICAgIGRheTogZGF0ZS5kYXksXG4gICAgICBob3VyOiB0aW1lLmhvdXIsXG4gICAgICBtaW51dGU6IHRpbWUubWludXRlLFxuICAgICAgc2Vjb25kOiB0aW1lLnNlY29uZCxcbiAgICAgIG1pbGxpc2Vjb25kOiB0aW1lLm1pbGxpc2Vjb25kLFxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzSW50ZXJ2YWxFcXVhbHMoaW50ZXJ2YWwxOiBJbnRlcnZhbFN0YXRlLCBpbnRlcnZhbDI6IEludGVydmFsU3RhdGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWludGVydmFsMSAmJiAhaW50ZXJ2YWwyKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICghaW50ZXJ2YWwxIHx8ICFpbnRlcnZhbDIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzRXF1YWxzKGludGVydmFsMS5zdGFydERhdGUsIGludGVydmFsMi5zdGFydERhdGUpICYmXG4gICAgICB0aGlzLmlzRXF1YWxzKGludGVydmFsMS5lbmREYXRlLCBpbnRlcnZhbDIuZW5kRGF0ZSkgJiZcbiAgICAgIHRoaXMuaXNFcXVhbHMoaW50ZXJ2YWwxLnN0YXJ0VGltZSwgaW50ZXJ2YWwyLnN0YXJ0VGltZSkgJiZcbiAgICAgIHRoaXMuaXNFcXVhbHMoaW50ZXJ2YWwxLmVuZFRpbWUsIGludGVydmFsMi5lbmRUaW1lKVxuICAgIClcbiAgfVxuXG4gIHN0YXRpYyBpc0VxdWFscyhcbiAgICB4OiBUZW1wb3JhbC5QbGFpbkRhdGUgfCBUZW1wb3JhbC5QbGFpblRpbWUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lLFxuICAgIHk6IFRlbXBvcmFsLlBsYWluRGF0ZSB8IFRlbXBvcmFsLlBsYWluVGltZSB8IFRlbXBvcmFsLlBsYWluRGF0ZVRpbWVcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF4ICYmICF5KSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHguZXF1YWxzKHkpXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzSW50ZXJ2YWxXaXRoU3RhcnRBbmRFbmQoaW50ZXJ2YWw6IEludGVydmFsU3RhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFpbnRlcnZhbD8uc3RhcnREYXRlICYmICEhaW50ZXJ2YWw/LmVuZERhdGVcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNPcGVuSW50ZXJ2YWwoaW50ZXJ2YWw6IEludGVydmFsU3RhdGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWludGVydmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgICghIWludGVydmFsLnN0YXJ0RGF0ZSAmJiAhaW50ZXJ2YWwuZW5kRGF0ZSkgfHwgKCFpbnRlcnZhbC5zdGFydERhdGUgJiYgISFpbnRlcnZhbC5lbmREYXRlKVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RGVsdGFIdW1hblJlYWRhYmxlKGludGVydmFsOiBJbnRlcnZhbFN0YXRlKTogc3RyaW5nIHtcbiAgICBpZiAoSW50ZXJ2YWxQaWNrZXJVdGlsLmlzT3BlbkludGVydmFsKGludGVydmFsKSkge1xuICAgICAgcmV0dXJuICfiiJ4nXG4gICAgfVxuXG4gICAgaWYgKCFJbnRlcnZhbFBpY2tlclV0aWwuaXNJbnRlcnZhbFdpdGhTdGFydEFuZEVuZChpbnRlcnZhbCkpIHtcbiAgICAgIHJldHVybiAnLSdcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbiA9IGludGVydmFsLnN0YXJ0RGF0ZVRpbWUudW50aWwoaW50ZXJ2YWwuZW5kRGF0ZVRpbWUpXG5cbiAgICBjb25zdCB0bXAgPSBbXVxuICAgIGlmIChkdXJhdGlvbi5kYXlzKSB7XG4gICAgICB0bXAucHVzaChgJHtkdXJhdGlvbi5kYXlzfWRgKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24uaG91cnMpIHtcbiAgICAgIHRtcC5wdXNoKGAke2R1cmF0aW9uLmhvdXJzfWhgKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24ubWludXRlcykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24ubWludXRlc31taW5gKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24uc2Vjb25kcykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24uc2Vjb25kc31zYClcbiAgICB9XG5cbiAgICBpZiAoIXRtcC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnMHMnXG4gICAgfVxuXG4gICAgcmV0dXJuIHRtcC5qb2luKCcsICcpXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFNtYXJ0U2hpZnRNZXNzYWdlKG1vZGU6IHN0cmluZywgZGF0ZUludGVydmFsOiBJbnRlcnZhbFN0YXRlKTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGVJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuICctJ1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGRhdGVJbnRlcnZhbC5zdGFydERhdGVcbiAgICBjb25zdCBlbmREYXRlID0gZGF0ZUludGVydmFsLmVuZERhdGVcblxuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICByZXR1cm4gYDF5ICgke3N0YXJ0RGF0ZS55ZWFyfSlgXG4gICAgICBjYXNlICdxdWFydGVycyc6XG4gICAgICAgIHJldHVybiBgUSR7VGVtcG9yYWxVdGlsLmdldFF1YXJ0ZXJGb3JEYXRlKHN0YXJ0RGF0ZSl9LCAke3N0YXJ0RGF0ZS55ZWFyfWBcbiAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgIHJldHVybiBgMW0gKCR7c3RhcnREYXRlLm1vbnRoQ29kZX0sICR7c3RhcnREYXRlLnllYXJ9KWBcbiAgICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgICAgcmV0dXJuIGAxdyAoQ1cgJHtzdGFydERhdGUud2Vla09mWWVhcn0sICR7ZW5kRGF0ZS55ZWFyfSlgXG4gICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgcmV0dXJuIGAke3N0YXJ0RGF0ZS51bnRpbChlbmREYXRlKS5kYXlzfWRgXG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0RGVsdGFIdW1hblJlYWRhYmxlKGRhdGVJbnRlcnZhbCl9YFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAke3N0YXJ0RGF0ZS51bnRpbChlbmREYXRlKS5kYXlzfWRgXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc1RpbWVTZXRBbmROb3RNaWRuaWdodCh0aW1lOiBUZW1wb3JhbC5QbGFpblRpbWUpOiBib29sZWFuIHtcbiAgICBpZiAoIXRpbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodGltZS5ob3VyID09PSAwICYmIHRpbWUubWludXRlID09PSAwICYmIHRpbWUuc2Vjb25kID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc2V0TWlsbGlzZWNvbmRzVG9aZXJvKGludGVydmFsOiBJbnRlcnZhbFN0YXRlKTogSW50ZXJ2YWxTdGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBJbnRlcnZhbFN0YXRlKFxuICAgICAgaW50ZXJ2YWwuc3RhcnREYXRlLFxuICAgICAgaW50ZXJ2YWwuZW5kRGF0ZSxcbiAgICAgIGludGVydmFsLnN0YXJ0VGltZS53aXRoKHsgbWlsbGlzZWNvbmQ6IDAsIG1pY3Jvc2Vjb25kOiAwLCBuYW5vc2Vjb25kOiAwIH0pLFxuICAgICAgaW50ZXJ2YWwuZW5kVGltZS53aXRoKHsgbWlsbGlzZWNvbmQ6IDAsIG1pY3Jvc2Vjb25kOiAwLCBuYW5vc2Vjb25kOiAwIH0pXG4gICAgKVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyByb3VuZFVwVG9TZWNvbmRzPFQgZXh0ZW5kcyBUZW1wb3JhbC5QbGFpblRpbWUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lPihcbiAgICB0aW1lOiBUXG4gICk6IFQge1xuICAgIHJldHVybiB0aW1lLndpdGgoe1xuICAgICAgc2Vjb25kOiB0aW1lLnNlY29uZCArIDEsXG4gICAgICBtaWxsaXNlY29uZDogMCxcbiAgICAgIG1pY3Jvc2Vjb25kOiAwLFxuICAgICAgbmFub3NlY29uZDogMCxcbiAgICB9KSBhcyBUXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHVwZGF0ZU1hdENhbGVuZGFyQWN0aXZlRGF0ZShcbiAgICBjYWxlbmRhclN0YXJ0OiBNYXRDYWxlbmRhcjxEYXRlPiB8IHVuZGVmaW5lZCxcbiAgICBjYWxlbmRhckVuZDogTWF0Q2FsZW5kYXI8RGF0ZT4gfCB1bmRlZmluZWQsXG4gICAgc3RhcnREYXRlOiBUZW1wb3JhbC5QbGFpbkRhdGUsXG4gICAgZW5kRGF0ZTogVGVtcG9yYWwuUGxhaW5EYXRlXG4gICkge1xuICAgIGlmICghY2FsZW5kYXJTdGFydCB8fCAhY2FsZW5kYXJFbmQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghc3RhcnREYXRlICYmICFlbmREYXRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIHRpbWVvdXQgaXMgbmVlZGVkIHRvIHJ1biBjYWxlbmRhciB1cGRhdGUgbGFzdCwgb3RoZXJ3aXNlIHRoZXJlIGFyZSBpc3N1ZXNcbiAgICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgICAgY2FsZW5kYXJTdGFydC5hY3RpdmVEYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHN0YXJ0RGF0ZSlcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZERhdGUpIHtcbiAgICAgICAgY2FsZW5kYXJFbmQuYWN0aXZlRGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZShlbmREYXRlKVxuICAgICAgfVxuICAgIH0sIDApXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHVwZGF0ZU1hdENhbGVuZGFyVG9kYXlEYXRlKFxuICAgIGNhbGVuZGFyU3RhcnQ6IE1hdENhbGVuZGFyPERhdGU+IHwgdW5kZWZpbmVkLFxuICAgIGNhbGVuZGFyRW5kOiBNYXRDYWxlbmRhcjxEYXRlPiB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWNhbGVuZGFyU3RhcnQgfHwgIWNhbGVuZGFyRW5kKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjYWxlbmRhclN0YXJ0LnVwZGF0ZVRvZGF5c0RhdGUoKVxuICAgIGNhbGVuZGFyRW5kLnVwZGF0ZVRvZGF5c0RhdGUoKVxuICB9XG59XG4iXX0=
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwtcGlja2VyLXV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL3V0aWwvaW50ZXJ2YWwtcGlja2VyLXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUNBQXVDLENBQUE7QUFDcEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBQzVELE9BQU8sYUFBYSxNQUFNLHlCQUF5QixDQUFBO0FBRW5ELE1BQU0sQ0FBQyxPQUFPLE9BQU8sa0JBQWtCO0lBQzlCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxhQUE0QjtRQUM1RCxJQUFJLFlBQXFCLENBQUE7UUFDekIsSUFBSSxVQUFtQixDQUFBO1FBRXZCLElBQUksQ0FBQztZQUNILE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDNUYsWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDbEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxZQUFZLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3hGLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzlDLENBQUM7UUFB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QUFDO1lBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixXQUFXLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMzRSxDQUFDO1FBQ0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ1AsQ0FBQztJQUVNLE1BQU0sQ0FBQywwQkFBMEIsQ0FDdEMsYUFBNEMsRUFDNUMsV0FBMEM7UUFFMUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25DLE9BQU07UUFDUixDQUFDO1FBRUQsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDaEMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDaEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWF0Q2FsZW5kYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJ1xuaW1wb3J0IHsgSW5zdGFudCB9IGZyb20gJ0Bqcy1qb2RhL2NvcmUnXG5pbXBvcnQgeyBUZW1wb3JhbCB9IGZyb20gJ0Bqcy10ZW1wb3JhbC9wb2x5ZmlsbCdcbmltcG9ydCB7IEludGVydmFsIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL3RpbWUvaW50ZXJ2YWwnXG5pbXBvcnQgeyBUZW1wb3JhbFV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vdGltZS90ZW1wb3JhbC11dGlsJ1xuaW1wb3J0IHsgVGltZVV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vdGltZS90aW1lLXV0aWwnXG5pbXBvcnQgSW50ZXJ2YWxTdGF0ZSBmcm9tICcuLi9tb2RlbC9pbnRlcnZhbC1zdGF0ZSdcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWxQaWNrZXJVdGlsIHtcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVFbGRlckludGVydmFsKGludGVydmFsU3RhdGU6IEludGVydmFsU3RhdGUpOiBJbnRlcnZhbCB7XG4gICAgbGV0IHN0YXJ0SW5zdGFudDogSW5zdGFudFxuICAgIGxldCBlbmRJbnN0YW50OiBJbnN0YW50XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnREYXRlVGltZUpTID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKGludGVydmFsU3RhdGUuc3RhcnREYXRlVGltZSlcbiAgICAgIHN0YXJ0SW5zdGFudCA9IFRpbWVVdGlsLmluc3RhbnQoc3RhcnREYXRlVGltZUpTKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXJ0SW5zdGFudCA9IG51bGxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5kRGF0ZVRpbWVKUyA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZShpbnRlcnZhbFN0YXRlLmVuZERhdGVUaW1lKVxuICAgICAgZW5kSW5zdGFudCA9IFRpbWVVdGlsLmluc3RhbnQoZW5kRGF0ZVRpbWVKUylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlbmRJbnN0YW50ID0gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoc3RhcnRJbnN0YW50LCBlbmRJbnN0YW50KVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0cmFuc2Zvcm1Ub0ludGVydmFsU3RhdGUoaW50ZXJ2YWw6IEludGVydmFsKTogSW50ZXJ2YWxTdGF0ZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydERhdGVUaW1lSlMgPSBpbnRlcnZhbC5zdGFydCA/IFRpbWVVdGlsLmRhdGUoaW50ZXJ2YWwuc3RhcnQpIDogbnVsbFxuICAgIGNvbnN0IGVuZERhdGVUaW1lSlMgPSBpbnRlcnZhbC5lbmQgPyBUaW1lVXRpbC5kYXRlKGludGVydmFsLmVuZCkgOiBudWxsXG5cbiAgICBsZXQgc3RhcnREYXRlOiBUZW1wb3JhbC5QbGFpbkRhdGUgPSBudWxsXG4gICAgbGV0IGVuZERhdGU6IFRlbXBvcmFsLlBsYWluRGF0ZSA9IG51bGxcbiAgICBsZXQgc3RhcnRUaW1lOiBUZW1wb3JhbC5QbGFpblRpbWUgPSBudWxsXG4gICAgbGV0IGVuZFRpbWU6IFRlbXBvcmFsLlBsYWluVGltZSA9IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydERhdGVUaW1lID0gVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZVRpbWVGcm9tSlNEYXRlKHN0YXJ0RGF0ZVRpbWVKUylcbiAgICAgIHN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZVRpbWUudG9QbGFpbkRhdGUoKVxuICAgICAgc3RhcnRUaW1lID0gc3RhcnREYXRlVGltZS50b1BsYWluVGltZSgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhcnREYXRlID0gbnVsbFxuICAgICAgc3RhcnRUaW1lID0gbnVsbFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmREYXRlVGltZSA9IFRlbXBvcmFsVXRpbC5nZXRQbGFpbkRhdGVUaW1lRnJvbUpTRGF0ZShlbmREYXRlVGltZUpTKVxuICAgICAgZW5kRGF0ZSA9IGVuZERhdGVUaW1lLnRvUGxhaW5EYXRlKClcbiAgICAgIGVuZFRpbWUgPSBlbmREYXRlVGltZS50b1BsYWluVGltZSgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZW5kRGF0ZSA9IG51bGxcbiAgICAgIGVuZFRpbWUgPSBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbnRlcnZhbFN0YXRlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgc3RhcnRUaW1lLCBlbmRUaW1lKVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVUZW1wb3JhbERhdGVUaW1lKFxuICAgIGRhdGU6IFRlbXBvcmFsLlBsYWluRGF0ZSxcbiAgICB0aW1lOiBUZW1wb3JhbC5QbGFpblRpbWVcbiAgKTogVGVtcG9yYWwuUGxhaW5EYXRlVGltZSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lLmZyb20oe1xuICAgICAgeWVhcjogZGF0ZS55ZWFyLFxuICAgICAgbW9udGg6IGRhdGUubW9udGgsXG4gICAgICBkYXk6IGRhdGUuZGF5LFxuICAgICAgaG91cjogdGltZS5ob3VyLFxuICAgICAgbWludXRlOiB0aW1lLm1pbnV0ZSxcbiAgICAgIHNlY29uZDogdGltZS5zZWNvbmQsXG4gICAgICBtaWxsaXNlY29uZDogdGltZS5taWxsaXNlY29uZCxcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ludGVydmFsRXF1YWxzKGludGVydmFsMTogSW50ZXJ2YWxTdGF0ZSwgaW50ZXJ2YWwyOiBJbnRlcnZhbFN0YXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpbnRlcnZhbDEgJiYgIWludGVydmFsMikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoIWludGVydmFsMSB8fCAhaW50ZXJ2YWwyKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0VxdWFscyhpbnRlcnZhbDEuc3RhcnREYXRlLCBpbnRlcnZhbDIuc3RhcnREYXRlKSAmJlxuICAgICAgdGhpcy5pc0VxdWFscyhpbnRlcnZhbDEuZW5kRGF0ZSwgaW50ZXJ2YWwyLmVuZERhdGUpICYmXG4gICAgICB0aGlzLmlzRXF1YWxzKGludGVydmFsMS5zdGFydFRpbWUsIGludGVydmFsMi5zdGFydFRpbWUpICYmXG4gICAgICB0aGlzLmlzRXF1YWxzKGludGVydmFsMS5lbmRUaW1lLCBpbnRlcnZhbDIuZW5kVGltZSlcbiAgICApXG4gIH1cblxuICBzdGF0aWMgaXNFcXVhbHMoXG4gICAgeDogVGVtcG9yYWwuUGxhaW5EYXRlIHwgVGVtcG9yYWwuUGxhaW5UaW1lIHwgVGVtcG9yYWwuUGxhaW5EYXRlVGltZSxcbiAgICB5OiBUZW1wb3JhbC5QbGFpbkRhdGUgfCBUZW1wb3JhbC5QbGFpblRpbWUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICgheCAmJiAheSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoIXggfHwgIXkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB4LmVxdWFscyh5KVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ludGVydmFsV2l0aFN0YXJ0QW5kRW5kKGludGVydmFsOiBJbnRlcnZhbFN0YXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhaW50ZXJ2YWw/LnN0YXJ0RGF0ZSAmJiAhIWludGVydmFsPy5lbmREYXRlXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzT3BlbkludGVydmFsKGludGVydmFsOiBJbnRlcnZhbFN0YXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAoISFpbnRlcnZhbC5zdGFydERhdGUgJiYgIWludGVydmFsLmVuZERhdGUpIHx8ICghaW50ZXJ2YWwuc3RhcnREYXRlICYmICEhaW50ZXJ2YWwuZW5kRGF0ZSlcbiAgICApXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldERlbHRhSHVtYW5SZWFkYWJsZShpbnRlcnZhbDogSW50ZXJ2YWxTdGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKEludGVydmFsUGlja2VyVXRpbC5pc09wZW5JbnRlcnZhbChpbnRlcnZhbCkpIHtcbiAgICAgIHJldHVybiAn4oieJ1xuICAgIH1cblxuICAgIGlmICghSW50ZXJ2YWxQaWNrZXJVdGlsLmlzSW50ZXJ2YWxXaXRoU3RhcnRBbmRFbmQoaW50ZXJ2YWwpKSB7XG4gICAgICByZXR1cm4gJy0nXG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBpbnRlcnZhbC5zdGFydERhdGVUaW1lLnVudGlsKGludGVydmFsLmVuZERhdGVUaW1lKVxuXG4gICAgY29uc3QgdG1wID0gW11cbiAgICBpZiAoZHVyYXRpb24uZGF5cykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24uZGF5c31kYClcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uLmhvdXJzKSB7XG4gICAgICB0bXAucHVzaChgJHtkdXJhdGlvbi5ob3Vyc31oYClcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uLm1pbnV0ZXMpIHtcbiAgICAgIHRtcC5wdXNoKGAke2R1cmF0aW9uLm1pbnV0ZXN9bWluYClcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uLnNlY29uZHMpIHtcbiAgICAgIHRtcC5wdXNoKGAke2R1cmF0aW9uLnNlY29uZHN9c2ApXG4gICAgfVxuXG4gICAgaWYgKCF0bXAubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJzBzJ1xuICAgIH1cblxuICAgIHJldHVybiB0bXAuam9pbignLCAnKVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRTbWFydFNoaWZ0TWVzc2FnZShtb2RlOiBzdHJpbmcsIGRhdGVJbnRlcnZhbDogSW50ZXJ2YWxTdGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlSW50ZXJ2YWwpIHtcbiAgICAgIHJldHVybiAnLSdcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydERhdGUgPSBkYXRlSW50ZXJ2YWwuc3RhcnREYXRlXG4gICAgY29uc3QgZW5kRGF0ZSA9IGRhdGVJbnRlcnZhbC5lbmREYXRlXG5cbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgcmV0dXJuIGAxeSAoJHtzdGFydERhdGUueWVhcn0pYFxuICAgICAgY2FzZSAncXVhcnRlcnMnOlxuICAgICAgICByZXR1cm4gYFEke1RlbXBvcmFsVXRpbC5nZXRRdWFydGVyRm9yRGF0ZShzdGFydERhdGUpfSwgJHtzdGFydERhdGUueWVhcn1gXG4gICAgICBjYXNlICdtb250aHMnOlxuICAgICAgICByZXR1cm4gYDFtICgke3N0YXJ0RGF0ZS5tb250aENvZGV9LCAke3N0YXJ0RGF0ZS55ZWFyfSlgXG4gICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIHJldHVybiBgMXcgKENXICR7c3RhcnREYXRlLndlZWtPZlllYXJ9LCAke2VuZERhdGUueWVhcn0pYFxuICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIHJldHVybiBgJHtzdGFydERhdGUudW50aWwoZW5kRGF0ZSkuZGF5c31kYFxuICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmdldERlbHRhSHVtYW5SZWFkYWJsZShkYXRlSW50ZXJ2YWwpfWBcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtzdGFydERhdGUudW50aWwoZW5kRGF0ZSkuZGF5c31kYFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNUaW1lU2V0QW5kTm90TWlkbmlnaHQodGltZTogVGVtcG9yYWwuUGxhaW5UaW1lKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKHRpbWUuaG91ciA9PT0gMCAmJiB0aW1lLm1pbnV0ZSA9PT0gMCAmJiB0aW1lLnNlY29uZCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNldE1pbGxpc2Vjb25kc1RvWmVybyhpbnRlcnZhbDogSW50ZXJ2YWxTdGF0ZSk6IEludGVydmFsU3RhdGUge1xuICAgIHJldHVybiBuZXcgSW50ZXJ2YWxTdGF0ZShcbiAgICAgIGludGVydmFsLnN0YXJ0RGF0ZSxcbiAgICAgIGludGVydmFsLmVuZERhdGUsXG4gICAgICBpbnRlcnZhbC5zdGFydFRpbWUud2l0aCh7IG1pbGxpc2Vjb25kOiAwLCBtaWNyb3NlY29uZDogMCwgbmFub3NlY29uZDogMCB9KSxcbiAgICAgIGludGVydmFsLmVuZFRpbWUud2l0aCh7IG1pbGxpc2Vjb25kOiAwLCBtaWNyb3NlY29uZDogMCwgbmFub3NlY29uZDogMCB9KVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcm91bmRVcFRvU2Vjb25kczxUIGV4dGVuZHMgVGVtcG9yYWwuUGxhaW5UaW1lIHwgVGVtcG9yYWwuUGxhaW5EYXRlVGltZT4oXG4gICAgdGltZTogVFxuICApOiBUIHtcbiAgICByZXR1cm4gdGltZS53aXRoKHtcbiAgICAgIHNlY29uZDogdGltZS5zZWNvbmQgKyAxLFxuICAgICAgbWlsbGlzZWNvbmQ6IDAsXG4gICAgICBtaWNyb3NlY29uZDogMCxcbiAgICAgIG5hbm9zZWNvbmQ6IDAsXG4gICAgfSkgYXMgVFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB1cGRhdGVNYXRDYWxlbmRhckFjdGl2ZURhdGUoXG4gICAgY2FsZW5kYXJTdGFydDogTWF0Q2FsZW5kYXI8RGF0ZT4gfCB1bmRlZmluZWQsXG4gICAgY2FsZW5kYXJFbmQ6IE1hdENhbGVuZGFyPERhdGU+IHwgdW5kZWZpbmVkLFxuICAgIHN0YXJ0RGF0ZTogVGVtcG9yYWwuUGxhaW5EYXRlLFxuICAgIGVuZERhdGU6IFRlbXBvcmFsLlBsYWluRGF0ZVxuICApOiB2b2lkIHtcbiAgICBpZiAoIWNhbGVuZGFyU3RhcnQgfHwgIWNhbGVuZGFyRW5kKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXN0YXJ0RGF0ZSAmJiAhZW5kRGF0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyB0aW1lb3V0IGlzIG5lZWRlZCB0byBydW4gY2FsZW5kYXIgdXBkYXRlIGxhc3QsIG90aGVyd2lzZSB0aGVyZSBhcmUgaXNzdWVzXG4gICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgIGNhbGVuZGFyU3RhcnQuYWN0aXZlRGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZShzdGFydERhdGUpXG4gICAgICB9XG5cbiAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgIGNhbGVuZGFyRW5kLmFjdGl2ZURhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoZW5kRGF0ZSlcbiAgICAgIH1cbiAgICB9LCAwKVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB1cGRhdGVNYXRDYWxlbmRhclRvZGF5RGF0ZShcbiAgICBjYWxlbmRhclN0YXJ0OiBNYXRDYWxlbmRhcjxEYXRlPiB8IHVuZGVmaW5lZCxcbiAgICBjYWxlbmRhckVuZDogTWF0Q2FsZW5kYXI8RGF0ZT4gfCB1bmRlZmluZWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFjYWxlbmRhclN0YXJ0IHx8ICFjYWxlbmRhckVuZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2FsZW5kYXJTdGFydC51cGRhdGVUb2RheXNEYXRlKClcbiAgICBjYWxlbmRhckVuZC51cGRhdGVUb2RheXNEYXRlKClcbiAgfVxufVxuIl19
|
|
@@ -8603,8 +8603,8 @@ class ElderMultiTranslateHttpLoader {
|
|
|
8603
8603
|
this._resourcesPrefix = _resourcesPrefix;
|
|
8604
8604
|
}
|
|
8605
8605
|
getTranslation(lang) {
|
|
8606
|
-
const requests = this._resourcesPrefix.map((
|
|
8607
|
-
resource =
|
|
8606
|
+
const requests = this._resourcesPrefix.map((resourceArg) => {
|
|
8607
|
+
const resource = resourceArg;
|
|
8608
8608
|
let path;
|
|
8609
8609
|
if (resource.prefix) {
|
|
8610
8610
|
path = `${resource.prefix}${lang}${resource.suffix || '.json'}`;
|
|
@@ -8633,7 +8633,7 @@ function simpleDeepMerge(target, source) {
|
|
|
8633
8633
|
return target;
|
|
8634
8634
|
}
|
|
8635
8635
|
const output = { ...target };
|
|
8636
|
-
Object.keys(source).forEach(key => {
|
|
8636
|
+
Object.keys(source).forEach((key) => {
|
|
8637
8637
|
if (Array.isArray(source[key])) {
|
|
8638
8638
|
output[key] = [...(target[key] || []), ...source[key]];
|
|
8639
8639
|
}
|
|
@@ -28882,6 +28882,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
|
|
|
28882
28882
|
}]
|
|
28883
28883
|
}] });
|
|
28884
28884
|
|
|
28885
|
+
const booleanTransformFn = (input) => coerceBooleanProperty(input);
|
|
28886
|
+
|
|
28885
28887
|
class IntervalState {
|
|
28886
28888
|
constructor(startDate, endDate, startTime, endTime) {
|
|
28887
28889
|
this.startDate = startDate;
|
|
@@ -29420,10 +29422,10 @@ class IntervalShiftController {
|
|
|
29420
29422
|
}
|
|
29421
29423
|
const duration = state.duration;
|
|
29422
29424
|
const interval = this.manager.intervalValue;
|
|
29423
|
-
|
|
29425
|
+
const newStartDateTime = direction === 1
|
|
29424
29426
|
? interval.startDateTime.add(duration)
|
|
29425
29427
|
: interval.startDateTime.subtract(duration);
|
|
29426
|
-
|
|
29428
|
+
const newEndDateTime = direction === 1 ? interval.endDateTime.add(duration) : interval.endDateTime.subtract(duration);
|
|
29427
29429
|
const newInterval = IntervalState.createFromDateTimes(newStartDateTime, newEndDateTime);
|
|
29428
29430
|
this.manager.setInterval(newInterval);
|
|
29429
29431
|
}
|
|
@@ -29658,12 +29660,11 @@ class ElderIntervalPickerComponent {
|
|
|
29658
29660
|
* *
|
|
29659
29661
|
**************************************************************************/
|
|
29660
29662
|
this.log = LoggerFactory.getLogger(this.constructor.name);
|
|
29661
|
-
this.
|
|
29662
|
-
this.
|
|
29663
|
-
this.emitType = 'interval';
|
|
29663
|
+
this.emitType = input('interval');
|
|
29664
|
+
this.autoEmitMode = input(true, { transform: booleanTransformFn });
|
|
29664
29665
|
this.intervalInputMode = input('date-time-range');
|
|
29665
|
-
this.showAnchor = input(false);
|
|
29666
|
-
this.anchorReadOnly = input(false);
|
|
29666
|
+
this.showAnchor = input(false, { transform: booleanTransformFn });
|
|
29667
|
+
this.anchorReadOnly = input(false, { transform: booleanTransformFn });
|
|
29667
29668
|
this.externalAnchorDateTime = input(Temporal.Now.plainDateTimeISO());
|
|
29668
29669
|
this.externalInterval = input(null);
|
|
29669
29670
|
this.manager = new IntervalPickerStateManager();
|
|
@@ -29677,7 +29678,7 @@ class ElderIntervalPickerComponent {
|
|
|
29677
29678
|
return null;
|
|
29678
29679
|
}
|
|
29679
29680
|
const elderInterval = IntervalPickerUtil.createElderInterval(srcInterval);
|
|
29680
|
-
if (this.emitType === 'iso') {
|
|
29681
|
+
if (this.emitType() === 'iso') {
|
|
29681
29682
|
console.log('emitting type iso', coerceIntervalIsoStr(elderInterval));
|
|
29682
29683
|
return coerceIntervalIsoStr(elderInterval);
|
|
29683
29684
|
}
|
|
@@ -29706,10 +29707,6 @@ class ElderIntervalPickerComponent {
|
|
|
29706
29707
|
* Life Cycle *
|
|
29707
29708
|
* *
|
|
29708
29709
|
**************************************************************************/
|
|
29709
|
-
ngOnInit() { }
|
|
29710
|
-
ngOnDestroy() {
|
|
29711
|
-
this.removeEventListeners();
|
|
29712
|
-
}
|
|
29713
29710
|
ngAfterViewInit() {
|
|
29714
29711
|
this.setupDateInputCalendarFocusPrevention();
|
|
29715
29712
|
setTimeout(() => {
|
|
@@ -29718,6 +29715,9 @@ class ElderIntervalPickerComponent {
|
|
|
29718
29715
|
console.log('externalInterval', this.externalInterval());
|
|
29719
29716
|
}, 0);
|
|
29720
29717
|
}
|
|
29718
|
+
ngOnDestroy() {
|
|
29719
|
+
this.removeEventListeners();
|
|
29720
|
+
}
|
|
29721
29721
|
/***************************************************************************
|
|
29722
29722
|
* *
|
|
29723
29723
|
* Private methods *
|
|
@@ -29766,7 +29766,7 @@ class ElderIntervalPickerComponent {
|
|
|
29766
29766
|
}
|
|
29767
29767
|
}
|
|
29768
29768
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderIntervalPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
29769
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: ElderIntervalPickerComponent, isStandalone: true, selector: "elder-interval-picker", inputs: { autoEmitMode: { classPropertyName: "autoEmitMode", publicName: "autoEmitMode", isSignal: false, isRequired: false, transformFunction: null }, emitOnChange: { classPropertyName: "emitOnChange", publicName: "emitOnChange", isSignal: false, isRequired: false, transformFunction: null }, emitType: { classPropertyName: "emitType", publicName: "emitType", isSignal: false, isRequired: false, transformFunction: null }, intervalInputMode: { classPropertyName: "intervalInputMode", publicName: "intervalInputMode", isSignal: true, isRequired: false, transformFunction: null }, showAnchor: { classPropertyName: "showAnchor", publicName: "showAnchor", isSignal: true, isRequired: false, transformFunction: null }, anchorReadOnly: { classPropertyName: "anchorReadOnly", publicName: "anchorReadOnly", isSignal: true, isRequired: false, transformFunction: null }, externalAnchorDateTime: { classPropertyName: "externalAnchorDateTime", publicName: "externalAnchorDateTime", isSignal: true, isRequired: false, transformFunction: null }, externalInterval: { classPropertyName: "externalInterval", publicName: "externalInterval", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { intervalChange: "intervalChange" }, providers: [{ provide: DateAdapter, useClass: CustomDateAdapter }], viewQueries: [{ propertyName: "calendarStart", first: true, predicate: ["rangeCalendarStart"], descendants: true }, { propertyName: "calendarEnd", first: true, predicate: ["rangeCalendarEnd"], descendants: true }, { propertyName: "calendarStartElRef", first: true, predicate: ["rangeCalendarStart"], descendants: true, read: ElementRef }, { propertyName: "calendarEndElRef", first: true, predicate: ["rangeCalendarEnd"], descendants: true, read: ElementRef }, { propertyName: "startDateInput", first: true, predicate: ["startDateInput"], descendants: true }, { propertyName: "endDateInput", first: true, predicate: ["endDateInput"], descendants: true }], ngImport: i0, template: "<div class=\"interval-picker-component p-md layout-col gap-xxl\">\n <div class=\"layout-row gap-xxl place-between-start\" style=\"gap: 5%\">\n <div class=\"layout-col gap-md pt-xs\">\n <div class=\"layout-col\">\n <div class=\"layout-row select-buttons-container gap-sm\">\n <div class=\"layout-col gap-xs place-start-stretch\">\n <button mat-button (click)=\"controller.select.selectCurrentDay()\">\n @if (presenter.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.anchorDay' | translate }}\n } @else {\n {{ 'intervalPicker.today' | translate }}\n }\n </button>\n <button mat-button (click)=\"controller.select.selectYesterday()\">\n @if (presenter.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.last' | translate }} 1 {{ 'intervalPicker.day' | translate }}\n } @else {\n {{ 'intervalPicker.yesterday' | translate }}\n }\n </button>\n <button mat-button (click)=\"controller.select.selectLastSevenDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 7\n {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLastThirtyDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 30\n {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLast365daysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 365\n {{ 'intervalPicker.days' | translate }}\n </button>\n @if (intervalInputMode() === 'date-time-range') {\n <div class=\"pt-sm\"></div>\n <button mat-button (click)=\"controller.select.selectLastFiveMinutes()\">\n {{ 'intervalPicker.last' | translate }} 5\n {{ 'intervalPicker.minutes' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLastHour()\">\n {{ 'intervalPicker.last' | translate }} {{ 'intervalPicker.hour' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLast24Hours()\">\n {{ 'intervalPicker.last' | translate }} 24\n {{ 'intervalPicker.hours' | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"layout-col\">\n <!-- smart shift -->\n <div class=\"layout-row place-around-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.smartShift(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ presenter.smartShiftMessage() }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.smartShift(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- calendars and input controls -->\n <div\n class=\"layout-row place-around-center\"\n style=\"align-items: flex-start; min-height: 280px\"\n >\n <mat-calendar\n #rangeCalendarStart\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"presenter.dateRangeForCalendar()\"\n (selectedChange)=\"controller.calendar.setStartDateFromJSDate($event)\"\n [maxDate]=\"presenter.endDateTimeAsJSDate()\"\n [dateClass]=\"presenter.calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n <mat-calendar\n #rangeCalendarEnd\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"presenter.dateRangeForCalendar()\"\n (selectedChange)=\"controller.calendar.setEndDateFromJSDate($event)\"\n [minDate]=\"presenter.startDateTimeAsJSDate()\"\n [dateClass]=\"presenter.calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n </div>\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"startDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.startDateHtmlString()\"\n (ngModelChange)=\"controller.form.setStartDateFromString($event)\"\n />\n </mat-form-field>\n </div>\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endDate' | translate }}</mat-label>\n <input\n #endDateInput\n name=\"endDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.endDateHtmlString()\"\n (ngModelChange)=\"controller.form.setEndDateFromString($event)\"\n />\n </mat-form-field>\n </div>\n </div>\n @if (intervalInputMode() === 'date-time-range') {\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startTime' | translate }}</mat-label>\n <input\n name=\"startTimeInput\"\n matInput\n type=\"time\"\n #startTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"presenter.startTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setStartTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.clearStartTime()\"\n [disabled]=\"!presenter.isStartTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endTime' | translate }}</mat-label>\n <input\n name=\"endTimeInput\"\n matInput\n type=\"time\"\n #endTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"presenter.endTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setEndTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.clearEndTime()\"\n [disabled]=\"!presenter.isEndTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n <br />\n </div>\n <div class=\"pt-xs\" style=\"width: 25%\">\n <div class=\"layout-col gap-lg\">\n <div class=\"layout-col gap-xs place-start-start\">\n <!-- select current -->\n <button mat-button (click)=\"controller.select.selectCurrentWeek()\">\n {{ 'intervalPicker.currentPeriod.week' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentMonth()\">\n {{ 'intervalPicker.currentPeriod.month' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentQuarter()\">\n {{ 'intervalPicker.currentPeriod.quarter' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentYear()\">\n {{ 'intervalPicker.currentPeriod.year' | translate }}\n </button>\n </div>\n <div class=\"fixed-shifts-container\">\n <div class=\"layout-col place-start-stretch\">\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftDay(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.day' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftDay(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMonth(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.month' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMonth(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftYear(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.year' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftYear(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n\n @if (true) {\n <!-- shift minute -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMinute(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.minute' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMinute(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- shift hour -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftHour(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.hour' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftHour(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"layout-row place-between-center gap-xxl pt-sm\">\n <div>\n @if (showAnchor()) {\n <div class=\"layout-row flex-none gap-md\">\n <mat-menu #anchorMenu=\"matMenu\">\n @if (presenter.startDateHtmlString()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.setFixedAnchorPointToEndDateTime()\"\n [disabled]=\"!presenter.startDateHtmlString()\"\n >\n <mat-icon class=\"material-symbols-outlined\">login</mat-icon>\n <span>{{ 'intervalPicker.endDate' | translate }}</span>\n </button>\n }\n @if (presenter.endDateHtmlString()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.setFixedAnchorPointToStartDateTime()\"\n [disabled]=\"!presenter.endDateHtmlString()\"\n >\n <mat-icon class=\"material-symbols-outlined\">logout</mat-icon>\n <span>{{ 'intervalPicker.startDate' | translate }}</span>\n </button>\n }\n @if (presenter.isFixedAnchorDateSet()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.resetAnchor()\"\n [disabled]=\"!presenter.isFixedAnchorDateSet() || anchorReadOnly()\"\n >\n <mat-icon>close</mat-icon>\n <span>{{ 'intervalPicker.clear' | translate }}</span>\n </button>\n }\n </mat-menu>\n\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"anchorDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.anchorDateHtmlString()\"\n (ngModelChange)=\"controller.form.setAnchorDateFromString($event)\"\n [readonly]=\"anchorReadOnly()\"\n />\n @if (!anchorReadOnly()) {\n <button mat-icon-button matSuffix [matMenuTriggerFor]=\"anchorMenu\" [disabled]=\"presenter.isAnchorMenuDisabled()\">\n <mat-icon class=\"material-symbols-outlined\">more_horiz</mat-icon>\n </button>\n }\n </mat-form-field>\n @if (intervalInputMode() === 'date-time-range') {\n <mat-form-field class=\"input-control-container-short\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorTime' | translate }}</mat-label>\n <input\n matInput\n name=\"anchorTimeInput\"\n type=\"time\"\n #anchorTimeControl=\"ngModel\"\n step=\"1\"\n [readonly]=\"anchorReadOnly()\"\n [ngModel]=\"presenter.anchorTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setAnchorTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.anchor.resetAnchorTime()\"\n [disabled]=\"anchorReadOnly() || presenter.isAnchorTimeMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n </div>\n }\n </div>\n <!-- result interval -->\n <div class=\"layout-col place-center-center\">\n <div class=\"date-interval mat-caption pt-xs\">\n @if (presenter.startDateTimeAsJSDate()) {\n {{ presenter.startDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.startDateNotSet' | translate }}\n }\n <span> - </span>\n @if (presenter.endDateTimeAsJSDate()) {\n {{ presenter.endDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.endDateNotSet' | translate }}\n }\n </div>\n <div>\n <span class=\"mat-caption\">{{ presenter.deltaHumanReadable() || ' ' }}</span>\n </div>\n </div>\n <div class=\"layout-row gap-lg\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"controller.clearInterval()\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n {{ 'intervalPicker.clear' | translate }}\n </button>\n\n @if (!this.autoEmitMode) {\n <button color=\"primary\" mat-raised-button (click)=\"controller.manualEmit()\">\n {{ 'actions.ok' | translate }}\n </button>\n }\n </div>\n</div>\n", styles: [".interval-picker-component{min-width:840px;max-width:100%}.fixed-shifts-container{max-width:160px}.input-control-container{width:192px;max-width:100%}.input-control-container-short{width:140px;max-width:100%}.select-buttons-container button{white-space:nowrap;text-align:left;justify-content:flex-start}::ng-deep .interval-picker-component .mat-calendar-body-cell.elder-custom-anchor-date .mat-calendar-body-cell-content{border-radius:50%;background-color:#def;background-color:#b4d2ebbf}\n"], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i1$c.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$a.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$a.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$a.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2$1.DatePipe, name: "date" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
29769
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: ElderIntervalPickerComponent, isStandalone: true, selector: "elder-interval-picker", inputs: { emitType: { classPropertyName: "emitType", publicName: "emitType", isSignal: true, isRequired: false, transformFunction: null }, autoEmitMode: { classPropertyName: "autoEmitMode", publicName: "autoEmitMode", isSignal: true, isRequired: false, transformFunction: null }, intervalInputMode: { classPropertyName: "intervalInputMode", publicName: "intervalInputMode", isSignal: true, isRequired: false, transformFunction: null }, showAnchor: { classPropertyName: "showAnchor", publicName: "showAnchor", isSignal: true, isRequired: false, transformFunction: null }, anchorReadOnly: { classPropertyName: "anchorReadOnly", publicName: "anchorReadOnly", isSignal: true, isRequired: false, transformFunction: null }, externalAnchorDateTime: { classPropertyName: "externalAnchorDateTime", publicName: "externalAnchorDateTime", isSignal: true, isRequired: false, transformFunction: null }, externalInterval: { classPropertyName: "externalInterval", publicName: "externalInterval", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { intervalChange: "intervalChange" }, providers: [{ provide: DateAdapter, useClass: CustomDateAdapter }], viewQueries: [{ propertyName: "calendarStart", first: true, predicate: ["rangeCalendarStart"], descendants: true }, { propertyName: "calendarEnd", first: true, predicate: ["rangeCalendarEnd"], descendants: true }, { propertyName: "calendarStartElRef", first: true, predicate: ["rangeCalendarStart"], descendants: true, read: ElementRef }, { propertyName: "calendarEndElRef", first: true, predicate: ["rangeCalendarEnd"], descendants: true, read: ElementRef }, { propertyName: "startDateInput", first: true, predicate: ["startDateInput"], descendants: true }, { propertyName: "endDateInput", first: true, predicate: ["endDateInput"], descendants: true }], ngImport: i0, template: "<div class=\"interval-picker-component p-md layout-col gap-xxl\">\n <div class=\"layout-row gap-xxl place-between-start\" style=\"gap: 5%\">\n <div class=\"layout-col gap-md pt-xs\">\n <div class=\"layout-col\">\n <div class=\"layout-row select-buttons-container gap-sm\">\n <div class=\"layout-col gap-xs place-start-stretch\">\n <button mat-button (click)=\"controller.select.selectCurrentDay()\">\n @if (presenter.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.anchorDay' | translate }}\n } @else {\n {{ 'intervalPicker.today' | translate }}\n }\n </button>\n <button mat-button (click)=\"controller.select.selectYesterday()\">\n @if (presenter.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.last' | translate }} 1 {{ 'intervalPicker.day' | translate }}\n } @else {\n {{ 'intervalPicker.yesterday' | translate }}\n }\n </button>\n <button mat-button (click)=\"controller.select.selectLastSevenDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 7\n {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLastThirtyDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 30\n {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLast365daysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 365\n {{ 'intervalPicker.days' | translate }}\n </button>\n @if (intervalInputMode() === 'date-time-range') {\n <div class=\"pt-sm\"></div>\n <button mat-button (click)=\"controller.select.selectLastFiveMinutes()\">\n {{ 'intervalPicker.last' | translate }} 5\n {{ 'intervalPicker.minutes' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLastHour()\">\n {{ 'intervalPicker.last' | translate }} {{ 'intervalPicker.hour' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLast24Hours()\">\n {{ 'intervalPicker.last' | translate }} 24\n {{ 'intervalPicker.hours' | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"layout-col\">\n <!-- smart shift -->\n <div class=\"layout-row place-around-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.smartShift(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ presenter.smartShiftMessage() }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.smartShift(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- calendars and input controls -->\n <div\n class=\"layout-row place-around-center\"\n style=\"align-items: flex-start; min-height: 280px\"\n >\n <mat-calendar\n #rangeCalendarStart\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"presenter.dateRangeForCalendar()\"\n (selectedChange)=\"controller.calendar.setStartDateFromJSDate($event)\"\n [maxDate]=\"presenter.endDateTimeAsJSDate()\"\n [dateClass]=\"presenter.calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n <mat-calendar\n #rangeCalendarEnd\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"presenter.dateRangeForCalendar()\"\n (selectedChange)=\"controller.calendar.setEndDateFromJSDate($event)\"\n [minDate]=\"presenter.startDateTimeAsJSDate()\"\n [dateClass]=\"presenter.calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n </div>\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"startDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.startDateHtmlString()\"\n (ngModelChange)=\"controller.form.setStartDateFromString($event)\"\n />\n </mat-form-field>\n </div>\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endDate' | translate }}</mat-label>\n <input\n #endDateInput\n name=\"endDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.endDateHtmlString()\"\n (ngModelChange)=\"controller.form.setEndDateFromString($event)\"\n />\n </mat-form-field>\n </div>\n </div>\n @if (intervalInputMode() === 'date-time-range') {\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startTime' | translate }}</mat-label>\n <input\n name=\"startTimeInput\"\n matInput\n type=\"time\"\n #startTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"presenter.startTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setStartTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.clearStartTime()\"\n [disabled]=\"!presenter.isStartTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endTime' | translate }}</mat-label>\n <input\n name=\"endTimeInput\"\n matInput\n type=\"time\"\n #endTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"presenter.endTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setEndTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.clearEndTime()\"\n [disabled]=\"!presenter.isEndTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n <br />\n </div>\n <div class=\"pt-xs\" style=\"width: 25%\">\n <div class=\"layout-col gap-lg\">\n <div class=\"layout-col gap-xs place-start-start\">\n <!-- select current -->\n <button mat-button (click)=\"controller.select.selectCurrentWeek()\">\n {{ 'intervalPicker.currentPeriod.week' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentMonth()\">\n {{ 'intervalPicker.currentPeriod.month' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentQuarter()\">\n {{ 'intervalPicker.currentPeriod.quarter' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentYear()\">\n {{ 'intervalPicker.currentPeriod.year' | translate }}\n </button>\n </div>\n <div class=\"fixed-shifts-container\">\n <div class=\"layout-col place-start-stretch\">\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftDay(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.day' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftDay(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMonth(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.month' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMonth(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftYear(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.year' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftYear(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n\n @if (true) {\n <!-- shift minute -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMinute(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.minute' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMinute(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- shift hour -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftHour(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.hour' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftHour(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"layout-row place-between-center gap-xxl pt-sm\">\n <div>\n @if (showAnchor()) {\n <div class=\"layout-row flex-none gap-md\">\n <mat-menu #anchorMenu=\"matMenu\">\n @if (presenter.startDateHtmlString()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.setFixedAnchorPointToEndDateTime()\"\n [disabled]=\"!presenter.startDateHtmlString()\"\n >\n <mat-icon class=\"material-symbols-outlined\">login</mat-icon>\n <span>{{ 'intervalPicker.endDate' | translate }}</span>\n </button>\n }\n @if (presenter.endDateHtmlString()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.setFixedAnchorPointToStartDateTime()\"\n [disabled]=\"!presenter.endDateHtmlString()\"\n >\n <mat-icon class=\"material-symbols-outlined\">logout</mat-icon>\n <span>{{ 'intervalPicker.startDate' | translate }}</span>\n </button>\n }\n @if (presenter.isFixedAnchorDateSet()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.resetAnchor()\"\n [disabled]=\"!presenter.isFixedAnchorDateSet() || anchorReadOnly()\"\n >\n <mat-icon>close</mat-icon>\n <span>{{ 'intervalPicker.clear' | translate }}</span>\n </button>\n }\n </mat-menu>\n\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"anchorDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.anchorDateHtmlString()\"\n (ngModelChange)=\"controller.form.setAnchorDateFromString($event)\"\n [readonly]=\"anchorReadOnly()\"\n />\n @if (!anchorReadOnly()) {\n <button\n mat-icon-button\n matSuffix\n [matMenuTriggerFor]=\"anchorMenu\"\n [disabled]=\"presenter.isAnchorMenuDisabled()\"\n >\n <mat-icon class=\"material-symbols-outlined\">more_horiz</mat-icon>\n </button>\n }\n </mat-form-field>\n @if (intervalInputMode() === 'date-time-range') {\n <mat-form-field class=\"input-control-container-short\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorTime' | translate }}</mat-label>\n <input\n matInput\n name=\"anchorTimeInput\"\n type=\"time\"\n #anchorTimeControl=\"ngModel\"\n step=\"1\"\n [readonly]=\"anchorReadOnly()\"\n [ngModel]=\"presenter.anchorTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setAnchorTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.anchor.resetAnchorTime()\"\n [disabled]=\"anchorReadOnly() || presenter.isAnchorTimeMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n </div>\n }\n </div>\n <!-- result interval -->\n <div class=\"layout-col place-center-center\">\n <div class=\"date-interval mat-caption pt-xs\">\n @if (presenter.startDateTimeAsJSDate()) {\n {{ presenter.startDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.startDateNotSet' | translate }}\n }\n <span> - </span>\n @if (presenter.endDateTimeAsJSDate()) {\n {{ presenter.endDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.endDateNotSet' | translate }}\n }\n </div>\n <div>\n <span class=\"mat-caption\">{{ presenter.deltaHumanReadable() || ' ' }}</span>\n </div>\n </div>\n <div class=\"layout-row gap-lg\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"controller.clearInterval()\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n {{ 'intervalPicker.clear' | translate }}\n </button>\n\n @if (!this.autoEmitMode()) {\n <button color=\"primary\" mat-raised-button (click)=\"controller.manualEmit()\">\n {{ 'actions.ok' | translate }}\n </button>\n }\n </div>\n</div>\n", styles: [".interval-picker-component{min-width:840px;max-width:100%}.fixed-shifts-container{max-width:160px}.input-control-container{width:192px;max-width:100%}.input-control-container-short{width:140px;max-width:100%}.select-buttons-container button{white-space:nowrap;text-align:left;justify-content:flex-start}::ng-deep .interval-picker-component .mat-calendar-body-cell.elder-custom-anchor-date .mat-calendar-body-cell-content{border-radius:50%;background-color:#def;background-color:#b4d2ebbf}\n"], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i1$c.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$a.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$a.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$a.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2$1.DatePipe, name: "date" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
29770
29770
|
}
|
|
29771
29771
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderIntervalPickerComponent, decorators: [{
|
|
29772
29772
|
type: Component,
|
|
@@ -29788,16 +29788,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
|
|
|
29788
29788
|
TranslateModule,
|
|
29789
29789
|
MatMenuModule,
|
|
29790
29790
|
ElderIntervalInputComponent,
|
|
29791
|
-
MatMenuModule,
|
|
29792
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: DateAdapter, useClass: CustomDateAdapter }], template: "<div class=\"interval-picker-component p-md layout-col gap-xxl\">\n <div class=\"layout-row gap-xxl place-between-start\" style=\"gap: 5%\">\n <div class=\"layout-col gap-md pt-xs\">\n <div class=\"layout-col\">\n <div class=\"layout-row select-buttons-container gap-sm\">\n <div class=\"layout-col gap-xs place-start-stretch\">\n <button mat-button (click)=\"controller.select.selectCurrentDay()\">\n @if (presenter.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.anchorDay' | translate }}\n } @else {\n {{ 'intervalPicker.today' | translate }}\n }\n </button>\n <button mat-button (click)=\"controller.select.selectYesterday()\">\n @if (presenter.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.last' | translate }} 1 {{ 'intervalPicker.day' | translate }}\n } @else {\n {{ 'intervalPicker.yesterday' | translate }}\n }\n </button>\n <button mat-button (click)=\"controller.select.selectLastSevenDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 7\n {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLastThirtyDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 30\n {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLast365daysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 365\n {{ 'intervalPicker.days' | translate }}\n </button>\n @if (intervalInputMode() === 'date-time-range') {\n <div class=\"pt-sm\"></div>\n <button mat-button (click)=\"controller.select.selectLastFiveMinutes()\">\n {{ 'intervalPicker.last' | translate }} 5\n {{ 'intervalPicker.minutes' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLastHour()\">\n {{ 'intervalPicker.last' | translate }} {{ 'intervalPicker.hour' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLast24Hours()\">\n {{ 'intervalPicker.last' | translate }} 24\n {{ 'intervalPicker.hours' | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"layout-col\">\n <!-- smart shift -->\n <div class=\"layout-row place-around-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.smartShift(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ presenter.smartShiftMessage() }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.smartShift(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- calendars and input controls -->\n <div\n class=\"layout-row place-around-center\"\n style=\"align-items: flex-start; min-height: 280px\"\n >\n <mat-calendar\n #rangeCalendarStart\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"presenter.dateRangeForCalendar()\"\n (selectedChange)=\"controller.calendar.setStartDateFromJSDate($event)\"\n [maxDate]=\"presenter.endDateTimeAsJSDate()\"\n [dateClass]=\"presenter.calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n <mat-calendar\n #rangeCalendarEnd\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"presenter.dateRangeForCalendar()\"\n (selectedChange)=\"controller.calendar.setEndDateFromJSDate($event)\"\n [minDate]=\"presenter.startDateTimeAsJSDate()\"\n [dateClass]=\"presenter.calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n </div>\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"startDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.startDateHtmlString()\"\n (ngModelChange)=\"controller.form.setStartDateFromString($event)\"\n />\n </mat-form-field>\n </div>\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endDate' | translate }}</mat-label>\n <input\n #endDateInput\n name=\"endDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.endDateHtmlString()\"\n (ngModelChange)=\"controller.form.setEndDateFromString($event)\"\n />\n </mat-form-field>\n </div>\n </div>\n @if (intervalInputMode() === 'date-time-range') {\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startTime' | translate }}</mat-label>\n <input\n name=\"startTimeInput\"\n matInput\n type=\"time\"\n #startTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"presenter.startTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setStartTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.clearStartTime()\"\n [disabled]=\"!presenter.isStartTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endTime' | translate }}</mat-label>\n <input\n name=\"endTimeInput\"\n matInput\n type=\"time\"\n #endTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"presenter.endTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setEndTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.clearEndTime()\"\n [disabled]=\"!presenter.isEndTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n <br />\n </div>\n <div class=\"pt-xs\" style=\"width: 25%\">\n <div class=\"layout-col gap-lg\">\n <div class=\"layout-col gap-xs place-start-start\">\n <!-- select current -->\n <button mat-button (click)=\"controller.select.selectCurrentWeek()\">\n {{ 'intervalPicker.currentPeriod.week' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentMonth()\">\n {{ 'intervalPicker.currentPeriod.month' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentQuarter()\">\n {{ 'intervalPicker.currentPeriod.quarter' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentYear()\">\n {{ 'intervalPicker.currentPeriod.year' | translate }}\n </button>\n </div>\n <div class=\"fixed-shifts-container\">\n <div class=\"layout-col place-start-stretch\">\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftDay(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.day' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftDay(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMonth(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.month' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMonth(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftYear(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.year' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftYear(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n\n @if (true) {\n <!-- shift minute -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMinute(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.minute' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMinute(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- shift hour -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftHour(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.hour' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftHour(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"layout-row place-between-center gap-xxl pt-sm\">\n <div>\n @if (showAnchor()) {\n <div class=\"layout-row flex-none gap-md\">\n <mat-menu #anchorMenu=\"matMenu\">\n @if (presenter.startDateHtmlString()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.setFixedAnchorPointToEndDateTime()\"\n [disabled]=\"!presenter.startDateHtmlString()\"\n >\n <mat-icon class=\"material-symbols-outlined\">login</mat-icon>\n <span>{{ 'intervalPicker.endDate' | translate }}</span>\n </button>\n }\n @if (presenter.endDateHtmlString()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.setFixedAnchorPointToStartDateTime()\"\n [disabled]=\"!presenter.endDateHtmlString()\"\n >\n <mat-icon class=\"material-symbols-outlined\">logout</mat-icon>\n <span>{{ 'intervalPicker.startDate' | translate }}</span>\n </button>\n }\n @if (presenter.isFixedAnchorDateSet()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.resetAnchor()\"\n [disabled]=\"!presenter.isFixedAnchorDateSet() || anchorReadOnly()\"\n >\n <mat-icon>close</mat-icon>\n <span>{{ 'intervalPicker.clear' | translate }}</span>\n </button>\n }\n </mat-menu>\n\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"anchorDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.anchorDateHtmlString()\"\n (ngModelChange)=\"controller.form.setAnchorDateFromString($event)\"\n [readonly]=\"anchorReadOnly()\"\n />\n @if (!anchorReadOnly()) {\n <button mat-icon-button matSuffix [matMenuTriggerFor]=\"anchorMenu\" [disabled]=\"presenter.isAnchorMenuDisabled()\">\n <mat-icon class=\"material-symbols-outlined\">more_horiz</mat-icon>\n </button>\n }\n </mat-form-field>\n @if (intervalInputMode() === 'date-time-range') {\n <mat-form-field class=\"input-control-container-short\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorTime' | translate }}</mat-label>\n <input\n matInput\n name=\"anchorTimeInput\"\n type=\"time\"\n #anchorTimeControl=\"ngModel\"\n step=\"1\"\n [readonly]=\"anchorReadOnly()\"\n [ngModel]=\"presenter.anchorTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setAnchorTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.anchor.resetAnchorTime()\"\n [disabled]=\"anchorReadOnly() || presenter.isAnchorTimeMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n </div>\n }\n </div>\n <!-- result interval -->\n <div class=\"layout-col place-center-center\">\n <div class=\"date-interval mat-caption pt-xs\">\n @if (presenter.startDateTimeAsJSDate()) {\n {{ presenter.startDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.startDateNotSet' | translate }}\n }\n <span> - </span>\n @if (presenter.endDateTimeAsJSDate()) {\n {{ presenter.endDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.endDateNotSet' | translate }}\n }\n </div>\n <div>\n <span class=\"mat-caption\">{{ presenter.deltaHumanReadable() || ' ' }}</span>\n </div>\n </div>\n <div class=\"layout-row gap-lg\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"controller.clearInterval()\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n {{ 'intervalPicker.clear' | translate }}\n </button>\n\n @if (!this.autoEmitMode) {\n <button color=\"primary\" mat-raised-button (click)=\"controller.manualEmit()\">\n {{ 'actions.ok' | translate }}\n </button>\n }\n </div>\n</div>\n", styles: [".interval-picker-component{min-width:840px;max-width:100%}.fixed-shifts-container{max-width:160px}.input-control-container{width:192px;max-width:100%}.input-control-container-short{width:140px;max-width:100%}.select-buttons-container button{white-space:nowrap;text-align:left;justify-content:flex-start}::ng-deep .interval-picker-component .mat-calendar-body-cell.elder-custom-anchor-date .mat-calendar-body-cell-content{border-radius:50%;background-color:#def;background-color:#b4d2ebbf}\n"] }]
|
|
29791
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: DateAdapter, useClass: CustomDateAdapter }], template: "<div class=\"interval-picker-component p-md layout-col gap-xxl\">\n <div class=\"layout-row gap-xxl place-between-start\" style=\"gap: 5%\">\n <div class=\"layout-col gap-md pt-xs\">\n <div class=\"layout-col\">\n <div class=\"layout-row select-buttons-container gap-sm\">\n <div class=\"layout-col gap-xs place-start-stretch\">\n <button mat-button (click)=\"controller.select.selectCurrentDay()\">\n @if (presenter.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.anchorDay' | translate }}\n } @else {\n {{ 'intervalPicker.today' | translate }}\n }\n </button>\n <button mat-button (click)=\"controller.select.selectYesterday()\">\n @if (presenter.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.last' | translate }} 1 {{ 'intervalPicker.day' | translate }}\n } @else {\n {{ 'intervalPicker.yesterday' | translate }}\n }\n </button>\n <button mat-button (click)=\"controller.select.selectLastSevenDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 7\n {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLastThirtyDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 30\n {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLast365daysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 365\n {{ 'intervalPicker.days' | translate }}\n </button>\n @if (intervalInputMode() === 'date-time-range') {\n <div class=\"pt-sm\"></div>\n <button mat-button (click)=\"controller.select.selectLastFiveMinutes()\">\n {{ 'intervalPicker.last' | translate }} 5\n {{ 'intervalPicker.minutes' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLastHour()\">\n {{ 'intervalPicker.last' | translate }} {{ 'intervalPicker.hour' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectLast24Hours()\">\n {{ 'intervalPicker.last' | translate }} 24\n {{ 'intervalPicker.hours' | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"layout-col\">\n <!-- smart shift -->\n <div class=\"layout-row place-around-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.smartShift(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ presenter.smartShiftMessage() }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.smartShift(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- calendars and input controls -->\n <div\n class=\"layout-row place-around-center\"\n style=\"align-items: flex-start; min-height: 280px\"\n >\n <mat-calendar\n #rangeCalendarStart\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"presenter.dateRangeForCalendar()\"\n (selectedChange)=\"controller.calendar.setStartDateFromJSDate($event)\"\n [maxDate]=\"presenter.endDateTimeAsJSDate()\"\n [dateClass]=\"presenter.calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n <mat-calendar\n #rangeCalendarEnd\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"presenter.dateRangeForCalendar()\"\n (selectedChange)=\"controller.calendar.setEndDateFromJSDate($event)\"\n [minDate]=\"presenter.startDateTimeAsJSDate()\"\n [dateClass]=\"presenter.calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n </div>\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"startDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.startDateHtmlString()\"\n (ngModelChange)=\"controller.form.setStartDateFromString($event)\"\n />\n </mat-form-field>\n </div>\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endDate' | translate }}</mat-label>\n <input\n #endDateInput\n name=\"endDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.endDateHtmlString()\"\n (ngModelChange)=\"controller.form.setEndDateFromString($event)\"\n />\n </mat-form-field>\n </div>\n </div>\n @if (intervalInputMode() === 'date-time-range') {\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startTime' | translate }}</mat-label>\n <input\n name=\"startTimeInput\"\n matInput\n type=\"time\"\n #startTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"presenter.startTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setStartTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.clearStartTime()\"\n [disabled]=\"!presenter.isStartTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endTime' | translate }}</mat-label>\n <input\n name=\"endTimeInput\"\n matInput\n type=\"time\"\n #endTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"presenter.endTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setEndTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.clearEndTime()\"\n [disabled]=\"!presenter.isEndTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n <br />\n </div>\n <div class=\"pt-xs\" style=\"width: 25%\">\n <div class=\"layout-col gap-lg\">\n <div class=\"layout-col gap-xs place-start-start\">\n <!-- select current -->\n <button mat-button (click)=\"controller.select.selectCurrentWeek()\">\n {{ 'intervalPicker.currentPeriod.week' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentMonth()\">\n {{ 'intervalPicker.currentPeriod.month' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentQuarter()\">\n {{ 'intervalPicker.currentPeriod.quarter' | translate }}\n </button>\n <button mat-button (click)=\"controller.select.selectCurrentYear()\">\n {{ 'intervalPicker.currentPeriod.year' | translate }}\n </button>\n </div>\n <div class=\"fixed-shifts-container\">\n <div class=\"layout-col place-start-stretch\">\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftDay(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.day' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftDay(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMonth(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.month' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMonth(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftYear(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.year' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftYear(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n\n @if (true) {\n <!-- shift minute -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMinute(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.minute' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftMinute(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- shift hour -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftHour(-1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.hour' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"controller.shift.shiftHour(1)\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"layout-row place-between-center gap-xxl pt-sm\">\n <div>\n @if (showAnchor()) {\n <div class=\"layout-row flex-none gap-md\">\n <mat-menu #anchorMenu=\"matMenu\">\n @if (presenter.startDateHtmlString()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.setFixedAnchorPointToEndDateTime()\"\n [disabled]=\"!presenter.startDateHtmlString()\"\n >\n <mat-icon class=\"material-symbols-outlined\">login</mat-icon>\n <span>{{ 'intervalPicker.endDate' | translate }}</span>\n </button>\n }\n @if (presenter.endDateHtmlString()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.setFixedAnchorPointToStartDateTime()\"\n [disabled]=\"!presenter.endDateHtmlString()\"\n >\n <mat-icon class=\"material-symbols-outlined\">logout</mat-icon>\n <span>{{ 'intervalPicker.startDate' | translate }}</span>\n </button>\n }\n @if (presenter.isFixedAnchorDateSet()) {\n <button\n mat-menu-item\n (click)=\"controller.anchor.resetAnchor()\"\n [disabled]=\"!presenter.isFixedAnchorDateSet() || anchorReadOnly()\"\n >\n <mat-icon>close</mat-icon>\n <span>{{ 'intervalPicker.clear' | translate }}</span>\n </button>\n }\n </mat-menu>\n\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"anchorDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"presenter.anchorDateHtmlString()\"\n (ngModelChange)=\"controller.form.setAnchorDateFromString($event)\"\n [readonly]=\"anchorReadOnly()\"\n />\n @if (!anchorReadOnly()) {\n <button\n mat-icon-button\n matSuffix\n [matMenuTriggerFor]=\"anchorMenu\"\n [disabled]=\"presenter.isAnchorMenuDisabled()\"\n >\n <mat-icon class=\"material-symbols-outlined\">more_horiz</mat-icon>\n </button>\n }\n </mat-form-field>\n @if (intervalInputMode() === 'date-time-range') {\n <mat-form-field class=\"input-control-container-short\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorTime' | translate }}</mat-label>\n <input\n matInput\n name=\"anchorTimeInput\"\n type=\"time\"\n #anchorTimeControl=\"ngModel\"\n step=\"1\"\n [readonly]=\"anchorReadOnly()\"\n [ngModel]=\"presenter.anchorTimeHtmlString()\"\n (ngModelChange)=\"controller.form.setAnchorTimeFromString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"controller.anchor.resetAnchorTime()\"\n [disabled]=\"anchorReadOnly() || presenter.isAnchorTimeMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n </div>\n }\n </div>\n <!-- result interval -->\n <div class=\"layout-col place-center-center\">\n <div class=\"date-interval mat-caption pt-xs\">\n @if (presenter.startDateTimeAsJSDate()) {\n {{ presenter.startDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.startDateNotSet' | translate }}\n }\n <span> - </span>\n @if (presenter.endDateTimeAsJSDate()) {\n {{ presenter.endDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.endDateNotSet' | translate }}\n }\n </div>\n <div>\n <span class=\"mat-caption\">{{ presenter.deltaHumanReadable() || ' ' }}</span>\n </div>\n </div>\n <div class=\"layout-row gap-lg\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"controller.clearInterval()\"\n [disabled]=\"!presenter.isValidIntervalSet()\"\n >\n {{ 'intervalPicker.clear' | translate }}\n </button>\n\n @if (!this.autoEmitMode()) {\n <button color=\"primary\" mat-raised-button (click)=\"controller.manualEmit()\">\n {{ 'actions.ok' | translate }}\n </button>\n }\n </div>\n</div>\n", styles: [".interval-picker-component{min-width:840px;max-width:100%}.fixed-shifts-container{max-width:160px}.input-control-container{width:192px;max-width:100%}.input-control-container-short{width:140px;max-width:100%}.select-buttons-container button{white-space:nowrap;text-align:left;justify-content:flex-start}::ng-deep .interval-picker-component .mat-calendar-body-cell.elder-custom-anchor-date .mat-calendar-body-cell-content{border-radius:50%;background-color:#def;background-color:#b4d2ebbf}\n"] }]
|
|
29793
29792
|
}], ctorParameters: () => [], propDecorators: { intervalChange: [{
|
|
29794
29793
|
type: Output
|
|
29795
|
-
}], autoEmitMode: [{
|
|
29796
|
-
type: Input
|
|
29797
|
-
}], emitOnChange: [{
|
|
29798
|
-
type: Input
|
|
29799
|
-
}], emitType: [{
|
|
29800
|
-
type: Input
|
|
29801
29794
|
}], calendarStart: [{
|
|
29802
29795
|
type: ViewChild,
|
|
29803
29796
|
args: ['rangeCalendarStart']
|
|
@@ -30263,7 +30256,7 @@ class ElderIntervalPickerToggleComponent {
|
|
|
30263
30256
|
</div>
|
|
30264
30257
|
</elder-dialog-panel>
|
|
30265
30258
|
</elder-overlay>
|
|
30266
|
-
`, isInline: true, dependencies: [{ kind: "component", type: ElderIntervalPickerComponent, selector: "elder-interval-picker", inputs: ["
|
|
30259
|
+
`, isInline: true, dependencies: [{ kind: "component", type: ElderIntervalPickerComponent, selector: "elder-interval-picker", inputs: ["emitType", "autoEmitMode", "intervalInputMode", "showAnchor", "anchorReadOnly", "externalAnchorDateTime", "externalInterval"], outputs: ["intervalChange"] }, { kind: "component", type: ElderOverlayComponent, selector: "elder-overlay", inputs: ["originX", "originY", "overlayX", "overlayY", "offsetY", "offsetX", "backdrop", "backdropVisible", "origin", "positionStrategy", "overlaySize"], outputs: ["keydownEvents", "attachedChange"], exportAs: ["elderOverlay"] }, { kind: "component", type: ElderDialogPanelComponent, selector: "elder-dialog-panel" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: ElderOverlayTriggerDirective, selector: "[elderOverlayTrigger]", inputs: ["elderOverlayTrigger", "elderOverlayTriggerType", "elderOverlayTriggerEnabled"] }, { kind: "directive", type: ElderOverlayOriginDirective, selector: "[elderOverlayOrigin]", inputs: ["elderOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
30267
30260
|
}
|
|
30268
30261
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderIntervalPickerToggleComponent, decorators: [{
|
|
30269
30262
|
type: Component,
|