@energycap/components 0.31.5 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/energycap-components.min.css +2 -2
- package/energycap-email.min.css +1 -1
- package/esm2020/energycap-components.mjs +5 -0
- package/esm2020/lib/components.module.mjs +386 -0
- package/esm2020/lib/controls/banner/banner.component.mjs +106 -0
- package/esm2020/lib/controls/button/button.component.mjs +106 -0
- package/esm2020/lib/controls/button/copy-button.directive.mjs +65 -0
- package/esm2020/lib/controls/checkbox/checkbox.component.mjs +139 -0
- package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
- package/esm2020/lib/controls/combobox/combobox.component.mjs +841 -0
- package/esm2020/lib/controls/dropdown/dropdown.component.mjs +237 -0
- package/esm2020/lib/controls/file-upload/file-upload.component.mjs +169 -0
- package/esm2020/lib/controls/form-control/form-control.component.mjs +86 -0
- package/esm2020/lib/controls/form-control-base.mjs +143 -0
- package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
- package/esm2020/lib/controls/form-group/form-group.component.mjs +252 -0
- package/esm2020/lib/controls/help-popover/help-popover.component.mjs +28 -0
- package/esm2020/lib/controls/item-picker/item-picker.component.mjs +233 -0
- package/esm2020/lib/controls/link-button/link-button.component.mjs +11 -0
- package/esm2020/lib/controls/menu/menu.component.mjs +443 -0
- package/{esm2015/lib/controls/navigation/link-item.js → esm2020/lib/controls/navigation/link-item.mjs} +0 -0
- package/{esm2015/lib/controls/navigation/nav-group.js → esm2020/lib/controls/navigation/nav-group.mjs} +0 -0
- package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
- package/{esm2015/lib/controls/navigation/nav-item.js → esm2020/lib/controls/navigation/nav-item.mjs} +0 -0
- package/esm2020/lib/controls/numericbox/numericbox.component.mjs +371 -0
- package/esm2020/lib/controls/popover/popover.component.mjs +84 -0
- package/{esm2015/lib/controls/radio-button/radio-button-option.js → esm2020/lib/controls/radio-button/radio-button-option.mjs} +0 -0
- package/esm2020/lib/controls/radio-button/radio-button.component.mjs +81 -0
- package/esm2020/lib/controls/select/select.component.mjs +87 -0
- package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
- package/esm2020/lib/controls/textbox/textbox.component.mjs +154 -0
- package/{esm2015/lib/core/cache.service.js → esm2020/lib/core/cache.service.mjs} +9 -8
- package/{esm2015/lib/core/custom-validators.js → esm2020/lib/core/custom-validators.mjs} +0 -0
- package/{esm2015/lib/core/date-time-helper.js → esm2020/lib/core/date-time-helper.mjs} +0 -0
- package/esm2020/lib/core/error.service.mjs +57 -0
- package/esm2020/lib/core/scroll.service.mjs +89 -0
- package/esm2020/lib/core/telemetry-tracker.service.mjs +16 -0
- package/esm2020/lib/core/telemetry.service.mjs +38 -0
- package/esm2020/lib/core/validation-message.service.mjs +181 -0
- package/{esm2015/lib/core/validation-patterns.js → esm2020/lib/core/validation-patterns.mjs} +0 -0
- package/esm2020/lib/core/window.service.mjs +182 -0
- package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
- package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
- package/{esm2015/lib/display/avatar/avatar.service.js → esm2020/lib/display/avatar/avatar.service.mjs} +9 -7
- package/esm2020/lib/display/confirm/confirm.component.mjs +131 -0
- package/{esm2015/lib/display/dialog/dialog-content.js → esm2020/lib/display/dialog/dialog-content.mjs} +0 -0
- package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
- package/{esm2015/lib/display/dialog/dialog-types.js → esm2020/lib/display/dialog/dialog-types.mjs} +0 -0
- package/esm2020/lib/display/dialog/dialog.component.mjs +242 -0
- package/esm2020/lib/display/dialog/dialog.service.mjs +71 -0
- package/{esm2015/lib/display/help/help-types.js → esm2020/lib/display/help/help-types.mjs} +0 -0
- package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +106 -0
- package/{esm2015/lib/display/hierarchy/hierarchy-mocks.spec.js → esm2020/lib/display/hierarchy/hierarchy-mocks.spec.mjs} +5 -9
- package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +59 -0
- package/esm2020/lib/display/item-display/item-display.component.mjs +67 -0
- package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
- package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
- package/esm2020/lib/display/resizable/resizable.component.mjs +57 -0
- package/esm2020/lib/display/spinner/spinner.component.mjs +12 -0
- package/esm2020/lib/display/splash/splash.component.mjs +42 -0
- package/esm2020/lib/display/splash/splash.service.mjs +35 -0
- package/esm2020/lib/display/table/resizable-column.component.mjs +20 -0
- package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
- package/esm2020/lib/display/table/searchable-table.component.mjs +338 -0
- package/esm2020/lib/display/table/table-detail-row.component.mjs +27 -0
- package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
- package/esm2020/lib/display/table/table-master-header-row.component.mjs +11 -0
- package/esm2020/lib/display/table/table-master-row.component.mjs +150 -0
- package/esm2020/lib/display/table/table-pagination.component.mjs +150 -0
- package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
- package/esm2020/lib/display/table/table.component.mjs +244 -0
- package/esm2020/lib/display/tags/tag.mjs +15 -0
- package/esm2020/lib/display/tags/tags.component.mjs +77 -0
- package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
- package/{esm2015/lib/display/toast/toast-types.js → esm2020/lib/display/toast/toast-types.mjs} +0 -0
- package/esm2020/lib/display/toast/toast.service.mjs +35 -0
- package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
- package/esm2020/lib/display/tooltip/tooltip.component.mjs +25 -0
- package/esm2020/lib/display/tooltip/tooltip.service.mjs +63 -0
- package/esm2020/lib/display/tree/tree.component.mjs +125 -0
- package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
- package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
- package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
- package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
- package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
- package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
- package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +48 -0
- package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
- package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
- package/{esm2015/lib/shared/display.js → esm2020/lib/shared/display.mjs} +0 -0
- package/esm2020/lib/shared/form-group.helper.mjs +67 -0
- package/{esm2015/lib/shared/json-helper.js → esm2020/lib/shared/json-helper.mjs} +0 -0
- package/{esm2015/lib/shared/lodash-helper.js → esm2020/lib/shared/lodash-helper.mjs} +0 -0
- package/esm2020/lib/shared/page/page-base/page-base.component.mjs +339 -0
- package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs} +0 -0
- package/esm2020/lib/shared/page/page-title/page-title.component.mjs +23 -0
- package/esm2020/lib/shared/page/page-view/page-view.component.mjs +121 -0
- package/{esm2015/lib/shared/testing/hierarchy-base-test-injector-factory.spec.js → esm2020/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs} +0 -0
- package/esm2020/lib/shared/testing/page-base-component-test-helper.spec.mjs +30 -0
- package/{esm2015/lib/shared/testing/page-base-component-test-injector-factory.spec.js → esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs} +0 -0
- package/esm2020/lib/shared/testing/public-mocks.spec.mjs +132 -0
- package/{esm2015/lib/shared/testing/spy-factory.spec.js → esm2020/lib/shared/testing/spy-factory.spec.mjs} +0 -0
- package/{esm2015/lib/shared/testing/translation-mocks.spec.js → esm2020/lib/shared/testing/translation-mocks.spec.mjs} +0 -0
- package/esm2020/lib/shared/user-preference.service.mjs +17 -0
- package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
- package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
- package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/energycap-components.mjs +10090 -0
- package/fesm2015/energycap-components.mjs.map +1 -0
- package/fesm2020/energycap-components.mjs +9999 -0
- package/fesm2020/energycap-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components.module.d.ts +72 -0
- package/lib/controls/banner/banner.component.d.ts +3 -0
- package/lib/controls/button/button.component.d.ts +3 -0
- package/lib/controls/button/copy-button.directive.d.ts +3 -0
- package/lib/controls/checkbox/checkbox.component.d.ts +3 -0
- package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +3 -0
- package/lib/controls/combobox/combobox.component.d.ts +5 -2
- package/lib/controls/dropdown/dropdown.component.d.ts +3 -0
- package/lib/controls/file-upload/file-upload.component.d.ts +5 -2
- package/lib/controls/form-control/form-control.component.d.ts +3 -0
- package/lib/controls/form-control-base.d.ts +3 -0
- package/lib/controls/form-control-label/form-control-label.component.d.ts +3 -0
- package/lib/controls/form-group/form-group.component.d.ts +6 -3
- package/lib/controls/help-popover/help-popover.component.d.ts +3 -0
- package/lib/controls/item-picker/item-picker.component.d.ts +5 -2
- package/lib/controls/link-button/link-button.component.d.ts +3 -0
- package/lib/controls/menu/menu.component.d.ts +3 -0
- package/lib/controls/navigation/nav-item-active.directive.d.ts +3 -0
- package/lib/controls/numericbox/numericbox.component.d.ts +5 -2
- package/lib/controls/popover/popover.component.d.ts +3 -0
- package/lib/controls/radio-button/radio-button.component.d.ts +3 -0
- package/lib/controls/select/select.component.d.ts +3 -0
- package/lib/controls/tabs/tabs.component.d.ts +3 -0
- package/lib/controls/textbox/textbox.component.d.ts +3 -0
- package/lib/core/cache.service.d.ts +3 -0
- package/lib/core/error.service.d.ts +3 -0
- package/lib/core/scroll.service.d.ts +3 -0
- package/lib/core/telemetry-tracker.service.d.ts +3 -0
- package/lib/core/telemetry.service.d.ts +3 -0
- package/lib/core/validation-message.service.d.ts +3 -0
- package/lib/core/window.service.d.ts +3 -0
- package/lib/display/app-bar/app-bar.component.d.ts +3 -0
- package/lib/display/avatar/avatar.component.d.ts +3 -0
- package/lib/display/avatar/avatar.service.d.ts +3 -0
- package/lib/display/confirm/confirm.component.d.ts +5 -2
- package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +3 -0
- package/lib/display/dialog/dialog.component.d.ts +3 -0
- package/lib/display/dialog/dialog.service.d.ts +3 -0
- package/lib/display/hierarchy/hierarchy-base.d.ts +3 -0
- package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +3 -0
- package/lib/display/item-display/item-display.component.d.ts +3 -0
- package/lib/display/json-display/json-display.component.d.ts +5 -2
- package/lib/display/resizable/resizable-base.d.ts +3 -0
- package/lib/display/resizable/resizable.component.d.ts +3 -0
- package/lib/display/spinner/spinner.component.d.ts +3 -0
- package/lib/display/splash/splash.component.d.ts +3 -0
- package/lib/display/splash/splash.service.d.ts +3 -0
- package/lib/display/table/resizable-column.component.d.ts +3 -0
- package/lib/display/table/resizable-table.directive.d.ts +3 -0
- package/lib/display/table/searchable-table.component.d.ts +6 -3
- package/lib/display/table/table-detail-row.component.d.ts +3 -0
- package/lib/display/table/table-locked-column.component.d.ts +3 -0
- package/lib/display/table/table-master-header-row.component.d.ts +3 -0
- package/lib/display/table/table-master-row.component.d.ts +3 -0
- package/lib/display/table/table-pagination.component.d.ts +3 -0
- package/lib/display/table/table-selectable-row.component.d.ts +5 -2
- package/lib/display/table/table.component.d.ts +3 -0
- package/lib/display/tags/tags.component.d.ts +3 -0
- package/lib/display/toast/toast/toast.component.d.ts +3 -0
- package/lib/display/toast/toast.service.d.ts +3 -0
- package/lib/display/toast/toaster/toaster.component.d.ts +3 -0
- package/lib/display/tooltip/tooltip.component.d.ts +3 -0
- package/lib/display/tooltip/tooltip.service.d.ts +3 -0
- package/lib/display/tree/tree.component.d.ts +3 -0
- package/lib/display/view-overlay/view-overlay.component.d.ts +3 -0
- package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +3 -0
- package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +3 -0
- package/lib/shared/directives/popup/popup-container.directive.d.ts +3 -0
- package/lib/shared/display/pipes/date-display.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/highlight-text.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/relative-date.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/row-count.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/time-display.pipe.d.ts +3 -0
- package/lib/shared/form-group.helper.d.ts +5 -2
- package/lib/shared/page/page-base/page-base.component.d.ts +5 -2
- package/lib/shared/page/page-title/page-title.component.d.ts +3 -0
- package/lib/shared/page/page-view/page-view.component.d.ts +3 -0
- package/lib/shared/testing/public-mocks.spec.d.ts +7 -0
- package/lib/shared/user-preference.service.d.ts +3 -0
- package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +3 -0
- package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +3 -0
- package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +3 -0
- package/package.json +27 -15
- package/src/styles/_functions.scss +6 -4
- package/src/styles/_icons.scss +1 -1
- package/src/styles/mixins/_control-base.scss +2 -2
- package/src/styles/mixins/_form-control-base.scss +3 -1
- package/src/styles/mixins/_spinner-base.scss +3 -1
- package/bundles/energycap-components.umd.js +0 -10646
- package/bundles/energycap-components.umd.js.map +0 -1
- package/bundles/energycap-components.umd.min.js +0 -17
- package/bundles/energycap-components.umd.min.js.map +0 -1
- package/energycap-components.d.ts +0 -7
- package/energycap-components.metadata.json +0 -1
- package/esm2015/energycap-components.js +0 -8
- package/esm2015/lib/components.module.js +0 -238
- package/esm2015/lib/controls/banner/banner.component.js +0 -94
- package/esm2015/lib/controls/button/button.component.js +0 -89
- package/esm2015/lib/controls/button/copy-button.directive.js +0 -63
- package/esm2015/lib/controls/checkbox/checkbox.component.js +0 -137
- package/esm2015/lib/controls/collapsible-toggle/collapsible-toggle.component.js +0 -35
- package/esm2015/lib/controls/combobox/combobox.component.js +0 -819
- package/esm2015/lib/controls/dropdown/dropdown.component.js +0 -207
- package/esm2015/lib/controls/file-upload/file-upload.component.js +0 -172
- package/esm2015/lib/controls/form-control/form-control.component.js +0 -65
- package/esm2015/lib/controls/form-control-base.js +0 -140
- package/esm2015/lib/controls/form-control-label/form-control-label.component.js +0 -139
- package/esm2015/lib/controls/form-group/form-group.component.js +0 -254
- package/esm2015/lib/controls/help-popover/help-popover.component.js +0 -22
- package/esm2015/lib/controls/item-picker/item-picker.component.js +0 -216
- package/esm2015/lib/controls/link-button/link-button.component.js +0 -12
- package/esm2015/lib/controls/menu/menu.component.js +0 -424
- package/esm2015/lib/controls/navigation/nav-item-active.directive.js +0 -86
- package/esm2015/lib/controls/numericbox/numericbox.component.js +0 -362
- package/esm2015/lib/controls/popover/popover.component.js +0 -85
- package/esm2015/lib/controls/radio-button/radio-button.component.js +0 -78
- package/esm2015/lib/controls/select/select.component.js +0 -89
- package/esm2015/lib/controls/tabs/tabs.component.js +0 -42
- package/esm2015/lib/controls/textbox/textbox.component.js +0 -149
- package/esm2015/lib/core/error.service.js +0 -56
- package/esm2015/lib/core/scroll.service.js +0 -88
- package/esm2015/lib/core/telemetry-tracker.service.js +0 -14
- package/esm2015/lib/core/telemetry.service.js +0 -40
- package/esm2015/lib/core/validation-message.service.js +0 -185
- package/esm2015/lib/core/window.service.js +0 -191
- package/esm2015/lib/display/app-bar/app-bar.component.js +0 -42
- package/esm2015/lib/display/avatar/avatar.component.js +0 -73
- package/esm2015/lib/display/confirm/confirm.component.js +0 -127
- package/esm2015/lib/display/dialog/dialog-group/dialog-group.component.js +0 -65
- package/esm2015/lib/display/dialog/dialog.component.js +0 -229
- package/esm2015/lib/display/dialog/dialog.service.js +0 -69
- package/esm2015/lib/display/hierarchy/hierarchy-base.js +0 -106
- package/esm2015/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.js +0 -58
- package/esm2015/lib/display/item-display/item-display.component.js +0 -57
- package/esm2015/lib/display/json-display/json-display.component.js +0 -44
- package/esm2015/lib/display/resizable/resizable-base.js +0 -119
- package/esm2015/lib/display/resizable/resizable.component.js +0 -57
- package/esm2015/lib/display/spinner/spinner.component.js +0 -12
- package/esm2015/lib/display/splash/splash.component.js +0 -45
- package/esm2015/lib/display/splash/splash.service.js +0 -34
- package/esm2015/lib/display/table/resizable-column.component.js +0 -23
- package/esm2015/lib/display/table/resizable-table.directive.js +0 -223
- package/esm2015/lib/display/table/searchable-table.component.js +0 -303
- package/esm2015/lib/display/table/table-detail-row.component.js +0 -21
- package/esm2015/lib/display/table/table-locked-column.component.js +0 -53
- package/esm2015/lib/display/table/table-master-header-row.component.js +0 -11
- package/esm2015/lib/display/table/table-master-row.component.js +0 -141
- package/esm2015/lib/display/table/table-pagination.component.js +0 -146
- package/esm2015/lib/display/table/table-selectable-row.component.js +0 -216
- package/esm2015/lib/display/table/table.component.js +0 -210
- package/esm2015/lib/display/tags/tag.js +0 -15
- package/esm2015/lib/display/tags/tags.component.js +0 -73
- package/esm2015/lib/display/toast/toast/toast.component.js +0 -70
- package/esm2015/lib/display/toast/toast.service.js +0 -34
- package/esm2015/lib/display/toast/toaster/toaster.component.js +0 -117
- package/esm2015/lib/display/tooltip/tooltip.component.js +0 -24
- package/esm2015/lib/display/tooltip/tooltip.service.js +0 -64
- package/esm2015/lib/display/tree/tree.component.js +0 -100
- package/esm2015/lib/display/view-overlay/view-overlay.component.js +0 -50
- package/esm2015/lib/shared/directives/click-area-for/click-area-for.directive.js +0 -25
- package/esm2015/lib/shared/directives/if-viewport-width/if-viewport-width.directive.js +0 -112
- package/esm2015/lib/shared/directives/popup/popup-container.directive.js +0 -160
- package/esm2015/lib/shared/display/pipes/date-display.pipe.js +0 -49
- package/esm2015/lib/shared/display/pipes/highlight-text.pipe.js +0 -26
- package/esm2015/lib/shared/display/pipes/relative-date.pipe.js +0 -49
- package/esm2015/lib/shared/display/pipes/row-count.pipe.js +0 -47
- package/esm2015/lib/shared/display/pipes/time-display.pipe.js +0 -40
- package/esm2015/lib/shared/form-group.helper.js +0 -65
- package/esm2015/lib/shared/page/page-base/page-base.component.js +0 -356
- package/esm2015/lib/shared/page/page-title/page-title.component.js +0 -19
- package/esm2015/lib/shared/page/page-view/page-view.component.js +0 -94
- package/esm2015/lib/shared/testing/page-base-component-test-helper.spec.js +0 -35
- package/esm2015/lib/shared/testing/public-mocks.spec.js +0 -126
- package/esm2015/lib/shared/user-preference.service.js +0 -15
- package/esm2015/lib/shared/wizard/wizard-base/wizard-base.component.js +0 -260
- package/esm2015/lib/shared/wizard/wizard-buttons/wizard-buttons.component.js +0 -54
- package/esm2015/lib/shared/wizard/wizard-progress/wizard-progress.component.js +0 -18
- package/fesm2015/energycap-components.js +0 -9638
- package/fesm2015/energycap-components.js.map +0 -1
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Validators } from '@angular/forms';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Helper for Form Groups
|
|
6
|
-
*/
|
|
7
|
-
export class FormGroupHelper {
|
|
8
|
-
/**
|
|
9
|
-
* Call patchValue on the formGroup with only the properties
|
|
10
|
-
* that actually have values in updates. This method will ignore
|
|
11
|
-
* any value that is either null or undefined
|
|
12
|
-
*/
|
|
13
|
-
patchValueSafely(formGroup, updates) {
|
|
14
|
-
let safeUpdates = {};
|
|
15
|
-
Object.keys(updates).forEach(function (propName) {
|
|
16
|
-
let rawValue = updates[propName];
|
|
17
|
-
if (rawValue !== null && rawValue !== undefined) {
|
|
18
|
-
safeUpdates[propName] = rawValue;
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
formGroup.patchValue(safeUpdates);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Get an id for the form controls input
|
|
25
|
-
*/
|
|
26
|
-
getInputId(id) {
|
|
27
|
-
return id + '_input';
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Takes in a control and returns a function that sets the control's required validator based on
|
|
31
|
-
* whether the value provided is empty or not. Adds the required validator if the value provided is
|
|
32
|
-
* not empty, otherwise removes the required validator. Useful for dynamically setting the requiredness
|
|
33
|
-
* of a control based on whether another control has a value or not.
|
|
34
|
-
*
|
|
35
|
-
* @param control
|
|
36
|
-
* @param keepValidators - Array of Validators to leave configured on the control. Any existing
|
|
37
|
-
* validators on the control will be lost if this is left empty.
|
|
38
|
-
* @param isZeroEmpty - If true, a numeric zero will be considered an empty value. Default is false.
|
|
39
|
-
*/
|
|
40
|
-
setRequiredFn(control, keepValidators = [], isZeroEmpty = false) {
|
|
41
|
-
return (value) => {
|
|
42
|
-
let validators = [...keepValidators];
|
|
43
|
-
// If the value is not empty, add the required validator.
|
|
44
|
-
if (value || (!isZeroEmpty ? value === 0 : false)) {
|
|
45
|
-
validators.push(Validators.required);
|
|
46
|
-
}
|
|
47
|
-
if (validators.length > 0) {
|
|
48
|
-
control.setValidators(validators);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
control.clearValidators();
|
|
52
|
-
}
|
|
53
|
-
// Recalculating the value is required when changing the validators, otherwise
|
|
54
|
-
// the validator won't take effect until the value is changed in the control.
|
|
55
|
-
control.updateValueAndValidity({ emitEvent: false });
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
FormGroupHelper.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormGroupHelper_Factory() { return new FormGroupHelper(); }, token: FormGroupHelper, providedIn: "root" });
|
|
60
|
-
FormGroupHelper.decorators = [
|
|
61
|
-
{ type: Injectable, args: [{
|
|
62
|
-
providedIn: 'root'
|
|
63
|
-
},] }
|
|
64
|
-
];
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2Zvcm0tZ3JvdXAuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBOEIsVUFBVSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFDckYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFM0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZUFBZTtJQUV4Qjs7OztPQUlHO0lBQ0ksZ0JBQWdCLENBQUMsU0FBb0IsRUFBRSxPQUFZO1FBQ3RELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLFFBQVE7WUFDM0MsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWpDLElBQUcsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFDO2dCQUMzQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQ3BDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxFQUFVO1FBQ3hCLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGFBQWEsQ0FBQyxPQUF3QixFQUFFLGlCQUFnQyxFQUFFLEVBQUUsY0FBdUIsS0FBSztRQUMzRyxPQUFPLENBQUMsS0FBOEIsRUFBRSxFQUFFO1lBQ3RDLElBQUksVUFBVSxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztZQUVyQyx5REFBeUQ7WUFDekQsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQy9DLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3hDO1lBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDSCxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDN0I7WUFDRCw4RUFBOEU7WUFDOUUsNkVBQTZFO1lBQzdFLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQTtJQUNMLENBQUM7Ozs7WUExREosVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUdyb3VwLCBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKipcclxuICogSGVscGVyIGZvciBGb3JtIEdyb3Vwc1xyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtR3JvdXBIZWxwZXIge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbCBwYXRjaFZhbHVlIG9uIHRoZSBmb3JtR3JvdXAgd2l0aCBvbmx5IHRoZSBwcm9wZXJ0aWVzXHJcbiAgICAgKiB0aGF0IGFjdHVhbGx5IGhhdmUgdmFsdWVzIGluIHVwZGF0ZXMuIFRoaXMgbWV0aG9kIHdpbGwgaWdub3JlXHJcbiAgICAgKiBhbnkgdmFsdWUgdGhhdCBpcyBlaXRoZXIgbnVsbCBvciB1bmRlZmluZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhdGNoVmFsdWVTYWZlbHkoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIHVwZGF0ZXM6IGFueSl7XHJcbiAgICAgICAgbGV0IHNhZmVVcGRhdGVzID0ge307XHJcbiAgICAgICAgT2JqZWN0LmtleXModXBkYXRlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcclxuICAgICAgICAgICAgbGV0IHJhd1ZhbHVlID0gdXBkYXRlc1twcm9wTmFtZV07XHJcblxyXG4gICAgICAgICAgICBpZihyYXdWYWx1ZSAhPT0gbnVsbCAmJiByYXdWYWx1ZSAhPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgIHNhZmVVcGRhdGVzW3Byb3BOYW1lXSA9IHJhd1ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZm9ybUdyb3VwLnBhdGNoVmFsdWUoc2FmZVVwZGF0ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGFuIGlkIGZvciB0aGUgZm9ybSBjb250cm9scyBpbnB1dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SW5wdXRJZChpZDogc3RyaW5nKTpzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBpZCArICdfaW5wdXQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgaW4gYSBjb250cm9sIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBjb250cm9sJ3MgcmVxdWlyZWQgdmFsaWRhdG9yIGJhc2VkIG9uXHJcbiAgICAgKiB3aGV0aGVyIHRoZSB2YWx1ZSBwcm92aWRlZCBpcyBlbXB0eSBvciBub3QuIEFkZHMgdGhlIHJlcXVpcmVkIHZhbGlkYXRvciBpZiB0aGUgdmFsdWUgcHJvdmlkZWQgaXNcclxuICAgICAqIG5vdCBlbXB0eSwgb3RoZXJ3aXNlIHJlbW92ZXMgdGhlIHJlcXVpcmVkIHZhbGlkYXRvci4gVXNlZnVsIGZvciBkeW5hbWljYWxseSBzZXR0aW5nIHRoZSByZXF1aXJlZG5lc3NcclxuICAgICAqIG9mIGEgY29udHJvbCBiYXNlZCBvbiB3aGV0aGVyIGFub3RoZXIgY29udHJvbCBoYXMgYSB2YWx1ZSBvciBub3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0ga2VlcFZhbGlkYXRvcnMgLSBBcnJheSBvZiBWYWxpZGF0b3JzIHRvIGxlYXZlIGNvbmZpZ3VyZWQgb24gdGhlIGNvbnRyb2wuIEFueSBleGlzdGluZ1xyXG4gICAgICogdmFsaWRhdG9ycyBvbiB0aGUgY29udHJvbCB3aWxsIGJlIGxvc3QgaWYgdGhpcyBpcyBsZWZ0IGVtcHR5LlxyXG4gICAgICogQHBhcmFtIGlzWmVyb0VtcHR5IC0gSWYgdHJ1ZSwgYSBudW1lcmljIHplcm8gd2lsbCBiZSBjb25zaWRlcmVkIGFuIGVtcHR5IHZhbHVlLiBEZWZhdWx0IGlzIGZhbHNlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0UmVxdWlyZWRGbihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGtlZXBWYWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW10sIGlzWmVyb0VtcHR5OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gKHZhbHVlPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmFsaWRhdG9ycyA9IFsuLi5rZWVwVmFsaWRhdG9yc107XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IGVtcHR5LCBhZGQgdGhlIHJlcXVpcmVkIHZhbGlkYXRvci5cclxuICAgICAgICAgICAgaWYgKHZhbHVlIHx8ICghaXNaZXJvRW1wdHkgPyB2YWx1ZSA9PT0gMCA6IGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRpbmcgdGhlIHZhbHVlIGlzIHJlcXVpcmVkIHdoZW4gY2hhbmdpbmcgdGhlIHZhbGlkYXRvcnMsIG90aGVyd2lzZVxyXG4gICAgICAgICAgICAvLyB0aGUgdmFsaWRhdG9yIHdvbid0IHRha2UgZWZmZWN0IHVudGlsIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkIGluIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2V9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Directive, HostBinding, Injector } from '@angular/core';
|
|
3
|
-
import { FormGroup } from '@angular/forms';
|
|
4
|
-
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
|
5
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
6
|
-
import { ReplaySubject, Subject } from 'rxjs';
|
|
7
|
-
import { filter, takeUntil } from 'rxjs/operators';
|
|
8
|
-
import { ErrorService } from '../../../core/error.service';
|
|
9
|
-
import { ScrollService } from '../../../core/scroll.service';
|
|
10
|
-
import { DialogService } from '../../../display/dialog/dialog.service';
|
|
11
|
-
import { SplashService } from '../../../display/splash/splash.service';
|
|
12
|
-
import { Overlay } from '../../../display/view-overlay/view-overlay.component';
|
|
13
|
-
import { PageStatus, PageStatuses } from '../page-statuses';
|
|
14
|
-
export class PageInitResult {
|
|
15
|
-
constructor() {
|
|
16
|
-
this.title = '';
|
|
17
|
-
this.subTitle = '';
|
|
18
|
-
this.subTitleUrl = '';
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export class PageBaseComponent {
|
|
22
|
-
constructor(injector) {
|
|
23
|
-
/** Default css classes applied to host element */
|
|
24
|
-
this.classList = 'd-flex flex-grow';
|
|
25
|
-
/**
|
|
26
|
-
* Title for the page displayed in the header
|
|
27
|
-
*/
|
|
28
|
-
this.title = '';
|
|
29
|
-
/**
|
|
30
|
-
* Sub title for the page displayed in the header
|
|
31
|
-
*/
|
|
32
|
-
this.subTitle = '';
|
|
33
|
-
/**
|
|
34
|
-
* Sub title url for the page displayed in the header
|
|
35
|
-
*/
|
|
36
|
-
this.subTitleUrl = '';
|
|
37
|
-
/**
|
|
38
|
-
* Status overlay for the page
|
|
39
|
-
*/
|
|
40
|
-
this.status = new Overlay('pending', 'Loading');
|
|
41
|
-
/**
|
|
42
|
-
* Form group to be used if needed by the page
|
|
43
|
-
*/
|
|
44
|
-
this.formGroup = new FormGroup({});
|
|
45
|
-
/**
|
|
46
|
-
* Default invalid form message, override if a more specific message is needed
|
|
47
|
-
*/
|
|
48
|
-
this.defaultInvalidFormMessage = 'PleaseCorrectForm_SC';
|
|
49
|
-
/**
|
|
50
|
-
* Default unknown save error message, override if a more specific message is needed
|
|
51
|
-
*/
|
|
52
|
-
this.defaultUnknownSaveError = 'PageBaseUnknownSaveError_SC';
|
|
53
|
-
/**
|
|
54
|
-
* Used to opt out of hiding the splash screen when the page is loaded
|
|
55
|
-
*/
|
|
56
|
-
this.skipHideSplashOnComplete = false;
|
|
57
|
-
/**
|
|
58
|
-
* Used to unsubscribe from observables
|
|
59
|
-
*/
|
|
60
|
-
this.destroyed = new Subject();
|
|
61
|
-
/**
|
|
62
|
-
* Used to know when the page has been loaded, this will be completed
|
|
63
|
-
* after onAfterViewInit
|
|
64
|
-
*/
|
|
65
|
-
this._afterViewInitComplete = new ReplaySubject();
|
|
66
|
-
this.afterViewInitComplete = this._afterViewInitComplete;
|
|
67
|
-
/**
|
|
68
|
-
* Errors to be shown for the component.
|
|
69
|
-
* Automatically populated on promise rejection from save and shared with the UI.
|
|
70
|
-
*/
|
|
71
|
-
this._errors = '';
|
|
72
|
-
this.errorService = injector.get(ErrorService);
|
|
73
|
-
this.translateService = injector.get(TranslateService);
|
|
74
|
-
this.scrollService = injector.get(ScrollService);
|
|
75
|
-
this.router = injector.get(Router);
|
|
76
|
-
this.activatedRoute = injector.get(ActivatedRoute);
|
|
77
|
-
this.dialogService = injector.get(DialogService);
|
|
78
|
-
this.splashService = injector.get(SplashService);
|
|
79
|
-
}
|
|
80
|
-
get errors() {
|
|
81
|
-
return this._errors;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Optional lifecycle hook that is called as part of the Angular ngOnInit lifecycle hook.
|
|
85
|
-
* Called before onInit is called for the first time. Add setup logic here that does
|
|
86
|
-
* not need to be run on every reload.
|
|
87
|
-
*/
|
|
88
|
-
onFirstInit() { }
|
|
89
|
-
ngOnInit() {
|
|
90
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
-
try {
|
|
92
|
-
this.showStatus(PageStatus.Loading);
|
|
93
|
-
this.onFirstInit();
|
|
94
|
-
this.initPromise = this.onInit();
|
|
95
|
-
yield this.initPromise;
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
this.splashService.hideSplash();
|
|
99
|
-
this.onError(error);
|
|
100
|
-
}
|
|
101
|
-
;
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* This method is called just after the Angular Lifecycle event ngOnAfterViewInit.
|
|
106
|
-
* It fires after all sub-components have gone through their initialization phase.
|
|
107
|
-
* It is in this phase that the view components should already exist, so a derived class should
|
|
108
|
-
* load data from the API to populate any view components. The promise that
|
|
109
|
-
* is returned must not resolve until all required data has completely loaded
|
|
110
|
-
*/
|
|
111
|
-
onAfterViewInit() {
|
|
112
|
-
return __awaiter(this, void 0, void 0, function* () { });
|
|
113
|
-
}
|
|
114
|
-
;
|
|
115
|
-
ngAfterViewInit() {
|
|
116
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
-
try {
|
|
118
|
-
const initResult = yield this.initPromise;
|
|
119
|
-
this.parseInitResult(initResult);
|
|
120
|
-
yield this.onAfterViewInit();
|
|
121
|
-
this._afterViewInitComplete.next();
|
|
122
|
-
this._afterViewInitComplete.complete();
|
|
123
|
-
yield this.onFormLoadComplete();
|
|
124
|
-
if (this.status.status === 'pending') {
|
|
125
|
-
this.showStatus(PageStatus.Loaded);
|
|
126
|
-
}
|
|
127
|
-
if (!this.skipHideSplashOnComplete) {
|
|
128
|
-
this.splashService.hideSplash();
|
|
129
|
-
}
|
|
130
|
-
this.setUpRouterSubscriptions();
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
this.splashService.hideSplash();
|
|
134
|
-
this.onError(error);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* A lifecycle method that executes once all data has been loaded
|
|
140
|
-
* through ngAfterViewInit and from local storage if required.
|
|
141
|
-
* It is at this point that you can subscribe to changes on the form
|
|
142
|
-
* reliably
|
|
143
|
-
*
|
|
144
|
-
* @protected
|
|
145
|
-
* @memberof PageBaseComponent
|
|
146
|
-
*/
|
|
147
|
-
onFormLoadComplete() {
|
|
148
|
-
return __awaiter(this, void 0, void 0, function* () { });
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* A lifecycle hook that is called after every NavigationEnd event.
|
|
152
|
-
*/
|
|
153
|
-
onNavigationEnd() { }
|
|
154
|
-
/**
|
|
155
|
-
* Reload the component kicking off the ngOnInit and ngAfterViewInit lifecycle hooks.
|
|
156
|
-
* Any state that needs to be reset should be done so before calling this method.
|
|
157
|
-
*/
|
|
158
|
-
reload() {
|
|
159
|
-
this._afterViewInitComplete = new ReplaySubject();
|
|
160
|
-
this.showStatus(PageStatus.Loading);
|
|
161
|
-
this.initPromise = this.onInit();
|
|
162
|
-
this.ngAfterViewInit();
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* When overridden in a derived class this method will sync the form state
|
|
166
|
-
* into the object that will be persisted to the API. The value should not
|
|
167
|
-
* actually be sent to the API yet.
|
|
168
|
-
*/
|
|
169
|
-
applyModelUpdates() {
|
|
170
|
-
return __awaiter(this, void 0, void 0, function* () { });
|
|
171
|
-
}
|
|
172
|
-
;
|
|
173
|
-
/**
|
|
174
|
-
* Save the model state to the API and return a promise that
|
|
175
|
-
* contains the updated entityID. The promise should be rejected
|
|
176
|
-
* if the save fails and errors and the overlay status will be updated
|
|
177
|
-
* accordingly
|
|
178
|
-
*/
|
|
179
|
-
saveToApi() {
|
|
180
|
-
return __awaiter(this, void 0, void 0, function* () { });
|
|
181
|
-
}
|
|
182
|
-
;
|
|
183
|
-
/**
|
|
184
|
-
* Called after the save has completed successfully.
|
|
185
|
-
* It is the responsibility of the derived class to navigate
|
|
186
|
-
* to a properties/status page or emit appropriately if within a dialog
|
|
187
|
-
* @param entityId
|
|
188
|
-
*/
|
|
189
|
-
onSaveComplete(entityId) { }
|
|
190
|
-
;
|
|
191
|
-
/**
|
|
192
|
-
* Function called when the user clicks save. We will first touch all controls to show validation messages
|
|
193
|
-
* if the form is invalid. If the form is valid we will attempt to save and any errors will be reported
|
|
194
|
-
* back to the user
|
|
195
|
-
* @param event
|
|
196
|
-
*/
|
|
197
|
-
onSave(event) {
|
|
198
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
199
|
-
this.formGroup.markAllAsTouched();
|
|
200
|
-
if (this.formGroup.valid) {
|
|
201
|
-
this.showStatus(PageStatus.Saving);
|
|
202
|
-
try {
|
|
203
|
-
yield this.applyModelUpdates();
|
|
204
|
-
let entityId = (yield this.saveToApi()) || -1;
|
|
205
|
-
this._errors = '';
|
|
206
|
-
this.onSaveComplete(entityId);
|
|
207
|
-
}
|
|
208
|
-
catch (error) {
|
|
209
|
-
//clear the "saving" overlay and show the message at the top of the view through the errors property
|
|
210
|
-
this.showErrorBanner(error, this.defaultUnknownSaveError);
|
|
211
|
-
this.splashService.hideSplash();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
// Only show the banner with the generic message if the parent component hasn't already set one
|
|
216
|
-
// by implementing onSave for additional validation
|
|
217
|
-
if (this.errors === '') {
|
|
218
|
-
this.showErrorBanner(this.defaultInvalidFormMessage);
|
|
219
|
-
}
|
|
220
|
-
if (this.scrollContainerSelector) {
|
|
221
|
-
setTimeout(() => {
|
|
222
|
-
this.scrollService.scrollToItem(this.scrollContainerSelector, ".ng-invalid");
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Function called when the component is destroyed
|
|
230
|
-
*/
|
|
231
|
-
ngOnDestroy() {
|
|
232
|
-
this.destroyed.next();
|
|
233
|
-
this.destroyed.unsubscribe();
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Function that will log an error that is passed in to the console
|
|
237
|
-
* @param e
|
|
238
|
-
*/
|
|
239
|
-
onError(error) {
|
|
240
|
-
this.errorService.logConsoleError(error);
|
|
241
|
-
this.showErrorOverlay(error);
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Show an error message in a whole-page overlay. This will prevent any more
|
|
245
|
-
* interactions with the page. It can take a string error message or a raw API
|
|
246
|
-
* error that needs to be parsed. If the API error isn't something we can handle
|
|
247
|
-
* a generic message is shown instead
|
|
248
|
-
* @param {(Error | string)} error
|
|
249
|
-
*/
|
|
250
|
-
showErrorOverlay(error) {
|
|
251
|
-
this.getErrorMessage(error).subscribe((translatedMessage) => {
|
|
252
|
-
this.status.setStatus('error', translatedMessage);
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Show an error in the banner at the top of the screen. This will not produce a
|
|
257
|
-
* whole-page overlay like the function showError will. It can take a string error message
|
|
258
|
-
* or raw API error that needs to be parsed. If the API error isn't something we can handle,
|
|
259
|
-
* a generic message (customizable via unknownErrorDefault) is shown instead.
|
|
260
|
-
* @param error
|
|
261
|
-
* @param unknownErrorDefault
|
|
262
|
-
*/
|
|
263
|
-
showErrorBanner(error, unknownErrorDefault) {
|
|
264
|
-
this.getErrorMessage(error, unknownErrorDefault).subscribe((translatedMessage) => {
|
|
265
|
-
this._errors = translatedMessage;
|
|
266
|
-
this.showStatus(PageStatus.Loaded);
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Parses and translates an API error or error string.
|
|
271
|
-
* @param e
|
|
272
|
-
* @param unknownErrorDefault
|
|
273
|
-
*/
|
|
274
|
-
getErrorMessage(e, unknownErrorDefault) {
|
|
275
|
-
let extractedMessage = this.errorService.parseApiError(e, unknownErrorDefault);
|
|
276
|
-
return this.translateService.get(extractedMessage);
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Clear the errors to hide the errors banner.
|
|
280
|
-
*/
|
|
281
|
-
hideErrorBanner() {
|
|
282
|
-
this._errors = '';
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Change the display status to overlay the whole page while loading or saving
|
|
286
|
-
* and clear it when the form is ready
|
|
287
|
-
* @protected
|
|
288
|
-
* @param {PageStatus} status
|
|
289
|
-
* @memberof FormBaseComponent
|
|
290
|
-
*/
|
|
291
|
-
showStatus(status) {
|
|
292
|
-
let knownStatus = PageStatuses[status];
|
|
293
|
-
if (knownStatus) {
|
|
294
|
-
this.status.setStatus(knownStatus.status, knownStatus.message, undefined, knownStatus.noDataTemplate, knownStatus.overlayClassList);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Allows the component to enter a pending status and execute a function that on completion will return the status
|
|
299
|
-
* to hasData. If an error occurs within the callback an error banner can be shown.
|
|
300
|
-
* @param callback
|
|
301
|
-
* @returns
|
|
302
|
-
*/
|
|
303
|
-
runBlockingAction(callback, pendingMessage) {
|
|
304
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
305
|
-
this.hideErrorBanner();
|
|
306
|
-
this.status.setStatus('pending', pendingMessage);
|
|
307
|
-
return callback().catch(error => {
|
|
308
|
-
this.showErrorBanner(error);
|
|
309
|
-
// Throw the error for any downstream components that may be listening and need to react
|
|
310
|
-
// to any errors happening within this callback
|
|
311
|
-
throw (error);
|
|
312
|
-
}).finally(() => {
|
|
313
|
-
this.showStatus(PageStatus.Loaded);
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
;
|
|
318
|
-
/**
|
|
319
|
-
* Parses the page init result and sets the necessary properties on the page
|
|
320
|
-
* @param result
|
|
321
|
-
*/
|
|
322
|
-
parseInitResult(result) {
|
|
323
|
-
this.initResult = result;
|
|
324
|
-
this.title = result.title;
|
|
325
|
-
this.subTitle = result.subTitle;
|
|
326
|
-
this.subTitleUrl = result.subTitleUrl;
|
|
327
|
-
this.breadcrumbs = result.breadcrumbs;
|
|
328
|
-
this.help = result.help;
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* Sets up the router event subscriptions
|
|
332
|
-
*/
|
|
333
|
-
setUpRouterSubscriptions() {
|
|
334
|
-
if (!this.navigationEndSubscription && !this.destroyed.closed) {
|
|
335
|
-
// React to navigation events
|
|
336
|
-
this.navigationEndSubscription = this.router.events.pipe(takeUntil(this.destroyed), filter(e => e instanceof NavigationEnd)).subscribe(e => {
|
|
337
|
-
try {
|
|
338
|
-
this.onNavigationEnd();
|
|
339
|
-
}
|
|
340
|
-
catch (error) {
|
|
341
|
-
this.onError(error);
|
|
342
|
-
}
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
PageBaseComponent.decorators = [
|
|
348
|
-
{ type: Directive }
|
|
349
|
-
];
|
|
350
|
-
PageBaseComponent.ctorParameters = () => [
|
|
351
|
-
{ type: Injector }
|
|
352
|
-
];
|
|
353
|
-
PageBaseComponent.propDecorators = {
|
|
354
|
-
classList: [{ type: HostBinding, args: ['class',] }]
|
|
355
|
-
};
|
|
356
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLWJhc2UvcGFnZS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBYyxhQUFhLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1RCxNQUFNLE9BQU8sY0FBYztJQUEzQjtRQUNFLFVBQUssR0FBWSxFQUFFLENBQUM7UUFDcEIsYUFBUSxHQUFZLEVBQUUsQ0FBQztRQUN2QixnQkFBVyxHQUFZLEVBQUUsQ0FBQztJQUk1QixDQUFDO0NBQUE7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SSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUM3RCw2QkFBNkI7WUFDN0IsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdEQsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLGFBQWEsQ0FBQyxDQUN4QyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDZCxJQUFJO29CQUNGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztpQkFDeEI7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDckI7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7O1lBellGLFNBQVM7OztZQXhCc0MsUUFBUTs7O3dCQTJCckQsV0FBVyxTQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEhvc3RCaW5kaW5nLCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE5hdkl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb250cm9scy9uYXZpZ2F0aW9uL25hdi1pdGVtJztcclxuaW1wb3J0IHsgRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lcnJvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2Nyb2xsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTcGxhc2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9zcGxhc2gvc3BsYXNoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWxwIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9oZWxwL2hlbHAtdHlwZXMnO1xyXG5pbXBvcnQgeyBPdmVybGF5IH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS92aWV3LW92ZXJsYXkvdmlldy1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBhZ2VTdGF0dXMsIFBhZ2VTdGF0dXNlcyB9IGZyb20gJy4uL3BhZ2Utc3RhdHVzZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBhZ2VJbml0UmVzdWx0IHtcclxuICB0aXRsZT86IHN0cmluZyA9ICcnO1xyXG4gIHN1YlRpdGxlPzogc3RyaW5nID0gJyc7XHJcbiAgc3ViVGl0bGVVcmw/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgYnJlYWRjcnVtYnM/OiBOYXZJdGVtW107XHJcbiAgaGVscD86IEhlbHA7XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGFnZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqIERlZmF1bHQgY3NzIGNsYXNzZXMgYXBwbGllZCB0byBob3N0IGVsZW1lbnQgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgcHJvdGVjdGVkIGNsYXNzTGlzdCA9ICdkLWZsZXggZmxleC1ncm93JztcclxuXHJcbiAgLyoqXHJcbiAgICogVGl0bGUgZm9yIHRoZSBwYWdlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyXHJcbiAgICovXHJcbiAgcHVibGljIHRpdGxlPzogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YiB0aXRsZSBmb3IgdGhlIHBhZ2UgZGlzcGxheWVkIGluIHRoZSBoZWFkZXJcclxuICAgKi9cclxuICBwdWJsaWMgc3ViVGl0bGU/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogU3ViIHRpdGxlIHVybCBmb3IgdGhlIHBhZ2UgZGlzcGxheWVkIGluIHRoZSBoZWFkZXJcclxuICAgKi9cclxuICBwdWJsaWMgc3ViVGl0bGVVcmw/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogU3RhdHVzIG92ZXJsYXkgZm9yIHRoZSBwYWdlXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXR1czogT3ZlcmxheSA9IG5ldyBPdmVybGF5KCdwZW5kaW5nJywgJ0xvYWRpbmcnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQnJlYWRjcnVtYnMgZGlzcGxheWVkIGluIHRoZSBoZWFkZXJcclxuICAgKi9cclxuICBwdWJsaWMgYnJlYWRjcnVtYnM/OiBOYXZJdGVtW107XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3VsdCByZXR1cm5lZCBmcm9tIHRoZSBvbkluaXQgZnVuY3Rpb25cclxuICAgKi9cclxuICBwdWJsaWMgaW5pdFJlc3VsdCE6IFBhZ2VJbml0UmVzdWx0O1xyXG5cclxuICAvKipcclxuICAgKiBIZWxwIGluZm9ybWF0aW9uIGZvciB0aGUgY29tcG9uZW50LCB3aGljaCBjYW4gb25seSBiZSBzZXQgdGhyb3VnaCBvbkluaXRcclxuICAgKi9cclxuICBwdWJsaWMgaGVscDogSGVscCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybSBncm91cCB0byBiZSB1c2VkIGlmIG5lZWRlZCBieSB0aGUgcGFnZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAvKipcclxuICAgKiBEZWZhdWx0IGludmFsaWQgZm9ybSBtZXNzYWdlLCBvdmVycmlkZSBpZiBhIG1vcmUgc3BlY2lmaWMgbWVzc2FnZSBpcyBuZWVkZWRcclxuICAgKi9cclxuICBwdWJsaWMgZGVmYXVsdEludmFsaWRGb3JtTWVzc2FnZTogc3RyaW5nID0gJ1BsZWFzZUNvcnJlY3RGb3JtX1NDJztcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCB1bmtub3duIHNhdmUgZXJyb3IgbWVzc2FnZSwgb3ZlcnJpZGUgaWYgYSBtb3JlIHNwZWNpZmljIG1lc3NhZ2UgaXMgbmVlZGVkXHJcbiAgICovXHJcbiAgcHVibGljIGRlZmF1bHRVbmtub3duU2F2ZUVycm9yOiBzdHJpbmcgPSAnUGFnZUJhc2VVbmtub3duU2F2ZUVycm9yX1NDJztcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byBvcHQgb3V0IG9mIGhpZGluZyB0aGUgc3BsYXNoIHNjcmVlbiB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBza2lwSGlkZVNwbGFzaE9uQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byB1bnN1YnNjcmliZSBmcm9tIG9ic2VydmFibGVzXHJcbiAgICovXHJcbiAgcHVibGljIGRlc3Ryb3llZDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICAvKipcclxuICAgKiBVc2VkIHRvIGtub3cgd2hlbiB0aGUgcGFnZSBoYXMgYmVlbiBsb2FkZWQsIHRoaXMgd2lsbCBiZSBjb21wbGV0ZWRcclxuICAgKiBhZnRlciBvbkFmdGVyVmlld0luaXRcclxuICAgKi9cclxuICBwcml2YXRlIF9hZnRlclZpZXdJbml0Q29tcGxldGU6IFJlcGxheVN1YmplY3Q8dm9pZD4gPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xyXG4gIHB1YmxpYyBhZnRlclZpZXdJbml0Q29tcGxldGU6IE9ic2VydmFibGU8dm9pZD4gPSB0aGlzLl9hZnRlclZpZXdJbml0Q29tcGxldGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGRlZmluZWQgdGhlIGZvcm0gd2lsbCBhdXRvbWF0aWNhbGx5IHNjcm9sbCB0byB0aGUgZmlyc3QgaW52YWxpZCBmb3JtIGNvbnRyb2xcclxuICAgKiBpZiBpdCdzIG91dHNpZGUgb2YgdGhlIHZpZXdcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSByb3V0ZXIgZXZlbnRzIE5hdmlnYXRpb25FbmRcclxuICAgKiBVc2VkIHRvIGtub3cgaWYgYWxyZWFkeSBzdWJzY3JpYmVkIHRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uRW5kU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvKipcclxuICAgKiBDb21tb24gc2VydmljZXMgdXNlZCBieSBwYWdlLWJhc2VcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHNjcm9sbFNlcnZpY2U6IFNjcm9sbFNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyO1xyXG4gIHByb3RlY3RlZCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGU7XHJcbiAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHNwbGFzaFNlcnZpY2U6IFNwbGFzaFNlcnZpY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgdGhpcy5lcnJvclNlcnZpY2UgPSBpbmplY3Rvci5nZXQoRXJyb3JTZXJ2aWNlKTtcclxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZSA9IGluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKTtcclxuICAgIHRoaXMuc2Nyb2xsU2VydmljZSA9IGluamVjdG9yLmdldChTY3JvbGxTZXJ2aWNlKTtcclxuICAgIHRoaXMucm91dGVyID0gaW5qZWN0b3IuZ2V0KFJvdXRlcik7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlID0gaW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcclxuICAgIHRoaXMuZGlhbG9nU2VydmljZSA9IGluamVjdG9yLmdldChEaWFsb2dTZXJ2aWNlKTtcclxuICAgIHRoaXMuc3BsYXNoU2VydmljZSA9IGluamVjdG9yLmdldChTcGxhc2hTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVycm9ycyB0byBiZSBzaG93biBmb3IgdGhlIGNvbXBvbmVudC5cclxuICAgKiBBdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBvbiBwcm9taXNlIHJlamVjdGlvbiBmcm9tIHNhdmUgYW5kIHNoYXJlZCB3aXRoIHRoZSBVSS5cclxuICAgKi9cclxuICBwcml2YXRlIF9lcnJvcnM6IHN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyBnZXQgZXJyb3JzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgbGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgQW5ndWxhciBuZ09uSW5pdCBsaWZlY3ljbGUgaG9vay5cclxuICAgKiBDYWxsZWQgYmVmb3JlIG9uSW5pdCBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLiBBZGQgc2V0dXAgbG9naWMgaGVyZSB0aGF0IGRvZXNcclxuICAgKiBub3QgbmVlZCB0byBiZSBydW4gb24gZXZlcnkgcmVsb2FkLlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBvbkZpcnN0SW5pdCgpOiB2b2lkIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3MgYXMgcGFydCBvZiB0aGUgQW5ndWxhciBuZ09uSW5pdFxyXG4gICAqIGxpZmVjeWNsZSBob29rLiBJdCBtdXN0IHByb3ZpZGUgYSBQYWdlSW5pdFJlc3VsdCBiYWNrIHRvIHRoZSBiYXNlIGNsYXNzIHRvIHByb3Blcmx5XHJcbiAgICogc2V0IHVwIHRoZSBwYWdlLlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvbkluaXQoKTogUHJvbWlzZTxQYWdlSW5pdFJlc3VsdD47XHJcbiAgcHJvdGVjdGVkIGluaXRQcm9taXNlITogUHJvbWlzZTxQYWdlSW5pdFJlc3VsdD47XHJcblxyXG4gIHB1YmxpYyBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRpbmcpO1xyXG4gICAgICB0aGlzLm9uRmlyc3RJbml0KCk7XHJcbiAgICAgIHRoaXMuaW5pdFByb21pc2UgPSB0aGlzLm9uSW5pdCgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmluaXRQcm9taXNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcclxuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBhZnRlciB0aGUgQW5ndWxhciBMaWZlY3ljbGUgZXZlbnQgbmdPbkFmdGVyVmlld0luaXQuXHJcbiAgICogSXQgZmlyZXMgYWZ0ZXIgYWxsIHN1Yi1jb21wb25lbnRzIGhhdmUgZ29uZSB0aHJvdWdoIHRoZWlyIGluaXRpYWxpemF0aW9uIHBoYXNlLlxyXG4gICAqIEl0IGlzIGluIHRoaXMgcGhhc2UgdGhhdCB0aGUgdmlldyBjb21wb25lbnRzIHNob3VsZCBhbHJlYWR5IGV4aXN0LCBzbyBhIGRlcml2ZWQgY2xhc3Mgc2hvdWxkXHJcbiAgICogbG9hZCBkYXRhIGZyb20gdGhlIEFQSSB0byBwb3B1bGF0ZSBhbnkgdmlldyBjb21wb25lbnRzLiBUaGUgcHJvbWlzZSB0aGF0XHJcbiAgICogaXMgcmV0dXJuZWQgbXVzdCBub3QgcmVzb2x2ZSB1bnRpbCBhbGwgcmVxdWlyZWQgZGF0YSBoYXMgY29tcGxldGVseSBsb2FkZWRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4geyB9O1xyXG4gIHB1YmxpYyBhc3luYyBuZ0FmdGVyVmlld0luaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbml0UmVzdWx0ID0gYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcclxuICAgICAgdGhpcy5wYXJzZUluaXRSZXN1bHQoaW5pdFJlc3VsdCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJWaWV3SW5pdCgpO1xyXG5cclxuICAgICAgdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlLm5leHQoKTtcclxuICAgICAgdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlLmNvbXBsZXRlKCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLm9uRm9ybUxvYWRDb21wbGV0ZSgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc3RhdHVzLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGVkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLnNraXBIaWRlU3BsYXNoT25Db21wbGV0ZSkge1xyXG4gICAgICAgIHRoaXMuc3BsYXNoU2VydmljZS5oaWRlU3BsYXNoKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0VXBSb3V0ZXJTdWJzY3JpcHRpb25zKCk7XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcclxuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCB0aGF0IGV4ZWN1dGVzIG9uY2UgYWxsIGRhdGEgaGFzIGJlZW4gbG9hZGVkXHJcbiAgICogdGhyb3VnaCBuZ0FmdGVyVmlld0luaXQgYW5kIGZyb20gbG9jYWwgc3RvcmFnZSBpZiByZXF1aXJlZC5cclxuICAgKiBJdCBpcyBhdCB0aGlzIHBvaW50IHRoYXQgeW91IGNhbiBzdWJzY3JpYmUgdG8gY2hhbmdlcyBvbiB0aGUgZm9ybVxyXG4gICAqIHJlbGlhYmx5XHJcbiAgICpcclxuICAgKiBAcHJvdGVjdGVkXHJcbiAgICogQG1lbWJlcm9mIFBhZ2VCYXNlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFzeW5jIG9uRm9ybUxvYWRDb21wbGV0ZSgpOiBQcm9taXNlPGFueT4geyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgbGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgZXZlcnkgTmF2aWdhdGlvbkVuZCBldmVudC5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgb25OYXZpZ2F0aW9uRW5kKCk6IHZvaWQgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbG9hZCB0aGUgY29tcG9uZW50IGtpY2tpbmcgb2ZmIHRoZSBuZ09uSW5pdCBhbmQgbmdBZnRlclZpZXdJbml0IGxpZmVjeWNsZSBob29rcy5cclxuICAgKiBBbnkgc3RhdGUgdGhhdCBuZWVkcyB0byBiZSByZXNldCBzaG91bGQgYmUgZG9uZSBzbyBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC5cclxuICAgKi9cclxuICBwdWJsaWMgcmVsb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlID0gbmV3IFJlcGxheVN1YmplY3QoKTtcclxuXHJcbiAgICB0aGlzLnNob3dTdGF0dXMoUGFnZVN0YXR1cy5Mb2FkaW5nKTtcclxuICAgIHRoaXMuaW5pdFByb21pc2UgPSB0aGlzLm9uSW5pdCgpO1xyXG4gICAgdGhpcy5uZ0FmdGVyVmlld0luaXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gb3ZlcnJpZGRlbiBpbiBhIGRlcml2ZWQgY2xhc3MgdGhpcyBtZXRob2Qgd2lsbCBzeW5jIHRoZSBmb3JtIHN0YXRlXHJcbiAgICogaW50byB0aGUgb2JqZWN0IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIEFQSS4gVGhlIHZhbHVlIHNob3VsZCBub3RcclxuICAgKiBhY3R1YWxseSBiZSBzZW50IHRvIHRoZSBBUEkgeWV0LlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBhc3luYyBhcHBseU1vZGVsVXBkYXRlcygpOiBQcm9taXNlPHZvaWQ+IHsgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2F2ZSB0aGUgbW9kZWwgc3RhdGUgdG8gdGhlIEFQSSBhbmQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0XHJcbiAgICogY29udGFpbnMgdGhlIHVwZGF0ZWQgZW50aXR5SUQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZWplY3RlZFxyXG4gICAqIGlmIHRoZSBzYXZlIGZhaWxzIGFuZCBlcnJvcnMgYW5kIHRoZSBvdmVybGF5IHN0YXR1cyB3aWxsIGJlIHVwZGF0ZWRcclxuICAgKiBhY2NvcmRpbmdseVxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBhc3luYyBzYXZlVG9BcGkoKTogUHJvbWlzZTxudW1iZXIgfCB2b2lkPiB7IH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCBhZnRlciB0aGUgc2F2ZSBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cclxuICAgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGRlcml2ZWQgY2xhc3MgdG8gbmF2aWdhdGVcclxuICAgKiB0byBhIHByb3BlcnRpZXMvc3RhdHVzIHBhZ2Ugb3IgZW1pdCBhcHByb3ByaWF0ZWx5IGlmIHdpdGhpbiBhIGRpYWxvZ1xyXG4gICAqIEBwYXJhbSBlbnRpdHlJZCBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgb25TYXZlQ29tcGxldGUoZW50aXR5SWQ/OiBudW1iZXIpOiB2b2lkIHsgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHNhdmUuICBXZSB3aWxsIGZpcnN0IHRvdWNoIGFsbCBjb250cm9scyB0byBzaG93IHZhbGlkYXRpb24gbWVzc2FnZXNcclxuICAgKiBpZiB0aGUgZm9ybSBpcyBpbnZhbGlkLiAgSWYgdGhlIGZvcm0gaXMgdmFsaWQgd2Ugd2lsbCBhdHRlbXB0IHRvIHNhdmUgYW5kIGFueSBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZFxyXG4gICAqIGJhY2sgdG8gdGhlIHVzZXJcclxuICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIG9uU2F2ZShldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuU2F2aW5nKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5hcHBseU1vZGVsVXBkYXRlcygpO1xyXG4gICAgICAgIGxldCBlbnRpdHlJZCA9IGF3YWl0IHRoaXMuc2F2ZVRvQXBpKCkgfHwgLTE7XHJcblxyXG4gICAgICAgIHRoaXMuX2Vycm9ycyA9ICcnO1xyXG5cclxuICAgICAgICB0aGlzLm9uU2F2ZUNvbXBsZXRlKGVudGl0eUlkKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAvL2NsZWFyIHRoZSBcInNhdmluZ1wiIG92ZXJsYXkgYW5kIHNob3cgdGhlIG1lc3NhZ2UgYXQgdGhlIHRvcCBvZiB0aGUgdmlldyB0aHJvdWdoIHRoZSBlcnJvcnMgcHJvcGVydHlcclxuICAgICAgICB0aGlzLnNob3dFcnJvckJhbm5lcihlcnJvciwgdGhpcy5kZWZhdWx0VW5rbm93blNhdmVFcnJvcik7XHJcbiAgICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gT25seSBzaG93IHRoZSBiYW5uZXIgd2l0aCB0aGUgZ2VuZXJpYyBtZXNzYWdlIGlmIHRoZSBwYXJlbnQgY29tcG9uZW50IGhhc24ndCBhbHJlYWR5IHNldCBvbmVcclxuICAgICAgLy8gYnkgaW1wbGVtZW50aW5nIG9uU2F2ZSBmb3IgYWRkaXRpb25hbCB2YWxpZGF0aW9uXHJcbiAgICAgIGlmICh0aGlzLmVycm9ycyA9PT0gJycpIHtcclxuICAgICAgICB0aGlzLnNob3dFcnJvckJhbm5lcih0aGlzLmRlZmF1bHRJbnZhbGlkRm9ybU1lc3NhZ2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXJTZWxlY3Rvcikge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvSXRlbSh0aGlzLnNjcm9sbENvbnRhaW5lclNlbGVjdG9yISwgXCIubmctaW52YWxpZFwiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gdGhhdCB3aWxsIGxvZyBhbiBlcnJvciB0aGF0IGlzIHBhc3NlZCBpbiB0byB0aGUgY29uc29sZVxyXG4gICAqIEBwYXJhbSBlIFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBvbkVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xyXG4gICAgdGhpcy5lcnJvclNlcnZpY2UubG9nQ29uc29sZUVycm9yKGVycm9yKTtcclxuICAgIHRoaXMuc2hvd0Vycm9yT3ZlcmxheShlcnJvcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFuIGVycm9yIG1lc3NhZ2UgaW4gYSB3aG9sZS1wYWdlIG92ZXJsYXkuIFRoaXMgd2lsbCBwcmV2ZW50IGFueSBtb3JlXHJcbiAgICogaW50ZXJhY3Rpb25zIHdpdGggdGhlIHBhZ2UuIEl0IGNhbiB0YWtlIGEgc3RyaW5nIGVycm9yIG1lc3NhZ2Ugb3IgYSByYXcgQVBJXHJcbiAgICogZXJyb3IgdGhhdCBuZWVkcyB0byBiZSBwYXJzZWQuIElmIHRoZSBBUEkgZXJyb3IgaXNuJ3Qgc29tZXRoaW5nIHdlIGNhbiBoYW5kbGVcclxuICAgKiBhIGdlbmVyaWMgbWVzc2FnZSBpcyBzaG93biBpbnN0ZWFkXHJcbiAgICogQHBhcmFtIHsoRXJyb3IgfCBzdHJpbmcpfSBlcnJvclxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBzaG93RXJyb3JPdmVybGF5KGVycm9yOiBFcnJvciB8IHN0cmluZykge1xyXG4gICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpLnN1YnNjcmliZSgodHJhbnNsYXRlZE1lc3NhZ2U6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLnN0YXR1cy5zZXRTdGF0dXMoJ2Vycm9yJywgdHJhbnNsYXRlZE1lc3NhZ2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFuIGVycm9yIGluIHRoZSBiYW5uZXIgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuLiAgVGhpcyB3aWxsIG5vdCBwcm9kdWNlIGFcclxuICAgKiB3aG9sZS1wYWdlIG92ZXJsYXkgbGlrZSB0aGUgZnVuY3Rpb24gc2hvd0Vycm9yIHdpbGwuICBJdCBjYW4gdGFrZSBhIHN0cmluZyBlcnJvciBtZXNzYWdlXHJcbiAgICogb3IgcmF3IEFQSSBlcnJvciB0aGF0IG5lZWRzIHRvIGJlIHBhcnNlZC4gIElmIHRoZSBBUEkgZXJyb3IgaXNuJ3Qgc29tZXRoaW5nIHdlIGNhbiBoYW5kbGUsXHJcbiAgICogYSBnZW5lcmljIG1lc3NhZ2UgKGN1c3RvbWl6YWJsZSB2aWEgdW5rbm93bkVycm9yRGVmYXVsdCkgaXMgc2hvd24gaW5zdGVhZC5cclxuICAgKiBAcGFyYW0gZXJyb3IgXHJcbiAgICogQHBhcmFtIHVua25vd25FcnJvckRlZmF1bHQgXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIHNob3dFcnJvckJhbm5lcihlcnJvcjogRXJyb3IgfCBzdHJpbmcsIHVua25vd25FcnJvckRlZmF1bHQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yLCB1bmtub3duRXJyb3JEZWZhdWx0KS5zdWJzY3JpYmUoKHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5fZXJyb3JzID0gdHJhbnNsYXRlZE1lc3NhZ2U7XHJcbiAgICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRlZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhcnNlcyBhbmQgdHJhbnNsYXRlcyBhbiBBUEkgZXJyb3Igb3IgZXJyb3Igc3RyaW5nLlxyXG4gICAqIEBwYXJhbSBlIFxyXG4gICAqIEBwYXJhbSB1bmtub3duRXJyb3JEZWZhdWx0IFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBnZXRFcnJvck1lc3NhZ2UoZTogRXJyb3IgfCBzdHJpbmcsIHVua25vd25FcnJvckRlZmF1bHQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgbGV0IGV4dHJhY3RlZE1lc3NhZ2UgPSB0aGlzLmVycm9yU2VydmljZS5wYXJzZUFwaUVycm9yKGUsIHVua25vd25FcnJvckRlZmF1bHQpO1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoZXh0cmFjdGVkTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgZXJyb3JzIHRvIGhpZGUgdGhlIGVycm9ycyBiYW5uZXIuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGhpZGVFcnJvckJhbm5lcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Vycm9ycyA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHRoZSBkaXNwbGF5IHN0YXR1cyB0byBvdmVybGF5IHRoZSB3aG9sZSBwYWdlIHdoaWxlIGxvYWRpbmcgb3Igc2F2aW5nXHJcbiAgICogYW5kIGNsZWFyIGl0IHdoZW4gdGhlIGZvcm0gaXMgcmVhZHlcclxuICAgKiBAcHJvdGVjdGVkXHJcbiAgICogQHBhcmFtIHtQYWdlU3RhdHVzfSBzdGF0dXNcclxuICAgKiBAbWVtYmVyb2YgRm9ybUJhc2VDb21wb25lbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2hvd1N0YXR1cyhzdGF0dXM6IFBhZ2VTdGF0dXMpIHtcclxuICAgIGxldCBrbm93blN0YXR1cyA9IFBhZ2VTdGF0dXNlc1tzdGF0dXNdO1xyXG4gICAgaWYgKGtub3duU3RhdHVzKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cyhrbm93blN0YXR1cy5zdGF0dXMsIGtub3duU3RhdHVzLm1lc3NhZ2UsIHVuZGVmaW5lZCwga25vd25TdGF0dXMubm9EYXRhVGVtcGxhdGUsIGtub3duU3RhdHVzLm92ZXJsYXlDbGFzc0xpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxsb3dzIHRoZSBjb21wb25lbnQgdG8gZW50ZXIgYSBwZW5kaW5nIHN0YXR1cyBhbmQgZXhlY3V0ZSBhIGZ1bmN0aW9uIHRoYXQgb24gY29tcGxldGlvbiB3aWxsIHJldHVybiB0aGUgc3RhdHVzXHJcbiAgICogdG8gaGFzRGF0YS4gSWYgYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgY2FsbGJhY2sgYW4gZXJyb3IgYmFubmVyIGNhbiBiZSBzaG93bi5cclxuICAgKiBAcGFyYW0gY2FsbGJhY2tcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBhc3luYyBydW5CbG9ja2luZ0FjdGlvbihjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxhbnk+LCBwZW5kaW5nTWVzc2FnZT86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLmhpZGVFcnJvckJhbm5lcigpO1xyXG4gICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdwZW5kaW5nJywgcGVuZGluZ01lc3NhZ2UpO1xyXG5cclxuICAgIHJldHVybiBjYWxsYmFjaygpLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgdGhpcy5zaG93RXJyb3JCYW5uZXIoZXJyb3IpO1xyXG4gICAgICAvLyBUaHJvdyB0aGUgZXJyb3IgZm9yIGFueSBkb3duc3RyZWFtIGNvbXBvbmVudHMgdGhhdCBtYXkgYmUgbGlzdGVuaW5nIGFuZCBuZWVkIHRvIHJlYWN0XHJcbiAgICAgIC8vIHRvIGFueSBlcnJvcnMgaGFwcGVuaW5nIHdpdGhpbiB0aGlzIGNhbGxiYWNrXHJcbiAgICAgIHRocm93IChlcnJvcik7XHJcbiAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGVkKTtcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhcnNlcyB0aGUgcGFnZSBpbml0IHJlc3VsdCBhbmQgc2V0cyB0aGUgbmVjZXNzYXJ5IHByb3BlcnRpZXMgb24gdGhlIHBhZ2VcclxuICAgKiBAcGFyYW0gcmVzdWx0IFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VJbml0UmVzdWx0KHJlc3VsdDogUGFnZUluaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdFJlc3VsdCA9IHJlc3VsdDtcclxuICAgIHRoaXMudGl0bGUgPSByZXN1bHQudGl0bGU7XHJcbiAgICB0aGlzLnN1YlRpdGxlID0gcmVzdWx0LnN1YlRpdGxlO1xyXG4gICAgdGhpcy5zdWJUaXRsZVVybCA9IHJlc3VsdC5zdWJUaXRsZVVybDtcclxuICAgIHRoaXMuYnJlYWRjcnVtYnMgPSByZXN1bHQuYnJlYWRjcnVtYnM7XHJcbiAgICB0aGlzLmhlbHAgPSByZXN1bHQuaGVscDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdXAgdGhlIHJvdXRlciBldmVudCBzdWJzY3JpcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRVcFJvdXRlclN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubmF2aWdhdGlvbkVuZFN1YnNjcmlwdGlvbiAmJiAhdGhpcy5kZXN0cm95ZWQuY2xvc2VkKSB7XHJcbiAgICAgIC8vIFJlYWN0IHRvIG5hdmlnYXRpb24gZXZlbnRzXHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbkVuZFN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCksXHJcbiAgICAgICAgZmlsdGVyKGUgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICApLnN1YnNjcmliZShlID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25FbmQoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
export class PageTitleComponent {
|
|
3
|
-
}
|
|
4
|
-
PageTitleComponent.decorators = [
|
|
5
|
-
{ type: Component, args: [{
|
|
6
|
-
selector: 'app-page-title',
|
|
7
|
-
template: "<i *ngIf=\"titleIcon\"\r\n class=\"flex-shrink mr-1 my-1 ec-icon ec-icon-md {{titleIcon}}\"></i>\r\n<div class=\"text-truncate\">\r\n <h1 *ngIf=\"title\"\r\n class=\"text-title-1 mb-0 py-1 text-truncate\"\r\n title=\"{{title}}\">{{title}}</h1>\r\n <p *ngIf=\"subTitle && !subTitleUrl\"\r\n class=\"text-caption-1 mb-0 mt-n1 text-truncate\">{{subTitle}}</p>\r\n <a *ngIf=\"subTitle && subTitleUrl\"\r\n id=\"subTitle_link\"\r\n class=\"d-block text-truncate mb-0 mt-n1 font-size-small\"\r\n routerLink=\"{{subTitleUrl}}\"\r\n target=\"_self\">\r\n {{subTitle}}\r\n </a>\r\n</div>",
|
|
8
|
-
host: {
|
|
9
|
-
class: 'd-flex'
|
|
10
|
-
}
|
|
11
|
-
},] }
|
|
12
|
-
];
|
|
13
|
-
PageTitleComponent.propDecorators = {
|
|
14
|
-
title: [{ type: Input }],
|
|
15
|
-
titleIcon: [{ type: Input }],
|
|
16
|
-
subTitle: [{ type: Input }],
|
|
17
|
-
subTitleUrl: [{ type: Input }]
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS10aXRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL3BhZ2UvcGFnZS10aXRsZS9wYWdlLXRpdGxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVNqRCxNQUFNLE9BQU8sa0JBQWtCOzs7WUFQOUIsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLGtvQkFBMEM7Z0JBQzFDLElBQUksRUFBRTtvQkFDSixLQUFLLEVBQUUsUUFBUTtpQkFDaEI7YUFDRjs7O29CQUVFLEtBQUs7d0JBQ0wsS0FBSzt1QkFDTCxLQUFLOzBCQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1wYWdlLXRpdGxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS10aXRsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6ICdkLWZsZXgnXHJcbiAgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFnZVRpdGxlQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBwdWJsaWMgdGl0bGU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIHRpdGxlSWNvbj86IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgc3ViVGl0bGU/OiBzdHJpbmc7IFxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzdWJUaXRsZVVybD86IHN0cmluZzsgXHJcbn1cclxuIl19
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, TemplateRef } from '@angular/core';
|
|
2
|
-
import { Overlay } from '../../../display/view-overlay/view-overlay.component';
|
|
3
|
-
export class PageViewComponent {
|
|
4
|
-
constructor() {
|
|
5
|
-
/**
|
|
6
|
-
* Set to true when page-view is inside a dialog to adjust styles and hide breadcrumbs.
|
|
7
|
-
*/
|
|
8
|
-
this.isDialog = false;
|
|
9
|
-
/**
|
|
10
|
-
* Set to true to enable read only mode. Only a single secondary action will be available
|
|
11
|
-
*/
|
|
12
|
-
this.readonly = false;
|
|
13
|
-
/**
|
|
14
|
-
* Controls Overlay that masks the page view content. Only the header is not masked when the overlay is visible. Default is pending Overlay with no message
|
|
15
|
-
*/
|
|
16
|
-
this.status = new Overlay('pending');
|
|
17
|
-
/**
|
|
18
|
-
* Set to false to hide the entire header, including breadcrumbs and error banner. Default is true.
|
|
19
|
-
*/
|
|
20
|
-
this.showHeader = true;
|
|
21
|
-
/**
|
|
22
|
-
* Label for the actions dropdown in the header. Default is 'Actions'
|
|
23
|
-
*/
|
|
24
|
-
this.moreActionsLabel = 'Actions';
|
|
25
|
-
/**
|
|
26
|
-
* Label for the secondary button in the header. Default is 'Cancel'
|
|
27
|
-
*/
|
|
28
|
-
this.secondaryActionLabel = 'Cancel';
|
|
29
|
-
this.hideSecondaryAction = false;
|
|
30
|
-
/**
|
|
31
|
-
* Label for the primary button in the header. Default is 'Save'
|
|
32
|
-
*/
|
|
33
|
-
this.primaryActionLabel = 'Save';
|
|
34
|
-
this.hidePrimaryAction = false;
|
|
35
|
-
/**
|
|
36
|
-
* Pins the footer to the bottom of the view and overlays any overflowing content
|
|
37
|
-
*/
|
|
38
|
-
this.stickyFooter = true;
|
|
39
|
-
/**
|
|
40
|
-
* Prevents content from overflowing the view. Content must manage overflow instead.
|
|
41
|
-
*/
|
|
42
|
-
this.fitContent = false;
|
|
43
|
-
this.onPrimaryAction = new EventEmitter();
|
|
44
|
-
this.onSecondaryAction = new EventEmitter();
|
|
45
|
-
}
|
|
46
|
-
primaryAction(event) {
|
|
47
|
-
if (this.onPrimaryAction) {
|
|
48
|
-
this.onPrimaryAction.emit(event);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
secondaryAction(event) {
|
|
52
|
-
if (this.onSecondaryAction) {
|
|
53
|
-
this.onSecondaryAction.emit(event);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
PageViewComponent.decorators = [
|
|
58
|
-
{ type: Component, args: [{
|
|
59
|
-
selector: 'ec-page-view',
|
|
60
|
-
template: "<div ecOverlay\r\n [status]=\"status?.status\"\r\n [message]=\"status?.message\"\r\n [displayAsMask]=\"true\"\r\n class=\"bg-body flex-grow d-flex\">\r\n <div id=\"PageViewScrollContainer\" \r\n class=\"d-flex flex-column flex-grow scroll-y\" \r\n [class.is-dialog]=\"isDialog\"\r\n [class.fit-content]=\"fitContent\"\r\n [class.sticky-footer]=\"stickyFooter && !!footerTemplate\"\r\n [class.overlay-visible]=\"status?.status !== 'hasData'\"\r\n [class.footer-visible]=\"!!footerTemplate\">\r\n <section>\r\n <ng-content></ng-content> \r\n </section>\r\n \r\n <footer *ngIf=\"footerTemplate\">\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </footer>\r\n\r\n <header *ngIf=\"showHeader\">\r\n \r\n <ol id=\"breadcrumbs\"\r\n *ngIf=\"breadcrumbs?.length && !isDialog\">\r\n <li *ngFor=\"let crumb of breadcrumbs; last as isLast\">\r\n <a *ngIf=\"crumb.url; else label\"\r\n [routerLink]=\"crumb.url\">\r\n <ng-container *ngTemplateOutlet=\"label\"></ng-container>\r\n </a>\r\n <ng-template #label>{{crumb.label}}</ng-template>\r\n </li>\r\n </ol>\r\n \r\n <div *ngIf=\"!customHeaderTemplate; else customHeaderOutlet\" class=\"titlebar\">\r\n <app-page-title *ngIf=\"!customTitleTemplate; else customTitle\" \r\n [title]=\"title\"\r\n [subTitle]=\"subTitle\"\r\n [subTitleUrl]=\"subTitleUrl\"\r\n [titleIcon]=\"titleIcon\"\r\n class=\"title text-truncate\">\r\n </app-page-title>\r\n \r\n <ng-template #customTitle>\r\n <div class=\"title\">\r\n <ng-container *ngTemplateOutlet=\"customTitleTemplate\"></ng-container>\r\n </div>\r\n </ng-template>\r\n \r\n <div class=\"actions\">\r\n <ec-button id=\"primaryAction\"\r\n class=\"ml-2\"\r\n *ngIf=\"!hidePrimaryAction && onPrimaryAction.observers?.length && !readonly\"\r\n [disabled]=\"status?.status === 'pending'\"\r\n type=\"primary\"\r\n [label]=\"primaryActionLabel\"\r\n (clicked)=\"primaryAction($event)\">\r\n </ec-button>\r\n <ec-button id=\"secondaryAction\"\r\n class=\"ml-2\"\r\n *ngIf=\"!hideSecondaryAction && onSecondaryAction.observers?.length\"\r\n type=\"secondary\"\r\n [label]=\"readonly ? 'Close' : secondaryActionLabel\"\r\n (clicked)=\"secondaryAction($event)\">\r\n </ec-button>\r\n <ec-dropdown id=\"moreActions\"\r\n *ngIf=\"moreActions?.length && !readonly\"\r\n [disabled]=\"status?.status === 'pending'\"\r\n class=\"ml-2\"\r\n buttonType=\"secondary\"\r\n [label]=\"moreActionsLabel\"\r\n [items]=\"moreActions\">\r\n </ec-dropdown>\r\n <ng-container *ngTemplateOutlet=\"customActionsTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n \r\n <ng-template #customHeaderOutlet> \r\n <div class=\"page-header\">\r\n <ng-container *ngTemplateOutlet=\"customHeaderTemplate\"></ng-container>\r\n </div>\r\n </ng-template>\r\n \r\n <ec-banner *ngIf=\"errors\"\r\n id=\"pageViewErrors\"\r\n [class.border-bottom-0]=\"!isDialog\">\r\n <div [innerHtml]=\"errors\"></div>\r\n </ec-banner>\r\n </header>\r\n </div>\r\n</div>\r\n\r\n",
|
|
61
|
-
host: {
|
|
62
|
-
class: "flex-grow"
|
|
63
|
-
},
|
|
64
|
-
styles: [":host{display:flex;flex:1 1;min-height:0}header{background-color:var(--ec-background-color-body);flex:none;order:1;padding:1rem 1.5rem .5rem;position:sticky;top:0;z-index:1}ol{-ms-grid-column:1;-ms-grid-column-span:2;-ms-grid-row:1;-ms-grid-row-span:1;font-size:var(--ec-font-size-label);grid-column:1/3;grid-row:1/2;line-height:1rem;list-style:none;margin:0 0 .25rem;padding:0}ol li{display:inline}ol li:not(:last-child):after{color:var(--ec-color-secondary-dark);content:\" / \";display:inline}.titlebar{-ms-grid-columns:auto -webkit-max-content;-ms-grid-columns:auto max-content;-ms-grid-rows:-webkit-max-content -webkit-max-content;-ms-grid-rows:max-content max-content;display:-ms-grid;display:grid;gap:0 1rem;grid-template-columns:auto -webkit-max-content;grid-template-columns:auto max-content;grid-template-rows:-webkit-max-content -webkit-max-content;grid-template-rows:max-content max-content}.title{-ms-grid-column:1;-ms-grid-column-span:1;-ms-grid-row:2;-ms-grid-row-align:center;-ms-grid-row-span:1;align-self:center;grid-column:1/2;grid-row:2/3}.actions{-ms-grid-column:2;-ms-grid-column-span:1;-ms-grid-row:2;-ms-grid-row-span:1;direction:rtl;grid-column:2/3;grid-row:2/3}ec-banner{margin-top:1rem}section{flex:1 0 auto;min-height:0;order:2;padding:var(--ec-page-view-padding-section,.5rem 1.5rem 2rem)}footer{align-items:center;background-color:var(--ec-background-color-body);display:flex;flex:none;height:4.5rem;order:3;padding:0 1.5rem}.is-dialog header{padding:0}.is-dialog .titlebar{background-color:var(--ec-background-color);border-bottom:1px solid var(--ec-border-color);padding:1rem}.is-dialog ec-banner{margin:0}.is-dialog section{padding:var(--ec-page-view-padding-section,1rem 1rem 1.5rem)}.sticky-footer section{padding-bottom:4.5rem}.sticky-footer footer{bottom:0;position:sticky}.fit-content section{display:flex;flex:1 1}.footer-visible section{padding-bottom:0}.overlay-visible header{z-index:var(--ec-z-index-overlay)1}.overlay-visible ec-banner{display:none}"]
|
|
65
|
-
},] }
|
|
66
|
-
];
|
|
67
|
-
PageViewComponent.ctorParameters = () => [];
|
|
68
|
-
PageViewComponent.propDecorators = {
|
|
69
|
-
isDialog: [{ type: Input }],
|
|
70
|
-
readonly: [{ type: Input }],
|
|
71
|
-
status: [{ type: Input }],
|
|
72
|
-
showHeader: [{ type: Input }],
|
|
73
|
-
errors: [{ type: Input }],
|
|
74
|
-
breadcrumbs: [{ type: Input }],
|
|
75
|
-
title: [{ type: Input }],
|
|
76
|
-
titleIcon: [{ type: Input }],
|
|
77
|
-
subTitle: [{ type: Input }],
|
|
78
|
-
subTitleUrl: [{ type: Input }],
|
|
79
|
-
moreActionsLabel: [{ type: Input }],
|
|
80
|
-
moreActions: [{ type: Input }],
|
|
81
|
-
secondaryActionLabel: [{ type: Input }],
|
|
82
|
-
hideSecondaryAction: [{ type: Input }],
|
|
83
|
-
primaryActionLabel: [{ type: Input }],
|
|
84
|
-
hidePrimaryAction: [{ type: Input }],
|
|
85
|
-
customTitleTemplate: [{ type: Input }],
|
|
86
|
-
customActionsTemplate: [{ type: Input }],
|
|
87
|
-
customHeaderTemplate: [{ type: Input }],
|
|
88
|
-
footerTemplate: [{ type: Input }],
|
|
89
|
-
stickyFooter: [{ type: Input }],
|
|
90
|
-
fitContent: [{ type: Input }],
|
|
91
|
-
onPrimaryAction: [{ type: Output }],
|
|
92
|
-
onSecondaryAction: [{ type: Output }]
|
|
93
|
-
};
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLXZpZXcvcGFnZS12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBZSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdqRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFVL0UsTUFBTSxPQUFPLGlCQUFpQjtJQTZGNUI7UUE1RkE7O1dBRUc7UUFDYSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFDOztXQUVHO1FBQ2EsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQzs7V0FFRztRQUNhLFdBQU0sR0FBYSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUxRDs7V0FFRztRQUNhLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFvQjNDOztXQUVHO1FBQ2EscUJBQWdCLEdBQVksU0FBUyxDQUFDO1FBTXREOztXQUVHO1FBQ2EseUJBQW9CLEdBQVksUUFBUSxDQUFDO1FBQ3pDLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUU1Qzs7V0FFRztRQUNhLHVCQUFrQixHQUFZLE1BQU0sQ0FBQztRQUNyQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFzQjFDOztXQUVHO1FBQ2EsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFFcEM7O1dBRUc7UUFDYSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRWxCLG9CQUFlLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEQsc0JBQWlCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFFM0QsQ0FBQztJQUVWLGFBQWEsQ0FBQyxLQUFVO1FBQzdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsS0FBVTtRQUMvQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQzs7O1lBakhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsY0FBYztnQkFDeEIsMDNJQUF5QztnQkFFekMsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxXQUFXO2lCQUNuQjs7YUFDRjs7Ozt1QkFLRSxLQUFLO3VCQUtMLEtBQUs7cUJBS0wsS0FBSzt5QkFLTCxLQUFLO3FCQUtMLEtBQUs7MEJBS0wsS0FBSztvQkFLTCxLQUFLO3dCQUNMLEtBQUs7dUJBQ0wsS0FBSzswQkFDTCxLQUFLOytCQUtMLEtBQUs7MEJBSUwsS0FBSzttQ0FLTCxLQUFLO2tDQUNMLEtBQUs7aUNBS0wsS0FBSztnQ0FDTCxLQUFLO2tDQUtMLEtBQUs7b0NBS0wsS0FBSzttQ0FLTCxLQUFLOzZCQUtMLEtBQUs7MkJBS0wsS0FBSzt5QkFLTCxLQUFLOzhCQUVMLE1BQU07Z0NBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmF2SXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbnRyb2xzL25hdmlnYXRpb24vbmF2LWl0ZW0nO1xyXG5pbXBvcnQgeyBPdmVybGF5IH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS92aWV3LW92ZXJsYXkvdmlldy1vdmVybGF5LmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLXBhZ2UtdmlldycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2Utdmlldy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS12aWV3LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6IFwiZmxleC1ncm93XCJcclxuICB9XHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdlVmlld0NvbXBvbmVudCB7XHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIHRydWUgd2hlbiBwYWdlLXZpZXcgaXMgaW5zaWRlIGEgZGlhbG9nIHRvIGFkanVzdCBzdHlsZXMgYW5kIGhpZGUgYnJlYWRjcnVtYnMuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGlzRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0byB0cnVlIHRvIGVuYWJsZSByZWFkIG9ubHkgbW9kZS4gT25seSBhIHNpbmdsZSBzZWNvbmRhcnkgYWN0aW9uIHdpbGwgYmUgYXZhaWxhYmxlXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xzIE92ZXJsYXkgdGhhdCBtYXNrcyB0aGUgcGFnZSB2aWV3IGNvbnRlbnQuIE9ubHkgdGhlIGhlYWRlciBpcyBub3QgbWFza2VkIHdoZW4gdGhlIG92ZXJsYXkgaXMgdmlzaWJsZS4gRGVmYXVsdCBpcyBwZW5kaW5nIE92ZXJsYXkgd2l0aCBubyBtZXNzYWdlXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIHN0YXR1cz86IE92ZXJsYXkgPSBuZXcgT3ZlcmxheSgncGVuZGluZycpO1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdG8gZmFsc2UgdG8gaGlkZSB0aGUgZW50aXJlIGhlYWRlciwgaW5jbHVkaW5nIGJyZWFkY3J1bWJzIGFuZCBlcnJvciBiYW5uZXIuIERlZmF1bHQgaXMgdHJ1ZS5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3BsYXlzIGFuIGVycm9yIGJhbm5lciB1bmRlciB0aGUgdGl0bGViYXIgd2hlbiBwcm92aWRlZCBhIHZhbHVlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlcnJvcnM/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJyZWFkY3J1bWJzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBicmVhZGNydW1icz86IE5hdkl0ZW1bXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGl0bGUgc2V0dGluZ3MuIFBhc3NlZCB0byB0aGUgUGFnZVRpdGxlQ29tcG9uZW50LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0aXRsZT86IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgdGl0bGVJY29uPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzdWJUaXRsZT86IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgc3ViVGl0bGVVcmw/OiBzdHJpbmc7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogTGFiZWwgZm9yIHRoZSBhY3Rpb25zIGRyb3Bkb3duIGluIHRoZSBoZWFkZXIuIERlZmF1bHQgaXMgJ0FjdGlvbnMnXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG1vcmVBY3Rpb25zTGFiZWw/OiBzdHJpbmcgPSAnQWN0aW9ucyc7XHJcbiAgLyoqXHJcbiAgICogT3B0aW9ucyBmb3IgdGhlIGFjdGlvbnMgZHJvcGRvd24gaW4gdGhlIGhlYWRlci4gVGhlIGRyb3Bkb3duIGlzIGhpZGRlbiBpZiBub3Qgb3B0aW9ucyBhcmUgcHJvdmlkZWQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG1vcmVBY3Rpb25zPzogTWVudUl0ZW1bXTtcclxuXHJcbiAgLyoqXHJcbiAgICogTGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgYnV0dG9uIGluIHRoZSBoZWFkZXIuIERlZmF1bHQgaXMgJ0NhbmNlbCdcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2Vjb25kYXJ5QWN0aW9uTGFiZWw/OiBzdHJpbmcgPSAnQ2FuY2VsJztcclxuICBASW5wdXQoKSBwdWJsaWMgaGlkZVNlY29uZGFyeUFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBMYWJlbCBmb3IgdGhlIHByaW1hcnkgYnV0dG9uIGluIHRoZSBoZWFkZXIuIERlZmF1bHQgaXMgJ1NhdmUnXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIHByaW1hcnlBY3Rpb25MYWJlbD86IHN0cmluZyA9ICdTYXZlJztcclxuICBASW5wdXQoKSBwdWJsaWMgaGlkZVByaW1hcnlBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVwbGFjZXMgdGhlIHRpdGxlLCBzdWJ0aXRsZSBhbmQgdGl0bGUgaWNvblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21UaXRsZVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGRlZmF1bHQgYWN0aW9uc1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21BY3Rpb25zVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAvKipcclxuICAgKiBSZXBsYWNlcyB0aGUgdGl0bGViYXIgYW5kIGFjdGlvbnMgb2YgdGhlIGRlZmF1bHQgaGVhZGVyLiBCcmVhZGNydW1icyBhbmQgZXJyb3IgYmFubmVyIGFyZSBub3QgcmVwbGFjZWQuIENhbm5vdCBjb250YWluIGEgPGhlYWRlcj4gZWxlbWVudC5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tSGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAvKipcclxuICAgKiBDb250ZW50IHRvIGluY2x1ZGUgaW4gdGhlIGZvb3RlclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb290ZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBcclxuICAgKiBQaW5zIHRoZSBmb290ZXIgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdmlldyBhbmQgb3ZlcmxheXMgYW55IG92ZXJmbG93aW5nIGNvbnRlbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc3RpY2t5Rm9vdGVyID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJldmVudHMgY29udGVudCBmcm9tIG92ZXJmbG93aW5nIHRoZSB2aWV3LiBDb250ZW50IG11c3QgbWFuYWdlIG92ZXJmbG93IGluc3RlYWQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGZpdENvbnRlbnQgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBvblByaW1hcnlBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgb25TZWNvbmRhcnlBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBwdWJsaWMgcHJpbWFyeUFjdGlvbihldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5vblByaW1hcnlBY3Rpb24pIHtcclxuICAgICAgdGhpcy5vblByaW1hcnlBY3Rpb24uZW1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Vjb25kYXJ5QWN0aW9uKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm9uU2Vjb25kYXJ5QWN0aW9uKSB7XHJcbiAgICAgIHRoaXMub25TZWNvbmRhcnlBY3Rpb24uZW1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|