@energycap/components 0.31.5 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/energycap-components.min.css +2 -2
- package/energycap-email.min.css +1 -1
- package/esm2020/energycap-components.mjs +5 -0
- package/esm2020/lib/components.module.mjs +386 -0
- package/esm2020/lib/controls/banner/banner.component.mjs +106 -0
- package/esm2020/lib/controls/button/button.component.mjs +106 -0
- package/esm2020/lib/controls/button/copy-button.directive.mjs +65 -0
- package/esm2020/lib/controls/checkbox/checkbox.component.mjs +139 -0
- package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
- package/esm2020/lib/controls/combobox/combobox.component.mjs +841 -0
- package/esm2020/lib/controls/dropdown/dropdown.component.mjs +237 -0
- package/esm2020/lib/controls/file-upload/file-upload.component.mjs +169 -0
- package/esm2020/lib/controls/form-control/form-control.component.mjs +86 -0
- package/esm2020/lib/controls/form-control-base.mjs +143 -0
- package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
- package/esm2020/lib/controls/form-group/form-group.component.mjs +252 -0
- package/esm2020/lib/controls/help-popover/help-popover.component.mjs +28 -0
- package/esm2020/lib/controls/item-picker/item-picker.component.mjs +233 -0
- package/esm2020/lib/controls/link-button/link-button.component.mjs +11 -0
- package/esm2020/lib/controls/menu/menu.component.mjs +443 -0
- package/{esm2015/lib/controls/navigation/link-item.js → esm2020/lib/controls/navigation/link-item.mjs} +0 -0
- package/{esm2015/lib/controls/navigation/nav-group.js → esm2020/lib/controls/navigation/nav-group.mjs} +0 -0
- package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
- package/{esm2015/lib/controls/navigation/nav-item.js → esm2020/lib/controls/navigation/nav-item.mjs} +0 -0
- package/esm2020/lib/controls/numericbox/numericbox.component.mjs +371 -0
- package/esm2020/lib/controls/popover/popover.component.mjs +84 -0
- package/{esm2015/lib/controls/radio-button/radio-button-option.js → esm2020/lib/controls/radio-button/radio-button-option.mjs} +0 -0
- package/esm2020/lib/controls/radio-button/radio-button.component.mjs +81 -0
- package/esm2020/lib/controls/select/select.component.mjs +87 -0
- package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
- package/esm2020/lib/controls/textbox/textbox.component.mjs +154 -0
- package/{esm2015/lib/core/cache.service.js → esm2020/lib/core/cache.service.mjs} +9 -8
- package/{esm2015/lib/core/custom-validators.js → esm2020/lib/core/custom-validators.mjs} +0 -0
- package/{esm2015/lib/core/date-time-helper.js → esm2020/lib/core/date-time-helper.mjs} +0 -0
- package/esm2020/lib/core/error.service.mjs +57 -0
- package/esm2020/lib/core/scroll.service.mjs +89 -0
- package/esm2020/lib/core/telemetry-tracker.service.mjs +16 -0
- package/esm2020/lib/core/telemetry.service.mjs +38 -0
- package/esm2020/lib/core/validation-message.service.mjs +181 -0
- package/{esm2015/lib/core/validation-patterns.js → esm2020/lib/core/validation-patterns.mjs} +0 -0
- package/esm2020/lib/core/window.service.mjs +182 -0
- package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
- package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
- package/{esm2015/lib/display/avatar/avatar.service.js → esm2020/lib/display/avatar/avatar.service.mjs} +9 -7
- package/esm2020/lib/display/confirm/confirm.component.mjs +131 -0
- package/{esm2015/lib/display/dialog/dialog-content.js → esm2020/lib/display/dialog/dialog-content.mjs} +0 -0
- package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
- package/{esm2015/lib/display/dialog/dialog-types.js → esm2020/lib/display/dialog/dialog-types.mjs} +0 -0
- package/esm2020/lib/display/dialog/dialog.component.mjs +242 -0
- package/esm2020/lib/display/dialog/dialog.service.mjs +71 -0
- package/{esm2015/lib/display/help/help-types.js → esm2020/lib/display/help/help-types.mjs} +0 -0
- package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +106 -0
- package/{esm2015/lib/display/hierarchy/hierarchy-mocks.spec.js → esm2020/lib/display/hierarchy/hierarchy-mocks.spec.mjs} +5 -9
- package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +59 -0
- package/esm2020/lib/display/item-display/item-display.component.mjs +67 -0
- package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
- package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
- package/esm2020/lib/display/resizable/resizable.component.mjs +57 -0
- package/esm2020/lib/display/spinner/spinner.component.mjs +12 -0
- package/esm2020/lib/display/splash/splash.component.mjs +42 -0
- package/esm2020/lib/display/splash/splash.service.mjs +35 -0
- package/esm2020/lib/display/table/resizable-column.component.mjs +20 -0
- package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
- package/esm2020/lib/display/table/searchable-table.component.mjs +338 -0
- package/esm2020/lib/display/table/table-detail-row.component.mjs +27 -0
- package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
- package/esm2020/lib/display/table/table-master-header-row.component.mjs +11 -0
- package/esm2020/lib/display/table/table-master-row.component.mjs +150 -0
- package/esm2020/lib/display/table/table-pagination.component.mjs +150 -0
- package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
- package/esm2020/lib/display/table/table.component.mjs +244 -0
- package/esm2020/lib/display/tags/tag.mjs +15 -0
- package/esm2020/lib/display/tags/tags.component.mjs +77 -0
- package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
- package/{esm2015/lib/display/toast/toast-types.js → esm2020/lib/display/toast/toast-types.mjs} +0 -0
- package/esm2020/lib/display/toast/toast.service.mjs +35 -0
- package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
- package/esm2020/lib/display/tooltip/tooltip.component.mjs +25 -0
- package/esm2020/lib/display/tooltip/tooltip.service.mjs +63 -0
- package/esm2020/lib/display/tree/tree.component.mjs +125 -0
- package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
- package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
- package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
- package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
- package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
- package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
- package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +48 -0
- package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
- package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
- package/{esm2015/lib/shared/display.js → esm2020/lib/shared/display.mjs} +0 -0
- package/esm2020/lib/shared/form-group.helper.mjs +67 -0
- package/{esm2015/lib/shared/json-helper.js → esm2020/lib/shared/json-helper.mjs} +0 -0
- package/{esm2015/lib/shared/lodash-helper.js → esm2020/lib/shared/lodash-helper.mjs} +0 -0
- package/esm2020/lib/shared/page/page-base/page-base.component.mjs +339 -0
- package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs} +0 -0
- package/esm2020/lib/shared/page/page-title/page-title.component.mjs +23 -0
- package/esm2020/lib/shared/page/page-view/page-view.component.mjs +121 -0
- package/{esm2015/lib/shared/testing/hierarchy-base-test-injector-factory.spec.js → esm2020/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs} +0 -0
- package/esm2020/lib/shared/testing/page-base-component-test-helper.spec.mjs +30 -0
- package/{esm2015/lib/shared/testing/page-base-component-test-injector-factory.spec.js → esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs} +0 -0
- package/esm2020/lib/shared/testing/public-mocks.spec.mjs +132 -0
- package/{esm2015/lib/shared/testing/spy-factory.spec.js → esm2020/lib/shared/testing/spy-factory.spec.mjs} +0 -0
- package/{esm2015/lib/shared/testing/translation-mocks.spec.js → esm2020/lib/shared/testing/translation-mocks.spec.mjs} +0 -0
- package/esm2020/lib/shared/user-preference.service.mjs +17 -0
- package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
- package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
- package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/energycap-components.mjs +10090 -0
- package/fesm2015/energycap-components.mjs.map +1 -0
- package/fesm2020/energycap-components.mjs +9999 -0
- package/fesm2020/energycap-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components.module.d.ts +72 -0
- package/lib/controls/banner/banner.component.d.ts +3 -0
- package/lib/controls/button/button.component.d.ts +3 -0
- package/lib/controls/button/copy-button.directive.d.ts +3 -0
- package/lib/controls/checkbox/checkbox.component.d.ts +3 -0
- package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +3 -0
- package/lib/controls/combobox/combobox.component.d.ts +5 -2
- package/lib/controls/dropdown/dropdown.component.d.ts +3 -0
- package/lib/controls/file-upload/file-upload.component.d.ts +5 -2
- package/lib/controls/form-control/form-control.component.d.ts +3 -0
- package/lib/controls/form-control-base.d.ts +3 -0
- package/lib/controls/form-control-label/form-control-label.component.d.ts +3 -0
- package/lib/controls/form-group/form-group.component.d.ts +6 -3
- package/lib/controls/help-popover/help-popover.component.d.ts +3 -0
- package/lib/controls/item-picker/item-picker.component.d.ts +5 -2
- package/lib/controls/link-button/link-button.component.d.ts +3 -0
- package/lib/controls/menu/menu.component.d.ts +3 -0
- package/lib/controls/navigation/nav-item-active.directive.d.ts +3 -0
- package/lib/controls/numericbox/numericbox.component.d.ts +5 -2
- package/lib/controls/popover/popover.component.d.ts +3 -0
- package/lib/controls/radio-button/radio-button.component.d.ts +3 -0
- package/lib/controls/select/select.component.d.ts +3 -0
- package/lib/controls/tabs/tabs.component.d.ts +3 -0
- package/lib/controls/textbox/textbox.component.d.ts +3 -0
- package/lib/core/cache.service.d.ts +3 -0
- package/lib/core/error.service.d.ts +3 -0
- package/lib/core/scroll.service.d.ts +3 -0
- package/lib/core/telemetry-tracker.service.d.ts +3 -0
- package/lib/core/telemetry.service.d.ts +3 -0
- package/lib/core/validation-message.service.d.ts +3 -0
- package/lib/core/window.service.d.ts +3 -0
- package/lib/display/app-bar/app-bar.component.d.ts +3 -0
- package/lib/display/avatar/avatar.component.d.ts +3 -0
- package/lib/display/avatar/avatar.service.d.ts +3 -0
- package/lib/display/confirm/confirm.component.d.ts +5 -2
- package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +3 -0
- package/lib/display/dialog/dialog.component.d.ts +3 -0
- package/lib/display/dialog/dialog.service.d.ts +3 -0
- package/lib/display/hierarchy/hierarchy-base.d.ts +3 -0
- package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +3 -0
- package/lib/display/item-display/item-display.component.d.ts +3 -0
- package/lib/display/json-display/json-display.component.d.ts +5 -2
- package/lib/display/resizable/resizable-base.d.ts +3 -0
- package/lib/display/resizable/resizable.component.d.ts +3 -0
- package/lib/display/spinner/spinner.component.d.ts +3 -0
- package/lib/display/splash/splash.component.d.ts +3 -0
- package/lib/display/splash/splash.service.d.ts +3 -0
- package/lib/display/table/resizable-column.component.d.ts +3 -0
- package/lib/display/table/resizable-table.directive.d.ts +3 -0
- package/lib/display/table/searchable-table.component.d.ts +6 -3
- package/lib/display/table/table-detail-row.component.d.ts +3 -0
- package/lib/display/table/table-locked-column.component.d.ts +3 -0
- package/lib/display/table/table-master-header-row.component.d.ts +3 -0
- package/lib/display/table/table-master-row.component.d.ts +3 -0
- package/lib/display/table/table-pagination.component.d.ts +3 -0
- package/lib/display/table/table-selectable-row.component.d.ts +5 -2
- package/lib/display/table/table.component.d.ts +3 -0
- package/lib/display/tags/tags.component.d.ts +3 -0
- package/lib/display/toast/toast/toast.component.d.ts +3 -0
- package/lib/display/toast/toast.service.d.ts +3 -0
- package/lib/display/toast/toaster/toaster.component.d.ts +3 -0
- package/lib/display/tooltip/tooltip.component.d.ts +3 -0
- package/lib/display/tooltip/tooltip.service.d.ts +3 -0
- package/lib/display/tree/tree.component.d.ts +3 -0
- package/lib/display/view-overlay/view-overlay.component.d.ts +3 -0
- package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +3 -0
- package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +3 -0
- package/lib/shared/directives/popup/popup-container.directive.d.ts +3 -0
- package/lib/shared/display/pipes/date-display.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/highlight-text.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/relative-date.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/row-count.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/time-display.pipe.d.ts +3 -0
- package/lib/shared/form-group.helper.d.ts +5 -2
- package/lib/shared/page/page-base/page-base.component.d.ts +5 -2
- package/lib/shared/page/page-title/page-title.component.d.ts +3 -0
- package/lib/shared/page/page-view/page-view.component.d.ts +3 -0
- package/lib/shared/testing/public-mocks.spec.d.ts +7 -0
- package/lib/shared/user-preference.service.d.ts +3 -0
- package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +3 -0
- package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +3 -0
- package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +3 -0
- package/package.json +27 -15
- package/src/styles/_functions.scss +6 -4
- package/src/styles/_icons.scss +1 -1
- package/src/styles/mixins/_control-base.scss +2 -2
- package/src/styles/mixins/_form-control-base.scss +3 -1
- package/src/styles/mixins/_spinner-base.scss +3 -1
- package/bundles/energycap-components.umd.js +0 -10646
- package/bundles/energycap-components.umd.js.map +0 -1
- package/bundles/energycap-components.umd.min.js +0 -17
- package/bundles/energycap-components.umd.min.js.map +0 -1
- package/energycap-components.d.ts +0 -7
- package/energycap-components.metadata.json +0 -1
- package/esm2015/energycap-components.js +0 -8
- package/esm2015/lib/components.module.js +0 -238
- package/esm2015/lib/controls/banner/banner.component.js +0 -94
- package/esm2015/lib/controls/button/button.component.js +0 -89
- package/esm2015/lib/controls/button/copy-button.directive.js +0 -63
- package/esm2015/lib/controls/checkbox/checkbox.component.js +0 -137
- package/esm2015/lib/controls/collapsible-toggle/collapsible-toggle.component.js +0 -35
- package/esm2015/lib/controls/combobox/combobox.component.js +0 -819
- package/esm2015/lib/controls/dropdown/dropdown.component.js +0 -207
- package/esm2015/lib/controls/file-upload/file-upload.component.js +0 -172
- package/esm2015/lib/controls/form-control/form-control.component.js +0 -65
- package/esm2015/lib/controls/form-control-base.js +0 -140
- package/esm2015/lib/controls/form-control-label/form-control-label.component.js +0 -139
- package/esm2015/lib/controls/form-group/form-group.component.js +0 -254
- package/esm2015/lib/controls/help-popover/help-popover.component.js +0 -22
- package/esm2015/lib/controls/item-picker/item-picker.component.js +0 -216
- package/esm2015/lib/controls/link-button/link-button.component.js +0 -12
- package/esm2015/lib/controls/menu/menu.component.js +0 -424
- package/esm2015/lib/controls/navigation/nav-item-active.directive.js +0 -86
- package/esm2015/lib/controls/numericbox/numericbox.component.js +0 -362
- package/esm2015/lib/controls/popover/popover.component.js +0 -85
- package/esm2015/lib/controls/radio-button/radio-button.component.js +0 -78
- package/esm2015/lib/controls/select/select.component.js +0 -89
- package/esm2015/lib/controls/tabs/tabs.component.js +0 -42
- package/esm2015/lib/controls/textbox/textbox.component.js +0 -149
- package/esm2015/lib/core/error.service.js +0 -56
- package/esm2015/lib/core/scroll.service.js +0 -88
- package/esm2015/lib/core/telemetry-tracker.service.js +0 -14
- package/esm2015/lib/core/telemetry.service.js +0 -40
- package/esm2015/lib/core/validation-message.service.js +0 -185
- package/esm2015/lib/core/window.service.js +0 -191
- package/esm2015/lib/display/app-bar/app-bar.component.js +0 -42
- package/esm2015/lib/display/avatar/avatar.component.js +0 -73
- package/esm2015/lib/display/confirm/confirm.component.js +0 -127
- package/esm2015/lib/display/dialog/dialog-group/dialog-group.component.js +0 -65
- package/esm2015/lib/display/dialog/dialog.component.js +0 -229
- package/esm2015/lib/display/dialog/dialog.service.js +0 -69
- package/esm2015/lib/display/hierarchy/hierarchy-base.js +0 -106
- package/esm2015/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.js +0 -58
- package/esm2015/lib/display/item-display/item-display.component.js +0 -57
- package/esm2015/lib/display/json-display/json-display.component.js +0 -44
- package/esm2015/lib/display/resizable/resizable-base.js +0 -119
- package/esm2015/lib/display/resizable/resizable.component.js +0 -57
- package/esm2015/lib/display/spinner/spinner.component.js +0 -12
- package/esm2015/lib/display/splash/splash.component.js +0 -45
- package/esm2015/lib/display/splash/splash.service.js +0 -34
- package/esm2015/lib/display/table/resizable-column.component.js +0 -23
- package/esm2015/lib/display/table/resizable-table.directive.js +0 -223
- package/esm2015/lib/display/table/searchable-table.component.js +0 -303
- package/esm2015/lib/display/table/table-detail-row.component.js +0 -21
- package/esm2015/lib/display/table/table-locked-column.component.js +0 -53
- package/esm2015/lib/display/table/table-master-header-row.component.js +0 -11
- package/esm2015/lib/display/table/table-master-row.component.js +0 -141
- package/esm2015/lib/display/table/table-pagination.component.js +0 -146
- package/esm2015/lib/display/table/table-selectable-row.component.js +0 -216
- package/esm2015/lib/display/table/table.component.js +0 -210
- package/esm2015/lib/display/tags/tag.js +0 -15
- package/esm2015/lib/display/tags/tags.component.js +0 -73
- package/esm2015/lib/display/toast/toast/toast.component.js +0 -70
- package/esm2015/lib/display/toast/toast.service.js +0 -34
- package/esm2015/lib/display/toast/toaster/toaster.component.js +0 -117
- package/esm2015/lib/display/tooltip/tooltip.component.js +0 -24
- package/esm2015/lib/display/tooltip/tooltip.service.js +0 -64
- package/esm2015/lib/display/tree/tree.component.js +0 -100
- package/esm2015/lib/display/view-overlay/view-overlay.component.js +0 -50
- package/esm2015/lib/shared/directives/click-area-for/click-area-for.directive.js +0 -25
- package/esm2015/lib/shared/directives/if-viewport-width/if-viewport-width.directive.js +0 -112
- package/esm2015/lib/shared/directives/popup/popup-container.directive.js +0 -160
- package/esm2015/lib/shared/display/pipes/date-display.pipe.js +0 -49
- package/esm2015/lib/shared/display/pipes/highlight-text.pipe.js +0 -26
- package/esm2015/lib/shared/display/pipes/relative-date.pipe.js +0 -49
- package/esm2015/lib/shared/display/pipes/row-count.pipe.js +0 -47
- package/esm2015/lib/shared/display/pipes/time-display.pipe.js +0 -40
- package/esm2015/lib/shared/form-group.helper.js +0 -65
- package/esm2015/lib/shared/page/page-base/page-base.component.js +0 -356
- package/esm2015/lib/shared/page/page-title/page-title.component.js +0 -19
- package/esm2015/lib/shared/page/page-view/page-view.component.js +0 -94
- package/esm2015/lib/shared/testing/page-base-component-test-helper.spec.js +0 -35
- package/esm2015/lib/shared/testing/public-mocks.spec.js +0 -126
- package/esm2015/lib/shared/user-preference.service.js +0 -15
- package/esm2015/lib/shared/wizard/wizard-base/wizard-base.component.js +0 -260
- package/esm2015/lib/shared/wizard/wizard-buttons/wizard-buttons.component.js +0 -54
- package/esm2015/lib/shared/wizard/wizard-progress/wizard-progress.component.js +0 -18
- package/fesm2015/energycap-components.js +0 -9638
- package/fesm2015/energycap-components.js.map +0 -1
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { Component, HostBinding, HostListener, Input } from '@angular/core';
|
|
2
|
+
import { UntypedFormArray, UntypedFormControl } from '@angular/forms';
|
|
3
|
+
import { Subject } from 'rxjs';
|
|
4
|
+
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "../../controls/checkbox/checkbox.component";
|
|
8
|
+
import * as i3 from "./table-locked-column.component";
|
|
9
|
+
export class TableSelectableRowContext {
|
|
10
|
+
constructor() {
|
|
11
|
+
/**specify the form control to use for the selectAll checkbox or provide your own.
|
|
12
|
+
* This can be useful if you want to subscribe to changes to change button states as the selection changes
|
|
13
|
+
* or if you want to add it to an already-existing form group
|
|
14
|
+
*/
|
|
15
|
+
this.selectAllCheckbox = new UntypedFormControl(false);
|
|
16
|
+
/**specify the FormArray to use for the dependent checkboxes of the selectAll checkbox
|
|
17
|
+
* The dependent checkboxes will add and remove themselves automatically and the selectAll
|
|
18
|
+
* box will react accordingly. Do not provide your own controls
|
|
19
|
+
* This can be useful if you want to subscribe to changes to change button states as the selection changes
|
|
20
|
+
* or if you want to add it to an already-existing form group
|
|
21
|
+
*/
|
|
22
|
+
this.rowCheckboxes = new UntypedFormArray([]);
|
|
23
|
+
/**The index of the last row the user clicked. This allows multiple directives on a screen to coordinate
|
|
24
|
+
* for reacting to shift+click actions that should automatically select multiple rows between the clicked rows
|
|
25
|
+
* defaults to -1 to indicate that no user click has been captured
|
|
26
|
+
*/
|
|
27
|
+
this.lastClickedIndex = -1;
|
|
28
|
+
/**A subject that is triggered when a row-based directive is added or removed. It allows
|
|
29
|
+
* the master checkbox in the header to know that it needs to reset tracking information
|
|
30
|
+
* without replacing the actual FormArray that the hosting component may be subscribed to for changes
|
|
31
|
+
*/
|
|
32
|
+
this.rowAddedOrRemoved = new Subject();
|
|
33
|
+
/**
|
|
34
|
+
* Set to true to disable Shift-Click/Ctrl-Click functionality
|
|
35
|
+
*/
|
|
36
|
+
this.disableAdvancedRowClickBehavior = false;
|
|
37
|
+
/**
|
|
38
|
+
* Set to list of indices of controls that should not toggle when master/header checkbox toggles
|
|
39
|
+
*/
|
|
40
|
+
this.nonDependentCheckboxes = [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class TableSelectableRowComponent {
|
|
44
|
+
constructor() {
|
|
45
|
+
/**The ID root to use for the checkbox and table cell */
|
|
46
|
+
this.id = '';
|
|
47
|
+
this._selectionEnabled = true;
|
|
48
|
+
/*Required for all rows. The row index this component represents, to allow it to know how to handle shift+clicks.
|
|
49
|
+
Defaults to -1 which will cause the directive to behave as a header row*/
|
|
50
|
+
this.rowIndex = -1;
|
|
51
|
+
/**The options used to lock the checkbox column to the left of the table, must be modified by host
|
|
52
|
+
* if the checkbox is not the first column in the table
|
|
53
|
+
*/
|
|
54
|
+
this.lockedColOptions = { border: false, left: 0 };
|
|
55
|
+
/** Automatically set to true based on checkbox state, used to highlight the row to match our table selected row styles */
|
|
56
|
+
this.isSelected = false;
|
|
57
|
+
/** Automatically set to true if no rowIndex is provided or the row index is less than zero */
|
|
58
|
+
this.isHeader = false;
|
|
59
|
+
/**
|
|
60
|
+
* Set to true if you want the checkbox to be disabled.
|
|
61
|
+
*
|
|
62
|
+
* When you use this property, make sure you set `disableAdvancedRowClickBehavior: true`
|
|
63
|
+
* in the `TableSelectableRowContext`, or undesired side-effects will occur.
|
|
64
|
+
*/
|
|
65
|
+
this.isCheckboxDisabled = false;
|
|
66
|
+
/* A reference that we can change when a control is replaced to force the master checkbox reference to update
|
|
67
|
+
without also replacing the form array that the host component may be watching for selected row changes */
|
|
68
|
+
this.dependentCheckboxesReference = { controls: [] };
|
|
69
|
+
this.checkboxAttributeID = '';
|
|
70
|
+
/**Sends an event when the component is destroyed so that it can unsubscribe from any observables */
|
|
71
|
+
this.destroyed = new Subject();
|
|
72
|
+
}
|
|
73
|
+
/** Disables the selection functionality when false */
|
|
74
|
+
set isSelectionEnabled(value) { this._selectionEnabled = value !== false; }
|
|
75
|
+
get isSelectionEnabled() { return this._selectionEnabled; }
|
|
76
|
+
/**Validate and populate the context as the table is dynamically built. Because the context is shared between the
|
|
77
|
+
* header and each of the rows, changes to it can be used to determine what is happening and hook up the correct
|
|
78
|
+
* subscriptions for selectAll. The user can provide an existing formArray for the rows and form control for the header,
|
|
79
|
+
* or it can just be the default empty ones created by the context class.
|
|
80
|
+
*/
|
|
81
|
+
ngOnInit() {
|
|
82
|
+
this.isHeader = this.rowIndex < 0;
|
|
83
|
+
if (!this.context) {
|
|
84
|
+
console.error('ecTableSelectableRow requires a defined SelectableTableRowContext to be shared with all instances in one table.');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
let rowCheckbox = this.context?.rowCheckboxes?.at(this.rowIndex);
|
|
88
|
+
if (!this.isHeader && !rowCheckbox) {
|
|
89
|
+
rowCheckbox = new UntypedFormControl(this.isSelected);
|
|
90
|
+
this.context?.rowCheckboxes.push(rowCheckbox);
|
|
91
|
+
}
|
|
92
|
+
this.formControl = this.isHeader ? this.context.selectAllCheckbox : rowCheckbox;
|
|
93
|
+
this.watchForChanges();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**Watch for changes to the row index that can occur if the table is reordered in-place instead of
|
|
97
|
+
* recreated from scratch. Re-capture the correct form control to keep everything in sync
|
|
98
|
+
*/
|
|
99
|
+
ngOnChanges(changes) {
|
|
100
|
+
if (changes.rowIndex && !this.isHeader) {
|
|
101
|
+
this.formControl = this.context.rowCheckboxes.at(this.rowIndex);
|
|
102
|
+
this.checkboxAttributeID = `${this.id}_row${this.rowIndex}_ecCheckbox`;
|
|
103
|
+
}
|
|
104
|
+
if (changes.isSelectionEnabled && !this.isSelectionEnabled && this.formControl?.value === true) {
|
|
105
|
+
this.formControl.setValue(false);
|
|
106
|
+
}
|
|
107
|
+
if (changes.isSelected && this.formControl) {
|
|
108
|
+
this.formControl.setValue(this.isSelected);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Tell the header checkbox to refresh the selectAll subscription because a row was removed*/
|
|
112
|
+
ngOnDestroy() {
|
|
113
|
+
if (!this.isHeader && this.formControl) {
|
|
114
|
+
this.context.rowAddedOrRemoved.next();
|
|
115
|
+
//find the location in the array that matches the checkbox. If many rows are being removed it may not match rowIndex yet
|
|
116
|
+
let matchIndex = this.context.rowCheckboxes.controls.findIndex(c => c == this.formControl);
|
|
117
|
+
if (matchIndex >= 0) {
|
|
118
|
+
this.context.rowCheckboxes.removeAt(matchIndex);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**Handle when a user clicks on a table row (or something inside it which bubbles up) to increase the hit area for row selection
|
|
123
|
+
* Only work on the table body (not the header) because the header may have other click handlers for sort etc that we don't care about.
|
|
124
|
+
* Handle shift and control select as well as checkbox click like windows explorer or the original bill lists do.
|
|
125
|
+
*/
|
|
126
|
+
rowClicked(event) {
|
|
127
|
+
if (!this.isHeader && this.isSelectionEnabled && !this.isCheckboxDisabled) {
|
|
128
|
+
let targetEl = event?.target;
|
|
129
|
+
//clicking on a row always toggles that row. Sometimes the shift-select will toggle it back
|
|
130
|
+
this.formControl.setValue(!this.formControl.value);
|
|
131
|
+
if (!this.context.disableAdvancedRowClickBehavior) {
|
|
132
|
+
this.handleShiftSelect(event);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
watchForChanges() {
|
|
137
|
+
//watch for rows being replaced so that the master checkbox and shift-select support can be reset to match
|
|
138
|
+
//this keeps the master in sync as the table changes pages etc and stops unexpected rows from being selected after redraw
|
|
139
|
+
if (this.isHeader) {
|
|
140
|
+
this.context.rowAddedOrRemoved.pipe(debounceTime(10), takeUntil(this.destroyed)).subscribe(() => {
|
|
141
|
+
this.context.lastClickedIndex = -1;
|
|
142
|
+
// exclude nonDependentCheckboxes (some may not be allowed to be deselected)
|
|
143
|
+
let dependentCheckboxes = [];
|
|
144
|
+
this.context.rowCheckboxes.controls.forEach((control, index) => {
|
|
145
|
+
if (!this.context.nonDependentCheckboxes.includes(index)) {
|
|
146
|
+
dependentCheckboxes.push(control);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
this.dependentCheckboxesReference = { controls: dependentCheckboxes };
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
this.context.rowAddedOrRemoved.next();
|
|
154
|
+
//watch for the checkbox state to change on a child row and set the row isSelected class / highlight to match
|
|
155
|
+
//this way the rows match even if external code updates the form model
|
|
156
|
+
this.formControl?.valueChanges.pipe(takeUntil(this.destroyed)).subscribe((value) => {
|
|
157
|
+
this.isSelected = value;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* If they are holding the shift key, try to select all the checkboxes between their last selection
|
|
163
|
+
* and most recent selection. The logic is setup to behave the way windows explorer behaves
|
|
164
|
+
* We don't allow drag-to-select like the kendo tables, but it means users can highlight text and copy+paste to excel etc
|
|
165
|
+
* so I think this is actually preferable
|
|
166
|
+
*/
|
|
167
|
+
handleShiftSelect(event) {
|
|
168
|
+
let lastIndex = this.context.lastClickedIndex;
|
|
169
|
+
let curIndex = this.rowIndex;
|
|
170
|
+
if (event.shiftKey && lastIndex >= 0) {
|
|
171
|
+
this.clearAllRows();
|
|
172
|
+
if (curIndex > lastIndex) {
|
|
173
|
+
for (var index = lastIndex; index <= curIndex; index++) {
|
|
174
|
+
this.context.rowCheckboxes.at(index).setValue(true);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else if (curIndex < lastIndex) {
|
|
178
|
+
for (var index = lastIndex; index >= curIndex; index--) {
|
|
179
|
+
this.context.rowCheckboxes.at(index).setValue(true);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (curIndex === lastIndex) {
|
|
183
|
+
this.formControl.setValue(true);
|
|
184
|
+
}
|
|
185
|
+
document.getSelection()?.removeAllRanges();
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
//record the current row index for future row clicks to know where they last interacted
|
|
189
|
+
//but only if they don't have shift down for this click. If shift is down then the next shift+click
|
|
190
|
+
//should be considered an extension (or contraction) of the original multi-row selection
|
|
191
|
+
this.context.lastClickedIndex = this.rowIndex;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
clearAllRows() {
|
|
195
|
+
this.context.rowCheckboxes.controls.forEach(control => control.setValue(false));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
TableSelectableRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TableSelectableRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
199
|
+
TableSelectableRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: TableSelectableRowComponent, selector: "[ecTableSelectableRow]", inputs: { id: "id", isSelectionEnabled: ["ecTableSelectableRow", "isSelectionEnabled"], context: ["selectionContext", "context"], rowIndex: "rowIndex", lockedColOptions: "lockedColOptions", isSelected: "isSelected", isCheckboxDisabled: "isCheckboxDisabled" }, host: { listeners: { "click": "rowClicked($event)" }, properties: { "attr.id": "this.id", "class.is-enabled": "this.isSelectionEnabled", "class.is-selected": "this.isSelected", "class.is-header": "this.isHeader" } }, usesOnChanges: true, ngImport: i0, template: "<!-- any elements of the existing table row that must go before the row selection checkbox can be marked with a class of before-checkbox -->\r\n<ng-content select=\".before-checkbox\"></ng-content>\r\n<ng-container *ngIf=\"isSelectionEnabled\">\r\n <th *ngIf=\"isHeader\"\r\n class=\"checkbox\"\r\n [ecTableLockedColumn]=\"lockedColOptions\">\r\n <ec-checkbox id=\"{{id}}_selectAll\"\r\n class=\"m-0\"\r\n *ngIf=\"context?.selectAllCheckbox\"\r\n [formModel]=\"context?.selectAllCheckbox\"\r\n [dependentCheckboxesGroup]=\"dependentCheckboxesReference\"\r\n [ignoreDisabledDependents]=\"false\">\r\n </ec-checkbox>\r\n </th>\r\n <td *ngIf=\"!isHeader && formControl\"\r\n class=\"checkbox\"\r\n [ecTableLockedColumn]=\"lockedColOptions\">\r\n <!-- Use [readonly] and not [disabled] for isCheckboxDisabled to prevent user interaction\r\n and allow the value to be visible to other components (for example, when they subscribe\r\n to valueChanges on the FormArray that contains all the checkbox FormControls). -->\r\n <ec-checkbox id=\"{{id}}_row{{rowIndex}}_checkbox\"\r\n [readonly]=\"isCheckboxDisabled\"\r\n [attr.id]=\"checkboxAttributeID\"\r\n class=\"m-0 row-checkbox\"\r\n [formModel]=\"formControl\">\r\n </ec-checkbox>\r\n </td>\r\n</ng-container>\r\n<!-- The rest of the table row -->\r\n<ng-content></ng-content>", styles: [":host.is-enabled:not(.is-header){cursor:pointer}:host .checkbox{padding-left:1px;padding-right:1px;width:1.125rem}:host .checkbox:first-child{padding-left:.5rem;width:1.5625rem}:host.border-bottom-0 .checkbox{border-bottom:0}td.checkbox ec-checkbox ::ng-deep *{pointer-events:none}th.checkbox{vertical-align:var(--ec-table-selectable-row-vertical-align-checkbox-th, middle)}td.checkbox{vertical-align:var(--ec-table-selectable-row-vertical-align-checkbox-td, top)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CheckboxComponent, selector: "ec-checkbox", inputs: ["name", "dependentCheckboxesGroup", "ignoreDisabledDependents"] }, { kind: "component", type: i3.TableLockedColumnComponent, selector: "[ecTableLockedColumn]", inputs: ["ecTableLockedColumn"] }] });
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TableSelectableRowComponent, decorators: [{
|
|
201
|
+
type: Component,
|
|
202
|
+
args: [{ selector: '[ecTableSelectableRow]', template: "<!-- any elements of the existing table row that must go before the row selection checkbox can be marked with a class of before-checkbox -->\r\n<ng-content select=\".before-checkbox\"></ng-content>\r\n<ng-container *ngIf=\"isSelectionEnabled\">\r\n <th *ngIf=\"isHeader\"\r\n class=\"checkbox\"\r\n [ecTableLockedColumn]=\"lockedColOptions\">\r\n <ec-checkbox id=\"{{id}}_selectAll\"\r\n class=\"m-0\"\r\n *ngIf=\"context?.selectAllCheckbox\"\r\n [formModel]=\"context?.selectAllCheckbox\"\r\n [dependentCheckboxesGroup]=\"dependentCheckboxesReference\"\r\n [ignoreDisabledDependents]=\"false\">\r\n </ec-checkbox>\r\n </th>\r\n <td *ngIf=\"!isHeader && formControl\"\r\n class=\"checkbox\"\r\n [ecTableLockedColumn]=\"lockedColOptions\">\r\n <!-- Use [readonly] and not [disabled] for isCheckboxDisabled to prevent user interaction\r\n and allow the value to be visible to other components (for example, when they subscribe\r\n to valueChanges on the FormArray that contains all the checkbox FormControls). -->\r\n <ec-checkbox id=\"{{id}}_row{{rowIndex}}_checkbox\"\r\n [readonly]=\"isCheckboxDisabled\"\r\n [attr.id]=\"checkboxAttributeID\"\r\n class=\"m-0 row-checkbox\"\r\n [formModel]=\"formControl\">\r\n </ec-checkbox>\r\n </td>\r\n</ng-container>\r\n<!-- The rest of the table row -->\r\n<ng-content></ng-content>", styles: [":host.is-enabled:not(.is-header){cursor:pointer}:host .checkbox{padding-left:1px;padding-right:1px;width:1.125rem}:host .checkbox:first-child{padding-left:.5rem;width:1.5625rem}:host.border-bottom-0 .checkbox{border-bottom:0}td.checkbox ec-checkbox ::ng-deep *{pointer-events:none}th.checkbox{vertical-align:var(--ec-table-selectable-row-vertical-align-checkbox-th, middle)}td.checkbox{vertical-align:var(--ec-table-selectable-row-vertical-align-checkbox-td, top)}\n"] }]
|
|
203
|
+
}], propDecorators: { id: [{
|
|
204
|
+
type: HostBinding,
|
|
205
|
+
args: ['attr.id']
|
|
206
|
+
}, {
|
|
207
|
+
type: Input
|
|
208
|
+
}], isSelectionEnabled: [{
|
|
209
|
+
type: HostBinding,
|
|
210
|
+
args: ['class.is-enabled']
|
|
211
|
+
}, {
|
|
212
|
+
type: Input,
|
|
213
|
+
args: ['ecTableSelectableRow']
|
|
214
|
+
}], context: [{
|
|
215
|
+
type: Input,
|
|
216
|
+
args: ['selectionContext']
|
|
217
|
+
}], rowIndex: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], lockedColOptions: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], isSelected: [{
|
|
222
|
+
type: HostBinding,
|
|
223
|
+
args: ['class.is-selected']
|
|
224
|
+
}, {
|
|
225
|
+
type: Input
|
|
226
|
+
}], isHeader: [{
|
|
227
|
+
type: HostBinding,
|
|
228
|
+
args: ['class.is-header']
|
|
229
|
+
}], isCheckboxDisabled: [{
|
|
230
|
+
type: Input
|
|
231
|
+
}], rowClicked: [{
|
|
232
|
+
type: HostListener,
|
|
233
|
+
args: ['click', ['$event']]
|
|
234
|
+
}] } });
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdGFibGUvdGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdGFibGUvdGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDekgsT0FBTyxFQUFtQixnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFFekQsTUFBTSxPQUFPLHlCQUF5QjtJQUF0QztRQUNFOzs7V0FHRztRQUNJLHNCQUFpQixHQUFvQixJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFFOzs7OztXQUtHO1FBQ0ksa0JBQWEsR0FBcUIsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVsRTs7O1dBR0c7UUFDSSxxQkFBZ0IsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUVyQzs7O1dBR0c7UUFDSSxzQkFBaUIsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUV4RDs7V0FFRztRQUNJLG9DQUErQixHQUFZLEtBQUssQ0FBQztRQUV4RDs7V0FFRztRQUNJLDJCQUFzQixHQUFhLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0NBQUE7QUFPRCxNQUFNLE9BQU8sMkJBQTJCO0lBTHhD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QUZSLFdBQVc7dUJBQUMsU0FBUzs7c0JBQ3JCLEtBQUs7Z0JBTUssa0JBQWtCO3NCQUY1QixXQUFXO3VCQUFDLGtCQUFrQjs7c0JBQzlCLEtBQUs7dUJBQUMsc0JBQXNCO2dCQVF0QixPQUFPO3NCQURiLEtBQUs7dUJBQUMsa0JBQWtCO2dCQU1sQixRQUFRO3NCQURkLEtBQUs7Z0JBT0MsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQU1DLFVBQVU7c0JBRmhCLFdBQVc7dUJBQUMsbUJBQW1COztzQkFDL0IsS0FBSztnQkFLQyxRQUFRO3NCQURkLFdBQVc7dUJBQUMsaUJBQWlCO2dCQVV2QixrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBeUVDLFVBQVU7c0JBRGhCLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZVNlbGVjdGFibGVSb3dDb250ZXh0IHtcclxuICAvKipzcGVjaWZ5IHRoZSBmb3JtIGNvbnRyb2wgdG8gdXNlIGZvciB0aGUgc2VsZWN0QWxsIGNoZWNrYm94IG9yIHByb3ZpZGUgeW91ciBvd24uXHJcbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHN1YnNjcmliZSB0byBjaGFuZ2VzIHRvIGNoYW5nZSBidXR0b24gc3RhdGVzIGFzIHRoZSBzZWxlY3Rpb24gY2hhbmdlc1xyXG4gICAqIG9yIGlmIHlvdSB3YW50IHRvIGFkZCBpdCB0byBhbiBhbHJlYWR5LWV4aXN0aW5nIGZvcm0gZ3JvdXBcclxuICAgKi9cclxuICBwdWJsaWMgc2VsZWN0QWxsQ2hlY2tib3g6IEFic3RyYWN0Q29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZmFsc2UpO1xyXG5cclxuICAvKipzcGVjaWZ5IHRoZSBGb3JtQXJyYXkgdG8gdXNlIGZvciB0aGUgZGVwZW5kZW50IGNoZWNrYm94ZXMgb2YgdGhlIHNlbGVjdEFsbCBjaGVja2JveFxyXG4gICAqIFRoZSBkZXBlbmRlbnQgY2hlY2tib3hlcyB3aWxsIGFkZCBhbmQgcmVtb3ZlIHRoZW1zZWx2ZXMgYXV0b21hdGljYWxseSBhbmQgdGhlIHNlbGVjdEFsbFxyXG4gICAqIGJveCB3aWxsIHJlYWN0IGFjY29yZGluZ2x5LiBEbyBub3QgcHJvdmlkZSB5b3VyIG93biBjb250cm9sc1xyXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gY2hhbmdlcyB0byBjaGFuZ2UgYnV0dG9uIHN0YXRlcyBhcyB0aGUgc2VsZWN0aW9uIGNoYW5nZXNcclxuICAgKiBvciBpZiB5b3Ugd2FudCB0byBhZGQgaXQgdG8gYW4gYWxyZWFkeS1leGlzdGluZyBmb3JtIGdyb3VwXHJcbiAgICovXHJcbiAgcHVibGljIHJvd0NoZWNrYm94ZXM6IFVudHlwZWRGb3JtQXJyYXkgPSBuZXcgVW50eXBlZEZvcm1BcnJheShbXSk7XHJcblxyXG4gIC8qKlRoZSBpbmRleCBvZiB0aGUgbGFzdCByb3cgdGhlIHVzZXIgY2xpY2tlZC4gVGhpcyBhbGxvd3MgbXVsdGlwbGUgZGlyZWN0aXZlcyBvbiBhIHNjcmVlbiB0byBjb29yZGluYXRlXHJcbiAgICogZm9yIHJlYWN0aW5nIHRvIHNoaWZ0K2NsaWNrIGFjdGlvbnMgdGhhdCBzaG91bGQgYXV0b21hdGljYWxseSBzZWxlY3QgbXVsdGlwbGUgcm93cyBiZXR3ZWVuIHRoZSBjbGlja2VkIHJvd3NcclxuICAgKiBkZWZhdWx0cyB0byAtMSB0byBpbmRpY2F0ZSB0aGF0IG5vIHVzZXIgY2xpY2sgaGFzIGJlZW4gY2FwdHVyZWRcclxuICAgKi9cclxuICBwdWJsaWMgbGFzdENsaWNrZWRJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8qKkEgc3ViamVjdCB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIGEgcm93LWJhc2VkIGRpcmVjdGl2ZSBpcyBhZGRlZCBvciByZW1vdmVkLiBJdCBhbGxvd3NcclxuICAgKiB0aGUgbWFzdGVyIGNoZWNrYm94IGluIHRoZSBoZWFkZXIgdG8ga25vdyB0aGF0IGl0IG5lZWRzIHRvIHJlc2V0IHRyYWNraW5nIGluZm9ybWF0aW9uXHJcbiAgICogd2l0aG91dCByZXBsYWNpbmcgdGhlIGFjdHVhbCBGb3JtQXJyYXkgdGhhdCB0aGUgaG9zdGluZyBjb21wb25lbnQgbWF5IGJlIHN1YnNjcmliZWQgdG8gZm9yIGNoYW5nZXNcclxuICAgKi9cclxuICBwdWJsaWMgcm93QWRkZWRPclJlbW92ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIFNoaWZ0LUNsaWNrL0N0cmwtQ2xpY2sgZnVuY3Rpb25hbGl0eVxyXG4gICAqL1xyXG4gIHB1YmxpYyBkaXNhYmxlQWR2YW5jZWRSb3dDbGlja0JlaGF2aW9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0byBsaXN0IG9mIGluZGljZXMgb2YgY29udHJvbHMgdGhhdCBzaG91bGQgbm90IHRvZ2dsZSB3aGVuIG1hc3Rlci9oZWFkZXIgY2hlY2tib3ggdG9nZ2xlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBub25EZXBlbmRlbnRDaGVja2JveGVzOiBudW1iZXJbXSA9IFtdO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1tlY1RhYmxlU2VsZWN0YWJsZVJvd10nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1zZWxlY3RhYmxlLXJvdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVTZWxlY3RhYmxlUm93Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgLyoqVGhlIElEIHJvb3QgdG8gdXNlIGZvciB0aGUgY2hlY2tib3ggYW5kIHRhYmxlIGNlbGwgKi9cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGlkOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIERpc2FibGVzIHRoZSBzZWxlY3Rpb24gZnVuY3Rpb25hbGl0eSB3aGVuIGZhbHNlICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1lbmFibGVkJylcclxuICBASW5wdXQoJ2VjVGFibGVTZWxlY3RhYmxlUm93JylcclxuICBwdWJsaWMgc2V0IGlzU2VsZWN0aW9uRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpIHsgdGhpcy5fc2VsZWN0aW9uRW5hYmxlZCA9IHZhbHVlICE9PSBmYWxzZTsgfVxyXG4gIHB1YmxpYyBnZXQgaXNTZWxlY3Rpb25FbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fc2VsZWN0aW9uRW5hYmxlZDsgfVxyXG4gIHByaXZhdGUgX3NlbGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipTaGFyZWQgY29udGV4dCBiZXR3ZWVuIG1hc3RlciBhbmQgY2hpbGRyZW4uIENoaWxkIGRpcmVjdGl2ZSBhZGRzIGl0cyBvd24gRm9ybUNvbnRyb2wgdG8gdGhpc1xyXG4gIGFuZCByZW1vdmVzIGl0IG9uRGVzdHJveS4gVGhlIHNhbWUgY29udGV4dCBvYmplY3QgbXVzdCBiZSB1c2VkIGZvciBhbGwgZGlyZWN0aXZlcyBpbiBhIHNpbmdsZSB0YWJsZSovXHJcbiAgQElucHV0KCdzZWxlY3Rpb25Db250ZXh0JylcclxuICBwdWJsaWMgY29udGV4dCE6IFRhYmxlU2VsZWN0YWJsZVJvd0NvbnRleHQ7XHJcblxyXG4gIC8qUmVxdWlyZWQgZm9yIGFsbCByb3dzLiBUaGUgcm93IGluZGV4IHRoaXMgY29tcG9uZW50IHJlcHJlc2VudHMsIHRvIGFsbG93IGl0IHRvIGtub3cgaG93IHRvIGhhbmRsZSBzaGlmdCtjbGlja3MuXHJcbiAgICBEZWZhdWx0cyB0byAtMSB3aGljaCB3aWxsIGNhdXNlIHRoZSBkaXJlY3RpdmUgdG8gYmVoYXZlIGFzIGEgaGVhZGVyIHJvdyovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcm93SW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuICAvKipUaGUgb3B0aW9ucyB1c2VkIHRvIGxvY2sgdGhlIGNoZWNrYm94IGNvbHVtbiB0byB0aGUgbGVmdCBvZiB0aGUgdGFibGUsIG11c3QgYmUgbW9kaWZpZWQgYnkgaG9zdFxyXG4gICAqIGlmIHRoZSBjaGVja2JveCBpcyBub3QgdGhlIGZpcnN0IGNvbHVtbiBpbiB0aGUgdGFibGVcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBsb2NrZWRDb2xPcHRpb25zOiB7IGJvcmRlcjogYm9vbGVhbiwgbGVmdD86IG51bWJlciwgcmlnaHQ/OiBudW1iZXIgfSA9IHsgYm9yZGVyOiBmYWxzZSwgbGVmdDogMCB9O1xyXG5cclxuICAvKiogQXV0b21hdGljYWxseSBzZXQgdG8gdHJ1ZSBiYXNlZCBvbiBjaGVja2JveCBzdGF0ZSwgdXNlZCB0byBoaWdobGlnaHQgdGhlIHJvdyB0byBtYXRjaCBvdXIgdGFibGUgc2VsZWN0ZWQgcm93IHN0eWxlcyAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtc2VsZWN0ZWQnKVxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqIEF1dG9tYXRpY2FsbHkgc2V0IHRvIHRydWUgaWYgbm8gcm93SW5kZXggaXMgcHJvdmlkZWQgb3IgdGhlIHJvdyBpbmRleCBpcyBsZXNzIHRoYW4gemVybyAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtaGVhZGVyJylcclxuICBwdWJsaWMgaXNIZWFkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdGhlIGNoZWNrYm94IHRvIGJlIGRpc2FibGVkLlxyXG4gICAqXHJcbiAgICogV2hlbiB5b3UgdXNlIHRoaXMgcHJvcGVydHksIG1ha2Ugc3VyZSB5b3Ugc2V0IGBkaXNhYmxlQWR2YW5jZWRSb3dDbGlja0JlaGF2aW9yOiB0cnVlYFxyXG4gICAqIGluIHRoZSBgVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dGAsIG9yIHVuZGVzaXJlZCBzaWRlLWVmZmVjdHMgd2lsbCBvY2N1ci5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpc0NoZWNrYm94RGlzYWJsZWQ/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qIEEgcmVmZXJlbmNlIHRoYXQgd2UgY2FuIGNoYW5nZSB3aGVuIGEgY29udHJvbCBpcyByZXBsYWNlZCB0byBmb3JjZSB0aGUgbWFzdGVyIGNoZWNrYm94IHJlZmVyZW5jZSB0byB1cGRhdGVcclxuICAgICB3aXRob3V0IGFsc28gcmVwbGFjaW5nIHRoZSBmb3JtIGFycmF5IHRoYXQgdGhlIGhvc3QgY29tcG9uZW50IG1heSBiZSB3YXRjaGluZyBmb3Igc2VsZWN0ZWQgcm93IGNoYW5nZXMgKi9cclxuICBwdWJsaWMgZGVwZW5kZW50Q2hlY2tib3hlc1JlZmVyZW5jZTogeyBjb250cm9sczogQWJzdHJhY3RDb250cm9sW10gfSA9IHsgY29udHJvbHM6IFtdIH07XHJcblxyXG4gIC8qQ2FwdHVyZSB0aGUgZm9ybSBjb250cm9sIHRoaXMgY29tcG9uZW50IGNyZWF0ZXMgdG8gYWxsb3cgY2xlYW51cCBsYXRlciBvbiBhbmQgZXhwb3NlIGl0IHRvIHRoZSByb3cqL1xyXG4gIHB1YmxpYyBmb3JtQ29udHJvbCE6IEFic3RyYWN0Q29udHJvbDtcclxuXHJcbiAgcHVibGljIGNoZWNrYm94QXR0cmlidXRlSUQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipTZW5kcyBhbiBldmVudCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkIHNvIHRoYXQgaXQgY2FuIHVuc3Vic2NyaWJlIGZyb20gYW55IG9ic2VydmFibGVzICovXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKipWYWxpZGF0ZSBhbmQgcG9wdWxhdGUgdGhlIGNvbnRleHQgYXMgdGhlIHRhYmxlIGlzIGR5bmFtaWNhbGx5IGJ1aWx0LiBCZWNhdXNlIHRoZSBjb250ZXh0IGlzIHNoYXJlZCBiZXR3ZWVuIHRoZVxyXG4gICAqIGhlYWRlciBhbmQgZWFjaCBvZiB0aGUgcm93cywgY2hhbmdlcyB0byBpdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBpcyBoYXBwZW5pbmcgYW5kIGhvb2sgdXAgdGhlIGNvcnJlY3RcclxuICAgKiBzdWJzY3JpcHRpb25zIGZvciBzZWxlY3RBbGwuIFRoZSB1c2VyIGNhbiBwcm92aWRlIGFuIGV4aXN0aW5nIGZvcm1BcnJheSBmb3IgdGhlIHJvd3MgYW5kIGZvcm0gY29udHJvbCBmb3IgdGhlIGhlYWRlcixcclxuICAgKiBvciBpdCBjYW4ganVzdCBiZSB0aGUgZGVmYXVsdCBlbXB0eSBvbmVzIGNyZWF0ZWQgYnkgdGhlIGNvbnRleHQgY2xhc3MuXHJcbiAgKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzSGVhZGVyID0gdGhpcy5yb3dJbmRleCA8IDA7XHJcbiAgICBpZiAoIXRoaXMuY29udGV4dCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdlY1RhYmxlU2VsZWN0YWJsZVJvdyByZXF1aXJlcyBhIGRlZmluZWQgU2VsZWN0YWJsZVRhYmxlUm93Q29udGV4dCB0byBiZSBzaGFyZWQgd2l0aCBhbGwgaW5zdGFuY2VzIGluIG9uZSB0YWJsZS4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCByb3dDaGVja2JveCA9IHRoaXMuY29udGV4dD8ucm93Q2hlY2tib3hlcz8uYXQodGhpcy5yb3dJbmRleCk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNIZWFkZXIgJiYgIXJvd0NoZWNrYm94KSB7XHJcbiAgICAgICAgcm93Q2hlY2tib3ggPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHRoaXMuaXNTZWxlY3RlZCk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0Py5yb3dDaGVja2JveGVzLnB1c2gocm93Q2hlY2tib3gpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmZvcm1Db250cm9sID0gdGhpcy5pc0hlYWRlciA/IHRoaXMuY29udGV4dC5zZWxlY3RBbGxDaGVja2JveCA6IHJvd0NoZWNrYm94O1xyXG4gICAgICB0aGlzLndhdGNoRm9yQ2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIHJvdyBpbmRleCB0aGF0IGNhbiBvY2N1ciBpZiB0aGUgdGFibGUgaXMgcmVvcmRlcmVkIGluLXBsYWNlIGluc3RlYWQgb2ZcclxuICAgKiByZWNyZWF0ZWQgZnJvbSBzY3JhdGNoLiBSZS1jYXB0dXJlIHRoZSBjb3JyZWN0IGZvcm0gY29udHJvbCB0byBrZWVwIGV2ZXJ5dGhpbmcgaW4gc3luY1xyXG4gICAqL1xyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5yb3dJbmRleCAmJiAhdGhpcy5pc0hlYWRlcikge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sID0gdGhpcy5jb250ZXh0LnJvd0NoZWNrYm94ZXMuYXQodGhpcy5yb3dJbmRleCk7XHJcbiAgICAgIHRoaXMuY2hlY2tib3hBdHRyaWJ1dGVJRCA9IGAke3RoaXMuaWR9X3JvdyR7dGhpcy5yb3dJbmRleH1fZWNDaGVja2JveGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuaXNTZWxlY3Rpb25FbmFibGVkICYmICF0aGlzLmlzU2VsZWN0aW9uRW5hYmxlZCAmJiB0aGlzLmZvcm1Db250cm9sPy52YWx1ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlcy5pc1NlbGVjdGVkICYmIHRoaXMuZm9ybUNvbnRyb2wpIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmlzU2VsZWN0ZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRlbGwgdGhlIGhlYWRlciBjaGVja2JveCB0byByZWZyZXNoIHRoZSBzZWxlY3RBbGwgc3Vic2NyaXB0aW9uIGJlY2F1c2UgYSByb3cgd2FzIHJlbW92ZWQqL1xyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICghdGhpcy5pc0hlYWRlciAmJiB0aGlzLmZvcm1Db250cm9sKSB7XHJcbiAgICAgIHRoaXMuY29udGV4dC5yb3dBZGRlZE9yUmVtb3ZlZC5uZXh0KCk7XHJcblxyXG4gICAgICAvL2ZpbmQgdGhlIGxvY2F0aW9uIGluIHRoZSBhcnJheSB0aGF0IG1hdGNoZXMgdGhlIGNoZWNrYm94LiBJZiBtYW55IHJvd3MgYXJlIGJlaW5nIHJlbW92ZWQgaXQgbWF5IG5vdCBtYXRjaCByb3dJbmRleCB5ZXRcclxuICAgICAgbGV0IG1hdGNoSW5kZXggPSB0aGlzLmNvbnRleHQucm93Q2hlY2tib3hlcy5jb250cm9scy5maW5kSW5kZXgoYyA9PiBjID09IHRoaXMuZm9ybUNvbnRyb2wpO1xyXG4gICAgICBpZiAobWF0Y2hJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnJvd0NoZWNrYm94ZXMucmVtb3ZlQXQobWF0Y2hJbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKkhhbmRsZSB3aGVuIGEgdXNlciBjbGlja3Mgb24gYSB0YWJsZSByb3cgKG9yIHNvbWV0aGluZyBpbnNpZGUgaXQgd2hpY2ggYnViYmxlcyB1cCkgdG8gaW5jcmVhc2UgdGhlIGhpdCBhcmVhIGZvciByb3cgc2VsZWN0aW9uXHJcbiAgICogT25seSB3b3JrIG9uIHRoZSB0YWJsZSBib2R5IChub3QgdGhlIGhlYWRlcikgYmVjYXVzZSB0aGUgaGVhZGVyIG1heSBoYXZlIG90aGVyIGNsaWNrIGhhbmRsZXJzIGZvciBzb3J0IGV0YyB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQuXHJcbiAgICogSGFuZGxlIHNoaWZ0IGFuZCBjb250cm9sIHNlbGVjdCBhcyB3ZWxsIGFzIGNoZWNrYm94IGNsaWNrIGxpa2Ugd2luZG93cyBleHBsb3JlciBvciB0aGUgb3JpZ2luYWwgYmlsbCBsaXN0cyBkby5cclxuICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcclxuICBwdWJsaWMgcm93Q2xpY2tlZChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmlzSGVhZGVyICYmIHRoaXMuaXNTZWxlY3Rpb25FbmFibGVkICYmICF0aGlzLmlzQ2hlY2tib3hEaXNhYmxlZCkge1xyXG4gICAgICBsZXQgdGFyZ2V0RWwgPSBldmVudD8udGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgLy9jbGlja2luZyBvbiBhIHJvdyBhbHdheXMgdG9nZ2xlcyB0aGF0IHJvdy4gU29tZXRpbWVzIHRoZSBzaGlmdC1zZWxlY3Qgd2lsbCB0b2dnbGUgaXQgYmFja1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKCF0aGlzLmZvcm1Db250cm9sLnZhbHVlKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5jb250ZXh0LmRpc2FibGVBZHZhbmNlZFJvd0NsaWNrQmVoYXZpb3IpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZVNoaWZ0U2VsZWN0KGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3YXRjaEZvckNoYW5nZXMoKSB7XHJcbiAgICAvL3dhdGNoIGZvciByb3dzIGJlaW5nIHJlcGxhY2VkIHNvIHRoYXQgdGhlIG1hc3RlciBjaGVja2JveCBhbmQgc2hpZnQtc2VsZWN0IHN1cHBvcnQgY2FuIGJlIHJlc2V0IHRvIG1hdGNoXHJcbiAgICAvL3RoaXMga2VlcHMgdGhlIG1hc3RlciBpbiBzeW5jIGFzIHRoZSB0YWJsZSBjaGFuZ2VzIHBhZ2VzIGV0YyBhbmQgc3RvcHMgdW5leHBlY3RlZCByb3dzIGZyb20gYmVpbmcgc2VsZWN0ZWQgYWZ0ZXIgcmVkcmF3XHJcbiAgICBpZiAodGhpcy5pc0hlYWRlcikge1xyXG4gICAgICB0aGlzLmNvbnRleHQucm93QWRkZWRPclJlbW92ZWQucGlwZShkZWJvdW5jZVRpbWUoMTApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5sYXN0Q2xpY2tlZEluZGV4ID0gLTE7XHJcblxyXG4gICAgICAgIC8vIGV4Y2x1ZGUgbm9uRGVwZW5kZW50Q2hlY2tib3hlcyAoc29tZSBtYXkgbm90IGJlIGFsbG93ZWQgdG8gYmUgZGVzZWxlY3RlZClcclxuICAgICAgICBsZXQgZGVwZW5kZW50Q2hlY2tib3hlczogQWJzdHJhY3RDb250cm9sW10gPSBbXTtcclxuICAgICAgICB0aGlzLmNvbnRleHQucm93Q2hlY2tib3hlcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQubm9uRGVwZW5kZW50Q2hlY2tib3hlcy5pbmNsdWRlcyhpbmRleCkpIHtcclxuICAgICAgICAgICAgZGVwZW5kZW50Q2hlY2tib3hlcy5wdXNoKGNvbnRyb2wpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRlcGVuZGVudENoZWNrYm94ZXNSZWZlcmVuY2UgPSB7IGNvbnRyb2xzOiBkZXBlbmRlbnRDaGVja2JveGVzIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb250ZXh0LnJvd0FkZGVkT3JSZW1vdmVkLm5leHQoKTtcclxuXHJcbiAgICAgIC8vd2F0Y2ggZm9yIHRoZSBjaGVja2JveCBzdGF0ZSB0byBjaGFuZ2Ugb24gYSBjaGlsZCByb3cgYW5kIHNldCB0aGUgcm93IGlzU2VsZWN0ZWQgY2xhc3MgLyBoaWdobGlnaHQgdG8gbWF0Y2hcclxuICAgICAgLy90aGlzIHdheSB0aGUgcm93cyBtYXRjaCBldmVuIGlmIGV4dGVybmFsIGNvZGUgdXBkYXRlcyB0aGUgZm9ybSBtb2RlbFxyXG4gICAgICB0aGlzLmZvcm1Db250cm9sPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkID0gdmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgKiBJZiB0aGV5IGFyZSBob2xkaW5nIHRoZSBzaGlmdCBrZXksIHRyeSB0byBzZWxlY3QgYWxsIHRoZSBjaGVja2JveGVzIGJldHdlZW4gdGhlaXIgbGFzdCBzZWxlY3Rpb25cclxuICAgICogYW5kIG1vc3QgcmVjZW50IHNlbGVjdGlvbi4gVGhlIGxvZ2ljIGlzIHNldHVwIHRvIGJlaGF2ZSB0aGUgd2F5IHdpbmRvd3MgZXhwbG9yZXIgYmVoYXZlc1xyXG4gICAgKiBXZSBkb24ndCBhbGxvdyBkcmFnLXRvLXNlbGVjdCBsaWtlIHRoZSBrZW5kbyB0YWJsZXMsIGJ1dCBpdCBtZWFucyB1c2VycyBjYW4gaGlnaGxpZ2h0IHRleHQgYW5kIGNvcHkrcGFzdGUgdG8gZXhjZWwgZXRjXHJcbiAgICAqIHNvIEkgdGhpbmsgdGhpcyBpcyBhY3R1YWxseSBwcmVmZXJhYmxlXHJcbiAgICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlU2hpZnRTZWxlY3QoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGxldCBsYXN0SW5kZXggPSB0aGlzLmNvbnRleHQubGFzdENsaWNrZWRJbmRleDtcclxuICAgIGxldCBjdXJJbmRleCA9IHRoaXMucm93SW5kZXg7XHJcbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgbGFzdEluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5jbGVhckFsbFJvd3MoKTtcclxuICAgICAgaWYgKGN1ckluZGV4ID4gbGFzdEluZGV4KSB7XHJcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSBsYXN0SW5kZXg7IGluZGV4IDw9IGN1ckluZGV4OyBpbmRleCsrKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHQucm93Q2hlY2tib3hlcy5hdChpbmRleCkuc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGN1ckluZGV4IDwgbGFzdEluZGV4KSB7XHJcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSBsYXN0SW5kZXg7IGluZGV4ID49IGN1ckluZGV4OyBpbmRleC0tKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHQucm93Q2hlY2tib3hlcy5hdChpbmRleCkuc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGN1ckluZGV4ID09PSBsYXN0SW5kZXgpIHtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL3JlY29yZCB0aGUgY3VycmVudCByb3cgaW5kZXggZm9yIGZ1dHVyZSByb3cgY2xpY2tzIHRvIGtub3cgd2hlcmUgdGhleSBsYXN0IGludGVyYWN0ZWRcclxuICAgICAgLy9idXQgb25seSBpZiB0aGV5IGRvbid0IGhhdmUgc2hpZnQgZG93biBmb3IgdGhpcyBjbGljay4gSWYgc2hpZnQgaXMgZG93biB0aGVuIHRoZSBuZXh0IHNoaWZ0K2NsaWNrXHJcbiAgICAgIC8vc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW4gZXh0ZW5zaW9uIChvciBjb250cmFjdGlvbikgb2YgdGhlIG9yaWdpbmFsIG11bHRpLXJvdyBzZWxlY3Rpb25cclxuICAgICAgdGhpcy5jb250ZXh0Lmxhc3RDbGlja2VkSW5kZXggPSB0aGlzLnJvd0luZGV4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckFsbFJvd3MoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQucm93Q2hlY2tib3hlcy5jb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4gY29udHJvbC5zZXRWYWx1ZShmYWxzZSkpO1xyXG4gIH1cclxufVxyXG4iLCI8IS0tIGFueSBlbGVtZW50cyBvZiB0aGUgZXhpc3RpbmcgdGFibGUgcm93IHRoYXQgbXVzdCBnbyBiZWZvcmUgdGhlIHJvdyBzZWxlY3Rpb24gY2hlY2tib3ggY2FuIGJlIG1hcmtlZCB3aXRoIGEgY2xhc3Mgb2YgYmVmb3JlLWNoZWNrYm94IC0tPlxyXG48bmctY29udGVudCBzZWxlY3Q9XCIuYmVmb3JlLWNoZWNrYm94XCI+PC9uZy1jb250ZW50PlxyXG48bmctY29udGFpbmVyICpuZ0lmPVwiaXNTZWxlY3Rpb25FbmFibGVkXCI+XHJcbiAgPHRoICpuZ0lmPVwiaXNIZWFkZXJcIlxyXG4gICAgICBjbGFzcz1cImNoZWNrYm94XCJcclxuICAgICAgW2VjVGFibGVMb2NrZWRDb2x1bW5dPVwibG9ja2VkQ29sT3B0aW9uc1wiPlxyXG4gICAgPGVjLWNoZWNrYm94IGlkPVwie3tpZH19X3NlbGVjdEFsbFwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJtLTBcIlxyXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGV4dD8uc2VsZWN0QWxsQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgIFtmb3JtTW9kZWxdPVwiY29udGV4dD8uc2VsZWN0QWxsQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgIFtkZXBlbmRlbnRDaGVja2JveGVzR3JvdXBdPVwiZGVwZW5kZW50Q2hlY2tib3hlc1JlZmVyZW5jZVwiXHJcbiAgICAgICAgICAgICAgICAgW2lnbm9yZURpc2FibGVkRGVwZW5kZW50c109XCJmYWxzZVwiPlxyXG4gICAgPC9lYy1jaGVja2JveD5cclxuICA8L3RoPlxyXG4gIDx0ZCAqbmdJZj1cIiFpc0hlYWRlciAmJiBmb3JtQ29udHJvbFwiXHJcbiAgICAgIGNsYXNzPVwiY2hlY2tib3hcIlxyXG4gICAgICBbZWNUYWJsZUxvY2tlZENvbHVtbl09XCJsb2NrZWRDb2xPcHRpb25zXCI+XHJcbiAgICA8IS0tIFVzZSBbcmVhZG9ubHldIGFuZCBub3QgW2Rpc2FibGVkXSBmb3IgaXNDaGVja2JveERpc2FibGVkIHRvIHByZXZlbnQgdXNlciBpbnRlcmFjdGlvblxyXG4gICAgICAgICBhbmQgYWxsb3cgdGhlIHZhbHVlIHRvIGJlIHZpc2libGUgdG8gb3RoZXIgY29tcG9uZW50cyAoZm9yIGV4YW1wbGUsIHdoZW4gdGhleSBzdWJzY3JpYmVcclxuICAgICAgICAgdG8gdmFsdWVDaGFuZ2VzIG9uIHRoZSBGb3JtQXJyYXkgdGhhdCBjb250YWlucyBhbGwgdGhlIGNoZWNrYm94IEZvcm1Db250cm9scykuIC0tPlxyXG4gICAgPGVjLWNoZWNrYm94IGlkPVwie3tpZH19X3Jvd3t7cm93SW5kZXh9fV9jaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImlzQ2hlY2tib3hEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2hlY2tib3hBdHRyaWJ1dGVJRFwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJtLTAgcm93LWNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cImZvcm1Db250cm9sXCI+XHJcbiAgICA8L2VjLWNoZWNrYm94PlxyXG4gIDwvdGQ+XHJcbjwvbmctY29udGFpbmVyPlxyXG48IS0tIFRoZSByZXN0IG9mIHRoZSB0YWJsZSByb3cgLS0+XHJcbjxuZy1jb250ZW50PjwvbmctY29udGVudD4iXX0=
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { Component, ContentChildren, EventEmitter, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { isEqual } from 'lodash';
|
|
3
|
+
import { Subject } from 'rxjs';
|
|
4
|
+
import { takeUntil } from 'rxjs/operators';
|
|
5
|
+
import { ResizableColumnComponent } from './resizable-column.component';
|
|
6
|
+
import { TableMasterRowComponent } from './table-master-row.component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
import * as i2 from "./resizable-table.directive";
|
|
10
|
+
export class TableComponent {
|
|
11
|
+
constructor(renderer, el) {
|
|
12
|
+
this.renderer = renderer;
|
|
13
|
+
this.el = el;
|
|
14
|
+
this.id = '';
|
|
15
|
+
/**
|
|
16
|
+
* Enables table scrolling with a sticky header and footer. Use
|
|
17
|
+
* <thead> and <tfoot> elements for styles to be applied correctly.
|
|
18
|
+
*/
|
|
19
|
+
this.scrollable = false;
|
|
20
|
+
/**
|
|
21
|
+
* Enables resizable table columns. Apply the 'is-resizable' class
|
|
22
|
+
* to the <th> of a table column than can be resized.
|
|
23
|
+
*/
|
|
24
|
+
this.resizable = false;
|
|
25
|
+
/**
|
|
26
|
+
* Turns on condensed table styling. By default a condensed table
|
|
27
|
+
* has no row borders. To show borders, apply the 'has-borders' class
|
|
28
|
+
* to the <ec-table> element
|
|
29
|
+
*/
|
|
30
|
+
this.condensed = false;
|
|
31
|
+
/**
|
|
32
|
+
* Enables sorting by clicking on table columns. To make a column sortable
|
|
33
|
+
* apply the `data-sortable` attribute to the columns `<th>` element with
|
|
34
|
+
* the value of the field used to sort the column. When a column is clicked
|
|
35
|
+
* the fields and current sort direction is emitted from the `sortChange`
|
|
36
|
+
* output
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```html
|
|
40
|
+
* <ec-table [sortable]="true" [sort]="currentSort" (sortChange)="onSort($event)">
|
|
41
|
+
* <thead>
|
|
42
|
+
* <th data-sortable="name">Name</th>
|
|
43
|
+
* <th data-sortable="qty">Qty.</th>
|
|
44
|
+
* <th data-sortable="price">Price</th>
|
|
45
|
+
* </thead>
|
|
46
|
+
* ...
|
|
47
|
+
* </ec-table>
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
this.sortable = false;
|
|
51
|
+
/** Set to true if selectionContext is defined */
|
|
52
|
+
this.selectable = false;
|
|
53
|
+
/** Hides/shows the selection toolbar template when 1 or more rows is selected */
|
|
54
|
+
this.hasSelection = false;
|
|
55
|
+
/**
|
|
56
|
+
* Enables form table styling to allow form controls inside table cells.
|
|
57
|
+
*/
|
|
58
|
+
this.isForm = false;
|
|
59
|
+
/**
|
|
60
|
+
* Emits the new sort value whenever a sortable column is clicked
|
|
61
|
+
*/
|
|
62
|
+
this.sortChange = new EventEmitter();
|
|
63
|
+
/**
|
|
64
|
+
* True if a TableMasterRowComponent exists in the table content
|
|
65
|
+
*/
|
|
66
|
+
this.hasMasterDetailRows = false;
|
|
67
|
+
/**
|
|
68
|
+
* Unlisten function returned by `renderer.listen()` that are called
|
|
69
|
+
* OnDestroy to clean up all listeners
|
|
70
|
+
*/
|
|
71
|
+
this.unlisteners = [];
|
|
72
|
+
/** A map of sortable `<th>` elements */
|
|
73
|
+
this.sortableCols = {};
|
|
74
|
+
this.destroyed = new Subject();
|
|
75
|
+
}
|
|
76
|
+
ngOnChanges(changes) {
|
|
77
|
+
if (this.sortable && changes.sort && changes.sort.currentValue && !changes.sort.firstChange) {
|
|
78
|
+
const newValue = changes.sort.currentValue;
|
|
79
|
+
if (!this.currentSort || !isEqual(newValue, this.currentSort)) {
|
|
80
|
+
this.onSort(newValue.field, newValue.direction);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
ngAfterContentInit() {
|
|
85
|
+
this.hasMasterDetailRows = !!this.masterRows.length;
|
|
86
|
+
this.masterRows.changes.pipe(takeUntil(this.destroyed)).subscribe(() => {
|
|
87
|
+
this.hasMasterDetailRows = !!this.masterRows.length;
|
|
88
|
+
});
|
|
89
|
+
this.resizableColumns = this.searchableTableResizableColumns || this._resizableColumns;
|
|
90
|
+
}
|
|
91
|
+
ngAfterViewInit() {
|
|
92
|
+
if (this.sortable) {
|
|
93
|
+
this.initSortable();
|
|
94
|
+
}
|
|
95
|
+
if (this.selectable) {
|
|
96
|
+
this.initSelectable();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
ngOnDestroy() {
|
|
100
|
+
if (this.unlisteners.length) {
|
|
101
|
+
this.unlisteners.forEach(unlisten => unlisten());
|
|
102
|
+
}
|
|
103
|
+
this.destroyed.next();
|
|
104
|
+
this.destroyed.unsubscribe();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get all elements inside the host element that match a selector
|
|
108
|
+
* @param selector - Any valid selector for [querySelectorAll](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll)
|
|
109
|
+
*/
|
|
110
|
+
queryElements(selector) {
|
|
111
|
+
const table = this.el.nativeElement;
|
|
112
|
+
return Array.from(table.querySelectorAll(selector));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Store a `<th>` for each sortable column and attach a click
|
|
116
|
+
* event listener.
|
|
117
|
+
*/
|
|
118
|
+
initSortable() {
|
|
119
|
+
this.queryElements('th').forEach(th => {
|
|
120
|
+
if (th.hasAttribute('data-sortfield')) {
|
|
121
|
+
const field = th.getAttribute('data-sortfield');
|
|
122
|
+
if (field) {
|
|
123
|
+
this.sortableCols[field] = th;
|
|
124
|
+
const unlisten = this.renderer.listen(th, 'click', (event) => {
|
|
125
|
+
// Do not sort if the event target was the resizable handle
|
|
126
|
+
if (th.classList.contains('is-resizable') && event.target && event.target.classList.contains('handle')) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
this.onSort(field);
|
|
130
|
+
});
|
|
131
|
+
// Store unlisten function to remove listener when component is destroyed
|
|
132
|
+
this.unlisteners.push(unlisten);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
console.error(`data-sortfield attribute was not assigned a value.`, th);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
// Set the initial sort
|
|
140
|
+
if (this.sort) {
|
|
141
|
+
this.onSort(this.sort.field, this.sort.direction);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Find the sorted column and apply the desc or asc class in order
|
|
146
|
+
* to show the correct sort icon. If another field was sorted, reset it.
|
|
147
|
+
* Emit the current field and direction of the sorted column
|
|
148
|
+
* @param field
|
|
149
|
+
*/
|
|
150
|
+
onSort(field, direction) {
|
|
151
|
+
const th = this.sortableCols[field];
|
|
152
|
+
if (!th) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (this.currentSort && this.currentSort.field !== field) {
|
|
156
|
+
this.renderer.removeClass(this.sortableCols[this.currentSort.field], `is-sorted-${this.currentSort.direction}`);
|
|
157
|
+
}
|
|
158
|
+
if (th.classList.contains('is-sorted-desc')) {
|
|
159
|
+
this.renderer.removeClass(th, 'is-sorted-desc');
|
|
160
|
+
if (!direction) {
|
|
161
|
+
direction = 'asc';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
if (th.classList.contains('is-sorted-asc')) {
|
|
166
|
+
this.renderer.removeClass(th, 'is-sorted-asc');
|
|
167
|
+
}
|
|
168
|
+
if (!direction) {
|
|
169
|
+
direction = 'desc';
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
this.renderer.addClass(th, `is-sorted-${direction}`);
|
|
173
|
+
const sortEvent = { field: field, direction: direction };
|
|
174
|
+
this.currentSort = sortEvent;
|
|
175
|
+
this.sortChange.emit(sortEvent);
|
|
176
|
+
}
|
|
177
|
+
initSelectable() {
|
|
178
|
+
this.selectionContext.rowCheckboxes.valueChanges.pipe(takeUntil(this.destroyed)).subscribe((value) => {
|
|
179
|
+
this.hasSelection = value.some(v => v);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TableComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
184
|
+
TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: TableComponent, selector: "ec-table", inputs: { id: "id", scrollable: "scrollable", resizable: "resizable", condensed: "condensed", sortable: "sortable", selectionContext: "selectionContext", selectionToolbarTemplate: "selectionToolbarTemplate", selectable: "selectable", isForm: "isForm", sort: "sort", searchableTableResizableColumns: ["resizableColumns", "searchableTableResizableColumns"] }, outputs: { sortChange: "sortChange" }, host: { properties: { "attr.id": "this.id", "class.is-scrollable": "this.scrollable", "class.is-resizable": "this.resizable", "class.is-condensed": "this.condensed", "class.is-sortable": "this.sortable", "class.is-selectable": "this.selectable", "class.is-form-table": "this.isForm", "class.is-master-detail": "this.hasMasterDetailRows" } }, queries: [{ propertyName: "masterRows", predicate: TableMasterRowComponent, descendants: true }, { propertyName: "_resizableColumns", predicate: ResizableColumnComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"selectable-table-toolbar\"\r\n *ngIf=\"hasSelection && selectionToolbarTemplate\">\r\n <ng-container *ngTemplateOutlet=\"selectionToolbarTemplate\"></ng-container>\r\n</div>\r\n<div id=\"{{id}}-scroll-container\" \r\n class=\"table-scroll-container\">\r\n <table class=\"main-table\"\r\n id=\"{{id}}\"\r\n [ecResizableTable]=\"resizable\"\r\n [containerEl]=\"el\"\r\n [sortableTable]=\"sortable\"\r\n [resizableColumns]=\"resizableColumns\">\r\n <ng-content></ng-content>\r\n </table>\r\n</div>", 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)}}ec-table{display:flex;position:relative;min-height:0}ec-table .table-scroll-container{flex:1 1;min-height:0;overflow-y:auto}ec-table .main-table{border-collapse:separate;border-spacing:0;width:100%;font-size:var(--ec-font-size-label)}ec-table .main-table th{height:2rem;line-height:1rem;padding:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid var(--ec-border-color-dark);color:var(--ec-color-secondary-dark);font-weight:400;vertical-align:middle}ec-table .main-table th:first-child{padding-left:1rem}ec-table .main-table th:last-child{padding-right:1rem}ec-table .main-table td{height:2rem;line-height:1rem;padding:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-top:1px solid var(--ec-border-color);vertical-align:top}ec-table .main-table td:first-child{padding-left:1rem}ec-table .main-table td:last-child{padding-right:1rem}ec-table .main-table tbody>tr:first-child td{border-top:0}ec-table .main-table tbody>tr.is-error td{background-color:var(--ec-background-color-danger)}ec-table .main-table tbody>tr.is-success td{background-color:var(--ec-background-color-success)}ec-table .main-table tfoot td{font-weight:700}ec-table .main-table tbody>tr.is-selected>td,ec-table .main-table tbody>tr.is-selected{background-color:var(--ec-background-color-selected)}ec-table .main-table tr.is-heading td{color:var(--ec-color-secondary-dark);font-size:var(--ec-font-size-label);font-weight:var(--ec-font-weight-bold);line-height:1.333333333;text-transform:uppercase;padding-bottom:0;vertical-align:bottom;border-top:0}ec-table .main-table tr.is-heading+tr td{border-top:0}ec-table .main-table th.actions-col,ec-table .main-table td.actions-col{padding:0}ec-table .main-table th.actions-1,ec-table .main-table td.actions-1{width:2.0625rem}ec-table .main-table th.actions-2,ec-table .main-table td.actions-2{width:4.0625rem}ec-table .main-table th.actions-3,ec-table .main-table td.actions-3{width:6.0625rem}ec-table .main-table th.actions-4,ec-table .main-table td.actions-4{width:8.0625rem}ec-table .main-table th.actions-5,ec-table .main-table td.actions-5{width:10.0625rem}ec-table.is-condensed th,ec-table.is-condensed td{padding-top:.25rem;padding-bottom:.25rem;height:1.5rem}ec-table.is-condensed:not(.has-borders)>table td{border-bottom-width:0;border-top-width:0}ec-table .selectable-table-toolbar{align-items:center;background-color:var(--ec-background-color);border-bottom:1px solid var(--ec-border-color-dark);display:flex;padding:0 .5rem;position:absolute;left:calc(var(--selection-toolbar-left, 0rem) + 1.5625rem);top:0;height:3rem;right:0;z-index:4}ec-table.is-scrollable>.table-scroll-container>table{position:relative}ec-table.is-scrollable>.table-scroll-container>table>thead th{background-color:var(--ec-background-color);position:sticky!important;top:0;z-index:1}ec-table.is-scrollable>.table-scroll-container>table>tfoot td{background-color:var(--ec-background-color);position:sticky!important;bottom:0;z-index:1}ec-table.is-scrollable.bg-body>.table-scroll-container>table>thead th{background-color:var(--ec-background-color-body)}ec-table.is-scrollable.bg-body>.table-scroll-container>table>tfoot td{background-color:var(--ec-background-color-body)}ec-table.is-sortable th[data-sortfield]{-webkit-user-select:none;user-select:none}ec-table.is-sortable th[data-sortfield].is-resizable .content-wrapper{display:flex;cursor:pointer}ec-table.is-sortable th[data-sortfield].is-resizable .content{flex:0 1 auto}ec-table.is-sortable th[data-sortfield].is-resizable .content-wrapper:after{flex:none;content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-desc .content-wrapper:after,ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-asc .content-wrapper:after{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=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-desc .content-wrapper:after{transform:scaleY(-1)}ec-table.is-sortable th[data-sortfield].is-resizable.text-right .content-wrapper{flex-direction:row-reverse}ec-table.is-sortable th[data-sortfield]:not(.is-resizable){cursor:pointer}ec-table.is-sortable th[data-sortfield]:not(.is-resizable):after{content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-desc:after,ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-asc:after{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=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-desc:after{transform:scaleY(-1)}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right:after{content:\"\";display:none!important}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right:before{content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-desc:before,ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-asc:before{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=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-desc:before{transform:scaleY(-1)}ec-table.is-resizable .main-table{table-layout:fixed;width:100%}ec-table.is-resizable th.is-resizable{position:relative;overflow:visible;z-index:1}ec-table.is-resizable th.is-resizable.is-active{-webkit-user-select:none;user-select:none}ec-table.is-resizable th.is-resizable.is-active .handle:after{background-color:var(--ec-color-interactive)}ec-table.is-resizable th.is-resizable .handle{position:absolute;right:-7px;width:13px;height:100%;top:0;padding:0 5px;z-index:var(--ec-z-index-splitter);right:0;padding:.5rem 0 .5rem 10px}ec-table.is-resizable th.is-resizable .handle:after{content:\"\";display:block;transition:background-color .3s ease;height:100%;position:relative}ec-table.is-resizable th.is-resizable .handle:hover{cursor:col-resize}ec-table.is-resizable th.is-resizable .handle:hover:after{background-color:var(--ec-color-interactive)}ec-table.is-resizable th.is-resizable .handle:before{content:\"\";display:block;width:1px;background-color:var(--ec-border-color-legacy);position:absolute;top:.5rem;bottom:.5rem;right:0}ec-table.is-resizable th.is-resizable .content{overflow:hidden;text-overflow:clip;white-space:nowrap}ec-table.is-resizable th.is-resizable:last-child .handle:before{display:none}ec-table.is-resizable td,ec-table.is-resizable th{overflow:hidden;text-overflow:clip;white-space:nowrap}ec-table.is-selectable .main-table thead th{height:3rem}ec-table.is-selectable .main-table tbody>tr:hover>td{background-color:var(--ec-background-color-hover);border-color:transparent;cursor:pointer}ec-table.is-selectable .main-table tbody>tr:hover.is-selected{background-color:var(--ec-background-color-selected)}ec-table.is-selectable .main-table tbody>tr:hover+tr>td{border-color:var(--ec-background-color-hover)}ec-table.is-selectable th.is-resizable .handle{padding-top:1rem;padding-bottom:1rem}ec-table.is-selectable th.is-resizable .handle:before{top:1rem;bottom:1rem}ec-table.is-master-detail>table{table-layout:fixed}ec-table.is-form-table td{padding-bottom:.25rem;padding-top:.25rem;height:2.5rem;line-height:2rem;border-top:0;font-size:var(--ec-font-size-body)}ec-table.is-form-table tr:first-child td{padding-top:.5rem;height:2.75rem}ec-table.is-form-table tr:last-child td{padding-bottom:.5rem;height:2.75rem}ec-table.is-fixed .main-table{table-layout:fixed}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ResizableTableDirective, selector: "[ecResizableTable]", inputs: ["ecResizableTable", "containerEl", "sortableTable", "resizableColumns"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
185
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TableComponent, decorators: [{
|
|
186
|
+
type: Component,
|
|
187
|
+
args: [{ selector: 'ec-table', encapsulation: ViewEncapsulation.None, template: "<div class=\"selectable-table-toolbar\"\r\n *ngIf=\"hasSelection && selectionToolbarTemplate\">\r\n <ng-container *ngTemplateOutlet=\"selectionToolbarTemplate\"></ng-container>\r\n</div>\r\n<div id=\"{{id}}-scroll-container\" \r\n class=\"table-scroll-container\">\r\n <table class=\"main-table\"\r\n id=\"{{id}}\"\r\n [ecResizableTable]=\"resizable\"\r\n [containerEl]=\"el\"\r\n [sortableTable]=\"sortable\"\r\n [resizableColumns]=\"resizableColumns\">\r\n <ng-content></ng-content>\r\n </table>\r\n</div>", 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)}}ec-table{display:flex;position:relative;min-height:0}ec-table .table-scroll-container{flex:1 1;min-height:0;overflow-y:auto}ec-table .main-table{border-collapse:separate;border-spacing:0;width:100%;font-size:var(--ec-font-size-label)}ec-table .main-table th{height:2rem;line-height:1rem;padding:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid var(--ec-border-color-dark);color:var(--ec-color-secondary-dark);font-weight:400;vertical-align:middle}ec-table .main-table th:first-child{padding-left:1rem}ec-table .main-table th:last-child{padding-right:1rem}ec-table .main-table td{height:2rem;line-height:1rem;padding:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-top:1px solid var(--ec-border-color);vertical-align:top}ec-table .main-table td:first-child{padding-left:1rem}ec-table .main-table td:last-child{padding-right:1rem}ec-table .main-table tbody>tr:first-child td{border-top:0}ec-table .main-table tbody>tr.is-error td{background-color:var(--ec-background-color-danger)}ec-table .main-table tbody>tr.is-success td{background-color:var(--ec-background-color-success)}ec-table .main-table tfoot td{font-weight:700}ec-table .main-table tbody>tr.is-selected>td,ec-table .main-table tbody>tr.is-selected{background-color:var(--ec-background-color-selected)}ec-table .main-table tr.is-heading td{color:var(--ec-color-secondary-dark);font-size:var(--ec-font-size-label);font-weight:var(--ec-font-weight-bold);line-height:1.333333333;text-transform:uppercase;padding-bottom:0;vertical-align:bottom;border-top:0}ec-table .main-table tr.is-heading+tr td{border-top:0}ec-table .main-table th.actions-col,ec-table .main-table td.actions-col{padding:0}ec-table .main-table th.actions-1,ec-table .main-table td.actions-1{width:2.0625rem}ec-table .main-table th.actions-2,ec-table .main-table td.actions-2{width:4.0625rem}ec-table .main-table th.actions-3,ec-table .main-table td.actions-3{width:6.0625rem}ec-table .main-table th.actions-4,ec-table .main-table td.actions-4{width:8.0625rem}ec-table .main-table th.actions-5,ec-table .main-table td.actions-5{width:10.0625rem}ec-table.is-condensed th,ec-table.is-condensed td{padding-top:.25rem;padding-bottom:.25rem;height:1.5rem}ec-table.is-condensed:not(.has-borders)>table td{border-bottom-width:0;border-top-width:0}ec-table .selectable-table-toolbar{align-items:center;background-color:var(--ec-background-color);border-bottom:1px solid var(--ec-border-color-dark);display:flex;padding:0 .5rem;position:absolute;left:calc(var(--selection-toolbar-left, 0rem) + 1.5625rem);top:0;height:3rem;right:0;z-index:4}ec-table.is-scrollable>.table-scroll-container>table{position:relative}ec-table.is-scrollable>.table-scroll-container>table>thead th{background-color:var(--ec-background-color);position:sticky!important;top:0;z-index:1}ec-table.is-scrollable>.table-scroll-container>table>tfoot td{background-color:var(--ec-background-color);position:sticky!important;bottom:0;z-index:1}ec-table.is-scrollable.bg-body>.table-scroll-container>table>thead th{background-color:var(--ec-background-color-body)}ec-table.is-scrollable.bg-body>.table-scroll-container>table>tfoot td{background-color:var(--ec-background-color-body)}ec-table.is-sortable th[data-sortfield]{-webkit-user-select:none;user-select:none}ec-table.is-sortable th[data-sortfield].is-resizable .content-wrapper{display:flex;cursor:pointer}ec-table.is-sortable th[data-sortfield].is-resizable .content{flex:0 1 auto}ec-table.is-sortable th[data-sortfield].is-resizable .content-wrapper:after{flex:none;content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-desc .content-wrapper:after,ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-asc .content-wrapper:after{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=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-desc .content-wrapper:after{transform:scaleY(-1)}ec-table.is-sortable th[data-sortfield].is-resizable.text-right .content-wrapper{flex-direction:row-reverse}ec-table.is-sortable th[data-sortfield]:not(.is-resizable){cursor:pointer}ec-table.is-sortable th[data-sortfield]:not(.is-resizable):after{content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-desc:after,ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-asc:after{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=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-desc:after{transform:scaleY(-1)}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right:after{content:\"\";display:none!important}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right:before{content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-desc:before,ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-asc:before{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=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-desc:before{transform:scaleY(-1)}ec-table.is-resizable .main-table{table-layout:fixed;width:100%}ec-table.is-resizable th.is-resizable{position:relative;overflow:visible;z-index:1}ec-table.is-resizable th.is-resizable.is-active{-webkit-user-select:none;user-select:none}ec-table.is-resizable th.is-resizable.is-active .handle:after{background-color:var(--ec-color-interactive)}ec-table.is-resizable th.is-resizable .handle{position:absolute;right:-7px;width:13px;height:100%;top:0;padding:0 5px;z-index:var(--ec-z-index-splitter);right:0;padding:.5rem 0 .5rem 10px}ec-table.is-resizable th.is-resizable .handle:after{content:\"\";display:block;transition:background-color .3s ease;height:100%;position:relative}ec-table.is-resizable th.is-resizable .handle:hover{cursor:col-resize}ec-table.is-resizable th.is-resizable .handle:hover:after{background-color:var(--ec-color-interactive)}ec-table.is-resizable th.is-resizable .handle:before{content:\"\";display:block;width:1px;background-color:var(--ec-border-color-legacy);position:absolute;top:.5rem;bottom:.5rem;right:0}ec-table.is-resizable th.is-resizable .content{overflow:hidden;text-overflow:clip;white-space:nowrap}ec-table.is-resizable th.is-resizable:last-child .handle:before{display:none}ec-table.is-resizable td,ec-table.is-resizable th{overflow:hidden;text-overflow:clip;white-space:nowrap}ec-table.is-selectable .main-table thead th{height:3rem}ec-table.is-selectable .main-table tbody>tr:hover>td{background-color:var(--ec-background-color-hover);border-color:transparent;cursor:pointer}ec-table.is-selectable .main-table tbody>tr:hover.is-selected{background-color:var(--ec-background-color-selected)}ec-table.is-selectable .main-table tbody>tr:hover+tr>td{border-color:var(--ec-background-color-hover)}ec-table.is-selectable th.is-resizable .handle{padding-top:1rem;padding-bottom:1rem}ec-table.is-selectable th.is-resizable .handle:before{top:1rem;bottom:1rem}ec-table.is-master-detail>table{table-layout:fixed}ec-table.is-form-table td{padding-bottom:.25rem;padding-top:.25rem;height:2.5rem;line-height:2rem;border-top:0;font-size:var(--ec-font-size-body)}ec-table.is-form-table tr:first-child td{padding-top:.5rem;height:2.75rem}ec-table.is-form-table tr:last-child td{padding-bottom:.5rem;height:2.75rem}ec-table.is-fixed .main-table{table-layout:fixed}\n"] }]
|
|
188
|
+
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { id: [{
|
|
189
|
+
type: HostBinding,
|
|
190
|
+
args: ['attr.id']
|
|
191
|
+
}, {
|
|
192
|
+
type: Input
|
|
193
|
+
}], scrollable: [{
|
|
194
|
+
type: HostBinding,
|
|
195
|
+
args: ['class.is-scrollable']
|
|
196
|
+
}, {
|
|
197
|
+
type: Input
|
|
198
|
+
}], resizable: [{
|
|
199
|
+
type: HostBinding,
|
|
200
|
+
args: ['class.is-resizable']
|
|
201
|
+
}, {
|
|
202
|
+
type: Input
|
|
203
|
+
}], condensed: [{
|
|
204
|
+
type: HostBinding,
|
|
205
|
+
args: ['class.is-condensed']
|
|
206
|
+
}, {
|
|
207
|
+
type: Input
|
|
208
|
+
}], sortable: [{
|
|
209
|
+
type: HostBinding,
|
|
210
|
+
args: ['class.is-sortable']
|
|
211
|
+
}, {
|
|
212
|
+
type: Input
|
|
213
|
+
}], selectionContext: [{
|
|
214
|
+
type: Input
|
|
215
|
+
}], selectionToolbarTemplate: [{
|
|
216
|
+
type: Input
|
|
217
|
+
}], selectable: [{
|
|
218
|
+
type: HostBinding,
|
|
219
|
+
args: ['class.is-selectable']
|
|
220
|
+
}, {
|
|
221
|
+
type: Input
|
|
222
|
+
}], isForm: [{
|
|
223
|
+
type: HostBinding,
|
|
224
|
+
args: ['class.is-form-table']
|
|
225
|
+
}, {
|
|
226
|
+
type: Input
|
|
227
|
+
}], sort: [{
|
|
228
|
+
type: Input
|
|
229
|
+
}], sortChange: [{
|
|
230
|
+
type: Output
|
|
231
|
+
}], hasMasterDetailRows: [{
|
|
232
|
+
type: HostBinding,
|
|
233
|
+
args: ['class.is-master-detail']
|
|
234
|
+
}], masterRows: [{
|
|
235
|
+
type: ContentChildren,
|
|
236
|
+
args: [TableMasterRowComponent, { descendants: true }]
|
|
237
|
+
}], _resizableColumns: [{
|
|
238
|
+
type: ContentChildren,
|
|
239
|
+
args: [ResizableColumnComponent, { descendants: true }]
|
|
240
|
+
}], searchableTableResizableColumns: [{
|
|
241
|
+
type: Input,
|
|
242
|
+
args: ['resizableColumns']
|
|
243
|
+
}] } });
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQUUsZUFBZSxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQW9ELGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdPLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFldkUsTUFBTSxPQUFPLGNBQWM7SUE0R3pCLFlBQW9CLFFBQW1CLEVBQVMsRUFBYztRQUExQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQTFHckQsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVqQjs7O1dBR0c7UUFFTSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTVCOzs7V0FHRztRQUVNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0I7Ozs7V0FJRztRQUVNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQWtCRztRQUVNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFhMUIsaURBQWlEO1FBRXhDLGVBQVUs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b3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBRdWVyeUxpc3QsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmVzaXphYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNpemFibGUtY29sdW1uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYmxlTWFzdGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi90YWJsZS1tYXN0ZXItcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYmxlU2VsZWN0YWJsZVJvd0NvbnRleHQgfSBmcm9tICcuL3RhYmxlLXNlbGVjdGFibGUtcm93LmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgdHlwZSBUYWJsZVNvcnREaXJlY3Rpb24gPSAnZGVzYycgfCAnYXNjJztcclxuZXhwb3J0IGludGVyZmFjZSBUYWJsZVNvcnQge1xyXG4gIGZpZWxkOiBzdHJpbmc7XHJcbiAgZGlyZWN0aW9uOiBUYWJsZVNvcnREaXJlY3Rpb247XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0e1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgQElucHV0KCkgaWQgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyB0YWJsZSBzY3JvbGxpbmcgd2l0aCBhIHN0aWNreSBoZWFkZXIgYW5kIGZvb3Rlci4gVXNlXHJcbiAgICogPHRoZWFkPiBhbmQgPHRmb290PiBlbGVtZW50cyBmb3Igc3R5bGVzIHRvIGJlIGFwcGxpZWQgY29ycmVjdGx5LiBcclxuICAgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLXNjcm9sbGFibGUnKVxyXG4gIEBJbnB1dCgpIHNjcm9sbGFibGUgPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBFbmFibGVzIHJlc2l6YWJsZSB0YWJsZSBjb2x1bW5zLiBBcHBseSB0aGUgJ2lzLXJlc2l6YWJsZScgY2xhc3NcclxuICAgKiB0byB0aGUgPHRoPiBvZiBhIHRhYmxlIGNvbHVtbiB0aGFuIGNhbiBiZSByZXNpemVkLlxyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtcmVzaXphYmxlJylcclxuICBASW5wdXQoKSByZXNpemFibGUgPSBmYWxzZTtcclxuICBcclxuICAvKiogXHJcbiAgICogVHVybnMgb24gY29uZGVuc2VkIHRhYmxlIHN0eWxpbmcuIEJ5IGRlZmF1bHQgYSBjb25kZW5zZWQgdGFibGVcclxuICAgKiBoYXMgbm8gcm93IGJvcmRlcnMuIFRvIHNob3cgYm9yZGVycywgYXBwbHkgdGhlICdoYXMtYm9yZGVycycgY2xhc3NcclxuICAgKiB0byB0aGUgPGVjLXRhYmxlPiBlbGVtZW50XHJcbiAgICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1jb25kZW5zZWQnKVxyXG4gIEBJbnB1dCgpIGNvbmRlbnNlZCA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKiBcclxuICAgKiBFbmFibGVzIHNvcnRpbmcgYnkgY2xpY2tpbmcgb24gdGFibGUgY29sdW1ucy4gVG8gbWFrZSBhIGNvbHVtbiBzb3J0YWJsZVxyXG4gICAqIGFwcGx5IHRoZSBgZGF0YS1zb3J0YWJsZWAgYXR0cmlidXRlIHRvIHRoZSBjb2x1bW5zIGA8dGg+YCBlbGVtZW50IHdpdGggXHJcbiAgICogdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB1c2VkIHRvIHNvcnQgdGhlIGNvbHVtbi4gV2hlbiBhIGNvbHVtbiBpcyBjbGlja2VkXHJcbiAgICogdGhlIGZpZWxkcyBhbmQgY3VycmVudCBzb3J0IGRpcmVjdGlvbiBpcyBlbWl0dGVkIGZyb20gdGhlIGBzb3J0Q2hhbmdlYFxyXG4gICAqIG91dHB1dFxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYGBgaHRtbFxyXG4gICAqIDxlYy10YWJsZSBbc29ydGFibGVdPVwidHJ1ZVwiIFtzb3J0XT1cImN1cnJlbnRTb3J0XCIgKHNvcnRDaGFuZ2UpPVwib25Tb3J0KCRldmVudClcIj5cclxuICAgKiAgPHRoZWFkPlxyXG4gICAqICAgIDx0aCBkYXRhLXNvcnRhYmxlPVwibmFtZVwiPk5hbWU8L3RoPlxyXG4gICAqICAgIDx0aCBkYXRhLXNvcnRhYmxlPVwicXR5XCI+UXR5LjwvdGg+XHJcbiAgICogICAgPHRoIGRhdGEtc29ydGFibGU9XCJwcmljZVwiPlByaWNlPC90aD5cclxuICAgKiAgPC90aGVhZD5cclxuICAgKiAgLi4uXHJcbiAgICogPC9lYy10YWJsZT5cclxuICAgKiBgYGBcclxuICAgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLXNvcnRhYmxlJylcclxuICBASW5wdXQoKSBzb3J0YWJsZSA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFNoYXJlZCBjb250ZXh0IG9mIFRhYmxlU2VsZWN0YWJsZVJvd0NvbXBvbmVudHMgaW4gdGhlIHRhYmxlLiBXaWxsIHR1cm4gb24gaGlnaGxpZ2h0aW5nIG9uIHJvdyBob3Zlci5cclxuICAgKiBBZGQgdGhlIGBUYWJsZVNlbGVjdGFibGVSb3dDb21wb25lbnRgIHRvIHRoZSB0YWJsZSBjb250ZW50IHRvIGFkZCBjaGVja2JveGVzIHRvIGVhY2ggcm93IGFuZCBhc3NpZ24gYSBcclxuICAgKiBUZW1wbGF0ZVJlZiB0byB0aGUgYFtzZWxlY3Rpb25Ub29sYmFyVGVtcGxhdGVdYCBpbnB1dCB0aGF0IGluY2x1ZGVzIGFjdGlvbnMgdG8gdGFrZSBvbiBzZWxlY3RlZCBpdGVtcyBcclxuICAgKiB0aGF0IHdpbGwgYXBwZWFyIG92ZXIgdGhlIHRhYmxlIGhlYWRlciB3aGVuIDEgb3IgbW9yZSByb3dzIGFyZSBzZWxlY3RlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSBzZWxlY3Rpb25Db250ZXh0PzogVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dDtcclxuXHJcbiAgLyoqIEluY2x1ZGUgYWN0aW9ucyB0byBkaXNwbGF5IGluIGEgYmFyIG92ZXIgdGhlIHRhYmxlIGhlYWRlciB3aGVuIDEgb3IgbW9yZSByb3dzIGFyZSBzZWxlY3RlZC4gUmVxdWlyZXMgYFtzZWxlY3Rpb25Db250ZXh0XWAgdG8gYmUgZGVmaW5lZCAqL1xyXG4gIEBJbnB1dCgpIHNlbGVjdGlvblRvb2xiYXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgXHJcbiAgLyoqIFNldCB0byB0cnVlIGlmIHNlbGVjdGlvbkNvbnRleHQgaXMgZGVmaW5lZCAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtc2VsZWN0YWJsZScpXHJcbiAgQElucHV0KCkgc2VsZWN0YWJsZSA9IGZhbHNlO1xyXG5cclxuICAvKiogSGlkZXMvc2hvd3MgdGhlIHNlbGVjdGlvbiB0b29sYmFyIHRlbXBsYXRlIHdoZW4gMSBvciBtb3JlIHJvd3MgaXMgc2VsZWN0ZWQgKi9cclxuICBoYXNTZWxlY3Rpb24gPSBmYWxzZVxyXG5cclxuICAvKipcclxuICAgKiBFbmFibGVzIGZvcm0gdGFibGUgc3R5bGluZyB0byBhbGxvdyBmb3JtIGNvbnRyb2xzIGluc2lkZSB0YWJsZSBjZWxscy5cclxuICAgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLWZvcm0tdGFibGUnKVxyXG4gIEBJbnB1dCgpIGlzRm9ybSA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFRoZSBjdXJyZW50IHNvcnQgZmllbGQgYW5kIGRpcmVjdGlvbiAoJ2Rlc2MnIG9yICdhc2MnKVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNvcnQ/OiBUYWJsZVNvcnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHRoZSBuZXcgc29ydCB2YWx1ZSB3aGVuZXZlciBhIHNvcnRhYmxlIGNvbHVtbiBpcyBjbGlja2VkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxUYWJsZVNvcnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKipcclxuICAgKiBUcnVlIGlmIGEgVGFibGVNYXN0ZXJSb3dDb21wb25lbnQgZXhpc3RzIGluIHRoZSB0YWJsZSBjb250ZW50XHJcbiAgICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1tYXN0ZXItZGV0YWlsJykgaGFzTWFzdGVyRGV0YWlsUm93cyA9IGZhbHNlO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlTWFzdGVyUm93Q29tcG9uZW50LCB7ZGVzY2VuZGFudHM6IHRydWV9KSBtYXN0ZXJSb3dzITogUXVlcnlMaXN0PFRhYmxlTWFzdGVyUm93Q29tcG9uZW50PjtcclxuXHJcbiAgcHVibGljIHJlc2l6YWJsZUNvbHVtbnMhOiBRdWVyeUxpc3Q8UmVzaXphYmxlQ29sdW1uQ29tcG9uZW50PjtcclxuICBAQ29udGVudENoaWxkcmVuKFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudCwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgX3Jlc2l6YWJsZUNvbHVtbnMhOiBRdWVyeUxpc3Q8UmVzaXphYmxlQ29sdW1uQ29tcG9uZW50PjtcclxuXHJcbiAgQElucHV0KCdyZXNpemFibGVDb2x1bW5zJykgc2VhcmNoYWJsZVRhYmxlUmVzaXphYmxlQ29sdW1ucz86IFF1ZXJ5TGlzdDxSZXNpemFibGVDb2x1bW5Db21wb25lbnQ+O1xyXG5cclxuICAvKipcclxuICAgKiBVbmxpc3RlbiBmdW5jdGlvbiByZXR1cm5lZCBieSBgcmVuZGVyZXIubGlzdGVuKClgIHRoYXQgYXJlIGNhbGxlZFxyXG4gICAqIE9uRGVzdHJveSB0byBjbGVhbiB1cCBhbGwgbGlzdGVuZXJzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1bmxpc3RlbmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcclxuICBcclxuICAvKiogVGhlIGN1cnJlbnQgc29ydCB2YWx1ZSAqL1xyXG4gIHByaXZhdGUgY3VycmVudFNvcnQ/OiBUYWJsZVNvcnQ7XHJcbiAgXHJcbiAgLyoqIEEgbWFwIG9mIHNvcnRhYmxlIGA8dGg+YCBlbGVtZW50cyAqL1xyXG4gIHByaXZhdGUgc29ydGFibGVDb2xzOiB7W2ZpZWxkOiBzdHJpbmddOiBIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudH0gPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHVibGljIGVsOiBFbGVtZW50UmVmKSB7fVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb3J0YWJsZSAmJiBjaGFuZ2VzLnNvcnQgJiYgY2hhbmdlcy5zb3J0LmN1cnJlbnRWYWx1ZSAmJiAhY2hhbmdlcy5zb3J0LmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIGNvbnN0IG5ld1ZhbHVlOiBUYWJsZVNvcnQgPSBjaGFuZ2VzLnNvcnQuY3VycmVudFZhbHVlO1xyXG4gICAgICBpZiAoIXRoaXMuY3VycmVudFNvcnQgfHwgIWlzRXF1YWwobmV3VmFsdWUsIHRoaXMuY3VycmVudFNvcnQpKXtcclxuICAgICAgICB0aGlzLm9uU29ydChuZXdWYWx1ZS5maWVsZCwgbmV3VmFsdWUuZGlyZWN0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYXNNYXN0ZXJEZXRhaWxSb3dzID0gISF0aGlzLm1hc3RlclJvd3MubGVuZ3RoO1xyXG4gICAgXHJcbiAgICB0aGlzLm1hc3RlclJvd3MuY2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaGFzTWFzdGVyRGV0YWlsUm93cyA9ICEhdGhpcy5tYXN0ZXJSb3dzLmxlbmd0aDtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVzaXphYmxlQ29sdW1ucyA9IHRoaXMuc2VhcmNoYWJsZVRhYmxlUmVzaXphYmxlQ29sdW1ucyB8fCB0aGlzLl9yZXNpemFibGVDb2x1bW5zO1xyXG4gIH1cclxuICBcclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb3J0YWJsZSkge1xyXG4gICAgICB0aGlzLmluaXRTb3J0YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgdGhpcy5pbml0U2VsZWN0YWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVubGlzdGVuZXJzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVubGlzdGVuZXJzLmZvckVhY2godW5saXN0ZW4gPT4gdW5saXN0ZW4oKSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGVsZW1lbnRzIGluc2lkZSB0aGUgaG9zdCBlbGVtZW50IHRoYXQgbWF0Y2ggYSBzZWxlY3RvciBcclxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBbnkgdmFsaWQgc2VsZWN0b3IgZm9yIFtxdWVyeVNlbGVjdG9yQWxsXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3RvckFsbClcclxuICAgKi9cclxuICBwcml2YXRlIHF1ZXJ5RWxlbWVudHM8VD4oc2VsZWN0b3I6IHN0cmluZyk6IFRbXSB7XHJcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGEgYDx0aD5gIGZvciBlYWNoIHNvcnRhYmxlIGNvbHVtbiBhbmQgYXR0YWNoIGEgY2xpY2tcclxuICAgKiBldmVudCBsaXN0ZW5lci4gXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0U29ydGFibGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnF1ZXJ5RWxlbWVudHM8SFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ+KCd0aCcpLmZvckVhY2godGggPT4ge1xyXG4gICAgICBpZiAodGguaGFzQXR0cmlidXRlKCdkYXRhLXNvcnRmaWVsZCcpKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc29ydGZpZWxkJyk7XHJcbiAgICAgICAgaWYgKGZpZWxkKSB7XHJcbiAgICAgICAgICB0aGlzLnNvcnRhYmxlQ29sc1tmaWVsZF0gPSB0aDtcclxuICAgICAgICAgIGNvbnN0IHVubGlzdGVuID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGgsICdjbGljaycsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy8gRG8gbm90IHNvcnQgaWYgdGhlIGV2ZW50IHRhcmdldCB3YXMgdGhlIHJlc2l6YWJsZSBoYW5kbGVcclxuICAgICAgICAgICAgaWYgKHRoLmNsYXNzTGlzdC5jb250YWlucygnaXMtcmVzaXphYmxlJykgJiYgZXZlbnQudGFyZ2V0ICYmICg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5jbGFzc0xpc3QuY29udGFpbnMoJ2hhbmRsZScpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uU29ydChmaWVsZCk7XHJcbiAgICAgICAgICB9KTtcclxuICBcclxuICAgICAgICAgIC8vIFN0b3JlIHVubGlzdGVuIGZ1bmN0aW9uIHRvIHJlbW92ZSBsaXN0ZW5lciB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICAgICAgICAgIHRoaXMudW5saXN0ZW5lcnMucHVzaCh1bmxpc3Rlbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGRhdGEtc29ydGZpZWxkIGF0dHJpYnV0ZSB3YXMgbm90IGFzc2lnbmVkIGEgdmFsdWUuYCwgdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBpbml0aWFsIHNvcnRcclxuICAgIGlmICh0aGlzLnNvcnQpIHtcclxuICAgICAgdGhpcy5vblNvcnQodGhpcy5zb3J0LmZpZWxkLCB0aGlzLnNvcnQuZGlyZWN0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbmQgdGhlIHNvcnRlZCBjb2x1bW4gYW5kIGFwcGx5IHRoZSBkZXNjIG9yIGFzYyBjbGFzcyBpbiBvcmRlclxyXG4gICAqIHRvIHNob3cgdGhlIGNvcnJlY3Qgc29ydCBpY29uLiBJZiBhbm90aGVyIGZpZWxkIHdhcyBzb3J0ZWQsIHJlc2V0IGl0LlxyXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgZmllbGQgYW5kIGRpcmVjdGlvbiBvZiB0aGUgc29ydGVkIGNvbHVtblxyXG4gICAqIEBwYXJhbSBmaWVsZCBcclxuICAgKi9cclxuICBwcml2YXRlIG9uU29ydChmaWVsZDogc3RyaW5nLCBkaXJlY3Rpb24/OiBUYWJsZVNvcnREaXJlY3Rpb24pOiB2b2lkIHtcclxuICAgIGNvbnN0IHRoID0gdGhpcy5zb3J0YWJsZUNvbHNbZmllbGRdO1xyXG4gICAgaWYgKCF0aCkgeyByZXR1cm47IH1cclxuICAgIFxyXG4gICAgaWYgKHRoaXMuY3VycmVudFNvcnQgJiYgdGhpcy5jdXJyZW50U29ydC5maWVsZCAhPT0gZmllbGQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLnNvcnRhYmxlQ29sc1t0aGlzLmN1cnJlbnRTb3J0LmZpZWxkXSwgYGlzLXNvcnRlZC0ke3RoaXMuY3VycmVudFNvcnQuZGlyZWN0aW9ufWApO1xyXG4gICAgfSBcclxuICAgIFxyXG4gICAgaWYgKHRoLmNsYXNzTGlzdC5jb250YWlucygnaXMtc29ydGVkLWRlc2MnKSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoLCAnaXMtc29ydGVkLWRlc2MnKTtcclxuXHJcbiAgICAgIGlmICghZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgZGlyZWN0aW9uID0gJ2FzYyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGguY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1zb3J0ZWQtYXNjJykpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoLCAnaXMtc29ydGVkLWFzYycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWRpcmVjdGlvbikge1xyXG4gICAgICAgIGRpcmVjdGlvbiA9ICdkZXNjJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGgsIGBpcy1zb3J0ZWQtJHtkaXJlY3Rpb259YCk7XHJcblxyXG4gICAgY29uc3Qgc29ydEV2ZW50ID0ge2ZpZWxkOiBmaWVsZCwgZGlyZWN0aW9uOiBkaXJlY3Rpb259O1xyXG4gICAgdGhpcy5jdXJyZW50U29ydCA9IHNvcnRFdmVudDtcclxuICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHNvcnRFdmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTZWxlY3RhYmxlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0IS5yb3dDaGVja2JveGVzLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW5bXSkgPT4ge1xyXG4gICAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IHZhbHVlLnNvbWUodiA9PiB2KTtcclxuICAgIH0pO1xyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJzZWxlY3RhYmxlLXRhYmxlLXRvb2xiYXJcIlxyXG4gICAgICpuZ0lmPVwiaGFzU2VsZWN0aW9uICYmIHNlbGVjdGlvblRvb2xiYXJUZW1wbGF0ZVwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3Rpb25Ub29sYmFyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbjxkaXYgaWQ9XCJ7e2lkfX0tc2Nyb2xsLWNvbnRhaW5lclwiIFxyXG4gICAgIGNsYXNzPVwidGFibGUtc2Nyb2xsLWNvbnRhaW5lclwiPlxyXG4gIDx0YWJsZSBjbGFzcz1cIm1haW4tdGFibGVcIlxyXG4gICAgICAgICBpZD1cInt7aWR9fVwiXHJcbiAgICAgICAgIFtlY1Jlc2l6YWJsZVRhYmxlXT1cInJlc2l6YWJsZVwiXHJcbiAgICAgICAgIFtjb250YWluZXJFbF09XCJlbFwiXHJcbiAgICAgICAgIFtzb3J0YWJsZVRhYmxlXT1cInNvcnRhYmxlXCJcclxuICAgICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwicmVzaXphYmxlQ29sdW1uc1wiPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gIDwvdGFibGU+XHJcbjwvZGl2PiJdfQ==
|