@updevs/components 1.0.0-alpha.48 → 1.0.0-alpha.49
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 +1 -13
- package/calendar/calendar.component.d.ts +58 -122
- package/calendar/models/calendar-date.model.d.ts +10 -0
- package/calendar/models/calendar-month.model.d.ts +7 -0
- package/calendar/models/calendar-selected.model.d.ts +5 -0
- package/calendar/models/calendar-year.model.d.ts +6 -0
- package/calendar/models/date-range.model.d.ts +0 -4
- package/calendar/models/enums/calendar-view.enum.d.ts +5 -0
- package/calendar/models/public-api.d.ts +5 -0
- package/calendar/upd-calendar.module.d.ts +6 -11
- package/card/public-api.d.ts +1 -0
- package/card/types/public-api.d.ts +5 -0
- package/dropdown/dropdown.component.d.ts +3 -0
- package/esm2022/calendar/calendar.component.mjs +288 -217
- package/esm2022/calendar/models/calendar-date.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-month.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-selected.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-year.model.mjs +2 -0
- package/esm2022/calendar/models/date-range.model.mjs +1 -1
- package/esm2022/calendar/models/enums/calendar-view.enum.mjs +7 -0
- package/esm2022/calendar/models/public-api.mjs +6 -1
- package/esm2022/calendar/upd-calendar.module.mjs +2 -20
- package/esm2022/card/public-api.mjs +2 -1
- package/esm2022/card/types/public-api.mjs +6 -0
- package/esm2022/dropdown/dropdown.component.mjs +23 -7
- package/esm2022/form-controls/date-picker/date-picker.component.mjs +45 -60
- package/esm2022/form-controls/input/input.component.mjs +3 -3
- package/esm2022/popover/popover.directive.mjs +10 -26
- package/esm2022/pricing-cards/index.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item-feature.model.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item-features-group.model.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item.model.mjs +2 -0
- package/esm2022/pricing-cards/models/public-api.mjs +4 -0
- package/esm2022/pricing-cards/pricing-cards.component.mjs +24 -0
- package/esm2022/pricing-cards/public-api.mjs +4 -0
- package/esm2022/pricing-cards/upd-pricing-cards.module.mjs +36 -0
- package/esm2022/pricing-cards/updevs-components-pricing-cards.mjs +5 -0
- package/esm2022/table/abstractions/base.column.mjs +30 -44
- package/esm2022/table/table.component.mjs +9 -12
- package/fesm2022/updevs-components-calendar.mjs +319 -1449
- package/fesm2022/updevs-components-calendar.mjs.map +1 -1
- package/fesm2022/updevs-components-dropdown.mjs +22 -6
- package/fesm2022/updevs-components-dropdown.mjs.map +1 -1
- package/fesm2022/updevs-components-form-controls-date-picker.mjs +44 -59
- package/fesm2022/updevs-components-form-controls-date-picker.mjs.map +1 -1
- package/fesm2022/updevs-components-form-controls-input.mjs +2 -2
- package/fesm2022/updevs-components-form-controls-input.mjs.map +1 -1
- package/fesm2022/updevs-components-popover.mjs +9 -25
- package/fesm2022/updevs-components-popover.mjs.map +1 -1
- package/fesm2022/updevs-components-pricing-cards.mjs +64 -0
- package/fesm2022/updevs-components-pricing-cards.mjs.map +1 -0
- package/fesm2022/updevs-components-table.mjs +38 -55
- package/fesm2022/updevs-components-table.mjs.map +1 -1
- package/form-controls/date-picker/date-picker.component.d.ts +10 -31
- package/package.json +37 -31
- package/pricing-cards/index.d.ts +1 -0
- package/pricing-cards/models/price-item-feature.model.d.ts +5 -0
- package/pricing-cards/models/price-item-features-group.model.d.ts +5 -0
- package/pricing-cards/models/price-item.model.d.ts +19 -0
- package/pricing-cards/models/public-api.d.ts +3 -0
- package/pricing-cards/pricing-cards.component.d.ts +11 -0
- package/pricing-cards/public-api.d.ts +3 -0
- package/pricing-cards/upd-pricing-cards.module.d.ts +11 -0
- package/table/abstractions/base.column.d.ts +4 -0
- package/calendar/components/calendar-body/calendar-body.component.d.ts +0 -263
- package/calendar/components/calendar-header/calendar-header.component.d.ts +0 -57
- package/calendar/components/calendar-month-view/calendar-month-view.component.d.ts +0 -151
- package/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +0 -10
- package/calendar/components/calendar-year-view/calendar-year-view.component.d.ts +0 -9
- package/calendar/models/calendar-cell.model.d.ts +0 -16
- package/calendar/services/calendar.service.d.ts +0 -15
- package/calendar/tools/events-options.d.ts +0 -12
- package/calendar/tools/keyboard-tools.d.ts +0 -9
- package/calendar/tools/passive-listeners.d.ts +0 -16
- package/calendar/types/calendar-cell-class-function.type.d.ts +0 -3
- package/calendar/types/calendar-cell-css-classes.type.d.ts +0 -3
- package/calendar/types/modifier-key.type.d.ts +0 -1
- package/esm2022/calendar/components/calendar-body/calendar-body.component.mjs +0 -515
- package/esm2022/calendar/components/calendar-header/calendar-header.component.mjs +0 -144
- package/esm2022/calendar/components/calendar-month-view/calendar-month-view.component.mjs +0 -423
- package/esm2022/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -18
- package/esm2022/calendar/components/calendar-year-view/calendar-year-view.component.mjs +0 -17
- package/esm2022/calendar/models/calendar-cell.model.mjs +0 -18
- package/esm2022/calendar/services/calendar.service.mjs +0 -40
- package/esm2022/calendar/tools/events-options.mjs +0 -14
- package/esm2022/calendar/tools/keyboard-tools.mjs +0 -14
- package/esm2022/calendar/tools/passive-listeners.mjs +0 -29
- package/esm2022/calendar/types/calendar-cell-class-function.type.mjs +0 -2
- package/esm2022/calendar/types/calendar-cell-css-classes.type.mjs +0 -2
- package/esm2022/calendar/types/modifier-key.type.mjs +0 -2
|
@@ -1,423 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, effect, inject } from '@angular/core';
|
|
2
|
-
import { DateService } from '@updevs/sdk/core';
|
|
3
|
-
import { BaseComponent } from '@updevs/sdk/layout';
|
|
4
|
-
import { TranslocoService } from '@jsverse/transloco';
|
|
5
|
-
import { startWith } from 'rxjs';
|
|
6
|
-
import { CalendarBodyComponent } from '../calendar-body/calendar-body.component';
|
|
7
|
-
import { DateRangeModel } from '../../models/date-range.model';
|
|
8
|
-
import { CalendarCellModel } from '../../models/calendar-cell.model';
|
|
9
|
-
import { KeyboardTools } from '../../tools/keyboard-tools';
|
|
10
|
-
import { CalendarRangeStrategyService } from '../../services/calendar-range-strategy.service';
|
|
11
|
-
import { CalendarSignalsService } from '../../services/calendar-signals.service';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "../calendar-header/calendar-header.component";
|
|
14
|
-
import * as i2 from "../calendar-body/calendar-body.component";
|
|
15
|
-
const daysPerWeek = 7;
|
|
16
|
-
let uniqueIdCounter = 0;
|
|
17
|
-
export class CalendarMonthViewComponent extends BaseComponent {
|
|
18
|
-
/**
|
|
19
|
-
* The date to display in this month view (everything other than the month and year is ignored).
|
|
20
|
-
*/
|
|
21
|
-
get activeDate() {
|
|
22
|
-
return this.calendarSignalsService.activeDate();
|
|
23
|
-
}
|
|
24
|
-
set activeDate(value) {
|
|
25
|
-
this.updateActiveDate(value);
|
|
26
|
-
}
|
|
27
|
-
/** The currently selected date. */
|
|
28
|
-
get selected() {
|
|
29
|
-
return this.calendarSignalsService.selectedDate();
|
|
30
|
-
}
|
|
31
|
-
set selected(value) {
|
|
32
|
-
let currValue;
|
|
33
|
-
if (value instanceof DateRangeModel) {
|
|
34
|
-
currValue = value;
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
currValue = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));
|
|
38
|
-
}
|
|
39
|
-
this.calendarSignalsService.selectedDate = currValue;
|
|
40
|
-
this.setRanges(currValue);
|
|
41
|
-
}
|
|
42
|
-
/** The minimum selectable date. */
|
|
43
|
-
get minDate() {
|
|
44
|
-
return this._minDate;
|
|
45
|
-
}
|
|
46
|
-
set minDate(value) {
|
|
47
|
-
this._minDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));
|
|
48
|
-
}
|
|
49
|
-
/** The maximum selectable date. */
|
|
50
|
-
get maxDate() {
|
|
51
|
-
return this._maxDate;
|
|
52
|
-
}
|
|
53
|
-
set maxDate(value) {
|
|
54
|
-
this._maxDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));
|
|
55
|
-
}
|
|
56
|
-
constructor() {
|
|
57
|
-
super();
|
|
58
|
-
/**
|
|
59
|
-
* First day of week.
|
|
60
|
-
* Zero-based starting from Sunday.
|
|
61
|
-
* Default: 0 - Sunday.
|
|
62
|
-
*/
|
|
63
|
-
this.firstDayOfWeek = 0;
|
|
64
|
-
/** Whether the user is currently selecting a range of dates. */
|
|
65
|
-
this.isRange = false;
|
|
66
|
-
/** Emits when a new date is selected. */
|
|
67
|
-
this.selectedChange = new EventEmitter();
|
|
68
|
-
/** Emits when any date is selected. */
|
|
69
|
-
this.userSelection = new EventEmitter();
|
|
70
|
-
/** Emits when the user initiates a date range drag via mouse or touch. */
|
|
71
|
-
this.dragStarted = new EventEmitter();
|
|
72
|
-
/**
|
|
73
|
-
* Emits when the user completes or cancels a date range drag.
|
|
74
|
-
* Emits null when the drag was canceled or the newly selected date range if completed.
|
|
75
|
-
*/
|
|
76
|
-
this.dragEnded = new EventEmitter();
|
|
77
|
-
/** Emits when any date is activated. */
|
|
78
|
-
this.activeDateChange = new EventEmitter();
|
|
79
|
-
/** Grid of calendar cells representing the dates of the month. */
|
|
80
|
-
this.weeks = [];
|
|
81
|
-
/** The number of blank cells in the first row before the 1st of the month. */
|
|
82
|
-
this.firstWeekOffset = 0;
|
|
83
|
-
/** The names of the weekdays. */
|
|
84
|
-
this.weekdays = [];
|
|
85
|
-
/** Flag used to filter out space/enter keyup events that originated outside of the view. */
|
|
86
|
-
this._selectionKeyPressed = false;
|
|
87
|
-
this.translocoService = inject(TranslocoService);
|
|
88
|
-
this.changeDetectorRef = inject(ChangeDetectorRef);
|
|
89
|
-
this.dateService = inject(DateService);
|
|
90
|
-
this.calendarSignalsService = inject(CalendarSignalsService);
|
|
91
|
-
this.calendarRangeStrategy = inject(CalendarRangeStrategyService);
|
|
92
|
-
effect(() => this.updateActiveDate(this.calendarSignalsService.activeDate(), true));
|
|
93
|
-
}
|
|
94
|
-
ngAfterContentInit() {
|
|
95
|
-
const langSub = this.translocoService.langChanges$
|
|
96
|
-
.pipe(startWith(undefined))
|
|
97
|
-
.subscribe(() => this.init());
|
|
98
|
-
this.addSubscriptions(langSub);
|
|
99
|
-
}
|
|
100
|
-
ngOnChanges(changes) {
|
|
101
|
-
const comparisonChange = changes['comparisonStart'] || changes['comparisonEnd'];
|
|
102
|
-
if (comparisonChange && !comparisonChange.firstChange) {
|
|
103
|
-
this.setRanges(this.selected);
|
|
104
|
-
}
|
|
105
|
-
if (changes['activeDrag'] && !this.activeDrag) {
|
|
106
|
-
this.clearPreview();
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/** Handles when a new date is selected. */
|
|
110
|
-
dateSelected(event) {
|
|
111
|
-
const date = event.value;
|
|
112
|
-
const selectedDate = this.getDateFromDayOfMonth(date);
|
|
113
|
-
const currSelection = this.calendarSignalsService.selectedDate();
|
|
114
|
-
let rangeStartDate;
|
|
115
|
-
let rangeEndDate;
|
|
116
|
-
if (currSelection instanceof DateRangeModel) {
|
|
117
|
-
rangeStartDate = this.getDateInCurrentMonth(currSelection.start);
|
|
118
|
-
rangeEndDate = this.getDateInCurrentMonth(currSelection.end);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
rangeStartDate = rangeEndDate = this.getDateInCurrentMonth(currSelection);
|
|
122
|
-
}
|
|
123
|
-
if (rangeStartDate !== date || rangeEndDate !== date) {
|
|
124
|
-
this.calendarSignalsService.selectedDate = selectedDate;
|
|
125
|
-
}
|
|
126
|
-
this.userSelection.emit({ value: selectedDate, event: event.event });
|
|
127
|
-
this.clearPreview();
|
|
128
|
-
this.changeDetectorRef.markForCheck();
|
|
129
|
-
}
|
|
130
|
-
/** Handles keydown events on the calendar body when calendar is in month view. */
|
|
131
|
-
handleCalendarBodyKeydown(event) {
|
|
132
|
-
// TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
|
|
133
|
-
// disabled ones from being selected. This may not be ideal, we should look into whether
|
|
134
|
-
// navigation should skip over disabled dates, and if so, how to implement that efficiently.
|
|
135
|
-
const oldActiveDate = this.activeDate;
|
|
136
|
-
let tempActiveDate;
|
|
137
|
-
switch (event.key) {
|
|
138
|
-
case 'LEFT_ARROW':
|
|
139
|
-
tempActiveDate = this.dateService.addDays(this.activeDate, -1);
|
|
140
|
-
break;
|
|
141
|
-
case 'RIGHT_ARROW':
|
|
142
|
-
tempActiveDate = this.dateService.addDays(this.activeDate, 1);
|
|
143
|
-
break;
|
|
144
|
-
case 'UP_ARROW':
|
|
145
|
-
tempActiveDate = this.dateService.addDays(this.activeDate, -7);
|
|
146
|
-
break;
|
|
147
|
-
case 'DOWN_ARROW':
|
|
148
|
-
tempActiveDate = this.dateService.addDays(this.activeDate, 7);
|
|
149
|
-
break;
|
|
150
|
-
case 'HOME':
|
|
151
|
-
tempActiveDate = this.dateService.addDays(this.activeDate, 1 - this.activeDate.getDate());
|
|
152
|
-
break;
|
|
153
|
-
case 'END':
|
|
154
|
-
tempActiveDate = this.dateService.addDays(this.activeDate, this.dateService.getNumDaysInMonth(this.activeDate) -
|
|
155
|
-
this.activeDate.getDate());
|
|
156
|
-
break;
|
|
157
|
-
case 'PAGE_UP':
|
|
158
|
-
tempActiveDate = event.altKey
|
|
159
|
-
? this.dateService.addYears(this.activeDate, -1)
|
|
160
|
-
: this.dateService.addMonths(this.activeDate, -1);
|
|
161
|
-
break;
|
|
162
|
-
case 'PAGE_DOWN':
|
|
163
|
-
tempActiveDate = event.altKey
|
|
164
|
-
? this.dateService.addYears(this.activeDate, 1)
|
|
165
|
-
: this.dateService.addMonths(this.activeDate, 1);
|
|
166
|
-
break;
|
|
167
|
-
case 'ENTER':
|
|
168
|
-
case 'SPACE':
|
|
169
|
-
this._selectionKeyPressed = true;
|
|
170
|
-
if (this.canSelect(this.activeDate)) {
|
|
171
|
-
// Prevent unexpected default actions such as form submission.
|
|
172
|
-
// Note that we only prevent the default action here while the selection happens in
|
|
173
|
-
// `keyup` below. We can't do the selection here, because it can cause the calendar to
|
|
174
|
-
// reopen if focus is restored immediately. We also can't call `preventDefault` on `keyup`
|
|
175
|
-
// because it's too late (see #23305).
|
|
176
|
-
event.preventDefault();
|
|
177
|
-
}
|
|
178
|
-
return;
|
|
179
|
-
case 'ESCAPE':
|
|
180
|
-
// Abort the current range selection if the user presses escape mid-selection.
|
|
181
|
-
if (this.previewEnd !== undefined && !KeyboardTools.hasModifierKey(event)) {
|
|
182
|
-
this.clearPreview();
|
|
183
|
-
// If a drag is in progress, cancel the drag without changing the
|
|
184
|
-
// current selection.
|
|
185
|
-
if (this.activeDrag) {
|
|
186
|
-
this.dragEnded.emit({ value: undefined, event });
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
this.selectedChange.emit(undefined);
|
|
190
|
-
this.userSelection.emit({ value: undefined, event });
|
|
191
|
-
}
|
|
192
|
-
event.preventDefault();
|
|
193
|
-
event.stopPropagation(); // Prevents the overlay from closing.
|
|
194
|
-
}
|
|
195
|
-
return;
|
|
196
|
-
default:
|
|
197
|
-
// Don't prevent default or focus active cell on keys that we don't explicitly handle.
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
if (this.dateService.compare(oldActiveDate, this.activeDate)) {
|
|
201
|
-
this.calendarSignalsService.activeDate = tempActiveDate;
|
|
202
|
-
this.focusActiveCellAfterViewChecked();
|
|
203
|
-
}
|
|
204
|
-
// Prevent unexpected default actions such as form submission.
|
|
205
|
-
event.preventDefault();
|
|
206
|
-
}
|
|
207
|
-
/** Handles keyup events on the calendar body when calendar is in month view. */
|
|
208
|
-
handleCalendarBodyKeyup(event) {
|
|
209
|
-
if (event.key === 'SPACE' || event.key === 'ENTER') {
|
|
210
|
-
if (this._selectionKeyPressed && this.canSelect(this.activeDate)) {
|
|
211
|
-
this.dateSelected({ value: this.activeDate.getDate(), event });
|
|
212
|
-
}
|
|
213
|
-
this._selectionKeyPressed = false;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/** Initializes this month view. */
|
|
217
|
-
init() {
|
|
218
|
-
this.setRanges(this.selected);
|
|
219
|
-
this.todayDate = this.getCellCompareValue(new Date());
|
|
220
|
-
this.monthLabel = this.dateService.getMonthNames('short')[this.activeDate.getMonth()].toLocaleUpperCase();
|
|
221
|
-
const firstOfMonth = this.dateService.create(this.activeDate.getFullYear(), this.activeDate.getMonth(), 1);
|
|
222
|
-
this.firstWeekOffset = (daysPerWeek + firstOfMonth.getDay() - this.firstDayOfWeek) % daysPerWeek;
|
|
223
|
-
this.initWeekdays();
|
|
224
|
-
this.createWeekCells();
|
|
225
|
-
this.changeDetectorRef.markForCheck();
|
|
226
|
-
}
|
|
227
|
-
/** Focuses the active cell after the microtask queue is empty. */
|
|
228
|
-
focusActiveCell(movePreview) {
|
|
229
|
-
this._matCalendarBody.focusActiveCell(movePreview);
|
|
230
|
-
}
|
|
231
|
-
/** Focuses the active cell after change detection has run and the microtask queue is empty. */
|
|
232
|
-
focusActiveCellAfterViewChecked() {
|
|
233
|
-
this._matCalendarBody.scheduleFocusActiveCellAfterViewChecked();
|
|
234
|
-
}
|
|
235
|
-
/** Called when the user has activated a new cell and the preview needs to be updated. */
|
|
236
|
-
previewChanged({ value: cell }) {
|
|
237
|
-
if (!this.selected) {
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
if (this.isRange && !(this.selected instanceof DateRangeModel)) {
|
|
241
|
-
this.selected = new DateRangeModel(this.selected);
|
|
242
|
-
}
|
|
243
|
-
// We can assume that this will be a range, because preview
|
|
244
|
-
// events aren't fired for single date selections.
|
|
245
|
-
const value = cell ? cell.rawValue : undefined;
|
|
246
|
-
const previewRange = this.calendarRangeStrategy.createPreview(value, this.selected);
|
|
247
|
-
this.previewStart = this.getCellCompareValue(previewRange.start);
|
|
248
|
-
this.previewEnd = this.getCellCompareValue(previewRange.end);
|
|
249
|
-
if (!!this.activeDrag && !!value) {
|
|
250
|
-
const dragRange = this.calendarRangeStrategy.createDrag?.(this.activeDrag.value, this.selected, value);
|
|
251
|
-
if (!!dragRange) {
|
|
252
|
-
this.previewStart = this.getCellCompareValue(dragRange.start);
|
|
253
|
-
this.previewEnd = this.getCellCompareValue(dragRange.end);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// Note that here we need to use `detectChanges`, rather than `markForCheck`, because
|
|
257
|
-
// the way `_focusActiveCell` is set up at the moment makes it fire at the wrong time
|
|
258
|
-
// when navigating one month back using the keyboard which will cause this handler
|
|
259
|
-
// to throw a "changed after checked" error when updating the preview state.
|
|
260
|
-
this.changeDetectorRef.detectChanges();
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Called when the user has ended a drag. If the drag/drop was successful,
|
|
264
|
-
* computes and emits the new range selection.
|
|
265
|
-
*/
|
|
266
|
-
_dragEnded(event) {
|
|
267
|
-
if (!this.activeDrag) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
if (event.value) {
|
|
271
|
-
// Propagate drag effect
|
|
272
|
-
const dragDropResult = this.calendarRangeStrategy?.createDrag?.(this.activeDrag.value, this.selected, event.value);
|
|
273
|
-
this.dragEnded.emit({ value: dragDropResult ?? undefined, event: event.event });
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
this.dragEnded.emit({ value: undefined, event: event.event });
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
updateActiveDate(value, isFromEffect = false) {
|
|
280
|
-
this.oldActiveDate = this.oldActiveDate || value;
|
|
281
|
-
const validDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value)) || new Date();
|
|
282
|
-
if (!isFromEffect) {
|
|
283
|
-
this.calendarSignalsService.activeDate = this.dateService.clamp(validDate, this.minDate, this.maxDate);
|
|
284
|
-
}
|
|
285
|
-
if (!this.isSameMonthAndYearAsActiveDate(this.oldActiveDate, this.calendarSignalsService.activeDate())) {
|
|
286
|
-
this.init();
|
|
287
|
-
}
|
|
288
|
-
this.oldActiveDate = value;
|
|
289
|
-
this.activeDateChange.emit(this.calendarSignalsService.activeDate());
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Takes a day of the month and returns a new date in the same month and year as the currently
|
|
293
|
-
* active date. The returned date will have the same day of the month as the argument date.
|
|
294
|
-
*/
|
|
295
|
-
getDateFromDayOfMonth(dayOfMonth) {
|
|
296
|
-
return this.dateService.create(this.activeDate.getFullYear(), this.activeDate.getMonth(), dayOfMonth);
|
|
297
|
-
}
|
|
298
|
-
/** Initializes the weekdays. */
|
|
299
|
-
initWeekdays() {
|
|
300
|
-
const firstDayOfWeek = this.firstDayOfWeek;
|
|
301
|
-
const narrowWeekdays = this.dateService.getDayOfWeekNames('narrow');
|
|
302
|
-
const longWeekdays = this.dateService.getDayOfWeekNames('long');
|
|
303
|
-
// Rotate the labels for days of the week based on the configured first day of the week.
|
|
304
|
-
const weekdays = longWeekdays.map((long, i) => ({ long, narrow: narrowWeekdays[i], id: uniqueIdCounter++ }));
|
|
305
|
-
this.weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
|
|
306
|
-
}
|
|
307
|
-
/** Creates MatCalendarCells for the dates in this month. */
|
|
308
|
-
createWeekCells() {
|
|
309
|
-
const daysInMonth = this.dateService.getNumDaysInMonth(this.activeDate);
|
|
310
|
-
const dateNames = this.dateService.getDateNames();
|
|
311
|
-
this.weeks = [[]];
|
|
312
|
-
for (let i = 0, cell = this.firstWeekOffset; i < daysInMonth; i++, cell++) {
|
|
313
|
-
if (cell === daysPerWeek) {
|
|
314
|
-
this.weeks.push([]);
|
|
315
|
-
cell = 0;
|
|
316
|
-
}
|
|
317
|
-
const date = this.dateService.create(this.activeDate.getFullYear(), this.activeDate.getMonth(), i + 1);
|
|
318
|
-
const isEnabled = this.shouldEnableDate(date);
|
|
319
|
-
const ariaLabel = this.dateService.format(date, { year: 'numeric', month: 'long', day: 'numeric' });
|
|
320
|
-
const cellClasses = this.dateClass ? this.dateClass(date, 'month') : undefined;
|
|
321
|
-
this.weeks[this.weeks.length - 1].push(new CalendarCellModel(i + 1, dateNames[i], ariaLabel, isEnabled, cellClasses, this.getCellCompareValue(date), date));
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
/** Date filter for the month */
|
|
325
|
-
shouldEnableDate(date) {
|
|
326
|
-
return !!date &&
|
|
327
|
-
(!this.minDate || this.dateService.compare(date, this.minDate) >= 0) &&
|
|
328
|
-
(!this.maxDate || this.dateService.compare(date, this.maxDate) <= 0) &&
|
|
329
|
-
(!this.dateFilter || this.dateFilter(date));
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* Gets the date in this month that the given Date falls on.
|
|
333
|
-
* Returns null if the given Date is in another month.
|
|
334
|
-
*/
|
|
335
|
-
getDateInCurrentMonth(date) {
|
|
336
|
-
return !!date && this.isSameMonthAndYearAsActiveDate(date, this.calendarSignalsService.activeDate())
|
|
337
|
-
? date.getDate()
|
|
338
|
-
: undefined;
|
|
339
|
-
}
|
|
340
|
-
/** Checks whether the 2 dates are non-null and fall within the same month of the same year. */
|
|
341
|
-
isSameMonthAndYearAsActiveDate(d1, d2) {
|
|
342
|
-
return (!!d1 && !!d2 && d1.getMonth() === d2.getMonth() && d1.getFullYear() === d2.getFullYear());
|
|
343
|
-
}
|
|
344
|
-
/** Gets the value that will be used to one cell to another. */
|
|
345
|
-
getCellCompareValue(date) {
|
|
346
|
-
if (!!date) {
|
|
347
|
-
// We use the time since the Unix epoch to compare dates in this view, rather than the
|
|
348
|
-
// cell values, because we need to support ranges that span across multiple months/years.
|
|
349
|
-
const year = date.getFullYear();
|
|
350
|
-
const month = date.getMonth();
|
|
351
|
-
const day = date.getDate();
|
|
352
|
-
return new Date(year, month, day).getTime();
|
|
353
|
-
}
|
|
354
|
-
return undefined;
|
|
355
|
-
}
|
|
356
|
-
/** Sets the current range based on a model value. */
|
|
357
|
-
setRanges(selectedValue) {
|
|
358
|
-
if (selectedValue instanceof DateRangeModel) {
|
|
359
|
-
this.rangeStart = this.getCellCompareValue(selectedValue.start);
|
|
360
|
-
this.rangeEnd = this.getCellCompareValue(selectedValue.end);
|
|
361
|
-
this.isRange = true;
|
|
362
|
-
}
|
|
363
|
-
else {
|
|
364
|
-
this.rangeStart = this.rangeEnd = this.getCellCompareValue(selectedValue);
|
|
365
|
-
}
|
|
366
|
-
this.comparisonRangeStart = this.getCellCompareValue(this.comparisonStart);
|
|
367
|
-
this.comparisonRangeEnd = this.getCellCompareValue(this.comparisonEnd);
|
|
368
|
-
}
|
|
369
|
-
/** Gets whether a date can be selected in the month view. */
|
|
370
|
-
canSelect(date) {
|
|
371
|
-
return !this.dateFilter || this.dateFilter(date);
|
|
372
|
-
}
|
|
373
|
-
/** Clears out preview state. */
|
|
374
|
-
clearPreview() {
|
|
375
|
-
this.previewStart = this.previewEnd = undefined;
|
|
376
|
-
}
|
|
377
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarMonthViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
378
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: CalendarMonthViewComponent, selector: "upd-calendar-month-view", inputs: { activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter", dateClass: "dateClass", comparisonStart: "comparisonStart", comparisonEnd: "comparisonEnd", startDateAccessibleName: "startDateAccessibleName", endDateAccessibleName: "endDateAccessibleName", firstDayOfWeek: "firstDayOfWeek", activeDrag: "activeDrag", isRange: "isRange" }, outputs: { selectedChange: "selectedChange", userSelection: "userSelection", dragStarted: "dragStarted", dragEnded: "dragEnded", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "_matCalendarBody", first: true, predicate: CalendarBodyComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<upd-calendar-header></upd-calendar-header>\n<div class=\"container mt-2\">\n <div class=\"row seven-cols\">\n @for (day of weekdays; track day.id) {\n <div class=\"col-1 p-1 d-flex justify-content-center align-items-center\">\n <span class=\"visually-hidden\">{{ day.long }}</span>\n <span aria-hidden=\"true\">{{ day.narrow }}</span>\n </div>\n }\n </div>\n</div>\n<upd-calendar-body [label]=\"monthLabel\" [rows]=\"weeks\" [todayValue]=\"todayDate!\" [startValue]=\"rangeStart!\"\n [endValue]=\"rangeEnd!\" [comparisonStart]=\"comparisonRangeStart\" [comparisonEnd]=\"comparisonRangeEnd\"\n [previewStart]=\"previewStart\" [previewEnd]=\"previewEnd\" [isRange]=\"isRange\" [labelMinRequiredCells]=\"3\"\n [activeCell]=\"activeDate.getDate() - 1\" [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\" (selectedValueChange)=\"dateSelected($event)\"\n (previewChange)=\"previewChanged($event)\" (dragStarted)=\"dragStarted.emit($event)\" (dragEnded)=\"_dragEnded($event)\"\n (keyup)=\"handleCalendarBodyKeyup($event)\" (keydown)=\"handleCalendarBodyKeydown($event)\">\n</upd-calendar-body>\n", styles: ["@media (min-width: 768px){.seven-cols .col-1{width:100%}.seven-cols .col-6{width:85.7142857143%}}@media (min-width: 992px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}@media (min-width: 1200px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}\n"], dependencies: [{ kind: "component", type: i1.CalendarHeaderComponent, selector: "upd-calendar-header" }, { kind: "component", type: i2.CalendarBodyComponent, selector: "upd-calendar-body", inputs: ["label", "rows", "todayValue", "startValue", "endValue", "labelMinRequiredCells", "numCols", "activeCell", "isRange", "cellAspectRatio", "comparisonStart", "comparisonEnd", "previewStart", "previewEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedValueChange", "previewChange", "dragStarted", "dragEnded"] }] }); }
|
|
379
|
-
}
|
|
380
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarMonthViewComponent, decorators: [{
|
|
381
|
-
type: Component,
|
|
382
|
-
args: [{ selector: 'upd-calendar-month-view', template: "<upd-calendar-header></upd-calendar-header>\n<div class=\"container mt-2\">\n <div class=\"row seven-cols\">\n @for (day of weekdays; track day.id) {\n <div class=\"col-1 p-1 d-flex justify-content-center align-items-center\">\n <span class=\"visually-hidden\">{{ day.long }}</span>\n <span aria-hidden=\"true\">{{ day.narrow }}</span>\n </div>\n }\n </div>\n</div>\n<upd-calendar-body [label]=\"monthLabel\" [rows]=\"weeks\" [todayValue]=\"todayDate!\" [startValue]=\"rangeStart!\"\n [endValue]=\"rangeEnd!\" [comparisonStart]=\"comparisonRangeStart\" [comparisonEnd]=\"comparisonRangeEnd\"\n [previewStart]=\"previewStart\" [previewEnd]=\"previewEnd\" [isRange]=\"isRange\" [labelMinRequiredCells]=\"3\"\n [activeCell]=\"activeDate.getDate() - 1\" [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\" (selectedValueChange)=\"dateSelected($event)\"\n (previewChange)=\"previewChanged($event)\" (dragStarted)=\"dragStarted.emit($event)\" (dragEnded)=\"_dragEnded($event)\"\n (keyup)=\"handleCalendarBodyKeyup($event)\" (keydown)=\"handleCalendarBodyKeydown($event)\">\n</upd-calendar-body>\n", styles: ["@media (min-width: 768px){.seven-cols .col-1{width:100%}.seven-cols .col-6{width:85.7142857143%}}@media (min-width: 992px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}@media (min-width: 1200px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}\n"] }]
|
|
383
|
-
}], ctorParameters: () => [], propDecorators: { _matCalendarBody: [{
|
|
384
|
-
type: ViewChild,
|
|
385
|
-
args: [CalendarBodyComponent]
|
|
386
|
-
}], activeDate: [{
|
|
387
|
-
type: Input
|
|
388
|
-
}], selected: [{
|
|
389
|
-
type: Input
|
|
390
|
-
}], minDate: [{
|
|
391
|
-
type: Input
|
|
392
|
-
}], maxDate: [{
|
|
393
|
-
type: Input
|
|
394
|
-
}], dateFilter: [{
|
|
395
|
-
type: Input
|
|
396
|
-
}], dateClass: [{
|
|
397
|
-
type: Input
|
|
398
|
-
}], comparisonStart: [{
|
|
399
|
-
type: Input
|
|
400
|
-
}], comparisonEnd: [{
|
|
401
|
-
type: Input
|
|
402
|
-
}], startDateAccessibleName: [{
|
|
403
|
-
type: Input
|
|
404
|
-
}], endDateAccessibleName: [{
|
|
405
|
-
type: Input
|
|
406
|
-
}], firstDayOfWeek: [{
|
|
407
|
-
type: Input
|
|
408
|
-
}], activeDrag: [{
|
|
409
|
-
type: Input
|
|
410
|
-
}], isRange: [{
|
|
411
|
-
type: Input
|
|
412
|
-
}], selectedChange: [{
|
|
413
|
-
type: Output
|
|
414
|
-
}], userSelection: [{
|
|
415
|
-
type: Output
|
|
416
|
-
}], dragStarted: [{
|
|
417
|
-
type: Output
|
|
418
|
-
}], dragEnded: [{
|
|
419
|
-
type: Output
|
|
420
|
-
}], activeDateChange: [{
|
|
421
|
-
type: Output
|
|
422
|
-
}] } });
|
|
423
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2FsZW5kYXIvc3JjL2NvbXBvbmVudHMvY2FsZW5kYXItbW9udGgtdmlldy9jYWxlbmRhci1tb250aC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1tb250aC12aWV3L2NhbGVuZGFyLW1vbnRoLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR2pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDOUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7QUFFakYs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M0IsTUFBTTtnQkFHWSxnQkFBZ0I7c0JBQWxDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPcHRpb25hbFR5cGUgfSBmcm9tICdAdXBkZXZzL3Nkay90eXBlcyc7XG5pbXBvcnQgeyBEYXRlU2VydmljZSB9IGZyb20gJ0B1cGRldnMvc2RrL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJ0B1cGRldnMvc2RrL2xheW91dCc7XG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDYWxlbmRhclVzZXJFdmVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLXVzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJCb2R5Q29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXItYm9keS9jYWxlbmRhci1ib2R5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRlLXJhbmdlLm1vZGVsJztcbmltcG9ydCB7IENhbGVuZGFyQ2VsbE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWNlbGwubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDZWxsQ2xhc3NGdW5jdGlvblR5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9jYWxlbmRhci1jZWxsLWNsYXNzLWZ1bmN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgS2V5Ym9hcmRUb29scyB9IGZyb20gJy4uLy4uL3Rvb2xzL2tleWJvYXJkLXRvb2xzJztcbmltcG9ydCB7IENhbGVuZGFyUmFuZ2VTdHJhdGVneVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1yYW5nZS1zdHJhdGVneS5zZXJ2aWNlJztcbmltcG9ydCB7IENhbGVuZGFyU2lnbmFsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1zaWduYWxzLnNlcnZpY2UnO1xuXG5jb25zdCBkYXlzUGVyV2VlayA9IDc7XG5cbmxldCB1bmlxdWVJZENvdW50ZXIgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwZC1jYWxlbmRhci1tb250aC12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2NhbGVuZGFyLW1vbnRoLXZpZXcuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyTW9udGhWaWV3Q29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGJvZHkgb2YgY2FsZW5kYXIgdGFibGVcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKENhbGVuZGFyQm9keUNvbXBvbmVudCkgX21hdENhbGVuZGFyQm9keSE6IENhbGVuZGFyQm9keUNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRvIGRpc3BsYXkgaW4gdGhpcyBtb250aCB2aWV3IChldmVyeXRoaW5nIG90aGVyIHRoYW4gdGhlIG1vbnRoIGFuZCB5ZWFyIGlzIGlnbm9yZWQpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGFjdGl2ZURhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpO1xuICAgIH1cbiAgICBzZXQgYWN0aXZlRGF0ZSh2YWx1ZTogRGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZURhdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgc2VsZWN0ZWQoKTogRGF0ZVJhbmdlTW9kZWwgfCBPcHRpb25hbFR5cGU8RGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLnNlbGVjdGVkRGF0ZSgpO1xuICAgIH1cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IERhdGVSYW5nZU1vZGVsIHwgT3B0aW9uYWxUeXBlPERhdGU+KSB7XG4gICAgICAgIGxldCBjdXJyVmFsdWU6IERhdGVSYW5nZU1vZGVsIHwgT3B0aW9uYWxUeXBlPERhdGU+O1xuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGVSYW5nZU1vZGVsKSB7XG4gICAgICAgICAgICBjdXJyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJWYWx1ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0VmFsaWRPclVuZGVmaW5lZCh0aGlzLmRhdGVTZXJ2aWNlLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2Uuc2VsZWN0ZWREYXRlID0gY3VyclZhbHVlO1xuXG4gICAgICAgIHRoaXMuc2V0UmFuZ2VzKGN1cnJWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBtaW5pbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBtaW5EYXRlKCk6IE9wdGlvbmFsVHlwZTxEYXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xuICAgIH1cbiAgICBzZXQgbWluRGF0ZSh2YWx1ZTogT3B0aW9uYWxUeXBlPERhdGU+KSB7XG4gICAgICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmdldFZhbGlkT3JVbmRlZmluZWQodGhpcy5kYXRlU2VydmljZS5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbWF4aW11bSBzZWxlY3RhYmxlIGRhdGUuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgbWF4RGF0ZSgpOiBPcHRpb25hbFR5cGU8RGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcbiAgICB9XG4gICAgc2V0IG1heERhdGUodmFsdWU6IE9wdGlvbmFsVHlwZTxEYXRlPikge1xuICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5kYXRlU2VydmljZS5nZXRWYWxpZE9yVW5kZWZpbmVkKHRoaXMuZGF0ZVNlcnZpY2UuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdXNlZCB0byBmaWx0ZXIgd2hpY2ggZGF0ZXMgYXJlIHNlbGVjdGFibGUuICovXG4gICAgQElucHV0KCkgZGF0ZUZpbHRlcj86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuO1xuXG4gICAgLyoqIEZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGN1c3RvbSBDU1MgY2xhc3NlcyB0byBkYXRlcy4gKi9cbiAgICBASW5wdXQoKSBkYXRlQ2xhc3M/OiBDYWxlbmRhckNlbGxDbGFzc0Z1bmN0aW9uVHlwZTtcblxuICAgIC8qKiBTdGFydCBvZiB0aGUgY29tcGFyaXNvbiByYW5nZS4gKi9cbiAgICBASW5wdXQoKSBjb21wYXJpc29uU3RhcnQ/OiBEYXRlO1xuXG4gICAgLyoqIEVuZCBvZiB0aGUgY29tcGFyaXNvbiByYW5nZS4gKi9cbiAgICBASW5wdXQoKSBjb21wYXJpc29uRW5kPzogRGF0ZTtcblxuICAgIC8qKiBBUklBIEFjY2Vzc2libGUgbmFtZSBvZiB0aGUgYDxpbnB1dCBtYXRTdGFydERhdGUvPmAgKi9cbiAgICBASW5wdXQoKSBzdGFydERhdGVBY2Nlc3NpYmxlTmFtZT86IHN0cmluZztcblxuICAgIC8qKiBBUklBIEFjY2Vzc2libGUgbmFtZSBvZiB0aGUgYDxpbnB1dCBtYXRFbmREYXRlLz5gICovXG4gICAgQElucHV0KCkgZW5kRGF0ZUFjY2Vzc2libGVOYW1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRmlyc3QgZGF5IG9mIHdlZWsuXG4gICAgICogWmVyby1iYXNlZCBzdGFydGluZyBmcm9tIFN1bmRheS5cbiAgICAgKiBEZWZhdWx0OiAwIC0gU3VuZGF5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpcnN0RGF5T2ZXZWVrID0gMDtcblxuICAgIC8qKiBPcmlnaW4gb2YgYWN0aXZlIGRyYWcsIG9yIG51bGwgd2hlbiBkcmFnZ2luZyBpcyBub3QgYWN0aXZlLiAqL1xuICAgIEBJbnB1dCgpIGFjdGl2ZURyYWc/OiBDYWxlbmRhclVzZXJFdmVudE1vZGVsPERhdGU+O1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IHNlbGVjdGluZyBhIHJhbmdlIG9mIGRhdGVzLiAqL1xuICAgIEBJbnB1dCgpIGlzUmFuZ2UgPSBmYWxzZTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIGEgbmV3IGRhdGUgaXMgc2VsZWN0ZWQuICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxPcHRpb25hbFR5cGU8RGF0ZT4+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBhbnkgZGF0ZSBpcyBzZWxlY3RlZC4gKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdXNlclNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJVc2VyRXZlbnRNb2RlbDxPcHRpb25hbFR5cGU8RGF0ZT4+PigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIHVzZXIgaW5pdGlhdGVzIGEgZGF0ZSByYW5nZSBkcmFnIHZpYSBtb3VzZSBvciB0b3VjaC4gKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZHJhZ1N0YXJ0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyVXNlckV2ZW50TW9kZWw8RGF0ZT4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNvbXBsZXRlcyBvciBjYW5jZWxzIGEgZGF0ZSByYW5nZSBkcmFnLlxuICAgICAqIEVtaXRzIG51bGwgd2hlbiB0aGUgZHJhZyB3YXMgY2FuY2VsZWQgb3IgdGhlIG5ld2x5IHNlbGVjdGVkIGRhdGUgcmFuZ2UgaWYgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBkcmFnRW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyVXNlckV2ZW50TW9kZWw8T3B0aW9uYWxUeXBlPERhdGVSYW5nZU1vZGVsPj4+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBhbnkgZGF0ZSBpcyBhY3RpdmF0ZWQuICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGFjdGl2ZURhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgICAvKiogVGhlIGxhYmVsIGZvciB0aGlzIG1vbnRoIChlLmcuIFwiSmFudWFyeSAyMDE3XCIpLiAqL1xuICAgIG1vbnRoTGFiZWwhOiBzdHJpbmc7XG5cbiAgICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgdGhlIGRhdGVzIG9mIHRoZSBtb250aC4gKi9cbiAgICB3ZWVrczogQ2FsZW5kYXJDZWxsTW9kZWxbXVtdID0gW107XG5cbiAgICAvKiogVGhlIG51bWJlciBvZiBibGFuayBjZWxscyBpbiB0aGUgZmlyc3Qgcm93IGJlZm9yZSB0aGUgMXN0IG9mIHRoZSBtb250aC4gKi9cbiAgICBmaXJzdFdlZWtPZmZzZXQgPSAwO1xuXG4gICAgLyoqIFN0YXJ0IHZhbHVlIG9mIHRoZSBjdXJyZW50bHktc2hvd24gZGF0ZSByYW5nZS4gKi9cbiAgICByYW5nZVN0YXJ0PzogbnVtYmVyO1xuXG4gICAgLyoqIEVuZCB2YWx1ZSBvZiB0aGUgY3VycmVudGx5LXNob3duIGRhdGUgcmFuZ2UuICovXG4gICAgcmFuZ2VFbmQ/OiBudW1iZXI7XG5cbiAgICAvKiogU3RhcnQgdmFsdWUgb2YgdGhlIGN1cnJlbnRseS1zaG93biBjb21wYXJpc29uIGRhdGUgcmFuZ2UuICovXG4gICAgY29tcGFyaXNvblJhbmdlU3RhcnQ/OiBudW1iZXI7XG5cbiAgICAvKiogRW5kIHZhbHVlIG9mIHRoZSBjdXJyZW50bHktc2hvd24gY29tcGFyaXNvbiBkYXRlIHJhbmdlLiAqL1xuICAgIGNvbXBhcmlzb25SYW5nZUVuZD86IG51bWJlcjtcblxuICAgIC8qKiBTdGFydCBvZiB0aGUgcHJldmlldyByYW5nZS4gKi9cbiAgICBwcmV2aWV3U3RhcnQ/OiBudW1iZXI7XG5cbiAgICAvKiogRW5kIG9mIHRoZSBwcmV2aWV3IHJhbmdlLiAqL1xuICAgIHByZXZpZXdFbmQ/OiBudW1iZXI7XG5cbiAgICAvKiogVGhlIGRhdGUgb2YgdGhlIG1vbnRoIHRoYXQgdG9kYXkgZmFsbHMgb24uIE51bGwgaWYgdG9kYXkgaXMgaW4gYW5vdGhlciBtb250aC4gKi9cbiAgICB0b2RheURhdGU/OiBudW1iZXI7XG5cbiAgICAvKiogVGhlIG5hbWVzIG9mIHRoZSB3ZWVrZGF5cy4gKi9cbiAgICB3ZWVrZGF5czogeyBsb25nOiBzdHJpbmc7IG5hcnJvdzogc3RyaW5nOyBpZDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgLyoqIEZsYWcgdXNlZCB0byBmaWx0ZXIgb3V0IHNwYWNlL2VudGVyIGtleXVwIGV2ZW50cyB0aGF0IG9yaWdpbmF0ZWQgb3V0c2lkZSBvZiB0aGUgdmlldy4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3Rpb25LZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbWluRGF0ZT86IERhdGU7XG4gICAgcHJpdmF0ZSBfbWF4RGF0ZT86IERhdGU7XG4gICAgcHJpdmF0ZSBvbGRBY3RpdmVEYXRlPzogRGF0ZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsb2NvU2VydmljZSA9IGluamVjdChUcmFuc2xvY29TZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVTZXJ2aWNlID0gaW5qZWN0KERhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGVuZGFyU2lnbmFsc1NlcnZpY2UgPSBpbmplY3QoQ2FsZW5kYXJTaWduYWxzU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhclJhbmdlU3RyYXRlZ3kgPSBpbmplY3QoQ2FsZW5kYXJSYW5nZVN0cmF0ZWd5U2VydmljZSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgZWZmZWN0KCgpID0+IHRoaXMudXBkYXRlQWN0aXZlRGF0ZSh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsYW5nU3ViID0gdGhpcy50cmFuc2xvY29TZXJ2aWNlLmxhbmdDaGFuZ2VzJFxuICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaW5pdCgpKTtcbiAgICAgICAgdGhpcy5hZGRTdWJzY3JpcHRpb25zKGxhbmdTdWIpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29tcGFyaXNvbkNoYW5nZSA9IGNoYW5nZXNbJ2NvbXBhcmlzb25TdGFydCddIHx8IGNoYW5nZXNbJ2NvbXBhcmlzb25FbmQnXTtcblxuICAgICAgICBpZiAoY29tcGFyaXNvbkNoYW5nZSAmJiAhY29tcGFyaXNvbkNoYW5nZS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZXModGhpcy5zZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1snYWN0aXZlRHJhZyddICYmICF0aGlzLmFjdGl2ZURyYWcpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJQcmV2aWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyB3aGVuIGEgbmV3IGRhdGUgaXMgc2VsZWN0ZWQuICovXG4gICAgZGF0ZVNlbGVjdGVkKGV2ZW50OiBDYWxlbmRhclVzZXJFdmVudE1vZGVsPG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IGV2ZW50LnZhbHVlO1xuICAgICAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLmdldERhdGVGcm9tRGF5T2ZNb250aChkYXRlKTtcbiAgICAgICAgY29uc3QgY3VyclNlbGVjdGlvbiA9IHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5zZWxlY3RlZERhdGUoKTtcbiAgICAgICAgbGV0IHJhbmdlU3RhcnREYXRlOiBPcHRpb25hbFR5cGU8bnVtYmVyPjtcbiAgICAgICAgbGV0IHJhbmdlRW5kRGF0ZTogT3B0aW9uYWxUeXBlPG51bWJlcj47XG5cbiAgICAgICAgaWYgKGN1cnJTZWxlY3Rpb24gaW5zdGFuY2VvZiBEYXRlUmFuZ2VNb2RlbCkge1xuICAgICAgICAgICAgcmFuZ2VTdGFydERhdGUgPSB0aGlzLmdldERhdGVJbkN1cnJlbnRNb250aChjdXJyU2VsZWN0aW9uLnN0YXJ0KTtcbiAgICAgICAgICAgIHJhbmdlRW5kRGF0ZSA9IHRoaXMuZ2V0RGF0ZUluQ3VycmVudE1vbnRoKGN1cnJTZWxlY3Rpb24uZW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlU3RhcnREYXRlID0gcmFuZ2VFbmREYXRlID0gdGhpcy5nZXREYXRlSW5DdXJyZW50TW9udGgoY3VyclNlbGVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2VTdGFydERhdGUgIT09IGRhdGUgfHwgcmFuZ2VFbmREYXRlICE9PSBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2Uuc2VsZWN0ZWREYXRlID0gc2VsZWN0ZWREYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2VyU2VsZWN0aW9uLmVtaXQoeyB2YWx1ZTogc2VsZWN0ZWREYXRlLCBldmVudDogZXZlbnQuZXZlbnQgfSk7XG4gICAgICAgIHRoaXMuY2xlYXJQcmV2aWV3KCk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMga2V5ZG93biBldmVudHMgb24gdGhlIGNhbGVuZGFyIGJvZHkgd2hlbiBjYWxlbmRhciBpcyBpbiBtb250aCB2aWV3LiAqL1xuICAgIGhhbmRsZUNhbGVuZGFyQm9keUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gVE9ETyhtbWFsZXJiYSk6IFdlIGN1cnJlbnRseSBhbGxvdyBrZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGRpc2FibGVkIGRhdGVzLCBidXQganVzdCBwcmV2ZW50XG4gICAgICAgIC8vIGRpc2FibGVkIG9uZXMgZnJvbSBiZWluZyBzZWxlY3RlZC4gVGhpcyBtYXkgbm90IGJlIGlkZWFsLCB3ZSBzaG91bGQgbG9vayBpbnRvIHdoZXRoZXJcbiAgICAgICAgLy8gbmF2aWdhdGlvbiBzaG91bGQgc2tpcCBvdmVyIGRpc2FibGVkIGRhdGVzLCBhbmQgaWYgc28sIGhvdyB0byBpbXBsZW1lbnQgdGhhdCBlZmZpY2llbnRseS5cblxuICAgICAgICBjb25zdCBvbGRBY3RpdmVEYXRlID0gdGhpcy5hY3RpdmVEYXRlO1xuICAgICAgICBsZXQgdGVtcEFjdGl2ZURhdGU6IE9wdGlvbmFsVHlwZTxEYXRlPjtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnTEVGVF9BUlJPVyc6XG4gICAgICAgICAgICAgICAgdGVtcEFjdGl2ZURhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmFkZERheXModGhpcy5hY3RpdmVEYXRlLCAtMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdSSUdIVF9BUlJPVyc6XG4gICAgICAgICAgICAgICAgdGVtcEFjdGl2ZURhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmFkZERheXModGhpcy5hY3RpdmVEYXRlLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1VQX0FSUk9XJzpcbiAgICAgICAgICAgICAgICB0ZW1wQWN0aXZlRGF0ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuYWRkRGF5cyh0aGlzLmFjdGl2ZURhdGUsIC03KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0RPV05fQVJST1cnOlxuICAgICAgICAgICAgICAgIHRlbXBBY3RpdmVEYXRlID0gdGhpcy5kYXRlU2VydmljZS5hZGREYXlzKHRoaXMuYWN0aXZlRGF0ZSwgNyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdIT01FJzpcbiAgICAgICAgICAgICAgICB0ZW1wQWN0aXZlRGF0ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuYWRkRGF5cyh0aGlzLmFjdGl2ZURhdGUsIDEgLSB0aGlzLmFjdGl2ZURhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VORCc6XG4gICAgICAgICAgICAgICAgdGVtcEFjdGl2ZURhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmFkZERheXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU2VydmljZS5nZXROdW1EYXlzSW5Nb250aCh0aGlzLmFjdGl2ZURhdGUpIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdQQUdFX1VQJzpcbiAgICAgICAgICAgICAgICB0ZW1wQWN0aXZlRGF0ZSA9IGV2ZW50LmFsdEtleVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVNlcnZpY2UuYWRkWWVhcnModGhpcy5hY3RpdmVEYXRlLCAtMSlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRhdGVTZXJ2aWNlLmFkZE1vbnRocyh0aGlzLmFjdGl2ZURhdGUsIC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1BBR0VfRE9XTic6XG4gICAgICAgICAgICAgICAgdGVtcEFjdGl2ZURhdGUgPSBldmVudC5hbHRLZXlcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmRhdGVTZXJ2aWNlLmFkZFllYXJzKHRoaXMuYWN0aXZlRGF0ZSwgMSlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRhdGVTZXJ2aWNlLmFkZE1vbnRocyh0aGlzLmFjdGl2ZURhdGUsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRU5URVInOlxuICAgICAgICAgICAgY2FzZSAnU1BBQ0UnOlxuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbktleVByZXNzZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuU2VsZWN0KHRoaXMuYWN0aXZlRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB1bmV4cGVjdGVkIGRlZmF1bHQgYWN0aW9ucyBzdWNoIGFzIGZvcm0gc3VibWlzc2lvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gaGVyZSB3aGlsZSB0aGUgc2VsZWN0aW9uIGhhcHBlbnMgaW5cbiAgICAgICAgICAgICAgICAgICAgLy8gYGtleXVwYCBiZWxvdy4gV2UgY2FuJ3QgZG8gdGhlIHNlbGVjdGlvbiBoZXJlLCBiZWNhdXNlIGl0IGNhbiBjYXVzZSB0aGUgY2FsZW5kYXIgdG9cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVvcGVuIGlmIGZvY3VzIGlzIHJlc3RvcmVkIGltbWVkaWF0ZWx5LiBXZSBhbHNvIGNhbid0IGNhbGwgYHByZXZlbnREZWZhdWx0YCBvbiBga2V5dXBgXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyB0b28gbGF0ZSAoc2VlICMyMzMwNSkuXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ0VTQ0FQRSc6XG4gICAgICAgICAgICAgICAgLy8gQWJvcnQgdGhlIGN1cnJlbnQgcmFuZ2Ugc2VsZWN0aW9uIGlmIHRoZSB1c2VyIHByZXNzZXMgZXNjYXBlIG1pZC1zZWxlY3Rpb24uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldmlld0VuZCAhPT0gdW5kZWZpbmVkICYmICFLZXlib2FyZFRvb2xzLmhhc01vZGlmaWVyS2V5KGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUHJldmlldygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRyYWcgaXMgaW4gcHJvZ3Jlc3MsIGNhbmNlbCB0aGUgZHJhZyB3aXRob3V0IGNoYW5naW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRW5kZWQuZW1pdCh7IHZhbHVlOiB1bmRlZmluZWQsIGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJTZWxlY3Rpb24uZW1pdCh7IHZhbHVlOiB1bmRlZmluZWQsIGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBQcmV2ZW50cyB0aGUgb3ZlcmxheSBmcm9tIGNsb3NpbmcuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJldmVudCBkZWZhdWx0IG9yIGZvY3VzIGFjdGl2ZSBjZWxsIG9uIGtleXMgdGhhdCB3ZSBkb24ndCBleHBsaWNpdGx5IGhhbmRsZS5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRlU2VydmljZS5jb21wYXJlKG9sZEFjdGl2ZURhdGUsIHRoaXMuYWN0aXZlRGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlID0gdGVtcEFjdGl2ZURhdGU7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXZlbnQgdW5leHBlY3RlZCBkZWZhdWx0IGFjdGlvbnMgc3VjaCBhcyBmb3JtIHN1Ym1pc3Npb24uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMga2V5dXAgZXZlbnRzIG9uIHRoZSBjYWxlbmRhciBib2R5IHdoZW4gY2FsZW5kYXIgaXMgaW4gbW9udGggdmlldy4gKi9cbiAgICBoYW5kbGVDYWxlbmRhckJvZHlLZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnU1BBQ0UnIHx8IGV2ZW50LmtleSA9PT0gJ0VOVEVSJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbktleVByZXNzZWQgJiYgdGhpcy5jYW5TZWxlY3QodGhpcy5hY3RpdmVEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVNlbGVjdGVkKHsgdmFsdWU6IHRoaXMuYWN0aXZlRGF0ZS5nZXREYXRlKCksIGV2ZW50IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25LZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGl6ZXMgdGhpcyBtb250aCB2aWV3LiAqL1xuICAgIGluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0UmFuZ2VzKHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLnRvZGF5RGF0ZSA9IHRoaXMuZ2V0Q2VsbENvbXBhcmVWYWx1ZShuZXcgRGF0ZSgpKTtcbiAgICAgICAgdGhpcy5tb250aExhYmVsID0gdGhpcy5kYXRlU2VydmljZS5nZXRNb250aE5hbWVzKCdzaG9ydCcpW3RoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpXS50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuICAgICAgICBjb25zdCBmaXJzdE9mTW9udGggPSB0aGlzLmRhdGVTZXJ2aWNlLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICAxXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlyc3RXZWVrT2Zmc2V0ID0gKGRheXNQZXJXZWVrICsgZmlyc3RPZk1vbnRoLmdldERheSgpIC0gdGhpcy5maXJzdERheU9mV2VlaykgJSBkYXlzUGVyV2VlaztcblxuICAgICAgICB0aGlzLmluaXRXZWVrZGF5cygpO1xuICAgICAgICB0aGlzLmNyZWF0ZVdlZWtDZWxscygpO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIHRoZSBhY3RpdmUgY2VsbCBhZnRlciB0aGUgbWljcm90YXNrIHF1ZXVlIGlzIGVtcHR5LiAqL1xuICAgIGZvY3VzQWN0aXZlQ2VsbChtb3ZlUHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWF0Q2FsZW5kYXJCb2R5LmZvY3VzQWN0aXZlQ2VsbChtb3ZlUHJldmlldyk7XG4gICAgfVxuXG4gICAgLyoqIEZvY3VzZXMgdGhlIGFjdGl2ZSBjZWxsIGFmdGVyIGNoYW5nZSBkZXRlY3Rpb24gaGFzIHJ1biBhbmQgdGhlIG1pY3JvdGFzayBxdWV1ZSBpcyBlbXB0eS4gKi9cbiAgICBmb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tYXRDYWxlbmRhckJvZHkuc2NoZWR1bGVGb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkKCk7XG4gICAgfVxuXG4gICAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBhY3RpdmF0ZWQgYSBuZXcgY2VsbCBhbmQgdGhlIHByZXZpZXcgbmVlZHMgdG8gYmUgdXBkYXRlZC4gKi9cbiAgICBwcmV2aWV3Q2hhbmdlZCh7IHZhbHVlOiBjZWxsIH06IENhbGVuZGFyVXNlckV2ZW50TW9kZWw8T3B0aW9uYWxUeXBlPENhbGVuZGFyQ2VsbE1vZGVsPj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1JhbmdlICYmICEodGhpcy5zZWxlY3RlZCBpbnN0YW5jZW9mIERhdGVSYW5nZU1vZGVsKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG5ldyBEYXRlUmFuZ2VNb2RlbCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIHdpbGwgYmUgYSByYW5nZSwgYmVjYXVzZSBwcmV2aWV3XG4gICAgICAgIC8vIGV2ZW50cyBhcmVuJ3QgZmlyZWQgZm9yIHNpbmdsZSBkYXRlIHNlbGVjdGlvbnMuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2VsbCA/IGNlbGwucmF3VmFsdWUhIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBwcmV2aWV3UmFuZ2UgPSB0aGlzLmNhbGVuZGFyUmFuZ2VTdHJhdGVneS5jcmVhdGVQcmV2aWV3KHZhbHVlLCB0aGlzLnNlbGVjdGVkIGFzIERhdGVSYW5nZU1vZGVsKTtcbiAgICAgICAgdGhpcy5wcmV2aWV3U3RhcnQgPSB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUocHJldmlld1JhbmdlLnN0YXJ0KTtcbiAgICAgICAgdGhpcy5wcmV2aWV3RW5kID0gdGhpcy5nZXRDZWxsQ29tcGFyZVZhbHVlKHByZXZpZXdSYW5nZS5lbmQpO1xuXG4gICAgICAgIGlmICghIXRoaXMuYWN0aXZlRHJhZyAmJiAhIXZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBkcmFnUmFuZ2UgPSB0aGlzLmNhbGVuZGFyUmFuZ2VTdHJhdGVneS5jcmVhdGVEcmFnPy4odGhpcy5hY3RpdmVEcmFnLnZhbHVlLCB0aGlzLnNlbGVjdGVkIGFzIERhdGVSYW5nZU1vZGVsLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghIWRyYWdSYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld1N0YXJ0ID0gdGhpcy5nZXRDZWxsQ29tcGFyZVZhbHVlKGRyYWdSYW5nZS5zdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RW5kID0gdGhpcy5nZXRDZWxsQ29tcGFyZVZhbHVlKGRyYWdSYW5nZS5lbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90ZSB0aGF0IGhlcmUgd2UgbmVlZCB0byB1c2UgYGRldGVjdENoYW5nZXNgLCByYXRoZXIgdGhhbiBgbWFya0ZvckNoZWNrYCwgYmVjYXVzZVxuICAgICAgICAvLyB0aGUgd2F5IGBfZm9jdXNBY3RpdmVDZWxsYCBpcyBzZXQgdXAgYXQgdGhlIG1vbWVudCBtYWtlcyBpdCBmaXJlIGF0IHRoZSB3cm9uZyB0aW1lXG4gICAgICAgIC8vIHdoZW4gbmF2aWdhdGluZyBvbmUgbW9udGggYmFjayB1c2luZyB0aGUga2V5Ym9hcmQgd2hpY2ggd2lsbCBjYXVzZSB0aGlzIGhhbmRsZXJcbiAgICAgICAgLy8gdG8gdGhyb3cgYSBcImNoYW5nZWQgYWZ0ZXIgY2hlY2tlZFwiIGVycm9yIHdoZW4gdXBkYXRpbmcgdGhlIHByZXZpZXcgc3RhdGUuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBlbmRlZCBhIGRyYWcuIElmIHRoZSBkcmFnL2Ryb3Agd2FzIHN1Y2Nlc3NmdWwsXG4gICAgICogY29tcHV0ZXMgYW5kIGVtaXRzIHRoZSBuZXcgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZHJhZ0VuZGVkKGV2ZW50OiBDYWxlbmRhclVzZXJFdmVudE1vZGVsPE9wdGlvbmFsVHlwZTxEYXRlPj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZURyYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC52YWx1ZSkge1xuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRyYWcgZWZmZWN0XG4gICAgICAgICAgICBjb25zdCBkcmFnRHJvcFJlc3VsdCA9IHRoaXMuY2FsZW5kYXJSYW5nZVN0cmF0ZWd5Py5jcmVhdGVEcmFnPy4oXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcmFnLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgYXMgRGF0ZVJhbmdlTW9kZWwsXG4gICAgICAgICAgICAgICAgZXZlbnQudmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuZHJhZ0VuZGVkLmVtaXQoeyB2YWx1ZTogZHJhZ0Ryb3BSZXN1bHQgPz8gdW5kZWZpbmVkLCBldmVudDogZXZlbnQuZXZlbnQgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdFbmRlZC5lbWl0KHsgdmFsdWU6IHVuZGVmaW5lZCwgZXZlbnQ6IGV2ZW50LmV2ZW50IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVBY3RpdmVEYXRlKHZhbHVlOiBEYXRlLCBpc0Zyb21FZmZlY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9sZEFjdGl2ZURhdGUgPSB0aGlzLm9sZEFjdGl2ZURhdGUgfHwgdmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbGlkRGF0ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0VmFsaWRPclVuZGVmaW5lZCh0aGlzLmRhdGVTZXJ2aWNlLmRlc2VyaWFsaXplKHZhbHVlKSkgfHwgbmV3IERhdGUoKTtcblxuICAgICAgICBpZiAoIWlzRnJvbUVmZmVjdCkge1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmNsYW1wKHZhbGlkRGF0ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzU2FtZU1vbnRoQW5kWWVhckFzQWN0aXZlRGF0ZSh0aGlzLm9sZEFjdGl2ZURhdGUsIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCkpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2xkQWN0aXZlRGF0ZSA9IHZhbHVlO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRha2VzIGEgZGF5IG9mIHRoZSBtb250aCBhbmQgcmV0dXJucyBhIG5ldyBkYXRlIGluIHRoZSBzYW1lIG1vbnRoIGFuZCB5ZWFyIGFzIHRoZSBjdXJyZW50bHlcbiAgICAgKiAgYWN0aXZlIGRhdGUuIFRoZSByZXR1cm5lZCBkYXRlIHdpbGwgaGF2ZSB0aGUgc2FtZSBkYXkgb2YgdGhlIG1vbnRoIGFzIHRoZSBhcmd1bWVudCBkYXRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RGF0ZUZyb21EYXlPZk1vbnRoKGRheU9mTW9udGg6IG51bWJlcik6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlU2VydmljZS5jcmVhdGUodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpLCBkYXlPZk1vbnRoKTtcbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGl6ZXMgdGhlIHdlZWtkYXlzLiAqL1xuICAgIHByaXZhdGUgaW5pdFdlZWtkYXlzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IHRoaXMuZmlyc3REYXlPZldlZWs7XG4gICAgICAgIGNvbnN0IG5hcnJvd1dlZWtkYXlzID0gdGhpcy5kYXRlU2VydmljZS5nZXREYXlPZldlZWtOYW1lcygnbmFycm93Jyk7XG4gICAgICAgIGNvbnN0IGxvbmdXZWVrZGF5cyA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0RGF5T2ZXZWVrTmFtZXMoJ2xvbmcnKTtcbiAgICAgICAgLy8gUm90YXRlIHRoZSBsYWJlbHMgZm9yIGRheXMgb2YgdGhlIHdlZWsgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBjb25zdCB3ZWVrZGF5cyA9IGxvbmdXZWVrZGF5cy5tYXAoKGxvbmcsIGkpID0+ICh7IGxvbmcsIG5hcnJvdzogbmFycm93V2Vla2RheXNbaV0sIGlkOiB1bmlxdWVJZENvdW50ZXIrKyB9KSk7XG4gICAgICAgIHRoaXMud2Vla2RheXMgPSB3ZWVrZGF5cy5zbGljZShmaXJzdERheU9mV2VlaykuY29uY2F0KHdlZWtkYXlzLnNsaWNlKDAsIGZpcnN0RGF5T2ZXZWVrKSk7XG4gICAgfVxuXG4gICAgLyoqIENyZWF0ZXMgTWF0Q2FsZW5kYXJDZWxscyBmb3IgdGhlIGRhdGVzIGluIHRoaXMgbW9udGguICovXG4gICAgcHJpdmF0ZSBjcmVhdGVXZWVrQ2VsbHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gdGhpcy5kYXRlU2VydmljZS5nZXROdW1EYXlzSW5Nb250aCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgICBjb25zdCBkYXRlTmFtZXMgPSB0aGlzLmRhdGVTZXJ2aWNlLmdldERhdGVOYW1lcygpO1xuICAgICAgICB0aGlzLndlZWtzID0gW1tdXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgY2VsbCA9IHRoaXMuZmlyc3RXZWVrT2Zmc2V0OyBpIDwgZGF5c0luTW9udGg7IGkrKywgY2VsbCsrKSB7XG4gICAgICAgICAgICBpZiAoY2VsbCA9PT0gZGF5c1BlcldlZWspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndlZWtzLnB1c2goW10pO1xuICAgICAgICAgICAgICAgIGNlbGwgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlU2VydmljZS5jcmVhdGUodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCBpc0VuYWJsZWQgPSB0aGlzLnNob3VsZEVuYWJsZURhdGUoZGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSB0aGlzLmRhdGVTZXJ2aWNlLmZvcm1hdChkYXRlLCB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSk7XG4gICAgICAgICAgICBjb25zdCBjZWxsQ2xhc3NlcyA9IHRoaXMuZGF0ZUNsYXNzID8gdGhpcy5kYXRlQ2xhc3MoZGF0ZSwgJ21vbnRoJykgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHRoaXMud2Vla3NbdGhpcy53ZWVrcy5sZW5ndGggLSAxXS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBDYWxlbmRhckNlbGxNb2RlbChcbiAgICAgICAgICAgICAgICAgICAgaSArIDEsXG4gICAgICAgICAgICAgICAgICAgIGRhdGVOYW1lc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBpc0VuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIGNlbGxDbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUoZGF0ZSkhLFxuICAgICAgICAgICAgICAgICAgICBkYXRlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBEYXRlIGZpbHRlciBmb3IgdGhlIG1vbnRoICovXG4gICAgcHJpdmF0ZSBzaG91bGRFbmFibGVEYXRlKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhZGF0ZSAmJlxuICAgICAgICAgICAgKCF0aGlzLm1pbkRhdGUgfHwgdGhpcy5kYXRlU2VydmljZS5jb21wYXJlKGRhdGUsIHRoaXMubWluRGF0ZSkgPj0gMCkgJiZcbiAgICAgICAgICAgICghdGhpcy5tYXhEYXRlIHx8IHRoaXMuZGF0ZVNlcnZpY2UuY29tcGFyZShkYXRlLCB0aGlzLm1heERhdGUpIDw9IDApICYmXG4gICAgICAgICAgICAoIXRoaXMuZGF0ZUZpbHRlciB8fCB0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGUgaW4gdGhpcyBtb250aCB0aGF0IHRoZSBnaXZlbiBEYXRlIGZhbGxzIG9uLlxuICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgZ2l2ZW4gRGF0ZSBpcyBpbiBhbm90aGVyIG1vbnRoLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RGF0ZUluQ3VycmVudE1vbnRoKGRhdGU/OiBEYXRlKTogT3B0aW9uYWxUeXBlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gISFkYXRlICYmIHRoaXMuaXNTYW1lTW9udGhBbmRZZWFyQXNBY3RpdmVEYXRlKGRhdGUsIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCkpXG4gICAgICAgICAgICA/IGRhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIDIgZGF0ZXMgYXJlIG5vbi1udWxsIGFuZCBmYWxsIHdpdGhpbiB0aGUgc2FtZSBtb250aCBvZiB0aGUgc2FtZSB5ZWFyLiAqL1xuICAgIHByaXZhdGUgaXNTYW1lTW9udGhBbmRZZWFyQXNBY3RpdmVEYXRlKGQxPzogRGF0ZSwgZDI/OiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoISFkMSAmJiAhIWQyICYmIGQxLmdldE1vbnRoKCkgPT09IGQyLmdldE1vbnRoKCkgJiYgZDEuZ2V0RnVsbFllYXIoKSA9PT0gZDIuZ2V0RnVsbFllYXIoKSk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG9uZSBjZWxsIHRvIGFub3RoZXIuICovXG4gICAgcHJpdmF0ZSBnZXRDZWxsQ29tcGFyZVZhbHVlKGRhdGU/OiBEYXRlKTogT3B0aW9uYWxUeXBlPG51bWJlcj4ge1xuICAgICAgICBpZiAoISFkYXRlKSB7XG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHRpbWUgc2luY2UgdGhlIFVuaXggZXBvY2ggdG8gY29tcGFyZSBkYXRlcyBpbiB0aGlzIHZpZXcsIHJhdGhlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gY2VsbCB2YWx1ZXMsIGJlY2F1c2Ugd2UgbmVlZCB0byBzdXBwb3J0IHJhbmdlcyB0aGF0IHNwYW4gYWNyb3NzIG11bHRpcGxlIG1vbnRocy95ZWFycy5cbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkuZ2V0VGltZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogU2V0cyB0aGUgY3VycmVudCByYW5nZSBiYXNlZCBvbiBhIG1vZGVsIHZhbHVlLiAqL1xuICAgIHByaXZhdGUgc2V0UmFuZ2VzKHNlbGVjdGVkVmFsdWU6IERhdGVSYW5nZU1vZGVsIHwgT3B0aW9uYWxUeXBlPERhdGU+KTogdm9pZCB7XG4gICAgICAgIGlmIChzZWxlY3RlZFZhbHVlIGluc3RhbmNlb2YgRGF0ZVJhbmdlTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydCA9IHRoaXMuZ2V0Q2VsbENvbXBhcmVWYWx1ZShzZWxlY3RlZFZhbHVlLnN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VFbmQgPSB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUoc2VsZWN0ZWRWYWx1ZS5lbmQpO1xuICAgICAgICAgICAgdGhpcy5pc1JhbmdlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydCA9IHRoaXMucmFuZ2VFbmQgPSB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBhcmlzb25SYW5nZVN0YXJ0ID0gdGhpcy5nZXRDZWxsQ29tcGFyZVZhbHVlKHRoaXMuY29tcGFyaXNvblN0YXJ0KTtcbiAgICAgICAgdGhpcy5jb21wYXJpc29uUmFuZ2VFbmQgPSB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUodGhpcy5jb21wYXJpc29uRW5kKTtcbiAgICB9XG5cbiAgICAvKiogR2V0cyB3aGV0aGVyIGEgZGF0ZSBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlIG1vbnRoIHZpZXcuICovXG4gICAgcHJpdmF0ZSBjYW5TZWxlY3QoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGF0ZUZpbHRlciB8fCB0aGlzLmRhdGVGaWx0ZXIoZGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqIENsZWFycyBvdXQgcHJldmlldyBzdGF0ZS4gKi9cbiAgICBwcml2YXRlIGNsZWFyUHJldmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aWV3U3RhcnQgPSB0aGlzLnByZXZpZXdFbmQgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuIiwiPHVwZC1jYWxlbmRhci1oZWFkZXI+PC91cGQtY2FsZW5kYXItaGVhZGVyPlxuPGRpdiBjbGFzcz1cImNvbnRhaW5lciBtdC0yXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBzZXZlbi1jb2xzXCI+XG4gICAgICAgIEBmb3IgKGRheSBvZiB3ZWVrZGF5czsgdHJhY2sgZGF5LmlkKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEgcC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+e3sgZGF5LmxvbmcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgZGF5Lm5hcnJvdyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L2Rpdj5cbjx1cGQtY2FsZW5kYXItYm9keSBbbGFiZWxdPVwibW9udGhMYWJlbFwiIFtyb3dzXT1cIndlZWtzXCIgW3RvZGF5VmFsdWVdPVwidG9kYXlEYXRlIVwiIFtzdGFydFZhbHVlXT1cInJhbmdlU3RhcnQhXCJcbiAgICBbZW5kVmFsdWVdPVwicmFuZ2VFbmQhXCIgW2NvbXBhcmlzb25TdGFydF09XCJjb21wYXJpc29uUmFuZ2VTdGFydFwiIFtjb21wYXJpc29uRW5kXT1cImNvbXBhcmlzb25SYW5nZUVuZFwiXG4gICAgW3ByZXZpZXdTdGFydF09XCJwcmV2aWV3U3RhcnRcIiBbcHJldmlld0VuZF09XCJwcmV2aWV3RW5kXCIgW2lzUmFuZ2VdPVwiaXNSYW5nZVwiIFtsYWJlbE1pblJlcXVpcmVkQ2VsbHNdPVwiM1wiXG4gICAgW2FjdGl2ZUNlbGxdPVwiYWN0aXZlRGF0ZS5nZXREYXRlKCkgLSAxXCIgW3N0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lXT1cInN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lXCJcbiAgICBbZW5kRGF0ZUFjY2Vzc2libGVOYW1lXT1cImVuZERhdGVBY2Nlc3NpYmxlTmFtZVwiIChzZWxlY3RlZFZhbHVlQ2hhbmdlKT1cImRhdGVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAocHJldmlld0NoYW5nZSk9XCJwcmV2aWV3Q2hhbmdlZCgkZXZlbnQpXCIgKGRyYWdTdGFydGVkKT1cImRyYWdTdGFydGVkLmVtaXQoJGV2ZW50KVwiIChkcmFnRW5kZWQpPVwiX2RyYWdFbmRlZCgkZXZlbnQpXCJcbiAgICAoa2V5dXApPVwiaGFuZGxlQ2FsZW5kYXJCb2R5S2V5dXAoJGV2ZW50KVwiIChrZXlkb3duKT1cImhhbmRsZUNhbGVuZGFyQm9keUtleWRvd24oJGV2ZW50KVwiPlxuPC91cGQtY2FsZW5kYXItYm9keT5cbiJdfQ==
|
package/esm2022/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export const yearsPerPage = 24;
|
|
4
|
-
export class CalendarMultiYearViewComponent {
|
|
5
|
-
/** Initializes this month view. */
|
|
6
|
-
init() {
|
|
7
|
-
}
|
|
8
|
-
/** Focuses the active cell after the microtask queue is empty. */
|
|
9
|
-
focusActiveCell(movePreview) {
|
|
10
|
-
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarMultiYearViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
12
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: CalendarMultiYearViewComponent, selector: "upd-calendar-multi-year-view", ngImport: i0, template: "<p>calendar-multi-year-view works!</p>\n", styles: [""] }); }
|
|
13
|
-
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarMultiYearViewComponent, decorators: [{
|
|
15
|
-
type: Component,
|
|
16
|
-
args: [{ selector: 'upd-calendar-multi-year-view', template: "<p>calendar-multi-year-view works!</p>\n" }]
|
|
17
|
-
}] });
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcvY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcvY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTFDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFPL0IsTUFBTSxPQUFPLDhCQUE4QjtJQUN2QyxtQ0FBbUM7SUFDbkMsSUFBSTtJQUVKLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsZUFBZSxDQUFDLFdBQXFCO0lBQ3JDLENBQUM7OEdBUlEsOEJBQThCO2tHQUE5Qiw4QkFBOEIsb0VDVDNDLDBDQUNBOzsyRkRRYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0ksOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCB5ZWFyc1BlclBhZ2UgPSAyNDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1cGQtY2FsZW5kYXItbXVsdGkteWVhci12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhck11bHRpWWVhclZpZXdDb21wb25lbnQge1xuICAgIC8qKiBJbml0aWFsaXplcyB0aGlzIG1vbnRoIHZpZXcuICovXG4gICAgaW5pdCgpOiB2b2lkIHtcblxuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIHRoZSBhY3RpdmUgY2VsbCBhZnRlciB0aGUgbWljcm90YXNrIHF1ZXVlIGlzIGVtcHR5LiAqL1xuICAgIGZvY3VzQWN0aXZlQ2VsbChtb3ZlUHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB9XG59XG4iLCI8cD5jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcgd29ya3MhPC9wPlxuIl19
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class CalendarYearViewComponent {
|
|
4
|
-
/** Initializes this month view. */
|
|
5
|
-
init() {
|
|
6
|
-
}
|
|
7
|
-
/** Focuses the active cell after the microtask queue is empty. */
|
|
8
|
-
focusActiveCell(movePreview) {
|
|
9
|
-
}
|
|
10
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarYearViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
11
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: CalendarYearViewComponent, selector: "upd-calendar-year-view", ngImport: i0, template: "<p>calendar-year-view works!</p>\n", styles: [""] }); }
|
|
12
|
-
}
|
|
13
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarYearViewComponent, decorators: [{
|
|
14
|
-
type: Component,
|
|
15
|
-
args: [{ selector: 'upd-calendar-year-view', template: "<p>calendar-year-view works!</p>\n" }]
|
|
16
|
-
}] });
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci15ZWFyLXZpZXcvY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci15ZWFyLXZpZXcvY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTzFDLE1BQU0sT0FBTyx5QkFBeUI7SUFDbEMsbUNBQW1DO0lBQ25DLElBQUk7SUFFSixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLGVBQWUsQ0FBQyxXQUFxQjtJQUNyQyxDQUFDOzhHQVJRLHlCQUF5QjtrR0FBekIseUJBQXlCLDhEQ1B0QyxvQ0FDQTs7MkZETWEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNJLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwZC1jYWxlbmRhci15ZWFyLXZpZXcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci15ZWFyLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9jYWxlbmRhci15ZWFyLXZpZXcuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyWWVhclZpZXdDb21wb25lbnQge1xuICAgIC8qKiBJbml0aWFsaXplcyB0aGlzIG1vbnRoIHZpZXcuICovXG4gICAgaW5pdCgpOiB2b2lkIHtcblxuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIHRoZSBhY3RpdmUgY2VsbCBhZnRlciB0aGUgbWljcm90YXNrIHF1ZXVlIGlzIGVtcHR5LiAqL1xuICAgIGZvY3VzQWN0aXZlQ2VsbChtb3ZlUHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB9XG59XG4iLCI8cD5jYWxlbmRhci15ZWFyLXZpZXcgd29ya3MhPC9wPlxuIl19
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
let uniqueIdCounter = 0;
|
|
2
|
-
/**
|
|
3
|
-
* An internal class that represents the data corresponding to a single calendar cell.
|
|
4
|
-
* @docs-private
|
|
5
|
-
*/
|
|
6
|
-
export class CalendarCellModel {
|
|
7
|
-
constructor(value, displayValue, ariaLabel, isEnabled, cssClasses = {}, compareValue = value, rawValue) {
|
|
8
|
-
this.value = value;
|
|
9
|
-
this.displayValue = displayValue;
|
|
10
|
-
this.ariaLabel = ariaLabel;
|
|
11
|
-
this.isEnabled = isEnabled;
|
|
12
|
-
this.cssClasses = cssClasses;
|
|
13
|
-
this.compareValue = compareValue;
|
|
14
|
-
this.rawValue = rawValue;
|
|
15
|
-
this.id = uniqueIdCounter++;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItY2VsbC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvbW9kZWxzL2NhbGVuZGFyLWNlbGwubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRXhCOzs7R0FHRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFHMUIsWUFDVyxLQUFhLEVBQ2IsWUFBb0IsRUFDcEIsU0FBaUIsRUFDakIsU0FBa0IsRUFDbEIsYUFBeUMsRUFBRSxFQUMzQyxlQUFlLEtBQUssRUFDcEIsUUFBZTtRQU5mLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGNBQVMsR0FBVCxTQUFTLENBQVM7UUFDbEIsZUFBVSxHQUFWLFVBQVUsQ0FBaUM7UUFDM0MsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBTztRQVRqQixPQUFFLEdBQUcsZUFBZSxFQUFFLENBQUM7SUFXaEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FsZW5kYXJDZWxsQ3NzQ2xhc3Nlc1R5cGUgfSBmcm9tICcuLi90eXBlcy9jYWxlbmRhci1jZWxsLWNzcy1jbGFzc2VzLnR5cGUnO1xuXG5sZXQgdW5pcXVlSWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIGRhdGEgY29ycmVzcG9uZGluZyB0byBhIHNpbmdsZSBjYWxlbmRhciBjZWxsLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDZWxsTW9kZWwge1xuICAgIHJlYWRvbmx5IGlkID0gdW5pcXVlSWRDb3VudGVyKys7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHZhbHVlOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBkaXNwbGF5VmFsdWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgaXNFbmFibGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgY3NzQ2xhc3NlczogQ2FsZW5kYXJDZWxsQ3NzQ2xhc3Nlc1R5cGUgPSB7fSxcbiAgICAgICAgcHVibGljIGNvbXBhcmVWYWx1ZSA9IHZhbHVlLFxuICAgICAgICBwdWJsaWMgcmF3VmFsdWU/OiBEYXRlXG4gICAgKSB7XG4gICAgfVxufVxuIl19
|