@energycap/components 0.42.4-esbuild.20250131-1219 → 0.42.4-esbuild.20250131-1441
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/energycap-components.mjs +5 -0
- package/esm2022/lib/components.module.mjs +423 -0
- package/esm2022/lib/controls/banner/banner.component.mjs +109 -0
- package/esm2022/lib/controls/button/button.component.mjs +106 -0
- package/esm2022/lib/controls/button/copy-button-base.directive.mjs +67 -0
- package/esm2022/lib/controls/button/copy-button.directive.mjs +28 -0
- package/esm2022/lib/controls/button/copy-table-button.directive.mjs +43 -0
- package/esm2022/lib/controls/calendar/calendar-item.component.mjs +91 -0
- package/esm2022/lib/controls/calendar/calendar.component.mjs +248 -0
- package/esm2022/lib/controls/calendar/calendar.types.mjs +2 -0
- package/esm2022/lib/controls/checkbox/checkbox.component.mjs +140 -0
- package/esm2022/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
- package/esm2022/lib/controls/combobox/combobox.component.mjs +879 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +57 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +62 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +100 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +101 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +76 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +79 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +210 -0
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +81 -0
- package/esm2022/lib/controls/date-input/date-input.component.mjs +464 -0
- package/esm2022/lib/controls/date-input/date-input.types.mjs +44 -0
- package/esm2022/lib/controls/dropdown/dropdown.component.mjs +243 -0
- package/esm2022/lib/controls/file-upload/file-upload.component.mjs +261 -0
- package/esm2022/lib/controls/form-control/form-control.component.mjs +98 -0
- package/esm2022/lib/controls/form-control-base.mjs +151 -0
- package/esm2022/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
- package/esm2022/lib/controls/form-group/form-group.component.mjs +261 -0
- package/esm2022/lib/controls/help-popover/help-popover.component.mjs +31 -0
- package/esm2022/lib/controls/item-picker/item-picker.component.mjs +329 -0
- package/esm2022/lib/controls/link-button/link-button.component.mjs +11 -0
- package/esm2022/lib/controls/menu/menu.component.mjs +485 -0
- package/esm2022/lib/controls/navigation/link-item.mjs +2 -0
- package/esm2022/lib/controls/navigation/nav-group.mjs +39 -0
- package/esm2022/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
- package/esm2022/lib/controls/navigation/nav-item.mjs +2 -0
- package/esm2022/lib/controls/numericbox/numericbox.component.mjs +372 -0
- package/esm2022/lib/controls/popover/popover.component.mjs +117 -0
- package/esm2022/lib/controls/radio-button/radio-button-option.mjs +3 -0
- package/esm2022/lib/controls/radio-button/radio-button.component.mjs +82 -0
- package/esm2022/lib/controls/select/select.component.mjs +88 -0
- package/esm2022/lib/controls/tabs/tabs.component.mjs +47 -0
- package/esm2022/lib/controls/textbox/textbox.component.mjs +155 -0
- package/esm2022/lib/core/cache.service.mjs +105 -0
- package/esm2022/lib/core/custom-validators.mjs +29 -0
- package/esm2022/lib/core/date-time-helper.mjs +228 -0
- package/esm2022/lib/core/error.service.mjs +61 -0
- package/esm2022/lib/core/router-helper.service.mjs +111 -0
- package/esm2022/lib/core/scroll.service.mjs +89 -0
- package/esm2022/lib/core/telemetry-tracker.service.mjs +16 -0
- package/esm2022/lib/core/telemetry.service.mjs +38 -0
- package/esm2022/lib/core/validation-message.service.mjs +185 -0
- package/esm2022/lib/core/validation-patterns.mjs +31 -0
- package/esm2022/lib/core/window.service.mjs +186 -0
- package/esm2022/lib/display/app-bar/app-bar.component.mjs +46 -0
- package/esm2022/lib/display/avatar/avatar.component.mjs +67 -0
- package/esm2022/lib/display/avatar/avatar.service.mjs +64 -0
- package/esm2022/lib/display/confirm/confirm.component.mjs +168 -0
- package/esm2022/lib/display/dialog/dialog-content.mjs +2 -0
- package/esm2022/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
- package/esm2022/lib/display/dialog/dialog-types.mjs +77 -0
- package/esm2022/lib/display/dialog/dialog.component.mjs +281 -0
- package/esm2022/lib/display/dialog/dialog.service.mjs +71 -0
- package/esm2022/lib/display/help/help-types.mjs +2 -0
- package/esm2022/lib/display/hierarchy/hierarchy-base.mjs +111 -0
- package/esm2022/lib/display/hierarchy/hierarchy-mocks.spec.mjs +54 -0
- package/esm2022/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -0
- package/esm2022/lib/display/item-display/item-display.component.mjs +81 -0
- package/esm2022/lib/display/json-display/json-display.component.mjs +47 -0
- package/esm2022/lib/display/resizable/resizable-base.mjs +120 -0
- package/esm2022/lib/display/resizable/resizable.component.mjs +57 -0
- package/esm2022/lib/display/spinner/spinner.component.mjs +12 -0
- package/esm2022/lib/display/splash/splash.component.mjs +42 -0
- package/esm2022/lib/display/splash/splash.service.mjs +35 -0
- package/esm2022/lib/display/table/resizable-column.component.mjs +20 -0
- package/esm2022/lib/display/table/resizable-table.directive.mjs +227 -0
- package/esm2022/lib/display/table/searchable-table.component.mjs +342 -0
- package/esm2022/lib/display/table/table-detail-row.component.mjs +28 -0
- package/esm2022/lib/display/table/table-locked-column.component.mjs +58 -0
- package/esm2022/lib/display/table/table-master-header-row.component.mjs +14 -0
- package/esm2022/lib/display/table/table-master-row.component.mjs +163 -0
- package/esm2022/lib/display/table/table-pagination.component.mjs +155 -0
- package/esm2022/lib/display/table/table-selectable-row.component.mjs +235 -0
- package/esm2022/lib/display/table/table.component.mjs +249 -0
- package/esm2022/lib/display/tags/tag.mjs +18 -0
- package/esm2022/lib/display/tags/tags.component.mjs +77 -0
- package/esm2022/lib/display/toast/toast/toast.component.mjs +77 -0
- package/esm2022/lib/display/toast/toast-types.mjs +8 -0
- package/esm2022/lib/display/toast/toast.service.mjs +35 -0
- package/esm2022/lib/display/toast/toaster/toaster.component.mjs +114 -0
- package/esm2022/lib/display/tooltip/tooltip.component.mjs +28 -0
- package/esm2022/lib/display/tooltip/tooltip.service.mjs +78 -0
- package/esm2022/lib/display/tooltip-directive/tooltip.directive.mjs +173 -0
- package/esm2022/lib/display/tour/tour-types.mjs +34 -0
- package/esm2022/lib/display/tour/tour.component.mjs +398 -0
- package/esm2022/lib/display/tour/tour.service.mjs +75 -0
- package/esm2022/lib/display/tree/tree.component.mjs +135 -0
- package/esm2022/lib/display/view-overlay/view-overlay.component.mjs +58 -0
- package/esm2022/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
- package/esm2022/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
- package/esm2022/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +100 -0
- package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +166 -0
- package/esm2022/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
- package/esm2022/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
- package/esm2022/lib/shared/display/pipes/relative-date.pipe.mjs +62 -0
- package/esm2022/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
- package/esm2022/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
- package/esm2022/lib/shared/display.mjs +6 -0
- package/esm2022/lib/shared/form-group.helper.mjs +67 -0
- package/esm2022/lib/shared/json-helper.mjs +19 -0
- package/esm2022/lib/shared/lodash-helper.mjs +52 -0
- package/esm2022/lib/shared/page/page-base/page-base.component.mjs +387 -0
- package/esm2022/lib/shared/page/page-statuses.mjs +23 -0
- package/esm2022/lib/shared/page/page-title/page-title.component.mjs +23 -0
- package/esm2022/lib/shared/page/page-view/page-view.component.mjs +147 -0
- package/esm2022/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +17 -0
- package/esm2022/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +17 -0
- package/esm2022/lib/shared/testing/page-base-component-test-helper.spec.mjs +38 -0
- package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +98 -0
- package/esm2022/lib/shared/testing/public-mocks.spec.mjs +148 -0
- package/esm2022/lib/shared/testing/spy-factory.spec.mjs +40 -0
- package/esm2022/lib/shared/testing/translation-mocks.spec.mjs +57 -0
- package/esm2022/lib/shared/user-preference.service.mjs +17 -0
- package/esm2022/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
- package/esm2022/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
- package/esm2022/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
- package/esm2022/public-api.mjs +117 -0
- package/fesm2022/energycap-components.mjs +13219 -0
- package/fesm2022/energycap-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components.module.d.ts +92 -0
- package/lib/controls/banner/banner.component.d.ts +50 -0
- package/lib/controls/button/button.component.d.ts +78 -0
- package/lib/controls/button/copy-button-base.directive.d.ts +20 -0
- package/lib/controls/button/copy-button.directive.d.ts +14 -0
- package/lib/controls/button/copy-table-button.directive.d.ts +19 -0
- package/lib/controls/calendar/calendar-item.component.d.ts +22 -0
- package/lib/controls/calendar/calendar.component.d.ts +52 -0
- package/lib/controls/calendar/calendar.types.d.ts +11 -0
- package/lib/controls/checkbox/checkbox.component.d.ts +65 -0
- package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +25 -0
- package/lib/controls/combobox/combobox.component.d.ts +418 -0
- package/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.d.ts +42 -0
- package/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.d.ts +18 -0
- package/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.d.ts +18 -0
- package/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.d.ts +21 -0
- package/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.d.ts +20 -0
- package/lib/controls/date-input/date-input.component.d.ts +115 -0
- package/lib/controls/date-input/date-input.types.d.ts +62 -0
- package/lib/controls/dropdown/dropdown.component.d.ts +161 -0
- package/lib/controls/file-upload/file-upload.component.d.ts +124 -0
- package/lib/controls/form-control/form-control.component.d.ts +28 -0
- package/lib/controls/form-control-base.d.ts +110 -0
- package/lib/controls/form-control-label/form-control-label.component.d.ts +73 -0
- package/lib/controls/form-group/form-group.component.d.ts +105 -0
- package/lib/controls/help-popover/help-popover.component.d.ts +11 -0
- package/lib/controls/item-picker/item-picker.component.d.ts +164 -0
- package/lib/controls/link-button/link-button.component.d.ts +5 -0
- package/lib/controls/menu/menu.component.d.ts +255 -0
- package/lib/controls/navigation/link-item.d.ts +32 -0
- package/lib/controls/navigation/nav-group.d.ts +18 -0
- package/lib/controls/navigation/nav-item-active.directive.d.ts +42 -0
- package/lib/controls/navigation/nav-item.d.ts +31 -0
- package/lib/controls/numericbox/numericbox.component.d.ts +148 -0
- package/lib/controls/popover/popover.component.d.ts +51 -0
- package/lib/controls/radio-button/radio-button-option.d.ts +19 -0
- package/lib/controls/radio-button/radio-button.component.d.ts +53 -0
- package/lib/controls/select/select.component.d.ts +44 -0
- package/lib/controls/tabs/tabs.component.d.ts +30 -0
- package/lib/controls/textbox/textbox.component.d.ts +107 -0
- package/lib/core/cache.service.d.ts +33 -0
- package/lib/core/custom-validators.d.ts +20 -0
- package/lib/core/date-time-helper.d.ts +101 -0
- package/lib/core/error.service.d.ts +20 -0
- package/lib/core/router-helper.service.d.ts +48 -0
- package/lib/core/scroll.service.d.ts +36 -0
- package/lib/core/telemetry-tracker.service.d.ts +13 -0
- package/lib/core/telemetry.service.d.ts +31 -0
- package/lib/core/validation-message.service.d.ts +26 -0
- package/lib/core/validation-patterns.d.ts +22 -0
- package/lib/core/window.service.d.ts +116 -0
- package/lib/display/app-bar/app-bar.component.d.ts +20 -0
- package/lib/display/avatar/avatar.component.d.ts +35 -0
- package/lib/display/avatar/avatar.service.d.ts +24 -0
- package/lib/display/confirm/confirm.component.d.ts +123 -0
- package/lib/display/dialog/dialog-content.d.ts +19 -0
- package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +32 -0
- package/lib/display/dialog/dialog-types.d.ts +130 -0
- package/lib/display/dialog/dialog.component.d.ts +120 -0
- package/lib/display/dialog/dialog.service.d.ts +48 -0
- package/lib/display/help/help-types.d.ts +33 -0
- package/lib/display/hierarchy/hierarchy-base.d.ts +97 -0
- package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +53 -0
- package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +34 -0
- package/lib/display/item-display/item-display.component.d.ts +43 -0
- package/lib/display/json-display/json-display.component.d.ts +16 -0
- package/lib/display/resizable/resizable-base.d.ts +67 -0
- package/lib/display/resizable/resizable.component.d.ts +31 -0
- package/lib/display/spinner/spinner.component.d.ts +5 -0
- package/lib/display/splash/splash.component.d.ts +16 -0
- package/lib/display/splash/splash.service.d.ts +22 -0
- package/lib/display/table/resizable-column.component.d.ts +10 -0
- package/lib/display/table/resizable-table.directive.d.ts +93 -0
- package/lib/display/table/searchable-table.component.d.ts +206 -0
- package/lib/display/table/table-detail-row.component.d.ts +8 -0
- package/lib/display/table/table-locked-column.component.d.ts +20 -0
- package/lib/display/table/table-master-header-row.component.d.ts +9 -0
- package/lib/display/table/table-master-row.component.d.ts +113 -0
- package/lib/display/table/table-pagination.component.d.ts +91 -0
- package/lib/display/table/table-selectable-row.component.d.ts +102 -0
- package/lib/display/table/table.component.d.ts +121 -0
- package/lib/display/tags/tag.d.ts +18 -0
- package/lib/display/tags/tags.component.d.ts +48 -0
- package/lib/display/toast/toast/toast.component.d.ts +23 -0
- package/lib/display/toast/toast-types.d.ts +24 -0
- package/lib/display/toast/toast.service.d.ts +20 -0
- package/lib/display/toast/toaster/toaster.component.d.ts +35 -0
- package/lib/display/tooltip/tooltip.component.d.ts +70 -0
- package/lib/display/tooltip/tooltip.service.d.ts +16 -0
- package/lib/display/tooltip-directive/tooltip.directive.d.ts +44 -0
- package/lib/display/tour/tour-types.d.ts +70 -0
- package/lib/display/tour/tour.component.d.ts +147 -0
- package/lib/display/tour/tour.service.d.ts +38 -0
- package/lib/display/tree/tree.component.d.ts +75 -0
- package/lib/display/view-overlay/view-overlay.component.d.ts +38 -0
- package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +14 -0
- package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +60 -0
- package/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.d.ts +23 -0
- package/lib/shared/directives/popup/popup-container.directive.d.ts +101 -0
- package/lib/shared/display/pipes/date-display.pipe.d.ts +21 -0
- package/lib/shared/display/pipes/highlight-text.pipe.d.ts +9 -0
- package/lib/shared/display/pipes/relative-date.pipe.d.ts +36 -0
- package/lib/shared/display/pipes/row-count.pipe.d.ts +23 -0
- package/lib/shared/display/pipes/time-display.pipe.d.ts +18 -0
- package/lib/shared/display.d.ts +42 -0
- package/lib/shared/form-group.helper.d.ts +31 -0
- package/lib/shared/json-helper.d.ts +7 -0
- package/lib/shared/lodash-helper.d.ts +18 -0
- package/lib/shared/page/page-base/page-base.component.d.ts +259 -0
- package/lib/shared/page/page-statuses.d.ts +13 -0
- package/lib/shared/page/page-title/page-title.component.d.ts +9 -0
- package/lib/shared/page/page-view/page-view.component.d.ts +102 -0
- package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +4 -0
- package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +4 -0
- package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +30 -0
- package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +28 -0
- package/lib/shared/testing/public-mocks.spec.d.ts +90 -0
- package/lib/shared/testing/spy-factory.spec.d.ts +27 -0
- package/lib/shared/testing/translation-mocks.spec.d.ts +30 -0
- package/lib/shared/user-preference.service.d.ts +13 -0
- package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +134 -0
- package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +27 -0
- package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +10 -0
- package/package.json +2 -6
- package/public-api.d.ts +113 -0
- package/schematics/collection.json +10 -0
- package/schematics/rxjs-7-upgrade/index.d.ts +3 -0
- package/schematics/rxjs-7-upgrade/index.js +71 -0
- package/schematics/rxjs-7-upgrade/index.js.map +1 -0
- package/schematics/rxjs-7-upgrade/schema.d.ts +4 -0
- package/schematics/rxjs-7-upgrade/schema.js +3 -0
- package/schematics/rxjs-7-upgrade/schema.js.map +1 -0
- package/schematics/rxjs-7-upgrade/schema.json +14 -0
- package/schematics/utilities/typescript.d.ts +7 -0
- package/schematics/utilities/typescript.js +45 -0
- package/schematics/utilities/typescript.js.map +1 -0
- package/schematics/utilities/workspace.d.ts +8 -0
- package/schematics/utilities/workspace.js +72 -0
- package/schematics/utilities/workspace.js.map +1 -0
- package/src/assets/images/email-icon.png +0 -0
- package/src/assets/images/email-logo.png +0 -0
- package/src/assets/images/favicon-ech.svg +7 -0
- package/src/assets/images/favicon-esa.svg +6 -0
- package/src/assets/images/favicon-eum.svg +6 -0
- package/src/assets/images/favicon.svg +5 -0
- package/src/assets/images/icon-carbonhub.svg +10 -0
- package/src/assets/images/icon-eum.svg +5 -0
- package/src/assets/images/icon-ucp.svg +5 -0
- package/src/assets/images/icon-wattics.svg +5 -0
- package/src/assets/images/icon.svg +4 -0
- package/src/assets/images/logo.svg +3 -0
- package/src/assets/images/splash.gif +0 -0
- package/src/assets/locales/en_US.json +59 -0
- package/src/assets/scripts/unsupported-browser.js +17 -0
- package/src/styles/_base.scss +38 -0
- package/src/styles/_colors.scss +96 -0
- package/src/styles/_core.scss +4 -0
- package/src/styles/_functions.scss +114 -0
- package/src/styles/_global-variables.scss +232 -0
- package/src/styles/_icons.scss +24 -0
- package/src/styles/bootstrap/_grid.scss +34 -0
- package/src/styles/bootstrap/_reboot.scss +323 -0
- package/src/styles/components/_card.scss +21 -0
- package/src/styles/components/_link-icons.scss +38 -0
- package/src/styles/components/_splash.scss +57 -0
- package/src/styles/components/_unsupported-browsers.scss +24 -0
- package/src/styles/email/_email-base.scss +228 -0
- package/src/styles/email/email.scss +43 -0
- package/src/styles/index.scss +27 -0
- package/src/styles/mixins/_animations.scss +18 -0
- package/src/styles/mixins/_button-base.scss +185 -0
- package/src/styles/mixins/_card-base.scss +40 -0
- package/src/styles/mixins/_common.scss +52 -0
- package/src/styles/mixins/_dialog-base.scss +96 -0
- package/src/styles/mixins/_form-control-base.scss +641 -0
- package/src/styles/mixins/_login.scss +74 -0
- package/src/styles/mixins/_menu-base.scss +153 -0
- package/src/styles/mixins/_overlay-base.scss +33 -0
- package/src/styles/mixins/_resizable-base.scss +57 -0
- package/src/styles/mixins/_spinner-base.scss +34 -0
- package/src/styles/mixins/_table-base.scss +298 -0
- package/src/styles/mixins/_tabs-base.scss +110 -0
- package/src/styles/mixins/_tags-base.scss +116 -0
- package/src/styles/mixins/_text.scss +89 -0
- package/src/styles/mixins.scss +15 -0
- package/src/styles/utilities/_borders.scss +30 -0
- package/src/styles/utilities/_common.scss +49 -0
- package/src/styles/utilities/_layout.scss +116 -0
- package/src/styles/utilities/_spacing.scss +65 -0
- package/src/styles/utilities/_text.scss +139 -0
@@ -0,0 +1,372 @@
|
|
1
|
+
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
|
2
|
+
import { UntypedFormControl, Validators } from "@angular/forms";
|
3
|
+
import { debounceTime, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';
|
4
|
+
import { getDecimalPattern, integerPattern } from '../../core/validation-patterns';
|
5
|
+
import { FormControlBase } from "../form-control-base";
|
6
|
+
import { TextboxComponent } from '../textbox/textbox.component';
|
7
|
+
import * as i0 from "@angular/core";
|
8
|
+
import * as i1 from "../../core/validation-message.service";
|
9
|
+
import * as i2 from "../../shared/form-group.helper";
|
10
|
+
import * as i3 from "@angular/common";
|
11
|
+
import * as i4 from "../textbox/textbox.component";
|
12
|
+
import * as i5 from "../help-popover/help-popover.component";
|
13
|
+
import * as i6 from "@ngx-translate/core";
|
14
|
+
/**
|
15
|
+
* Custom validator to check that min/max and pattern validation is met on the numericbox
|
16
|
+
* component
|
17
|
+
*/
|
18
|
+
export const numericboxValidation = (min, max, decimals, maxPrecisionDigits) => {
|
19
|
+
return (control) => {
|
20
|
+
let hasError = false;
|
21
|
+
// If the control is empty we won't attempt to validate, if there is a required
|
22
|
+
// validator we will never get here until there is a value
|
23
|
+
if (control.value && control.value !== "") {
|
24
|
+
let numericPattern;
|
25
|
+
if (decimals && decimals > 0) {
|
26
|
+
numericPattern = getDecimalPattern(decimals);
|
27
|
+
}
|
28
|
+
else if (maxPrecisionDigits) {
|
29
|
+
// Still need to check for a valid number formatting when in max precision mode
|
30
|
+
numericPattern = getDecimalPattern(maxPrecisionDigits);
|
31
|
+
}
|
32
|
+
else {
|
33
|
+
// Allow an optional negative sign and any number of digits 0-9
|
34
|
+
numericPattern = integerPattern;
|
35
|
+
}
|
36
|
+
if (!numericPattern.test(control.value)) {
|
37
|
+
hasError = true;
|
38
|
+
}
|
39
|
+
else if (maxPrecisionDigits) {
|
40
|
+
// Converting to a number then back to string removes trailing zeros, and the regex replace removes
|
41
|
+
// any negative signs, leading zeros or decimal points from the number.
|
42
|
+
const val = Number(control.value).toString().replace(/^-?/, '').replace(/(^0\.)|(\.)/, '');
|
43
|
+
hasError = val.length > maxPrecisionDigits;
|
44
|
+
}
|
45
|
+
// We now know we have a valid number, so we can cast these to numbers
|
46
|
+
// for proper range validation
|
47
|
+
if (min !== undefined && Number(control.value) < min) {
|
48
|
+
hasError = true;
|
49
|
+
}
|
50
|
+
if (max !== undefined && Number(control.value) > max) {
|
51
|
+
hasError = true;
|
52
|
+
}
|
53
|
+
}
|
54
|
+
if (hasError) {
|
55
|
+
return {
|
56
|
+
numericbox: {
|
57
|
+
valid: false,
|
58
|
+
min: min,
|
59
|
+
max: max,
|
60
|
+
decimals: decimals,
|
61
|
+
maxPrecisionDigits: maxPrecisionDigits
|
62
|
+
}
|
63
|
+
};
|
64
|
+
}
|
65
|
+
else {
|
66
|
+
return null;
|
67
|
+
}
|
68
|
+
};
|
69
|
+
};
|
70
|
+
export class NumericboxComponent extends FormControlBase {
|
71
|
+
constructor(validationMessageService, formGroupHelper, renderer) {
|
72
|
+
super(validationMessageService, formGroupHelper);
|
73
|
+
this.validationMessageService = validationMessageService;
|
74
|
+
this.formGroupHelper = formGroupHelper;
|
75
|
+
this.renderer = renderer;
|
76
|
+
/**
|
77
|
+
* Show trailing zeros after the decimal point.
|
78
|
+
* Do not use with maxPrecisionDigits.
|
79
|
+
*/
|
80
|
+
this.showPrecision = false;
|
81
|
+
/**
|
82
|
+
* If set to true this will update the form model after a debounce as the user
|
83
|
+
* interacts with the component
|
84
|
+
*/
|
85
|
+
this.autoUpdateFormModel = false;
|
86
|
+
/** Flag to tell the page we finally computed a greater than zero
|
87
|
+
* width for units (if applicable)
|
88
|
+
*/
|
89
|
+
this.unitsWidthCalculated = false;
|
90
|
+
/** Flag used to filter the form models value changes subscription
|
91
|
+
* to prevent the textbox model from being formatted as the form model is updated
|
92
|
+
* programmatically when the textbox model updates
|
93
|
+
*/
|
94
|
+
this.autoUpdatingFormModel = false;
|
95
|
+
}
|
96
|
+
/**
|
97
|
+
* Angular AfterViewInit life-cycle hook
|
98
|
+
* Subscribe to textbox model value changes if the hosting
|
99
|
+
* page has opted in for this component
|
100
|
+
*/
|
101
|
+
ngAfterViewInit() {
|
102
|
+
if (this.autoUpdateFormModel) {
|
103
|
+
this.textboxFormModel.valueChanges
|
104
|
+
.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.componentDestroyed)).subscribe(() => {
|
105
|
+
this.updateFormModelValue();
|
106
|
+
});
|
107
|
+
}
|
108
|
+
}
|
109
|
+
/**
|
110
|
+
* Angular onChanges life-cycle hook
|
111
|
+
* @see {@link https://angular.io/guide/lifecycle-hooks | Life-cycle hooks}
|
112
|
+
*/
|
113
|
+
ngOnChanges(changes) {
|
114
|
+
// If either units change after we've calculated,
|
115
|
+
// reset the flag so we can react and redraw
|
116
|
+
if (changes.rightUnits || changes.leftUnits) {
|
117
|
+
this.unitsWidthCalculated = false;
|
118
|
+
}
|
119
|
+
super.ngOnChanges(changes);
|
120
|
+
}
|
121
|
+
/**
|
122
|
+
* Angular onInit lifecycle hook
|
123
|
+
* If units is defined, set the position and listen for status changes so we
|
124
|
+
* can update the positioning of the units element
|
125
|
+
*/
|
126
|
+
ngOnInit() {
|
127
|
+
super.ngOnInit();
|
128
|
+
// Initialize the textbox form model with the value of the form model and synchronize
|
129
|
+
// disabled state
|
130
|
+
this.textboxFormModel = new UntypedFormControl({ value: this.formModel.value, disabled: this.formModel.disabled });
|
131
|
+
// Update the form model's errors when the textbox form model status changes
|
132
|
+
this.textboxFormModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
|
133
|
+
if (this.formModel.enabled) {
|
134
|
+
this.formModel.setErrors(this.textboxFormModel.errors);
|
135
|
+
}
|
136
|
+
});
|
137
|
+
// Synchronize disabled state between form model and internal textbox form model
|
138
|
+
this.formModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
|
139
|
+
if (this.formModel.disabled) {
|
140
|
+
this.textboxFormModel.disable();
|
141
|
+
}
|
142
|
+
else {
|
143
|
+
if (this.textboxFormModel.disabled) {
|
144
|
+
this.textboxFormModel.enable();
|
145
|
+
}
|
146
|
+
}
|
147
|
+
});
|
148
|
+
// Set textbox validators
|
149
|
+
this.textboxFormModel.setValidators(this.getValidators());
|
150
|
+
// Now that the textbox is set up we will set it's value to whatever the
|
151
|
+
// form model had when we initialized
|
152
|
+
this.textboxFormModel.setValue(this.formatDisplayNumber(this.formModel.value));
|
153
|
+
// If the form model's value changes programmatically we need to update the
|
154
|
+
// textbox form model
|
155
|
+
this.formModel.valueChanges.pipe(
|
156
|
+
// We need to filter out when we are updating it programmatically if the
|
157
|
+
// hosting page has opted into the auto updating input
|
158
|
+
filter(() => !this.autoUpdatingFormModel), takeUntil(this.componentDestroyed)).subscribe(value => {
|
159
|
+
this.textboxFormModel.setValue(this.formatDisplayNumber(value));
|
160
|
+
});
|
161
|
+
// If the textbox status changes we need to update the left units position because
|
162
|
+
// we want to make room for the invalid icon
|
163
|
+
if (this.leftUnits) {
|
164
|
+
this.textboxFormModel.statusChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(() => {
|
165
|
+
this.positionLeftUnits();
|
166
|
+
});
|
167
|
+
}
|
168
|
+
}
|
169
|
+
/**
|
170
|
+
* Angular afterViewChecked lifecycle hook
|
171
|
+
* Show the units element if units is defined. Runs after every ngOnChanges
|
172
|
+
*/
|
173
|
+
ngAfterViewChecked() {
|
174
|
+
if ((this.leftUnits || this.rightUnits) && !this.unitsWidthCalculated) {
|
175
|
+
this.showUnits();
|
176
|
+
}
|
177
|
+
}
|
178
|
+
/**
|
179
|
+
* Function that builds and returns a ValidatorFn array to set on the form control
|
180
|
+
*/
|
181
|
+
getValidators() {
|
182
|
+
let validators = [];
|
183
|
+
if (this.required) {
|
184
|
+
validators.push(Validators.required);
|
185
|
+
}
|
186
|
+
validators.push(numericboxValidation(this.min, this.max, this.decimals, this.maxPrecisionDigits));
|
187
|
+
return validators;
|
188
|
+
}
|
189
|
+
/**
|
190
|
+
* Focus out event handler for the Textbox component
|
191
|
+
*/
|
192
|
+
onFocusOut() {
|
193
|
+
this.updateFormModelValue(true);
|
194
|
+
}
|
195
|
+
/**
|
196
|
+
* Function to set focus on an input programatically after the page
|
197
|
+
* had been rendered. The highlight text flag will select the text
|
198
|
+
* within the input if passed in and true
|
199
|
+
*/
|
200
|
+
setFocus(highlightText) {
|
201
|
+
this.textboxInput.setFocus(highlightText);
|
202
|
+
}
|
203
|
+
/**
|
204
|
+
* When the textbox model updates we need to add some display formatting for
|
205
|
+
* display in the textbox and cast the textbox model to a number. Avoid updating
|
206
|
+
* the form model when the value doesn't change because listeners will fire for no reason
|
207
|
+
*/
|
208
|
+
updateFormModelValue(isFocusOut) {
|
209
|
+
if (this.autoUpdateFormModel) {
|
210
|
+
// Make it so value changes on the form model do not get triggered
|
211
|
+
// as we change it programmatically. We do not want the textbox
|
212
|
+
// model to be updated while the user is in the input
|
213
|
+
this.autoUpdatingFormModel = true;
|
214
|
+
}
|
215
|
+
try {
|
216
|
+
if (this.textboxFormModel.valid || this.textboxFormModel.value === "") {
|
217
|
+
// Start out with null for the number, if the textbox value is not a number
|
218
|
+
// we will clear it out on focus out
|
219
|
+
let number = null;
|
220
|
+
// Make sure the textbox model is a number before trying to update the
|
221
|
+
// form model value with it
|
222
|
+
if (this.textboxFormModel.value && !isNaN(this.textboxFormModel.value)) {
|
223
|
+
// Our value is a legit number, on focus out we will format it if needed
|
224
|
+
number = Number(this.textboxFormModel.value);
|
225
|
+
// Checking if the value has actually changed, if not don't set the
|
226
|
+
// value to avoid extra listener calls
|
227
|
+
if (this.formModel.value !== number) {
|
228
|
+
this.formModel.setValue(number);
|
229
|
+
}
|
230
|
+
// The textbox model is not a number, check to see if our form model has a value
|
231
|
+
// and if so clear it out
|
232
|
+
}
|
233
|
+
else if (this.formModel.value !== null) {
|
234
|
+
this.formModel.setValue(null);
|
235
|
+
}
|
236
|
+
// We only will update the textbox form model with formatting if needed
|
237
|
+
// on Focus out. This works well for the user whether the auto update
|
238
|
+
// is opted in or not
|
239
|
+
if (isFocusOut) {
|
240
|
+
this.textboxFormModel.setValue(this.formatDisplayNumber(number));
|
241
|
+
}
|
242
|
+
}
|
243
|
+
this.formModel.markAsTouched();
|
244
|
+
}
|
245
|
+
catch (error) {
|
246
|
+
// Nothing to display, just ensuring we reset our flag that filters
|
247
|
+
// the form model value changes
|
248
|
+
}
|
249
|
+
finally {
|
250
|
+
this.autoUpdatingFormModel = false;
|
251
|
+
}
|
252
|
+
}
|
253
|
+
/**
|
254
|
+
* Convert a number value to the formmated display string. If there is no value
|
255
|
+
* return null
|
256
|
+
*/
|
257
|
+
formatDisplayNumber(value) {
|
258
|
+
if (value || value === 0) {
|
259
|
+
// Guard against calling toFixed if the value isn't a number. This is possible
|
260
|
+
// if patching a value from outside of the component as you don't have
|
261
|
+
// type checking there
|
262
|
+
if (this.showPrecision && this.decimals && !isNaN(value)) {
|
263
|
+
return value.toFixed(this.decimals);
|
264
|
+
}
|
265
|
+
else {
|
266
|
+
return value.toString();
|
267
|
+
}
|
268
|
+
}
|
269
|
+
else {
|
270
|
+
return null;
|
271
|
+
}
|
272
|
+
}
|
273
|
+
/**
|
274
|
+
* Position the units element and set the padding in the textbox input based
|
275
|
+
* on the width of the units element
|
276
|
+
*/
|
277
|
+
positionRightUnits() {
|
278
|
+
let unitsEl = this.textboxEl.nativeElement.querySelector('.units-right');
|
279
|
+
let inputEl = this.textboxEl.nativeElement.querySelector('input');
|
280
|
+
if (unitsEl && inputEl) {
|
281
|
+
let unitsWidth = unitsEl.offsetWidth;
|
282
|
+
if (unitsWidth > 0) {
|
283
|
+
this.unitsWidthCalculated = true;
|
284
|
+
}
|
285
|
+
let padding = unitsWidth;
|
286
|
+
this.renderer.setStyle(inputEl, 'padding-right', padding + 'px');
|
287
|
+
}
|
288
|
+
}
|
289
|
+
positionLeftUnits() {
|
290
|
+
let unitsEl = this.textboxEl.nativeElement.querySelector('.units-left');
|
291
|
+
let inputEl = this.textboxEl.nativeElement.querySelector('input');
|
292
|
+
if (unitsEl && inputEl) {
|
293
|
+
let unitsWidth = unitsEl.offsetWidth;
|
294
|
+
if (unitsWidth > 0) {
|
295
|
+
this.unitsWidthCalculated = true;
|
296
|
+
}
|
297
|
+
let padding = unitsWidth;
|
298
|
+
let leftPosition = getComputedStyle(unitsEl).left;
|
299
|
+
if (leftPosition) {
|
300
|
+
padding += parseInt(leftPosition.replace('px', ''), 0);
|
301
|
+
}
|
302
|
+
this.renderer.setStyle(inputEl, 'padding-left', padding + 'px');
|
303
|
+
}
|
304
|
+
}
|
305
|
+
/**
|
306
|
+
* Create and append the units element to the textbox element
|
307
|
+
*/
|
308
|
+
showUnits() {
|
309
|
+
let inputWrapper = this.textboxEl.nativeElement.querySelector('.input-wrapper');
|
310
|
+
if (inputWrapper) {
|
311
|
+
if (this.leftUnits) {
|
312
|
+
let unitsEl = this.textboxEl.nativeElement.querySelector('.units-left');
|
313
|
+
if (unitsEl) {
|
314
|
+
this.renderer.setProperty(unitsEl, 'innerHTML', this.leftUnits);
|
315
|
+
}
|
316
|
+
else {
|
317
|
+
this.renderer.appendChild(inputWrapper, this.makeUnitElement('left', this.leftUnits));
|
318
|
+
}
|
319
|
+
this.positionLeftUnits();
|
320
|
+
}
|
321
|
+
if (this.rightUnits) {
|
322
|
+
let unitsEl = this.textboxEl.nativeElement.querySelector('.units-right');
|
323
|
+
if (unitsEl) {
|
324
|
+
this.renderer.setProperty(unitsEl, 'innerHTML', this.rightUnits);
|
325
|
+
}
|
326
|
+
else {
|
327
|
+
this.renderer.appendChild(inputWrapper, this.makeUnitElement('right', this.rightUnits));
|
328
|
+
}
|
329
|
+
this.positionRightUnits();
|
330
|
+
}
|
331
|
+
}
|
332
|
+
}
|
333
|
+
makeUnitElement(side, text) {
|
334
|
+
let unitsEl = this.renderer.createElement('span');
|
335
|
+
this.renderer.setAttribute(unitsEl, 'class', `units units-${side}`);
|
336
|
+
this.renderer.setAttribute(unitsEl, 'id', `${this.id}_units`);
|
337
|
+
this.renderer.setAttribute(unitsEl, 'style', 'pointer-events: none');
|
338
|
+
this.renderer.setProperty(unitsEl, 'innerHTML', text);
|
339
|
+
return unitsEl;
|
340
|
+
}
|
341
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericboxComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
342
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumericboxComponent, selector: "ec-numericbox", inputs: { placeholder: "placeholder", decimals: "decimals", showPrecision: "showPrecision", maxPrecisionDigits: "maxPrecisionDigits", max: "max", min: "min", leftUnits: "leftUnits", rightUnits: "rightUnits", autoUpdateFormModel: "autoUpdateFormModel" }, viewQueries: [{ propertyName: "textboxEl", first: true, predicate: TextboxComponent, descendants: true, read: ElementRef, static: true }, { propertyName: "textboxInput", first: true, predicate: ["textbox"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\"> {{validationErrors | translate}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\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>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}: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-top:0;margin-bottom: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,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;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-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-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:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-form-control-color-disabled);opacity:.65}ec-textbox ::ng-deep .units{display:block;position:absolute;top:0;height:2rem;line-height:1.25rem;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}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-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}.control.invalid ec-textbox ::ng-deep input.ng-invalid:focus,.control.invalid ec-textbox ::ng-deep input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}.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}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-required,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-required{display:none}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i5.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] }); }
|
343
|
+
}
|
344
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericboxComponent, decorators: [{
|
345
|
+
type: Component,
|
346
|
+
args: [{ selector: 'ec-numericbox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [class.invalid]=\"formModel?.invalid && (formModel?.touched)\">\r\n\r\n <label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length && formModel?.touched && formModel?.invalid\"> {{validationErrors | translate}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n </label>\r\n\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>", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}: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-top:0;margin-bottom: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,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;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-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}label{color:var(--ec-form-control-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:required.is-empty:not(:disabled)~.units-left{left:1.25rem}ec-textbox ::ng-deep input.ng-invalid.ng-touched~.units-left{left:1.25rem}ec-textbox ::ng-deep .control:not(.is-readonly) input:disabled~.units{color:var(--ec-form-control-color-disabled);opacity:.65}ec-textbox ::ng-deep .units{display:block;position:absolute;top:0;height:2rem;line-height:1.25rem;padding:.375rem .25rem;z-index:2}ec-textbox ::ng-deep .units.units-right{right:0;padding-right:.5rem}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-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}.control.invalid ec-textbox ::ng-deep input.ng-invalid:focus,.control.invalid ec-textbox ::ng-deep input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}.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}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-invalid,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}.control.invalid ec-textbox ::ng-deep input.ng-invalid~.icon-required,.control.invalid ec-textbox ::ng-deep input.ng-valid~.icon-required{display:none}\n"] }]
|
347
|
+
}], ctorParameters: () => [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i0.Renderer2 }], propDecorators: { placeholder: [{
|
348
|
+
type: Input
|
349
|
+
}], decimals: [{
|
350
|
+
type: Input
|
351
|
+
}], showPrecision: [{
|
352
|
+
type: Input
|
353
|
+
}], maxPrecisionDigits: [{
|
354
|
+
type: Input
|
355
|
+
}], max: [{
|
356
|
+
type: Input
|
357
|
+
}], min: [{
|
358
|
+
type: Input
|
359
|
+
}], leftUnits: [{
|
360
|
+
type: Input
|
361
|
+
}], rightUnits: [{
|
362
|
+
type: Input
|
363
|
+
}], autoUpdateFormModel: [{
|
364
|
+
type: Input
|
365
|
+
}], textboxEl: [{
|
366
|
+
type: ViewChild,
|
367
|
+
args: [TextboxComponent, { read: ElementRef, static: true }]
|
368
|
+
}], textboxInput: [{
|
369
|
+
type: ViewChild,
|
370
|
+
args: ['textbox', { static: true }]
|
371
|
+
}] } });
|
372
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpY2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbnVtZXJpY2JveC9udW1lcmljYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9udW1lcmljYm94L251bWVyaWNib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBMEQsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pLLE9BQU8sRUFBbUIsa0JBQWtCLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7QUFHaEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUF1QixFQUFFLEdBQXVCLEVBQUUsUUFBNEIsRUFBRSxrQkFBc0MsRUFBZSxFQUFFO0lBQ3hLLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDaEMsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1FBRTlCLCtFQUErRTtRQUMvRSwwREFBMEQ7UUFDMUQsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7WUFFeEMsSUFB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QUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV0RCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDOytHQWpZUSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw4VkF1RWpCLGdCQUFnQiwyQkFBVSxVQUFVLCtMQ25KbkQsK3ZEQStCTTs7NEZENkNPLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDSSxlQUFlO21KQVdULFdBQVc7c0JBQTFCLEtBQUs7Z0JBTVUsUUFBUTtzQkFBdkIsS0FBSztnQkFPVSxhQUFhO3NCQUE1QixLQUFLO2dCQVNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFVVSxHQUFHO3NCQUFsQixLQUFLO2dCQVVVLEdBQUc7c0JBQWxCLEtBQUs7Z0JBTVUsU0FBUztzQkFBeEIsS0FBSztnQkFNVSxVQUFVO3NCQUF6QixLQUFLO2dCQU1VLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFLbUUsU0FBUztzQkFBakYsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFzQmYsWUFBWTtzQkFBM0QsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3ZhbGlkYXRpb24tbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZ2V0RGVjaW1hbFBhdHRlcm4sIGludGVnZXJQYXR0ZXJuIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLXBhdHRlcm5zJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwSGVscGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Zvcm0tZ3JvdXAuaGVscGVyJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xCYXNlIH0gZnJvbSBcIi4uL2Zvcm0tY29udHJvbC1iYXNlXCI7XHJcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50JztcclxuXHJcblxyXG4vKipcclxuICogQ3VzdG9tIHZhbGlkYXRvciB0byBjaGVjayB0aGF0IG1pbi9tYXggYW5kIHBhdHRlcm4gdmFsaWRhdGlvbiBpcyBtZXQgb24gdGhlIG51bWVyaWNib3hcclxuICogY29tcG9uZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbnVtZXJpY2JveFZhbGlkYXRpb24gPSAobWluOiBudW1iZXIgfCB1bmRlZmluZWQsIG1heDogbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWNpbWFsczogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXhQcmVjaXNpb25EaWdpdHM6IG51bWJlciB8IHVuZGVmaW5lZCk6IFZhbGlkYXRvckZuID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgICAgbGV0IGhhc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBjb250cm9sIGlzIGVtcHR5IHdlIHdvbid0IGF0dGVtcHQgdG8gdmFsaWRhdGUsIGlmIHRoZXJlIGlzIGEgcmVxdWlyZWRcclxuICAgICAgICAvLyB2YWxpZGF0b3Igd2Ugd2lsbCBuZXZlciBnZXQgaGVyZSB1bnRpbCB0aGVyZSBpcyBhIHZhbHVlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgY29udHJvbC52YWx1ZSAhPT0gXCJcIikge1xyXG5cclxuICAgICAgICAgICAgbGV0IG51bWVyaWNQYXR0ZXJuOiBSZWdFeHA7XHJcbiAgICAgICAgICAgIGlmIChkZWNpbWFscyAmJiBkZWNpbWFscyA+IDApIHtcclxuICAgICAgICAgICAgICAgIG51bWVyaWNQYXR0ZXJuID0gZ2V0RGVjaW1hbFBhdHRlcm4oZGVjaW1hbHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1heFByZWNpc2lvbkRpZ2l0cykge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RpbGwgbmVlZCB0byBjaGVjayBmb3IgYSB2YWxpZCBudW1iZXIgZm9ybWF0dGluZyB3aGVuIGluIG1heCBwcmVjaXNpb24gbW9kZVxyXG4gICAgICAgICAgICAgICAgbnVtZXJpY1BhdHRlcm4gPSBnZXREZWNpbWFsUGF0dGVybihtYXhQcmVjaXNpb25EaWdpdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQWxsb3cgYW4gb3B0aW9uYWwgbmVnYXRpdmUgc2lnbiBhbmQgYW55IG51bWJlciBvZiBkaWdpdHMgMC05XHJcbiAgICAgICAgICAgICAgICBudW1lcmljUGF0dGVybiA9IGludGVnZXJQYXR0ZXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIW51bWVyaWNQYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhQcmVjaXNpb25EaWdpdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRpbmcgdG8gYSBudW1iZXIgdGhlbiBiYWNrIHRvIHN0cmluZyByZW1vdmVzIHRyYWlsaW5nIHplcm9zLCBhbmQgdGhlIHJlZ2V4IHJlcGxhY2UgcmVtb3Zlc1xyXG4gICAgICAgICAgICAgICAgLy8gYW55IG5lZ2F0aXZlIHNpZ25zLCBsZWFkaW5nIHplcm9zIG9yIGRlY2ltYWwgcG9pbnRzIGZyb20gdGhlIG51bWJlci5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IE51bWJlcihjb250cm9sLnZhbHVlKS50b1N0cmluZygpLnJlcGxhY2UoL14tPy8sICcnKS5yZXBsYWNlKC8oXjBcXC4pfChcXC4pLywgJycpO1xyXG4gICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB2YWwubGVuZ3RoID4gbWF4UHJlY2lzaW9uRGlnaXRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBub3cga25vdyB3ZSBoYXZlIGEgdmFsaWQgbnVtYmVyLCBzbyB3ZSBjYW4gY2FzdCB0aGVzZSB0byBudW1iZXJzXHJcbiAgICAgICAgICAgIC8vIGZvciBwcm9wZXIgcmFuZ2UgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyKGNvbnRyb2wudmFsdWUpIDwgbWluKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiBOdW1iZXIoY29udHJvbC52YWx1ZSkgPiBtYXgpIHtcclxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhhc0Vycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBudW1lcmljYm94OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbjogbWluLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heDogbWF4LFxyXG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWxzOiBkZWNpbWFscyxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQcmVjaXNpb25EaWdpdHM6IG1heFByZWNpc2lvbkRpZ2l0c1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZWMtbnVtZXJpY2JveCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbnVtZXJpY2JveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9udW1lcmljYm94LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOdW1lcmljYm94Q29tcG9uZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0ZXh0Ym94IGlucHV0J3MgcGxhY2Vob2xkZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBkZWNpbWFscyBhbGxvd2VkLiAgSWYgbm90IHN1cHBsaWVkIHRoZSBpbnB1dCB2YWx1ZSB3aWxsIGJlIHZhbGlkYXRlZCBhcyBhXHJcbiAgICAgKiB3aG9sZSBudW1iZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGRlY2ltYWxzPzogbnVtYmVyO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgdHJhaWxpbmcgemVyb3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuXHJcbiAgICAgKiBEbyBub3QgdXNlIHdpdGggbWF4UHJlY2lzaW9uRGlnaXRzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1ByZWNpc2lvbj86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWF4aW11bSB0b3RhbCBkaWdpdHMgYSBudW1iZXIgY2FuIGhhdmUgbGVmdCBvciByaWdodCBvZiB0aGUgZGVjaW1hbCBwb2ludC5cclxuICAgICAqIER1ZSB0byBsaW1pdGF0aW9ucyB3aXRoIGhvdyBKUyBoYW5kbGVzIG51bWJlcnMsIHRoZSBtYXggdmFsdWUgZm9yIHRoaXMgaXMgMTUuXHJcbiAgICAgKiBOdW1iZXJzIGxvbmdlciB0aGFuIDE1IGRpZ2l0cyBtYXkgY2F1c2Ugcm91bmRpbmcgZXJyb3JzLlxyXG4gICAgICogRG8gbm90IHVzZSB3aXRoIHNob3dQcmVjaXNpb24gPSB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhQcmVjaXNpb25EaWdpdHM/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZCBpbiB0aGUgaW5wdXRcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGZvciBhZGRpbmcgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCB0byBnZXQgdGhlIGJyb3dzZXIgZnVuY3Rpb25hbGl0eVxyXG4gICAgICogZnJvbSB0aGUgaW5wdXQuICBJZiB5b3UgbmVlZCB0aGUgZm9ybSB0byBiZSB2YWxpZGF0ZWQgYmVmb3JlIHN1Ym1pc3Npb24sIGFwcGx5IHRoZVxyXG4gICAgICogbWF4IHZhbGlkYXRvciB0byB0aGUgZm9ybSBjb25yb2wuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXg/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZCBpbiB0aGUgaW5wdXRcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGZvciBhZGRpbmcgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCB0byBnZXQgdGhlIGJyb3dzZXIgZnVuY3Rpb25hbGl0eVxyXG4gICAgICogZnJvbSB0aGUgaW5wdXQuICBJZiB5b3UgbmVlZCB0aGUgZm9ybSB0byBiZSB2YWxpZGF0ZWQgYmVmb3JlIHN1Ym1pc3Npb24sIGFwcGx5IHRoZVxyXG4gICAgICogbWluIHZhbGlkYXRvciB0byB0aGUgZm9ybSBjb25yb2wuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW4/OiBudW1iZXI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBkaXNwbGF5IG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGlucHV0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsZWZ0VW5pdHM/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBkaXNwbGF5IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcmlnaHRVbml0cz86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHNldCB0byB0cnVlIHRoaXMgd2lsbCB1cGRhdGUgdGhlIGZvcm0gbW9kZWwgYWZ0ZXIgYSBkZWJvdW5jZSBhcyB0aGUgdXNlclxyXG4gICAgICogaW50ZXJhY3RzIHdpdGggdGhlIGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b1VwZGF0ZUZvcm1Nb2RlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHRleHRib3ggZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFRleHRib3hDb21wb25lbnQsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdGV4dGJveEVsITogRWxlbWVudFJlZjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW50ZXJuYWwgZm9ybSBtb2RlbCB3ZSB1c2UgdG8gZGlzcGxheSB0aGUgdmFsdWUgd2l0aCBmb3JtYXR0aW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0ZXh0Ym94Rm9ybU1vZGVsITogVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAgIC8qKiBGbGFnIHRvIHRlbGwgdGhlIHBhZ2Ugd2UgZmluYWxseSBjb21wdXRlZCBhIGdyZWF0ZXIgdGhhbiB6ZXJvXHJcbiAgICAgKiAgd2lkdGggZm9yIHVuaXRzIChpZiBhcHBsaWNhYmxlKVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVuaXRzV2lkdGhDYWxjdWxhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEZsYWcgdXNlZCB0byBmaWx0ZXIgdGhlIGZvcm0gbW9kZWxzIHZhbHVlIGNoYW5nZXMgc3Vic2NyaXB0aW9uXHJcbiAgICAgKiAgdG8gcHJldmVudCB0aGUgdGV4dGJveCBtb2RlbCBmcm9tIGJlaW5nIGZvcm1hdHRlZCBhcyB0aGUgZm9ybSBtb2RlbCBpcyB1cGRhdGVkXHJcbiAgICAgKiAgcHJvZ3JhbW1hdGljYWxseSB3aGVuIHRoZSB0ZXh0Ym94IG1vZGVsIHVwZGF0ZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhdXRvVXBkYXRpbmdGb3JtTW9kZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIHRleHRib3ggaW5wdXQgY29udHJvbFxyXG4gICAqL1xyXG4gICAgQFZpZXdDaGlsZCgndGV4dGJveCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdGV4dGJveElucHV0ITogVGV4dGJveENvbXBvbmVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlOiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIGZvcm1Hcm91cEhlbHBlcjogRm9ybUdyb3VwSGVscGVyLFxyXG4gICAgICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcih2YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsIGZvcm1Hcm91cEhlbHBlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIEFmdGVyVmlld0luaXQgbGlmZS1jeWNsZSBob29rXHJcbiAgICAgKiBTdWJzY3JpYmUgdG8gdGV4dGJveCBtb2RlbCB2YWx1ZSBjaGFuZ2VzIGlmIHRoZSBob3N0aW5nXHJcbiAgICAgKiBwYWdlIGhhcyBvcHRlZCBpbiBmb3IgdGhpcyBjb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRvVXBkYXRlRm9ybU1vZGVsKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSxcclxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIG9uQ2hhbmdlcyBsaWZlLWN5Y2xlIGhvb2tcclxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3MgfCBMaWZlLWN5Y2xlIGhvb2tzfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIC8vIElmIGVpdGhlciB1bml0cyBjaGFuZ2UgYWZ0ZXIgd2UndmUgY2FsY3VsYXRlZCxcclxuICAgICAgICAvLyByZXNldCB0aGUgZmxhZyBzbyB3ZSBjYW4gcmVhY3QgYW5kIHJlZHJhd1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLnJpZ2h0VW5pdHMgfHwgY2hhbmdlcy5sZWZ0VW5pdHMpIHtcclxuICAgICAgICAgICAgdGhpcy51bml0c1dpZHRoQ2FsY3VsYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5ndWxhciBvbkluaXQgbGlmZWN5Y2xlIGhvb2tcclxuICAgICAqIElmIHVuaXRzIGlzIGRlZmluZWQsIHNldCB0aGUgcG9zaXRpb24gYW5kIGxpc3RlbiBmb3Igc3RhdHVzIGNoYW5nZXMgc28gd2VcclxuICAgICAqIGNhbiB1cGRhdGUgdGhlIHBvc2l0aW9uaW5nIG9mIHRoZSB1bml0cyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0ZXh0Ym94IGZvcm0gbW9kZWwgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gbW9kZWwgYW5kIHN5bmNocm9uaXplXHJcbiAgICAgICAgLy8gZGlzYWJsZWQgc3RhdGVcclxuICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuZm9ybU1vZGVsLnZhbHVlLCBkaXNhYmxlZDogdGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQgfSk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCdzIGVycm9ycyB3aGVuIHRoZSB0ZXh0Ym94IGZvcm0gbW9kZWwgc3RhdHVzIGNoYW5nZXNcclxuICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Nb2RlbC5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zZXRFcnJvcnModGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmVycm9ycyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyBTeW5jaHJvbml6ZSBkaXNhYmxlZCBzdGF0ZSBiZXR3ZWVuIGZvcm0gbW9kZWwgYW5kIGludGVybmFsIHRleHRib3ggZm9ybSBtb2RlbFxyXG4gICAgICAgIHRoaXMuZm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0ZXh0Ym94IHZhbGlkYXRvcnNcclxuICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsaWRhdG9ycyh0aGlzLmdldFZhbGlkYXRvcnMoKSk7XHJcblxyXG4gICAgICAgIC8vIE5vdyB0aGF0IHRoZSB0ZXh0Ym94IGlzIHNldCB1cCB3ZSB3aWxsIHNldCBpdCdzIHZhbHVlIHRvIHdoYXRldmVyIHRoZVxyXG4gICAgICAgIC8vIGZvcm0gbW9kZWwgaGFkIHdoZW4gd2UgaW5pdGlhbGl6ZWRcclxuICAgICAgICB0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUodGhpcy5mb3JtYXREaXNwbGF5TnVtYmVyKHRoaXMuZm9ybU1vZGVsLnZhbHVlKSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBmb3JtIG1vZGVsJ3MgdmFsdWUgY2hhbmdlcyBwcm9ncmFtbWF0aWNhbGx5IHdlIG5lZWQgdG8gdXBkYXRlIHRoZVxyXG4gICAgICAgIC8vIHRleHRib3ggZm9ybSBtb2RlbFxyXG4gICAgICAgIHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbHRlciBvdXQgd2hlbiB3ZSBhcmUgdXBkYXRpbmcgaXQgcHJvZ3JhbW1hdGljYWxseSBpZiB0aGVcclxuICAgICAgICAgICAgLy8gaG9zdGluZyBwYWdlIGhhcyBvcHRlZCBpbnRvIHRoZSBhdXRvIHVwZGF0aW5nIGlucHV0XHJcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5hdXRvVXBkYXRpbmdGb3JtTW9kZWwpLFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKHRoaXMuZm9ybWF0RGlzcGxheU51bWJlcih2YWx1ZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHRleHRib3ggc3RhdHVzIGNoYW5nZXMgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGxlZnQgdW5pdHMgcG9zaXRpb24gYmVjYXVzZVxyXG4gICAgICAgIC8vIHdlIHdhbnQgdG8gbWFrZSByb29tIGZvciB0aGUgaW52YWxpZCBpY29uXHJcbiAgICAgICAgaWYgKHRoaXMubGVmdFVuaXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25MZWZ0VW5pdHMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuZ3VsYXIgYWZ0ZXJWaWV3Q2hlY2tlZCBsaWZlY3ljbGUgaG9va1xyXG4gICAgICogU2hvdyB0aGUgdW5pdHMgZWxlbWVudCBpZiB1bml0cyBpcyBkZWZpbmVkLiBSdW5zIGFmdGVyIGV2ZXJ5IG5nT25DaGFuZ2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCh0aGlzLmxlZnRVbml0cyB8fCB0aGlzLnJpZ2h0VW5pdHMpICYmICF0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd1VuaXRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb24gdGhhdCBidWlsZHMgYW5kIHJldHVybnMgYSBWYWxpZGF0b3JGbiBhcnJheSB0byBzZXQgb24gdGhlIGZvcm0gY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbGlkYXRvcnMoKTogVmFsaWRhdG9yRm5bXSB7XHJcbiAgICAgICAgbGV0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKG51bWVyaWNib3hWYWxpZGF0aW9uKHRoaXMubWluLCB0aGlzLm1heCwgdGhpcy5kZWNpbWFscywgdGhpcy5tYXhQcmVjaXNpb25EaWdpdHMpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb2N1cyBvdXQgZXZlbnQgaGFuZGxlciBmb3IgdGhlIFRleHRib3ggY29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkZvY3VzT3V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsVmFsdWUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEZ1bmN0aW9uIHRvIHNldCBmb2N1cyBvbiBhbiBpbnB1dCBwcm9ncmFtYXRpY2FsbHkgYWZ0ZXIgdGhlIHBhZ2VcclxuICAgICogaGFkIGJlZW4gcmVuZGVyZWQuICBUaGUgaGlnaGxpZ2h0IHRleHQgZmxhZyB3aWxsIHNlbGVjdCB0aGUgdGV4dFxyXG4gICAgKiB3aXRoaW4gdGhlIGlucHV0IGlmIHBhc3NlZCBpbiBhbmQgdHJ1ZVxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBzZXRGb2N1cyhoaWdobGlnaHRUZXh0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGV4dGJveElucHV0LnNldEZvY3VzKGhpZ2hsaWdodFRleHQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gdGhlIHRleHRib3ggbW9kZWwgdXBkYXRlcyB3ZSBuZWVkIHRvIGFkZCBzb21lIGRpc3BsYXkgZm9ybWF0dGluZyBmb3JcclxuICAgICAqIGRpc3BsYXkgaW4gdGhlIHRleHRib3ggYW5kIGNhc3QgdGhlIHRleHRib3ggbW9kZWwgdG8gYSBudW1iZXIuIEF2b2lkIHVwZGF0aW5nXHJcbiAgICAgKiB0aGUgZm9ybSBtb2RlbCB3aGVuIHRoZSB2YWx1ZSBkb2Vzbid0IGNoYW5nZSBiZWNhdXNlIGxpc3RlbmVycyB3aWxsIGZpcmUgZm9yIG5vIHJlYXNvblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZUZvcm1Nb2RlbFZhbHVlKGlzRm9jdXNPdXQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZUZvcm1Nb2RlbCkge1xyXG4gICAgICAgICAgICAvLyBNYWtlIGl0IHNvIHZhbHVlIGNoYW5nZXMgb24gdGhlIGZvcm0gbW9kZWwgZG8gbm90IGdldCB0cmlnZ2VyZWRcclxuICAgICAgICAgICAgLy8gYXMgd2UgY2hhbmdlIGl0IHByb2dyYW1tYXRpY2FsbHkuICBXZSBkbyBub3Qgd2FudCB0aGUgdGV4dGJveFxyXG4gICAgICAgICAgICAvLyBtb2RlbCB0byBiZSB1cGRhdGVkIHdoaWxlIHRoZSB1c2VyIGlzIGluIHRoZSBpbnB1dFxyXG4gICAgICAgICAgICB0aGlzLmF1dG9VcGRhdGluZ0Zvcm1Nb2RlbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbGlkIHx8IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb3V0IHdpdGggbnVsbCBmb3IgdGhlIG51bWJlciwgaWYgdGhlIHRleHRib3ggdmFsdWUgaXMgbm90IGEgbnVtYmVyXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGNsZWFyIGl0IG91dCBvbiBmb2N1cyBvdXRcclxuICAgICAgICAgICAgICAgIGxldCBudW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdGV4dGJveCBtb2RlbCBpcyBhIG51bWJlciBiZWZvcmUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGVcclxuICAgICAgICAgICAgICAgIC8vIGZvcm0gbW9kZWwgdmFsdWUgd2l0aCBpdFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSAmJiAhaXNOYU4odGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE91ciB2YWx1ZSBpcyBhIGxlZ2l0IG51bWJlciwgb24gZm9jdXMgb3V0IHdlIHdpbGwgZm9ybWF0IGl0IGlmIG5lZWRlZFxyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlciA9IE51bWJlcih0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgdmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQsIGlmIG5vdCBkb24ndCBzZXQgdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG8gYXZvaWQgZXh0cmEgbGlzdGVuZXIgY2FsbHNcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtTW9kZWwudmFsdWUgIT09IG51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zZXRWYWx1ZShudW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGV4dGJveCBtb2RlbCBpcyBub3QgYSBudW1iZXIsIGNoZWNrIHRvIHNlZSBpZiBvdXIgZm9ybSBtb2RlbCBoYXMgYSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpZiBzbyBjbGVhciBpdCBvdXRcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtTW9kZWwudmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Nb2RlbC5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdpbGwgdXBkYXRlIHRoZSB0ZXh0Ym94IGZvcm0gbW9kZWwgd2l0aCBmb3JtYXR0aW5nIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICAgICAgLy8gb24gRm9jdXMgb3V0LiAgVGhpcyB3b3JrcyB3ZWxsIGZvciB0aGUgdXNlciB3aGV0aGVyIHRoZSBhdXRvIHVwZGF0ZVxyXG4gICAgICAgICAgICAgICAgLy8gaXMgb3B0ZWQgaW4gb3Igbm90XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c091dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdERpc3BsYXlOdW1iZXIobnVtYmVyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRpc3BsYXksIGp1c3QgZW5zdXJpbmcgd2UgcmVzZXQgb3VyIGZsYWcgdGhhdCBmaWx0ZXJzXHJcbiAgICAgICAgICAgIC8vIHRoZSBmb3JtIG1vZGVsIHZhbHVlIGNoYW5nZXNcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9VcGRhdGluZ0Zvcm1Nb2RlbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgYSBudW1iZXIgdmFsdWUgdG8gdGhlIGZvcm1tYXRlZCBkaXNwbGF5IHN0cmluZy4gSWYgdGhlcmUgaXMgbm8gdmFsdWVcclxuICAgICAqIHJldHVybiBudWxsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZm9ybWF0RGlzcGxheU51bWJlcih2YWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGNhbGxpbmcgdG9GaXhlZCBpZiB0aGUgdmFsdWUgaXNuJ3QgYSBudW1iZXIuICBUaGlzIGlzIHBvc3NpYmxlXHJcbiAgICAgICAgICAgIC8vIGlmIHBhdGNoaW5nIGEgdmFsdWUgZnJvbSBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQgYXMgeW91IGRvbid0IGhhdmVcclxuICAgICAgICAgICAgLy8gdHlwZSBjaGVja2luZyB0aGVyZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93UHJlY2lzaW9uICYmIHRoaXMuZGVjaW1hbHMgJiYgIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQodGhpcy5kZWNpbWFscyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBvc2l0aW9uIHRoZSB1bml0cyBlbGVtZW50IGFuZCBzZXQgdGhlIHBhZGRpbmcgaW4gdGhlIHRleHRib3ggaW5wdXQgYmFzZWRcclxuICAgICAqIG9uIHRoZSB3aWR0aCBvZiB0aGUgdW5pdHMgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc2l0aW9uUmlnaHRVbml0cygpOiB2b2lkIHtcclxuICAgICAgICBsZXQgdW5pdHNFbCA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnVuaXRzLXJpZ2h0Jyk7XHJcbiAgICAgICAgbGV0IGlucHV0RWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcblxyXG4gICAgICAgIGlmICh1bml0c0VsICYmIGlucHV0RWwpIHtcclxuICAgICAgICAgICAgbGV0IHVuaXRzV2lkdGggPSB1bml0c0VsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVuaXRzV2lkdGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXRzV2lkdGhDYWxjdWxhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHBhZGRpbmcgPSB1bml0c1dpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGlucHV0RWwsICdwYWRkaW5nLXJpZ2h0JywgcGFkZGluZyArICdweCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBwb3NpdGlvbkxlZnRVbml0cygpIHtcclxuICAgICAgICBsZXQgdW5pdHNFbCA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnVuaXRzLWxlZnQnKTtcclxuICAgICAgICBsZXQgaW5wdXRFbCA9IHRoaXMudGV4dGJveEVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuXHJcbiAgICAgICAgaWYgKHVuaXRzRWwgJiYgaW5wdXRFbCkge1xyXG4gICAgICAgICAgICBsZXQgdW5pdHNXaWR0aCA9IHVuaXRzRWwub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgICAgICAgICBpZiAodW5pdHNXaWR0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudW5pdHNXaWR0aENhbGN1bGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgcGFkZGluZyA9IHVuaXRzV2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSBnZXRDb21wdXRlZFN0eWxlKHVuaXRzRWwpLmxlZnQ7XHJcbiAgICAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHBhZGRpbmcgKz0gcGFyc2VJbnQobGVmdFBvc2l0aW9uLnJlcGxhY2UoJ3B4JywgJycpLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGlucHV0RWwsICdwYWRkaW5nLWxlZnQnLCBwYWRkaW5nICsgJ3B4Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGFuZCBhcHBlbmQgdGhlIHVuaXRzIGVsZW1lbnQgdG8gdGhlIHRleHRib3ggZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNob3dVbml0cygpOiB2b2lkIHtcclxuICAgICAgICBsZXQgaW5wdXRXcmFwcGVyID0gdGhpcy50ZXh0Ym94RWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtd3JhcHBlcicpO1xyXG5cclxuICAgICAgICBpZiAoaW5wdXRXcmFwcGVyKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnRVbml0cykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1sZWZ0Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAodW5pdHNFbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodW5pdHNFbCwgJ2lubmVySFRNTCcsIHRoaXMubGVmdFVuaXRzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbnB1dFdyYXBwZXIsIHRoaXMubWFrZVVuaXRFbGVtZW50KCdsZWZ0JywgdGhpcy5sZWZ0VW5pdHMpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25MZWZ0VW5pdHMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHRVbml0cykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnRleHRib3hFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51bml0cy1yaWdodCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVuaXRzRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHVuaXRzRWwsICdpbm5lckhUTUwnLCB0aGlzLnJpZ2h0VW5pdHMpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGlucHV0V3JhcHBlciwgdGhpcy5tYWtlVW5pdEVsZW1lbnQoJ3JpZ2h0JywgdGhpcy5yaWdodFVuaXRzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uUmlnaHRVbml0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWFrZVVuaXRFbGVtZW50KHNpZGU6ICdsZWZ0JyB8ICdyaWdodCcsIHRleHQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgbGV0IHVuaXRzRWwgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh1bml0c0VsLCAnY2xhc3MnLCBgdW5pdHMgdW5pdHMtJHtzaWRlfWApO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHVuaXRzRWwsICdpZCcsIGAke3RoaXMuaWR9X3VuaXRzYCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodW5pdHNFbCwgJ3N0eWxlJywgJ3BvaW50ZXItZXZlbnRzOiBub25lJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh1bml0c0VsLCAnaW5uZXJIVE1MJywgdGV4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiB1bml0c0VsO1xyXG4gICAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImNvbnRyb2wgY29udHJvbC1sYWJlbC17e2xhYmVsUG9zaXRpb259fVwiXHJcbiAgICAgW2NsYXNzLmludmFsaWRdPVwiZm9ybU1vZGVsPy5pbnZhbGlkICYmIChmb3JtTW9kZWw/LnRvdWNoZWQpXCI+XHJcblxyXG4gICAgICAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIj5cclxuICAgICAgICAgICAgICA8c3Bhbj57e2xhYmVsIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCAmJiBmb3JtTW9kZWw/LnRvdWNoZWQgJiYgZm9ybU1vZGVsPy5pbnZhbGlkXCI+Jm5ic3A7e3t2YWxpZGF0aW9uRXJyb3JzIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGVjLWhlbHAtcG9wb3ZlciBpZD1cInt7aWR9fV9oZWxwUG9wb3ZlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbXktbjMgbXgtbjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cInt7aGVscFBvcG92ZXIgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UG9zaXRpb249XCJ7e2hlbHBQb3BvdmVyUG9zaXRpb259fVwiPlxyXG4gICAgICAgICAgICAgIDwvZWMtaGVscC1wb3BvdmVyPlxyXG4gICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICA8IS0tIFNldHRpbmcgdGhlIG1heGxlbmd0aCB0byAxMyB0byBjb21iYXQgdGhlIHVzZXIgZnJvbSBlbnRlcmluZyB0b28gbGFyZ2Ugb2YgYSBudW1iZXJcclxuICAgICAgICAgZm9yIGphdmFzY3JpcHQgdG8gc3VwcG9ydC4gIElmIHRoZSB1c2VyIGVudGVycyBhbGwgMTMgY2hhcmFjdGVycyBhcyBudW1iZXJzIGFuZCB3ZSBoYXZlIHNob3dQcmVjaXNpb24gc2V0LCBhZGRpbmcgdGhlXHJcbiAgICAgICAgIGRlY2ltYWwgYW5kIHRoZSBlbXB0eSB6ZXJvIGNoYXJhY3RlcnMgd2lsbCBnZXQgdGhlbSBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0byBlZGl0IGl0IHRoZXkgbXVzdCByZW1vdmUgY2hhcmFjdGVyc1xyXG4gICAgICAgICBhcyB3ZSB3b3VsZCBwdXNoIHRoZW0gcGFzdCB0aGUgbGltaXQgLS0+XHJcbiAgICAgICA8ZWMtdGV4dGJveCBbaWRdPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgI3RleHRib3hcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1pbnB1dCBtYi0wXCJcclxuICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1heFByZWNpc2lvbkRpZ2l0cyA/IG1heFByZWNpc2lvbkRpZ2l0cyArIDMgOiAxM1wiXHJcbiAgICAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInRleHRib3hGb3JtTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwidG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCI+XHJcbiAgICAgICA8L2VjLXRleHRib3g+XHJcbjwvZGl2PiJdfQ==
|
@@ -0,0 +1,117 @@
|
|
1
|
+
import { OverlayConfig } from '@angular/cdk/overlay';
|
2
|
+
import { TemplatePortal } from '@angular/cdk/portal';
|
3
|
+
import { Component, HostListener, Input, ViewChild } from '@angular/core';
|
4
|
+
import { of, Subject } from 'rxjs';
|
5
|
+
import { delay, switchMap, takeUntil } from 'rxjs/operators';
|
6
|
+
import * as i0 from "@angular/core";
|
7
|
+
import * as i1 from "@angular/cdk/overlay";
|
8
|
+
import * as i2 from "../../display/tooltip/tooltip.service";
|
9
|
+
import * as i3 from "@angular/common";
|
10
|
+
import * as i4 from "../../display/tags/tags.component";
|
11
|
+
export class PopoverComponent {
|
12
|
+
constructor(overlay, viewContainerRef, elementRef, tooltipService) {
|
13
|
+
this.overlay = overlay;
|
14
|
+
this.viewContainerRef = viewContainerRef;
|
15
|
+
this.elementRef = elementRef;
|
16
|
+
this.tooltipService = tooltipService;
|
17
|
+
/** An optional icon that, if provided, enables the popover to use it as the anchor element */
|
18
|
+
this.icon = '';
|
19
|
+
this.contentPosition = 'top-left';
|
20
|
+
this.iconHoverClass = '';
|
21
|
+
this.isVisible = false;
|
22
|
+
this.mouseOver = new Subject();
|
23
|
+
this.interrupt = new Subject();
|
24
|
+
}
|
25
|
+
/** When the popover initializes, if a new tagType is provided for the hover state of the popover,
|
26
|
+
* we use it to update the type of our "hoverTag" (which controls background-color of tag)
|
27
|
+
*/
|
28
|
+
ngOnInit() {
|
29
|
+
if (this.tag && this.tagHoverType) {
|
30
|
+
this.hoverTag = { ...this.tag, type: this.tagHoverType };
|
31
|
+
}
|
32
|
+
this.mouseOver
|
33
|
+
.pipe(switchMap(v => of(v).pipe(delay(300), takeUntil(this.interrupt))))
|
34
|
+
.subscribe(() => this.show());
|
35
|
+
}
|
36
|
+
ngOnDestroy() {
|
37
|
+
this.hide();
|
38
|
+
}
|
39
|
+
show() {
|
40
|
+
if (!this.isVisible) {
|
41
|
+
const overlayConfig = this.getOverlayConfig();
|
42
|
+
this.overlayRef = this.overlay.create(overlayConfig);
|
43
|
+
const contentPortal = new TemplatePortal(this.content, this.viewContainerRef);
|
44
|
+
this.contentViewRef = this.overlayRef.attach(contentPortal);
|
45
|
+
this.isVisible = true;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
onMouseOver() {
|
49
|
+
this.mouseOver.next();
|
50
|
+
}
|
51
|
+
onLeave() {
|
52
|
+
this.interrupt.next();
|
53
|
+
}
|
54
|
+
/**
|
55
|
+
* Hides the popover if the mouse moves outside of the popover content
|
56
|
+
*/
|
57
|
+
onMouseMove(event) {
|
58
|
+
let callCallback = false;
|
59
|
+
if (!this.contentRect) {
|
60
|
+
this.contentRect = this.contentViewRef?.rootNodes[0].getBoundingClientRect();
|
61
|
+
}
|
62
|
+
if (this.contentRect) {
|
63
|
+
callCallback = this.tooltipService.onMove(event, this.contentRect);
|
64
|
+
}
|
65
|
+
if (callCallback) {
|
66
|
+
this.hide();
|
67
|
+
}
|
68
|
+
}
|
69
|
+
hide() {
|
70
|
+
this.interrupt.next();
|
71
|
+
this.overlayRef?.dispose();
|
72
|
+
this.isVisible = false;
|
73
|
+
this.contentRect = undefined;
|
74
|
+
}
|
75
|
+
getOverlayConfig() {
|
76
|
+
const position = this.getPosition();
|
77
|
+
const positionStrategy = this.overlay.position()
|
78
|
+
.flexibleConnectedTo(this.elementRef)
|
79
|
+
.withPositions([position]);
|
80
|
+
const config = new OverlayConfig({
|
81
|
+
positionStrategy: positionStrategy
|
82
|
+
});
|
83
|
+
return config;
|
84
|
+
}
|
85
|
+
getPosition() {
|
86
|
+
const position = this.contentPosition.split('-');
|
87
|
+
const overlayX = (position[1] == 'left' ? 'start' : 'end');
|
88
|
+
const overlayY = position[0];
|
89
|
+
return { originX: overlayX, originY: overlayY, overlayX: overlayX, overlayY: overlayY };
|
90
|
+
}
|
91
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i2.TooltipService }], target: i0.ɵɵFactoryTarget.Component }); }
|
92
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PopoverComponent, selector: "ec-popover", inputs: { icon: "icon", tag: "tag", tagHoverType: "tagHoverType", contentPosition: "contentPosition", iconHoverClass: "iconHoverClass" }, host: { listeners: { "mouseover": "onMouseOver()", "mouseleave": "onLeave()" } }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<!-- Before hover state -->\r\n<div class=\"p-2\">\r\n <i *ngIf=\"!tag\" class=\"ec-icon {{icon}} ec-icon-sm\"></i>\r\n <ec-tags *ngIf=\"tag\"\r\n [isCondensed] = \"true\"\r\n [tags]=\"tag\">\r\n </ec-tags>\r\n</div>\r\n<!-- ./Before hover state -->\r\n\r\n<!-- Hover state -->\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 *ngIf=\"!tag\" class=\"ec-icon {{icon}} ec-icon-sm {{iconHoverClass}}\"></i>\r\n <ec-tags *ngIf=\"tag\"\r\n [isCondensed]=\"true\"\r\n [tags]=\"hoverTag\">\r\n </ec-tags>\r\n </div>\r\n</ng-template>\r\n<!-- ./Hover state -->\r\n", styles: [":host{line-height:.75rem;display:inline-block}.popover-content{border-radius:var(--ec-border-radius);box-shadow:0 3px 6px #1a1a231f;overflow:hidden;position:relative}.popover-content+div{position:absolute;line-height:.75rem}.popover-content+div.top-left{top:0;left:0}.popover-content+div.top-right{top:0;right:0}.popover-content+div.bottom-right{bottom:0;right:0}.popover-content+div.bottom-left{bottom:0;left:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TagsComponent, selector: "ec-tags", inputs: ["id", "tags", "wrap", "isCondensed"], outputs: ["tagClosed"] }] }); }
|
93
|
+
}
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverComponent, decorators: [{
|
95
|
+
type: Component,
|
96
|
+
args: [{ selector: 'ec-popover', template: "<!-- Before hover state -->\r\n<div class=\"p-2\">\r\n <i *ngIf=\"!tag\" class=\"ec-icon {{icon}} ec-icon-sm\"></i>\r\n <ec-tags *ngIf=\"tag\"\r\n [isCondensed] = \"true\"\r\n [tags]=\"tag\">\r\n </ec-tags>\r\n</div>\r\n<!-- ./Before hover state -->\r\n\r\n<!-- Hover state -->\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 *ngIf=\"!tag\" class=\"ec-icon {{icon}} ec-icon-sm {{iconHoverClass}}\"></i>\r\n <ec-tags *ngIf=\"tag\"\r\n [isCondensed]=\"true\"\r\n [tags]=\"hoverTag\">\r\n </ec-tags>\r\n </div>\r\n</ng-template>\r\n<!-- ./Hover state -->\r\n", styles: [":host{line-height:.75rem;display:inline-block}.popover-content{border-radius:var(--ec-border-radius);box-shadow:0 3px 6px #1a1a231f;overflow:hidden;position:relative}.popover-content+div{position:absolute;line-height:.75rem}.popover-content+div.top-left{top:0;left:0}.popover-content+div.top-right{top:0;right:0}.popover-content+div.bottom-right{bottom:0;right:0}.popover-content+div.bottom-left{bottom:0;left:0}\n"] }]
|
97
|
+
}], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i2.TooltipService }], propDecorators: { icon: [{
|
98
|
+
type: Input
|
99
|
+
}], tag: [{
|
100
|
+
type: Input
|
101
|
+
}], tagHoverType: [{
|
102
|
+
type: Input
|
103
|
+
}], contentPosition: [{
|
104
|
+
type: Input
|
105
|
+
}], iconHoverClass: [{
|
106
|
+
type: Input
|
107
|
+
}], content: [{
|
108
|
+
type: ViewChild,
|
109
|
+
args: ['content']
|
110
|
+
}], onMouseOver: [{
|
111
|
+
type: HostListener,
|
112
|
+
args: ['mouseover']
|
113
|
+
}], onLeave: [{
|
114
|
+
type: HostListener,
|
115
|
+
args: ['mouseleave']
|
116
|
+
}] } });
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4QixhQUFhLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBK0IsWUFBWSxFQUFFLEtBQUssRUFBMEIsU0FBUyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUNqSixPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBVzdELE1BQU0sT0FBTyxnQkFBZ0I7SUFrQzNCLFlBQ1UsT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3RCLGNBQThCO1FBSDlCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXBDeEMsOEZBQThGO1FBQ3JGLFNBQUksR0FBWSxFQUFFLENBQUM7UUFRbkIsb0JBQWUsR0FBMkIsVUFBVSxDQUFDO1FBRXJELG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBZ0I3QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTNCLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2hD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LEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDL0IsZ0JBQWdCLEVBQUUsZ0JBQWdCO1NBQ25DLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsTUFBTSxRQUFRLEdBQXFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzFGLENBQUM7K0dBcElVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLGtYQ2Y3QiwyeEJBeUJBOzs0RkRWYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsWUFBWTtpS0FPYixJQUFJO3NCQUFaLEtBQUs7Z0JBR0csR0FBRztzQkFBWCxLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUV1QixPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLFNBQVM7Z0JBZ0ViLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsV0FBVztnQkFNbEIsT0FBTztzQkFEYixZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWxheSwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRhZywgVGFnVHlwZSB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFncy90YWcnO1xyXG5pbXBvcnQgeyBUb29sdGlwU2VydmljZSB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdG9vbHRpcC90b29sdGlwLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IHR5cGUgUG9wb3ZlckNvbnRlbnRQb3NpdGlvbiA9ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtcG9wb3ZlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3BvcG92ZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUG9wb3ZlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIC8qKiBBbiBvcHRpb25hbCBpY29uIHRoYXQsIGlmIHByb3ZpZGVkLCBlbmFibGVzIHRoZSBwb3BvdmVyIHRvIHVzZSBpdCBhcyB0aGUgYW5jaG9yIGVsZW1lbnQgKi9cclxuICBASW5wdXQoKSBpY29uPzogc3RyaW5nID0gJyc7XHJcbiAgXHJcbiAgLyoqIEFuIG9wdGlvbmFsIHRhZyB0aGF0LCBpZiBwcm92aWRlZCwgZW5hYmxlcyB0aGUgcG9wb3ZlciB0byB1c2UgaXQgYXMgdGhlIGFuY2hvciBlbGVtZW50ICovXHJcbiAgQElucHV0KCkgdGFnPzogVGFnO1xyXG5cclxuICAvKiogVXNlZCB0byBkZW5vdGUgdGhlIGhvdmVyIHRhZydzIHR5cGUgKGFuZCB0aHVzIGJhY2tncm91bmQtY29sb3IpICovXHJcbiAgQElucHV0KCkgdGFnSG92ZXJUeXBlPzogVGFnVHlwZTtcclxuXHJcbiAgQElucHV0KCkgY29udGVudFBvc2l0aW9uOiBQb3BvdmVyQ29udGVudFBvc2l0aW9uID0gJ3RvcC1sZWZ0JztcclxuXHJcbiAgQElucHV0KCkgaWNvbkhvdmVyQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG5cclxuICBAVmlld0NoaWxkKCdjb250ZW50JykgcHVibGljIGNvbnRlbnQhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBcclxuXHJcbiAgLyoqIEluIHRoZSB0ZW1wbGF0ZSwgd2UgdXNlIGFuIGVjLXRhZ3MgZWxlbWVudCBmb3IgdGhlIHByZS1ob3ZlciBzdGF0ZSBhbmQgYW4gZW50aXJlbHlcclxuICAgKiAgc2VwYXJhdGUgZWMtdGFncyBlbGVtZW50IGZvciBvdXIgaG92ZXIgc3RhdGUsIHJlc3VsdGluZyBpbiB0d28gY29tcG9uZW50cy4gVG8gYWNoaWV2ZSBhIGNoYW5nZSBcclxuICAgKiBpbiB0aGUgYmFja2dyb3VuZC1jb2xvciBmb3Igb3VyIGFuY2hvciB0YWcsIG9uIGhvdmVyLCBhIGRpZmZlcmVudCB0YWcudGFnVHlwZSBtdXN0IGJlIHByb3ZpZGVkIG9uIHRoZVxyXG4gICAqIHNlY29uZCBlYy10YWcgZWxlbWVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBob3ZlclRhZz86IFRhZztcclxuXHJcbiAgcHJpdmF0ZSBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcclxuICBwcml2YXRlIGNvbnRlbnRWaWV3UmVmPzogRW1iZWRkZWRWaWV3UmVmPGFueT47XHJcbiAgcHJpdmF0ZSBjb250ZW50UmVjdDogRE9NUmVjdCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGlzVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIG1vdXNlT3ZlciA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSBpbnRlcnJ1cHQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgdG9vbHRpcFNlcnZpY2U6IFRvb2x0aXBTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIC8qKiBXaGVuIHRoZSBwb3BvdmVyIGluaXRpYWxpemVzLCBpZiBhIG5ldyB0YWdUeXBlIGlzIHByb3ZpZGVkIGZvciB0aGUgaG92ZXIgc3RhdGUgb2YgdGhlIHBvcG92ZXIsIFxyXG4gICAqICB3ZSB1c2UgaXQgdG8gdXBkYXRlIHRoZSB0eXBlIG9mIG91ciBcImhvdmVyVGFnXCIgKHdoaWNoIGNvbnRyb2xzIGJhY2tncm91bmQtY29sb3Igb2YgdGFnKSBcclxuICAgKi9cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnRhZyAmJiB0aGlzLnRhZ0hvdmVyVHlwZSkge1xyXG4gICAgICB0aGlzLmhvdmVyVGFnID0gey4uLnRoaXMudGFnLCB0eXBlOiB0aGlzLnRhZ0hvdmVyVHlwZSB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb3VzZU92ZXJcclxuICAgIC5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAodiA9PlxyXG4gICAgICAgIG9mKHYpLnBpcGUoXHJcbiAgICAgICAgICBkZWxheSgzMDApLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuaW50ZXJydXB0KVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNob3coKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93KCkge1xyXG5cclxuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSB0aGlzLmdldE92ZXJsYXlDb25maWcoKTtcclxuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcclxuICBcclxuICAgICAgY29uc3QgY29udGVudFBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmNvbnRlbnQsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XHJcbiAgICAgIHRoaXMuY29udGVudFZpZXdSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKGNvbnRlbnRQb3J0YWwpO1xyXG4gIFxyXG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZW92ZXInKVxyXG4gIHB1YmxpYyBvbk1vdXNlT3ZlcigpIHtcclxuICAgIHRoaXMubW91c2VPdmVyLm5leHQoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxyXG4gIHB1YmxpYyBvbkxlYXZlKCkge1xyXG4gICAgdGhpcy5pbnRlcnJ1cHQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGlkZXMgdGhlIHBvcG92ZXIgaWYgdGhlIG1vdXNlIG1vdmVzIG91dHNpZGUgb2YgdGhlIHBvcG92ZXIgY29udGVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgbGV0IGNhbGxDYWxsYmFjayA9IGZhbHNlO1xyXG4gICAgXHJcbiAgICBpZighdGhpcy5jb250ZW50UmVjdCkge1xyXG4gICAgICB0aGlzLmNvbnRlbnRSZWN0ID0gdGhpcy5jb250ZW50Vmlld1JlZj8ucm9vdE5vZGVzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuY29udGVudFJlY3QpIHtcclxuICAgICAgY2FsbENhbGxiYWNrID0gdGhpcy50b29sdGlwU2VydmljZS5vbk1vdmUoZXZlbnQsIHRoaXMuY29udGVudFJlY3QhKTtcclxuICAgIH1cclxuICAgIGlmKGNhbGxDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuICB9IFxyXG5cclxuICBwcml2YXRlIGhpZGUoKSB7XHJcbiAgICB0aGlzLmludGVycnVwdC5uZXh0KCk7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWY/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmNvbnRlbnRSZWN0ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29uZmlnKCk6IE92ZXJsYXlDb25maWcge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcclxuICAgICAgLndpdGhQb3NpdGlvbnMoW3Bvc2l0aW9uXSk7XHJcblxyXG4gICAgY29uc3QgY29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBwb3NpdGlvblN0cmF0ZWd5XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbigpOiBDb25uZWN0ZWRQb3NpdGlvbiB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29udGVudFBvc2l0aW9uLnNwbGl0KCctJyk7XHJcbiAgICBjb25zdCBvdmVybGF5WCA9IDwnc3RhcnQnIHwgJ2VuZCc+KHBvc2l0aW9uWzFdID09ICdsZWZ0JyA/ICdzdGFydCcgOiAnZW5kJyk7XHJcbiAgICBjb25zdCBvdmVybGF5WSA9IDwndG9wJyB8ICdib3R0b20nPnBvc2l0aW9uWzBdO1xyXG4gICAgcmV0dXJuIHsgb3JpZ2luWDogb3ZlcmxheVgsIG9yaWdpblk6IG92ZXJsYXlZLCBvdmVybGF5WDogb3ZlcmxheVgsIG92ZXJsYXlZOiBvdmVybGF5WSB9O1xyXG4gIH1cclxufVxyXG4iLCI8IS0tIEJlZm9yZSBob3ZlciBzdGF0ZSAtLT5cclxuPGRpdiBjbGFzcz1cInAtMlwiPlxyXG4gIDxpICpuZ0lmPVwiIXRhZ1wiIGNsYXNzPVwiZWMtaWNvbiB7e2ljb259fSBlYy1pY29uLXNtXCI+PC9pPlxyXG4gIDxlYy10YWdzICpuZ0lmPVwidGFnXCJcclxuICAgICAgICAgICAgW2lzQ29uZGVuc2VkXSA9IFwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFt0YWdzXT1cInRhZ1wiPlxyXG4gIDwvZWMtdGFncz5cclxuPC9kaXY+XHJcbjwhLS0gLi9CZWZvcmUgaG92ZXIgc3RhdGUgLS0+XHJcblxyXG48IS0tIEhvdmVyIHN0YXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2NvbnRlbnQ+XHJcbiAgPGFydGljbGUgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnRcIlxyXG4gICAgICAgICAgIChkb2N1bWVudDptb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gIDwvYXJ0aWNsZT5cclxuICA8ZGl2IGNsYXNzPVwicC0yIHt7Y29udGVudFBvc2l0aW9ufX1cIj5cclxuICAgIDxpICpuZ0lmPVwiIXRhZ1wiIGNsYXNzPVwiZWMtaWNvbiB7e2ljb259fSBlYy1pY29uLXNtIHt7aWNvbkhvdmVyQ2xhc3N9fVwiPjwvaT5cclxuICAgIDxlYy10YWdzICpuZ0lmPVwidGFnXCJcclxuICAgICAgICAgICAgIFtpc0NvbmRlbnNlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgIFt0YWdzXT1cImhvdmVyVGFnXCI+XHJcbiAgICA8L2VjLXRhZ3M+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gLi9Ib3ZlciBzdGF0ZSAtLT5cclxuIl19
|
@@ -0,0 +1,3 @@
|
|
1
|
+
export class RadioButtonOption {
|
2
|
+
}
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tYnV0dG9uLW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9yYWRpby1idXR0b24vcmFkaW8tYnV0dG9uLW9wdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8saUJBQWlCO0NBa0I3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBSYWRpb0J1dHRvbk9wdGlvbjxUID0gYW55PiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHRleHQgdG8gZGlzcGxheSBhcyB0aGUgcmFkaW8gYnV0dG9uIGxhYmVsLCB0aGlzIGNhbiBhbHNvIGluY2x1ZGUgaHRtbCBmb3JtYXR0aW5nIHN1Y2hcclxuICAgKiBhcyBib2xkIGFuZCBpdGFsaWNzIHRvIGVtcGhhc2l6ZSB3b3JkcyBpbiB0aGUgc3RyaW5nXHJcbiAgICovXHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBhIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBtb2RlbFxyXG4gICAqL1xyXG4gIHZhbHVlPzogVDtcclxuICAvKipcclxuICAgKiBUaGUgaWNvbiB0byBkaXNwbGF5IHdpdGggdGhlIHJhZGlvIGJ1dHRvbiBvcHRpb25cclxuICAgKi9cclxuICBpY29uPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRoZSB0b29sdGlwIHRleHQgdG8gc2hvdyB3aGVuIGhvdmVyaW5nIG92ZXIgYW4gb3B0aW9uXHJcbiAgICovXHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxufSJdfQ==
|