ngx-register-base 1.3.2 → 2.0.0
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/README.md +10 -0
- package/esm2022/lib/components/checkbox-selector/checkbox-selector.component.mjs +3 -3
- package/esm2022/lib/components/column-settings/column-settings.component.mjs +30 -25
- package/esm2022/lib/components/column-settings/components/column-settings-template/column-settings-template.component.mjs +4 -12
- package/esm2022/lib/components/column-settings/components/reset-settings-form/reset-settings-form.component.mjs +13 -0
- package/esm2022/lib/components/column-settings/consts/column-settings.consts.mjs +9 -9
- package/esm2022/lib/components/filter-button/filter-button.component.mjs +4 -5
- package/esm2022/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.mjs +22 -22
- package/esm2022/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.mjs +9 -6
- package/esm2022/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.mjs +13 -8
- package/esm2022/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.mjs +4 -4
- package/esm2022/lib/components/filters/components/filter-list/filter-list.service.mjs +16 -13
- package/esm2022/lib/components/filters/components/filter-list/filters-section/filters-section.component.mjs +4 -4
- package/esm2022/lib/components/filters/components/filter-list.module.mjs +33 -7
- package/esm2022/lib/components/filters/register-table-filter.component.mjs +5 -4
- package/esm2022/lib/components/filters/register-table-filter.module.mjs +5 -5
- package/esm2022/lib/components/index.mjs +2 -2
- package/esm2022/lib/components/inputs/index.mjs +4 -4
- package/esm2022/lib/components/inputs/param-calendar-year/param-calendar-year.component.mjs +37 -30
- package/esm2022/lib/components/inputs/param-custom/param-custom.component.mjs +3 -3
- package/esm2022/lib/components/inputs/param-date/param-date.component.mjs +27 -15
- package/esm2022/lib/components/inputs/param-date-range/index.mjs +2 -0
- package/esm2022/lib/components/inputs/param-date-range/param-date-range.component.mjs +80 -18
- package/esm2022/lib/components/inputs/param-date-time/param-date-time.component.mjs +65 -30
- package/esm2022/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.component.mjs +406 -0
- package/esm2022/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.consts.mjs +13 -0
- package/esm2022/lib/components/inputs/param-date-time-range/param-date-time-range.component.mjs +31 -34
- package/esm2022/lib/components/inputs/param-dropbox/param-dropbox.component.mjs +126 -0
- package/esm2022/lib/components/inputs/param-month/param-month.component.mjs +40 -9
- package/esm2022/lib/components/inputs/param-month-range/param-month-range.component.mjs +29 -8
- package/esm2022/lib/components/inputs/param-multi-select/param-multi-select.component.mjs +97 -113
- package/esm2022/lib/components/inputs/param-select/param-select.component.mjs +40 -36
- package/esm2022/lib/components/inputs/param-switcher/index.mjs +2 -0
- package/esm2022/lib/components/inputs/param-switcher/param-switcher.component.mjs +61 -11
- package/esm2022/lib/components/inputs/param-switcher/param-switcher.types.mjs +2 -0
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.mjs +7 -25
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.mjs +21 -20
- package/esm2022/lib/components/inputs/param-text/param-text.component.mjs +11 -6
- package/esm2022/lib/components/inputs/param-textarea/param-textarea.component.mjs +5 -3
- package/esm2022/lib/components/inputs/param-toggle/param-toggle.component.mjs +24 -7
- package/esm2022/lib/components/inputs/param-tree/param-tree.component.mjs +3 -3
- package/esm2022/lib/components/inputs/param-tree/services/param-tree.service.mjs +9 -2
- package/esm2022/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.mjs +13 -6
- package/esm2022/lib/components/inputs/param-tree-select/param-tree-select.component.mjs +9 -4
- package/esm2022/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.mjs +9 -5
- package/esm2022/lib/components/inputs/sub-components/param-label-hint-icon/param-label-hint-icon.component.mjs +12 -0
- package/esm2022/lib/components/paginator/paginator.component.mjs +10 -12
- package/esm2022/lib/components/register-table/register-table.component.mjs +31 -12
- package/esm2022/lib/components/search-input/search-input.component.mjs +5 -7
- package/esm2022/lib/components/sliding-panel/sliding-panel.component.mjs +23 -35
- package/esm2022/lib/components/template-modal/index.mjs +3 -0
- package/esm2022/lib/components/template-modal/template-modal.base.mjs +16 -0
- package/esm2022/lib/components/template-modal/template-modal.component.mjs +16 -0
- package/esm2022/lib/core/param/index.mjs +1 -1
- package/esm2022/lib/core/param/param-base.mjs +28 -3
- package/esm2022/lib/core/param/param-date-base.mjs +20 -11
- package/esm2022/lib/core/param/param-select-base.mjs +14 -6
- package/esm2022/lib/core/register-base/register-base.store.mjs +1 -1
- package/esm2022/lib/directives/date/date-time.types.mjs +1 -1
- package/esm2022/lib/providers/index.mjs +2 -0
- package/esm2022/lib/providers/provide-icons.mjs +23 -0
- package/esm2022/lib/services/date-time.service.mjs +1 -38
- package/esm2022/lib/services/dialog/dialog.service.mjs +1 -13
- package/esm2022/lib/services/dialog/dialog.types.mjs +2 -2
- package/esm2022/lib/services/message.service.mjs +48 -0
- package/esm2022/lib/services/validation-message.service.mjs +52 -0
- package/esm2022/lib/store/fast-query-store.service.mjs +16 -1
- package/esm2022/lib/utils/index.mjs +2 -1
- package/esm2022/lib/utils/utils.mjs +17 -0
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ngx-register-base.mjs +1463 -1017
- package/fesm2022/ngx-register-base.mjs.map +1 -1
- package/icons/arrow-turn-up-left.svg +3 -0
- package/icons/check.svg +3 -0
- package/icons/floppy.svg +3 -0
- package/icons/star-empty.svg +10 -0
- package/icons/star-fill.svg +3 -0
- package/icons/trash.svg +3 -0
- package/icons/xmark.svg +3 -0
- package/lib/components/column-settings/column-settings.component.d.ts +9 -9
- package/lib/components/column-settings/components/column-settings-template/column-settings-template.component.d.ts +5 -5
- package/lib/components/{reset-settings-form → column-settings/components/reset-settings-form}/reset-settings-form.component.d.ts +2 -5
- package/lib/components/column-settings/consts/column-settings.consts.d.ts +8 -8
- package/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.d.ts +5 -8
- package/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.d.ts +2 -1
- package/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.d.ts +2 -1
- package/lib/components/filters/components/filter-list/filter-list.service.d.ts +2 -3
- package/lib/components/filters/components/filter-list.module.d.ts +7 -7
- package/lib/components/filters/register-table-filter.component.d.ts +2 -1
- package/lib/components/filters/register-table-filter.module.d.ts +2 -2
- package/lib/components/index.d.ts +1 -1
- package/lib/components/inputs/index.d.ts +3 -4
- package/lib/components/inputs/param-calendar-year/param-calendar-year.component.d.ts +2 -8
- package/lib/components/inputs/param-custom/param-custom.component.d.ts +1 -1
- package/lib/components/inputs/param-date/param-date.component.d.ts +7 -10
- package/lib/components/inputs/param-date-range/index.d.ts +1 -0
- package/lib/components/inputs/param-date-range/param-date-range.component.d.ts +13 -16
- package/lib/components/inputs/param-date-time/param-date-time.component.d.ts +8 -13
- package/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.component.d.ts +96 -0
- package/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.consts.d.ts +12 -0
- package/lib/components/inputs/param-date-time-range/param-date-time-range.component.d.ts +17 -16
- package/lib/components/inputs/param-dropbox/param-dropbox.component.d.ts +31 -0
- package/lib/components/inputs/param-month/param-month.component.d.ts +10 -8
- package/lib/components/inputs/param-month-range/param-month-range.component.d.ts +10 -8
- package/lib/components/inputs/param-multi-select/param-multi-select.component.d.ts +9 -11
- package/lib/components/inputs/param-select/param-select.component.d.ts +9 -12
- package/lib/components/inputs/param-switcher/index.d.ts +2 -0
- package/lib/components/inputs/param-switcher/param-switcher.component.d.ts +21 -5
- package/lib/components/inputs/param-switcher/param-switcher.types.d.ts +7 -0
- package/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.d.ts +3 -2
- package/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.d.ts +5 -4
- package/lib/components/inputs/param-text/param-text.component.d.ts +6 -4
- package/lib/components/inputs/param-textarea/param-textarea.component.d.ts +2 -1
- package/lib/components/inputs/param-toggle/param-toggle.component.d.ts +3 -2
- package/lib/components/inputs/param-tree/services/param-tree.service.d.ts +1 -1
- package/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.d.ts +2 -1
- package/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.d.ts +2 -1
- package/lib/components/inputs/sub-components/param-label-hint-icon/param-label-hint-icon.component.d.ts +5 -0
- package/lib/components/paginator/paginator.component.d.ts +3 -4
- package/lib/components/register-table/register-table.component.d.ts +5 -3
- package/lib/components/sliding-panel/sliding-panel.component.d.ts +8 -8
- package/lib/components/template-modal/index.d.ts +2 -0
- package/lib/components/template-modal/template-modal.base.d.ts +9 -0
- package/lib/components/template-modal/template-modal.component.d.ts +6 -0
- package/lib/core/param/index.d.ts +1 -0
- package/lib/core/param/param-base.d.ts +18 -2
- package/lib/core/param/param-date-base.d.ts +15 -9
- package/lib/core/param/param-select-base.d.ts +12 -7
- package/lib/core/register-base/register-base.store.d.ts +2 -3
- package/lib/directives/date/date-time.types.d.ts +0 -2
- package/lib/providers/index.d.ts +1 -0
- package/lib/providers/provide-icons.d.ts +3 -0
- package/lib/services/date-time.service.d.ts +0 -13
- package/lib/services/dialog/dialog.service.d.ts +1 -3
- package/lib/services/dialog/dialog.types.d.ts +0 -3
- package/lib/services/message.service.d.ts +20 -0
- package/lib/services/validation-message.service.d.ts +14 -0
- package/lib/store/fast-query-store.service.d.ts +1 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/utils.d.ts +3 -0
- package/package.json +5 -12
- package/public-api.d.ts +1 -0
- package/styles/common-param.less +15 -0
- package/styles/flex.less +5 -1
- package/styles/icons.less +8 -0
- package/styles/modals.less +54 -0
- package/styles/overrides/tui/tui-input.less +94 -121
- package/styles/styles.less +2 -0
- package/esm2022/lib/components/inputs/inputs.module.mjs +0 -166
- package/esm2022/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.mjs +0 -15
- package/esm2022/lib/components/reset-settings-form/reset-settings-form.component.mjs +0 -18
- package/esm2022/lib/components/sliding-panel/sliding-panel.module.mjs +0 -19
- package/esm2022/lib/utils/prizm.shared.module.mjs +0 -284
- package/icons/calendar-blank.svg +0 -10
- package/lib/components/inputs/inputs.module.d.ts +0 -31
- package/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.d.ts +0 -6
- package/lib/components/sliding-panel/sliding-panel.module.d.ts +0 -9
- package/lib/utils/prizm.shared.module.d.ts +0 -14
- /package/icons/{calendar-icon.svg → calendar-date-time.svg} +0 -0
- /package/icons/{calendar-custom.svg → calendar-date.svg} +0 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, input, signal, viewChildren, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, } from '@angular/forms';
|
|
4
|
+
import { MaskitoDirective } from '@maskito/angular';
|
|
5
|
+
import { TUI_FIRST_DAY, TUI_LAST_DAY, TuiActiveZone, TuiDay, TuiDayRange, tuiNullableSame, TuiTime, } from '@taiga-ui/cdk';
|
|
6
|
+
import { TuiAppearance, TuiButton, TuiDropdown, TuiIcon, TuiTextfield } from '@taiga-ui/core';
|
|
7
|
+
import { TuiCalendarRange, TuiInputTime, tuiInputTimeOptionsProvider } from '@taiga-ui/kit';
|
|
8
|
+
import { maskitoDateOptionsGenerator, maskitoTimeOptionsGenerator, } from '@maskito/kit';
|
|
9
|
+
import { DATE_MAX_LENGTH, DATE_MODE, DATE_PLACEHOLDER, DATE_SEPARATOR, EInputType, TIME_PLACEHOLDER, } from './date-time-range.consts';
|
|
10
|
+
import { addDays, format, isAfter, isBefore, isEqual } from 'date-fns';
|
|
11
|
+
import { EDatePattern } from '../../../../directives/date/date-time.types';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@angular/forms";
|
|
14
|
+
import * as i2 from "@taiga-ui/core";
|
|
15
|
+
import * as i3 from "@taiga-ui/kit";
|
|
16
|
+
export class CustomDateTimeRangeComponent {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.inputItems = viewChildren('inputItem');
|
|
19
|
+
this.min = input(null);
|
|
20
|
+
this.max = input(null);
|
|
21
|
+
this.minLength = input(null);
|
|
22
|
+
this.maxLength = input(null);
|
|
23
|
+
this.timeMode = input('HH:MM');
|
|
24
|
+
this.placeholder = input('Выберите период');
|
|
25
|
+
this.forceClear = input(true);
|
|
26
|
+
this.value = signal(null);
|
|
27
|
+
/** ControlValueAccessor properties and methods */
|
|
28
|
+
this.onChange = (val) => {
|
|
29
|
+
console.warn('onChange', val);
|
|
30
|
+
};
|
|
31
|
+
this.onTouched = () => { };
|
|
32
|
+
this.touched = false;
|
|
33
|
+
this.disabled = false;
|
|
34
|
+
/** custom date-time-range component props and methods */
|
|
35
|
+
this.open = false;
|
|
36
|
+
this.EInputType = EInputType;
|
|
37
|
+
this.DATE_PLACEHOLDER = DATE_PLACEHOLDER;
|
|
38
|
+
this.TIME_PLACEHOLDER = TIME_PLACEHOLDER;
|
|
39
|
+
this.isFocused = signal(false);
|
|
40
|
+
this.calendarMinDay = computed(() => {
|
|
41
|
+
const minDate = this.min();
|
|
42
|
+
return minDate ? TuiDay.fromLocalNativeDate(minDate) : TUI_FIRST_DAY;
|
|
43
|
+
});
|
|
44
|
+
this.calendarMaxDay = computed(() => {
|
|
45
|
+
const maxDate = this.max();
|
|
46
|
+
return maxDate ? TuiDay.fromLocalNativeDate(maxDate) : TUI_LAST_DAY;
|
|
47
|
+
});
|
|
48
|
+
this.timeLength = computed(() => this.timeMode().length * 0.95);
|
|
49
|
+
this._dateFrom = signal(null);
|
|
50
|
+
this._dateTo = signal(null);
|
|
51
|
+
this._timeFrom = signal(null);
|
|
52
|
+
this._timeTo = signal(null);
|
|
53
|
+
this._currentDayRange = computed(() => {
|
|
54
|
+
const fromDate = this._dateFrom() || this.value()?.from;
|
|
55
|
+
const toDate = this._dateTo() || this.value()?.to;
|
|
56
|
+
if (fromDate && toDate) {
|
|
57
|
+
return isBefore(fromDate, toDate)
|
|
58
|
+
? { from: fromDate, to: toDate }
|
|
59
|
+
: { from: toDate, to: fromDate };
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
});
|
|
63
|
+
this._currentTimeFrom = computed(() => this._timeFrom() || this.tuiTimeFrom() || new TuiTime(0, 0, 0));
|
|
64
|
+
this._currentTimeTo = computed(() => this._timeTo() || this.tuiTimeTo() || new TuiTime(23, 59, 59));
|
|
65
|
+
/** range computed from value */
|
|
66
|
+
this.computedTuiDayRange = computed(() => {
|
|
67
|
+
const nativeRange = this.value();
|
|
68
|
+
if (!nativeRange) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const [fromDate] = this.fromNativeToTui(nativeRange.from);
|
|
72
|
+
const [toDate] = this.fromNativeToTui(nativeRange.to);
|
|
73
|
+
return new TuiDayRange(fromDate, toDate);
|
|
74
|
+
});
|
|
75
|
+
/** computed timeFrom from value */
|
|
76
|
+
this.tuiTimeFrom = computed(() => {
|
|
77
|
+
const nativeRange = this.value();
|
|
78
|
+
if (!nativeRange) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const [, timeFrom] = this.fromNativeToTui(nativeRange.from);
|
|
82
|
+
return timeFrom;
|
|
83
|
+
});
|
|
84
|
+
/** computed timeTo from value */
|
|
85
|
+
this.tuiTimeTo = computed(() => {
|
|
86
|
+
const nativeRange = this.value();
|
|
87
|
+
if (!nativeRange) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const [, timeTo] = this.fromNativeToTui(nativeRange.to);
|
|
91
|
+
return timeTo;
|
|
92
|
+
});
|
|
93
|
+
this.fromValue = computed(() => {
|
|
94
|
+
const from = this.value()?.from || null;
|
|
95
|
+
if (from) {
|
|
96
|
+
return format(from, EDatePattern.DATE);
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
});
|
|
100
|
+
this.toValue = computed(() => {
|
|
101
|
+
const to = this.value()?.to || null;
|
|
102
|
+
if (to) {
|
|
103
|
+
return format(to, EDatePattern.DATE);
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
});
|
|
107
|
+
this.fromTimeValue = computed(() => {
|
|
108
|
+
const fromTime = this.tuiTimeFrom();
|
|
109
|
+
if (fromTime) {
|
|
110
|
+
return this.timeToString(fromTime);
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
});
|
|
114
|
+
this.toTimeValue = computed(() => {
|
|
115
|
+
const toTime = this.tuiTimeTo();
|
|
116
|
+
if (toTime) {
|
|
117
|
+
return this.timeToString(toTime);
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
});
|
|
121
|
+
this.empty = computed(() => !this.value());
|
|
122
|
+
this.datePlaceholder = computed(() => this.isFocused() ? DATE_PLACEHOLDER : this.placeholder());
|
|
123
|
+
this.timeMaxLength = computed(() => this.timeMode().length);
|
|
124
|
+
this.computedDateMask = computed(() => {
|
|
125
|
+
const min = this.calendarMinDay().toLocalNativeDate();
|
|
126
|
+
const max = this.calendarMaxDay().toLocalNativeDate();
|
|
127
|
+
return maskitoDateOptionsGenerator({
|
|
128
|
+
mode: DATE_MODE,
|
|
129
|
+
separator: DATE_SEPARATOR,
|
|
130
|
+
min,
|
|
131
|
+
max,
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
this.computedTimeMask = computed(() => {
|
|
135
|
+
const mode = this.timeMode();
|
|
136
|
+
return maskitoTimeOptionsGenerator({
|
|
137
|
+
mode,
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/** Method 1: Framework writes value to your component */
|
|
142
|
+
writeValue(date) {
|
|
143
|
+
this.value.set(date);
|
|
144
|
+
this.resetSignals();
|
|
145
|
+
}
|
|
146
|
+
/** Method 2: Register callback for when value changes */
|
|
147
|
+
registerOnChange(onChange) {
|
|
148
|
+
this.onChange = onChange;
|
|
149
|
+
}
|
|
150
|
+
/** Method 3: Register callback for when user touches control */
|
|
151
|
+
registerOnTouched(onTouched) {
|
|
152
|
+
this.onTouched = onTouched;
|
|
153
|
+
}
|
|
154
|
+
/** Method 4: Handle disabled state */
|
|
155
|
+
setDisabledState(disabled) {
|
|
156
|
+
this.disabled = disabled;
|
|
157
|
+
}
|
|
158
|
+
markAsTouched() {
|
|
159
|
+
if (!this.touched) {
|
|
160
|
+
this.onTouched();
|
|
161
|
+
this.touched = true;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** method to notify parent form on control value changes by user interaction */
|
|
165
|
+
onValueChange(val) {
|
|
166
|
+
this.markAsTouched();
|
|
167
|
+
if (!this.disabled) {
|
|
168
|
+
this.value.set(val);
|
|
169
|
+
this.onChange(this.value());
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
onClick() {
|
|
173
|
+
this.open = !this.open;
|
|
174
|
+
}
|
|
175
|
+
onFocus() {
|
|
176
|
+
this.isFocused.set(true);
|
|
177
|
+
}
|
|
178
|
+
onBlur() {
|
|
179
|
+
this.isFocused.set(false);
|
|
180
|
+
}
|
|
181
|
+
onActiveZone(active) {
|
|
182
|
+
this.open = active && this.open;
|
|
183
|
+
}
|
|
184
|
+
onCalendarChange(range) {
|
|
185
|
+
if (range &&
|
|
186
|
+
!tuiNullableSame(this.computedTuiDayRange(), range, (a, b) => a?.daySame(b))) {
|
|
187
|
+
const nativeDateRange = this.transformRange(range);
|
|
188
|
+
this.onValueChange(nativeDateRange);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
updateTimeFrom(timeFrom) {
|
|
192
|
+
const currFrom = this.tuiTimeFrom();
|
|
193
|
+
if (currFrom === timeFrom) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
this._timeFrom.set(timeFrom);
|
|
197
|
+
const currentRange = this.value();
|
|
198
|
+
if (currentRange) {
|
|
199
|
+
const { from, to } = this.getUpdatedDateTime(currentRange);
|
|
200
|
+
this.onValueChange({ from, to });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
updateTimeTo(timeTo) {
|
|
204
|
+
const currTo = this.tuiTimeTo();
|
|
205
|
+
if (currTo === timeTo) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
this._timeTo.set(timeTo);
|
|
209
|
+
const currentRange = this.value();
|
|
210
|
+
if (currentRange) {
|
|
211
|
+
const { from, to } = this.getUpdatedDateTime(currentRange);
|
|
212
|
+
this.onValueChange({ from, to });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
getUpdatedDateTime(currentRange) {
|
|
216
|
+
const { hours: fromHours, minutes: fromMin, seconds: fromSec } = this._currentTimeFrom();
|
|
217
|
+
const { hours: toHours, minutes: toMin, seconds: toSec } = this._currentTimeTo();
|
|
218
|
+
const from = new Date(currentRange.from.setHours(fromHours, fromMin, fromSec));
|
|
219
|
+
const to = new Date(currentRange.to.setHours(toHours, toMin, toSec));
|
|
220
|
+
return { from, to };
|
|
221
|
+
}
|
|
222
|
+
/** method to focus on next input when prev is filled */
|
|
223
|
+
onKeyup(e, type) {
|
|
224
|
+
e.preventDefault();
|
|
225
|
+
const idx = Object.values(EInputType).indexOf(type);
|
|
226
|
+
if (idx === 3 || this.inputItemsAreFilled) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const currentInput = this.inputItems()[idx];
|
|
230
|
+
const currentLen = currentInput?.nativeElement?.value?.length;
|
|
231
|
+
const maxLen = this.getInputMaxLength(type);
|
|
232
|
+
const isFocusNext = currentLen === maxLen;
|
|
233
|
+
if (isFocusNext) {
|
|
234
|
+
const nextInput = this.inputItems()[idx + 1];
|
|
235
|
+
nextInput?.nativeElement?.focus();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
clear() {
|
|
239
|
+
this.resetSignals();
|
|
240
|
+
this.clearInputItems();
|
|
241
|
+
this.onValueChange(null);
|
|
242
|
+
}
|
|
243
|
+
/** update value method for date inputItems */
|
|
244
|
+
onDateValueChange(value, type) {
|
|
245
|
+
const isValid = value?.length === DATE_MAX_LENGTH;
|
|
246
|
+
if (!isValid) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (type === EInputType.DATE_FROM) {
|
|
250
|
+
this.setDateFrom(value);
|
|
251
|
+
}
|
|
252
|
+
if (type === EInputType.DATE_TO) {
|
|
253
|
+
this.setDateTo(value);
|
|
254
|
+
}
|
|
255
|
+
const currentRange = this._currentDayRange();
|
|
256
|
+
if (currentRange) {
|
|
257
|
+
const { from, to } = this.getUpdatedDateTime(currentRange);
|
|
258
|
+
this.onValueChange({ from, to });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/** update value method for time inputItems */
|
|
262
|
+
onTimeValueChange(value, type) {
|
|
263
|
+
const isValid = value?.length === this.timeMaxLength();
|
|
264
|
+
if (!isValid) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (type === EInputType.TIME_FROM) {
|
|
268
|
+
const timeFrom = this.getTuiTimeFromString(value);
|
|
269
|
+
this._timeFrom.set(timeFrom);
|
|
270
|
+
}
|
|
271
|
+
if (type === EInputType.TIME_TO) {
|
|
272
|
+
const timeTo = this.getTuiTimeFromString(value);
|
|
273
|
+
this._timeTo.set(timeTo);
|
|
274
|
+
}
|
|
275
|
+
const currentRange = this._currentDayRange();
|
|
276
|
+
if (currentRange) {
|
|
277
|
+
const { from, to } = this.getUpdatedDateTime(currentRange);
|
|
278
|
+
this.onValueChange({ from, to });
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
getTuiTimeFromString(str) {
|
|
282
|
+
const arr = str.split(':');
|
|
283
|
+
const [hourStr, minStr, secStr] = arr;
|
|
284
|
+
const hours = Number(hourStr);
|
|
285
|
+
const min = Number(minStr);
|
|
286
|
+
const sec = Number(secStr ?? 0);
|
|
287
|
+
return new TuiTime(hours, min, sec);
|
|
288
|
+
}
|
|
289
|
+
timeToString(value) {
|
|
290
|
+
return value instanceof TuiTime ? value.toString(this.timeMode()) : null;
|
|
291
|
+
}
|
|
292
|
+
getInputMaxLength(inputType) {
|
|
293
|
+
return inputType === EInputType.DATE_FROM || inputType === EInputType.DATE_TO
|
|
294
|
+
? DATE_MAX_LENGTH
|
|
295
|
+
: this.timeMaxLength();
|
|
296
|
+
}
|
|
297
|
+
get inputItemsAreFilled() {
|
|
298
|
+
const inputs = this.inputItems();
|
|
299
|
+
return inputs.every((item) => !!item.nativeElement.value);
|
|
300
|
+
}
|
|
301
|
+
setDateFrom(date) {
|
|
302
|
+
const fromDate = this.getNativeFromString(date);
|
|
303
|
+
const minDate = this.calendarMinDay().toLocalNativeDate();
|
|
304
|
+
const isSameOrAfter = isAfter(fromDate, minDate) || isEqual(fromDate, minDate);
|
|
305
|
+
const from = isSameOrAfter ? fromDate : minDate;
|
|
306
|
+
this._dateFrom.set(from);
|
|
307
|
+
}
|
|
308
|
+
setDateTo(date) {
|
|
309
|
+
const toDate = this.getNativeFromString(date);
|
|
310
|
+
const maxDate = this.maxDateBasedOnMaxLength ?? this.calendarMaxDay().toLocalNativeDate();
|
|
311
|
+
const isSameOrBefore = isBefore(toDate, maxDate) || isEqual(toDate, maxDate);
|
|
312
|
+
const to = isSameOrBefore ? toDate : maxDate;
|
|
313
|
+
this._dateTo.set(to);
|
|
314
|
+
}
|
|
315
|
+
get maxDateBasedOnMaxLength() {
|
|
316
|
+
const maxLen = this.maxLength();
|
|
317
|
+
const fromDate = this._dateFrom() ?? this.value()?.from;
|
|
318
|
+
if (maxLen?.day && fromDate) {
|
|
319
|
+
const maxLenDay = addDays(fromDate, maxLen.day - 1);
|
|
320
|
+
const maxDate = this.calendarMaxDay().toLocalNativeDate();
|
|
321
|
+
return isBefore(maxLenDay, maxDate) ? maxLenDay : maxDate;
|
|
322
|
+
}
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
getNativeFromString(str) {
|
|
326
|
+
const arr = str.split('.');
|
|
327
|
+
const [dayStr, monthStr, yearStr] = arr;
|
|
328
|
+
const year = Number(yearStr);
|
|
329
|
+
const month = Number(monthStr) - 1;
|
|
330
|
+
const day = Number(dayStr);
|
|
331
|
+
return new Date(year, month, day);
|
|
332
|
+
}
|
|
333
|
+
resetSignals() {
|
|
334
|
+
this._dateFrom.set(null);
|
|
335
|
+
this._dateTo.set(null);
|
|
336
|
+
this._timeFrom.set(null);
|
|
337
|
+
this._timeTo.set(null);
|
|
338
|
+
}
|
|
339
|
+
clearInputItems() {
|
|
340
|
+
const inputs = this.inputItems();
|
|
341
|
+
for (const el of inputs) {
|
|
342
|
+
if (el?.nativeElement?.value) {
|
|
343
|
+
el.nativeElement.value = '';
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
transformRange(dayRange) {
|
|
348
|
+
const { from: fromDate, to: toDate } = dayRange;
|
|
349
|
+
const fromTime = this._currentTimeFrom();
|
|
350
|
+
const toTime = this._currentTimeTo();
|
|
351
|
+
const from = this.fromTuiToNative(fromDate, fromTime);
|
|
352
|
+
const to = this.fromTuiToNative(toDate, toTime);
|
|
353
|
+
return { from, to };
|
|
354
|
+
}
|
|
355
|
+
fromTuiToNative(date, time) {
|
|
356
|
+
const nativeDate = date.toLocalNativeDate();
|
|
357
|
+
if (time) {
|
|
358
|
+
const { hours = 0, minutes = 0, seconds = 0 } = time;
|
|
359
|
+
return new Date(nativeDate.setHours(hours, minutes, seconds));
|
|
360
|
+
}
|
|
361
|
+
return nativeDate;
|
|
362
|
+
}
|
|
363
|
+
fromNativeToTui(date) {
|
|
364
|
+
const tuiDay = TuiDay.fromLocalNativeDate(date);
|
|
365
|
+
const tuiTime = new TuiTime(date.getHours(), date.getMinutes(), date.getSeconds());
|
|
366
|
+
return [tuiDay, tuiTime];
|
|
367
|
+
}
|
|
368
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CustomDateTimeRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
369
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CustomDateTimeRangeComponent, isStandalone: true, selector: "sproc-custom-date-time-range", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, timeMode: { classPropertyName: "timeMode", publicName: "timeMode", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, forceClear: { classPropertyName: "forceClear", publicName: "forceClear", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
370
|
+
{
|
|
371
|
+
provide: NG_VALUE_ACCESSOR,
|
|
372
|
+
multi: true,
|
|
373
|
+
useExisting: CustomDateTimeRangeComponent,
|
|
374
|
+
},
|
|
375
|
+
tuiInputTimeOptionsProvider({
|
|
376
|
+
icon: () => '',
|
|
377
|
+
}),
|
|
378
|
+
], viewQueries: [{ propertyName: "inputItems", predicate: ["inputItem"], descendants: true, isSignal: true }], ngImport: i0, template: "@let timeFrom = tuiTimeFrom();\n@let timeTo = tuiTimeTo();\n\n<div\n tuiAppearance=\"sproc-input-appearance\"\n class=\"multiple-input-box\"\n [tuiDropdown]=\"dropdownContent\"\n [tuiDropdownManual]=\"open\"\n (click)=\"onClick()\"\n (tuiActiveZoneChange)=\"onActiveZone($event)\"\n>\n <div class=\"input-items\">\n <input\n #inputItem\n class=\"input-date\"\n [placeholder]=\"datePlaceholder()\"\n [maskito]=\"computedDateMask()\"\n [disabled]=\"disabled\"\n [class.show-placeholder]=\"empty() && !isFocused()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"fromValue()\"\n (ngModelChange)=\"onDateValueChange($event, EInputType.DATE_FROM)\"\n (keyup)=\"onKeyup($event, EInputType.DATE_FROM)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <input\n #inputItem\n class=\"input-time\"\n [placeholder]=\"TIME_PLACEHOLDER\"\n [maskito]=\"computedTimeMask()\"\n [disabled]=\"disabled\"\n [style.width.ch]=\"timeLength()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"fromTimeValue()\"\n (ngModelChange)=\"onTimeValueChange($event, EInputType.TIME_FROM)\"\n (keyup)=\"onKeyup($event, EInputType.TIME_FROM)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"delimiter\">-</span>\n <input\n #inputItem\n class=\"input-date\"\n [placeholder]=\"DATE_PLACEHOLDER\"\n [maskito]=\"computedDateMask()\"\n [disabled]=\"disabled\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"toValue()\"\n (ngModelChange)=\"onDateValueChange($event, EInputType.DATE_TO)\"\n (keyup)=\"onKeyup($event, EInputType.DATE_TO)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <input\n #inputItem\n class=\"input-time\"\n [placeholder]=\"TIME_PLACEHOLDER\"\n [maskito]=\"computedTimeMask()\"\n [disabled]=\"disabled\"\n [style.width.ch]=\"timeLength()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"toTimeValue()\"\n (ngModelChange)=\"onTimeValueChange($event, EInputType.TIME_TO)\"\n (keyup)=\"onKeyup($event, EInputType.TIME_TO)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n </div>\n\n <div class=\"t-content\">\n <div class=\"icon-wrapper\">\n <!-- placeholder for sproc-param-invalid-icon -->\n <ng-content />\n\n @if (forceClear()) {\n <button\n class=\"t-clear\"\n tuiIconButton\n size=\"xs\"\n appearance=\"action-grayscale\"\n type=\"button\"\n (click)=\"clear()\"\n >\n \u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C\n </button>\n }\n </div>\n\n <tui-icon class=\"calendar\" [icon]=\"'@sproc.calendar-date'\"> </tui-icon>\n </div>\n</div>\n\n<ng-template #dropdownContent>\n <tui-calendar-range\n [value]=\"computedTuiDayRange()\"\n [min]=\"calendarMinDay()\"\n [max]=\"calendarMaxDay()\"\n [maxLength]=\"maxLength()\"\n [minLength]=\"minLength()\"\n (valueChange)=\"onCalendarChange($event)\"\n />\n\n <div class=\"time-range\">\n <tui-textfield\n tuiAppearance=\"sproc-input-appearance\"\n [tuiTextfieldSize]=\"'s'\"\n [style.width.px]=\"250\"\n >\n <input\n tuiInputTime\n [mode]=\"timeMode()\"\n [ngModel]=\"timeFrom\"\n (ngModelChange)=\"updateTimeFrom($event)\"\n />\n <tui-icon class=\"clock-icon\" [icon]=\"'@tui.clock'\" [style.font-size.px]=\"16\" />\n </tui-textfield>\n\n <tui-textfield\n tuiAppearance=\"sproc-input-appearance\"\n [tuiTextfieldSize]=\"'s'\"\n [style.width.px]=\"250\"\n >\n <input\n tuiInputTime\n [mode]=\"timeMode()\"\n [ngModel]=\"timeTo\"\n (ngModelChange)=\"updateTimeTo($event)\"\n />\n <tui-icon class=\"clock-icon\" [icon]=\"'@tui.clock'\" [style.font-size.px]=\"16\" />\n </tui-textfield>\n </div>\n</ng-template>\n", styles: [".time-range{width:100%;display:flex;justify-content:space-around;padding-block:16px}.time-range input{box-shadow:none!important}.time-range .clock-icon{margin-right:5px}.multiple-input-box{display:flex;justify-content:space-between;align-items:center;padding:8px 0 8px 4px;padding-inline-start:.75rem}.multiple-input-box .input-items{display:flex;gap:1px}.multiple-input-box .input-items input{border:none;padding:0;background:inherit}.multiple-input-box .input-items input:focus-visible{outline:none!important}.multiple-input-box .input-items input:hover{background:inherit}.multiple-input-box .input-items .delimiter{line-height:16px;height:16px;margin:0 .25ch}.multiple-input-box .input-items .input-date{width:calc(10 * .92ch)}.multiple-input-box .input-items .input-date.show-placeholder{width:100%!important}.multiple-input-box .input-items .input-date.show-placeholder~input,.multiple-input-box .input-items .input-date.show-placeholder~.delimiter{display:none}.multiple-input-box .t-content{display:flex;block-size:var(--t-height);align-items:center;gap:3px;position:relative}.multiple-input-box .t-content .calendar{width:16px;height:16px;color:#1b1f3b66!important}.multiple-input-box .t-content .calendar:hover{color:#1b1f3ba6!important}.multiple-input-box .icon-wrapper{position:absolute;left:-45px;display:flex}.multiple-input-box [tuiIconButton].t-clear{width:16px;height:16px}.multiple-input-box [tuiIconButton].t-clear:before{display:none!important}.multiple-input-box:hover{background:var(--brand-disabled)}.multiple-input-box:hover [tuiIconButton].t-clear:before{display:block!important}.multiple-input-box:focus,.multiple-input-box:focus-within,.multiple-input-box:focus-visible{border-color:var(--tui-background-accent-1);box-shadow:0 0 0 2px var(--tui-background-accent-1-pressed)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "directive", type: i2.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3.TuiInputTimeDirective, selector: "input[tuiInputTime]", inputs: ["accept", "mode", "prefix", "postfix"] }, { kind: "directive", type: MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "component", type: TuiCalendarRange, selector: "tui-calendar-range", inputs: ["disabledItemHandler", "markerHandler", "items", "min", "max", "minLength", "maxLength", "item", "value", "defaultViewedMonth"], outputs: ["valueChange", "itemChange"] }, { kind: "directive", type: i2.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i2.TuiDropdownManual, selector: "[tuiDropdownManual]", inputs: ["tuiDropdownManual"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiActiveZone, selector: "[tuiActiveZone]:not(ng-container), [tuiActiveZoneChange]:not(ng-container), [tuiActiveZoneParent]:not(ng-container)", inputs: ["tuiActiveZoneParent"], outputs: ["tuiActiveZoneChange"], exportAs: ["tuiActiveZone"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiAppearance, selector: "[tuiAppearance]", inputs: ["tuiAppearance", "tuiAppearanceState", "tuiAppearanceFocus", "tuiAppearanceMode"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
379
|
+
}
|
|
380
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CustomDateTimeRangeComponent, decorators: [{
|
|
381
|
+
type: Component,
|
|
382
|
+
args: [{ selector: 'sproc-custom-date-time-range', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
383
|
+
CommonModule,
|
|
384
|
+
ReactiveFormsModule,
|
|
385
|
+
FormsModule,
|
|
386
|
+
TuiTextfield,
|
|
387
|
+
TuiInputTime,
|
|
388
|
+
MaskitoDirective,
|
|
389
|
+
TuiCalendarRange,
|
|
390
|
+
TuiDropdown,
|
|
391
|
+
TuiButton,
|
|
392
|
+
TuiActiveZone,
|
|
393
|
+
TuiIcon,
|
|
394
|
+
TuiAppearance,
|
|
395
|
+
], providers: [
|
|
396
|
+
{
|
|
397
|
+
provide: NG_VALUE_ACCESSOR,
|
|
398
|
+
multi: true,
|
|
399
|
+
useExisting: CustomDateTimeRangeComponent,
|
|
400
|
+
},
|
|
401
|
+
tuiInputTimeOptionsProvider({
|
|
402
|
+
icon: () => '',
|
|
403
|
+
}),
|
|
404
|
+
], template: "@let timeFrom = tuiTimeFrom();\n@let timeTo = tuiTimeTo();\n\n<div\n tuiAppearance=\"sproc-input-appearance\"\n class=\"multiple-input-box\"\n [tuiDropdown]=\"dropdownContent\"\n [tuiDropdownManual]=\"open\"\n (click)=\"onClick()\"\n (tuiActiveZoneChange)=\"onActiveZone($event)\"\n>\n <div class=\"input-items\">\n <input\n #inputItem\n class=\"input-date\"\n [placeholder]=\"datePlaceholder()\"\n [maskito]=\"computedDateMask()\"\n [disabled]=\"disabled\"\n [class.show-placeholder]=\"empty() && !isFocused()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"fromValue()\"\n (ngModelChange)=\"onDateValueChange($event, EInputType.DATE_FROM)\"\n (keyup)=\"onKeyup($event, EInputType.DATE_FROM)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <input\n #inputItem\n class=\"input-time\"\n [placeholder]=\"TIME_PLACEHOLDER\"\n [maskito]=\"computedTimeMask()\"\n [disabled]=\"disabled\"\n [style.width.ch]=\"timeLength()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"fromTimeValue()\"\n (ngModelChange)=\"onTimeValueChange($event, EInputType.TIME_FROM)\"\n (keyup)=\"onKeyup($event, EInputType.TIME_FROM)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"delimiter\">-</span>\n <input\n #inputItem\n class=\"input-date\"\n [placeholder]=\"DATE_PLACEHOLDER\"\n [maskito]=\"computedDateMask()\"\n [disabled]=\"disabled\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"toValue()\"\n (ngModelChange)=\"onDateValueChange($event, EInputType.DATE_TO)\"\n (keyup)=\"onKeyup($event, EInputType.DATE_TO)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <input\n #inputItem\n class=\"input-time\"\n [placeholder]=\"TIME_PLACEHOLDER\"\n [maskito]=\"computedTimeMask()\"\n [disabled]=\"disabled\"\n [style.width.ch]=\"timeLength()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"toTimeValue()\"\n (ngModelChange)=\"onTimeValueChange($event, EInputType.TIME_TO)\"\n (keyup)=\"onKeyup($event, EInputType.TIME_TO)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n </div>\n\n <div class=\"t-content\">\n <div class=\"icon-wrapper\">\n <!-- placeholder for sproc-param-invalid-icon -->\n <ng-content />\n\n @if (forceClear()) {\n <button\n class=\"t-clear\"\n tuiIconButton\n size=\"xs\"\n appearance=\"action-grayscale\"\n type=\"button\"\n (click)=\"clear()\"\n >\n \u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C\n </button>\n }\n </div>\n\n <tui-icon class=\"calendar\" [icon]=\"'@sproc.calendar-date'\"> </tui-icon>\n </div>\n</div>\n\n<ng-template #dropdownContent>\n <tui-calendar-range\n [value]=\"computedTuiDayRange()\"\n [min]=\"calendarMinDay()\"\n [max]=\"calendarMaxDay()\"\n [maxLength]=\"maxLength()\"\n [minLength]=\"minLength()\"\n (valueChange)=\"onCalendarChange($event)\"\n />\n\n <div class=\"time-range\">\n <tui-textfield\n tuiAppearance=\"sproc-input-appearance\"\n [tuiTextfieldSize]=\"'s'\"\n [style.width.px]=\"250\"\n >\n <input\n tuiInputTime\n [mode]=\"timeMode()\"\n [ngModel]=\"timeFrom\"\n (ngModelChange)=\"updateTimeFrom($event)\"\n />\n <tui-icon class=\"clock-icon\" [icon]=\"'@tui.clock'\" [style.font-size.px]=\"16\" />\n </tui-textfield>\n\n <tui-textfield\n tuiAppearance=\"sproc-input-appearance\"\n [tuiTextfieldSize]=\"'s'\"\n [style.width.px]=\"250\"\n >\n <input\n tuiInputTime\n [mode]=\"timeMode()\"\n [ngModel]=\"timeTo\"\n (ngModelChange)=\"updateTimeTo($event)\"\n />\n <tui-icon class=\"clock-icon\" [icon]=\"'@tui.clock'\" [style.font-size.px]=\"16\" />\n </tui-textfield>\n </div>\n</ng-template>\n", styles: [".time-range{width:100%;display:flex;justify-content:space-around;padding-block:16px}.time-range input{box-shadow:none!important}.time-range .clock-icon{margin-right:5px}.multiple-input-box{display:flex;justify-content:space-between;align-items:center;padding:8px 0 8px 4px;padding-inline-start:.75rem}.multiple-input-box .input-items{display:flex;gap:1px}.multiple-input-box .input-items input{border:none;padding:0;background:inherit}.multiple-input-box .input-items input:focus-visible{outline:none!important}.multiple-input-box .input-items input:hover{background:inherit}.multiple-input-box .input-items .delimiter{line-height:16px;height:16px;margin:0 .25ch}.multiple-input-box .input-items .input-date{width:calc(10 * .92ch)}.multiple-input-box .input-items .input-date.show-placeholder{width:100%!important}.multiple-input-box .input-items .input-date.show-placeholder~input,.multiple-input-box .input-items .input-date.show-placeholder~.delimiter{display:none}.multiple-input-box .t-content{display:flex;block-size:var(--t-height);align-items:center;gap:3px;position:relative}.multiple-input-box .t-content .calendar{width:16px;height:16px;color:#1b1f3b66!important}.multiple-input-box .t-content .calendar:hover{color:#1b1f3ba6!important}.multiple-input-box .icon-wrapper{position:absolute;left:-45px;display:flex}.multiple-input-box [tuiIconButton].t-clear{width:16px;height:16px}.multiple-input-box [tuiIconButton].t-clear:before{display:none!important}.multiple-input-box:hover{background:var(--brand-disabled)}.multiple-input-box:hover [tuiIconButton].t-clear:before{display:block!important}.multiple-input-box:focus,.multiple-input-box:focus-within,.multiple-input-box:focus-visible{border-color:var(--tui-background-accent-1);box-shadow:0 0 0 2px var(--tui-background-accent-1-pressed)!important}\n"] }]
|
|
405
|
+
}] });
|
|
406
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXJhbmdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dHMvcGFyYW0tZGF0ZS10aW1lLXJhbmdlL2RhdGUtdGltZS1yYW5nZS9kYXRlLXRpbWUtcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZ2lzdGVyLWJhc2Uvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0cy9wYXJhbS1kYXRlLXRpbWUtcmFuZ2UvZGF0ZS10aW1lLXJhbmdlL2RhdGUtdGltZS1yYW5nZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBRVIsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUNwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxhQUFhLEVBQ2IsWUFBWSxFQUNaLGFBQWEsRUFDYixNQUFNLEVBRU4sV0FBVyxFQUNYLGVBQWUsRUFDZixPQUFPLEdBQ1IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVG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M0IsQ0FBQzsrR0ExYVUsNEJBQTRCO21HQUE1Qiw0QkFBNEIscTlCQVg1QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2dCQUNYLFdBQVcsRUFBRSw0QkFBNEI7YUFDMUM7WUFDRCwyQkFBMkIsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7YUFDZixDQUFDO1NBQ0gsc0lDN0VILDQ5SEFxSUEsODBERDlFSSxZQUFZLDhCQUNaLG1CQUFtQixzWkFDbkIsV0FBVywyckJBR1gsZ0JBQWdCLDZGQUNoQixnQkFBZ0IsNGdCQUVoQixTQUFTLG9JQUNULGFBQWEsZ1FBQ2IsT0FBTyxxRkFDUCxhQUFhOzs0RkFhSiw0QkFBNEI7a0JBL0J4QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLG1CQUdDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixXQUFXO3dCQUNYLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixPQUFPO3dCQUNQLGFBQWE7cUJBQ2QsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixLQUFLLEVBQUUsSUFBSTs0QkFDWCxXQUFXLDhCQUE4Qjt5QkFDMUM7d0JBQ0QsMkJBQTJCLENBQUM7NEJBQzFCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO3lCQUNmLENBQUM7cUJBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgRWxlbWVudFJlZixcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybXNNb2R1bGUsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXNraXRvRGlyZWN0aXZlIH0gZnJvbSAnQG1hc2tpdG8vYW5ndWxhcic7XG5pbXBvcnQge1xuICBUVUlfRklSU1RfREFZLFxuICBUVUlfTEFTVF9EQVksXG4gIFR1aUFjdGl2ZVpvbmUsXG4gIFR1aURheSxcbiAgVHVpRGF5TGlrZSxcbiAgVHVpRGF5UmFuZ2UsXG4gIHR1aU51bGxhYmxlU2FtZSxcbiAgVHVpVGltZSxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBUdWlBcHBlYXJhbmNlLCBUdWlCdXR0b24sIFR1aURyb3Bkb3duLCBUdWlJY29uLCBUdWlUZXh0ZmllbGQgfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBUdWlDYWxlbmRhclJhbmdlLCBUdWlJbnB1dFRpbWUsIHR1aUlucHV0VGltZU9wdGlvbnNQcm92aWRlciB9IGZyb20gJ0B0YWlnYS11aS9raXQnO1xuXG5pbXBvcnQgeyBNYXNraXRvT3B0aW9ucyB9IGZyb20gJ0BtYXNraXRvL2NvcmUnO1xuaW1wb3J0IHtcbiAgbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yLFxuICBNYXNraXRvVGltZU1vZGUsXG4gIG1hc2tpdG9UaW1lT3B0aW9uc0dlbmVyYXRvcixcbn0gZnJvbSAnQG1hc2tpdG8va2l0JztcbmltcG9ydCB7XG4gIERBVEVfTUFYX0xFTkdUSCxcbiAgREFURV9NT0RFLFxuICBEQVRFX1BMQUNFSE9MREVSLFxuICBEQVRFX1NFUEFSQVRPUixcbiAgRUlucHV0VHlwZSxcbiAgVElNRV9QTEFDRUhPTERFUixcbn0gZnJvbSAnLi9kYXRlLXRpbWUtcmFuZ2UuY29uc3RzJztcbmltcG9ydCB7IGFkZERheXMsIGZvcm1hdCwgaXNBZnRlciwgaXNCZWZvcmUsIGlzRXF1YWwgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBFRGF0ZVBhdHRlcm4gfSBmcm9tICcuLi8uLi8uLi8uLi9kaXJlY3RpdmVzL2RhdGUvZGF0ZS10aW1lLnR5cGVzJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3BhcmFtL3BhcmFtLWRhdGUtYmFzZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Nwcm9jLWN1c3RvbS1kYXRlLXRpbWUtcmFuZ2UnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXJhbmdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXJhbmdlLmNvbXBvbmVudC5sZXNzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVHVpVGV4dGZpZWxkLFxuICAgIFR1aUlucHV0VGltZSxcbiAgICBNYXNraXRvRGlyZWN0aXZlLFxuICAgIFR1aUNhbGVuZGFyUmFuZ2UsXG4gICAgVHVpRHJvcGRvd24sXG4gICAgVHVpQnV0dG9uLFxuICAgIFR1aUFjdGl2ZVpvbmUsXG4gICAgVHVpSWNvbixcbiAgICBUdWlBcHBlYXJhbmNlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IEN1c3RvbURhdGVUaW1lUmFuZ2VDb21wb25lbnQsXG4gICAgfSxcbiAgICB0dWlJbnB1dFRpbWVPcHRpb25zUHJvdmlkZXIoe1xuICAgICAgaWNvbjogKCkgPT4gJycsXG4gICAgfSksXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbURhdGVUaW1lUmFuZ2VDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByb3RlY3RlZCBpbnB1dEl0ZW1zID0gdmlld0NoaWxkcmVuPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdpbnB1dEl0ZW0nKTtcblxuICBwdWJsaWMgbWluID0gaW5wdXQ8RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+KG51bGwpO1xuICBwdWJsaWMgbWF4ID0gaW5wdXQ8RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+KG51bGwpO1xuICBwdWJsaWMgbWluTGVuZ3RoID0gaW5wdXQ8VHVpRGF5TGlrZSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgbWF4TGVuZ3RoID0gaW5wdXQ8VHVpRGF5TGlrZSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgdGltZU1vZGUgPSBpbnB1dDxNYXNraXRvVGltZU1vZGU+KCdISDpNTScpO1xuICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dCgn0JLRi9Cx0LXRgNC40YLQtSDQv9C10YDQuNC+0LQnKTtcbiAgcHVibGljIGZvcmNlQ2xlYXIgPSBpbnB1dCh0cnVlKTtcblxuICBwcm90ZWN0ZWQgdmFsdWUgPSBzaWduYWw8RGF0ZVJhbmdlVHlwZSB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBDb250cm9sVmFsdWVBY2Nlc3NvciBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzICovXG4gIHB1YmxpYyBvbkNoYW5nZSA9ICh2YWw6IGFueSk6IHZvaWQgPT4ge1xuICAgIGNvbnNvbGUud2Fybignb25DaGFuZ2UnLCB2YWwpO1xuICB9O1xuXG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7fTtcblxuICBwdWJsaWMgdG91Y2hlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKiogTWV0aG9kIDE6IEZyYW1ld29yayB3cml0ZXMgdmFsdWUgdG8geW91ciBjb21wb25lbnQgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUoZGF0ZTogRGF0ZVJhbmdlVHlwZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlLnNldChkYXRlKTtcbiAgICB0aGlzLnJlc2V0U2lnbmFscygpO1xuICB9XG4gIC8qKiBNZXRob2QgMjogUmVnaXN0ZXIgY2FsbGJhY2sgZm9yIHdoZW4gdmFsdWUgY2hhbmdlcyAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG4gIC8qKiBNZXRob2QgMzogUmVnaXN0ZXIgY2FsbGJhY2sgZm9yIHdoZW4gdXNlciB0b3VjaGVzIGNvbnRyb2wgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gIH1cblxuICAvKiogTWV0aG9kIDQ6IEhhbmRsZSBkaXNhYmxlZCBzdGF0ZSAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrQXNUb3VjaGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKiogbWV0aG9kIHRvIG5vdGlmeSBwYXJlbnQgZm9ybSBvbiBjb250cm9sIHZhbHVlIGNoYW5nZXMgYnkgdXNlciBpbnRlcmFjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZSh2YWw6IERhdGVSYW5nZVR5cGUgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnZhbHVlLnNldCh2YWwpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBjdXN0b20gZGF0ZS10aW1lLXJhbmdlIGNvbXBvbmVudCBwcm9wcyBhbmQgbWV0aG9kcyAqL1xuICBwcm90ZWN0ZWQgb3BlbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgRUlucHV0VHlwZSA9IEVJbnB1dFR5cGU7XG4gIHByb3RlY3RlZCBEQVRFX1BMQUNFSE9MREVSID0gREFURV9QTEFDRUhPTERFUjtcbiAgcHJvdGVjdGVkIFRJTUVfUExBQ0VIT0xERVIgPSBUSU1FX1BMQUNFSE9MREVSO1xuICBwcm90ZWN0ZWQgaXNGb2N1c2VkID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgY2FsZW5kYXJNaW5EYXkgPSBjb21wdXRlZDxUdWlEYXk+KCgpID0+IHtcbiAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5taW4oKTtcbiAgICByZXR1cm4gbWluRGF0ZSA/IFR1aURheS5mcm9tTG9jYWxOYXRpdmVEYXRlKG1pbkRhdGUpIDogVFVJX0ZJUlNUX0RBWTtcbiAgfSk7XG4gIHByb3RlY3RlZCBjYWxlbmRhck1heERheSA9IGNvbXB1dGVkPFR1aURheT4oKCkgPT4ge1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heCgpO1xuICAgIHJldHVybiBtYXhEYXRlID8gVHVpRGF5LmZyb21Mb2NhbE5hdGl2ZURhdGUobWF4RGF0ZSkgOiBUVUlfTEFTVF9EQVk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCB0aW1lTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50aW1lTW9kZSgpLmxlbmd0aCAqIDAuOTUpO1xuXG4gIHByaXZhdGUgX2RhdGVGcm9tID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfZGF0ZVRvID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcblxuICBwcml2YXRlIF90aW1lRnJvbSA9IHNpZ25hbDxUdWlUaW1lIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX3RpbWVUbyA9IHNpZ25hbDxUdWlUaW1lIHwgbnVsbD4obnVsbCk7XG5cbiAgcHJpdmF0ZSBfY3VycmVudERheVJhbmdlID0gY29tcHV0ZWQ8RGF0ZVJhbmdlVHlwZSB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBmcm9tRGF0ZSA9IHRoaXMuX2RhdGVGcm9tKCkgfHwgdGhpcy52YWx1ZSgpPy5mcm9tO1xuICAgIGNvbnN0IHRvRGF0ZSA9IHRoaXMuX2RhdGVUbygpIHx8IHRoaXMudmFsdWUoKT8udG87XG4gICAgaWYgKGZyb21EYXRlICYmIHRvRGF0ZSkge1xuICAgICAgcmV0dXJuIGlzQmVmb3JlKGZyb21EYXRlLCB0b0RhdGUpXG4gICAgICAgID8geyBmcm9tOiBmcm9tRGF0ZSwgdG86IHRvRGF0ZSB9XG4gICAgICAgIDogeyBmcm9tOiB0b0RhdGUsIHRvOiBmcm9tRGF0ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfY3VycmVudFRpbWVGcm9tID0gY29tcHV0ZWQ8VHVpVGltZT4oXG4gICAgKCkgPT4gdGhpcy5fdGltZUZyb20oKSB8fCB0aGlzLnR1aVRpbWVGcm9tKCkgfHwgbmV3IFR1aVRpbWUoMCwgMCwgMClcbiAgKTtcblxuICBwcml2YXRlIF9jdXJyZW50VGltZVRvID0gY29tcHV0ZWQ8VHVpVGltZT4oXG4gICAgKCkgPT4gdGhpcy5fdGltZVRvKCkgfHwgdGhpcy50dWlUaW1lVG8oKSB8fCBuZXcgVHVpVGltZSgyMywgNTksIDU5KVxuICApO1xuXG4gIC8qKiByYW5nZSBjb21wdXRlZCBmcm9tIHZhbHVlICovXG4gIHByb3RlY3RlZCBjb21wdXRlZFR1aURheVJhbmdlID0gY29tcHV0ZWQ8VHVpRGF5UmFuZ2UgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbmF0aXZlUmFuZ2UgPSB0aGlzLnZhbHVlKCk7XG4gICAgaWYgKCFuYXRpdmVSYW5nZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtmcm9tRGF0ZV0gPSB0aGlzLmZyb21OYXRpdmVUb1R1aShuYXRpdmVSYW5nZS5mcm9tKTtcbiAgICBjb25zdCBbdG9EYXRlXSA9IHRoaXMuZnJvbU5hdGl2ZVRvVHVpKG5hdGl2ZVJhbmdlLnRvKTtcblxuICAgIHJldHVybiBuZXcgVHVpRGF5UmFuZ2UoZnJvbURhdGUsIHRvRGF0ZSk7XG4gIH0pO1xuXG4gIC8qKiBjb21wdXRlZCB0aW1lRnJvbSBmcm9tIHZhbHVlICovXG4gIHByb3RlY3RlZCB0dWlUaW1lRnJvbSA9IGNvbXB1dGVkPFR1aVRpbWUgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbmF0aXZlUmFuZ2UgPSB0aGlzLnZhbHVlKCk7XG4gICAgaWYgKCFuYXRpdmVSYW5nZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFssIHRpbWVGcm9tXSA9IHRoaXMuZnJvbU5hdGl2ZVRvVHVpKG5hdGl2ZVJhbmdlLmZyb20pO1xuXG4gICAgcmV0dXJuIHRpbWVGcm9tO1xuICB9KTtcblxuICAvKiogY29tcHV0ZWQgdGltZVRvIGZyb20gdmFsdWUgKi9cbiAgcHJvdGVjdGVkIHR1aVRpbWVUbyA9IGNvbXB1dGVkPFR1aVRpbWUgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbmF0aXZlUmFuZ2UgPSB0aGlzLnZhbHVlKCk7XG4gICAgaWYgKCFuYXRpdmVSYW5nZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFssIHRpbWVUb10gPSB0aGlzLmZyb21OYXRpdmVUb1R1aShuYXRpdmVSYW5nZS50byk7XG5cbiAgICByZXR1cm4gdGltZVRvO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgZnJvbVZhbHVlID0gY29tcHV0ZWQ8c3RyaW5nIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IGZyb20gPSB0aGlzLnZhbHVlKCk/LmZyb20gfHwgbnVsbDtcbiAgICBpZiAoZnJvbSkge1xuICAgICAgcmV0dXJuIGZvcm1hdChmcm9tLCBFRGF0ZVBhdHRlcm4uREFURSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgdG9WYWx1ZSA9IGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCB0byA9IHRoaXMudmFsdWUoKT8udG8gfHwgbnVsbDtcbiAgICBpZiAodG8pIHtcbiAgICAgIHJldHVybiBmb3JtYXQodG8sIEVEYXRlUGF0dGVybi5EQVRFKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBmcm9tVGltZVZhbHVlID0gY29tcHV0ZWQ8c3RyaW5nIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IGZyb21UaW1lID0gdGhpcy50dWlUaW1lRnJvbSgpO1xuICAgIGlmIChmcm9tVGltZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGltZVRvU3RyaW5nKGZyb21UaW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCB0b1RpbWVWYWx1ZSA9IGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCB0b1RpbWUgPSB0aGlzLnR1aVRpbWVUbygpO1xuICAgIGlmICh0b1RpbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWVUb1N0cmluZyh0b1RpbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIGVtcHR5ID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMudmFsdWUoKSk7XG5cbiAgcHJvdGVjdGVkIGRhdGVQbGFjZWhvbGRlciA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5pc0ZvY3VzZWQoKSA/IERBVEVfUExBQ0VIT0xERVIgOiB0aGlzLnBsYWNlaG9sZGVyKClcbiAgKTtcblxuICBwcm90ZWN0ZWQgdGltZU1heExlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudGltZU1vZGUoKS5sZW5ndGgpO1xuXG4gIHByb3RlY3RlZCBvbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Gb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9jdXNlZC5zZXQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuaXNGb2N1c2VkLnNldChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BY3RpdmVab25lKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMub3BlbiA9IGFjdGl2ZSAmJiB0aGlzLm9wZW47XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcHV0ZWREYXRlTWFzayA9IGNvbXB1dGVkPE1hc2tpdG9PcHRpb25zPigoKSA9PiB7XG4gICAgY29uc3QgbWluID0gdGhpcy5jYWxlbmRhck1pbkRheSgpLnRvTG9jYWxOYXRpdmVEYXRlKCk7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5jYWxlbmRhck1heERheSgpLnRvTG9jYWxOYXRpdmVEYXRlKCk7XG5cbiAgICByZXR1cm4gbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yKHtcbiAgICAgIG1vZGU6IERBVEVfTU9ERSxcbiAgICAgIHNlcGFyYXRvcjogREFURV9TRVBBUkFUT1IsXG4gICAgICBtaW4sXG4gICAgICBtYXgsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBjb21wdXRlZFRpbWVNYXNrID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1vZGUgPSB0aGlzLnRpbWVNb2RlKCk7XG4gICAgcmV0dXJuIG1hc2tpdG9UaW1lT3B0aW9uc0dlbmVyYXRvcih7XG4gICAgICBtb2RlLFxuICAgIH0pO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgb25DYWxlbmRhckNoYW5nZShyYW5nZTogVHVpRGF5UmFuZ2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgcmFuZ2UgJiZcbiAgICAgICF0dWlOdWxsYWJsZVNhbWU8VHVpRGF5UmFuZ2U+KHRoaXMuY29tcHV0ZWRUdWlEYXlSYW5nZSgpLCByYW5nZSwgKGEsIGIpID0+IGE/LmRheVNhbWUoYikpXG4gICAgKSB7XG4gICAgICBjb25zdCBuYXRpdmVEYXRlUmFuZ2UgPSB0aGlzLnRyYW5zZm9ybVJhbmdlKHJhbmdlKTtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZShuYXRpdmVEYXRlUmFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVUaW1lRnJvbSh0aW1lRnJvbTogVHVpVGltZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyRnJvbSA9IHRoaXMudHVpVGltZUZyb20oKTtcbiAgICBpZiAoY3VyckZyb20gPT09IHRpbWVGcm9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RpbWVGcm9tLnNldCh0aW1lRnJvbSk7XG4gICAgY29uc3QgY3VycmVudFJhbmdlID0gdGhpcy52YWx1ZSgpO1xuXG4gICAgaWYgKGN1cnJlbnRSYW5nZSkge1xuICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0gdGhpcy5nZXRVcGRhdGVkRGF0ZVRpbWUoY3VycmVudFJhbmdlKTtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZSh7IGZyb20sIHRvIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVUaW1lVG8odGltZVRvOiBUdWlUaW1lIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJUbyA9IHRoaXMudHVpVGltZVRvKCk7XG4gICAgaWYgKGN1cnJUbyA9PT0gdGltZVRvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RpbWVUby5zZXQodGltZVRvKTtcbiAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSB0aGlzLnZhbHVlKCk7XG5cbiAgICBpZiAoY3VycmVudFJhbmdlKSB7XG4gICAgICBjb25zdCB7IGZyb20sIHRvIH0gPSB0aGlzLmdldFVwZGF0ZWREYXRlVGltZShjdXJyZW50UmFuZ2UpO1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRVcGRhdGVkRGF0ZVRpbWUoY3VycmVudFJhbmdlOiBEYXRlUmFuZ2VUeXBlKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgY29uc3QgeyBob3VyczogZnJvbUhvdXJzLCBtaW51dGVzOiBmcm9tTWluLCBzZWNvbmRzOiBmcm9tU2VjIH0gPSB0aGlzLl9jdXJyZW50VGltZUZyb20oKTtcbiAgICBjb25zdCB7IGhvdXJzOiB0b0hvdXJzLCBtaW51dGVzOiB0b01pbiwgc2Vjb25kczogdG9TZWMgfSA9IHRoaXMuX2N1cnJlbnRUaW1lVG8oKTtcbiAgICBjb25zdCBmcm9tID0gbmV3IERhdGUoY3VycmVudFJhbmdlLmZyb20uc2V0SG91cnMoZnJvbUhvdXJzLCBmcm9tTWluLCBmcm9tU2VjKSk7XG4gICAgY29uc3QgdG8gPSBuZXcgRGF0ZShjdXJyZW50UmFuZ2UudG8uc2V0SG91cnModG9Ib3VycywgdG9NaW4sIHRvU2VjKSk7XG5cbiAgICByZXR1cm4geyBmcm9tLCB0byB9O1xuICB9XG5cbiAgLyoqIG1ldGhvZCB0byBmb2N1cyBvbiBuZXh0IGlucHV0IHdoZW4gcHJldiBpcyBmaWxsZWQgKi9cbiAgcHJvdGVjdGVkIG9uS2V5dXAoZTogS2V5Ym9hcmRFdmVudCwgdHlwZTogRUlucHV0VHlwZSk6IHZvaWQge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBpZHggPSBPYmplY3QudmFsdWVzKEVJbnB1dFR5cGUpLmluZGV4T2YodHlwZSk7XG5cbiAgICBpZiAoaWR4ID09PSAzIHx8IHRoaXMuaW5wdXRJdGVtc0FyZUZpbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5wdXQgPSB0aGlzLmlucHV0SXRlbXMoKVtpZHhdO1xuICAgIGNvbnN0IGN1cnJlbnRMZW4gPSBjdXJyZW50SW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlPy5sZW5ndGg7XG4gICAgY29uc3QgbWF4TGVuID0gdGhpcy5nZXRJbnB1dE1heExlbmd0aCh0eXBlKTtcbiAgICBjb25zdCBpc0ZvY3VzTmV4dCA9IGN1cnJlbnRMZW4gPT09IG1heExlbjtcbiAgICBpZiAoaXNGb2N1c05leHQpIHtcbiAgICAgIGNvbnN0IG5leHRJbnB1dCA9IHRoaXMuaW5wdXRJdGVtcygpW2lkeCArIDFdO1xuICAgICAgbmV4dElucHV0Py5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0U2lnbmFscygpO1xuICAgIHRoaXMuY2xlYXJJbnB1dEl0ZW1zKCk7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlKG51bGwpO1xuICB9XG5cbiAgLyoqIHVwZGF0ZSB2YWx1ZSBtZXRob2QgZm9yIGRhdGUgaW5wdXRJdGVtcyAqL1xuICBwcm90ZWN0ZWQgb25EYXRlVmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU6IEVJbnB1dFR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBpc1ZhbGlkID0gdmFsdWU/Lmxlbmd0aCA9PT0gREFURV9NQVhfTEVOR1RIO1xuXG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IEVJbnB1dFR5cGUuREFURV9GUk9NKSB7XG4gICAgICB0aGlzLnNldERhdGVGcm9tKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEVJbnB1dFR5cGUuREFURV9UTykge1xuICAgICAgdGhpcy5zZXREYXRlVG8odmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSB0aGlzLl9jdXJyZW50RGF5UmFuZ2UoKTtcblxuICAgIGlmIChjdXJyZW50UmFuZ2UpIHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHRoaXMuZ2V0VXBkYXRlZERhdGVUaW1lKGN1cnJlbnRSYW5nZSk7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UoeyBmcm9tLCB0byB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogdXBkYXRlIHZhbHVlIG1ldGhvZCBmb3IgdGltZSBpbnB1dEl0ZW1zICovXG4gIHByb3RlY3RlZCBvblRpbWVWYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZTogRUlucHV0VHlwZSk6IHZvaWQge1xuICAgIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZT8ubGVuZ3RoID09PSB0aGlzLnRpbWVNYXhMZW5ndGgoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEVJbnB1dFR5cGUuVElNRV9GUk9NKSB7XG4gICAgICBjb25zdCB0aW1lRnJvbSA9IHRoaXMuZ2V0VHVpVGltZUZyb21TdHJpbmcodmFsdWUpO1xuICAgICAgdGhpcy5fdGltZUZyb20uc2V0KHRpbWVGcm9tKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEVJbnB1dFR5cGUuVElNRV9UTykge1xuICAgICAgY29uc3QgdGltZVRvID0gdGhpcy5nZXRUdWlUaW1lRnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICB0aGlzLl90aW1lVG8uc2V0KHRpbWVUbyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJhbmdlID0gdGhpcy5fY3VycmVudERheVJhbmdlKCk7XG5cbiAgICBpZiAoY3VycmVudFJhbmdlKSB7XG4gICAgICBjb25zdCB7IGZyb20sIHRvIH0gPSB0aGlzLmdldFVwZGF0ZWREYXRlVGltZShjdXJyZW50UmFuZ2UpO1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUdWlUaW1lRnJvbVN0cmluZyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGFyciA9IHN0ci5zcGxpdCgnOicpO1xuICAgIGNvbnN0IFtob3VyU3RyLCBtaW5TdHIsIHNlY1N0cl0gPSBhcnI7XG4gICAgY29uc3QgaG91cnMgPSBOdW1iZXIoaG91clN0cik7XG4gICAgY29uc3QgbWluID0gTnVtYmVyKG1pblN0cik7XG4gICAgY29uc3Qgc2VjID0gTnVtYmVyKHNlY1N0ciA/PyAwKTtcbiAgICByZXR1cm4gbmV3IFR1aVRpbWUoaG91cnMsIG1pbiwgc2VjKTtcbiAgfVxuXG4gIHByaXZhdGUgdGltZVRvU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVHVpVGltZSA/IHZhbHVlLnRvU3RyaW5nKHRoaXMudGltZU1vZGUoKSkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnB1dE1heExlbmd0aChpbnB1dFR5cGU6IEVJbnB1dFR5cGUpOiBudW1iZXIge1xuICAgIHJldHVybiBpbnB1dFR5cGUgPT09IEVJbnB1dFR5cGUuREFURV9GUk9NIHx8IGlucHV0VHlwZSA9PT0gRUlucHV0VHlwZS5EQVRFX1RPXG4gICAgICA/IERBVEVfTUFYX0xFTkdUSFxuICAgICAgOiB0aGlzLnRpbWVNYXhMZW5ndGgoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlucHV0SXRlbXNBcmVGaWxsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXRzID0gdGhpcy5pbnB1dEl0ZW1zKCk7XG4gICAgcmV0dXJuIGlucHV0cy5ldmVyeSgoaXRlbSkgPT4gISFpdGVtLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRlRnJvbShkYXRlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmcm9tRGF0ZSA9IHRoaXMuZ2V0TmF0aXZlRnJvbVN0cmluZyhkYXRlKTtcbiAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5jYWxlbmRhck1pbkRheSgpLnRvTG9jYWxOYXRpdmVEYXRlKCk7XG4gICAgY29uc3QgaXNTYW1lT3JBZnRlciA9IGlzQWZ0ZXIoZnJvbURhdGUsIG1pbkRhdGUpIHx8IGlzRXF1YWwoZnJvbURhdGUsIG1pbkRhdGUpO1xuICAgIGNvbnN0IGZyb20gPSBpc1NhbWVPckFmdGVyID8gZnJvbURhdGUgOiBtaW5EYXRlO1xuXG4gICAgdGhpcy5fZGF0ZUZyb20uc2V0KGZyb20pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRlVG8oZGF0ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdG9EYXRlID0gdGhpcy5nZXROYXRpdmVGcm9tU3RyaW5nKGRhdGUpO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGVCYXNlZE9uTWF4TGVuZ3RoID8/IHRoaXMuY2FsZW5kYXJNYXhEYXkoKS50b0xvY2FsTmF0aXZlRGF0ZSgpO1xuICAgIGNvbnN0IGlzU2FtZU9yQmVmb3JlID0gaXNCZWZvcmUodG9EYXRlLCBtYXhEYXRlKSB8fCBpc0VxdWFsKHRvRGF0ZSwgbWF4RGF0ZSk7XG4gICAgY29uc3QgdG8gPSBpc1NhbWVPckJlZm9yZSA/IHRvRGF0ZSA6IG1heERhdGU7XG4gICAgdGhpcy5fZGF0ZVRvLnNldCh0byk7XG4gIH1cblxuICBwcml2YXRlIGdldCBtYXhEYXRlQmFzZWRPbk1heExlbmd0aCgpOiBEYXRlIHwgbnVsbCB7XG4gICAgY29uc3QgbWF4TGVuID0gdGhpcy5tYXhMZW5ndGgoKTtcbiAgICBjb25zdCBmcm9tRGF0ZSA9IHRoaXMuX2RhdGVGcm9tKCkgPz8gdGhpcy52YWx1ZSgpPy5mcm9tO1xuICAgIGlmIChtYXhMZW4/LmRheSAmJiBmcm9tRGF0ZSkge1xuICAgICAgY29uc3QgbWF4TGVuRGF5ID0gYWRkRGF5cyhmcm9tRGF0ZSwgbWF4TGVuLmRheSAtIDEpO1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMuY2FsZW5kYXJNYXhEYXkoKS50b0xvY2FsTmF0aXZlRGF0ZSgpO1xuXG4gICAgICByZXR1cm4gaXNCZWZvcmUobWF4TGVuRGF5LCBtYXhEYXRlKSA/IG1heExlbkRheSA6IG1heERhdGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROYXRpdmVGcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogRGF0ZSB7XG4gICAgY29uc3QgYXJyID0gc3RyLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgW2RheVN0ciwgbW9udGhTdHIsIHllYXJTdHJdID0gYXJyO1xuICAgIGNvbnN0IHllYXIgPSBOdW1iZXIoeWVhclN0cik7XG4gICAgY29uc3QgbW9udGggPSBOdW1iZXIobW9udGhTdHIpIC0gMTtcbiAgICBjb25zdCBkYXkgPSBOdW1iZXIoZGF5U3RyKTtcbiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2lnbmFscygpIHtcbiAgICB0aGlzLl9kYXRlRnJvbS5zZXQobnVsbCk7XG4gICAgdGhpcy5fZGF0ZVRvLnNldChudWxsKTtcbiAgICB0aGlzLl90aW1lRnJvbS5zZXQobnVsbCk7XG4gICAgdGhpcy5fdGltZVRvLnNldChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJJbnB1dEl0ZW1zKCkge1xuICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuaW5wdXRJdGVtcygpO1xuICAgIGZvciAoY29uc3QgZWwgb2YgaW5wdXRzKSB7XG4gICAgICBpZiAoZWw/Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlKSB7XG4gICAgICAgIGVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybVJhbmdlKGRheVJhbmdlOiBUdWlEYXlSYW5nZSk6IERhdGVSYW5nZVR5cGUge1xuICAgIGNvbnN0IHsgZnJvbTogZnJvbURhdGUsIHRvOiB0b0RhdGUgfSA9IGRheVJhbmdlO1xuICAgIGNvbnN0IGZyb21UaW1lID0gdGhpcy5fY3VycmVudFRpbWVGcm9tKCk7XG4gICAgY29uc3QgdG9UaW1lID0gdGhpcy5fY3VycmVudFRpbWVUbygpO1xuICAgIGNvbnN0IGZyb20gPSB0aGlzLmZyb21UdWlUb05hdGl2ZShmcm9tRGF0ZSwgZnJvbVRpbWUpO1xuICAgIGNvbnN0IHRvID0gdGhpcy5mcm9tVHVpVG9OYXRpdmUodG9EYXRlLCB0b1RpbWUpO1xuICAgIHJldHVybiB7IGZyb20sIHRvIH07XG4gIH1cblxuICBwcml2YXRlIGZyb21UdWlUb05hdGl2ZShkYXRlOiBUdWlEYXksIHRpbWU6IFR1aVRpbWUgfCBudWxsKTogRGF0ZSB7XG4gICAgY29uc3QgbmF0aXZlRGF0ZSA9IGRhdGUudG9Mb2NhbE5hdGl2ZURhdGUoKTtcbiAgICBpZiAodGltZSkge1xuICAgICAgY29uc3QgeyBob3VycyA9IDAsIG1pbnV0ZXMgPSAwLCBzZWNvbmRzID0gMCB9ID0gdGltZTtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShuYXRpdmVEYXRlLnNldEhvdXJzKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSk7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBmcm9tTmF0aXZlVG9UdWkoZGF0ZTogRGF0ZSk6IFtUdWlEYXksIFR1aVRpbWVdIHtcbiAgICBjb25zdCB0dWlEYXkgPSBUdWlEYXkuZnJvbUxvY2FsTmF0aXZlRGF0ZShkYXRlKTtcbiAgICBjb25zdCB0dWlUaW1lID0gbmV3IFR1aVRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCkpO1xuICAgIHJldHVybiBbdHVpRGF5LCB0dWlUaW1lXTtcbiAgfVxufVxuIiwiQGxldCB0aW1lRnJvbSA9IHR1aVRpbWVGcm9tKCk7XG5AbGV0IHRpbWVUbyA9IHR1aVRpbWVUbygpO1xuXG48ZGl2XG4gIHR1aUFwcGVhcmFuY2U9XCJzcHJvYy1pbnB1dC1hcHBlYXJhbmNlXCJcbiAgY2xhc3M9XCJtdWx0aXBsZS1pbnB1dC1ib3hcIlxuICBbdHVpRHJvcGRvd25dPVwiZHJvcGRvd25Db250ZW50XCJcbiAgW3R1aURyb3Bkb3duTWFudWFsXT1cIm9wZW5cIlxuICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgKHR1aUFjdGl2ZVpvbmVDaGFuZ2UpPVwib25BY3RpdmVab25lKCRldmVudClcIlxuPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtaXRlbXNcIj5cbiAgICA8aW5wdXRcbiAgICAgICNpbnB1dEl0ZW1cbiAgICAgIGNsYXNzPVwiaW5wdXQtZGF0ZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0ZVBsYWNlaG9sZGVyKClcIlxuICAgICAgW21hc2tpdG9dPVwiY29tcHV0ZWREYXRlTWFzaygpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbY2xhc3Muc2hvdy1wbGFjZWhvbGRlcl09XCJlbXB0eSgpICYmICFpc0ZvY3VzZWQoKVwiXG4gICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgW25nTW9kZWxdPVwiZnJvbVZhbHVlKClcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EYXRlVmFsdWVDaGFuZ2UoJGV2ZW50LCBFSW5wdXRUeXBlLkRBVEVfRlJPTSlcIlxuICAgICAgKGtleXVwKT1cIm9uS2V5dXAoJGV2ZW50LCBFSW5wdXRUeXBlLkRBVEVfRlJPTSlcIlxuICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXG4gICAgLz5cbiAgICA8aW5wdXRcbiAgICAgICNpbnB1dEl0ZW1cbiAgICAgIGNsYXNzPVwiaW5wdXQtdGltZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiVElNRV9QTEFDRUhPTERFUlwiXG4gICAgICBbbWFza2l0b109XCJjb21wdXRlZFRpbWVNYXNrKClcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtzdHlsZS53aWR0aC5jaF09XCJ0aW1lTGVuZ3RoKClcIlxuICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgIFtuZ01vZGVsXT1cImZyb21UaW1lVmFsdWUoKVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvblRpbWVWYWx1ZUNoYW5nZSgkZXZlbnQsIEVJbnB1dFR5cGUuVElNRV9GUk9NKVwiXG4gICAgICAoa2V5dXApPVwib25LZXl1cCgkZXZlbnQsIEVJbnB1dFR5cGUuVElNRV9GUk9NKVwiXG4gICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAvPlxuICAgIDxzcGFuIGNsYXNzPVwiZGVsaW1pdGVyXCI+LTwvc3Bhbj5cbiAgICA8aW5wdXRcbiAgICAgICNpbnB1dEl0ZW1cbiAgICAgIGNsYXNzPVwiaW5wdXQtZGF0ZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiREFURV9QTEFDRUhPTERFUlwiXG4gICAgICBbbWFza2l0b109XCJjb21wdXRlZERhdGVNYXNrKClcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICBbbmdNb2RlbF09XCJ0b1ZhbHVlKClcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EYXRlVmFsdWVDaGFuZ2UoJGV2ZW50LCBFSW5wdXRUeXBlLkRBVEVfVE8pXCJcbiAgICAgIChrZXl1cCk9XCJvbktleXVwKCRldmVudCwgRUlucHV0VHlwZS5EQVRFX1RPKVwiXG4gICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAvPlxuICAgIDxpbnB1dFxuICAgICAgI2lucHV0SXRlbVxuICAgICAgY2xhc3M9XCJpbnB1dC10aW1lXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJUSU1FX1BMQUNFSE9MREVSXCJcbiAgICAgIFttYXNraXRvXT1cImNvbXB1dGVkVGltZU1hc2soKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3N0eWxlLndpZHRoLmNoXT1cInRpbWVMZW5ndGgoKVwiXG4gICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgW25nTW9kZWxdPVwidG9UaW1lVmFsdWUoKVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvblRpbWVWYWx1ZUNoYW5nZSgkZXZlbnQsIEVJbnB1dFR5cGUuVElNRV9UTylcIlxuICAgICAgKGtleXVwKT1cIm9uS2V5dXAoJGV2ZW50LCBFSW5wdXRUeXBlLlRJTUVfVE8pXCJcbiAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxuICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgIC8+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0LWNvbnRlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWNvbi13cmFwcGVyXCI+XG4gICAgICA8IS0tIHBsYWNlaG9sZGVyIGZvciBzcHJvYy1wYXJhbS1pbnZhbGlkLWljb24gLS0+XG4gICAgICA8bmctY29udGVudCAvPlxuXG4gICAgICBAaWYgKGZvcmNlQ2xlYXIoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJ0LWNsZWFyXCJcbiAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwiYWN0aW9uLWdyYXlzY2FsZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyKClcIlxuICAgICAgICA+XG4gICAgICAgICAg0J7Rh9C40YHRgtC40YLRjFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIDx0dWktaWNvbiBjbGFzcz1cImNhbGVuZGFyXCIgW2ljb25dPVwiJ0BzcHJvYy5jYWxlbmRhci1kYXRlJ1wiPiA8L3R1aS1pY29uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3duQ29udGVudD5cbiAgPHR1aS1jYWxlbmRhci1yYW5nZVxuICAgIFt2YWx1ZV09XCJjb21wdXRlZFR1aURheVJhbmdlKClcIlxuICAgIFttaW5dPVwiY2FsZW5kYXJNaW5EYXkoKVwiXG4gICAgW21heF09XCJjYWxlbmRhck1heERheSgpXCJcbiAgICBbbWF4TGVuZ3RoXT1cIm1heExlbmd0aCgpXCJcbiAgICBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aCgpXCJcbiAgICAodmFsdWVDaGFuZ2UpPVwib25DYWxlbmRhckNoYW5nZSgkZXZlbnQpXCJcbiAgLz5cblxuICA8ZGl2IGNsYXNzPVwidGltZS1yYW5nZVwiPlxuICAgIDx0dWktdGV4dGZpZWxkXG4gICAgICB0dWlBcHBlYXJhbmNlPVwic3Byb2MtaW5wdXQtYXBwZWFyYW5jZVwiXG4gICAgICBbdHVpVGV4dGZpZWxkU2l6ZV09XCIncydcIlxuICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIjI1MFwiXG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR1aUlucHV0VGltZVxuICAgICAgICBbbW9kZV09XCJ0aW1lTW9kZSgpXCJcbiAgICAgICAgW25nTW9kZWxdPVwidGltZUZyb21cIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVUaW1lRnJvbSgkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgICA8dHVpLWljb24gY2xhc3M9XCJjbG9jay1pY29uXCIgW2ljb25dPVwiJ0B0dWkuY2xvY2snXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09XCIxNlwiIC8+XG4gICAgPC90dWktdGV4dGZpZWxkPlxuXG4gICAgPHR1aS10ZXh0ZmllbGRcbiAgICAgIHR1aUFwcGVhcmFuY2U9XCJzcHJvYy1pbnB1dC1hcHBlYXJhbmNlXCJcbiAgICAgIFt0dWlUZXh0ZmllbGRTaXplXT1cIidzJ1wiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiMjUwXCJcbiAgICA+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHVpSW5wdXRUaW1lXG4gICAgICAgIFttb2RlXT1cInRpbWVNb2RlKClcIlxuICAgICAgICBbbmdNb2RlbF09XCJ0aW1lVG9cIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVUaW1lVG8oJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPHR1aS1pY29uIGNsYXNzPVwiY2xvY2staWNvblwiIFtpY29uXT1cIidAdHVpLmNsb2NrJ1wiIFtzdHlsZS5mb250LXNpemUucHhdPVwiMTZcIiAvPlxuICAgIDwvdHVpLXRleHRmaWVsZD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const DATE_MODE = 'dd/mm/yyyy';
|
|
2
|
+
export const DATE_SEPARATOR = '.';
|
|
3
|
+
export var EInputType;
|
|
4
|
+
(function (EInputType) {
|
|
5
|
+
EInputType["DATE_FROM"] = "DATE_FROM";
|
|
6
|
+
EInputType["TIME_FROM"] = "TIME_FROM";
|
|
7
|
+
EInputType["DATE_TO"] = "DATE_TO";
|
|
8
|
+
EInputType["TIME_TO"] = "TIME_TO";
|
|
9
|
+
})(EInputType || (EInputType = {}));
|
|
10
|
+
export const DATE_MAX_LENGTH = 10;
|
|
11
|
+
export const DATE_PLACEHOLDER = '__.__.____';
|
|
12
|
+
export const TIME_PLACEHOLDER = '__:__';
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXJhbmdlLmNvbnN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dHMvcGFyYW0tZGF0ZS10aW1lLXJhbmdlL2RhdGUtdGltZS1yYW5nZS9kYXRlLXRpbWUtcmFuZ2UuY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBb0IsWUFBWSxDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFFbEMsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixxQ0FBdUIsQ0FBQTtJQUN2QixxQ0FBdUIsQ0FBQTtJQUN2QixpQ0FBbUIsQ0FBQTtJQUNuQixpQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBRWxDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUM3QyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNraXRvRGF0ZU1vZGUgfSBmcm9tICdAbWFza2l0by9raXQnO1xuXG5leHBvcnQgY29uc3QgREFURV9NT0RFOiBNYXNraXRvRGF0ZU1vZGUgPSAnZGQvbW0veXl5eSc7XG5leHBvcnQgY29uc3QgREFURV9TRVBBUkFUT1IgPSAnLic7XG5cbmV4cG9ydCBlbnVtIEVJbnB1dFR5cGUge1xuICBEQVRFX0ZST00gPSAnREFURV9GUk9NJyxcbiAgVElNRV9GUk9NID0gJ1RJTUVfRlJPTScsXG4gIERBVEVfVE8gPSAnREFURV9UTycsXG4gIFRJTUVfVE8gPSAnVElNRV9UTycsXG59XG5cbmV4cG9ydCBjb25zdCBEQVRFX01BWF9MRU5HVEggPSAxMDtcblxuZXhwb3J0IGNvbnN0IERBVEVfUExBQ0VIT0xERVIgPSAnX18uX18uX19fXyc7XG5leHBvcnQgY29uc3QgVElNRV9QTEFDRUhPTERFUiA9ICdfXzpfXyc7XG4iXX0=
|