@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.
Files changed (41) hide show
  1. package/esm2022/lib/components.module.mjs +10 -5
  2. package/esm2022/lib/controls/calendar/calendar-item.component.mjs +46 -14
  3. package/esm2022/lib/controls/calendar/calendar.component.mjs +169 -121
  4. package/esm2022/lib/controls/calendar/calendar.types.mjs +2 -4
  5. package/esm2022/lib/controls/checkbox/checkbox.component.mjs +2 -2
  6. package/esm2022/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +57 -0
  7. package/esm2022/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +62 -0
  8. package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +100 -0
  9. package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +101 -0
  10. package/esm2022/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +76 -0
  11. package/esm2022/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +79 -0
  12. package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +210 -0
  13. package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +81 -0
  14. package/esm2022/lib/controls/date-input/date-input.component.mjs +322 -113
  15. package/esm2022/lib/controls/date-input/date-input.types.mjs +44 -0
  16. package/esm2022/lib/controls/file-upload/file-upload.component.mjs +1 -1
  17. package/esm2022/lib/controls/form-control/form-control.component.mjs +6 -12
  18. package/esm2022/lib/core/date-time-helper.mjs +10 -2
  19. package/esm2022/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +100 -0
  20. package/esm2022/public-api.mjs +63 -61
  21. package/fesm2022/energycap-components.mjs +1668 -509
  22. package/fesm2022/energycap-components.mjs.map +1 -1
  23. package/lib/components.module.d.ts +9 -8
  24. package/lib/controls/calendar/calendar-item.component.d.ts +11 -6
  25. package/lib/controls/calendar/calendar.component.d.ts +21 -23
  26. package/lib/controls/calendar/calendar.types.d.ts +11 -7
  27. package/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.d.ts +42 -0
  28. package/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.d.ts +21 -0
  29. package/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.d.ts +21 -0
  30. package/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.d.ts +21 -0
  31. package/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.d.ts +18 -0
  32. package/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.d.ts +18 -0
  33. package/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.d.ts +21 -0
  34. package/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.d.ts +20 -0
  35. package/lib/controls/date-input/date-input.component.d.ts +63 -28
  36. package/lib/controls/date-input/date-input.types.d.ts +62 -0
  37. package/lib/controls/form-control/form-control.component.d.ts +4 -6
  38. package/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.d.ts +23 -0
  39. package/package.json +1 -1
  40. package/public-api.d.ts +62 -60
  41. 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
@@ -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==
@@ -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