@energycap/components 0.31.5 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/energycap-components.min.css +2 -2
- package/energycap-email.min.css +1 -1
- package/esm2020/energycap-components.mjs +5 -0
- package/esm2020/lib/components.module.mjs +386 -0
- package/esm2020/lib/controls/banner/banner.component.mjs +106 -0
- package/esm2020/lib/controls/button/button.component.mjs +106 -0
- package/esm2020/lib/controls/button/copy-button.directive.mjs +65 -0
- package/esm2020/lib/controls/checkbox/checkbox.component.mjs +139 -0
- package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
- package/esm2020/lib/controls/combobox/combobox.component.mjs +841 -0
- package/esm2020/lib/controls/dropdown/dropdown.component.mjs +237 -0
- package/esm2020/lib/controls/file-upload/file-upload.component.mjs +169 -0
- package/esm2020/lib/controls/form-control/form-control.component.mjs +86 -0
- package/esm2020/lib/controls/form-control-base.mjs +143 -0
- package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
- package/esm2020/lib/controls/form-group/form-group.component.mjs +252 -0
- package/esm2020/lib/controls/help-popover/help-popover.component.mjs +28 -0
- package/esm2020/lib/controls/item-picker/item-picker.component.mjs +233 -0
- package/esm2020/lib/controls/link-button/link-button.component.mjs +11 -0
- package/esm2020/lib/controls/menu/menu.component.mjs +443 -0
- package/{esm2015/lib/controls/navigation/link-item.js → esm2020/lib/controls/navigation/link-item.mjs} +0 -0
- package/{esm2015/lib/controls/navigation/nav-group.js → esm2020/lib/controls/navigation/nav-group.mjs} +0 -0
- package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
- package/{esm2015/lib/controls/navigation/nav-item.js → esm2020/lib/controls/navigation/nav-item.mjs} +0 -0
- package/esm2020/lib/controls/numericbox/numericbox.component.mjs +371 -0
- package/esm2020/lib/controls/popover/popover.component.mjs +84 -0
- package/{esm2015/lib/controls/radio-button/radio-button-option.js → esm2020/lib/controls/radio-button/radio-button-option.mjs} +0 -0
- package/esm2020/lib/controls/radio-button/radio-button.component.mjs +81 -0
- package/esm2020/lib/controls/select/select.component.mjs +87 -0
- package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
- package/esm2020/lib/controls/textbox/textbox.component.mjs +154 -0
- package/{esm2015/lib/core/cache.service.js → esm2020/lib/core/cache.service.mjs} +9 -8
- package/{esm2015/lib/core/custom-validators.js → esm2020/lib/core/custom-validators.mjs} +0 -0
- package/{esm2015/lib/core/date-time-helper.js → esm2020/lib/core/date-time-helper.mjs} +0 -0
- package/esm2020/lib/core/error.service.mjs +57 -0
- package/esm2020/lib/core/scroll.service.mjs +89 -0
- package/esm2020/lib/core/telemetry-tracker.service.mjs +16 -0
- package/esm2020/lib/core/telemetry.service.mjs +38 -0
- package/esm2020/lib/core/validation-message.service.mjs +181 -0
- package/{esm2015/lib/core/validation-patterns.js → esm2020/lib/core/validation-patterns.mjs} +0 -0
- package/esm2020/lib/core/window.service.mjs +182 -0
- package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
- package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
- package/{esm2015/lib/display/avatar/avatar.service.js → esm2020/lib/display/avatar/avatar.service.mjs} +9 -7
- package/esm2020/lib/display/confirm/confirm.component.mjs +131 -0
- package/{esm2015/lib/display/dialog/dialog-content.js → esm2020/lib/display/dialog/dialog-content.mjs} +0 -0
- package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
- package/{esm2015/lib/display/dialog/dialog-types.js → esm2020/lib/display/dialog/dialog-types.mjs} +0 -0
- package/esm2020/lib/display/dialog/dialog.component.mjs +242 -0
- package/esm2020/lib/display/dialog/dialog.service.mjs +71 -0
- package/{esm2015/lib/display/help/help-types.js → esm2020/lib/display/help/help-types.mjs} +0 -0
- package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +106 -0
- package/{esm2015/lib/display/hierarchy/hierarchy-mocks.spec.js → esm2020/lib/display/hierarchy/hierarchy-mocks.spec.mjs} +5 -9
- package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +59 -0
- package/esm2020/lib/display/item-display/item-display.component.mjs +67 -0
- package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
- package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
- package/esm2020/lib/display/resizable/resizable.component.mjs +57 -0
- package/esm2020/lib/display/spinner/spinner.component.mjs +12 -0
- package/esm2020/lib/display/splash/splash.component.mjs +42 -0
- package/esm2020/lib/display/splash/splash.service.mjs +35 -0
- package/esm2020/lib/display/table/resizable-column.component.mjs +20 -0
- package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
- package/esm2020/lib/display/table/searchable-table.component.mjs +338 -0
- package/esm2020/lib/display/table/table-detail-row.component.mjs +27 -0
- package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
- package/esm2020/lib/display/table/table-master-header-row.component.mjs +11 -0
- package/esm2020/lib/display/table/table-master-row.component.mjs +150 -0
- package/esm2020/lib/display/table/table-pagination.component.mjs +150 -0
- package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
- package/esm2020/lib/display/table/table.component.mjs +244 -0
- package/esm2020/lib/display/tags/tag.mjs +15 -0
- package/esm2020/lib/display/tags/tags.component.mjs +77 -0
- package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
- package/{esm2015/lib/display/toast/toast-types.js → esm2020/lib/display/toast/toast-types.mjs} +0 -0
- package/esm2020/lib/display/toast/toast.service.mjs +35 -0
- package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
- package/esm2020/lib/display/tooltip/tooltip.component.mjs +25 -0
- package/esm2020/lib/display/tooltip/tooltip.service.mjs +63 -0
- package/esm2020/lib/display/tree/tree.component.mjs +125 -0
- package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
- package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
- package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
- package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
- package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
- package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
- package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +48 -0
- package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
- package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
- package/{esm2015/lib/shared/display.js → esm2020/lib/shared/display.mjs} +0 -0
- package/esm2020/lib/shared/form-group.helper.mjs +67 -0
- package/{esm2015/lib/shared/json-helper.js → esm2020/lib/shared/json-helper.mjs} +0 -0
- package/{esm2015/lib/shared/lodash-helper.js → esm2020/lib/shared/lodash-helper.mjs} +0 -0
- package/esm2020/lib/shared/page/page-base/page-base.component.mjs +339 -0
- package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs} +0 -0
- package/esm2020/lib/shared/page/page-title/page-title.component.mjs +23 -0
- package/esm2020/lib/shared/page/page-view/page-view.component.mjs +121 -0
- package/{esm2015/lib/shared/testing/hierarchy-base-test-injector-factory.spec.js → esm2020/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs} +0 -0
- package/esm2020/lib/shared/testing/page-base-component-test-helper.spec.mjs +30 -0
- package/{esm2015/lib/shared/testing/page-base-component-test-injector-factory.spec.js → esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs} +0 -0
- package/esm2020/lib/shared/testing/public-mocks.spec.mjs +132 -0
- package/{esm2015/lib/shared/testing/spy-factory.spec.js → esm2020/lib/shared/testing/spy-factory.spec.mjs} +0 -0
- package/{esm2015/lib/shared/testing/translation-mocks.spec.js → esm2020/lib/shared/testing/translation-mocks.spec.mjs} +0 -0
- package/esm2020/lib/shared/user-preference.service.mjs +17 -0
- package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
- package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
- package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/energycap-components.mjs +10090 -0
- package/fesm2015/energycap-components.mjs.map +1 -0
- package/fesm2020/energycap-components.mjs +9999 -0
- package/fesm2020/energycap-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components.module.d.ts +72 -0
- package/lib/controls/banner/banner.component.d.ts +3 -0
- package/lib/controls/button/button.component.d.ts +3 -0
- package/lib/controls/button/copy-button.directive.d.ts +3 -0
- package/lib/controls/checkbox/checkbox.component.d.ts +3 -0
- package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +3 -0
- package/lib/controls/combobox/combobox.component.d.ts +5 -2
- package/lib/controls/dropdown/dropdown.component.d.ts +3 -0
- package/lib/controls/file-upload/file-upload.component.d.ts +5 -2
- package/lib/controls/form-control/form-control.component.d.ts +3 -0
- package/lib/controls/form-control-base.d.ts +3 -0
- package/lib/controls/form-control-label/form-control-label.component.d.ts +3 -0
- package/lib/controls/form-group/form-group.component.d.ts +6 -3
- package/lib/controls/help-popover/help-popover.component.d.ts +3 -0
- package/lib/controls/item-picker/item-picker.component.d.ts +5 -2
- package/lib/controls/link-button/link-button.component.d.ts +3 -0
- package/lib/controls/menu/menu.component.d.ts +3 -0
- package/lib/controls/navigation/nav-item-active.directive.d.ts +3 -0
- package/lib/controls/numericbox/numericbox.component.d.ts +5 -2
- package/lib/controls/popover/popover.component.d.ts +3 -0
- package/lib/controls/radio-button/radio-button.component.d.ts +3 -0
- package/lib/controls/select/select.component.d.ts +3 -0
- package/lib/controls/tabs/tabs.component.d.ts +3 -0
- package/lib/controls/textbox/textbox.component.d.ts +3 -0
- package/lib/core/cache.service.d.ts +3 -0
- package/lib/core/error.service.d.ts +3 -0
- package/lib/core/scroll.service.d.ts +3 -0
- package/lib/core/telemetry-tracker.service.d.ts +3 -0
- package/lib/core/telemetry.service.d.ts +3 -0
- package/lib/core/validation-message.service.d.ts +3 -0
- package/lib/core/window.service.d.ts +3 -0
- package/lib/display/app-bar/app-bar.component.d.ts +3 -0
- package/lib/display/avatar/avatar.component.d.ts +3 -0
- package/lib/display/avatar/avatar.service.d.ts +3 -0
- package/lib/display/confirm/confirm.component.d.ts +5 -2
- package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +3 -0
- package/lib/display/dialog/dialog.component.d.ts +3 -0
- package/lib/display/dialog/dialog.service.d.ts +3 -0
- package/lib/display/hierarchy/hierarchy-base.d.ts +3 -0
- package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +3 -0
- package/lib/display/item-display/item-display.component.d.ts +3 -0
- package/lib/display/json-display/json-display.component.d.ts +5 -2
- package/lib/display/resizable/resizable-base.d.ts +3 -0
- package/lib/display/resizable/resizable.component.d.ts +3 -0
- package/lib/display/spinner/spinner.component.d.ts +3 -0
- package/lib/display/splash/splash.component.d.ts +3 -0
- package/lib/display/splash/splash.service.d.ts +3 -0
- package/lib/display/table/resizable-column.component.d.ts +3 -0
- package/lib/display/table/resizable-table.directive.d.ts +3 -0
- package/lib/display/table/searchable-table.component.d.ts +6 -3
- package/lib/display/table/table-detail-row.component.d.ts +3 -0
- package/lib/display/table/table-locked-column.component.d.ts +3 -0
- package/lib/display/table/table-master-header-row.component.d.ts +3 -0
- package/lib/display/table/table-master-row.component.d.ts +3 -0
- package/lib/display/table/table-pagination.component.d.ts +3 -0
- package/lib/display/table/table-selectable-row.component.d.ts +5 -2
- package/lib/display/table/table.component.d.ts +3 -0
- package/lib/display/tags/tags.component.d.ts +3 -0
- package/lib/display/toast/toast/toast.component.d.ts +3 -0
- package/lib/display/toast/toast.service.d.ts +3 -0
- package/lib/display/toast/toaster/toaster.component.d.ts +3 -0
- package/lib/display/tooltip/tooltip.component.d.ts +3 -0
- package/lib/display/tooltip/tooltip.service.d.ts +3 -0
- package/lib/display/tree/tree.component.d.ts +3 -0
- package/lib/display/view-overlay/view-overlay.component.d.ts +3 -0
- package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +3 -0
- package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +3 -0
- package/lib/shared/directives/popup/popup-container.directive.d.ts +3 -0
- package/lib/shared/display/pipes/date-display.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/highlight-text.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/relative-date.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/row-count.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/time-display.pipe.d.ts +3 -0
- package/lib/shared/form-group.helper.d.ts +5 -2
- package/lib/shared/page/page-base/page-base.component.d.ts +5 -2
- package/lib/shared/page/page-title/page-title.component.d.ts +3 -0
- package/lib/shared/page/page-view/page-view.component.d.ts +3 -0
- package/lib/shared/testing/public-mocks.spec.d.ts +7 -0
- package/lib/shared/user-preference.service.d.ts +3 -0
- package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +3 -0
- package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +3 -0
- package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +3 -0
- package/package.json +27 -15
- package/src/styles/_functions.scss +6 -4
- package/src/styles/_icons.scss +1 -1
- package/src/styles/mixins/_control-base.scss +2 -2
- package/src/styles/mixins/_form-control-base.scss +3 -1
- package/src/styles/mixins/_spinner-base.scss +3 -1
- package/bundles/energycap-components.umd.js +0 -10646
- package/bundles/energycap-components.umd.js.map +0 -1
- package/bundles/energycap-components.umd.min.js +0 -17
- package/bundles/energycap-components.umd.min.js.map +0 -1
- package/energycap-components.d.ts +0 -7
- package/energycap-components.metadata.json +0 -1
- package/esm2015/energycap-components.js +0 -8
- package/esm2015/lib/components.module.js +0 -238
- package/esm2015/lib/controls/banner/banner.component.js +0 -94
- package/esm2015/lib/controls/button/button.component.js +0 -89
- package/esm2015/lib/controls/button/copy-button.directive.js +0 -63
- package/esm2015/lib/controls/checkbox/checkbox.component.js +0 -137
- package/esm2015/lib/controls/collapsible-toggle/collapsible-toggle.component.js +0 -35
- package/esm2015/lib/controls/combobox/combobox.component.js +0 -819
- package/esm2015/lib/controls/dropdown/dropdown.component.js +0 -207
- package/esm2015/lib/controls/file-upload/file-upload.component.js +0 -172
- package/esm2015/lib/controls/form-control/form-control.component.js +0 -65
- package/esm2015/lib/controls/form-control-base.js +0 -140
- package/esm2015/lib/controls/form-control-label/form-control-label.component.js +0 -139
- package/esm2015/lib/controls/form-group/form-group.component.js +0 -254
- package/esm2015/lib/controls/help-popover/help-popover.component.js +0 -22
- package/esm2015/lib/controls/item-picker/item-picker.component.js +0 -216
- package/esm2015/lib/controls/link-button/link-button.component.js +0 -12
- package/esm2015/lib/controls/menu/menu.component.js +0 -424
- package/esm2015/lib/controls/navigation/nav-item-active.directive.js +0 -86
- package/esm2015/lib/controls/numericbox/numericbox.component.js +0 -362
- package/esm2015/lib/controls/popover/popover.component.js +0 -85
- package/esm2015/lib/controls/radio-button/radio-button.component.js +0 -78
- package/esm2015/lib/controls/select/select.component.js +0 -89
- package/esm2015/lib/controls/tabs/tabs.component.js +0 -42
- package/esm2015/lib/controls/textbox/textbox.component.js +0 -149
- package/esm2015/lib/core/error.service.js +0 -56
- package/esm2015/lib/core/scroll.service.js +0 -88
- package/esm2015/lib/core/telemetry-tracker.service.js +0 -14
- package/esm2015/lib/core/telemetry.service.js +0 -40
- package/esm2015/lib/core/validation-message.service.js +0 -185
- package/esm2015/lib/core/window.service.js +0 -191
- package/esm2015/lib/display/app-bar/app-bar.component.js +0 -42
- package/esm2015/lib/display/avatar/avatar.component.js +0 -73
- package/esm2015/lib/display/confirm/confirm.component.js +0 -127
- package/esm2015/lib/display/dialog/dialog-group/dialog-group.component.js +0 -65
- package/esm2015/lib/display/dialog/dialog.component.js +0 -229
- package/esm2015/lib/display/dialog/dialog.service.js +0 -69
- package/esm2015/lib/display/hierarchy/hierarchy-base.js +0 -106
- package/esm2015/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.js +0 -58
- package/esm2015/lib/display/item-display/item-display.component.js +0 -57
- package/esm2015/lib/display/json-display/json-display.component.js +0 -44
- package/esm2015/lib/display/resizable/resizable-base.js +0 -119
- package/esm2015/lib/display/resizable/resizable.component.js +0 -57
- package/esm2015/lib/display/spinner/spinner.component.js +0 -12
- package/esm2015/lib/display/splash/splash.component.js +0 -45
- package/esm2015/lib/display/splash/splash.service.js +0 -34
- package/esm2015/lib/display/table/resizable-column.component.js +0 -23
- package/esm2015/lib/display/table/resizable-table.directive.js +0 -223
- package/esm2015/lib/display/table/searchable-table.component.js +0 -303
- package/esm2015/lib/display/table/table-detail-row.component.js +0 -21
- package/esm2015/lib/display/table/table-locked-column.component.js +0 -53
- package/esm2015/lib/display/table/table-master-header-row.component.js +0 -11
- package/esm2015/lib/display/table/table-master-row.component.js +0 -141
- package/esm2015/lib/display/table/table-pagination.component.js +0 -146
- package/esm2015/lib/display/table/table-selectable-row.component.js +0 -216
- package/esm2015/lib/display/table/table.component.js +0 -210
- package/esm2015/lib/display/tags/tag.js +0 -15
- package/esm2015/lib/display/tags/tags.component.js +0 -73
- package/esm2015/lib/display/toast/toast/toast.component.js +0 -70
- package/esm2015/lib/display/toast/toast.service.js +0 -34
- package/esm2015/lib/display/toast/toaster/toaster.component.js +0 -117
- package/esm2015/lib/display/tooltip/tooltip.component.js +0 -24
- package/esm2015/lib/display/tooltip/tooltip.service.js +0 -64
- package/esm2015/lib/display/tree/tree.component.js +0 -100
- package/esm2015/lib/display/view-overlay/view-overlay.component.js +0 -50
- package/esm2015/lib/shared/directives/click-area-for/click-area-for.directive.js +0 -25
- package/esm2015/lib/shared/directives/if-viewport-width/if-viewport-width.directive.js +0 -112
- package/esm2015/lib/shared/directives/popup/popup-container.directive.js +0 -160
- package/esm2015/lib/shared/display/pipes/date-display.pipe.js +0 -49
- package/esm2015/lib/shared/display/pipes/highlight-text.pipe.js +0 -26
- package/esm2015/lib/shared/display/pipes/relative-date.pipe.js +0 -49
- package/esm2015/lib/shared/display/pipes/row-count.pipe.js +0 -47
- package/esm2015/lib/shared/display/pipes/time-display.pipe.js +0 -40
- package/esm2015/lib/shared/form-group.helper.js +0 -65
- package/esm2015/lib/shared/page/page-base/page-base.component.js +0 -356
- package/esm2015/lib/shared/page/page-title/page-title.component.js +0 -19
- package/esm2015/lib/shared/page/page-view/page-view.component.js +0 -94
- package/esm2015/lib/shared/testing/page-base-component-test-helper.spec.js +0 -35
- package/esm2015/lib/shared/testing/public-mocks.spec.js +0 -126
- package/esm2015/lib/shared/user-preference.service.js +0 -15
- package/esm2015/lib/shared/wizard/wizard-base/wizard-base.component.js +0 -260
- package/esm2015/lib/shared/wizard/wizard-buttons/wizard-buttons.component.js +0 -54
- package/esm2015/lib/shared/wizard/wizard-progress/wizard-progress.component.js +0 -18
- package/fesm2015/energycap-components.js +0 -9638
- package/fesm2015/energycap-components.js.map +0 -1
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
import { Component, ElementRef, Input, Renderer2, ViewChild } from '@angular/core';
|
|
2
|
-
import { FormControl, Validators } from "@angular/forms";
|
|
3
|
-
import { debounceTime, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { ValidationMessageService } from '../../core/validation-message.service';
|
|
5
|
-
import { getDecimalPattern, integerPattern } from '../../core/validation-patterns';
|
|
6
|
-
import { FormGroupHelper } from '../../shared/form-group.helper';
|
|
7
|
-
import { FormControlBase } from "../form-control-base";
|
|
8
|
-
import { TextboxComponent } from '../textbox/textbox.component';
|
|
9
|
-
/**
|
|
10
|
-
* Custom validator to check that min/max and pattern validation is met on the numericbox
|
|
11
|
-
* component
|
|
12
|
-
*/
|
|
13
|
-
export const numericboxValidation = (min, max, decimals, maxPrecisionDigits) => {
|
|
14
|
-
return (control) => {
|
|
15
|
-
let hasError = false;
|
|
16
|
-
// If the control is empty we won't attempt to validate, if there is a required
|
|
17
|
-
// validator we will never get here until there is a value
|
|
18
|
-
if (control.value && control.value !== "") {
|
|
19
|
-
let numericPattern;
|
|
20
|
-
if (decimals && decimals > 0) {
|
|
21
|
-
numericPattern = getDecimalPattern(decimals);
|
|
22
|
-
}
|
|
23
|
-
else if (maxPrecisionDigits) {
|
|
24
|
-
// Still need to check for a valid number formatting when in max precision mode
|
|
25
|
-
numericPattern = getDecimalPattern(maxPrecisionDigits);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
// Allow an optional negative sign and any number of digits 0-9
|
|
29
|
-
numericPattern = integerPattern;
|
|
30
|
-
}
|
|
31
|
-
if (!numericPattern.test(control.value)) {
|
|
32
|
-
hasError = true;
|
|
33
|
-
}
|
|
34
|
-
else if (maxPrecisionDigits) {
|
|
35
|
-
// Converting to a number then back to string removes trailing zeros, and the regex replace removes
|
|
36
|
-
// any negative signs, leading zeros or decimal points from the number.
|
|
37
|
-
const val = Number(control.value).toString().replace(/^-?/, '').replace(/(^0\.)|(\.)/, '');
|
|
38
|
-
hasError = val.length > maxPrecisionDigits;
|
|
39
|
-
}
|
|
40
|
-
// We now know we have a valid number, so we can cast these to numbers
|
|
41
|
-
// for proper range validation
|
|
42
|
-
if (min !== undefined && Number(control.value) < min) {
|
|
43
|
-
hasError = true;
|
|
44
|
-
}
|
|
45
|
-
if (max !== undefined && Number(control.value) > max) {
|
|
46
|
-
hasError = true;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
if (hasError) {
|
|
50
|
-
return {
|
|
51
|
-
numericbox: {
|
|
52
|
-
valid: false,
|
|
53
|
-
min: min,
|
|
54
|
-
max: max,
|
|
55
|
-
decimals: decimals,
|
|
56
|
-
maxPrecisionDigits: maxPrecisionDigits
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
};
|
|
65
|
-
export class NumericboxComponent extends FormControlBase {
|
|
66
|
-
constructor(validationMessageService, formGroupHelper, renderer) {
|
|
67
|
-
super(validationMessageService, formGroupHelper);
|
|
68
|
-
this.validationMessageService = validationMessageService;
|
|
69
|
-
this.formGroupHelper = formGroupHelper;
|
|
70
|
-
this.renderer = renderer;
|
|
71
|
-
/**
|
|
72
|
-
* Show trailing zeros after the decimal point.
|
|
73
|
-
* Do not use with maxPrecisionDigits.
|
|
74
|
-
*/
|
|
75
|
-
this.showPrecision = false;
|
|
76
|
-
/**
|
|
77
|
-
* If set to true this will update the form model after a debounce as the user
|
|
78
|
-
* interacts with the component
|
|
79
|
-
*/
|
|
80
|
-
this.autoUpdateFormModel = false;
|
|
81
|
-
/** Flag to tell the page we finally computed a greater than zero
|
|
82
|
-
* width for units (if applicable)
|
|
83
|
-
*/
|
|
84
|
-
this.unitsWidthCalculated = false;
|
|
85
|
-
/** Flag used to filter the form models value changes subscription
|
|
86
|
-
* to prevent the textbox model from being formatted as the form model is updated
|
|
87
|
-
* programmatically when the textbox model updates
|
|
88
|
-
*/
|
|
89
|
-
this.autoUpdatingFormModel = false;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Angular AfterViewInit life-cycle hook
|
|
93
|
-
* Subscribe to textbox model value changes if the hosting
|
|
94
|
-
* page has opted in for this component
|
|
95
|
-
*/
|
|
96
|
-
ngAfterViewInit() {
|
|
97
|
-
if (this.autoUpdateFormModel) {
|
|
98
|
-
this.textboxFormModel.valueChanges
|
|
99
|
-
.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.componentDestroyed)).subscribe(() => {
|
|
100
|
-
this.updateFormModelValue();
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Angular onChanges life-cycle hook
|
|
106
|
-
* @see {@link https://angular.io/guide/lifecycle-hooks | Life-cycle hooks}
|
|
107
|
-
*/
|
|
108
|
-
ngOnChanges(changes) {
|
|
109
|
-
// If either units change after we've calculated,
|
|
110
|
-
// reset the flag so we can react and redraw
|
|
111
|
-
if (changes.rightUnits || changes.leftUnits) {
|
|
112
|
-
this.unitsWidthCalculated = false;
|
|
113
|
-
}
|
|
114
|
-
super.ngOnChanges(changes);
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Angular onInit lifecycle hook
|
|
118
|
-
* If units is defined, set the position and listen for status changes so we
|
|
119
|
-
* can update the positioning of the units element
|
|
120
|
-
*/
|
|
121
|
-
ngOnInit() {
|
|
122
|
-
super.ngOnInit();
|
|
123
|
-
// Initialize the textbox form model with the value of the form model and synchronize
|
|
124
|
-
// disabled state
|
|
125
|
-
this.textboxFormModel = new FormControl({ value: this.formModel.value, disabled: this.formModel.disabled });
|
|
126
|
-
// Update the form model's errors when the textbox form model status changes
|
|
127
|
-
this.textboxFormModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
|
|
128
|
-
if (this.formModel.enabled) {
|
|
129
|
-
this.formModel.setErrors(this.textboxFormModel.errors);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
// Synchronize disabled state between form model and internal textbox form model
|
|
133
|
-
this.formModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
|
|
134
|
-
if (this.formModel.disabled) {
|
|
135
|
-
this.textboxFormModel.disable();
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
if (this.textboxFormModel.disabled) {
|
|
139
|
-
this.textboxFormModel.enable();
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
// Set textbox validators
|
|
144
|
-
this.textboxFormModel.setValidators(this.getValidators());
|
|
145
|
-
// Now that the textbox is set up we will set it's value to whatever the
|
|
146
|
-
// form model had when we initialized
|
|
147
|
-
this.textboxFormModel.setValue(this.formatDisplayNumber(this.formModel.value));
|
|
148
|
-
// If the form model's value changes programmatically we need to update the
|
|
149
|
-
// textbox form model
|
|
150
|
-
this.formModel.valueChanges.pipe(
|
|
151
|
-
// We need to filter out when we are updating it programmatically if the
|
|
152
|
-
// hosting page has opted into the auto updating input
|
|
153
|
-
filter(() => !this.autoUpdatingFormModel), takeUntil(this.componentDestroyed)).subscribe(value => {
|
|
154
|
-
this.textboxFormModel.setValue(this.formatDisplayNumber(value));
|
|
155
|
-
});
|
|
156
|
-
// If the textbox status changes we need to update the left units position because
|
|
157
|
-
// we want to make room for the invalid icon
|
|
158
|
-
if (this.leftUnits) {
|
|
159
|
-
this.textboxFormModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
|
|
160
|
-
this.positionLeftUnits();
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Angular afterViewChecked lifecycle hook
|
|
166
|
-
* Show the units element if units is defined. Runs after every ngOnChanges
|
|
167
|
-
*/
|
|
168
|
-
ngAfterViewChecked() {
|
|
169
|
-
if ((this.leftUnits || this.rightUnits) && !this.unitsWidthCalculated) {
|
|
170
|
-
this.showUnits();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Function that builds and returns a ValidatorFn array to set on the form control
|
|
175
|
-
*/
|
|
176
|
-
getValidators() {
|
|
177
|
-
let validators = [];
|
|
178
|
-
if (this.required) {
|
|
179
|
-
validators.push(Validators.required);
|
|
180
|
-
}
|
|
181
|
-
validators.push(numericboxValidation(this.min, this.max, this.decimals, this.maxPrecisionDigits));
|
|
182
|
-
return validators;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Focus out event handler for the Textbox component
|
|
186
|
-
*/
|
|
187
|
-
onFocusOut() {
|
|
188
|
-
this.updateFormModelValue(true);
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Function to set focus on an input programatically after the page
|
|
192
|
-
* had been rendered. The highlight text flag will select the text
|
|
193
|
-
* within the input if passed in and true
|
|
194
|
-
*/
|
|
195
|
-
setFocus(highlightText) {
|
|
196
|
-
this.textboxInput.setFocus(highlightText);
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* When the textbox model updates we need to add some display formatting for
|
|
200
|
-
* display in the textbox and cast the textbox model to a number. Avoid updating
|
|
201
|
-
* the form model when the value doesn't change because listeners will fire for no reason
|
|
202
|
-
*/
|
|
203
|
-
updateFormModelValue(isFocusOut) {
|
|
204
|
-
if (this.autoUpdateFormModel) {
|
|
205
|
-
// Make it so value changes on the form model do not get triggered
|
|
206
|
-
// as we change it programmatically. We do not want the textbox
|
|
207
|
-
// model to be updated while the user is in the input
|
|
208
|
-
this.autoUpdatingFormModel = true;
|
|
209
|
-
}
|
|
210
|
-
try {
|
|
211
|
-
if (this.textboxFormModel.valid || this.textboxFormModel.value === "") {
|
|
212
|
-
// Start out with null for the number, if the textbox value is not a number
|
|
213
|
-
// we will clear it out on focus out
|
|
214
|
-
let number = null;
|
|
215
|
-
// Make sure the textbox model is a number before trying to update the
|
|
216
|
-
// form model value with it
|
|
217
|
-
if (this.textboxFormModel.value && !isNaN(this.textboxFormModel.value)) {
|
|
218
|
-
// Our value is a legit number, on focus out we will format it if needed
|
|
219
|
-
number = Number(this.textboxFormModel.value);
|
|
220
|
-
// Checking if the value has actually changed, if not don't set the
|
|
221
|
-
// value to avoid extra listener calls
|
|
222
|
-
if (this.formModel.value !== number) {
|
|
223
|
-
this.formModel.setValue(number);
|
|
224
|
-
}
|
|
225
|
-
// The textbox model is not a number, check to see if our form model has a value
|
|
226
|
-
// and if so clear it out
|
|
227
|
-
}
|
|
228
|
-
else if (this.formModel.value !== null) {
|
|
229
|
-
this.formModel.setValue(null);
|
|
230
|
-
}
|
|
231
|
-
// We only will update the textbox form model with formatting if needed
|
|
232
|
-
// on Focus out. This works well for the user whether the auto update
|
|
233
|
-
// is opted in or not
|
|
234
|
-
if (isFocusOut) {
|
|
235
|
-
this.textboxFormModel.setValue(this.formatDisplayNumber(number));
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
this.formModel.markAsTouched();
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
// Nothing to display, just ensuring we reset our flag that filters
|
|
242
|
-
// the form model value changes
|
|
243
|
-
}
|
|
244
|
-
finally {
|
|
245
|
-
this.autoUpdatingFormModel = false;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Convert a number value to the formmated display string. If there is no value
|
|
250
|
-
* return null
|
|
251
|
-
*/
|
|
252
|
-
formatDisplayNumber(value) {
|
|
253
|
-
if (value || value === 0) {
|
|
254
|
-
// Guard against calling toFixed if the value isn't a number. This is possible
|
|
255
|
-
// if patching a value from outside of the component as you don't have
|
|
256
|
-
// type checking there
|
|
257
|
-
if (this.showPrecision && this.decimals && !isNaN(value)) {
|
|
258
|
-
return value.toFixed(this.decimals);
|
|
259
|
-
}
|
|
260
|
-
else {
|
|
261
|
-
return value.toString();
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
return null;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Position the units element and set the padding in the textbox input based
|
|
270
|
-
* on the width of the units element
|
|
271
|
-
*/
|
|
272
|
-
positionRightUnits() {
|
|
273
|
-
let unitsEl = this.textboxEl.nativeElement.querySelector('.units-right');
|
|
274
|
-
let inputEl = this.textboxEl.nativeElement.querySelector('input');
|
|
275
|
-
if (unitsEl && inputEl) {
|
|
276
|
-
let unitsWidth = unitsEl.offsetWidth;
|
|
277
|
-
if (unitsWidth > 0) {
|
|
278
|
-
this.unitsWidthCalculated = true;
|
|
279
|
-
}
|
|
280
|
-
let padding = unitsWidth;
|
|
281
|
-
this.renderer.setStyle(inputEl, 'padding-right', padding + 'px');
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
positionLeftUnits() {
|
|
285
|
-
let unitsEl = this.textboxEl.nativeElement.querySelector('.units-left');
|
|
286
|
-
let inputEl = this.textboxEl.nativeElement.querySelector('input');
|
|
287
|
-
if (unitsEl && inputEl) {
|
|
288
|
-
let unitsWidth = unitsEl.offsetWidth;
|
|
289
|
-
if (unitsWidth > 0) {
|
|
290
|
-
this.unitsWidthCalculated = true;
|
|
291
|
-
}
|
|
292
|
-
let padding = unitsWidth;
|
|
293
|
-
let leftPosition = getComputedStyle(unitsEl).left;
|
|
294
|
-
if (leftPosition) {
|
|
295
|
-
padding += parseInt(leftPosition.replace('px', ''), 0);
|
|
296
|
-
}
|
|
297
|
-
this.renderer.setStyle(inputEl, 'padding-left', padding + 'px');
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Create and append the units element to the textbox element
|
|
302
|
-
*/
|
|
303
|
-
showUnits() {
|
|
304
|
-
let inputWrapper = this.textboxEl.nativeElement.querySelector('.input-wrapper');
|
|
305
|
-
if (inputWrapper) {
|
|
306
|
-
if (this.leftUnits) {
|
|
307
|
-
let unitsEl = this.textboxEl.nativeElement.querySelector('.units-left');
|
|
308
|
-
if (unitsEl) {
|
|
309
|
-
this.renderer.setProperty(unitsEl, 'innerHTML', this.leftUnits);
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
this.renderer.appendChild(inputWrapper, this.makeUnitElement('left', this.leftUnits));
|
|
313
|
-
}
|
|
314
|
-
this.positionLeftUnits();
|
|
315
|
-
}
|
|
316
|
-
if (this.rightUnits) {
|
|
317
|
-
let unitsEl = this.textboxEl.nativeElement.querySelector('.units-right');
|
|
318
|
-
if (unitsEl) {
|
|
319
|
-
this.renderer.setProperty(unitsEl, 'innerHTML', this.rightUnits);
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
this.renderer.appendChild(inputWrapper, this.makeUnitElement('right', this.rightUnits));
|
|
323
|
-
}
|
|
324
|
-
this.positionRightUnits();
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
makeUnitElement(side, text) {
|
|
329
|
-
let unitsEl = this.renderer.createElement('span');
|
|
330
|
-
this.renderer.setAttribute(unitsEl, 'class', `units units-${side}`);
|
|
331
|
-
this.renderer.setAttribute(unitsEl, 'id', `${this.id}_units`);
|
|
332
|
-
this.renderer.setAttribute(unitsEl, 'style', 'pointer-events: none');
|
|
333
|
-
this.renderer.setProperty(unitsEl, 'innerHTML', text);
|
|
334
|
-
return unitsEl;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
NumericboxComponent.decorators = [
|
|
338
|
-
{ type: Component, args: [{
|
|
339
|
-
selector: 'ec-numericbox',
|
|
340
|
-
template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n <label *ngIf=\"label\"\r\n ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\">{{validationErrors | translate}}</span>\r\n </label>\r\n <!-- Setting the maxlength to 13 to combat the user from entering too large of a number\r\n for javascript to support. If the user enters all 13 characters as numbers and we have showPrecision set, adding the\r\n decimal and the empty zero characters will get them in a situation where to edit it they must remove characters\r\n as we would push them past the limit -->\r\n <ec-textbox [id]=\"id\"\r\n #textbox\r\n class=\"control-input mb-0\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"maxPrecisionDigits ? maxPrecisionDigits + 3 : 13\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n [tooltip]=\"tooltip\"\r\n (focusout)=\"onFocusOut()\">\r\n </ec-textbox>\r\n</div>\r\n",
|
|
341
|
-
styles: [":root{--ec-color-icon:rgba(26,26,35,0.66);--ec-font-size-icon:1rem}@-webkit-keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{color:var(--ec-color-primary-dark);display:block;font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{display:flex;flex-direction:column;width:100%}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-bottom:0;margin-top:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;background-clip:border-box;background-color:rgba(26,26,35,.12);background-image:none;border-color:transparent;color:var(--ec-color-primary-dark);opacity:1;overflow:hidden;pointer-events:none;user-select:none;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-position:.25rem;background-repeat:no-repeat;background-size:1rem,1rem;padding-left:1.5rem}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:not(:focus),:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-background-color-caution)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-color-caution)}:host .textbox-group{display:flex;position:relative}:host input:focus,:host select:focus,:host textarea:focus{outline:none}label{color:var(--ec-color-secondary-dark);display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label)/2) 0}ec-textbox ::ng-deep .input-wrapper{position:relative}ec-textbox ::ng-deep input{text-align:right}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left,ec-textbox ::ng-deep input:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-color-secondary-dark);opacity:.65}ec-textbox ::ng-deep .units{color:var(--ec-color-primary-dark);display:block;font-family:var(--ec-font-family);font-size:var(--ec-font-size-body);height:2rem;line-height:1.25;padding:.375rem .25rem;position:absolute;top:1px;z-index:2}ec-textbox ::ng-deep .units.units-right{padding-right:.5rem;right:0}ec-textbox ::ng-deep .units.units-left{left:0;padding-left:.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid{background-color:var(--ec-background-color-caution);background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M20.21 20.21h-8.42L10.95 0h10.1l-.84 20.21zm-8.42 3.37h8.42V32h-8.42z\"/></svg>');background-position:.25rem;background-repeat:no-repeat;background-size:1rem,1rem;padding-left:1.5rem}.control.invalid ec-textbox ::ng-deep input.ng-invalid:not(:focus),.control.invalid ec-textbox ::ng-deep input.ng-valid:not(:focus){border-color:var(--ec-color-caution)}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.units-left,.control.invalid ec-textbox ::ng-deep input.ng-valid~.units-left{left:1.25rem}"]
|
|
342
|
-
},] }
|
|
343
|
-
];
|
|
344
|
-
NumericboxComponent.ctorParameters = () => [
|
|
345
|
-
{ type: ValidationMessageService },
|
|
346
|
-
{ type: FormGroupHelper },
|
|
347
|
-
{ type: Renderer2 }
|
|
348
|
-
];
|
|
349
|
-
NumericboxComponent.propDecorators = {
|
|
350
|
-
placeholder: [{ type: Input }],
|
|
351
|
-
decimals: [{ type: Input }],
|
|
352
|
-
showPrecision: [{ type: Input }],
|
|
353
|
-
maxPrecisionDigits: [{ type: Input }],
|
|
354
|
-
max: [{ type: Input }],
|
|
355
|
-
min: [{ type: Input }],
|
|
356
|
-
leftUnits: [{ type: Input }],
|
|
357
|
-
rightUnits: [{ type: Input }],
|
|
358
|
-
autoUpdateFormModel: [{ type: Input }],
|
|
359
|
-
textboxEl: [{ type: ViewChild, args: [TextboxComponent, { read: ElementRef, static: true },] }],
|
|
360
|
-
textboxInput: [{ type: ViewChild, args: ['textbox', { static: true },] }]
|
|
361
|
-
};
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpY2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbnVtZXJpY2JveC9udW1lcmljYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1DLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFnQyxTQUFTLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSyxPQUFPLEVBQW1CLFdBQVcsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdoRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQXVCLEVBQUUsR0FBdUIsRUFBRSxRQUE0QixFQUFFLGtCQUFzQyxFQUFlLEVBQUU7SUFDeEssT0FBTyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtRQUNoQyxJQUFJLFFBQVEsR0FBWSxLQUFLLENBQUM7UUFFOUIsK0VBQStFO1FBQy9FLDBEQUEwRDtRQUMxRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7WUFFdkMsSUFBSSxjQUFzQixD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LEtBQUs7NEJBT0wsS0FBSztpQ0FTTCxLQUFLO2tCQVVMLEtBQUs7a0JBVUwsS0FBSzt3QkFNTCxLQUFLO3lCQU1MLEtBQUs7a0NBTUwsS0FBSzt3QkFLTCxTQUFTLFNBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7MkJBc0I5RCxTQUFTLFNBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3ZhbGlkYXRpb24tbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZ2V0RGVjaW1hbFBhdHRlcm4sIGludGVnZXJQYXR0ZXJuIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLXBhdHRlcm5zJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwSGVscGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Zvcm0tZ3JvdXAuaGVscGVyJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xCYXNlIH0gZnJvbSBcIi4uL2Zvcm0tY29udHJvbC1iYXNlXCI7XHJcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50JztcclxuXHJcblxyXG4vKipcclxuICogQ3VzdG9tIHZhbGlkYXRvciB0byBjaGVjayB0aGF0IG1pbi9tYXggYW5kIHBhdHRlcm4gdmFsaWRhdGlvbiBpcyBtZXQgb24gdGhlIG51bWVyaWNib3hcclxuICogY29tcG9uZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbnVtZXJpY2JveFZhbGlkYXRpb24gPSAobWluOiBudW1iZXIgfCB1bmRlZmluZWQsIG1heDogbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWNpbWFsczogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXhQcmVjaXNpb25EaWdpdHM6IG51bWJlciB8IHVuZGVmaW5lZCk6IFZhbGlkYXRvckZuID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgICAgbGV0IGhhc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBjb250cm9sIGlzIGVtcHR5IHdlIHdvbid0IGF0dGVtcHQgdG8gdmFsaWRhdGUsIGlmIHRoZXJlIGlzIGEgcmVxdWlyZWRcclxuICAgICAgICAvLyB2YWxpZGF0b3Igd2Ugd2lsbCBuZXZlciBnZXQgaGVyZSB1bnRpbCB0aGVyZSBpcyBhIHZhbHVlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgY29udHJvbC52YWx1ZSAhPT0gXCJcIikge1xyXG5cclxuICAgICAgICAgICAgbGV0IG51bWVyaWNQYXR0ZXJuOiBSZWdFeHA7XHJcbiAgICAgICAgICAgIGlmIChkZWNpbWFscyAmJiBkZWNpbWFscyA+IDApIHtcclxuICAgICAgICAgICAgICAgIG51bWVyaWNQYXR0ZXJuID0gZ2V0RGVjaW1hbFBhdHRlcm4oZGVjaW1hbHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1heFByZWNpc2lvbkRpZ2l0cykge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RpbGwgbmVlZCB0byBjaGVjayBmb3IgYSB2YWxpZCBudW1iZXIgZm9ybWF0dGluZyB3aGVuIGluIG1heCBwcmVjaXNpb24gbW9kZVxyXG4gICAgICAgICAgICAgICAgbnVtZXJpY1BhdHRlcm4gPSBnZXREZWNpbWFsUGF0dGVybihtYXhQcmVjaXNpb25EaWdpdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQWxsb3cgYW4gb3B0aW9uYWwgbmVnYXRpdmUgc2lnbiBhbmQgYW55IG51bWJlciBvZiBkaWdpdHMgMC05XHJcbiAgICAgICAgICAgICAgICBudW1lcmljUGF0dGVybiA9IGludGVnZXJQYXR0ZXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIW51bWVyaWNQYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhQcmVjaXNpb25EaWdpdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRpbmcgdG8gYSBudW1iZXIgdGhlbiBiYWNrIHRvIHN0cmluZyByZW1vdmVzIHRyYWlsaW5nIHplcm9zLCBhbmQgdGhlIHJlZ2V4IHJlcGxhY2UgcmVtb3Zlc1xyXG4gICAgICAgICAgICAgICAgLy8gYW55IG5lZ2F0aXZlIHNpZ25zLCBsZWFkaW5nIHplcm9zIG9yIGRlY2ltYWwgcG9pbnRzIGZyb20gdGhlIG51bWJlci5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IE51bWJlcihjb250cm9sLnZhbHVlKS50b1N0cmluZygpLnJlcGxhY2UoL14tPy8sICcnKS5yZXBsYWNlKC8oXjBcXC4pfChcXC4pLywgJycpO1xyXG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB2YWwubGVuZ3RoID4gbWF4UHJlY2lzaW9uRGlnaXRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBub3cga25vdyB3ZSBoYXZlIGEgdmFsaWQgbnVtYmVyLCBzbyB3ZSBjYW4gY2FzdCB0aGVzZSB0byBudW1iZXJzXHJcbiAgICAgICAgICAgIC8vIGZvciBwcm9wZXIgcmFuZ2UgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyKGNvbnRyb2wudmFsdWUpIDwgbWluKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiBOdW1iZXIoY29udHJvbC52YWx1ZSkgPiBtYXgpIHtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhhc0Vycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBudW1lcmljYm94OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbjogbWluLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heDogbWF4LFxyXG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWxzOiBkZWNpbWFscyxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQcmVjaXNpb25EaWdpdHM6IG1heFByZWNpc2lvbkRpZ2l0c1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZWMtbnVtZXJpY2JveCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbnVtZXJpY2JveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9udW1lcmljYm94LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOdW1lcmljYm94Q29tcG9uZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0ZXh0Ym94IGlucHV0J3MgcGxhY2Vob2xkZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBkZWNpbWFscyBhbGxvd2VkLiAgSWYgbm90IHN1cHBsaWVkIHRoZSBpbnB1dCB2YWx1ZSB3aWxsIGJlIHZhbGlkYXRlZCBhcyBhXHJcbiAgICAgKiB3aG9sZSBudW1iZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGRlY2ltYWxzPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgdHJhaWxpbmcgemVyb3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuXHJcbiAgICAgKiBEbyBub3QgdXNlIHdpdGggbWF4UHJlY2lzaW9uRGlnaXRzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1ByZWNpc2lvbj86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWF4aW11bSB0b3RhbCBkaWdpdHMgYSBudW1iZXIgY2FuIGhhdmUgbGVmdCBvciByaWdodCBvZiB0aGUgZGVjaW1hbCBwb2ludC5cclxuICAgICAqIER1ZSB0byBsaW1pdGF0aW9ucyB3aXRoIGhvdyBKUyBoYW5kbGVzIG51bWJlcnMsIHRoZSBtYXggdmFsdWUgZm9yIHRoaXMgaXMgMTUuXHJcbiAgICAgKiBOdW1iZXJzIGxvbmdlciB0aGFuIDE1IGRpZ2l0cyBtYXkgY2F1c2Ugcm91bmRpbmcgZXJyb3JzLlxyXG4gICAgICogRG8gbm90IHVzZSB3aXRoIHNob3dQcmVjaXNpb24gPSB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhQcmVjaXNpb25EaWdpdHM/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZCBpbiB0aGUgaW5wdXRcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGZvciBhZGRpbmcgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCB0byBnZXQgdGhlIGJyb3dzZXIgZnVuY3Rpb25hbGl0eVxyXG4gICAgICogZnJvbSB0aGUgaW5wdXQuICBJZiB5b3UgbmVlZCB0aGUgZm9ybSB0byBiZSB2YWxpZGF0ZWQgYmVmb3JlIHN1Ym1pc3Npb24sIGFwcGx5IHRoZVxyXG4gICAgICogbWF4IHZhbGlkYXRvciB0byB0aGUgZm9ybSBjb25yb2wuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXg/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZCBpbiB0aGUgaW5wdXRcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGZvciBhZGRpbmcgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCB0byBnZXQgdGhlIGJyb3dzZXIgZnVuY3Rpb25hbGl0eVxyXG4gICAgICogZnJvbSB0aGUgaW5wdXQuICBJZiB5b3UgbmVlZCB0aGUgZm9ybSB0byBiZSB2YWxpZGF0ZWQgYmVmb3JlIHN1Ym1pc3Npb24sIGFwcGx5IHRoZVxyXG4gICAgICogbWluIHZhbGlkYXRvciB0byB0aGUgZm9ybSBjb25yb2wuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW4/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBkaXNwbGF5IG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGlucHV0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsZWZ0VW5pdHM/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBkaXNwbGF5IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcmlnaHRVbml0cz86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHNldCB0byB0cnVlIHRoaXMgd2lsbCB1cGRhdGUgdGhlIGZvcm0gbW9kZWwgYWZ0ZXIgYSBkZWJvdW5jZSBhcyB0aGUgdXNlclxyXG4gICAgICogaW50ZXJhY3RzIHdpdGggdGhlIGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b1VwZGF0ZUZvcm1Nb2RlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHRleHRib3ggZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFRleHRib3hDb21wb25lbnQsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdGV4dGJveEVsITogRWxlbWVudFJlZjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW50ZXJuYWwgZm9ybSBtb2RlbCB3ZSB1c2UgdG8gZGlzcGxheSB0aGUgdmFsdWUgd2l0aCBmb3JtYXR0aW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0ZXh0Ym94Rm9ybU1vZGVsITogRm9ybUNvbnRyb2w7XHJcblxyXG4gICAgLyoqIEZsYWcgdG8gdGVsbCB0aGUgcGFnZSB3ZSBmaW5hbGx5IGNvbXB1dGVkIGEgZ3JlYXRlciB0aGFuIHplcm9cclxuICAgICAqICB3aWR0aCBmb3IgdW5pdHMgKGlmIGFwcGxpY2FibGUpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdW5pdHNXaWR0aENhbGN1bGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogRmxhZyB1c2VkIHRvIGZpbHRlciB0aGUgZm9ybSBtb2RlbHMgdmFsdWUgY2hhbmdlcyBzdWJzY3JpcHRpb25cclxuICAgICAqICB0byBwcmV2ZW50IHRoZSB0ZXh0Ym94IG1vZGVsIGZyb20gYmVpbmcgZm9ybWF0dGVkIGFzIHRoZSBmb3JtIG1vZGVsIGlzIHVwZGF0ZWRcclxuICAgICAqICBwcm9ncmFtbWF0aWNhbGx5IHdoZW4gdGhlIHRleHRib3ggbW9kZWwgdXBkYXRlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGF1dG9VcGRhdGluZ0Zvcm1Nb2RlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgdGV4dGJveCBpbnB1dCBjb250cm9sXHJcbiAgICovXHJcbiAgICBAVmlld0NoaWxkKCd0ZXh0Ym94JywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSB0ZXh0Ym94SW5wdXQhOiBUZXh0Ym94Q29tcG9uZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2U6IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSxcclxuICAgICAgICBwcm90ZWN0ZWQgZm9ybUdyb3VwSGVscGVyOiBGb3JtR3JvdXBIZWxwZXIsXHJcbiAgICAgICAgcHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjJcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKHZhbGlkYXRpb25NZXNzYWdlU2VydmljZSwgZm9ybUdyb3VwSGVscGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuZ3VsYXIgQWZ0ZXJWaWV3SW5pdCBsaWZlLWN5Y2xlIGhvb2tcclxuICAgICAqIFN1YnNjcmliZSB0byB0ZXh0Ym94IG1vZGVsIHZhbHVlIGNoYW5nZXMgaWYgdGhlIGhvc3RpbmdcclxuICAgICAqIHBhZ2UgaGFzIG9wdGVkIGluIGZvciB0aGlzIGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVGb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpLFxyXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuZ3VsYXIgb25DaGFuZ2VzIGxpZmUtY3ljbGUgaG9va1xyXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rcyB8IExpZmUtY3ljbGUgaG9va3N9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgLy8gSWYgZWl0aGVyIHVuaXRzIGNoYW5nZSBhZnRlciB3ZSd2ZSBjYWxjdWxhdGVkLFxyXG4gICAgICAgIC8vIHJlc2V0IHRoZSBmbGFnIHNvIHdlIGNhbiByZWFjdCBhbmQgcmVkcmF3XHJcbiAgICAgICAgaWYgKGNoYW5nZXMucmlnaHRVbml0cyB8fCBjaGFuZ2VzLmxlZnRVbml0cykge1xyXG4gICAgICAgICAgICB0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIG9uSW5pdCBsaWZlY3ljbGUgaG9va1xyXG4gICAgICogSWYgdW5pdHMgaXMgZGVmaW5lZCwgc2V0IHRoZSBwb3NpdGlvbiBhbmQgbGlzdGVuIGZvciBzdGF0dXMgY2hhbmdlcyBzbyB3ZVxyXG4gICAgICogY2FuIHVwZGF0ZSB0aGUgcG9zaXRpb25pbmcgb2YgdGhlIHVuaXRzIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRib3ggZm9ybSBtb2RlbCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBtb2RlbCBhbmQgc3luY2hyb25pemVcclxuICAgICAgICAvLyBkaXNhYmxlZCBzdGF0ZVxyXG4gICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbCA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB0aGlzLmZvcm1Nb2RlbC52YWx1ZSwgZGlzYWJsZWQ6IHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkIH0pO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGZvcm0gbW9kZWwncyBlcnJvcnMgd2hlbiB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHN0YXR1cyBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtTW9kZWwuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8gU3luY2hyb25pemUgZGlzYWJsZWQgc3RhdGUgYmV0d2VlbiBmb3JtIG1vZGVsIGFuZCBpbnRlcm5hbCB0ZXh0Ym94IGZvcm0gbW9kZWxcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lbmFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGV4dGJveCB2YWxpZGF0b3JzXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbGlkYXRvcnModGhpcy5nZXRWYWxpZGF0b3JzKCkpO1xyXG5cclxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgdGV4dGJveCBpcyBzZXQgdXAgd2Ugd2lsbCBzZXQgaXQncyB2YWx1ZSB0byB3aGF0ZXZlciB0aGVcclxuICAgICAgICAvLyBmb3JtIG1vZGVsIGhhZCB3aGVuIHdlIGluaXRpYWxpemVkXHJcbiAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKHRoaXMuZm9ybWF0RGlzcGxheU51bWJlcih0aGlzLmZvcm1Nb2RlbC52YWx1ZSkpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgZm9ybSBtb2RlbCdzIHZhbHVlIGNoYW5nZXMgcHJvZ3JhbW1hdGljYWxseSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGVcclxuICAgICAgICAvLyB0ZXh0Ym94IGZvcm0gbW9kZWxcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaWx0ZXIgb3V0IHdoZW4gd2UgYXJlIHVwZGF0aW5nIGl0IHByb2dyYW1tYXRpY2FsbHkgaWYgdGhlXHJcbiAgICAgICAgICAgIC8vIGhvc3RpbmcgcGFnZSBoYXMgb3B0ZWQgaW50byB0aGUgYXV0byB1cGRhdGluZyBpbnB1dFxyXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuYXV0b1VwZGF0aW5nRm9ybU1vZGVsKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdERpc3BsYXlOdW1iZXIodmFsdWUpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSB0ZXh0Ym94IHN0YXR1cyBjaGFuZ2VzIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBsZWZ0IHVuaXRzIHBvc2l0aW9uIGJlY2F1c2VcclxuICAgICAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGludmFsaWQgaWNvblxyXG4gICAgICAgIGlmICh0aGlzLmxlZnRVbml0cykge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFVuaXRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIGFmdGVyVmlld0NoZWNrZWQgbGlmZWN5Y2xlIGhvb2tcclxuICAgICAqIFNob3cgdGhlIHVuaXRzIGVsZW1lbnQgaWYgdW5pdHMgaXMgZGVmaW5lZC4gUnVucyBhZnRlciBldmVyeSBuZ09uQ2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgodGhpcy5sZWZ0VW5pdHMgfHwgdGhpcy5yaWdodFVuaXRzKSAmJiAhdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dVbml0cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRoYXQgYnVpbGRzIGFuZCByZXR1cm5zIGEgVmFsaWRhdG9yRm4gYXJyYXkgdG8gc2V0IG9uIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xyXG4gICAgICAgIGxldCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChudW1lcmljYm94VmFsaWRhdGlvbih0aGlzLm1pbiwgdGhpcy5tYXgsIHRoaXMuZGVjaW1hbHMsIHRoaXMubWF4UHJlY2lzaW9uRGlnaXRzKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgb3V0IGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBUZXh0Ym94IGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Gb2N1c091dCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbFZhbHVlKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGdW5jdGlvbiB0byBzZXQgZm9jdXMgb24gYW4gaW5wdXQgcHJvZ3JhbWF0aWNhbGx5IGFmdGVyIHRoZSBwYWdlXHJcbiAgICAqIGhhZCBiZWVuIHJlbmRlcmVkLiAgVGhlIGhpZ2hsaWdodCB0ZXh0IGZsYWcgd2lsbCBzZWxlY3QgdGhlIHRleHRcclxuICAgICogd2l0aGluIHRoZSBpbnB1dCBpZiBwYXNzZWQgaW4gYW5kIHRydWVcclxuICAgICovXHJcbiAgICBwdWJsaWMgc2V0Rm9jdXMoaGlnaGxpZ2h0VGV4dD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRleHRib3hJbnB1dC5zZXRGb2N1cyhoaWdobGlnaHRUZXh0KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRoZSB0ZXh0Ym94IG1vZGVsIHVwZGF0ZXMgd2UgbmVlZCB0byBhZGQgc29tZSBkaXNwbGF5IGZvcm1hdHRpbmcgZm9yXHJcbiAgICAgKiBkaXNwbGF5IGluIHRoZSB0ZXh0Ym94IGFuZCBjYXN0IHRoZSB0ZXh0Ym94IG1vZGVsIHRvIGEgbnVtYmVyLiBBdm9pZCB1cGRhdGluZ1xyXG4gICAgICogdGhlIGZvcm0gbW9kZWwgd2hlbiB0aGUgdmFsdWUgZG9lc24ndCBjaGFuZ2UgYmVjYXVzZSBsaXN0ZW5lcnMgd2lsbCBmaXJlIGZvciBubyByZWFzb25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVGb3JtTW9kZWxWYWx1ZShpc0ZvY3VzT3V0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVGb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgLy8gTWFrZSBpdCBzbyB2YWx1ZSBjaGFuZ2VzIG9uIHRoZSBmb3JtIG1vZGVsIGRvIG5vdCBnZXQgdHJpZ2dlcmVkXHJcbiAgICAgICAgICAgIC8vIGFzIHdlIGNoYW5nZSBpdCBwcm9ncmFtbWF0aWNhbGx5LiAgV2UgZG8gbm90IHdhbnQgdGhlIHRleHRib3hcclxuICAgICAgICAgICAgLy8gbW9kZWwgdG8gYmUgdXBkYXRlZCB3aGlsZSB0aGUgdXNlciBpcyBpbiB0aGUgaW5wdXRcclxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWxpZCB8fCB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG91dCB3aXRoIG51bGwgZm9yIHRoZSBudW1iZXIsIGlmIHRoZSB0ZXh0Ym94IHZhbHVlIGlzIG5vdCBhIG51bWJlclxyXG4gICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBjbGVhciBpdCBvdXQgb24gZm9jdXMgb3V0XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRleHRib3ggbW9kZWwgaXMgYSBudW1iZXIgYmVmb3JlIHRyeWluZyB0byB1cGRhdGUgdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBmb3JtIG1vZGVsIHZhbHVlIHdpdGggaXRcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgJiYgIWlzTmFOKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdXIgdmFsdWUgaXMgYSBsZWdpdCBudW1iZXIsIG9uIGZvY3VzIG91dCB3ZSB3aWxsIGZvcm1hdCBpdCBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBOdW1iZXIodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBpZiBub3QgZG9uJ3Qgc2V0IHRoZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHRvIGF2b2lkIGV4dHJhIGxpc3RlbmVyIGNhbGxzXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybU1vZGVsLnZhbHVlICE9PSBudW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUobnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRleHRib3ggbW9kZWwgaXMgbm90IGEgbnVtYmVyLCBjaGVjayB0byBzZWUgaWYgb3VyIGZvcm0gbW9kZWwgaGFzIGEgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaWYgc28gY2xlYXIgaXQgb3V0XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybU1vZGVsLnZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3aWxsIHVwZGF0ZSB0aGUgdGV4dGJveCBmb3JtIG1vZGVsIHdpdGggZm9ybWF0dGluZyBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgIC8vIG9uIEZvY3VzIG91dC4gIFRoaXMgd29ya3Mgd2VsbCBmb3IgdGhlIHVzZXIgd2hldGhlciB0aGUgYXV0byB1cGRhdGVcclxuICAgICAgICAgICAgICAgIC8vIGlzIG9wdGVkIGluIG9yIG5vdFxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNPdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUodGhpcy5mb3JtYXREaXNwbGF5TnVtYmVyKG51bWJlcikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gTm90aGluZyB0byBkaXNwbGF5LCBqdXN0IGVuc3VyaW5nIHdlIHJlc2V0IG91ciBmbGFnIHRoYXQgZmlsdGVyc1xyXG4gICAgICAgICAgICAvLyB0aGUgZm9ybSBtb2RlbCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IGEgbnVtYmVyIHZhbHVlIHRvIHRoZSBmb3JtbWF0ZWQgZGlzcGxheSBzdHJpbmcuIElmIHRoZXJlIGlzIG5vIHZhbHVlXHJcbiAgICAgKiByZXR1cm4gbnVsbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZvcm1hdERpc3BsYXlOdW1iZXIodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAodmFsdWUgfHwgdmFsdWUgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBjYWxsaW5nIHRvRml4ZWQgaWYgdGhlIHZhbHVlIGlzbid0IGEgbnVtYmVyLiAgVGhpcyBpcyBwb3NzaWJsZVxyXG4gICAgICAgICAgICAvLyBpZiBwYXRjaGluZyBhIHZhbHVlIGZyb20gb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50IGFzIHlvdSBkb24ndCBoYXZlXHJcbiAgICAgICAgICAgIC8vIHR5cGUgY2hlY2tpbmcgdGhlcmVcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ByZWNpc2lvbiAmJiB0aGlzLmRlY2ltYWxzICYmICFpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKHRoaXMuZGVjaW1hbHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3NpdGlvbiB0aGUgdW5pdHMgZWxlbWVudCBhbmQgc2V0IHRoZSBwYWRkaW5nIGluIHRoZSB0ZXh0Ym94IGlucHV0IGJhc2VkXHJcbiAgICAgKiBvbiB0aGUgd2lkdGggb2YgdGhlIHVuaXRzIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvblJpZ2h0VW5pdHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1yaWdodCcpO1xyXG4gICAgICAgIGxldCBpbnB1dEVsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG5cclxuICAgICAgICBpZiAodW5pdHNFbCAmJiBpbnB1dEVsKSB7XHJcbiAgICAgICAgICAgIGxldCB1bml0c1dpZHRoID0gdW5pdHNFbC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmICh1bml0c1dpZHRoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBwYWRkaW5nID0gdW5pdHNXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbnB1dEVsLCAncGFkZGluZy1yaWdodCcsIHBhZGRpbmcgKyAncHgnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgcG9zaXRpb25MZWZ0VW5pdHMoKSB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1sZWZ0Jyk7XHJcbiAgICAgICAgbGV0IGlucHV0RWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcblxyXG4gICAgICAgIGlmICh1bml0c0VsICYmIGlucHV0RWwpIHtcclxuICAgICAgICAgICAgbGV0IHVuaXRzV2lkdGggPSB1bml0c0VsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVuaXRzV2lkdGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHBhZGRpbmcgPSB1bml0c1dpZHRoO1xyXG4gICAgICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZSh1bml0c0VsKS5sZWZ0O1xyXG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nICs9IHBhcnNlSW50KGxlZnRQb3NpdGlvbi5yZXBsYWNlKCdweCcsICcnKSwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpbnB1dEVsLCAncGFkZGluZy1sZWZ0JywgcGFkZGluZyArICdweCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bml0cyBlbGVtZW50IHRvIHRoZSB0ZXh0Ym94IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzaG93VW5pdHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGlucHV0V3JhcHBlciA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LXdyYXBwZXInKTtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0V3JhcHBlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0VW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bml0c0VsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudW5pdHMtbGVmdCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVuaXRzRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHVuaXRzRWwsICdpbm5lckhUTUwnLCB0aGlzLmxlZnRVbml0cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoaW5wdXRXcmFwcGVyLCB0aGlzLm1ha2VVbml0RWxlbWVudCgnbGVmdCcsIHRoaXMubGVmdFVuaXRzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGVmdFVuaXRzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0VW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bml0c0VsID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudW5pdHMtcmlnaHQnKTtcclxuICAgICAgICAgICAgICAgIGlmICh1bml0c0VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh1bml0c0VsLCAnaW5uZXJIVE1MJywgdGhpcy5yaWdodFVuaXRzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbnB1dFdyYXBwZXIsIHRoaXMubWFrZVVuaXRFbGVtZW50KCdyaWdodCcsIHRoaXMucmlnaHRVbml0cykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvblJpZ2h0VW5pdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1ha2VVbml0RWxlbWVudChzaWRlOiAnbGVmdCcgfCAncmlnaHQnLCB0ZXh0OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGxldCB1bml0c0VsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodW5pdHNFbCwgJ2NsYXNzJywgYHVuaXRzIHVuaXRzLSR7c2lkZX1gKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh1bml0c0VsLCAnaWQnLCBgJHt0aGlzLmlkfV91bml0c2ApO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHVuaXRzRWwsICdzdHlsZScsICdwb2ludGVyLWV2ZW50czogbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodW5pdHNFbCwgJ2lubmVySFRNTCcsIHRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdW5pdHNFbDtcclxuICAgIH1cclxufSJdfQ==
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
|
|
2
|
-
import { TemplatePortal } from '@angular/cdk/portal';
|
|
3
|
-
import { Component, ElementRef, HostListener, Input, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
|
|
4
|
-
export class PopoverComponent {
|
|
5
|
-
constructor(overlay, viewContainerRef, elementRef) {
|
|
6
|
-
this.overlay = overlay;
|
|
7
|
-
this.viewContainerRef = viewContainerRef;
|
|
8
|
-
this.elementRef = elementRef;
|
|
9
|
-
this.icon = '';
|
|
10
|
-
this.contentPosition = 'top-left';
|
|
11
|
-
this.iconHoverClass = '';
|
|
12
|
-
this.isVisible = false;
|
|
13
|
-
}
|
|
14
|
-
ngOnDestroy() {
|
|
15
|
-
this.hide();
|
|
16
|
-
}
|
|
17
|
-
show() {
|
|
18
|
-
if (!this.isVisible) {
|
|
19
|
-
const overlayConfig = this.getOverlayConfig();
|
|
20
|
-
this.overlayRef = this.overlay.create(overlayConfig);
|
|
21
|
-
const contentPortal = new TemplatePortal(this.content, this.viewContainerRef);
|
|
22
|
-
this.contentViewRef = this.overlayRef.attach(contentPortal);
|
|
23
|
-
this.isVisible = true;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Hides the popover if the mouse moves outside of the popover content
|
|
28
|
-
*/
|
|
29
|
-
onMouseMove(event) {
|
|
30
|
-
var _a;
|
|
31
|
-
if (!this.contentRect) {
|
|
32
|
-
this.contentRect = (_a = this.contentViewRef) === null || _a === void 0 ? void 0 : _a.rootNodes[0].getBoundingClientRect();
|
|
33
|
-
}
|
|
34
|
-
if (this.contentRect) {
|
|
35
|
-
if (event.clientX > this.contentRect.right
|
|
36
|
-
|| event.clientX < this.contentRect.left
|
|
37
|
-
|| event.clientY > this.contentRect.bottom
|
|
38
|
-
|| event.clientY < this.contentRect.top) {
|
|
39
|
-
this.hide();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
hide() {
|
|
44
|
-
var _a;
|
|
45
|
-
this.contentRect = undefined;
|
|
46
|
-
(_a = this.overlayRef) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
47
|
-
this.isVisible = false;
|
|
48
|
-
}
|
|
49
|
-
getOverlayConfig() {
|
|
50
|
-
const position = this.getPosition();
|
|
51
|
-
const positionStrategy = this.overlay.position()
|
|
52
|
-
.flexibleConnectedTo(this.elementRef)
|
|
53
|
-
.withPositions([position]);
|
|
54
|
-
const config = new OverlayConfig({
|
|
55
|
-
positionStrategy: positionStrategy
|
|
56
|
-
});
|
|
57
|
-
return config;
|
|
58
|
-
}
|
|
59
|
-
getPosition() {
|
|
60
|
-
const position = this.contentPosition.split('-');
|
|
61
|
-
const overlayX = (position[1] == 'left' ? 'start' : 'end');
|
|
62
|
-
const overlayY = position[0];
|
|
63
|
-
return { originX: overlayX, originY: overlayY, overlayX: overlayX, overlayY: overlayY };
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
PopoverComponent.decorators = [
|
|
67
|
-
{ type: Component, args: [{
|
|
68
|
-
selector: 'ec-popover',
|
|
69
|
-
template: "<div class=\"p-2\">\r\n <i class=\"ec-icon {{icon}} ec-icon-sm\"></i>\r\n</div>\r\n\r\n<ng-template #content>\r\n <article class=\"popover-content\"\r\n (document:mousemove)=\"onMouseMove($event)\">\r\n <ng-content></ng-content>\r\n </article>\r\n <div class=\"p-2 {{contentPosition}}\">\r\n <i class=\"ec-icon {{icon}} ec-icon-sm {{iconHoverClass}}\"></i>\r\n </div>\r\n</ng-template>\r\n",
|
|
70
|
-
styles: [":root{--ec-color-icon:rgba(26,26,35,0.66);--ec-font-size-icon:1rem}@-webkit-keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:inline-block;line-height:1}.popover-content{border-radius:var(--ec-border-radius);box-shadow:0 3px 6px 0 rgba(26,26,35,.12);overflow:hidden;position:relative}.popover-content+div{line-height:1;position:absolute}.popover-content+div.top-left{left:0;top:0}.popover-content+div.top-right{right:0;top:0}.popover-content+div.bottom-right{bottom:0;right:0}.popover-content+div.bottom-left{bottom:0;left:0}"]
|
|
71
|
-
},] }
|
|
72
|
-
];
|
|
73
|
-
PopoverComponent.ctorParameters = () => [
|
|
74
|
-
{ type: Overlay },
|
|
75
|
-
{ type: ViewContainerRef },
|
|
76
|
-
{ type: ElementRef }
|
|
77
|
-
];
|
|
78
|
-
PopoverComponent.propDecorators = {
|
|
79
|
-
icon: [{ type: Input }],
|
|
80
|
-
contentPosition: [{ type: Input }],
|
|
81
|
-
iconHoverClass: [{ type: Input }],
|
|
82
|
-
content: [{ type: ViewChild, args: ['content',] }],
|
|
83
|
-
show: [{ type: HostListener, args: ['mouseover',] }]
|
|
84
|
-
};
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLE9BQU8sRUFBRSxhQUFhLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQW1CLFlBQVksRUFBRSxLQUFLLEVBQWEsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVNqSixNQUFNLE9BQU8sZ0JBQWdCO0lBZTNCLFlBQ1UsT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFVBQXNCO1FBRnRCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBaEJ2QixTQUFJLEdBQVcsRUFBRSxDQUFDO1FBRWxCLG9CQUFlLEdBQTJCLFVBQVUsQ0FBQztRQUVyRCxtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQU83QixjQUFTLEdBQVksS0FBSyxDQUFDO0lBTS9CLENBQUM7SUFFTCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUdNLElBQUk7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXJELE1BQU0sYUFBYSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUU1RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBQyxLQUFpQjs7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsU0FBRyxJQUFJLENBQUMsY0FBYywwQ0FBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLENBQUM7U0FDOUU7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFDSSxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSzttQkFDdEMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7bUJBQ3JDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO21CQUN2QyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUN0QztnQkFDQSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDYjtTQUNGO0lBQ0gsQ0FBQztJQUVPLElBQUk7O1FBQ1YsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDN0IsTUFBQSxJQUFJLENBQUMsVUFBVSwwQ0FBRSxPQUFPLEdBQUc7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTthQUM3QyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ3BDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDL0IsZ0JBQWdCLEVBQUUsZ0JBQWdCO1NBQ25DLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsTUFBTSxRQUFRLEdBQXFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzFGLENBQUM7OztZQXhGRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLHNhQUF1Qzs7YUFFeEM7OztZQVYyQixPQUFPO1lBRXNFLGdCQUFnQjtZQUFyRyxVQUFVOzs7bUJBVzNCLEtBQUs7OEJBRUwsS0FBSzs2QkFFTCxLQUFLO3NCQUVMLFNBQVMsU0FBQyxTQUFTO21CQWlCbkIsWUFBWSxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IHR5cGUgUG9wb3ZlckNvbnRlbnRQb3NpdGlvbiA9ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtcG9wb3ZlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3BvcG92ZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUG9wb3ZlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIEBJbnB1dCgpIGljb246IHN0cmluZyA9ICcnO1xyXG5cclxuICBASW5wdXQoKSBjb250ZW50UG9zaXRpb246IFBvcG92ZXJDb250ZW50UG9zaXRpb24gPSAndG9wLWxlZnQnO1xyXG5cclxuICBASW5wdXQoKSBpY29uSG92ZXJDbGFzczogc3RyaW5nID0gJyc7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnKSBwdWJsaWMgY29udGVudCE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XHJcbiAgcHJpdmF0ZSBjb250ZW50Vmlld1JlZj86IEVtYmVkZGVkVmlld1JlZjxhbnk+O1xyXG4gIHByaXZhdGUgY29udGVudFJlY3Q/OiBET01SZWN0O1xyXG4gIHByaXZhdGUgaXNWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlb3ZlcicpXHJcbiAgcHVibGljIHNob3coKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSB0aGlzLmdldE92ZXJsYXlDb25maWcoKTtcclxuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcclxuICBcclxuICAgICAgY29uc3QgY29udGVudFBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmNvbnRlbnQsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XHJcbiAgICAgIHRoaXMuY29udGVudFZpZXdSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKGNvbnRlbnRQb3J0YWwpO1xyXG4gIFxyXG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIaWRlcyB0aGUgcG9wb3ZlciBpZiB0aGUgbW91c2UgbW92ZXMgb3V0c2lkZSBvZiB0aGUgcG9wb3ZlciBjb250ZW50XHJcbiAgICovXHJcbiAgcHVibGljIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuY29udGVudFJlY3QpIHtcclxuICAgICAgdGhpcy5jb250ZW50UmVjdCA9IHRoaXMuY29udGVudFZpZXdSZWY/LnJvb3ROb2Rlc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb250ZW50UmVjdCkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5jbGllbnRYID4gdGhpcy5jb250ZW50UmVjdC5yaWdodCBcclxuICAgICAgIHx8IGV2ZW50LmNsaWVudFggPCB0aGlzLmNvbnRlbnRSZWN0LmxlZnRcclxuICAgICAgIHx8IGV2ZW50LmNsaWVudFkgPiB0aGlzLmNvbnRlbnRSZWN0LmJvdHRvbVxyXG4gICAgICAgfHwgZXZlbnQuY2xpZW50WSA8IHRoaXMuY29udGVudFJlY3QudG9wXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpZGUoKSB7XHJcbiAgICB0aGlzLmNvbnRlbnRSZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5vdmVybGF5UmVmPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29uZmlnKCk6IE92ZXJsYXlDb25maWcge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcclxuICAgICAgLndpdGhQb3NpdGlvbnMoW3Bvc2l0aW9uXSk7XHJcblxyXG4gICAgY29uc3QgY29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBwb3NpdGlvblN0cmF0ZWd5XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbigpOiBDb25uZWN0ZWRQb3NpdGlvbiB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29udGVudFBvc2l0aW9uLnNwbGl0KCctJyk7XHJcbiAgICBjb25zdCBvdmVybGF5WCA9IDwnc3RhcnQnIHwgJ2VuZCc+KHBvc2l0aW9uWzFdID09ICdsZWZ0JyA/ICdzdGFydCcgOiAnZW5kJyk7XHJcbiAgICBjb25zdCBvdmVybGF5WSA9IDwndG9wJyB8ICdib3R0b20nPnBvc2l0aW9uWzBdO1xyXG4gICAgcmV0dXJuIHsgb3JpZ2luWDogb3ZlcmxheVgsIG9yaWdpblk6IG92ZXJsYXlZLCBvdmVybGF5WDogb3ZlcmxheVgsIG92ZXJsYXlZOiBvdmVybGF5WSB9O1xyXG4gIH1cclxufVxyXG4iXX0=
|