@energycap/components 0.41.0 → 0.41.1-ECAP-27592-angular-17.20241220-1140
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/{esm2020 → esm2022}/energycap-components.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components.module.mjs +418 -418
- package/{esm2020 → esm2022}/lib/controls/banner/banner.component.mjs +109 -109
- package/{esm2020 → esm2022}/lib/controls/button/button.component.mjs +106 -106
- package/{esm2020 → esm2022}/lib/controls/button/copy-button-base.directive.mjs +67 -67
- package/{esm2020 → esm2022}/lib/controls/button/copy-button.directive.mjs +28 -28
- package/{esm2020 → esm2022}/lib/controls/button/copy-table-button.directive.mjs +43 -43
- package/{esm2020 → esm2022}/lib/controls/calendar/calendar-item.component.mjs +59 -59
- package/{esm2020 → esm2022}/lib/controls/calendar/calendar.component.mjs +200 -200
- package/{esm2020 → esm2022}/lib/controls/calendar/calendar.types.mjs +3 -3
- package/{esm2020 → esm2022}/lib/controls/checkbox/checkbox.component.mjs +140 -140
- package/{esm2020 → esm2022}/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -38
- package/{esm2020 → esm2022}/lib/controls/combobox/combobox.component.mjs +879 -879
- package/{esm2020 → esm2022}/lib/controls/date-input/date-input.component.mjs +256 -256
- package/{esm2020 → esm2022}/lib/controls/dropdown/dropdown.component.mjs +243 -243
- package/{esm2020 → esm2022}/lib/controls/file-upload/file-upload.component.mjs +261 -261
- package/{esm2020 → esm2022}/lib/controls/form-control/form-control.component.mjs +104 -104
- package/{esm2020 → esm2022}/lib/controls/form-control-base.mjs +151 -151
- package/{esm2020 → esm2022}/lib/controls/form-control-label/form-control-label.component.mjs +136 -136
- package/{esm2020 → esm2022}/lib/controls/form-group/form-group.component.mjs +261 -261
- package/{esm2020 → esm2022}/lib/controls/help-popover/help-popover.component.mjs +31 -31
- package/{esm2020 → esm2022}/lib/controls/item-picker/item-picker.component.mjs +329 -329
- package/{esm2020 → esm2022}/lib/controls/link-button/link-button.component.mjs +11 -11
- package/{esm2020 → esm2022}/lib/controls/menu/menu.component.mjs +485 -485
- package/{esm2020 → esm2022}/lib/controls/navigation/link-item.mjs +1 -1
- package/{esm2020 → esm2022}/lib/controls/navigation/nav-group.mjs +38 -38
- package/{esm2020 → esm2022}/lib/controls/navigation/nav-item-active.directive.mjs +92 -92
- package/{esm2020 → esm2022}/lib/controls/navigation/nav-item.mjs +1 -1
- package/{esm2020 → esm2022}/lib/controls/numericbox/numericbox.component.mjs +372 -372
- package/{esm2020 → esm2022}/lib/controls/popover/popover.component.mjs +117 -117
- package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button-option.mjs +2 -2
- package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button.component.mjs +82 -82
- package/{esm2020 → esm2022}/lib/controls/select/select.component.mjs +88 -88
- package/{esm2020 → esm2022}/lib/controls/tabs/tabs.component.mjs +47 -47
- package/{esm2020 → esm2022}/lib/controls/textbox/textbox.component.mjs +155 -155
- package/{esm2020 → esm2022}/lib/core/cache.service.mjs +105 -105
- package/esm2022/lib/core/custom-validators.mjs +29 -0
- package/esm2022/lib/core/date-time-helper.mjs +220 -0
- package/{esm2020 → esm2022}/lib/core/error.service.mjs +61 -61
- package/{esm2020 → esm2022}/lib/core/router-helper.service.mjs +111 -111
- package/{esm2020 → esm2022}/lib/core/scroll.service.mjs +89 -89
- package/{esm2020 → esm2022}/lib/core/telemetry-tracker.service.mjs +16 -16
- package/{esm2020 → esm2022}/lib/core/telemetry.service.mjs +38 -38
- package/{esm2020 → esm2022}/lib/core/validation-message.service.mjs +185 -185
- package/{esm2020 → esm2022}/lib/core/validation-patterns.mjs +30 -30
- package/{esm2020 → esm2022}/lib/core/window.service.mjs +186 -186
- package/{esm2020 → esm2022}/lib/display/app-bar/app-bar.component.mjs +46 -46
- package/esm2022/lib/display/avatar/avatar.component.mjs +67 -0
- package/{esm2020 → esm2022}/lib/display/avatar/avatar.service.mjs +64 -64
- package/{esm2020 → esm2022}/lib/display/confirm/confirm.component.mjs +168 -168
- package/{esm2020 → esm2022}/lib/display/dialog/dialog-content.mjs +1 -1
- package/{esm2020 → esm2022}/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -63
- package/{esm2020 → esm2022}/lib/display/dialog/dialog-types.mjs +76 -76
- package/{esm2020 → esm2022}/lib/display/dialog/dialog.component.mjs +281 -281
- package/{esm2020 → esm2022}/lib/display/dialog/dialog.service.mjs +71 -71
- package/{esm2020 → esm2022}/lib/display/help/help-types.mjs +1 -1
- package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-base.mjs +111 -111
- package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-mocks.spec.mjs +53 -53
- package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -61
- package/{esm2020 → esm2022}/lib/display/item-display/item-display.component.mjs +81 -81
- package/{esm2020 → esm2022}/lib/display/json-display/json-display.component.mjs +47 -47
- package/{esm2020 → esm2022}/lib/display/resizable/resizable-base.mjs +120 -120
- package/{esm2020 → esm2022}/lib/display/resizable/resizable.component.mjs +52 -52
- package/{esm2020 → esm2022}/lib/display/spinner/spinner.component.mjs +12 -12
- package/{esm2020 → esm2022}/lib/display/splash/splash.component.mjs +42 -42
- package/{esm2020 → esm2022}/lib/display/splash/splash.service.mjs +35 -35
- package/{esm2020 → esm2022}/lib/display/table/resizable-column.component.mjs +20 -20
- package/{esm2020 → esm2022}/lib/display/table/resizable-table.directive.mjs +227 -227
- package/{esm2020 → esm2022}/lib/display/table/searchable-table.component.mjs +342 -342
- package/{esm2020 → esm2022}/lib/display/table/table-detail-row.component.mjs +19 -19
- package/{esm2020 → esm2022}/lib/display/table/table-locked-column.component.mjs +58 -58
- package/{esm2020 → esm2022}/lib/display/table/table-master-header-row.component.mjs +14 -14
- package/{esm2020 → esm2022}/lib/display/table/table-master-row.component.mjs +163 -163
- package/{esm2020 → esm2022}/lib/display/table/table-pagination.component.mjs +155 -155
- package/{esm2020 → esm2022}/lib/display/table/table-selectable-row.component.mjs +235 -235
- package/{esm2020 → esm2022}/lib/display/table/table.component.mjs +249 -249
- package/{esm2020 → esm2022}/lib/display/tags/tag.mjs +17 -17
- package/{esm2020 → esm2022}/lib/display/tags/tags.component.mjs +77 -77
- package/{esm2020 → esm2022}/lib/display/toast/toast/toast.component.mjs +77 -77
- package/{esm2020 → esm2022}/lib/display/toast/toast-types.mjs +7 -7
- package/{esm2020 → esm2022}/lib/display/toast/toast.service.mjs +35 -35
- package/{esm2020 → esm2022}/lib/display/toast/toaster/toaster.component.mjs +114 -114
- package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.component.mjs +28 -28
- package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.service.mjs +78 -78
- package/{esm2020 → esm2022}/lib/display/tooltip-directive/tooltip.directive.mjs +173 -173
- package/{esm2020 → esm2022}/lib/display/tour/tour-types.mjs +33 -33
- package/{esm2020 → esm2022}/lib/display/tour/tour.component.mjs +398 -398
- package/{esm2020 → esm2022}/lib/display/tour/tour.service.mjs +75 -75
- package/{esm2020 → esm2022}/lib/display/tree/tree.component.mjs +135 -135
- package/{esm2020 → esm2022}/lib/display/view-overlay/view-overlay.component.mjs +58 -58
- package/{esm2020 → esm2022}/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -32
- package/{esm2020 → esm2022}/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -111
- package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +166 -0
- package/{esm2020 → esm2022}/lib/shared/display/pipes/date-display.pipe.mjs +50 -50
- package/{esm2020 → esm2022}/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -30
- package/{esm2020 → esm2022}/lib/shared/display/pipes/relative-date.pipe.mjs +62 -62
- package/{esm2020 → esm2022}/lib/shared/display/pipes/row-count.pipe.mjs +48 -48
- package/{esm2020 → esm2022}/lib/shared/display/pipes/time-display.pipe.mjs +41 -41
- package/esm2022/lib/shared/display.mjs +6 -0
- package/esm2022/lib/shared/form-group.helper.mjs +67 -0
- package/{esm2020 → esm2022}/lib/shared/json-helper.mjs +18 -18
- package/esm2022/lib/shared/lodash-helper.mjs +52 -0
- package/{esm2020 → esm2022}/lib/shared/page/page-base/page-base.component.mjs +387 -387
- package/{esm2020 → esm2022}/lib/shared/page/page-statuses.mjs +22 -22
- package/{esm2020 → esm2022}/lib/shared/page/page-title/page-title.component.mjs +23 -23
- package/{esm2020 → esm2022}/lib/shared/page/page-view/page-view.component.mjs +147 -147
- package/{esm2020 → esm2022}/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +16 -16
- package/{esm2020 → esm2022}/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +16 -16
- package/{esm2020 → esm2022}/lib/shared/testing/page-base-component-test-helper.spec.mjs +37 -37
- package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +98 -0
- package/{esm2020 → esm2022}/lib/shared/testing/public-mocks.spec.mjs +148 -148
- package/{esm2020 → esm2022}/lib/shared/testing/spy-factory.spec.mjs +39 -39
- package/{esm2020 → esm2022}/lib/shared/testing/translation-mocks.spec.mjs +56 -56
- package/{esm2020 → esm2022}/lib/shared/user-preference.service.mjs +17 -17
- package/{esm2020 → esm2022}/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -246
- package/{esm2020 → esm2022}/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -68
- package/{esm2020 → esm2022}/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -18
- package/{esm2020 → esm2022}/public-api.mjs +114 -114
- package/{fesm2020 → fesm2022}/energycap-components.mjs +11797 -11793
- package/fesm2022/energycap-components.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/components.module.d.ts +91 -91
- package/lib/controls/banner/banner.component.d.ts +50 -50
- package/lib/controls/button/button.component.d.ts +78 -78
- package/lib/controls/button/copy-button-base.directive.d.ts +20 -20
- package/lib/controls/button/copy-button.directive.d.ts +14 -14
- package/lib/controls/button/copy-table-button.directive.d.ts +19 -19
- package/lib/controls/calendar/calendar-item.component.d.ts +17 -17
- package/lib/controls/calendar/calendar.component.d.ts +54 -54
- package/lib/controls/calendar/calendar.types.d.ts +7 -7
- package/lib/controls/checkbox/checkbox.component.d.ts +65 -65
- package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +25 -25
- package/lib/controls/combobox/combobox.component.d.ts +418 -418
- package/lib/controls/date-input/date-input.component.d.ts +80 -80
- package/lib/controls/dropdown/dropdown.component.d.ts +161 -161
- package/lib/controls/file-upload/file-upload.component.d.ts +124 -124
- package/lib/controls/form-control/form-control.component.d.ts +30 -30
- package/lib/controls/form-control-base.d.ts +110 -110
- package/lib/controls/form-control-label/form-control-label.component.d.ts +73 -73
- package/lib/controls/form-group/form-group.component.d.ts +105 -105
- package/lib/controls/help-popover/help-popover.component.d.ts +11 -11
- package/lib/controls/item-picker/item-picker.component.d.ts +164 -164
- package/lib/controls/link-button/link-button.component.d.ts +5 -5
- package/lib/controls/menu/menu.component.d.ts +255 -255
- package/lib/controls/navigation/link-item.d.ts +32 -32
- package/lib/controls/navigation/nav-group.d.ts +18 -18
- package/lib/controls/navigation/nav-item-active.directive.d.ts +42 -42
- package/lib/controls/navigation/nav-item.d.ts +31 -31
- package/lib/controls/numericbox/numericbox.component.d.ts +148 -148
- package/lib/controls/popover/popover.component.d.ts +51 -51
- package/lib/controls/radio-button/radio-button-option.d.ts +19 -19
- package/lib/controls/radio-button/radio-button.component.d.ts +53 -53
- package/lib/controls/select/select.component.d.ts +44 -44
- package/lib/controls/tabs/tabs.component.d.ts +30 -30
- package/lib/controls/textbox/textbox.component.d.ts +107 -107
- package/lib/core/cache.service.d.ts +33 -33
- package/lib/core/custom-validators.d.ts +20 -20
- package/lib/core/date-time-helper.d.ts +101 -101
- package/lib/core/error.service.d.ts +20 -20
- package/lib/core/router-helper.service.d.ts +48 -48
- package/lib/core/scroll.service.d.ts +36 -36
- package/lib/core/telemetry-tracker.service.d.ts +13 -13
- package/lib/core/telemetry.service.d.ts +31 -31
- package/lib/core/validation-message.service.d.ts +26 -26
- package/lib/core/validation-patterns.d.ts +22 -22
- package/lib/core/window.service.d.ts +116 -116
- package/lib/display/app-bar/app-bar.component.d.ts +20 -20
- package/lib/display/avatar/avatar.component.d.ts +35 -35
- package/lib/display/avatar/avatar.service.d.ts +24 -24
- package/lib/display/confirm/confirm.component.d.ts +123 -123
- package/lib/display/dialog/dialog-content.d.ts +19 -19
- package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +32 -32
- package/lib/display/dialog/dialog-types.d.ts +130 -130
- package/lib/display/dialog/dialog.component.d.ts +120 -120
- package/lib/display/dialog/dialog.service.d.ts +48 -48
- package/lib/display/help/help-types.d.ts +33 -33
- package/lib/display/hierarchy/hierarchy-base.d.ts +97 -97
- package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +53 -53
- package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +34 -34
- package/lib/display/item-display/item-display.component.d.ts +43 -43
- package/lib/display/json-display/json-display.component.d.ts +16 -16
- package/lib/display/resizable/resizable-base.d.ts +67 -67
- package/lib/display/resizable/resizable.component.d.ts +31 -31
- package/lib/display/spinner/spinner.component.d.ts +5 -5
- package/lib/display/splash/splash.component.d.ts +16 -16
- package/lib/display/splash/splash.service.d.ts +22 -22
- package/lib/display/table/resizable-column.component.d.ts +10 -10
- package/lib/display/table/resizable-table.directive.d.ts +93 -93
- package/lib/display/table/searchable-table.component.d.ts +206 -206
- package/lib/display/table/table-detail-row.component.d.ts +8 -8
- package/lib/display/table/table-locked-column.component.d.ts +20 -20
- package/lib/display/table/table-master-header-row.component.d.ts +9 -9
- package/lib/display/table/table-master-row.component.d.ts +113 -113
- package/lib/display/table/table-pagination.component.d.ts +91 -91
- package/lib/display/table/table-selectable-row.component.d.ts +102 -102
- package/lib/display/table/table.component.d.ts +121 -121
- package/lib/display/tags/tag.d.ts +18 -18
- package/lib/display/tags/tags.component.d.ts +48 -48
- package/lib/display/toast/toast/toast.component.d.ts +23 -23
- package/lib/display/toast/toast-types.d.ts +24 -24
- package/lib/display/toast/toast.service.d.ts +20 -20
- package/lib/display/toast/toaster/toaster.component.d.ts +35 -35
- package/lib/display/tooltip/tooltip.component.d.ts +70 -70
- package/lib/display/tooltip/tooltip.service.d.ts +16 -16
- package/lib/display/tooltip-directive/tooltip.directive.d.ts +44 -44
- package/lib/display/tour/tour-types.d.ts +70 -70
- package/lib/display/tour/tour.component.d.ts +147 -147
- package/lib/display/tour/tour.service.d.ts +38 -38
- package/lib/display/tree/tree.component.d.ts +75 -75
- package/lib/display/view-overlay/view-overlay.component.d.ts +38 -38
- package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +14 -14
- package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +60 -60
- package/lib/shared/directives/popup/popup-container.directive.d.ts +101 -101
- package/lib/shared/display/pipes/date-display.pipe.d.ts +21 -21
- package/lib/shared/display/pipes/highlight-text.pipe.d.ts +9 -9
- package/lib/shared/display/pipes/relative-date.pipe.d.ts +36 -36
- package/lib/shared/display/pipes/row-count.pipe.d.ts +23 -23
- package/lib/shared/display/pipes/time-display.pipe.d.ts +18 -18
- package/lib/shared/display.d.ts +42 -42
- package/lib/shared/form-group.helper.d.ts +31 -31
- package/lib/shared/json-helper.d.ts +7 -7
- package/lib/shared/lodash-helper.d.ts +18 -18
- package/lib/shared/page/page-base/page-base.component.d.ts +259 -259
- package/lib/shared/page/page-statuses.d.ts +13 -13
- package/lib/shared/page/page-title/page-title.component.d.ts +9 -9
- package/lib/shared/page/page-view/page-view.component.d.ts +102 -102
- package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +4 -4
- package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +4 -4
- package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +30 -30
- package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +28 -28
- package/lib/shared/testing/public-mocks.spec.d.ts +90 -90
- package/lib/shared/testing/spy-factory.spec.d.ts +27 -27
- package/lib/shared/testing/translation-mocks.spec.d.ts +30 -30
- package/lib/shared/user-preference.service.d.ts +13 -13
- package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +134 -134
- package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +27 -27
- package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +10 -10
- package/package.json +12 -18
- package/public-api.d.ts +111 -111
- package/schematics/rxjs-7-upgrade/index.d.ts +3 -3
- package/schematics/rxjs-7-upgrade/index.js +67 -67
- package/schematics/rxjs-7-upgrade/schema.d.ts +4 -4
- package/schematics/rxjs-7-upgrade/schema.js +2 -2
- package/schematics/utilities/typescript.d.ts +7 -7
- package/schematics/utilities/typescript.js +41 -41
- package/schematics/utilities/workspace.d.ts +8 -8
- package/schematics/utilities/workspace.js +71 -71
- package/esm2020/lib/core/custom-validators.mjs +0 -29
- package/esm2020/lib/core/date-time-helper.mjs +0 -220
- package/esm2020/lib/display/avatar/avatar.component.mjs +0 -67
- package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +0 -163
- package/esm2020/lib/shared/display.mjs +0 -6
- package/esm2020/lib/shared/form-group.helper.mjs +0 -67
- package/esm2020/lib/shared/lodash-helper.mjs +0 -51
- package/esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
- package/fesm2015/energycap-components.mjs +0 -12211
- package/fesm2015/energycap-components.mjs.map +0 -1
- package/fesm2020/energycap-components.mjs.map +0 -1
@@ -1,200 +1,200 @@
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
|
2
|
-
import { range } from 'lodash';
|
3
|
-
import moment from 'moment';
|
4
|
-
import { DateTimeHelper } from '../../core/date-time-helper';
|
5
|
-
import { isCalendarSelectionSingleDate } from './calendar.types';
|
6
|
-
import * as i0 from "@angular/core";
|
7
|
-
import * as i1 from "@angular/common";
|
8
|
-
import * as i2 from "./calendar-item.component";
|
9
|
-
export class CalendarComponent {
|
10
|
-
constructor() {
|
11
|
-
this.id = 'calendar';
|
12
|
-
this.selection = null;
|
13
|
-
this.selectionChange = new EventEmitter();
|
14
|
-
this.minDate = DateTimeHelper.minDatePickerDate;
|
15
|
-
this.maxDate = DateTimeHelper.maxDatePickerDate;
|
16
|
-
this.focusOutStart = new EventEmitter();
|
17
|
-
this.focusOutEnd = new EventEmitter();
|
18
|
-
/** Array of calendar items to display in the calendar grid. */
|
19
|
-
this.calendarItems = [];
|
20
|
-
/** Determines the current view mode of the calendar. */
|
21
|
-
this.view = 'day';
|
22
|
-
/** TrackBy function for the calendar items. This avoids re-drawing calendar items if a date is shared between view updates */
|
23
|
-
this.calendarItemTrackByDate = (index, item) => item.date.toISOString();
|
24
|
-
this.disablePreviousButton = false;
|
25
|
-
this.disableNextButton = false;
|
26
|
-
// By default, the active date is today.
|
27
|
-
// This is replaced with the date of the selection if one is provided on init.
|
28
|
-
this.activeDate = new Date();
|
29
|
-
// Using moment here to get the weekday labels so they are localized.
|
30
|
-
this.weekDays = moment.weekdaysShort().map(d => d.slice(0, 1));
|
31
|
-
}
|
32
|
-
ngOnChanges(changes) {
|
33
|
-
if (changes.selection && this.selection) {
|
34
|
-
// Only need to update the view if the selection is out of view.
|
35
|
-
if (isCalendarSelectionSingleDate(this.selection) &&
|
36
|
-
!this.isDateInView(this.selection) &&
|
37
|
-
moment(this.selection).isBetween(this.minDate, this.maxDate, 'day', '[]')) {
|
38
|
-
this.drawCalendar('day', this.selection);
|
39
|
-
}
|
40
|
-
else {
|
41
|
-
// TODO ECAP-26841: determine the active date for a range selection and draw the calendar
|
42
|
-
}
|
43
|
-
}
|
44
|
-
}
|
45
|
-
ngOnInit() {
|
46
|
-
if (!this.calendarItems.length) {
|
47
|
-
this.drawCalendar('day');
|
48
|
-
}
|
49
|
-
}
|
50
|
-
onItemSelected(item) {
|
51
|
-
if (this.view === 'day') {
|
52
|
-
this.selection = item.date;
|
53
|
-
this.selectionChange.emit(this.selection);
|
54
|
-
}
|
55
|
-
if (this.view === 'month') {
|
56
|
-
this.drawCalendar('day', item.date);
|
57
|
-
}
|
58
|
-
if (this.view === 'year') {
|
59
|
-
this.drawCalendar('month', item.date);
|
60
|
-
}
|
61
|
-
}
|
62
|
-
onNextClick() {
|
63
|
-
// If we're in day view, we're incrementing by month
|
64
|
-
// In both month and year views we're incrementing by year
|
65
|
-
// In year view, we're moving by 16 years at a time
|
66
|
-
const unit = this.view === 'day' ? 'month' : 'year';
|
67
|
-
// In year view, we're moving by 16 years at a time. Otherwise we're just moving by 1 month/year.
|
68
|
-
const count = this.view === 'year' ? 16 : 1;
|
69
|
-
const goToDate = moment(this.activeDate).add(count, unit).toDate();
|
70
|
-
this.drawCalendar(this.view, goToDate);
|
71
|
-
}
|
72
|
-
onPreviousClick() {
|
73
|
-
// If we're in day view, we're incrementing by month
|
74
|
-
// In both month and year views we're incrementing years
|
75
|
-
const unit = this.view === 'day' ? 'month' : 'year';
|
76
|
-
// In year view, we're moving by 16 years at a time. Otherwise we're just moving by 1 month/year.
|
77
|
-
const count = this.view === 'year' ? 16 : 1;
|
78
|
-
const goToDate = moment(this.activeDate).subtract(count, unit).toDate();
|
79
|
-
this.drawCalendar(this.view, goToDate);
|
80
|
-
}
|
81
|
-
/** Switches the calendar to month view. */
|
82
|
-
onMonthClick() {
|
83
|
-
this.drawCalendar('month');
|
84
|
-
}
|
85
|
-
/** Switches the calendar to year view. */
|
86
|
-
onYearClick() {
|
87
|
-
this.drawCalendar('year');
|
88
|
-
}
|
89
|
-
onFirstItemKeydown(event) {
|
90
|
-
// If the user is tabbing backwards from the first item, emit the focusOutStart event.
|
91
|
-
if (event.key === 'Tab' && event.shiftKey) {
|
92
|
-
this.focusOutStart.emit(event);
|
93
|
-
}
|
94
|
-
}
|
95
|
-
onLastItemKeydown(event) {
|
96
|
-
// If the user is tabbing forwards from the last item, emit the focusOutEnd event.
|
97
|
-
if (event.key === 'Tab' && !event.shiftKey) {
|
98
|
-
this.focusOutEnd.emit(event);
|
99
|
-
}
|
100
|
-
}
|
101
|
-
drawCalendar(view, goTo) {
|
102
|
-
// If a goTo date is provided, update the active date so we know what to increment on next/previous clicks.
|
103
|
-
if (goTo) {
|
104
|
-
this.activeDate = goTo;
|
105
|
-
}
|
106
|
-
this.month = moment(this.activeDate).format('MMM');
|
107
|
-
this.year = moment(this.activeDate).format('YYYY');
|
108
|
-
this.view = view;
|
109
|
-
this.calendarItems = this.getCalendarItems(view, this.activeDate);
|
110
|
-
const startYear = this.calendarItems[0].date < this.minDate ? this.minDate : this.calendarItems[0].date;
|
111
|
-
const endYear = this.calendarItems[this.calendarItems.length - 1].date > this.maxDate ? this.maxDate : this.calendarItems[this.calendarItems.length - 1].date;
|
112
|
-
this.yearRange = `${moment(startYear).format('YYYY')}–${moment(endYear).format('YYYY')}`;
|
113
|
-
// If the active date is less than the min date or the min date is in view, disable the previous button.
|
114
|
-
if (this.activeDate < this.minDate || this.isDateInView(this.minDate)) {
|
115
|
-
this.disablePreviousButton = true;
|
116
|
-
}
|
117
|
-
else {
|
118
|
-
this.disablePreviousButton = false;
|
119
|
-
}
|
120
|
-
// If the active date is greater than the max date or the max date is in view, disable the next button.
|
121
|
-
if (this.activeDate > this.maxDate || this.isDateInView(this.maxDate)) {
|
122
|
-
this.disableNextButton = true;
|
123
|
-
}
|
124
|
-
else {
|
125
|
-
this.disableNextButton = false;
|
126
|
-
}
|
127
|
-
}
|
128
|
-
getCalendarItems(view, activeDate) {
|
129
|
-
switch (view) {
|
130
|
-
case 'day': return this.getDayViewItems(activeDate);
|
131
|
-
case 'month': return this.getMonthViewItems(activeDate);
|
132
|
-
case 'year': return this.getYearViewItems(activeDate);
|
133
|
-
}
|
134
|
-
}
|
135
|
-
getDayViewItems(activeDate) {
|
136
|
-
// 6 rows of 7 days = 42 days
|
137
|
-
return range(0, 42).map(i => {
|
138
|
-
// Use the start of the week of the first day of the month.
|
139
|
-
// This pads out the first week with any days from the previous month.
|
140
|
-
const date = moment(activeDate).startOf('month').startOf('week').add(i, 'day');
|
141
|
-
return {
|
142
|
-
date: date.toDate(),
|
143
|
-
label: date.format('D')
|
144
|
-
};
|
145
|
-
});
|
146
|
-
}
|
147
|
-
getMonthViewItems(activeDate) {
|
148
|
-
return range(0, 12).map(i => {
|
149
|
-
const date = moment(activeDate).startOf('year').add(i, 'month');
|
150
|
-
return {
|
151
|
-
date: date.toDate(),
|
152
|
-
label: date.format('MMM')
|
153
|
-
};
|
154
|
-
});
|
155
|
-
}
|
156
|
-
getYearViewItems(activeDate) {
|
157
|
-
// 4x4 grid of years = 16 years
|
158
|
-
return range(0, 16).map(i => {
|
159
|
-
// Put the current active year at the beginning of the 3rd row.
|
160
|
-
const date = moment(activeDate).startOf('year').subtract(8, 'year').add(i, 'year');
|
161
|
-
return {
|
162
|
-
date: date.toDate(),
|
163
|
-
label: date.format('YYYY')
|
164
|
-
};
|
165
|
-
});
|
166
|
-
}
|
167
|
-
/** Returns true if the date is within the current calendar view */
|
168
|
-
isDateInView(date) {
|
169
|
-
if (!this.calendarItems.length) {
|
170
|
-
return false;
|
171
|
-
}
|
172
|
-
const viewStart = this.calendarItems[0].date;
|
173
|
-
const viewEnd = this.calendarItems[this.calendarItems.length - 1].date;
|
174
|
-
return date >= viewStart && date <= viewEnd;
|
175
|
-
}
|
176
|
-
}
|
177
|
-
|
178
|
-
|
179
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
180
|
-
type: Component,
|
181
|
-
args: [{ selector: 'ec-calendar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<header class=\"d-flex align-items-center mb-2\">\r\n <button id=\"{{id}}_prev_button\"\r\n class=\"mr-auto\"\r\n (click)=\"onPreviousClick()\"\r\n (keydown)=\"!disablePreviousButton ? onFirstItemKeydown($event) : undefined\"\r\n [disabled]=\"disablePreviousButton\">\r\n <i class=\"ec-icon icon-angle-down rotate-90\"></i>\r\n </button>\r\n\r\n <button *ngIf=\"view === 'day'\"\r\n id=\"{{id}}_month_button\"\r\n class=\"text-body-1 font-weight-bold\"\r\n (click)=\"onMonthClick()\"\r\n (keydown)=\"disablePreviousButton ? onFirstItemKeydown($event) : undefined\">\r\n {{month}}\r\n </button>\r\n\r\n <button *ngIf=\"view !== 'year'\"\r\n id=\"{{id}}_year_button\"\r\n class=\"text-body-1 font-weight-bold\"\r\n (click)=\"onYearClick()\"\r\n (keydown)=\"disablePreviousButton && view !== 'day' ? onFirstItemKeydown($event) : undefined\">\r\n {{year}}\r\n </button>\r\n\r\n <div id=\"{{id}}_year_range\"\r\n *ngIf=\"view === 'year'\"\r\n class=\"text-body-1 font-weight-bold\"\r\n [innerHTML]=\"yearRange\">\r\n </div>\r\n\r\n <button id=\"{{id}}_next_button\"\r\n class=\"ml-auto\"\r\n (click)=\"onNextClick()\"\r\n [disabled]=\"disableNextButton\"\r\n (keydown)=\"disablePreviousButton && view === 'year' ? onFirstItemKeydown($event) : undefined\">\r\n <i class=\"ec-icon icon-angle-down rotate-270\"></i>\r\n </button>\r\n</header>\r\n\r\n<ul class=\"px-1 {{view}}-view\">\r\n <ng-container *ngIf=\"view === 'day'\">\r\n <li *ngFor=\"let day of weekDays\"\r\n class=\"d-flex align-items-center justify-content-center text-heading-3\">\r\n {{day}}\r\n </li>\r\n </ng-container>\r\n\r\n <li *ngFor=\"let item of calendarItems; last as isLast; trackBy: calendarItemTrackByDate;\">\r\n <button id=\"{{id}}_item_{{item.date | date:'MM_dd_yyyy'}}\"\r\n ec-calendar-item\r\n [item]=\"item\"\r\n [activeDate]=\"activeDate\"\r\n [selection]=\"selection\"\r\n [view]=\"view\"\r\n (click)=\"onItemSelected(item)\"\r\n (keydown)=\"isLast ? onLastItemKeydown($event) : undefined\"\r\n [hidden]=\"item.date < minDate || item.date > maxDate\">\r\n </button>\r\n </li>\r\n</ul>", styles: [":host{display:inline-block}button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent}button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}button .ec-icon{flex:none}button .ec-icon+.label{flex:none;margin-left:.25rem}button.has-badge{padding-right:.0625rem}button:focus{outline:none;position:relative;z-index:1}button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);opacity:1;--ec-color-icon: var(--ec-color-hint-dark)}button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul{list-style:none;padding:0;margin:0;display:grid;align-items:stretch;justify-items:stretch}button[ec-calendar-item]{height:100%;width:100%}ul.day-view{grid-template-columns:repeat(7,2rem);grid-auto-rows:1.75rem;row-gap:.25rem}ul.month-view{grid-template-columns:repeat(3,4.67rem);grid-auto-rows:3.25rem;row-gap:.25rem}ul.year-view{grid-template-columns:repeat(4,3.5rem);grid-auto-rows:3.25rem;row-gap:.25rem}\n"] }]
|
182
|
-
}], ctorParameters: function () { return []; }, propDecorators: { id: [{
|
183
|
-
type: HostBinding,
|
184
|
-
args: ['attr.id']
|
185
|
-
}, {
|
186
|
-
type: Input
|
187
|
-
}], selection: [{
|
188
|
-
type: Input
|
189
|
-
}], selectionChange: [{
|
190
|
-
type: Output
|
191
|
-
}], minDate: [{
|
192
|
-
type: Input
|
193
|
-
}], maxDate: [{
|
194
|
-
type: Input
|
195
|
-
}], focusOutStart: [{
|
196
|
-
type: Output
|
197
|
-
}], focusOutEnd: [{
|
198
|
-
type: Output
|
199
|
-
}] } });
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQy9JLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQWlELDZCQUE2QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFRaEgsTUFBTSxPQUFPLGlCQUFpQjtJQTRDNUI7UUF6Q2dCLE9BQUUsR0FBVyxVQUFVLENBQUM7UUFFL0IsY0FBUyxHQUE2QixJQUFJLENBQUM7UUFDMUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUVoRSxZQUFPLEdBQVMsY0FBYyxDQUFDLGlCQUFpQixDQUFDO1FBQ2pELFlBQU8sR0FBUyxjQUFjLENBQUMsaUJBQWlCLENBQUM7UUFFaEQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUNsRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBVzFELCtEQUErRDtRQUN4RCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFLMUMsd0RBQXdEO1FBQ2pELFNBQUksR0FBaUIsS0FBSyxDQUFDO1FBUWxDLDhIQUE4SDtR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Q0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2RSxPQUFPLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQztJQUM5QyxDQUFDOzs4R0F2TlUsaUJBQWlCO2tHQUFqQixpQkFBaUIsMlRDWjlCLDh6RUE0REs7MkZEaERRLGlCQUFpQjtrQkFON0IsU0FBUzsrQkFDRSxhQUFhLG1CQUdOLHVCQUF1QixDQUFDLE1BQU07MEVBSy9CLEVBQUU7c0JBRGpCLFdBQVc7dUJBQUMsU0FBUzs7c0JBQ3JCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUVFLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IERhdGVUaW1lSGVscGVyIH0gZnJvbSAnLi4vLi4vY29yZS9kYXRlLXRpbWUtaGVscGVyJztcclxuaW1wb3J0IHsgQ2FsZW5kYXJJdGVtLCBDYWxlbmRhclNlbGVjdGlvbiwgQ2FsZW5kYXJWaWV3LCBpc0NhbGVuZGFyU2VsZWN0aW9uU2luZ2xlRGF0ZSB9IGZyb20gJy4vY2FsZW5kYXIudHlwZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlYy1jYWxlbmRhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XHJcblxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgQElucHV0KCkgcHVibGljIGlkOiBzdHJpbmcgPSAnY2FsZW5kYXInO1xyXG5cclxuICBASW5wdXQoKSBzZWxlY3Rpb246IENhbGVuZGFyU2VsZWN0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJTZWxlY3Rpb24gfCBudWxsPigpO1xyXG5cclxuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlID0gRGF0ZVRpbWVIZWxwZXIubWluRGF0ZVBpY2tlckRhdGU7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZSA9IERhdGVUaW1lSGVscGVyLm1heERhdGVQaWNrZXJEYXRlO1xyXG5cclxuICBAT3V0cHV0KCkgZm9jdXNPdXRTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgZm9jdXNPdXRFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XHJcblxyXG4gIC8qKiBNb250aCBvZiB0aGUgYWN0aXZlIGRhdGUgZGlzcGxheWVkIGluIHRoZSBoZWFkZXIgYnV0dG9ucy4gKi9cclxuICBwdWJsaWMgbW9udGg/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBZZWFyIG9mIHRoZSBhY3RpdmUgZGF0ZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlciBidXR0b25zLiAqL1xyXG4gIHB1YmxpYyB5ZWFyPzogc3RyaW5nO1xyXG5cclxuICAvKiogUmFuZ2Ugb2YgeWVhcnMgdG8gZGlzcGxheSBpbiB0aGUgeWVhciB2aWV3LiAqL1xyXG4gIHB1YmxpYyB5ZWFyUmFuZ2U/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBBcnJheSBvZiBjYWxlbmRhciBpdGVtcyB0byBkaXNwbGF5IGluIHRoZSBjYWxlbmRhciBncmlkLiAqL1xyXG4gIHB1YmxpYyBjYWxlbmRhckl0ZW1zOiBDYWxlbmRhckl0ZW1bXSA9IFtdO1xyXG5cclxuICAvKiogV2Vla2RheSBsYWJlbHMgdG8gc2hvdyBhdCB0aGUgdG9wIG9mIHRoZSBjYWxlbmRhciBpbiBkYXkgdmlldy4gKi9cclxuICBwdWJsaWMgd2Vla0RheXM6IHN0cmluZ1tdO1xyXG5cclxuICAvKiogRGV0ZXJtaW5lcyB0aGUgY3VycmVudCB2aWV3IG1vZGUgb2YgdGhlIGNhbGVuZGFyLiAqL1xyXG4gIHB1YmxpYyB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcclxuXHJcbiAgLyoqIFxyXG4gICAqIFRyYWNrcyB0aGUgbW9udGggYW5kIHllYXIgYmVpbmcgdmlld2VkIGluIHRoZSBjYWxlbmRhci5cclxuICAgKiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlIHNlbGVjdGlvbiwgd2hpY2ggbWF5IGJlIG91dCBvZiB2aWV3LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhY3RpdmVEYXRlOiBEYXRlO1xyXG5cclxuICAvKiogVHJhY2tCeSBmdW5jdGlvbiBmb3IgdGhlIGNhbGVuZGFyIGl0ZW1zLiBUaGlzIGF2b2lkcyByZS1kcmF3aW5nIGNhbGVuZGFyIGl0ZW1zIGlmIGEgZGF0ZSBpcyBzaGFyZWQgYmV0d2VlbiB2aWV3IHVwZGF0ZXMgKi9cclxuICBjYWxlbmRhckl0ZW1UcmFja0J5RGF0ZSA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBDYWxlbmRhckl0ZW0pID0+IGl0ZW0uZGF0ZS50b0lTT1N0cmluZygpO1xyXG5cclxuICBwdWJsaWMgZGlzYWJsZVByZXZpb3VzQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGRpc2FibGVOZXh0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgLy8gQnkgZGVmYXVsdCwgdGhlIGFjdGl2ZSBkYXRlIGlzIHRvZGF5LlxyXG4gICAgLy8gVGhpcyBpcyByZXBsYWNlZCB3aXRoIHRoZSBkYXRlIG9mIHRoZSBzZWxlY3Rpb24gaWYgb25lIGlzIHByb3ZpZGVkIG9uIGluaXQuXHJcbiAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgLy8gVXNpbmcgbW9tZW50IGhlcmUgdG8gZ2V0IHRoZSB3ZWVrZGF5IGxhYmVscyBzbyB0aGV5IGFyZSBsb2NhbGl6ZWQuXHJcbiAgICB0aGlzLndlZWtEYXlzID0gbW9tZW50LndlZWtkYXlzU2hvcnQoKS5tYXAoZCA9PiBkLnNsaWNlKDAsIDEpKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnNlbGVjdGlvbiAmJiB0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAvLyBPbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSB2aWV3IGlmIHRoZSBzZWxlY3Rpb24gaXMgb3V0IG9mIHZpZXcuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBpc0NhbGVuZGFyU2VsZWN0aW9uU2luZ2xlRGF0ZSh0aGlzLnNlbGVjdGlvbikgJiZcclxuICAgICAgICAhdGhpcy5pc0RhdGVJblZpZXcodGhpcy5zZWxlY3Rpb24pICYmXHJcbiAgICAgICAgbW9tZW50KHRoaXMuc2VsZWN0aW9uKS5pc0JldHdlZW4odGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUsICdkYXknLCAnW10nKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmRyYXdDYWxlbmRhcignZGF5JywgdGhpcy5zZWxlY3Rpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFRPRE8gRUNBUC0yNjg0MTogZGV0ZXJtaW5lIHRoZSBhY3RpdmUgZGF0ZSBmb3IgYSByYW5nZSBzZWxlY3Rpb24gYW5kIGRyYXcgdGhlIGNhbGVuZGFyXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbGVuZGFySXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZHJhd0NhbGVuZGFyKCdkYXknKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkl0ZW1TZWxlY3RlZChpdGVtOiBDYWxlbmRhckl0ZW0pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnZpZXcgPT09ICdkYXknKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uID0gaXRlbS5kYXRlO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy52aWV3ID09PSAnbW9udGgnKSB7XHJcbiAgICAgIHRoaXMuZHJhd0NhbGVuZGFyKCdkYXknLCBpdGVtLmRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnZpZXcgPT09ICd5ZWFyJykge1xyXG4gICAgICB0aGlzLmRyYXdDYWxlbmRhcignbW9udGgnLCBpdGVtLmRhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTmV4dENsaWNrKCk6IHZvaWQge1xyXG4gICAgLy8gSWYgd2UncmUgaW4gZGF5IHZpZXcsIHdlJ3JlIGluY3JlbWVudGluZyBieSBtb250aFxyXG4gICAgLy8gSW4gYm90aCBtb250aCBhbmQgeWVhciB2aWV3cyB3ZSdyZSBpbmNyZW1lbnRpbmcgYnkgeWVhclxyXG4gICAgLy8gSW4geWVhciB2aWV3LCB3ZSdyZSBtb3ZpbmcgYnkgMTYgeWVhcnMgYXQgYSB0aW1lXHJcbiAgICBjb25zdCB1bml0ID0gdGhpcy52aWV3ID09PSAnZGF5JyA/ICdtb250aCcgOiAneWVhcic7XHJcbiAgICAvLyBJbiB5ZWFyIHZpZXcsIHdlJ3JlIG1vdmluZyBieSAxNiB5ZWFycyBhdCBhIHRpbWUuIE90aGVyd2lzZSB3ZSdyZSBqdXN0IG1vdmluZyBieSAxIG1vbnRoL3llYXIuXHJcbiAgICBjb25zdCBjb3VudCA9IHRoaXMudmlldyA9PT0gJ3llYXInID8gMTYgOiAxO1xyXG4gICAgY29uc3QgZ29Ub0RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoY291bnQsIHVuaXQpLnRvRGF0ZSgpO1xyXG4gICAgdGhpcy5kcmF3Q2FsZW5kYXIodGhpcy52aWV3LCBnb1RvRGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25QcmV2aW91c0NsaWNrKCk6IHZvaWQge1xyXG4gICAgLy8gSWYgd2UncmUgaW4gZGF5IHZpZXcsIHdlJ3JlIGluY3JlbWVudGluZyBieSBtb250aFxyXG4gICAgLy8gSW4gYm90aCBtb250aCBhbmQgeWVhciB2aWV3cyB3ZSdyZSBpbmNyZW1lbnRpbmcgeWVhcnNcclxuICAgIGNvbnN0IHVuaXQgPSB0aGlzLnZpZXcgPT09ICdkYXknID8gJ21vbnRoJyA6ICd5ZWFyJztcclxuICAgIC8vIEluIHllYXIgdmlldywgd2UncmUgbW92aW5nIGJ5IDE2IHllYXJzIGF0IGEgdGltZS4gT3RoZXJ3aXNlIHdlJ3JlIGp1c3QgbW92aW5nIGJ5IDEgbW9udGgveWVhci5cclxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy52aWV3ID09PSAneWVhcicgPyAxNiA6IDE7XHJcbiAgICBjb25zdCBnb1RvRGF0ZSA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLnN1YnRyYWN0KGNvdW50LCB1bml0KS50b0RhdGUoKTtcclxuICAgIHRoaXMuZHJhd0NhbGVuZGFyKHRoaXMudmlldywgZ29Ub0RhdGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN3aXRjaGVzIHRoZSBjYWxlbmRhciB0byBtb250aCB2aWV3LiAqL1xyXG4gIHB1YmxpYyBvbk1vbnRoQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYXdDYWxlbmRhcignbW9udGgnKTtcclxuICB9XHJcblxyXG4gIC8qKiBTd2l0Y2hlcyB0aGUgY2FsZW5kYXIgdG8geWVhciB2aWV3LiAqL1xyXG4gIHB1YmxpYyBvblllYXJDbGljaygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhd0NhbGVuZGFyKCd5ZWFyJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GaXJzdEl0ZW1LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBJZiB0aGUgdXNlciBpcyB0YWJiaW5nIGJhY2t3YXJkcyBmcm9tIHRoZSBmaXJzdCBpdGVtLCBlbWl0IHRoZSBmb2N1c091dFN0YXJ0IGV2ZW50LlxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgdGhpcy5mb2N1c091dFN0YXJ0LmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTGFzdEl0ZW1LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBJZiB0aGUgdXNlciBpcyB0YWJiaW5nIGZvcndhcmRzIGZyb20gdGhlIGxhc3QgaXRlbSwgZW1pdCB0aGUgZm9jdXNPdXRFbmQgZXZlbnQuXHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgdGhpcy5mb2N1c091dEVuZC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd0NhbGVuZGFyKHZpZXc6IENhbGVuZGFyVmlldywgZ29Ubz86IERhdGUpOiB2b2lkIHtcclxuICAgIC8vIElmIGEgZ29UbyBkYXRlIGlzIHByb3ZpZGVkLCB1cGRhdGUgdGhlIGFjdGl2ZSBkYXRlIHNvIHdlIGtub3cgd2hhdCB0byBpbmNyZW1lbnQgb24gbmV4dC9wcmV2aW91cyBjbGlja3MuXHJcbiAgICBpZiAoZ29Ubykge1xyXG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBnb1RvO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLm1vbnRoID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuZm9ybWF0KCdNTU0nKTtcclxuICAgIHRoaXMueWVhciA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLmZvcm1hdCgnWVlZWScpO1xyXG4gICAgdGhpcy52aWV3ID0gdmlldztcclxuICAgIHRoaXMuY2FsZW5kYXJJdGVtcyA9IHRoaXMuZ2V0Q2FsZW5kYXJJdGVtcyh2aWV3LCB0aGlzLmFjdGl2ZURhdGUpO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0WWVhciA9IHRoaXMuY2FsZW5kYXJJdGVtc1swXS5kYXRlIDwgdGhpcy5taW5EYXRlID8gdGhpcy5taW5EYXRlIDogdGhpcy5jYWxlbmRhckl0ZW1zWzBdLmRhdGU7XHJcbiAgICBjb25zdCBlbmRZZWFyID0gdGhpcy5jYWxlbmRhckl0ZW1zW3RoaXMuY2FsZW5kYXJJdGVtcy5sZW5ndGggLSAxXS5kYXRlID4gdGhpcy5tYXhEYXRlID8gdGhpcy5tYXhEYXRlIDogdGhpcy5jYWxlbmRhckl0ZW1zW3RoaXMuY2FsZW5kYXJJdGVtcy5sZW5ndGggLSAxXS5kYXRlO1xyXG4gICAgdGhpcy55ZWFyUmFuZ2UgPSBgJHttb21lbnQoc3RhcnRZZWFyKS5mb3JtYXQoJ1lZWVknKX0mbmRhc2g7JHttb21lbnQoZW5kWWVhcikuZm9ybWF0KCdZWVlZJyl9YDtcclxuXHJcbiAgICAvLyBJZiB0aGUgYWN0aXZlIGRhdGUgaXMgbGVzcyB0aGFuIHRoZSBtaW4gZGF0ZSBvciB0aGUgbWluIGRhdGUgaXMgaW4gdmlldywgZGlzYWJsZSB0aGUgcHJldmlvdXMgYnV0dG9uLlxyXG4gICAgaWYgKHRoaXMuYWN0aXZlRGF0ZSA8IHRoaXMubWluRGF0ZSB8fCB0aGlzLmlzRGF0ZUluVmlldyh0aGlzLm1pbkRhdGUpKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVByZXZpb3VzQnV0dG9uID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVByZXZpb3VzQnV0dG9uID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIGFjdGl2ZSBkYXRlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IGRhdGUgb3IgdGhlIG1heCBkYXRlIGlzIGluIHZpZXcsIGRpc2FibGUgdGhlIG5leHQgYnV0dG9uLlxyXG4gICAgaWYgKHRoaXMuYWN0aXZlRGF0ZSA+IHRoaXMubWF4RGF0ZSB8fCB0aGlzLmlzRGF0ZUluVmlldyh0aGlzLm1heERhdGUpKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZU5leHRCdXR0b24gPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNhYmxlTmV4dEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDYWxlbmRhckl0ZW1zKHZpZXc6IENhbGVuZGFyVmlldywgYWN0aXZlRGF0ZTogRGF0ZSk6IENhbGVuZGFySXRlbVtdIHtcclxuICAgIHN3aXRjaCAodmlldykge1xyXG4gICAgICBjYXNlICdkYXknOiByZXR1cm4gdGhpcy5nZXREYXlWaWV3SXRlbXMoYWN0aXZlRGF0ZSk7XHJcbiAgICAgIGNhc2UgJ21vbnRoJzogcmV0dXJuIHRoaXMuZ2V0TW9udGhWaWV3SXRlbXMoYWN0aXZlRGF0ZSk7XHJcbiAgICAgIGNhc2UgJ3llYXInOiByZXR1cm4gdGhpcy5nZXRZZWFyVmlld0l0ZW1zKGFjdGl2ZURhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXlWaWV3SXRlbXMoYWN0aXZlRGF0ZTogRGF0ZSk6IENhbGVuZGFySXRlbVtdIHtcclxuICAgIC8vIDYgcm93cyBvZiA3IGRheXMgPSA0MiBkYXlzXHJcbiAgICByZXR1cm4gcmFuZ2UoMCwgNDIpLm1hcChpID0+IHtcclxuICAgICAgLy8gVXNlIHRoZSBzdGFydCBvZiB0aGUgd2VlayBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC5cclxuICAgICAgLy8gVGhpcyBwYWRzIG91dCB0aGUgZmlyc3Qgd2VlayB3aXRoIGFueSBkYXlzIGZyb20gdGhlIHByZXZpb3VzIG1vbnRoLlxyXG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KGFjdGl2ZURhdGUpLnN0YXJ0T2YoJ21vbnRoJykuc3RhcnRPZignd2VlaycpLmFkZChpLCAnZGF5Jyk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0ZTogZGF0ZS50b0RhdGUoKSxcclxuICAgICAgICBsYWJlbDogZGF0ZS5mb3JtYXQoJ0QnKVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE1vbnRoVmlld0l0ZW1zKGFjdGl2ZURhdGU6IERhdGUpOiBDYWxlbmRhckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gcmFuZ2UoMCwgMTIpLm1hcChpID0+IHtcclxuICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudChhY3RpdmVEYXRlKS5zdGFydE9mKCd5ZWFyJykuYWRkKGksICdtb250aCcpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGU6IGRhdGUudG9EYXRlKCksXHJcbiAgICAgICAgbGFiZWw6IGRhdGUuZm9ybWF0KCdNTU0nKVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFllYXJWaWV3SXRlbXMoYWN0aXZlRGF0ZTogRGF0ZSk6IENhbGVuZGFySXRlbVtdIHtcclxuICAgIC8vIDR4NCBncmlkIG9mIHllYXJzID0gMTYgeWVhcnNcclxuICAgIHJldHVybiByYW5nZSgwLCAxNikubWFwKGkgPT4ge1xyXG4gICAgICAvLyBQdXQgdGhlIGN1cnJlbnQgYWN0aXZlIHllYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgM3JkIHJvdy5cclxuICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudChhY3RpdmVEYXRlKS5zdGFydE9mKCd5ZWFyJykuc3VidHJhY3QoOCwgJ3llYXInKS5hZGQoaSwgJ3llYXInKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBkYXRlOiBkYXRlLnRvRGF0ZSgpLFxyXG4gICAgICAgIGxhYmVsOiBkYXRlLmZvcm1hdCgnWVlZWScpXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRhdGUgaXMgd2l0aGluIHRoZSBjdXJyZW50IGNhbGVuZGFyIHZpZXcgKi9cclxuICBwcml2YXRlIGlzRGF0ZUluVmlldyhkYXRlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuY2FsZW5kYXJJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdTdGFydCA9IHRoaXMuY2FsZW5kYXJJdGVtc1swXS5kYXRlO1xyXG4gICAgY29uc3Qgdmlld0VuZCA9IHRoaXMuY2FsZW5kYXJJdGVtc1t0aGlzLmNhbGVuZGFySXRlbXMubGVuZ3RoIC0gMV0uZGF0ZTtcclxuICAgIHJldHVybiBkYXRlID49IHZpZXdTdGFydCAmJiBkYXRlIDw9IHZpZXdFbmQ7XHJcbiAgfVxyXG59XHJcbiIsIjxoZWFkZXIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICA8YnV0dG9uIGlkPVwie3tpZH19X3ByZXZfYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwibXItYXV0b1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25QcmV2aW91c0NsaWNrKClcIlxyXG4gICAgICAgICAgKGtleWRvd24pPVwiIWRpc2FibGVQcmV2aW91c0J1dHRvbiA/IG9uRmlyc3RJdGVtS2V5ZG93bigkZXZlbnQpIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlUHJldmlvdXNCdXR0b25cIj5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTkwXCI+PC9pPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uICpuZ0lmPVwidmlldyA9PT0gJ2RheSdcIlxyXG4gICAgICAgICAgaWQ9XCJ7e2lkfX1fbW9udGhfYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTEgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25Nb250aENsaWNrKClcIlxyXG4gICAgICAgICAgKGtleWRvd24pPVwiZGlzYWJsZVByZXZpb3VzQnV0dG9uID8gb25GaXJzdEl0ZW1LZXlkb3duKCRldmVudCkgOiB1bmRlZmluZWRcIj5cclxuICAgIHt7bW9udGh9fVxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uICpuZ0lmPVwidmlldyAhPT0gJ3llYXInXCJcclxuICAgICAgICAgIGlkPVwie3tpZH19X3llYXJfYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTEgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25ZZWFyQ2xpY2soKVwiXHJcbiAgICAgICAgICAoa2V5ZG93bik9XCJkaXNhYmxlUHJldmlvdXNCdXR0b24gJiYgdmlldyAhPT0gJ2RheScgPyBvbkZpcnN0SXRlbUtleWRvd24oJGV2ZW50KSA6IHVuZGVmaW5lZFwiPlxyXG4gICAge3t5ZWFyfX1cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGRpdiBpZD1cInt7aWR9fV95ZWFyX3JhbmdlXCJcclxuICAgICAgICpuZ0lmPVwidmlldyA9PT0gJ3llYXInXCJcclxuICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTEgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICBbaW5uZXJIVE1MXT1cInllYXJSYW5nZVwiPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8YnV0dG9uIGlkPVwie3tpZH19X25leHRfYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwibWwtYXV0b1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25OZXh0Q2xpY2soKVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZU5leHRCdXR0b25cIlxyXG4gICAgICAgICAgKGtleWRvd24pPVwiZGlzYWJsZVByZXZpb3VzQnV0dG9uICYmIHZpZXcgPT09ICd5ZWFyJyA/IG9uRmlyc3RJdGVtS2V5ZG93bigkZXZlbnQpIDogdW5kZWZpbmVkXCI+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS0yNzBcIj48L2k+XHJcbiAgPC9idXR0b24+XHJcbjwvaGVhZGVyPlxyXG5cclxuPHVsIGNsYXNzPVwicHgtMSB7e3ZpZXd9fS12aWV3XCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXcgPT09ICdkYXknXCI+XHJcbiAgICA8bGkgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiXHJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgdGV4dC1oZWFkaW5nLTNcIj5cclxuICAgICAge3tkYXl9fVxyXG4gICAgPC9saT5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNhbGVuZGFySXRlbXM7IGxhc3QgYXMgaXNMYXN0OyB0cmFja0J5OiBjYWxlbmRhckl0ZW1UcmFja0J5RGF0ZTtcIj5cclxuICAgIDxidXR0b24gaWQ9XCJ7e2lkfX1faXRlbV97e2l0ZW0uZGF0ZSB8IGRhdGU6J01NX2RkX3l5eXknfX1cIlxyXG4gICAgICAgICAgICBlYy1jYWxlbmRhci1pdGVtXHJcbiAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICBbYWN0aXZlRGF0ZV09XCJhY3RpdmVEYXRlXCJcclxuICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICBbdmlld109XCJ2aWV3XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbVNlbGVjdGVkKGl0ZW0pXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwiaXNMYXN0ID8gb25MYXN0SXRlbUtleWRvd24oJGV2ZW50KSA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiaXRlbS5kYXRlIDwgbWluRGF0ZSB8fCBpdGVtLmRhdGUgPiBtYXhEYXRlXCI+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2xpPlxyXG48L3VsPiJdfQ==
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
|
2
|
+
import { range } from 'lodash';
|
3
|
+
import moment from 'moment';
|
4
|
+
import { DateTimeHelper } from '../../core/date-time-helper';
|
5
|
+
import { isCalendarSelectionSingleDate } from './calendar.types';
|
6
|
+
import * as i0 from "@angular/core";
|
7
|
+
import * as i1 from "@angular/common";
|
8
|
+
import * as i2 from "./calendar-item.component";
|
9
|
+
export class CalendarComponent {
|
10
|
+
constructor() {
|
11
|
+
this.id = 'calendar';
|
12
|
+
this.selection = null;
|
13
|
+
this.selectionChange = new EventEmitter();
|
14
|
+
this.minDate = DateTimeHelper.minDatePickerDate;
|
15
|
+
this.maxDate = DateTimeHelper.maxDatePickerDate;
|
16
|
+
this.focusOutStart = new EventEmitter();
|
17
|
+
this.focusOutEnd = new EventEmitter();
|
18
|
+
/** Array of calendar items to display in the calendar grid. */
|
19
|
+
this.calendarItems = [];
|
20
|
+
/** Determines the current view mode of the calendar. */
|
21
|
+
this.view = 'day';
|
22
|
+
/** TrackBy function for the calendar items. This avoids re-drawing calendar items if a date is shared between view updates */
|
23
|
+
this.calendarItemTrackByDate = (index, item) => item.date.toISOString();
|
24
|
+
this.disablePreviousButton = false;
|
25
|
+
this.disableNextButton = false;
|
26
|
+
// By default, the active date is today.
|
27
|
+
// This is replaced with the date of the selection if one is provided on init.
|
28
|
+
this.activeDate = new Date();
|
29
|
+
// Using moment here to get the weekday labels so they are localized.
|
30
|
+
this.weekDays = moment.weekdaysShort().map(d => d.slice(0, 1));
|
31
|
+
}
|
32
|
+
ngOnChanges(changes) {
|
33
|
+
if (changes.selection && this.selection) {
|
34
|
+
// Only need to update the view if the selection is out of view.
|
35
|
+
if (isCalendarSelectionSingleDate(this.selection) &&
|
36
|
+
!this.isDateInView(this.selection) &&
|
37
|
+
moment(this.selection).isBetween(this.minDate, this.maxDate, 'day', '[]')) {
|
38
|
+
this.drawCalendar('day', this.selection);
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
// TODO ECAP-26841: determine the active date for a range selection and draw the calendar
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
ngOnInit() {
|
46
|
+
if (!this.calendarItems.length) {
|
47
|
+
this.drawCalendar('day');
|
48
|
+
}
|
49
|
+
}
|
50
|
+
onItemSelected(item) {
|
51
|
+
if (this.view === 'day') {
|
52
|
+
this.selection = item.date;
|
53
|
+
this.selectionChange.emit(this.selection);
|
54
|
+
}
|
55
|
+
if (this.view === 'month') {
|
56
|
+
this.drawCalendar('day', item.date);
|
57
|
+
}
|
58
|
+
if (this.view === 'year') {
|
59
|
+
this.drawCalendar('month', item.date);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
onNextClick() {
|
63
|
+
// If we're in day view, we're incrementing by month
|
64
|
+
// In both month and year views we're incrementing by year
|
65
|
+
// In year view, we're moving by 16 years at a time
|
66
|
+
const unit = this.view === 'day' ? 'month' : 'year';
|
67
|
+
// In year view, we're moving by 16 years at a time. Otherwise we're just moving by 1 month/year.
|
68
|
+
const count = this.view === 'year' ? 16 : 1;
|
69
|
+
const goToDate = moment(this.activeDate).add(count, unit).toDate();
|
70
|
+
this.drawCalendar(this.view, goToDate);
|
71
|
+
}
|
72
|
+
onPreviousClick() {
|
73
|
+
// If we're in day view, we're incrementing by month
|
74
|
+
// In both month and year views we're incrementing years
|
75
|
+
const unit = this.view === 'day' ? 'month' : 'year';
|
76
|
+
// In year view, we're moving by 16 years at a time. Otherwise we're just moving by 1 month/year.
|
77
|
+
const count = this.view === 'year' ? 16 : 1;
|
78
|
+
const goToDate = moment(this.activeDate).subtract(count, unit).toDate();
|
79
|
+
this.drawCalendar(this.view, goToDate);
|
80
|
+
}
|
81
|
+
/** Switches the calendar to month view. */
|
82
|
+
onMonthClick() {
|
83
|
+
this.drawCalendar('month');
|
84
|
+
}
|
85
|
+
/** Switches the calendar to year view. */
|
86
|
+
onYearClick() {
|
87
|
+
this.drawCalendar('year');
|
88
|
+
}
|
89
|
+
onFirstItemKeydown(event) {
|
90
|
+
// If the user is tabbing backwards from the first item, emit the focusOutStart event.
|
91
|
+
if (event.key === 'Tab' && event.shiftKey) {
|
92
|
+
this.focusOutStart.emit(event);
|
93
|
+
}
|
94
|
+
}
|
95
|
+
onLastItemKeydown(event) {
|
96
|
+
// If the user is tabbing forwards from the last item, emit the focusOutEnd event.
|
97
|
+
if (event.key === 'Tab' && !event.shiftKey) {
|
98
|
+
this.focusOutEnd.emit(event);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
drawCalendar(view, goTo) {
|
102
|
+
// If a goTo date is provided, update the active date so we know what to increment on next/previous clicks.
|
103
|
+
if (goTo) {
|
104
|
+
this.activeDate = goTo;
|
105
|
+
}
|
106
|
+
this.month = moment(this.activeDate).format('MMM');
|
107
|
+
this.year = moment(this.activeDate).format('YYYY');
|
108
|
+
this.view = view;
|
109
|
+
this.calendarItems = this.getCalendarItems(view, this.activeDate);
|
110
|
+
const startYear = this.calendarItems[0].date < this.minDate ? this.minDate : this.calendarItems[0].date;
|
111
|
+
const endYear = this.calendarItems[this.calendarItems.length - 1].date > this.maxDate ? this.maxDate : this.calendarItems[this.calendarItems.length - 1].date;
|
112
|
+
this.yearRange = `${moment(startYear).format('YYYY')}–${moment(endYear).format('YYYY')}`;
|
113
|
+
// If the active date is less than the min date or the min date is in view, disable the previous button.
|
114
|
+
if (this.activeDate < this.minDate || this.isDateInView(this.minDate)) {
|
115
|
+
this.disablePreviousButton = true;
|
116
|
+
}
|
117
|
+
else {
|
118
|
+
this.disablePreviousButton = false;
|
119
|
+
}
|
120
|
+
// If the active date is greater than the max date or the max date is in view, disable the next button.
|
121
|
+
if (this.activeDate > this.maxDate || this.isDateInView(this.maxDate)) {
|
122
|
+
this.disableNextButton = true;
|
123
|
+
}
|
124
|
+
else {
|
125
|
+
this.disableNextButton = false;
|
126
|
+
}
|
127
|
+
}
|
128
|
+
getCalendarItems(view, activeDate) {
|
129
|
+
switch (view) {
|
130
|
+
case 'day': return this.getDayViewItems(activeDate);
|
131
|
+
case 'month': return this.getMonthViewItems(activeDate);
|
132
|
+
case 'year': return this.getYearViewItems(activeDate);
|
133
|
+
}
|
134
|
+
}
|
135
|
+
getDayViewItems(activeDate) {
|
136
|
+
// 6 rows of 7 days = 42 days
|
137
|
+
return range(0, 42).map(i => {
|
138
|
+
// Use the start of the week of the first day of the month.
|
139
|
+
// This pads out the first week with any days from the previous month.
|
140
|
+
const date = moment(activeDate).startOf('month').startOf('week').add(i, 'day');
|
141
|
+
return {
|
142
|
+
date: date.toDate(),
|
143
|
+
label: date.format('D')
|
144
|
+
};
|
145
|
+
});
|
146
|
+
}
|
147
|
+
getMonthViewItems(activeDate) {
|
148
|
+
return range(0, 12).map(i => {
|
149
|
+
const date = moment(activeDate).startOf('year').add(i, 'month');
|
150
|
+
return {
|
151
|
+
date: date.toDate(),
|
152
|
+
label: date.format('MMM')
|
153
|
+
};
|
154
|
+
});
|
155
|
+
}
|
156
|
+
getYearViewItems(activeDate) {
|
157
|
+
// 4x4 grid of years = 16 years
|
158
|
+
return range(0, 16).map(i => {
|
159
|
+
// Put the current active year at the beginning of the 3rd row.
|
160
|
+
const date = moment(activeDate).startOf('year').subtract(8, 'year').add(i, 'year');
|
161
|
+
return {
|
162
|
+
date: date.toDate(),
|
163
|
+
label: date.format('YYYY')
|
164
|
+
};
|
165
|
+
});
|
166
|
+
}
|
167
|
+
/** Returns true if the date is within the current calendar view */
|
168
|
+
isDateInView(date) {
|
169
|
+
if (!this.calendarItems.length) {
|
170
|
+
return false;
|
171
|
+
}
|
172
|
+
const viewStart = this.calendarItems[0].date;
|
173
|
+
const viewEnd = this.calendarItems[this.calendarItems.length - 1].date;
|
174
|
+
return date >= viewStart && date <= viewEnd;
|
175
|
+
}
|
176
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
177
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CalendarComponent, selector: "ec-calendar", inputs: { id: "id", selection: "selection", minDate: "minDate", maxDate: "maxDate" }, outputs: { selectionChange: "selectionChange", focusOutStart: "focusOutStart", focusOutEnd: "focusOutEnd" }, host: { properties: { "attr.id": "this.id" } }, usesOnChanges: true, ngImport: i0, template: "<header class=\"d-flex align-items-center mb-2\">\r\n <button id=\"{{id}}_prev_button\"\r\n class=\"mr-auto\"\r\n (click)=\"onPreviousClick()\"\r\n (keydown)=\"!disablePreviousButton ? onFirstItemKeydown($event) : undefined\"\r\n [disabled]=\"disablePreviousButton\">\r\n <i class=\"ec-icon icon-angle-down rotate-90\"></i>\r\n </button>\r\n\r\n <button *ngIf=\"view === 'day'\"\r\n id=\"{{id}}_month_button\"\r\n class=\"text-body-1 font-weight-bold\"\r\n (click)=\"onMonthClick()\"\r\n (keydown)=\"disablePreviousButton ? onFirstItemKeydown($event) : undefined\">\r\n {{month}}\r\n </button>\r\n\r\n <button *ngIf=\"view !== 'year'\"\r\n id=\"{{id}}_year_button\"\r\n class=\"text-body-1 font-weight-bold\"\r\n (click)=\"onYearClick()\"\r\n (keydown)=\"disablePreviousButton && view !== 'day' ? onFirstItemKeydown($event) : undefined\">\r\n {{year}}\r\n </button>\r\n\r\n <div id=\"{{id}}_year_range\"\r\n *ngIf=\"view === 'year'\"\r\n class=\"text-body-1 font-weight-bold\"\r\n [innerHTML]=\"yearRange\">\r\n </div>\r\n\r\n <button id=\"{{id}}_next_button\"\r\n class=\"ml-auto\"\r\n (click)=\"onNextClick()\"\r\n [disabled]=\"disableNextButton\"\r\n (keydown)=\"disablePreviousButton && view === 'year' ? onFirstItemKeydown($event) : undefined\">\r\n <i class=\"ec-icon icon-angle-down rotate-270\"></i>\r\n </button>\r\n</header>\r\n\r\n<ul class=\"px-1 {{view}}-view\">\r\n <ng-container *ngIf=\"view === 'day'\">\r\n <li *ngFor=\"let day of weekDays\"\r\n class=\"d-flex align-items-center justify-content-center text-heading-3\">\r\n {{day}}\r\n </li>\r\n </ng-container>\r\n\r\n <li *ngFor=\"let item of calendarItems; last as isLast; trackBy: calendarItemTrackByDate;\">\r\n <button id=\"{{id}}_item_{{item.date | date:'MM_dd_yyyy'}}\"\r\n ec-calendar-item\r\n [item]=\"item\"\r\n [activeDate]=\"activeDate\"\r\n [selection]=\"selection\"\r\n [view]=\"view\"\r\n (click)=\"onItemSelected(item)\"\r\n (keydown)=\"isLast ? onLastItemKeydown($event) : undefined\"\r\n [hidden]=\"item.date < minDate || item.date > maxDate\">\r\n </button>\r\n </li>\r\n</ul>", styles: [":host{display:inline-block}button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent}button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}button .ec-icon{flex:none}button .ec-icon+.label{flex:none;margin-left:.25rem}button.has-badge{padding-right:.0625rem}button:focus{outline:none;position:relative;z-index:1}button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);opacity:1;--ec-color-icon: var(--ec-color-hint-dark)}button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul{list-style:none;padding:0;margin:0;display:grid;align-items:stretch;justify-items:stretch}button[ec-calendar-item]{height:100%;width:100%}ul.day-view{grid-template-columns:repeat(7,2rem);grid-auto-rows:1.75rem;row-gap:.25rem}ul.month-view{grid-template-columns:repeat(3,4.67rem);grid-auto-rows:3.25rem;row-gap:.25rem}ul.year-view{grid-template-columns:repeat(4,3.5rem);grid-auto-rows:3.25rem;row-gap:.25rem}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalendarItemComponent, selector: "button[ec-calendar-item]", inputs: ["item", "activeDate", "selection", "view"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
178
|
+
}
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CalendarComponent, decorators: [{
|
180
|
+
type: Component,
|
181
|
+
args: [{ selector: 'ec-calendar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<header class=\"d-flex align-items-center mb-2\">\r\n <button id=\"{{id}}_prev_button\"\r\n class=\"mr-auto\"\r\n (click)=\"onPreviousClick()\"\r\n (keydown)=\"!disablePreviousButton ? onFirstItemKeydown($event) : undefined\"\r\n [disabled]=\"disablePreviousButton\">\r\n <i class=\"ec-icon icon-angle-down rotate-90\"></i>\r\n </button>\r\n\r\n <button *ngIf=\"view === 'day'\"\r\n id=\"{{id}}_month_button\"\r\n class=\"text-body-1 font-weight-bold\"\r\n (click)=\"onMonthClick()\"\r\n (keydown)=\"disablePreviousButton ? onFirstItemKeydown($event) : undefined\">\r\n {{month}}\r\n </button>\r\n\r\n <button *ngIf=\"view !== 'year'\"\r\n id=\"{{id}}_year_button\"\r\n class=\"text-body-1 font-weight-bold\"\r\n (click)=\"onYearClick()\"\r\n (keydown)=\"disablePreviousButton && view !== 'day' ? onFirstItemKeydown($event) : undefined\">\r\n {{year}}\r\n </button>\r\n\r\n <div id=\"{{id}}_year_range\"\r\n *ngIf=\"view === 'year'\"\r\n class=\"text-body-1 font-weight-bold\"\r\n [innerHTML]=\"yearRange\">\r\n </div>\r\n\r\n <button id=\"{{id}}_next_button\"\r\n class=\"ml-auto\"\r\n (click)=\"onNextClick()\"\r\n [disabled]=\"disableNextButton\"\r\n (keydown)=\"disablePreviousButton && view === 'year' ? onFirstItemKeydown($event) : undefined\">\r\n <i class=\"ec-icon icon-angle-down rotate-270\"></i>\r\n </button>\r\n</header>\r\n\r\n<ul class=\"px-1 {{view}}-view\">\r\n <ng-container *ngIf=\"view === 'day'\">\r\n <li *ngFor=\"let day of weekDays\"\r\n class=\"d-flex align-items-center justify-content-center text-heading-3\">\r\n {{day}}\r\n </li>\r\n </ng-container>\r\n\r\n <li *ngFor=\"let item of calendarItems; last as isLast; trackBy: calendarItemTrackByDate;\">\r\n <button id=\"{{id}}_item_{{item.date | date:'MM_dd_yyyy'}}\"\r\n ec-calendar-item\r\n [item]=\"item\"\r\n [activeDate]=\"activeDate\"\r\n [selection]=\"selection\"\r\n [view]=\"view\"\r\n (click)=\"onItemSelected(item)\"\r\n (keydown)=\"isLast ? onLastItemKeydown($event) : undefined\"\r\n [hidden]=\"item.date < minDate || item.date > maxDate\">\r\n </button>\r\n </li>\r\n</ul>", styles: [":host{display:inline-block}button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent}button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}button .ec-icon{flex:none}button .ec-icon+.label{flex:none;margin-left:.25rem}button.has-badge{padding-right:.0625rem}button:focus{outline:none;position:relative;z-index:1}button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);opacity:1;--ec-color-icon: var(--ec-color-hint-dark)}button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul{list-style:none;padding:0;margin:0;display:grid;align-items:stretch;justify-items:stretch}button[ec-calendar-item]{height:100%;width:100%}ul.day-view{grid-template-columns:repeat(7,2rem);grid-auto-rows:1.75rem;row-gap:.25rem}ul.month-view{grid-template-columns:repeat(3,4.67rem);grid-auto-rows:3.25rem;row-gap:.25rem}ul.year-view{grid-template-columns:repeat(4,3.5rem);grid-auto-rows:3.25rem;row-gap:.25rem}\n"] }]
|
182
|
+
}], ctorParameters: function () { return []; }, propDecorators: { id: [{
|
183
|
+
type: HostBinding,
|
184
|
+
args: ['attr.id']
|
185
|
+
}, {
|
186
|
+
type: Input
|
187
|
+
}], selection: [{
|
188
|
+
type: Input
|
189
|
+
}], selectionChange: [{
|
190
|
+
type: Output
|
191
|
+
}], minDate: [{
|
192
|
+
type: Input
|
193
|
+
}], maxDate: [{
|
194
|
+
type: Input
|
195
|
+
}], focusOutStart: [{
|
196
|
+
type: Output
|
197
|
+
}], focusOutEnd: [{
|
198
|
+
type: Output
|
199
|
+
}] } });
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQy9JLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQWlELDZCQUE2QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFRaEgsTUFBTSxPQUFPLGlCQUFpQjtJQTRDNUI7UUF6Q2dCLE9BQUUsR0FBVyxVQUFVLENBQUM7UUFFL0IsY0FBUyxHQUE2QixJQUFJLENBQUM7UUFDMUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUVoRSxZQUFPLEdBQVMsY0FBYyxDQUFDLGlCQUFpQixDQUFDO1FBQ2pELFlBQU8sR0FBUyxjQUFjLENBQUMsaUJBQWlCLENBQUM7UUFFaEQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUNsRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBVzFELCtEQUErRDtRQUN4RCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFLMUMsd0RBQXdEO1FBQ2pELFNBQUksR0FBaUIsS0FBSyxDQUFDO1FBUWxDLDhIQUE4SDtR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Q0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2RSxPQUFPLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQztJQUM5QyxDQUFDOytHQXZOVSxpQkFBaUI7bUdBQWpCLGlCQUFpQiwyVENaOUIsOHpFQTRESzs7NEZEaERRLGlCQUFpQjtrQkFON0IsU0FBUzsrQkFDRSxhQUFhLG1CQUdOLHVCQUF1QixDQUFDLE1BQU07MEVBSy9CLEVBQUU7c0JBRGpCLFdBQVc7dUJBQUMsU0FBUzs7c0JBQ3JCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUVFLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IERhdGVUaW1lSGVscGVyIH0gZnJvbSAnLi4vLi4vY29yZS9kYXRlLXRpbWUtaGVscGVyJztcclxuaW1wb3J0IHsgQ2FsZW5kYXJJdGVtLCBDYWxlbmRhclNlbGVjdGlvbiwgQ2FsZW5kYXJWaWV3LCBpc0NhbGVuZGFyU2VsZWN0aW9uU2luZ2xlRGF0ZSB9IGZyb20gJy4vY2FsZW5kYXIudHlwZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlYy1jYWxlbmRhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XHJcblxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgQElucHV0KCkgcHVibGljIGlkOiBzdHJpbmcgPSAnY2FsZW5kYXInO1xyXG5cclxuICBASW5wdXQoKSBzZWxlY3Rpb246IENhbGVuZGFyU2VsZWN0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJTZWxlY3Rpb24gfCBudWxsPigpO1xyXG5cclxuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlID0gRGF0ZVRpbWVIZWxwZXIubWluRGF0ZVBpY2tlckRhdGU7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZSA9IERhdGVUaW1lSGVscGVyLm1heERhdGVQaWNrZXJEYXRlO1xyXG5cclxuICBAT3V0cHV0KCkgZm9jdXNPdXRTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgZm9jdXNPdXRFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XHJcblxyXG4gIC8qKiBNb250aCBvZiB0aGUgYWN0aXZlIGRhdGUgZGlzcGxheWVkIGluIHRoZSBoZWFkZXIgYnV0dG9ucy4gKi9cclxuICBwdWJsaWMgbW9udGg/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBZZWFyIG9mIHRoZSBhY3RpdmUgZGF0ZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlciBidXR0b25zLiAqL1xyXG4gIHB1YmxpYyB5ZWFyPzogc3RyaW5nO1xyXG5cclxuICAvKiogUmFuZ2Ugb2YgeWVhcnMgdG8gZGlzcGxheSBpbiB0aGUgeWVhciB2aWV3LiAqL1xyXG4gIHB1YmxpYyB5ZWFyUmFuZ2U/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBBcnJheSBvZiBjYWxlbmRhciBpdGVtcyB0byBkaXNwbGF5IGluIHRoZSBjYWxlbmRhciBncmlkLiAqL1xyXG4gIHB1YmxpYyBjYWxlbmRhckl0ZW1zOiBDYWxlbmRhckl0ZW1bXSA9IFtdO1xyXG5cclxuICAvKiogV2Vla2RheSBsYWJlbHMgdG8gc2hvdyBhdCB0aGUgdG9wIG9mIHRoZSBjYWxlbmRhciBpbiBkYXkgdmlldy4gKi9cclxuICBwdWJsaWMgd2Vla0RheXM6IHN0cmluZ1tdO1xyXG5cclxuICAvKiogRGV0ZXJtaW5lcyB0aGUgY3VycmVudCB2aWV3IG1vZGUgb2YgdGhlIGNhbGVuZGFyLiAqL1xyXG4gIHB1YmxpYyB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcclxuXHJcbiAgLyoqIFxyXG4gICAqIFRyYWNrcyB0aGUgbW9udGggYW5kIHllYXIgYmVpbmcgdmlld2VkIGluIHRoZSBjYWxlbmRhci5cclxuICAgKiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlIHNlbGVjdGlvbiwgd2hpY2ggbWF5IGJlIG91dCBvZiB2aWV3LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhY3RpdmVEYXRlOiBEYXRlO1xyXG5cclxuICAvKiogVHJhY2tCeSBmdW5jdGlvbiBmb3IgdGhlIGNhbGVuZGFyIGl0ZW1zLiBUaGlzIGF2b2lkcyByZS1kcmF3aW5nIGNhbGVuZGFyIGl0ZW1zIGlmIGEgZGF0ZSBpcyBzaGFyZWQgYmV0d2VlbiB2aWV3IHVwZGF0ZXMgKi9cclxuICBjYWxlbmRhckl0ZW1UcmFja0J5RGF0ZSA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBDYWxlbmRhckl0ZW0pID0+IGl0ZW0uZGF0ZS50b0lTT1N0cmluZygpO1xyXG5cclxuICBwdWJsaWMgZGlzYWJsZVByZXZpb3VzQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGRpc2FibGVOZXh0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgLy8gQnkgZGVmYXVsdCwgdGhlIGFjdGl2ZSBkYXRlIGlzIHRvZGF5LlxyXG4gICAgLy8gVGhpcyBpcyByZXBsYWNlZCB3aXRoIHRoZSBkYXRlIG9mIHRoZSBzZWxlY3Rpb24gaWYgb25lIGlzIHByb3ZpZGVkIG9uIGluaXQuXHJcbiAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgLy8gVXNpbmcgbW9tZW50IGhlcmUgdG8gZ2V0IHRoZSB3ZWVrZGF5IGxhYmVscyBzbyB0aGV5IGFyZSBsb2NhbGl6ZWQuXHJcbiAgICB0aGlzLndlZWtEYXlzID0gbW9tZW50LndlZWtkYXlzU2hvcnQoKS5tYXAoZCA9PiBkLnNsaWNlKDAsIDEpKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnNlbGVjdGlvbiAmJiB0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAvLyBPbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSB2aWV3IGlmIHRoZSBzZWxlY3Rpb24gaXMgb3V0IG9mIHZpZXcuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBpc0NhbGVuZGFyU2VsZWN0aW9uU2luZ2xlRGF0ZSh0aGlzLnNlbGVjdGlvbikgJiZcclxuICAgICAgICAhdGhpcy5pc0RhdGVJblZpZXcodGhpcy5zZWxlY3Rpb24pICYmXHJcbiAgICAgICAgbW9tZW50KHRoaXMuc2VsZWN0aW9uKS5pc0JldHdlZW4odGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUsICdkYXknLCAnW10nKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmRyYXdDYWxlbmRhcignZGF5JywgdGhpcy5zZWxlY3Rpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFRPRE8gRUNBUC0yNjg0MTogZGV0ZXJtaW5lIHRoZSBhY3RpdmUgZGF0ZSBmb3IgYSByYW5nZSBzZWxlY3Rpb24gYW5kIGRyYXcgdGhlIGNhbGVuZGFyXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbGVuZGFySXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZHJhd0NhbGVuZGFyKCdkYXknKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkl0ZW1TZWxlY3RlZChpdGVtOiBDYWxlbmRhckl0ZW0pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnZpZXcgPT09ICdkYXknKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uID0gaXRlbS5kYXRlO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy52aWV3ID09PSAnbW9udGgnKSB7XHJcbiAgICAgIHRoaXMuZHJhd0NhbGVuZGFyKCdkYXknLCBpdGVtLmRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnZpZXcgPT09ICd5ZWFyJykge1xyXG4gICAgICB0aGlzLmRyYXdDYWxlbmRhcignbW9udGgnLCBpdGVtLmRhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTmV4dENsaWNrKCk6IHZvaWQge1xyXG4gICAgLy8gSWYgd2UncmUgaW4gZGF5IHZpZXcsIHdlJ3JlIGluY3JlbWVudGluZyBieSBtb250aFxyXG4gICAgLy8gSW4gYm90aCBtb250aCBhbmQgeWVhciB2aWV3cyB3ZSdyZSBpbmNyZW1lbnRpbmcgYnkgeWVhclxyXG4gICAgLy8gSW4geWVhciB2aWV3LCB3ZSdyZSBtb3ZpbmcgYnkgMTYgeWVhcnMgYXQgYSB0aW1lXHJcbiAgICBjb25zdCB1bml0ID0gdGhpcy52aWV3ID09PSAnZGF5JyA/ICdtb250aCcgOiAneWVhcic7XHJcbiAgICAvLyBJbiB5ZWFyIHZpZXcsIHdlJ3JlIG1vdmluZyBieSAxNiB5ZWFycyBhdCBhIHRpbWUuIE90aGVyd2lzZSB3ZSdyZSBqdXN0IG1vdmluZyBieSAxIG1vbnRoL3llYXIuXHJcbiAgICBjb25zdCBjb3VudCA9IHRoaXMudmlldyA9PT0gJ3llYXInID8gMTYgOiAxO1xyXG4gICAgY29uc3QgZ29Ub0RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoY291bnQsIHVuaXQpLnRvRGF0ZSgpO1xyXG4gICAgdGhpcy5kcmF3Q2FsZW5kYXIodGhpcy52aWV3LCBnb1RvRGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25QcmV2aW91c0NsaWNrKCk6IHZvaWQge1xyXG4gICAgLy8gSWYgd2UncmUgaW4gZGF5IHZpZXcsIHdlJ3JlIGluY3JlbWVudGluZyBieSBtb250aFxyXG4gICAgLy8gSW4gYm90aCBtb250aCBhbmQgeWVhciB2aWV3cyB3ZSdyZSBpbmNyZW1lbnRpbmcgeWVhcnNcclxuICAgIGNvbnN0IHVuaXQgPSB0aGlzLnZpZXcgPT09ICdkYXknID8gJ21vbnRoJyA6ICd5ZWFyJztcclxuICAgIC8vIEluIHllYXIgdmlldywgd2UncmUgbW92aW5nIGJ5IDE2IHllYXJzIGF0IGEgdGltZS4gT3RoZXJ3aXNlIHdlJ3JlIGp1c3QgbW92aW5nIGJ5IDEgbW9udGgveWVhci5cclxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy52aWV3ID09PSAneWVhcicgPyAxNiA6IDE7XHJcbiAgICBjb25zdCBnb1RvRGF0ZSA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLnN1YnRyYWN0KGNvdW50LCB1bml0KS50b0RhdGUoKTtcclxuICAgIHRoaXMuZHJhd0NhbGVuZGFyKHRoaXMudmlldywgZ29Ub0RhdGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN3aXRjaGVzIHRoZSBjYWxlbmRhciB0byBtb250aCB2aWV3LiAqL1xyXG4gIHB1YmxpYyBvbk1vbnRoQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYXdDYWxlbmRhcignbW9udGgnKTtcclxuICB9XHJcblxyXG4gIC8qKiBTd2l0Y2hlcyB0aGUgY2FsZW5kYXIgdG8geWVhciB2aWV3LiAqL1xyXG4gIHB1YmxpYyBvblllYXJDbGljaygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhd0NhbGVuZGFyKCd5ZWFyJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GaXJzdEl0ZW1LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBJZiB0aGUgdXNlciBpcyB0YWJiaW5nIGJhY2t3YXJkcyBmcm9tIHRoZSBmaXJzdCBpdGVtLCBlbWl0IHRoZSBmb2N1c091dFN0YXJ0IGV2ZW50LlxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgdGhpcy5mb2N1c091dFN0YXJ0LmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTGFzdEl0ZW1LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBJZiB0aGUgdXNlciBpcyB0YWJiaW5nIGZvcndhcmRzIGZyb20gdGhlIGxhc3QgaXRlbSwgZW1pdCB0aGUgZm9jdXNPdXRFbmQgZXZlbnQuXHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgdGhpcy5mb2N1c091dEVuZC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd0NhbGVuZGFyKHZpZXc6IENhbGVuZGFyVmlldywgZ29Ubz86IERhdGUpOiB2b2lkIHtcclxuICAgIC8vIElmIGEgZ29UbyBkYXRlIGlzIHByb3ZpZGVkLCB1cGRhdGUgdGhlIGFjdGl2ZSBkYXRlIHNvIHdlIGtub3cgd2hhdCB0byBpbmNyZW1lbnQgb24gbmV4dC9wcmV2aW91cyBjbGlja3MuXHJcbiAgICBpZiAoZ29Ubykge1xyXG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBnb1RvO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLm1vbnRoID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuZm9ybWF0KCdNTU0nKTtcclxuICAgIHRoaXMueWVhciA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLmZvcm1hdCgnWVlZWScpO1xyXG4gICAgdGhpcy52aWV3ID0gdmlldztcclxuICAgIHRoaXMuY2FsZW5kYXJJdGVtcyA9IHRoaXMuZ2V0Q2FsZW5kYXJJdGVtcyh2aWV3LCB0aGlzLmFjdGl2ZURhdGUpO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0WWVhciA9IHRoaXMuY2FsZW5kYXJJdGVtc1swXS5kYXRlIDwgdGhpcy5taW5EYXRlID8gdGhpcy5taW5EYXRlIDogdGhpcy5jYWxlbmRhckl0ZW1zWzBdLmRhdGU7XHJcbiAgICBjb25zdCBlbmRZZWFyID0gdGhpcy5jYWxlbmRhckl0ZW1zW3RoaXMuY2FsZW5kYXJJdGVtcy5sZW5ndGggLSAxXS5kYXRlID4gdGhpcy5tYXhEYXRlID8gdGhpcy5tYXhEYXRlIDogdGhpcy5jYWxlbmRhckl0ZW1zW3RoaXMuY2FsZW5kYXJJdGVtcy5sZW5ndGggLSAxXS5kYXRlO1xyXG4gICAgdGhpcy55ZWFyUmFuZ2UgPSBgJHttb21lbnQoc3RhcnRZZWFyKS5mb3JtYXQoJ1lZWVknKX0mbmRhc2g7JHttb21lbnQoZW5kWWVhcikuZm9ybWF0KCdZWVlZJyl9YDtcclxuXHJcbiAgICAvLyBJZiB0aGUgYWN0aXZlIGRhdGUgaXMgbGVzcyB0aGFuIHRoZSBtaW4gZGF0ZSBvciB0aGUgbWluIGRhdGUgaXMgaW4gdmlldywgZGlzYWJsZSB0aGUgcHJldmlvdXMgYnV0dG9uLlxyXG4gICAgaWYgKHRoaXMuYWN0aXZlRGF0ZSA8IHRoaXMubWluRGF0ZSB8fCB0aGlzLmlzRGF0ZUluVmlldyh0aGlzLm1pbkRhdGUpKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVByZXZpb3VzQnV0dG9uID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVByZXZpb3VzQnV0dG9uID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIGFjdGl2ZSBkYXRlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IGRhdGUgb3IgdGhlIG1heCBkYXRlIGlzIGluIHZpZXcsIGRpc2FibGUgdGhlIG5leHQgYnV0dG9uLlxyXG4gICAgaWYgKHRoaXMuYWN0aXZlRGF0ZSA+IHRoaXMubWF4RGF0ZSB8fCB0aGlzLmlzRGF0ZUluVmlldyh0aGlzLm1heERhdGUpKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZU5leHRCdXR0b24gPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNhYmxlTmV4dEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDYWxlbmRhckl0ZW1zKHZpZXc6IENhbGVuZGFyVmlldywgYWN0aXZlRGF0ZTogRGF0ZSk6IENhbGVuZGFySXRlbVtdIHtcclxuICAgIHN3aXRjaCAodmlldykge1xyXG4gICAgICBjYXNlICdkYXknOiByZXR1cm4gdGhpcy5nZXREYXlWaWV3SXRlbXMoYWN0aXZlRGF0ZSk7XHJcbiAgICAgIGNhc2UgJ21vbnRoJzogcmV0dXJuIHRoaXMuZ2V0TW9udGhWaWV3SXRlbXMoYWN0aXZlRGF0ZSk7XHJcbiAgICAgIGNhc2UgJ3llYXInOiByZXR1cm4gdGhpcy5nZXRZZWFyVmlld0l0ZW1zKGFjdGl2ZURhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXlWaWV3SXRlbXMoYWN0aXZlRGF0ZTogRGF0ZSk6IENhbGVuZGFySXRlbVtdIHtcclxuICAgIC8vIDYgcm93cyBvZiA3IGRheXMgPSA0MiBkYXlzXHJcbiAgICByZXR1cm4gcmFuZ2UoMCwgNDIpLm1hcChpID0+IHtcclxuICAgICAgLy8gVXNlIHRoZSBzdGFydCBvZiB0aGUgd2VlayBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC5cclxuICAgICAgLy8gVGhpcyBwYWRzIG91dCB0aGUgZmlyc3Qgd2VlayB3aXRoIGFueSBkYXlzIGZyb20gdGhlIHByZXZpb3VzIG1vbnRoLlxyXG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KGFjdGl2ZURhdGUpLnN0YXJ0T2YoJ21vbnRoJykuc3RhcnRPZignd2VlaycpLmFkZChpLCAnZGF5Jyk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0ZTogZGF0ZS50b0RhdGUoKSxcclxuICAgICAgICBsYWJlbDogZGF0ZS5mb3JtYXQoJ0QnKVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE1vbnRoVmlld0l0ZW1zKGFjdGl2ZURhdGU6IERhdGUpOiBDYWxlbmRhckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gcmFuZ2UoMCwgMTIpLm1hcChpID0+IHtcclxuICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudChhY3RpdmVEYXRlKS5zdGFydE9mKCd5ZWFyJykuYWRkKGksICdtb250aCcpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGU6IGRhdGUudG9EYXRlKCksXHJcbiAgICAgICAgbGFiZWw6IGRhdGUuZm9ybWF0KCdNTU0nKVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFllYXJWaWV3SXRlbXMoYWN0aXZlRGF0ZTogRGF0ZSk6IENhbGVuZGFySXRlbVtdIHtcclxuICAgIC8vIDR4NCBncmlkIG9mIHllYXJzID0gMTYgeWVhcnNcclxuICAgIHJldHVybiByYW5nZSgwLCAxNikubWFwKGkgPT4ge1xyXG4gICAgICAvLyBQdXQgdGhlIGN1cnJlbnQgYWN0aXZlIHllYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgM3JkIHJvdy5cclxuICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudChhY3RpdmVEYXRlKS5zdGFydE9mKCd5ZWFyJykuc3VidHJhY3QoOCwgJ3llYXInKS5hZGQoaSwgJ3llYXInKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBkYXRlOiBkYXRlLnRvRGF0ZSgpLFxyXG4gICAgICAgIGxhYmVsOiBkYXRlLmZvcm1hdCgnWVlZWScpXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRhdGUgaXMgd2l0aGluIHRoZSBjdXJyZW50IGNhbGVuZGFyIHZpZXcgKi9cclxuICBwcml2YXRlIGlzRGF0ZUluVmlldyhkYXRlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuY2FsZW5kYXJJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdTdGFydCA9IHRoaXMuY2FsZW5kYXJJdGVtc1swXS5kYXRlO1xyXG4gICAgY29uc3Qgdmlld0VuZCA9IHRoaXMuY2FsZW5kYXJJdGVtc1t0aGlzLmNhbGVuZGFySXRlbXMubGVuZ3RoIC0gMV0uZGF0ZTtcclxuICAgIHJldHVybiBkYXRlID49IHZpZXdTdGFydCAmJiBkYXRlIDw9IHZpZXdFbmQ7XHJcbiAgfVxyXG59XHJcbiIsIjxoZWFkZXIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICA8YnV0dG9uIGlkPVwie3tpZH19X3ByZXZfYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwibXItYXV0b1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25QcmV2aW91c0NsaWNrKClcIlxyXG4gICAgICAgICAgKGtleWRvd24pPVwiIWRpc2FibGVQcmV2aW91c0J1dHRvbiA/IG9uRmlyc3RJdGVtS2V5ZG93bigkZXZlbnQpIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlUHJldmlvdXNCdXR0b25cIj5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTkwXCI+PC9pPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uICpuZ0lmPVwidmlldyA9PT0gJ2RheSdcIlxyXG4gICAgICAgICAgaWQ9XCJ7e2lkfX1fbW9udGhfYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTEgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25Nb250aENsaWNrKClcIlxyXG4gICAgICAgICAgKGtleWRvd24pPVwiZGlzYWJsZVByZXZpb3VzQnV0dG9uID8gb25GaXJzdEl0ZW1LZXlkb3duKCRldmVudCkgOiB1bmRlZmluZWRcIj5cclxuICAgIHt7bW9udGh9fVxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uICpuZ0lmPVwidmlldyAhPT0gJ3llYXInXCJcclxuICAgICAgICAgIGlkPVwie3tpZH19X3llYXJfYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTEgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25ZZWFyQ2xpY2soKVwiXHJcbiAgICAgICAgICAoa2V5ZG93bik9XCJkaXNhYmxlUHJldmlvdXNCdXR0b24gJiYgdmlldyAhPT0gJ2RheScgPyBvbkZpcnN0SXRlbUtleWRvd24oJGV2ZW50KSA6IHVuZGVmaW5lZFwiPlxyXG4gICAge3t5ZWFyfX1cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGRpdiBpZD1cInt7aWR9fV95ZWFyX3JhbmdlXCJcclxuICAgICAgICpuZ0lmPVwidmlldyA9PT0gJ3llYXInXCJcclxuICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTEgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICBbaW5uZXJIVE1MXT1cInllYXJSYW5nZVwiPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8YnV0dG9uIGlkPVwie3tpZH19X25leHRfYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwibWwtYXV0b1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25OZXh0Q2xpY2soKVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZU5leHRCdXR0b25cIlxyXG4gICAgICAgICAgKGtleWRvd24pPVwiZGlzYWJsZVByZXZpb3VzQnV0dG9uICYmIHZpZXcgPT09ICd5ZWFyJyA/IG9uRmlyc3RJdGVtS2V5ZG93bigkZXZlbnQpIDogdW5kZWZpbmVkXCI+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS0yNzBcIj48L2k+XHJcbiAgPC9idXR0b24+XHJcbjwvaGVhZGVyPlxyXG5cclxuPHVsIGNsYXNzPVwicHgtMSB7e3ZpZXd9fS12aWV3XCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXcgPT09ICdkYXknXCI+XHJcbiAgICA8bGkgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiXHJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgdGV4dC1oZWFkaW5nLTNcIj5cclxuICAgICAge3tkYXl9fVxyXG4gICAgPC9saT5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNhbGVuZGFySXRlbXM7IGxhc3QgYXMgaXNMYXN0OyB0cmFja0J5OiBjYWxlbmRhckl0ZW1UcmFja0J5RGF0ZTtcIj5cclxuICAgIDxidXR0b24gaWQ9XCJ7e2lkfX1faXRlbV97e2l0ZW0uZGF0ZSB8IGRhdGU6J01NX2RkX3l5eXknfX1cIlxyXG4gICAgICAgICAgICBlYy1jYWxlbmRhci1pdGVtXHJcbiAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICBbYWN0aXZlRGF0ZV09XCJhY3RpdmVEYXRlXCJcclxuICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICBbdmlld109XCJ2aWV3XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbVNlbGVjdGVkKGl0ZW0pXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwiaXNMYXN0ID8gb25MYXN0SXRlbUtleWRvd24oJGV2ZW50KSA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiaXRlbS5kYXRlIDwgbWluRGF0ZSB8fCBpdGVtLmRhdGUgPiBtYXhEYXRlXCI+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2xpPlxyXG48L3VsPiJdfQ==
|
@@ -1,4 +1,4 @@
|
|
1
|
-
export function isCalendarSelectionSingleDate(selection) {
|
2
|
-
return selection instanceof Date;
|
3
|
-
}
|
1
|
+
export function isCalendarSelectionSingleDate(selection) {
|
2
|
+
return selection instanceof Date;
|
3
|
+
}
|
4
4
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvY2FsZW5kYXIvY2FsZW5kYXIudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxVQUFVLDZCQUE2QixDQUFDLFNBQW9DO0lBQ2hGLE9BQU8sU0FBUyxZQUFZLElBQUksQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2FsZW5kYXJJdGVtID0ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgZGF0ZTogRGF0ZTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIENhbGVuZGFyU2VsZWN0aW9uID0gRGF0ZSB8IFtEYXRlLCBEYXRlXTtcclxuXHJcbmV4cG9ydCB0eXBlIENhbGVuZGFyVmlldyA9ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0NhbGVuZGFyU2VsZWN0aW9uU2luZ2xlRGF0ZShzZWxlY3Rpb24/OiBDYWxlbmRhclNlbGVjdGlvbiB8IG51bGwpOiBzZWxlY3Rpb24gaXMgRGF0ZSB7XHJcbiAgcmV0dXJuIHNlbGVjdGlvbiBpbnN0YW5jZW9mIERhdGU7XHJcbn1cclxuIl19
|