@energycap/components 0.42.0 → 0.42.2-ECAP-26676-readonly-attribute-suppresses-help-popovers-on-checkboxes.20250122-1358
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components.module.mjs +10 -5
- package/esm2022/lib/controls/calendar/calendar-item.component.mjs +46 -14
- package/esm2022/lib/controls/calendar/calendar.component.mjs +169 -121
- package/esm2022/lib/controls/calendar/calendar.types.mjs +2 -4
- package/esm2022/lib/controls/checkbox/checkbox.component.mjs +2 -2
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +57 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +62 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +100 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +101 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +76 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +79 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +210 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +81 -0
- package/esm2022/lib/controls/date-input/date-input.component.mjs +322 -113
- package/esm2022/lib/controls/date-input/date-input.types.mjs +44 -0
- package/esm2022/lib/controls/file-upload/file-upload.component.mjs +1 -1
- package/esm2022/lib/controls/form-control/form-control.component.mjs +6 -12
- package/esm2022/lib/core/date-time-helper.mjs +10 -2
- package/esm2022/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +100 -0
- package/esm2022/public-api.mjs +63 -61
- package/fesm2022/energycap-components.mjs +1668 -509
- package/fesm2022/energycap-components.mjs.map +1 -1
- package/lib/components.module.d.ts +9 -8
- package/lib/controls/calendar/calendar-item.component.d.ts +11 -6
- package/lib/controls/calendar/calendar.component.d.ts +21 -23
- package/lib/controls/calendar/calendar.types.d.ts +11 -7
- package/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.d.ts +42 -0
- package/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.d.ts +18 -0
- package/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.d.ts +18 -0
- package/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.d.ts +20 -0
- package/lib/controls/date-input/date-input.component.d.ts +63 -28
- package/lib/controls/date-input/date-input.types.d.ts +62 -0
- package/lib/controls/form-control/form-control.component.d.ts +4 -6
- package/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.d.ts +23 -0
- package/package.json +1 -1
- package/public-api.d.ts +62 -60
- package/src/assets/locales/en_US.json +9 -1
@@ -0,0 +1,79 @@
|
|
1
|
+
import moment from "moment";
|
2
|
+
import { DateInput } from "../date-input.types";
|
3
|
+
import { DateInputSelectionStrategyBase } from "./date-input-selection-strategy-base";
|
4
|
+
/**
|
5
|
+
* Selection strategy for the 'month' selection mode.
|
6
|
+
*/
|
7
|
+
export class QuarterSelectionStrategy extends DateInputSelectionStrategyBase {
|
8
|
+
constructor() {
|
9
|
+
super(...arguments);
|
10
|
+
this.selectionViewMode = 'quarter';
|
11
|
+
this.validViewModes = ['quarter', 'year'];
|
12
|
+
this.showSecondaryTextbox = false;
|
13
|
+
this.showSecondaryCalendar = false;
|
14
|
+
}
|
15
|
+
formatSelection(selection) {
|
16
|
+
// Format the the quarter range as "MMM–MMM, YYYY"
|
17
|
+
// We only have one textbox in this mode
|
18
|
+
if (DateInput.isSelectionRange(selection)) {
|
19
|
+
const start = moment(selection.start).format('MMM');
|
20
|
+
const end = moment(selection.end).format('MMM');
|
21
|
+
const year = moment(selection.end).format('YYYY');
|
22
|
+
return {
|
23
|
+
textbox: `${start}–${end}, ${year}`,
|
24
|
+
textbox2: null
|
25
|
+
};
|
26
|
+
}
|
27
|
+
// This shouldn't happen since the selection should always be a range in quarter mode
|
28
|
+
return { textbox: null, textbox2: null };
|
29
|
+
}
|
30
|
+
parseTextboxValues(value, parseFormats, opts) {
|
31
|
+
// Only one textbox is used in this mode
|
32
|
+
const date = this.parseString(value.textbox, parseFormats, opts);
|
33
|
+
if (!date) {
|
34
|
+
return null;
|
35
|
+
}
|
36
|
+
return this.getSelectionFromDate(date);
|
37
|
+
}
|
38
|
+
getSelectionFromDate(date) {
|
39
|
+
return {
|
40
|
+
start: moment(date).startOf('quarter').toDate(),
|
41
|
+
end: moment(date).endOf('quarter').toDate()
|
42
|
+
};
|
43
|
+
}
|
44
|
+
getNewSelectionFromExisting(previousSelection) {
|
45
|
+
if (DateInput.isSelectionRange(previousSelection)) {
|
46
|
+
// Base the quarter range off of the existing selection's end date, falling back to the start date
|
47
|
+
const date = previousSelection.end || previousSelection.start;
|
48
|
+
if (date) {
|
49
|
+
return this.getSelectionFromDate(date);
|
50
|
+
}
|
51
|
+
}
|
52
|
+
else if (DateInput.isSelectionSingleDate(previousSelection)) {
|
53
|
+
// If the previous selection was a single date, make the range that quarter
|
54
|
+
return this.getSelectionFromDate(previousSelection);
|
55
|
+
}
|
56
|
+
return null;
|
57
|
+
}
|
58
|
+
getNextSelection(selection) {
|
59
|
+
// Move the selection to the next quarter
|
60
|
+
if (DateInput.isSelectionRange(selection) && selection.start) {
|
61
|
+
const date = moment(selection.start).add(1, 'quarter');
|
62
|
+
return this.getSelectionFromDate(date.toDate());
|
63
|
+
}
|
64
|
+
// This shouldn't happen since the next stepper is disabled if the selection only has one date.
|
65
|
+
// If it does, just return the selection as-is.
|
66
|
+
return selection;
|
67
|
+
}
|
68
|
+
getPreviousSelection(selection) {
|
69
|
+
// Move the selection to the previous quarter
|
70
|
+
if (DateInput.isSelectionRange(selection) && selection.start) {
|
71
|
+
const date = moment(selection.start).subtract(1, 'quarter');
|
72
|
+
return this.getSelectionFromDate(date.toDate());
|
73
|
+
}
|
74
|
+
// This shouldn't happen since the previous stepper is disabled if the selection only has one date.
|
75
|
+
// If it does, just return the selection as-is.
|
76
|
+
return selection;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhcnRlci1zZWxlY3Rpb24tc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvZGF0ZS1pbnB1dC9kYXRlLWlucHV0LXNlbGVjdGlvbi1zdHJhdGVnaWVzL3F1YXJ0ZXItc2VsZWN0aW9uLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFdEY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsOEJBQThCO0lBQTVFOztRQUNrQixzQkFBaUIsR0FBc0IsU0FBUyxDQUFDO1FBQ2pELG1CQUFjLEdBQXdCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3QiwwQkFBcUIsR0FBRyxLQUFLLENBQUM7SUEyRWhELENBQUM7SUF6RUMsZUFBZSxDQUFDLFNBQXNDO1FBQ3BELGtEQUFrRDtRQUNsRCx3Q0FBd0M7UUFDeEMsSUFBSSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO2dCQUNuQyxRQUFRLEVBQUUsSUFBSTthQUNmLENBQUM7UUFDSixDQUFDO1FBRUQscUZBQXFGO1FBQ3JGLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBc0MsRUFBRSxZQUFzQixFQUFFLElBQStCO1FBQ2hILHdDQUF3QztRQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFVO1FBQzdCLE9BQU87WUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDL0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFO1NBQzVDLENBQUM7SUFDSixDQUFDO0lBRUQsMkJBQTJCLENBQUMsaUJBQXVDO1FBQ2pFLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUNsRCxrR0FBa0c7WUFDbEcsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQztZQUM5RCxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQzlELDJFQUEyRTtZQUMzRSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFxQztRQUNwRCx5Q0FBeUM7UUFDekMsSUFBSSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsK0ZBQStGO1FBQy9GLCtDQUErQztRQUMvQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsU0FBcUM7UUFDeEQsNkNBQTZDO1FBQzdDLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELG1HQUFtRztRQUNuRywrQ0FBK0M7UUFDL0MsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSBcIi4uLy4uL2NhbGVuZGFyL2NhbGVuZGFyLnR5cGVzXCI7XHJcbmltcG9ydCB7IERhdGVJbnB1dCB9IGZyb20gXCIuLi9kYXRlLWlucHV0LnR5cGVzXCI7XHJcbmltcG9ydCB7IERhdGVJbnB1dFNlbGVjdGlvblN0cmF0ZWd5QmFzZSB9IGZyb20gXCIuL2RhdGUtaW5wdXQtc2VsZWN0aW9uLXN0cmF0ZWd5LWJhc2VcIjtcclxuXHJcbi8qKlxyXG4gKiBTZWxlY3Rpb24gc3RyYXRlZ3kgZm9yIHRoZSAnbW9udGgnIHNlbGVjdGlvbiBtb2RlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFF1YXJ0ZXJTZWxlY3Rpb25TdHJhdGVneSBleHRlbmRzIERhdGVJbnB1dFNlbGVjdGlvblN0cmF0ZWd5QmFzZSB7XHJcbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGlvblZpZXdNb2RlOiBDYWxlbmRhci5WaWV3TW9kZSA9ICdxdWFydGVyJztcclxuICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRWaWV3TW9kZXM6IENhbGVuZGFyLlZpZXdNb2RlW10gPSBbJ3F1YXJ0ZXInLCAneWVhciddO1xyXG4gIHB1YmxpYyByZWFkb25seSBzaG93U2Vjb25kYXJ5VGV4dGJveCA9IGZhbHNlO1xyXG4gIHB1YmxpYyByZWFkb25seSBzaG93U2Vjb25kYXJ5Q2FsZW5kYXIgPSBmYWxzZTtcclxuXHJcbiAgZm9ybWF0U2VsZWN0aW9uKHNlbGVjdGlvbj86IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKTogRGF0ZUlucHV0LlRleHRib3hHcm91cFsndmFsdWUnXSB7XHJcbiAgICAvLyBGb3JtYXQgdGhlIHRoZSBxdWFydGVyIHJhbmdlIGFzIFwiTU1N4oCTTU1NLCBZWVlZXCJcclxuICAgIC8vIFdlIG9ubHkgaGF2ZSBvbmUgdGV4dGJveCBpbiB0aGlzIG1vZGVcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pKSB7XHJcbiAgICAgIGNvbnN0IHN0YXJ0ID0gbW9tZW50KHNlbGVjdGlvbi5zdGFydCkuZm9ybWF0KCdNTU0nKTtcclxuICAgICAgY29uc3QgZW5kID0gbW9tZW50KHNlbGVjdGlvbi5lbmQpLmZvcm1hdCgnTU1NJyk7XHJcbiAgICAgIGNvbnN0IHllYXIgPSBtb21lbnQoc2VsZWN0aW9uLmVuZCkuZm9ybWF0KCdZWVlZJyk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdGV4dGJveDogYCR7c3RhcnR94oCTJHtlbmR9LCAke3llYXJ9YCxcclxuICAgICAgICB0ZXh0Ym94MjogbnVsbFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2UgdGhlIHNlbGVjdGlvbiBzaG91bGQgYWx3YXlzIGJlIGEgcmFuZ2UgaW4gcXVhcnRlciBtb2RlXHJcbiAgICByZXR1cm4geyB0ZXh0Ym94OiBudWxsLCB0ZXh0Ym94MjogbnVsbCB9O1xyXG4gIH1cclxuXHJcbiAgcGFyc2VUZXh0Ym94VmFsdWVzKHZhbHVlOiBEYXRlSW5wdXQuVGV4dGJveEdyb3VwWyd2YWx1ZSddLCBwYXJzZUZvcm1hdHM6IHN0cmluZ1tdLCBvcHRzPzogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zKTogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwge1xyXG4gICAgLy8gT25seSBvbmUgdGV4dGJveCBpcyB1c2VkIGluIHRoaXMgbW9kZVxyXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMucGFyc2VTdHJpbmcodmFsdWUudGV4dGJveCwgcGFyc2VGb3JtYXRzLCBvcHRzKTtcclxuICAgIFxyXG4gICAgaWYgKCFkYXRlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGlvbkZyb21EYXRlKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0aW9uRnJvbURhdGUoZGF0ZTogRGF0ZSk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0YXJ0OiBtb21lbnQoZGF0ZSkuc3RhcnRPZigncXVhcnRlcicpLnRvRGF0ZSgpLFxyXG4gICAgICBlbmQ6IG1vbWVudChkYXRlKS5lbmRPZigncXVhcnRlcicpLnRvRGF0ZSgpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV3U2VsZWN0aW9uRnJvbUV4aXN0aW5nKHByZXZpb3VzU2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbik6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShwcmV2aW91c1NlbGVjdGlvbikpIHtcclxuICAgICAgLy8gQmFzZSB0aGUgcXVhcnRlciByYW5nZSBvZmYgb2YgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbidzIGVuZCBkYXRlLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgY29uc3QgZGF0ZSA9IHByZXZpb3VzU2VsZWN0aW9uLmVuZCB8fCBwcmV2aW91c1NlbGVjdGlvbi5zdGFydDtcclxuICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKHByZXZpb3VzU2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBJZiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uIHdhcyBhIHNpbmdsZSBkYXRlLCBtYWtlIHRoZSByYW5nZSB0aGF0IHF1YXJ0ZXJcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uRnJvbURhdGUocHJldmlvdXNTZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV4dFNlbGVjdGlvbihzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKTogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwge1xyXG4gICAgLy8gTW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBuZXh0IHF1YXJ0ZXJcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pICYmIHNlbGVjdGlvbi5zdGFydCkge1xyXG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KHNlbGVjdGlvbi5zdGFydCkuYWRkKDEsICdxdWFydGVyJyk7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGlvbkZyb21EYXRlKGRhdGUudG9EYXRlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBzaW5jZSB0aGUgbmV4dCBzdGVwcGVyIGlzIGRpc2FibGVkIGlmIHRoZSBzZWxlY3Rpb24gb25seSBoYXMgb25lIGRhdGUuXHJcbiAgICAvLyBJZiBpdCBkb2VzLCBqdXN0IHJldHVybiB0aGUgc2VsZWN0aW9uIGFzLWlzLlxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIGdldFByZXZpb3VzU2VsZWN0aW9uKHNlbGVjdGlvbjogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICAvLyBNb3ZlIHRoZSBzZWxlY3Rpb24gdG8gdGhlIHByZXZpb3VzIHF1YXJ0ZXJcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pICYmIHNlbGVjdGlvbi5zdGFydCkge1xyXG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KHNlbGVjdGlvbi5zdGFydCkuc3VidHJhY3QoMSwgJ3F1YXJ0ZXInKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uRnJvbURhdGUoZGF0ZS50b0RhdGUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHRoZSBwcmV2aW91cyBzdGVwcGVyIGlzIGRpc2FibGVkIGlmIHRoZSBzZWxlY3Rpb24gb25seSBoYXMgb25lIGRhdGUuXHJcbiAgICAvLyBJZiBpdCBkb2VzLCBqdXN0IHJldHVybiB0aGUgc2VsZWN0aW9uIGFzLWlzLlxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICB9XHJcbn1cclxuIl19
|
package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
import moment from "moment";
|
2
|
+
import { DateInput } from "../date-input.types";
|
3
|
+
import { DateInputSelectionStrategyBase } from "./date-input-selection-strategy-base";
|
4
|
+
/**
|
5
|
+
* Selection strategy for the 'range' selection mode.
|
6
|
+
*/
|
7
|
+
export class RangeSelectionStrategy extends DateInputSelectionStrategyBase {
|
8
|
+
constructor() {
|
9
|
+
super(...arguments);
|
10
|
+
this.selectionViewMode = 'day';
|
11
|
+
this.validViewModes = ['day', 'month', 'year'];
|
12
|
+
this.showSecondaryTextbox = true;
|
13
|
+
this.showSecondaryCalendar = true;
|
14
|
+
}
|
15
|
+
formatSelection(selection) {
|
16
|
+
if (!selection) {
|
17
|
+
return { textbox: null, textbox2: null };
|
18
|
+
}
|
19
|
+
// We use the 'll' moment medium format here to make sure the formatted date is formatted according to the user's locale
|
20
|
+
if (DateInput.isSelectionSingleDate(selection)) {
|
21
|
+
return { textbox: moment(selection).format('ll'), textbox2: null };
|
22
|
+
}
|
23
|
+
else {
|
24
|
+
const start = selection.start ? moment(selection.start).format('ll') : null;
|
25
|
+
const end = selection.end ? moment(selection.end).format('ll') : null;
|
26
|
+
return { textbox: start, textbox2: end };
|
27
|
+
}
|
28
|
+
}
|
29
|
+
parseTextboxValues(value, parseFormats, opts) {
|
30
|
+
let start = this.parseString(value.textbox, parseFormats, opts);
|
31
|
+
let end = this.parseString(value.textbox2, parseFormats, opts);
|
32
|
+
// If the start date is after the end date, we need to clear out the invalid date. This is different from the last 7/28 days strategies
|
33
|
+
// because we don't have a fixed range to automatically adjust the dates to. If the user is changing the begin date or end date and ends
|
34
|
+
// up crossing the other date, we should clear out the date that's not being changed so that the user can enter a valid range using the
|
35
|
+
// begin/end date they just entered.
|
36
|
+
if (start && end && moment(start).isAfter(end)) {
|
37
|
+
if (opts?.parseFromEnd) {
|
38
|
+
start = null;
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
end = null;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
if (!start && !end) {
|
45
|
+
return null;
|
46
|
+
}
|
47
|
+
else {
|
48
|
+
return { start, end };
|
49
|
+
}
|
50
|
+
}
|
51
|
+
getSelectionFromDate(date, existingSelection) {
|
52
|
+
if (DateInput.isSelectionRange(existingSelection)) {
|
53
|
+
const { start, end } = existingSelection;
|
54
|
+
if (start && !end) {
|
55
|
+
// If the selected date is before the existing start date, set it as the new start date and use the existing start date as the end date
|
56
|
+
return moment(date).isBefore(start) ? { start: date, end: start } : { start, end: date };
|
57
|
+
}
|
58
|
+
if (end && !start) {
|
59
|
+
// If the selected date is after the existing end date, set it as the new end date and use the existing end date as the start date
|
60
|
+
return moment(date).isBefore(end) ? { start: date, end } : { start: end, end: date };
|
61
|
+
}
|
62
|
+
}
|
63
|
+
else if (DateInput.isSelectionSingleDate(existingSelection)) {
|
64
|
+
// If the selected date is before the existing date, set it as the new start date and use the existing date as the end date
|
65
|
+
return moment(date).isBefore(existingSelection) ? { start: date, end: existingSelection } : { start: existingSelection, end: date };
|
66
|
+
}
|
67
|
+
// If no selection exists or we already have a complete selection, start a new one with the selected date as the start date.
|
68
|
+
return { start: date, end: null };
|
69
|
+
}
|
70
|
+
getNewSelectionFromExisting(previousSelection) {
|
71
|
+
if (DateInput.isSelectionRange(previousSelection)) {
|
72
|
+
// If we have a range, just return it as is. We don't have a fixed range to adjust the dates to.
|
73
|
+
// Even if it's incomplete, the user will still be able to select the remaining date.
|
74
|
+
return previousSelection;
|
75
|
+
}
|
76
|
+
else if (DateInput.isSelectionSingleDate(previousSelection)) {
|
77
|
+
// If we have a single date selection, use it as the start date for the new one.
|
78
|
+
return { start: previousSelection, end: null };
|
79
|
+
}
|
80
|
+
return null;
|
81
|
+
}
|
82
|
+
getSelectionForQuickSelectDate(date, existingSelection) {
|
83
|
+
// If we have a valid range, we'll shift the range to the date provided, using it as the end date
|
84
|
+
// The new selection will have the same length as the previous.
|
85
|
+
if (DateInput.isSelectionRange(existingSelection) && existingSelection.start && existingSelection.end) {
|
86
|
+
const length = moment(existingSelection.end).diff(existingSelection.start, 'days');
|
87
|
+
return {
|
88
|
+
start: moment(date).subtract(length, 'days').toDate(),
|
89
|
+
end: date
|
90
|
+
};
|
91
|
+
}
|
92
|
+
// If we only have a single date, we'll use the date provided as the end date.
|
93
|
+
// The user will be able to select the start date.
|
94
|
+
return { start: null, end: date };
|
95
|
+
}
|
96
|
+
getNextSelection(selection) {
|
97
|
+
// We can only determine the next selection if we have a valid range
|
98
|
+
if (DateInput.isSelectionRange(selection) && selection.start && selection.end) {
|
99
|
+
// Shift the range forward by the number of days between the start and end dates
|
100
|
+
const length = moment(selection.end).diff(selection.start, 'days');
|
101
|
+
return {
|
102
|
+
start: moment(selection.end).add(1, 'days').toDate(),
|
103
|
+
end: moment(selection.end).add(1 + length, 'days').toDate()
|
104
|
+
};
|
105
|
+
}
|
106
|
+
// This shouldn't happen since the next stepper is disabled if the selection only has one date.
|
107
|
+
// If it does, just return the selection as-is.
|
108
|
+
return selection;
|
109
|
+
}
|
110
|
+
getPreviousSelection(selection) {
|
111
|
+
// We can only determine the previous selection if we have a valid range
|
112
|
+
if (DateInput.isSelectionRange(selection) && selection.start && selection.end) {
|
113
|
+
// Shift the range back by the number of days between the start and end dates
|
114
|
+
const length = moment(selection.end).diff(selection.start, 'days');
|
115
|
+
return {
|
116
|
+
start: moment(selection.start).subtract(1 + length, 'days').toDate(),
|
117
|
+
end: moment(selection.start).subtract(1, 'days').toDate()
|
118
|
+
};
|
119
|
+
}
|
120
|
+
// This shouldn't happen since the previous stepper is disabled if the selection only has one date.
|
121
|
+
// If it does, just return the selection as-is.
|
122
|
+
return selection;
|
123
|
+
}
|
124
|
+
getPrimaryCalendarView(selection, minDate, maxDate, currentView) {
|
125
|
+
let viewDate;
|
126
|
+
if (DateInput.isSelectionRange(selection)) {
|
127
|
+
let start = selection.start ? moment(selection.start) : null;
|
128
|
+
let end = selection.end ? moment(selection.end) : null;
|
129
|
+
// Since we're in range mode, the primary calendar is mostly concerned with the start date
|
130
|
+
if (start) {
|
131
|
+
// If we have a start date in the selection and it's before the min date, shift the view to the min date.
|
132
|
+
if (start.isBefore(minDate, 'month')) {
|
133
|
+
viewDate = minDate;
|
134
|
+
// If the start is after the max date, shift the view to the max date.
|
135
|
+
}
|
136
|
+
else if (start.isSameOrAfter(maxDate, 'month')) {
|
137
|
+
// the secondary calendar will show the max date month.
|
138
|
+
// The primary calendar will show the month before the max date.
|
139
|
+
viewDate = moment(maxDate).subtract(1, 'month').toDate();
|
140
|
+
}
|
141
|
+
else {
|
142
|
+
viewDate = start.toDate();
|
143
|
+
}
|
144
|
+
}
|
145
|
+
else if (end && end.isSameOrBefore(minDate, 'month')) {
|
146
|
+
// If we don't have a start date, and the end date is the same month or before the min date, shift the view to the min date.
|
147
|
+
viewDate = minDate;
|
148
|
+
}
|
149
|
+
else if (end && end.isSameOrBefore(new Date(), 'month')) {
|
150
|
+
// If we don't have a start date, and the end date is the same month or before the current month, shift the view to the month before the end
|
151
|
+
viewDate = moment(end).subtract(1, 'month').toDate();
|
152
|
+
}
|
153
|
+
else {
|
154
|
+
// Otherwise, show the current month.
|
155
|
+
viewDate = new Date();
|
156
|
+
}
|
157
|
+
}
|
158
|
+
else {
|
159
|
+
viewDate = selection || new Date();
|
160
|
+
}
|
161
|
+
// If the current calendar view mode is valid for the selection mode, use it, otherwise use the selection view mode
|
162
|
+
// This prevents the calendar from changing view modes as the user types/blurs the textboxes as long as the view mode is valid
|
163
|
+
const viewMode = this.validViewModes.includes(currentView.mode) ? currentView.mode : this.selectionViewMode;
|
164
|
+
return { mode: viewMode, date: viewDate };
|
165
|
+
}
|
166
|
+
getSecondaryCalendarView(selection, minDate, maxDate, currentView) {
|
167
|
+
let viewDate;
|
168
|
+
if (DateInput.isSelectionRange(selection)) {
|
169
|
+
let start = selection.start ? moment(selection.start) : null;
|
170
|
+
let end = selection.end ? moment(selection.end) : null;
|
171
|
+
// The secondary calendar is primarily concerned with the end date in the selection.
|
172
|
+
if (end) {
|
173
|
+
if (end.isAfter(maxDate, 'month')) {
|
174
|
+
// If the end date is after the max date, shift the view to the max date.
|
175
|
+
viewDate = maxDate;
|
176
|
+
}
|
177
|
+
else if (end.isSameOrBefore(minDate, 'month')) {
|
178
|
+
// If the end date is the same month or before the min date, shift the view to show
|
179
|
+
// the month after the min date. The primary calendar will show the min date month.
|
180
|
+
viewDate = moment(minDate).add(1, 'month').toDate();
|
181
|
+
}
|
182
|
+
else {
|
183
|
+
// Otherwise, show the end date month.
|
184
|
+
viewDate = end.toDate();
|
185
|
+
}
|
186
|
+
}
|
187
|
+
else if (start && start.isSameOrAfter(maxDate, 'month')) {
|
188
|
+
// If we don't have an end date, and the start date is after the max date, show the max date month
|
189
|
+
viewDate = maxDate;
|
190
|
+
}
|
191
|
+
else if (start && start.isSameOrAfter(new Date(), 'month')) {
|
192
|
+
// If we don't have an end date, and the start date is on or after the current month,
|
193
|
+
// show the month after the start date.
|
194
|
+
viewDate = moment(start).add(1, 'month').toDate();
|
195
|
+
}
|
196
|
+
else {
|
197
|
+
// Otherwise, show the current month.
|
198
|
+
viewDate = new Date();
|
199
|
+
}
|
200
|
+
}
|
201
|
+
else {
|
202
|
+
viewDate = selection || new Date();
|
203
|
+
}
|
204
|
+
// If the current calendar view mode is valid for the selection mode, use it, otherwise use the selection view mode
|
205
|
+
// This prevents the calendar from changing view modes as the user types/blurs the textboxes as long as the view mode is valid
|
206
|
+
const viewMode = this.validViewModes.includes(currentView.mode) ? currentView.mode : this.selectionViewMode;
|
207
|
+
return { mode: viewMode, date: viewDate };
|
208
|
+
}
|
209
|
+
}
|
210
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2Utc2VsZWN0aW9uLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2RhdGUtaW5wdXQvZGF0ZS1pbnB1dC1zZWxlY3Rpb24tc3RyYXRlZ2llcy9yYW5nZS1zZWxlY3Rpb24tc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV0Rjs7R0FFRztBQUNILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSw4QkFBOEI7SUFBMUU7O1FBQ2tCLHNCQUFpQixHQUFzQixLQUFLLENBQUM7UUFDN0MsbUJBQWMsR0FBd0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUM1QiwwQkFBcUIsR0FBRyxJQUFJLENBQUM7SUEyTS9DLENBQUM7SUF6TUMsZUFBZSxDQUFDLFNBQXNDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxDQUFDO1FBRUQsd0hBQXdIO1FBQ3hILElBQUksU0FBUyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNyRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxL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LE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BELENBQUM7aUJBQU0sQ0FBQztnQkFDTixxQ0FBcUM7Z0JBQ3JDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsR0FBRyxTQUFTLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBRUQsbUhBQW1IO1FBQ25ILDhIQUE4SDtRQUM5SCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUU1RyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDNUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSBcIi4uLy4uL2NhbGVuZGFyL2NhbGVuZGFyLnR5cGVzXCI7XHJcbmltcG9ydCB7IERhdGVJbnB1dCB9IGZyb20gXCIuLi9kYXRlLWlucHV0LnR5cGVzXCI7XHJcbmltcG9ydCB7IERhdGVJbnB1dFNlbGVjdGlvblN0cmF0ZWd5QmFzZSB9IGZyb20gXCIuL2RhdGUtaW5wdXQtc2VsZWN0aW9uLXN0cmF0ZWd5LWJhc2VcIjtcclxuXHJcbi8qKlxyXG4gKiBTZWxlY3Rpb24gc3RyYXRlZ3kgZm9yIHRoZSAncmFuZ2UnIHNlbGVjdGlvbiBtb2RlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJhbmdlU2VsZWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBEYXRlSW5wdXRTZWxlY3Rpb25TdHJhdGVneUJhc2Uge1xyXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb25WaWV3TW9kZTogQ2FsZW5kYXIuVmlld01vZGUgPSAnZGF5JztcclxuICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRWaWV3TW9kZXM6IENhbGVuZGFyLlZpZXdNb2RlW10gPSBbJ2RheScsICdtb250aCcsICd5ZWFyJ107XHJcbiAgcHVibGljIHJlYWRvbmx5IHNob3dTZWNvbmRhcnlUZXh0Ym94ID0gdHJ1ZTtcclxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1NlY29uZGFyeUNhbGVuZGFyID0gdHJ1ZTtcclxuXHJcbiAgZm9ybWF0U2VsZWN0aW9uKHNlbGVjdGlvbj86IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKTogRGF0ZUlucHV0LlRleHRib3hHcm91cFsndmFsdWUnXSB7XHJcbiAgICBpZiAoIXNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm4geyB0ZXh0Ym94OiBudWxsLCB0ZXh0Ym94MjogbnVsbCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdlIHVzZSB0aGUgJ2xsJyBtb21lbnQgbWVkaXVtIGZvcm1hdCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGUgZm9ybWF0dGVkIGRhdGUgaXMgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgdXNlcidzIGxvY2FsZVxyXG4gICAgaWYgKERhdGVJbnB1dC5pc1NlbGVjdGlvblNpbmdsZURhdGUoc2VsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm4geyB0ZXh0Ym94OiBtb21lbnQoc2VsZWN0aW9uKS5mb3JtYXQoJ2xsJyksIHRleHRib3gyOiBudWxsIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzdGFydCA9IHNlbGVjdGlvbi5zdGFydCA/IG1vbWVudChzZWxlY3Rpb24uc3RhcnQpLmZvcm1hdCgnbGwnKSA6IG51bGw7XHJcbiAgICAgIGNvbnN0IGVuZCA9IHNlbGVjdGlvbi5lbmQgPyBtb21lbnQoc2VsZWN0aW9uLmVuZCkuZm9ybWF0KCdsbCcpIDogbnVsbDtcclxuXHJcbiAgICAgIHJldHVybiB7IHRleHRib3g6IHN0YXJ0LCB0ZXh0Ym94MjogZW5kIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwYXJzZVRleHRib3hWYWx1ZXModmFsdWU6IERhdGVJbnB1dC5UZXh0Ym94R3JvdXBbJ3ZhbHVlJ10sIHBhcnNlRm9ybWF0czogc3RyaW5nW10sIG9wdHM/OiBEYXRlSW5wdXQuUGFyc2luZ09wdGlvbnMpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICBsZXQgc3RhcnQgPSB0aGlzLnBhcnNlU3RyaW5nKHZhbHVlLnRleHRib3gsIHBhcnNlRm9ybWF0cywgb3B0cyk7XHJcbiAgICBsZXQgZW5kID0gdGhpcy5wYXJzZVN0cmluZyh2YWx1ZS50ZXh0Ym94MiwgcGFyc2VGb3JtYXRzLCBvcHRzKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgZW5kIGRhdGUsIHdlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBpbnZhbGlkIGRhdGUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QgNy8yOCBkYXlzIHN0cmF0ZWdpZXNcclxuICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIGZpeGVkIHJhbmdlIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBkYXRlcyB0by4gSWYgdGhlIHVzZXIgaXMgY2hhbmdpbmcgdGhlIGJlZ2luIGRhdGUgb3IgZW5kIGRhdGUgYW5kIGVuZHNcclxuICAgIC8vIHVwIGNyb3NzaW5nIHRoZSBvdGhlciBkYXRlLCB3ZSBzaG91bGQgY2xlYXIgb3V0IHRoZSBkYXRlIHRoYXQncyBub3QgYmVpbmcgY2hhbmdlZCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBlbnRlciBhIHZhbGlkIHJhbmdlIHVzaW5nIHRoZVxyXG4gICAgLy8gYmVnaW4vZW5kIGRhdGUgdGhleSBqdXN0IGVudGVyZWQuXHJcbiAgICBpZiAoc3RhcnQgJiYgZW5kICYmIG1vbWVudChzdGFydCkuaXNBZnRlcihlbmQpKSB7XHJcbiAgICAgIGlmIChvcHRzPy5wYXJzZUZyb21FbmQpIHtcclxuICAgICAgICBzdGFydCA9IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZW5kID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghc3RhcnQgJiYgIWVuZCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGlvbkZyb21EYXRlKGRhdGU6IERhdGUsIGV4aXN0aW5nU2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShleGlzdGluZ1NlbGVjdGlvbikpIHtcclxuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBleGlzdGluZ1NlbGVjdGlvbjtcclxuICAgICAgaWYgKHN0YXJ0ICYmICFlbmQpIHtcclxuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgZGF0ZSBpcyBiZWZvcmUgdGhlIGV4aXN0aW5nIHN0YXJ0IGRhdGUsIHNldCBpdCBhcyB0aGUgbmV3IHN0YXJ0IGRhdGUgYW5kIHVzZSB0aGUgZXhpc3Rpbmcgc3RhcnQgZGF0ZSBhcyB0aGUgZW5kIGRhdGVcclxuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmlzQmVmb3JlKHN0YXJ0KSA/IHsgc3RhcnQ6IGRhdGUsIGVuZDogc3RhcnQgfSA6IHsgc3RhcnQsIGVuZDogZGF0ZSB9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChlbmQgJiYgIXN0YXJ0KSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIGRhdGUgaXMgYWZ0ZXIgdGhlIGV4aXN0aW5nIGVuZCBkYXRlLCBzZXQgaXQgYXMgdGhlIG5ldyBlbmQgZGF0ZSBhbmQgdXNlIHRoZSBleGlzdGluZyBlbmQgZGF0ZSBhcyB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuaXNCZWZvcmUoZW5kKSA/IHsgc3RhcnQ6IGRhdGUsIGVuZCB9IDogeyBzdGFydDogZW5kLCBlbmQ6IGRhdGUgfTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKGV4aXN0aW5nU2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgZGF0ZSBpcyBiZWZvcmUgdGhlIGV4aXN0aW5nIGRhdGUsIHNldCBpdCBhcyB0aGUgbmV3IHN0YXJ0IGRhdGUgYW5kIHVzZSB0aGUgZXhpc3RpbmcgZGF0ZSBhcyB0aGUgZW5kIGRhdGVcclxuICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS5pc0JlZm9yZShleGlzdGluZ1NlbGVjdGlvbikgPyB7IHN0YXJ0OiBkYXRlLCBlbmQ6IGV4aXN0aW5nU2VsZWN0aW9uIH0gOiB7IHN0YXJ0OiBleGlzdGluZ1NlbGVjdGlvbiwgZW5kOiBkYXRlIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm8gc2VsZWN0aW9uIGV4aXN0cyBvciB3ZSBhbHJlYWR5IGhhdmUgYSBjb21wbGV0ZSBzZWxlY3Rpb24sIHN0YXJ0IGEgbmV3IG9uZSB3aXRoIHRoZSBzZWxlY3RlZCBkYXRlIGFzIHRoZSBzdGFydCBkYXRlLlxyXG4gICAgcmV0dXJuIHsgc3RhcnQ6IGRhdGUsIGVuZDogbnVsbCB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV3U2VsZWN0aW9uRnJvbUV4aXN0aW5nKHByZXZpb3VzU2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbik6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShwcmV2aW91c1NlbGVjdGlvbikpIHtcclxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHJhbmdlLCBqdXN0IHJldHVybiBpdCBhcyBpcy4gV2UgZG9uJ3QgaGF2ZSBhIGZpeGVkIHJhbmdlIHRvIGFkanVzdCB0aGUgZGF0ZXMgdG8uXHJcbiAgICAgIC8vIEV2ZW4gaWYgaXQncyBpbmNvbXBsZXRlLCB0aGUgdXNlciB3aWxsIHN0aWxsIGJlIGFibGUgdG8gc2VsZWN0IHRoZSByZW1haW5pbmcgZGF0ZS5cclxuICAgICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0aW9uO1xyXG4gICAgfSBlbHNlIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKHByZXZpb3VzU2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgc2luZ2xlIGRhdGUgc2VsZWN0aW9uLCB1c2UgaXQgYXMgdGhlIHN0YXJ0IGRhdGUgZm9yIHRoZSBuZXcgb25lLlxyXG4gICAgICByZXR1cm4geyBzdGFydDogcHJldmlvdXNTZWxlY3Rpb24sIGVuZDogbnVsbCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0aW9uRm9yUXVpY2tTZWxlY3REYXRlKGRhdGU6IERhdGUsIGV4aXN0aW5nU2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsaWQgcmFuZ2UsIHdlJ2xsIHNoaWZ0IHRoZSByYW5nZSB0byB0aGUgZGF0ZSBwcm92aWRlZCwgdXNpbmcgaXQgYXMgdGhlIGVuZCBkYXRlXHJcbiAgICAvLyBUaGUgbmV3IHNlbGVjdGlvbiB3aWxsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBwcmV2aW91cy5cclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShleGlzdGluZ1NlbGVjdGlvbikgJiYgZXhpc3RpbmdTZWxlY3Rpb24uc3RhcnQgJiYgZXhpc3RpbmdTZWxlY3Rpb24uZW5kKSB7XHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IG1vbWVudChleGlzdGluZ1NlbGVjdGlvbi5lbmQpLmRpZmYoZXhpc3RpbmdTZWxlY3Rpb24uc3RhcnQsICdkYXlzJyk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3RhcnQ6IG1vbWVudChkYXRlKS5zdWJ0cmFjdChsZW5ndGgsICdkYXlzJykudG9EYXRlKCksXHJcbiAgICAgICAgZW5kOiBkYXRlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGRhdGUsIHdlJ2xsIHVzZSB0aGUgZGF0ZSBwcm92aWRlZCBhcyB0aGUgZW5kIGRhdGUuXHJcbiAgICAvLyBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IHRoZSBzdGFydCBkYXRlLlxyXG4gICAgcmV0dXJuIHsgc3RhcnQ6IG51bGwsIGVuZDogZGF0ZSB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV4dFNlbGVjdGlvbihzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKTogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwge1xyXG4gICAgLy8gV2UgY2FuIG9ubHkgZGV0ZXJtaW5lIHRoZSBuZXh0IHNlbGVjdGlvbiBpZiB3ZSBoYXZlIGEgdmFsaWQgcmFuZ2VcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pICYmIHNlbGVjdGlvbi5zdGFydCAmJiBzZWxlY3Rpb24uZW5kKSB7XHJcbiAgICAgIC8vIFNoaWZ0IHRoZSByYW5nZSBmb3J3YXJkIGJ5IHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIGRhdGVzXHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IG1vbWVudChzZWxlY3Rpb24uZW5kKS5kaWZmKHNlbGVjdGlvbi5zdGFydCwgJ2RheXMnKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzdGFydDogbW9tZW50KHNlbGVjdGlvbi5lbmQpLmFkZCgxLCAnZGF5cycpLnRvRGF0ZSgpLFxyXG4gICAgICAgIGVuZDogbW9tZW50KHNlbGVjdGlvbi5lbmQpLmFkZCgxICsgbGVuZ3RoLCAnZGF5cycpLnRvRGF0ZSgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHRoZSBuZXh0IHN0ZXBwZXIgaXMgZGlzYWJsZWQgaWYgdGhlIHNlbGVjdGlvbiBvbmx5IGhhcyBvbmUgZGF0ZS5cclxuICAgIC8vIElmIGl0IGRvZXMsIGp1c3QgcmV0dXJuIHRoZSBzZWxlY3Rpb24gYXMtaXMuXHJcbiAgICByZXR1cm4gc2VsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJldmlvdXNTZWxlY3Rpb24oc2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIC8vIFdlIGNhbiBvbmx5IGRldGVybWluZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uIGlmIHdlIGhhdmUgYSB2YWxpZCByYW5nZVxyXG4gICAgaWYgKERhdGVJbnB1dC5pc1NlbGVjdGlvblJhbmdlKHNlbGVjdGlvbikgJiYgc2VsZWN0aW9uLnN0YXJ0ICYmIHNlbGVjdGlvbi5lbmQpIHtcclxuICAgICAgLy8gU2hpZnQgdGhlIHJhbmdlIGJhY2sgYnkgdGhlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZXNcclxuICAgICAgY29uc3QgbGVuZ3RoID0gbW9tZW50KHNlbGVjdGlvbi5lbmQpLmRpZmYoc2VsZWN0aW9uLnN0YXJ0LCAnZGF5cycpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHN0YXJ0OiBtb21lbnQoc2VsZWN0aW9uLnN0YXJ0KS5zdWJ0cmFjdCgxICsgbGVuZ3RoLCAnZGF5cycpLnRvRGF0ZSgpLFxyXG4gICAgICAgIGVuZDogbW9tZW50KHNlbGVjdGlvbi5zdGFydCkuc3VidHJhY3QoMSwgJ2RheXMnKS50b0RhdGUoKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBzaW5jZSB0aGUgcHJldmlvdXMgc3RlcHBlciBpcyBkaXNhYmxlZCBpZiB0aGUgc2VsZWN0aW9uIG9ubHkgaGFzIG9uZSBkYXRlLlxyXG4gICAgLy8gSWYgaXQgZG9lcywganVzdCByZXR1cm4gdGhlIHNlbGVjdGlvbiBhcy1pcy5cclxuICAgIHJldHVybiBzZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBnZXRQcmltYXJ5Q2FsZW5kYXJWaWV3KHNlbGVjdGlvbjogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwsIG1pbkRhdGU6IERhdGUsIG1heERhdGU6IERhdGUsIGN1cnJlbnRWaWV3OiBDYWxlbmRhci5WaWV3KTogQ2FsZW5kYXIuVmlldyB7XHJcbiAgICBsZXQgdmlld0RhdGU6IERhdGU7XHJcbiAgICBpZiAoRGF0ZUlucHV0LmlzU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uKSkge1xyXG4gICAgICBsZXQgc3RhcnQgPSBzZWxlY3Rpb24uc3RhcnQgPyBtb21lbnQoc2VsZWN0aW9uLnN0YXJ0KSA6IG51bGw7XHJcbiAgICAgIGxldCBlbmQgPSBzZWxlY3Rpb24uZW5kID8gbW9tZW50KHNlbGVjdGlvbi5lbmQpIDogbnVsbDtcclxuXHJcbiAgICAgIC8vIFNpbmNlIHdlJ3JlIGluIHJhbmdlIG1vZGUsIHRoZSBwcmltYXJ5IGNhbGVuZGFyIGlzIG1vc3RseSBjb25jZXJuZWQgd2l0aCB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICBpZiAoc3RhcnQpIHtcclxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc3RhcnQgZGF0ZSBpbiB0aGUgc2VsZWN0aW9uIGFuZCBpdCdzIGJlZm9yZSB0aGUgbWluIGRhdGUsIHNoaWZ0IHRoZSB2aWV3IHRvIHRoZSBtaW4gZGF0ZS5cclxuICAgICAgICBpZiAoc3RhcnQuaXNCZWZvcmUobWluRGF0ZSwgJ21vbnRoJykpIHtcclxuICAgICAgICAgIHZpZXdEYXRlID0gbWluRGF0ZTtcclxuICAgICAgICAgIC8vIElmIHRoZSBzdGFydCBpcyBhZnRlciB0aGUgbWF4IGRhdGUsIHNoaWZ0IHRoZSB2aWV3IHRvIHRoZSBtYXggZGF0ZS5cclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0LmlzU2FtZU9yQWZ0ZXIobWF4RGF0ZSwgJ21vbnRoJykpIHtcclxuICAgICAgICAgIC8vIHRoZSBzZWNvbmRhcnkgY2FsZW5kYXIgd2lsbCBzaG93IHRoZSBtYXggZGF0ZSBtb250aC5cclxuICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNhbGVuZGFyIHdpbGwgc2hvdyB0aGUgbW9udGggYmVmb3JlIHRoZSBtYXggZGF0ZS5cclxuICAgICAgICAgIHZpZXdEYXRlID0gbW9tZW50KG1heERhdGUpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2aWV3RGF0ZSA9IHN0YXJ0LnRvRGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChlbmQgJiYgZW5kLmlzU2FtZU9yQmVmb3JlKG1pbkRhdGUsICdtb250aCcpKSB7XHJcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXJ0IGRhdGUsIGFuZCB0aGUgZW5kIGRhdGUgaXMgdGhlIHNhbWUgbW9udGggb3IgYmVmb3JlIHRoZSBtaW4gZGF0ZSwgc2hpZnQgdGhlIHZpZXcgdG8gdGhlIG1pbiBkYXRlLlxyXG4gICAgICAgIHZpZXdEYXRlID0gbWluRGF0ZTtcclxuICAgICAgfSBlbHNlIGlmIChlbmQgJiYgZW5kLmlzU2FtZU9yQmVmb3JlKG5ldyBEYXRlKCksICdtb250aCcpKSB7XHJcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXJ0IGRhdGUsIGFuZCB0aGUgZW5kIGRhdGUgaXMgdGhlIHNhbWUgbW9udGggb3IgYmVmb3JlIHRoZSBjdXJyZW50IG1vbnRoLCBzaGlmdCB0aGUgdmlldyB0byB0aGUgbW9udGggYmVmb3JlIHRoZSBlbmRcclxuICAgICAgICB2aWV3RGF0ZSA9IG1vbWVudChlbmQpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2hvdyB0aGUgY3VycmVudCBtb250aC5cclxuICAgICAgICB2aWV3RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZpZXdEYXRlID0gc2VsZWN0aW9uIHx8IG5ldyBEYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2FsZW5kYXIgdmlldyBtb2RlIGlzIHZhbGlkIGZvciB0aGUgc2VsZWN0aW9uIG1vZGUsIHVzZSBpdCwgb3RoZXJ3aXNlIHVzZSB0aGUgc2VsZWN0aW9uIHZpZXcgbW9kZVxyXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgY2FsZW5kYXIgZnJvbSBjaGFuZ2luZyB2aWV3IG1vZGVzIGFzIHRoZSB1c2VyIHR5cGVzL2JsdXJzIHRoZSB0ZXh0Ym94ZXMgYXMgbG9uZyBhcyB0aGUgdmlldyBtb2RlIGlzIHZhbGlkXHJcbiAgICBjb25zdCB2aWV3TW9kZSA9IHRoaXMudmFsaWRWaWV3TW9kZXMuaW5jbHVkZXMoY3VycmVudFZpZXcubW9kZSkgPyBjdXJyZW50Vmlldy5tb2RlIDogdGhpcy5zZWxlY3Rpb25WaWV3TW9kZTtcclxuXHJcbiAgICByZXR1cm4geyBtb2RlOiB2aWV3TW9kZSwgZGF0ZTogdmlld0RhdGUgfTtcclxuICB9XHJcblxyXG4gIGdldFNlY29uZGFyeUNhbGVuZGFyVmlldyhzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsLCBtaW5EYXRlOiBEYXRlLCBtYXhEYXRlOiBEYXRlLCBjdXJyZW50VmlldzogQ2FsZW5kYXIuVmlldyk6IENhbGVuZGFyLlZpZXcge1xyXG4gICAgbGV0IHZpZXdEYXRlOiBEYXRlO1xyXG5cclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pKSB7XHJcbiAgICAgIGxldCBzdGFydCA9IHNlbGVjdGlvbi5zdGFydCA/IG1vbWVudChzZWxlY3Rpb24uc3RhcnQpIDogbnVsbDtcclxuICAgICAgbGV0IGVuZCA9IHNlbGVjdGlvbi5lbmQgPyBtb21lbnQoc2VsZWN0aW9uLmVuZCkgOiBudWxsO1xyXG5cclxuICAgICAgLy8gVGhlIHNlY29uZGFyeSBjYWxlbmRhciBpcyBwcmltYXJpbHkgY29uY2VybmVkIHdpdGggdGhlIGVuZCBkYXRlIGluIHRoZSBzZWxlY3Rpb24uXHJcbiAgICAgIGlmIChlbmQpIHtcclxuICAgICAgICBpZiAoZW5kLmlzQWZ0ZXIobWF4RGF0ZSwgJ21vbnRoJykpIHtcclxuICAgICAgICAgIC8vIElmIHRoZSBlbmQgZGF0ZSBpcyBhZnRlciB0aGUgbWF4IGRhdGUsIHNoaWZ0IHRoZSB2aWV3IHRvIHRoZSBtYXggZGF0ZS5cclxuICAgICAgICAgIHZpZXdEYXRlID0gbWF4RGF0ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGVuZC5pc1NhbWVPckJlZm9yZShtaW5EYXRlLCAnbW9udGgnKSkge1xyXG4gICAgICAgICAgLy8gSWYgdGhlIGVuZCBkYXRlIGlzIHRoZSBzYW1lIG1vbnRoIG9yIGJlZm9yZSB0aGUgbWluIGRhdGUsIHNoaWZ0IHRoZSB2aWV3IHRvIHNob3dcclxuICAgICAgICAgIC8vIHRoZSBtb250aCBhZnRlciB0aGUgbWluIGRhdGUuIFRoZSBwcmltYXJ5IGNhbGVuZGFyIHdpbGwgc2hvdyB0aGUgbWluIGRhdGUgbW9udGguXHJcbiAgICAgICAgICB2aWV3RGF0ZSA9IG1vbWVudChtaW5EYXRlKS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2hvdyB0aGUgZW5kIGRhdGUgbW9udGguXHJcbiAgICAgICAgICB2aWV3RGF0ZSA9IGVuZC50b0RhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnQgJiYgc3RhcnQuaXNTYW1lT3JBZnRlcihtYXhEYXRlLCAnbW9udGgnKSkge1xyXG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gZW5kIGRhdGUsIGFuZCB0aGUgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgbWF4IGRhdGUsIHNob3cgdGhlIG1heCBkYXRlIG1vbnRoXHJcbiAgICAgICAgdmlld0RhdGUgPSBtYXhEYXRlO1xyXG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0ICYmIHN0YXJ0LmlzU2FtZU9yQWZ0ZXIobmV3IERhdGUoKSwgJ21vbnRoJykpIHtcclxuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIGVuZCBkYXRlLCBhbmQgdGhlIHN0YXJ0IGRhdGUgaXMgb24gb3IgYWZ0ZXIgdGhlIGN1cnJlbnQgbW9udGgsXHJcbiAgICAgICAgLy8gc2hvdyB0aGUgbW9udGggYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUuXHJcbiAgICAgICAgdmlld0RhdGUgPSBtb21lbnQoc3RhcnQpLmFkZCgxLCAnbW9udGgnKS50b0RhdGUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBPdGhlcndpc2UsIHNob3cgdGhlIGN1cnJlbnQgbW9udGguXHJcbiAgICAgICAgdmlld0RhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2aWV3RGF0ZSA9IHNlbGVjdGlvbiB8fCBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGNhbGVuZGFyIHZpZXcgbW9kZSBpcyB2YWxpZCBmb3IgdGhlIHNlbGVjdGlvbiBtb2RlLCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIHNlbGVjdGlvbiB2aWV3IG1vZGVcclxuICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIGNhbGVuZGFyIGZyb20gY2hhbmdpbmcgdmlldyBtb2RlcyBhcyB0aGUgdXNlciB0eXBlcy9ibHVycyB0aGUgdGV4dGJveGVzIGFzIGxvbmcgYXMgdGhlIHZpZXcgbW9kZSBpcyB2YWxpZFxyXG4gICAgY29uc3Qgdmlld01vZGUgPSB0aGlzLnZhbGlkVmlld01vZGVzLmluY2x1ZGVzKGN1cnJlbnRWaWV3Lm1vZGUpID8gY3VycmVudFZpZXcubW9kZSA6IHRoaXMuc2VsZWN0aW9uVmlld01vZGU7XHJcblxyXG4gICAgcmV0dXJuIHsgbW9kZTogdmlld01vZGUsIGRhdGU6IHZpZXdEYXRlIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
import moment from "moment";
|
2
|
+
import { DateInput } from "../date-input.types";
|
3
|
+
import { DateInputSelectionStrategyBase } from "./date-input-selection-strategy-base";
|
4
|
+
/**
|
5
|
+
* Selection strategy for the 'year' selection mode.
|
6
|
+
*/
|
7
|
+
export class YearSelectionStrategy extends DateInputSelectionStrategyBase {
|
8
|
+
constructor() {
|
9
|
+
super(...arguments);
|
10
|
+
this.selectionViewMode = 'year';
|
11
|
+
this.validViewModes = ['year'];
|
12
|
+
this.showSecondaryTextbox = false;
|
13
|
+
this.showSecondaryCalendar = false;
|
14
|
+
}
|
15
|
+
formatSelection(selection) {
|
16
|
+
if (!selection) {
|
17
|
+
return { textbox: null, textbox2: null };
|
18
|
+
}
|
19
|
+
// Only one date is needed for formatting since the ranges span a single year.
|
20
|
+
// There shouldn't be any case where there's only a single date but it's covered anyway.
|
21
|
+
const date = DateInput.isSelectionRange(selection) ? selection.start : selection;
|
22
|
+
return { textbox: moment(date).format('YYYY'), textbox2: null };
|
23
|
+
}
|
24
|
+
parseString(value, parseFormats, opts) {
|
25
|
+
// Including 'YY' and 'YYYY' as valid formats for year input. These aren't included in the default parse
|
26
|
+
// formats because they cause issues with the default date parsing.
|
27
|
+
return super.parseString(value, ['YY', 'YYYY', ...parseFormats], opts);
|
28
|
+
}
|
29
|
+
parseTextboxValues(value, parseFormats, opts) {
|
30
|
+
// Only a single textbox is used in year mode
|
31
|
+
const date = this.parseString(value.textbox, parseFormats, opts);
|
32
|
+
if (!date) {
|
33
|
+
return null;
|
34
|
+
}
|
35
|
+
return this.getSelectionFromDate(date);
|
36
|
+
}
|
37
|
+
getSelectionFromDate(date) {
|
38
|
+
return {
|
39
|
+
start: moment(date).startOf('year').toDate(),
|
40
|
+
end: moment(date).endOf('year').toDate()
|
41
|
+
};
|
42
|
+
}
|
43
|
+
getNewSelectionFromExisting(previousSelection) {
|
44
|
+
if (DateInput.isSelectionRange(previousSelection)) {
|
45
|
+
// Base the year range off of the existing selection's end date, falling back to the start date
|
46
|
+
const date = previousSelection.end || previousSelection.start;
|
47
|
+
if (date) {
|
48
|
+
return this.getSelectionFromDate(date);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
else if (DateInput.isSelectionSingleDate(previousSelection)) {
|
52
|
+
// If the previous selection was a single date, make the range that year
|
53
|
+
return this.getSelectionFromDate(previousSelection);
|
54
|
+
}
|
55
|
+
return null;
|
56
|
+
}
|
57
|
+
getSelectionForQuickSelectDate(date) {
|
58
|
+
return this.getSelectionFromDate(date);
|
59
|
+
}
|
60
|
+
getNextSelection(selection) {
|
61
|
+
// Move the selection to the next year
|
62
|
+
if (DateInput.isSelectionRange(selection) && selection.start) {
|
63
|
+
const date = moment(selection.start).add(1, 'year');
|
64
|
+
return this.getSelectionFromDate(date.toDate());
|
65
|
+
}
|
66
|
+
// This shouldn't happen since the next stepper is disabled if the selection only has one date.
|
67
|
+
// If it does, just return the selection as-is.
|
68
|
+
return selection;
|
69
|
+
}
|
70
|
+
getPreviousSelection(selection) {
|
71
|
+
// Move the selection to the previous year
|
72
|
+
if (DateInput.isSelectionRange(selection) && selection.start) {
|
73
|
+
const date = moment(selection.start).subtract(1, 'year');
|
74
|
+
return this.getSelectionFromDate(date.toDate());
|
75
|
+
}
|
76
|
+
// This shouldn't happen since the previous stepper is disabled if the selection only has one date.
|
77
|
+
// If it does, just return the selection as-is.
|
78
|
+
return selection;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWVhci1zZWxlY3Rpb24tc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvZGF0ZS1pbnB1dC9kYXRlLWlucHV0LXNlbGVjdGlvbi1zdHJhdGVnaWVzL3llYXItc2VsZWN0aW9uLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFdEY7O0dBRUc7QUFDSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsOEJBQThCO0lBQXpFOztRQUNrQixzQkFBaUIsR0FBc0IsTUFBTSxDQUFDO1FBQzlDLG1CQUFjLEdBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQzdCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztJQStFaEQsQ0FBQztJQTdFQyxlQUFlLENBQUMsU0FBc0M7UUFDcEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsd0ZBQXdGO1FBQ3hGLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbEUs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QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuaW1wb3J0IHsgQ2FsZW5kYXIgfSBmcm9tIFwiLi4vLi4vY2FsZW5kYXIvY2FsZW5kYXIudHlwZXNcIjtcclxuaW1wb3J0IHsgRGF0ZUlucHV0IH0gZnJvbSBcIi4uL2RhdGUtaW5wdXQudHlwZXNcIjtcclxuaW1wb3J0IHsgRGF0ZUlucHV0U2VsZWN0aW9uU3RyYXRlZ3lCYXNlIH0gZnJvbSBcIi4vZGF0ZS1pbnB1dC1zZWxlY3Rpb24tc3RyYXRlZ3ktYmFzZVwiO1xyXG5cclxuLyoqXHJcbiAqIFNlbGVjdGlvbiBzdHJhdGVneSBmb3IgdGhlICd5ZWFyJyBzZWxlY3Rpb24gbW9kZS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBZZWFyU2VsZWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBEYXRlSW5wdXRTZWxlY3Rpb25TdHJhdGVneUJhc2Uge1xyXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb25WaWV3TW9kZTogQ2FsZW5kYXIuVmlld01vZGUgPSAneWVhcic7XHJcbiAgcHVibGljIHJlYWRvbmx5IHZhbGlkVmlld01vZGVzOiBDYWxlbmRhci5WaWV3TW9kZVtdID0gWyd5ZWFyJ107XHJcbiAgcHVibGljIHJlYWRvbmx5IHNob3dTZWNvbmRhcnlUZXh0Ym94ID0gZmFsc2U7XHJcbiAgcHVibGljIHJlYWRvbmx5IHNob3dTZWNvbmRhcnlDYWxlbmRhciA9IGZhbHNlO1xyXG5cclxuICBmb3JtYXRTZWxlY3Rpb24oc2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpOiBEYXRlSW5wdXQuVGV4dGJveEdyb3VwWyd2YWx1ZSddIHtcclxuICAgIGlmICghc2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiB7IHRleHRib3g6IG51bGwsIHRleHRib3gyOiBudWxsIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT25seSBvbmUgZGF0ZSBpcyBuZWVkZWQgZm9yIGZvcm1hdHRpbmcgc2luY2UgdGhlIHJhbmdlcyBzcGFuIGEgc2luZ2xlIHllYXIuXHJcbiAgICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IGNhc2Ugd2hlcmUgdGhlcmUncyBvbmx5IGEgc2luZ2xlIGRhdGUgYnV0IGl0J3MgY292ZXJlZCBhbnl3YXkuXHJcbiAgICBjb25zdCBkYXRlID0gRGF0ZUlucHV0LmlzU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbi5zdGFydCA6IHNlbGVjdGlvbjtcclxuICAgIHJldHVybiB7IHRleHRib3g6IG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVknKSwgdGV4dGJveDI6IG51bGwgfTtcclxuICB9XHJcblxyXG4gIHBhcnNlU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJzZUZvcm1hdHM6IHN0cmluZ1tdLCBvcHRzPzogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zKTogRGF0ZSB8IG51bGwge1xyXG4gICAgLy8gSW5jbHVkaW5nICdZWScgYW5kICdZWVlZJyBhcyB2YWxpZCBmb3JtYXRzIGZvciB5ZWFyIGlucHV0LiBUaGVzZSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGRlZmF1bHQgcGFyc2VcclxuICAgIC8vIGZvcm1hdHMgYmVjYXVzZSB0aGV5IGNhdXNlIGlzc3VlcyB3aXRoIHRoZSBkZWZhdWx0IGRhdGUgcGFyc2luZy5cclxuICAgIHJldHVybiBzdXBlci5wYXJzZVN0cmluZyh2YWx1ZSwgWydZWScsICdZWVlZJywgLi4ucGFyc2VGb3JtYXRzXSwgb3B0cyk7XHJcbiAgfVxyXG5cclxuICBwYXJzZVRleHRib3hWYWx1ZXModmFsdWU6IERhdGVJbnB1dC5UZXh0Ym94R3JvdXBbJ3ZhbHVlJ10sIHBhcnNlRm9ybWF0czogc3RyaW5nW10sIG9wdHM/OiBEYXRlSW5wdXQuUGFyc2luZ09wdGlvbnMpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICAvLyBPbmx5IGEgc2luZ2xlIHRleHRib3ggaXMgdXNlZCBpbiB5ZWFyIG1vZGVcclxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnBhcnNlU3RyaW5nKHZhbHVlLnRleHRib3gsIHBhcnNlRm9ybWF0cywgb3B0cyk7XHJcblxyXG4gICAgaWYgKCFkYXRlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGlvbkZyb21EYXRlKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0aW9uRnJvbURhdGUoZGF0ZTogRGF0ZSk6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0YXJ0OiBtb21lbnQoZGF0ZSkuc3RhcnRPZigneWVhcicpLnRvRGF0ZSgpLFxyXG4gICAgICBlbmQ6IG1vbWVudChkYXRlKS5lbmRPZigneWVhcicpLnRvRGF0ZSgpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV3U2VsZWN0aW9uRnJvbUV4aXN0aW5nKHByZXZpb3VzU2VsZWN0aW9uPzogRGF0ZUlucHV0LlNlbGVjdGlvbik6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShwcmV2aW91c1NlbGVjdGlvbikpIHtcclxuICAgICAgLy8gQmFzZSB0aGUgeWVhciByYW5nZSBvZmYgb2YgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbidzIGVuZCBkYXRlLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgY29uc3QgZGF0ZSA9IHByZXZpb3VzU2VsZWN0aW9uLmVuZCB8fCBwcmV2aW91c1NlbGVjdGlvbi5zdGFydDtcclxuICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKHByZXZpb3VzU2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBJZiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uIHdhcyBhIHNpbmdsZSBkYXRlLCBtYWtlIHRoZSByYW5nZSB0aGF0IHllYXJcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uRnJvbURhdGUocHJldmlvdXNTZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0aW9uRm9yUXVpY2tTZWxlY3REYXRlKGRhdGU6IERhdGUpOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlKTtcclxuICB9XHJcblxyXG4gIGdldE5leHRTZWxlY3Rpb24oc2VsZWN0aW9uOiBEYXRlSW5wdXQuU2VsZWN0aW9uKTogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwge1xyXG4gICAgLy8gTW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBuZXh0IHllYXJcclxuICAgIGlmIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb24pICYmIHNlbGVjdGlvbi5zdGFydCkge1xyXG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KHNlbGVjdGlvbi5zdGFydCkuYWRkKDEsICd5ZWFyJyk7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGlvbkZyb21EYXRlKGRhdGUudG9EYXRlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBzaW5jZSB0aGUgbmV4dCBzdGVwcGVyIGlzIGRpc2FibGVkIGlmIHRoZSBzZWxlY3Rpb24gb25seSBoYXMgb25lIGRhdGUuXHJcbiAgICAvLyBJZiBpdCBkb2VzLCBqdXN0IHJldHVybiB0aGUgc2VsZWN0aW9uIGFzLWlzLlxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIGdldFByZXZpb3VzU2VsZWN0aW9uKHNlbGVjdGlvbjogRGF0ZUlucHV0LlNlbGVjdGlvbik6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIC8vIE1vdmUgdGhlIHNlbGVjdGlvbiB0byB0aGUgcHJldmlvdXMgeWVhclxyXG4gICAgaWYgKERhdGVJbnB1dC5pc1NlbGVjdGlvblJhbmdlKHNlbGVjdGlvbikgJiYgc2VsZWN0aW9uLnN0YXJ0KSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoc2VsZWN0aW9uLnN0YXJ0KS5zdWJ0cmFjdCgxLCAneWVhcicpO1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlLnRvRGF0ZSgpKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHRoZSBwcmV2aW91cyBzdGVwcGVyIGlzIGRpc2FibGVkIGlmIHRoZSBzZWxlY3Rpb24gb25seSBoYXMgb25lIGRhdGUuXHJcbiAgICAvLyBJZiBpdCBkb2VzLCBqdXN0IHJldHVybiB0aGUgc2VsZWN0aW9uIGFzLWlzLlxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICB9XHJcbn1cclxuIl19
|