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