@impartner/design-components 1.0.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/LICENSE.txt +11 -0
- package/README.md +22 -0
- package/constants/fontawesome-icons.d.ts +6 -0
- package/constants/index.d.ts +1 -0
- package/esm2020/constants/fontawesome-icons.mjs +3012 -0
- package/esm2020/constants/index.mjs +2 -0
- package/esm2020/impartner-design-components.mjs +5 -0
- package/esm2020/lib/alert/alert.component.mjs +57 -0
- package/esm2020/lib/alert/alert.module.mjs +18 -0
- package/esm2020/lib/alert/index.mjs +4 -0
- package/esm2020/lib/alert/theme/alert-theme.mjs +2 -0
- package/esm2020/lib/alert/theme/index.mjs +2 -0
- package/esm2020/lib/avatar/avatar.component.mjs +47 -0
- package/esm2020/lib/avatar/avatar.module.mjs +18 -0
- package/esm2020/lib/avatar/index.mjs +3 -0
- package/esm2020/lib/avatar-group/avatar-group.component.mjs +16 -0
- package/esm2020/lib/avatar-group/avatar-group.module.mjs +19 -0
- package/esm2020/lib/avatar-group/index.mjs +3 -0
- package/esm2020/lib/backdrop/backdrop.component.mjs +34 -0
- package/esm2020/lib/backdrop/backdrop.module.mjs +19 -0
- package/esm2020/lib/backdrop/index.mjs +3 -0
- package/esm2020/lib/badge/badge.component.mjs +98 -0
- package/esm2020/lib/badge/badge.module.mjs +19 -0
- package/esm2020/lib/badge/index.mjs +4 -0
- package/esm2020/lib/badge/types/badge-icon.mjs +2 -0
- package/esm2020/lib/badge/types/badge-size.mjs +7 -0
- package/esm2020/lib/badge/types/index.mjs +2 -0
- package/esm2020/lib/branding/branded.directive.mjs +19 -0
- package/esm2020/lib/branding/branding.module.mjs +19 -0
- package/esm2020/lib/branding/index.mjs +3 -0
- package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +25 -0
- package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +33 -0
- package/esm2020/lib/breadcrumb/breadcrumb.module.mjs +19 -0
- package/esm2020/lib/breadcrumb/index.mjs +4 -0
- package/esm2020/lib/button/button.component.mjs +116 -0
- package/esm2020/lib/button/button.module.mjs +21 -0
- package/esm2020/lib/button/index.mjs +4 -0
- package/esm2020/lib/button/themes/button-theme.mjs +2 -0
- package/esm2020/lib/button/themes/index.mjs +2 -0
- package/esm2020/lib/button-group/button-group.component.mjs +52 -0
- package/esm2020/lib/button-group/button-group.module.mjs +20 -0
- package/esm2020/lib/button-group/index.mjs +3 -0
- package/esm2020/lib/card-heading/card-heading.component.mjs +30 -0
- package/esm2020/lib/card-heading/card-heading.module.mjs +19 -0
- package/esm2020/lib/card-heading/index.mjs +3 -0
- package/esm2020/lib/design-components.module.mjs +119 -0
- package/esm2020/lib/dropdown/components/dropdown-item/dropdown-item.component.mjs +22 -0
- package/esm2020/lib/dropdown/components/index.mjs +2 -0
- package/esm2020/lib/dropdown/dropdown.component.mjs +140 -0
- package/esm2020/lib/dropdown/dropdown.module.mjs +21 -0
- package/esm2020/lib/dropdown/index.mjs +5 -0
- package/esm2020/lib/dropdown/types/dropdown-position.mjs +2 -0
- package/esm2020/lib/dropdown/types/index.mjs +2 -0
- package/esm2020/lib/file-upload/directives/file-drop.directive.mjs +50 -0
- package/esm2020/lib/file-upload/directives/index.mjs +2 -0
- package/esm2020/lib/file-upload/file-upload.component.mjs +334 -0
- package/esm2020/lib/file-upload/file-upload.module.mjs +29 -0
- package/esm2020/lib/file-upload/index.mjs +5 -0
- package/esm2020/lib/file-upload/pipes/human-readable-byte-size.pipe.mjs +23 -0
- package/esm2020/lib/file-upload/pipes/index.mjs +2 -0
- package/esm2020/lib/form-field/controls/checkbox/checkbox.component.mjs +337 -0
- package/esm2020/lib/form-field/controls/checkbox/checkbox.module.mjs +19 -0
- package/esm2020/lib/form-field/controls/checkbox/index.mjs +3 -0
- package/esm2020/lib/form-field/controls/index.mjs +5 -0
- package/esm2020/lib/form-field/controls/input/index.mjs +2 -0
- package/esm2020/lib/form-field/controls/input/input.directive.mjs +233 -0
- package/esm2020/lib/form-field/controls/radio/index.mjs +6 -0
- package/esm2020/lib/form-field/controls/radio/injection-tokens.mjs +4 -0
- package/esm2020/lib/form-field/controls/radio/interfaces/index.mjs +4 -0
- package/esm2020/lib/form-field/controls/radio/interfaces/radio-button.interface.mjs +2 -0
- package/esm2020/lib/form-field/controls/radio/interfaces/radio-change-event.interface.mjs +11 -0
- package/esm2020/lib/form-field/controls/radio/interfaces/radio-group.interface.mjs +2 -0
- package/esm2020/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +260 -0
- package/esm2020/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +288 -0
- package/esm2020/lib/form-field/controls/radio/radio.module.mjs +20 -0
- package/esm2020/lib/form-field/controls/select/index.mjs +6 -0
- package/esm2020/lib/form-field/controls/select/option/index.mjs +2 -0
- package/esm2020/lib/form-field/controls/select/option/select-option.component.mjs +138 -0
- package/esm2020/lib/form-field/controls/select/option-parent.mjs +3 -0
- package/esm2020/lib/form-field/controls/select/select-model.mjs +149 -0
- package/esm2020/lib/form-field/controls/select/select.component.mjs +522 -0
- package/esm2020/lib/form-field/controls/select/select.module.mjs +20 -0
- package/esm2020/lib/form-field/controls/shared/index.mjs +2 -0
- package/esm2020/lib/form-field/controls/shared/toggle/components/index.mjs +2 -0
- package/esm2020/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +17 -0
- package/esm2020/lib/form-field/controls/shared/toggle/index.mjs +4 -0
- package/esm2020/lib/form-field/controls/shared/toggle/toggle.component.mjs +96 -0
- package/esm2020/lib/form-field/controls/shared/toggle/toggle.module.mjs +20 -0
- package/esm2020/lib/form-field/directives/corner-hint.directive.mjs +14 -0
- package/esm2020/lib/form-field/directives/error.directive.mjs +26 -0
- package/esm2020/lib/form-field/directives/form-root.directive.mjs +91 -0
- package/esm2020/lib/form-field/directives/hint.directive.mjs +24 -0
- package/esm2020/lib/form-field/directives/index.mjs +8 -0
- package/esm2020/lib/form-field/directives/label.directive.mjs +14 -0
- package/esm2020/lib/form-field/directives/prefix.directive.mjs +24 -0
- package/esm2020/lib/form-field/directives/suffix.directive.mjs +24 -0
- package/esm2020/lib/form-field/form-field-errors.mjs +5 -0
- package/esm2020/lib/form-field/form-field.component.mjs +132 -0
- package/esm2020/lib/form-field/impdc-forms.mjs +8 -0
- package/esm2020/lib/form-field/impdc-forms.module.mjs +68 -0
- package/esm2020/lib/form-field/index.mjs +2 -0
- package/esm2020/lib/form-field/services/error-state-matcher.service.mjs +28 -0
- package/esm2020/lib/form-field/services/index.mjs +3 -0
- package/esm2020/lib/form-field/services/unique-selection-dispatcher.service.mjs +48 -0
- package/esm2020/lib/form-field/shared/constructors.type.mjs +2 -0
- package/esm2020/lib/form-field/shared/disabled.mixin.mjs +15 -0
- package/esm2020/lib/form-field/shared/error-state.mixin.mjs +24 -0
- package/esm2020/lib/form-field/shared/form-field-control.mjs +10 -0
- package/esm2020/lib/form-field/shared/index.mjs +5 -0
- package/esm2020/lib/form-field/shared/tab-index.mixin.mjs +19 -0
- package/esm2020/lib/icon/icon.component.mjs +70 -0
- package/esm2020/lib/icon/icon.module.mjs +19 -0
- package/esm2020/lib/icon/index.mjs +3 -0
- package/esm2020/lib/index.mjs +26 -0
- package/esm2020/lib/modal/index.mjs +4 -0
- package/esm2020/lib/modal/modal.component.mjs +141 -0
- package/esm2020/lib/modal/modal.module.mjs +37 -0
- package/esm2020/lib/modal/types/index.mjs +3 -0
- package/esm2020/lib/modal/types/modal-component-sizes.mjs +9 -0
- package/esm2020/lib/modal/types/modal-theme.mjs +12 -0
- package/esm2020/lib/pagination/index.mjs +3 -0
- package/esm2020/lib/pagination/pagination.component.mjs +134 -0
- package/esm2020/lib/pagination/pagination.module.mjs +21 -0
- package/esm2020/lib/progress-bar/index.mjs +3 -0
- package/esm2020/lib/progress-bar/progress-bar.component.mjs +35 -0
- package/esm2020/lib/progress-bar/progress-bar.module.mjs +18 -0
- package/esm2020/lib/scrollable/index.mjs +3 -0
- package/esm2020/lib/scrollable/scrollable.component.mjs +193 -0
- package/esm2020/lib/scrollable/scrollable.module.mjs +21 -0
- package/esm2020/lib/select-icon/index.mjs +3 -0
- package/esm2020/lib/select-icon/select-icon.component.mjs +307 -0
- package/esm2020/lib/select-icon/select-icon.module.mjs +35 -0
- package/esm2020/lib/size-detection/directive/element-size.interface.mjs +2 -0
- package/esm2020/lib/size-detection/directive/index.mjs +3 -0
- package/esm2020/lib/size-detection/directive/size-detector.directive.mjs +43 -0
- package/esm2020/lib/size-detection/index.mjs +3 -0
- package/esm2020/lib/size-detection/size-detection.module.mjs +18 -0
- package/esm2020/lib/spinner/index.mjs +3 -0
- package/esm2020/lib/spinner/spinner.component.mjs +24 -0
- package/esm2020/lib/spinner/spinner.module.mjs +18 -0
- package/esm2020/lib/table/index.mjs +3 -0
- package/esm2020/lib/table/table.component.mjs +33 -0
- package/esm2020/lib/table/table.module.mjs +19 -0
- package/esm2020/lib/text-highlight/index.mjs +3 -0
- package/esm2020/lib/text-highlight/text-highlight.component.mjs +81 -0
- package/esm2020/lib/text-highlight/text-highlight.module.mjs +19 -0
- package/esm2020/public-api.mjs +9 -0
- package/esm2020/services/index.mjs +2 -0
- package/esm2020/services/interaction.service.mjs +54 -0
- package/esm2020/types/component-size.mjs +12 -0
- package/esm2020/types/component-theme.mjs +22 -0
- package/esm2020/types/index.mjs +3 -0
- package/esm2020/utilities/boolean-props.mjs +7 -0
- package/esm2020/utilities/dc.mjs +9 -0
- package/esm2020/utilities/index.mjs +6 -0
- package/esm2020/utilities/lc.mjs +9 -0
- package/esm2020/utilities/number-props.mjs +18 -0
- package/esm2020/utilities/sanitize.mjs +7 -0
- package/fesm2015/impartner-design-components.mjs +8295 -0
- package/fesm2015/impartner-design-components.mjs.map +1 -0
- package/fesm2020/impartner-design-components.mjs +8264 -0
- package/fesm2020/impartner-design-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/alert/alert.component.d.ts +29 -0
- package/lib/alert/alert.module.d.ts +8 -0
- package/lib/alert/index.d.ts +3 -0
- package/lib/alert/theme/alert-theme.d.ts +1 -0
- package/lib/alert/theme/index.d.ts +1 -0
- package/lib/avatar/avatar.component.d.ts +28 -0
- package/lib/avatar/avatar.module.d.ts +8 -0
- package/lib/avatar/index.d.ts +2 -0
- package/lib/avatar-group/avatar-group.component.d.ts +10 -0
- package/lib/avatar-group/avatar-group.module.d.ts +9 -0
- package/lib/avatar-group/index.d.ts +2 -0
- package/lib/backdrop/backdrop.component.d.ts +19 -0
- package/lib/backdrop/backdrop.module.d.ts +9 -0
- package/lib/backdrop/index.d.ts +2 -0
- package/lib/badge/badge.component.d.ts +48 -0
- package/lib/badge/badge.module.d.ts +9 -0
- package/lib/badge/index.d.ts +3 -0
- package/lib/badge/types/badge-icon.d.ts +1 -0
- package/lib/badge/types/badge-size.d.ts +6 -0
- package/lib/badge/types/index.d.ts +2 -0
- package/lib/branding/branded.directive.d.ts +6 -0
- package/lib/branding/branding.module.d.ts +9 -0
- package/lib/branding/index.d.ts +2 -0
- package/lib/breadcrumb/breadcrumb-item.component.d.ts +7 -0
- package/lib/breadcrumb/breadcrumb.component.d.ts +18 -0
- package/lib/breadcrumb/breadcrumb.module.d.ts +9 -0
- package/lib/breadcrumb/index.d.ts +3 -0
- package/lib/button/button.component.d.ts +47 -0
- package/lib/button/button.module.d.ts +11 -0
- package/lib/button/index.d.ts +3 -0
- package/lib/button/themes/button-theme.d.ts +1 -0
- package/lib/button/themes/index.d.ts +1 -0
- package/lib/button-group/button-group.component.d.ts +22 -0
- package/lib/button-group/button-group.module.d.ts +10 -0
- package/lib/button-group/index.d.ts +2 -0
- package/lib/card-heading/card-heading.component.d.ts +18 -0
- package/lib/card-heading/card-heading.module.d.ts +9 -0
- package/lib/card-heading/index.d.ts +2 -0
- package/lib/design-components.module.d.ts +22 -0
- package/lib/dropdown/components/dropdown-item/dropdown-item.component.d.ts +11 -0
- package/lib/dropdown/components/index.d.ts +1 -0
- package/lib/dropdown/dropdown.component.d.ts +65 -0
- package/lib/dropdown/dropdown.module.d.ts +11 -0
- package/lib/dropdown/index.d.ts +4 -0
- package/lib/dropdown/types/dropdown-position.d.ts +1 -0
- package/lib/dropdown/types/index.d.ts +1 -0
- package/lib/file-upload/directives/file-drop.directive.d.ts +11 -0
- package/lib/file-upload/directives/index.d.ts +1 -0
- package/lib/file-upload/file-upload.component.d.ts +105 -0
- package/lib/file-upload/file-upload.module.d.ts +13 -0
- package/lib/file-upload/index.d.ts +4 -0
- package/lib/file-upload/pipes/human-readable-byte-size.pipe.d.ts +7 -0
- package/lib/file-upload/pipes/index.d.ts +1 -0
- package/lib/form-field/controls/checkbox/checkbox.component.d.ts +133 -0
- package/lib/form-field/controls/checkbox/checkbox.module.d.ts +9 -0
- package/lib/form-field/controls/checkbox/index.d.ts +2 -0
- package/lib/form-field/controls/index.d.ts +4 -0
- package/lib/form-field/controls/input/index.d.ts +1 -0
- package/lib/form-field/controls/input/input.directive.d.ts +84 -0
- package/lib/form-field/controls/radio/index.d.ts +5 -0
- package/lib/form-field/controls/radio/injection-tokens.d.ts +4 -0
- package/lib/form-field/controls/radio/interfaces/index.d.ts +3 -0
- package/lib/form-field/controls/radio/interfaces/radio-button.interface.d.ts +6 -0
- package/lib/form-field/controls/radio/interfaces/radio-change-event.interface.d.ts +12 -0
- package/lib/form-field/controls/radio/interfaces/radio-group.interface.d.ts +13 -0
- package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +98 -0
- package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +104 -0
- package/lib/form-field/controls/radio/radio.module.d.ts +10 -0
- package/lib/form-field/controls/select/index.d.ts +5 -0
- package/lib/form-field/controls/select/option/index.d.ts +1 -0
- package/lib/form-field/controls/select/option/select-option.component.d.ts +60 -0
- package/lib/form-field/controls/select/option-parent.d.ts +5 -0
- package/lib/form-field/controls/select/select-model.d.ts +36 -0
- package/lib/form-field/controls/select/select.component.d.ts +170 -0
- package/lib/form-field/controls/select/select.module.d.ts +10 -0
- package/lib/form-field/controls/shared/index.d.ts +1 -0
- package/lib/form-field/controls/shared/toggle/components/index.d.ts +1 -0
- package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +6 -0
- package/lib/form-field/controls/shared/toggle/index.d.ts +3 -0
- package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +26 -0
- package/lib/form-field/controls/shared/toggle/toggle.module.d.ts +10 -0
- package/lib/form-field/directives/corner-hint.directive.d.ts +5 -0
- package/lib/form-field/directives/error.directive.d.ts +8 -0
- package/lib/form-field/directives/form-root.directive.d.ts +26 -0
- package/lib/form-field/directives/hint.directive.d.ts +6 -0
- package/lib/form-field/directives/index.d.ts +7 -0
- package/lib/form-field/directives/label.directive.d.ts +5 -0
- package/lib/form-field/directives/prefix.directive.d.ts +9 -0
- package/lib/form-field/directives/suffix.directive.d.ts +9 -0
- package/lib/form-field/form-field-errors.d.ts +2 -0
- package/lib/form-field/form-field.component.d.ts +39 -0
- package/lib/form-field/impdc-forms.d.ts +7 -0
- package/lib/form-field/impdc-forms.module.d.ts +19 -0
- package/lib/form-field/index.d.ts +1 -0
- package/lib/form-field/services/error-state-matcher.service.d.ts +12 -0
- package/lib/form-field/services/index.d.ts +2 -0
- package/lib/form-field/services/unique-selection-dispatcher.service.d.ts +29 -0
- package/lib/form-field/shared/constructors.type.d.ts +7 -0
- package/lib/form-field/shared/disabled.mixin.d.ts +10 -0
- package/lib/form-field/shared/error-state.mixin.d.ts +31 -0
- package/lib/form-field/shared/form-field-control.d.ts +24 -0
- package/lib/form-field/shared/index.d.ts +5 -0
- package/lib/form-field/shared/tab-index.mixin.d.ts +13 -0
- package/lib/icon/icon.component.d.ts +30 -0
- package/lib/icon/icon.module.d.ts +9 -0
- package/lib/icon/index.d.ts +2 -0
- package/lib/index.d.ts +25 -0
- package/lib/modal/index.d.ts +3 -0
- package/lib/modal/modal.component.d.ts +80 -0
- package/lib/modal/modal.module.d.ts +13 -0
- package/lib/modal/types/index.d.ts +2 -0
- package/lib/modal/types/modal-component-sizes.d.ts +3 -0
- package/lib/modal/types/modal-theme.d.ts +7 -0
- package/lib/pagination/index.d.ts +2 -0
- package/lib/pagination/pagination.component.d.ts +41 -0
- package/lib/pagination/pagination.module.d.ts +11 -0
- package/lib/progress-bar/index.d.ts +2 -0
- package/lib/progress-bar/progress-bar.component.d.ts +22 -0
- package/lib/progress-bar/progress-bar.module.d.ts +8 -0
- package/lib/scrollable/index.d.ts +2 -0
- package/lib/scrollable/scrollable.component.d.ts +39 -0
- package/lib/scrollable/scrollable.module.d.ts +11 -0
- package/lib/select-icon/index.d.ts +2 -0
- package/lib/select-icon/select-icon.component.d.ts +123 -0
- package/lib/select-icon/select-icon.module.d.ts +11 -0
- package/lib/size-detection/directive/element-size.interface.d.ts +4 -0
- package/lib/size-detection/directive/index.d.ts +2 -0
- package/lib/size-detection/directive/size-detector.directive.d.ts +14 -0
- package/lib/size-detection/index.d.ts +3 -0
- package/lib/size-detection/size-detection.module.d.ts +8 -0
- package/lib/spinner/index.d.ts +2 -0
- package/lib/spinner/spinner.component.d.ts +13 -0
- package/lib/spinner/spinner.module.d.ts +8 -0
- package/lib/table/index.d.ts +2 -0
- package/lib/table/table.component.d.ts +15 -0
- package/lib/table/table.module.d.ts +9 -0
- package/lib/text-highlight/index.d.ts +2 -0
- package/lib/text-highlight/text-highlight.component.d.ts +31 -0
- package/lib/text-highlight/text-highlight.module.d.ts +9 -0
- package/package.json +51 -0
- package/public-api.d.ts +4 -0
- package/services/index.d.ts +1 -0
- package/services/interaction.service.d.ts +14 -0
- package/types/component-size.d.ts +12 -0
- package/types/component-theme.d.ts +12 -0
- package/types/index.d.ts +2 -0
- package/utilities/boolean-props.d.ts +8 -0
- package/utilities/dc.d.ts +6 -0
- package/utilities/index.d.ts +5 -0
- package/utilities/lc.d.ts +6 -0
- package/utilities/number-props.d.ts +15 -0
- package/utilities/sanitize.d.ts +1 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, HostBinding, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "../size-detection/directive/size-detector.directive";
|
|
5
|
+
/**
|
|
6
|
+
* The `ScrollableComponent` (`<impdc-scrollable` or `<div impdc-scrollable`) is a container that hides items that wouldn't fit
|
|
7
|
+
* with arrows on the left and right to slide between them.
|
|
8
|
+
* To use, import `ScrollableModule` or another module that imports and exports that module from `@impartner/design-components`.
|
|
9
|
+
* `ScrollableModule` also imports and exports [BrandingModule](./?path=/docs/design-components-directives-impdcbranded).
|
|
10
|
+
*/
|
|
11
|
+
export class ScrollableComponent {
|
|
12
|
+
constructor(_cd) {
|
|
13
|
+
this._cd = _cd;
|
|
14
|
+
/**
|
|
15
|
+
* The base amount to scroll.
|
|
16
|
+
*/
|
|
17
|
+
this.scrollUnit = 20;
|
|
18
|
+
/**
|
|
19
|
+
* Used in combination with `scrollUnit` to determine how far the Scrollable scrolls when directional arrows are clicked.
|
|
20
|
+
*/
|
|
21
|
+
this.clickScrollMultiplier = 5;
|
|
22
|
+
this._scrollableBgColor = null;
|
|
23
|
+
this._width = 0;
|
|
24
|
+
}
|
|
25
|
+
get canScrollLeft() {
|
|
26
|
+
if (!this._contentElement) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return Math.floor(this._contentElement.scrollLeft) > 0;
|
|
30
|
+
}
|
|
31
|
+
get canScrollRight() {
|
|
32
|
+
if (!this._contentElement) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return (Math.ceil(this._contentElement.scrollLeft + this._width) <
|
|
36
|
+
this._contentElement.scrollWidth);
|
|
37
|
+
}
|
|
38
|
+
get _containerElement() {
|
|
39
|
+
if (!this.containerRef) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return this.containerRef.nativeElement;
|
|
43
|
+
}
|
|
44
|
+
get _contentElement() {
|
|
45
|
+
if (!this.contentRef) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return this.contentRef.nativeElement;
|
|
49
|
+
}
|
|
50
|
+
ngOnChanges(changes) {
|
|
51
|
+
if (changes['scrollUnit'] || changes['clickScrollMultiplier']) {
|
|
52
|
+
if (this._containerElement) {
|
|
53
|
+
this._width = this._containerElement?.clientWidth;
|
|
54
|
+
this._cd.detectChanges();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
this._getBackgroundColorForButtons();
|
|
58
|
+
}
|
|
59
|
+
ngAfterViewInit() {
|
|
60
|
+
this._width = this.contentRef?.nativeElement.width;
|
|
61
|
+
this._getBackgroundColorForButtons();
|
|
62
|
+
this._cd.detectChanges();
|
|
63
|
+
}
|
|
64
|
+
async scroll(direction) {
|
|
65
|
+
if (!this._contentElement) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
let pixels = direction * this.scrollUnit * this.clickScrollMultiplier;
|
|
69
|
+
let position = 0;
|
|
70
|
+
if (!pixels) {
|
|
71
|
+
if (direction === 1) {
|
|
72
|
+
position = this._contentElement.scrollWidth;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
position = this._contentElement.scrollLeft + pixels;
|
|
77
|
+
}
|
|
78
|
+
await this._scrollToPosition(this._contentElement, position);
|
|
79
|
+
this._cd.detectChanges();
|
|
80
|
+
}
|
|
81
|
+
widthChanged(elementSize) {
|
|
82
|
+
if (!elementSize || !elementSize.width) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this._width = elementSize.width;
|
|
86
|
+
this._cd.detectChanges();
|
|
87
|
+
}
|
|
88
|
+
async _scrollToPosition(container, position) {
|
|
89
|
+
position = Math.round(position);
|
|
90
|
+
if (container.scrollLeft === position) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
let resolveFn;
|
|
94
|
+
let scrollListener;
|
|
95
|
+
let timeoutId;
|
|
96
|
+
const promise = new Promise(resolve => {
|
|
97
|
+
resolveFn = resolve;
|
|
98
|
+
});
|
|
99
|
+
const finished = () => {
|
|
100
|
+
container.removeEventListener('scroll', scrollListener);
|
|
101
|
+
resolveFn(null);
|
|
102
|
+
};
|
|
103
|
+
scrollListener = () => {
|
|
104
|
+
clearTimeout(timeoutId);
|
|
105
|
+
// scroll is finished when either the position has been reached, or 100ms have elapsed since the last scroll event
|
|
106
|
+
if (container.scrollLeft === position) {
|
|
107
|
+
finished();
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
timeoutId = setTimeout(finished, 100);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
container.addEventListener('scroll', scrollListener);
|
|
114
|
+
container.scrollTo({
|
|
115
|
+
left: position,
|
|
116
|
+
behavior: 'smooth'
|
|
117
|
+
});
|
|
118
|
+
return promise;
|
|
119
|
+
}
|
|
120
|
+
_getBackgroundColorForButtons() {
|
|
121
|
+
if (!this.contentRef) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const projectedElementCollection = this.contentRef.nativeElement.children;
|
|
125
|
+
if (!projectedElementCollection || !projectedElementCollection.length) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const firstElement = projectedElementCollection[0];
|
|
129
|
+
let backgroundColor = this._getBackGroundColor(firstElement);
|
|
130
|
+
if (!backgroundColor) {
|
|
131
|
+
backgroundColor = this._getAncestorBackgroundColor();
|
|
132
|
+
}
|
|
133
|
+
this._scrollableBgColor = backgroundColor;
|
|
134
|
+
}
|
|
135
|
+
_getAncestorBackgroundColor() {
|
|
136
|
+
if (!this.contentRef) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
let result = {
|
|
140
|
+
parent: this.contentRef.nativeElement.parentElement,
|
|
141
|
+
backgroundColor: null
|
|
142
|
+
};
|
|
143
|
+
let count = 6;
|
|
144
|
+
function getParentBackgroundColor(currentContext, getBackgroundColor) {
|
|
145
|
+
const result = { parent: null, backgroundColor: null };
|
|
146
|
+
if (currentContext && currentContext.parent) {
|
|
147
|
+
result.backgroundColor = getBackgroundColor(currentContext.parent);
|
|
148
|
+
if (!result.backgroundColor) {
|
|
149
|
+
result.parent = currentContext.parent.parentElement;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
while (count > 0) {
|
|
155
|
+
if (result.backgroundColor) {
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
result = getParentBackgroundColor(result, this._getBackGroundColor);
|
|
159
|
+
if (!result.parent) {
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
count = count - 1;
|
|
163
|
+
}
|
|
164
|
+
return result.backgroundColor;
|
|
165
|
+
}
|
|
166
|
+
_getBackGroundColor(element) {
|
|
167
|
+
const computedBackgroundColor = getComputedStyle(element)['backgroundColor'];
|
|
168
|
+
if (computedBackgroundColor !== 'rgba(0, 0, 0, 0)') {
|
|
169
|
+
return computedBackgroundColor;
|
|
170
|
+
}
|
|
171
|
+
return element.style.backgroundColor;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
ScrollableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
175
|
+
ScrollableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ScrollableComponent, selector: "impdc-scrollable, div[impdc-scrollable]", inputs: { scrollUnit: "scrollUnit", clickScrollMultiplier: "clickScrollMultiplier" }, host: { properties: { "style.--impdc-scrollable-bg": "this._scrollableBgColor" } }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }, { propertyName: "contentRef", first: true, predicate: ["content"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"impdc-scrollable\"\n #container\n impdcSizeDetector\n (resized)=\"widthChanged($event)\">\n <a class=\"impdc-scrollable-left\" (click)=\"scroll(-1)\" *ngIf=\"canScrollLeft\">\n <i class=\"fas fa-chevron-left default\"></i>\n </a>\n <div #content class=\"content-container\">\n <ng-content></ng-content>\n </div>\n <a class=\"impdc-scrollable-right\" (click)=\"scroll(1)\" *ngIf=\"canScrollRight\">\n <i class=\"fas fa-chevron-right default\"></i>\n </a>\n</div>\n", styles: [".impdc-scrollable{position:relative;overflow-y:hidden}.impdc-scrollable .impdc-scrollable-base,.impdc-scrollable .impdc-scrollable-right,.impdc-scrollable .impdc-scrollable-left{position:absolute;top:0px;bottom:0px;display:flex;align-items:center;text-align:center;width:6.9rem;z-index:1;color:var(--impd-color-motion-blue-600, #01606d)}.impdc-scrollable .impdc-scrollable-left{justify-content:left;padding-left:1.5rem;background-image:linear-gradient(to right,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .impdc-scrollable-right{right:0;padding-right:1.5rem;justify-content:right;background-image:linear-gradient(to left,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .content-container{overflow-x:hidden;-webkit-overflow-scrolling:touch;white-space:nowrap}:host(.branded) .impdc-scrollable .impdc-scrollable-left,:host(.branded) .impdc-scrollable .impdc-scrollable-right{color:var(--px-primary-color, var(--impd-color-motion-blue-600, #01606d))}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.SizeDetectorDirective, selector: "[impdcSizeDetector]", outputs: ["resized"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
176
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableComponent, decorators: [{
|
|
177
|
+
type: Component,
|
|
178
|
+
args: [{ selector: 'impdc-scrollable, div[impdc-scrollable]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"impdc-scrollable\"\n #container\n impdcSizeDetector\n (resized)=\"widthChanged($event)\">\n <a class=\"impdc-scrollable-left\" (click)=\"scroll(-1)\" *ngIf=\"canScrollLeft\">\n <i class=\"fas fa-chevron-left default\"></i>\n </a>\n <div #content class=\"content-container\">\n <ng-content></ng-content>\n </div>\n <a class=\"impdc-scrollable-right\" (click)=\"scroll(1)\" *ngIf=\"canScrollRight\">\n <i class=\"fas fa-chevron-right default\"></i>\n </a>\n</div>\n", styles: [".impdc-scrollable{position:relative;overflow-y:hidden}.impdc-scrollable .impdc-scrollable-base,.impdc-scrollable .impdc-scrollable-right,.impdc-scrollable .impdc-scrollable-left{position:absolute;top:0px;bottom:0px;display:flex;align-items:center;text-align:center;width:6.9rem;z-index:1;color:var(--impd-color-motion-blue-600, #01606d)}.impdc-scrollable .impdc-scrollable-left{justify-content:left;padding-left:1.5rem;background-image:linear-gradient(to right,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .impdc-scrollable-right{right:0;padding-right:1.5rem;justify-content:right;background-image:linear-gradient(to left,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .content-container{overflow-x:hidden;-webkit-overflow-scrolling:touch;white-space:nowrap}:host(.branded) .impdc-scrollable .impdc-scrollable-left,:host(.branded) .impdc-scrollable .impdc-scrollable-right{color:var(--px-primary-color, var(--impd-color-motion-blue-600, #01606d))}\n"] }]
|
|
179
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { scrollUnit: [{
|
|
180
|
+
type: Input
|
|
181
|
+
}], clickScrollMultiplier: [{
|
|
182
|
+
type: Input
|
|
183
|
+
}], _scrollableBgColor: [{
|
|
184
|
+
type: HostBinding,
|
|
185
|
+
args: ['style.--impdc-scrollable-bg']
|
|
186
|
+
}], containerRef: [{
|
|
187
|
+
type: ViewChild,
|
|
188
|
+
args: ['container', { static: false }]
|
|
189
|
+
}], contentRef: [{
|
|
190
|
+
type: ViewChild,
|
|
191
|
+
args: ['content', { static: false }]
|
|
192
|
+
}] } });
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxXQUFXLEVBQ1gsS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQzs7OztBQUd2Qjs7Ozs7R0FLRztBQU9ILE1BQU0sT0FBTyxtQkFBbUI7SUEyRDlCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBMUQxQzs7V0FFRztRQUVJLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFFL0I7O1dBRUc7UUFFSSwwQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFHekIsdUJBQWtCLEdBQWtCLElBQUksQ0FBQztRQXFCekMsV0FBTSxHQUFXLENBQUMsQ0FBQztJQXdCa0IsQ0FBQztJQTNDOUMsSUFBVyxhQUFhO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELElBQVcsY0FBYztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxDQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcs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QyxpQkFBaUIsQ0FBQyxDQUFDO1FBRS9DLElBQUksdUJBQXVCLEtBQUssa0JBQWtCLEVBQUU7WUFDbEQsT0FBTyx1QkFBdUIsQ0FBQztTQUNoQztRQUVELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7SUFDdkMsQ0FBQzs7aUhBbE9VLG1CQUFtQjtxR0FBbkIsbUJBQW1CLGlkQzFCaEMsbWZBZUE7NEZEV2EsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLHlDQUF5QyxtQkFHbEMsdUJBQXVCLENBQUMsTUFBTTt3R0FPeEMsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxxQkFBcUI7c0JBRDNCLEtBQUs7Z0JBSUUsa0JBQWtCO3NCQUR6QixXQUFXO3VCQUFDLDZCQUE2QjtnQkF5Qm5DLFlBQVk7c0JBRGxCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFZbEMsVUFBVTtzQkFEaEIsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJRWxlbWVudFNpemUgfSBmcm9tICcuLi9zaXplLWRldGVjdGlvbic7XG5cbi8qKlxuICogVGhlIGBTY3JvbGxhYmxlQ29tcG9uZW50YCAoYDxpbXBkYy1zY3JvbGxhYmxlYCBvciBgPGRpdiBpbXBkYy1zY3JvbGxhYmxlYCkgaXMgYSBjb250YWluZXIgdGhhdCBoaWRlcyBpdGVtcyB0aGF0IHdvdWxkbid0IGZpdFxuICogd2l0aCBhcnJvd3Mgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHRvIHNsaWRlIGJldHdlZW4gdGhlbS5cbiAqIFRvIHVzZSwgaW1wb3J0IGBTY3JvbGxhYmxlTW9kdWxlYCBvciBhbm90aGVyIG1vZHVsZSB0aGF0IGltcG9ydHMgYW5kIGV4cG9ydHMgdGhhdCBtb2R1bGUgZnJvbSBgQGltcGFydG5lci9kZXNpZ24tY29tcG9uZW50c2AuXG4gKiBgU2Nyb2xsYWJsZU1vZHVsZWAgYWxzbyBpbXBvcnRzIGFuZCBleHBvcnRzIFtCcmFuZGluZ01vZHVsZV0oLi8/cGF0aD0vZG9jcy9kZXNpZ24tY29tcG9uZW50cy1kaXJlY3RpdmVzLWltcGRjYnJhbmRlZCkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXNjcm9sbGFibGUsIGRpdltpbXBkYy1zY3JvbGxhYmxlXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY3JvbGxhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2Nyb2xsYWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTY3JvbGxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIGFtb3VudCB0byBzY3JvbGwuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2Nyb2xsVW5pdDogbnVtYmVyID0gMjA7XG5cbiAgLyoqXG4gICAqIFVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgc2Nyb2xsVW5pdGAgdG8gZGV0ZXJtaW5lIGhvdyBmYXIgdGhlIFNjcm9sbGFibGUgc2Nyb2xscyB3aGVuIGRpcmVjdGlvbmFsIGFycm93cyBhcmUgY2xpY2tlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjbGlja1Njcm9sbE11bHRpcGxpZXIgPSA1O1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuLS1pbXBkYy1zY3JvbGxhYmxlLWJnJylcbiAgcHJpdmF0ZSBfc2Nyb2xsYWJsZUJnQ29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBnZXQgY2FuU2Nyb2xsTGVmdCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5fY29udGVudEVsZW1lbnQuc2Nyb2xsTGVmdCkgPiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBjYW5TY3JvbGxSaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIE1hdGguY2VpbCh0aGlzLl9jb250ZW50RWxlbWVudC5zY3JvbGxMZWZ0ICsgdGhpcy5fd2lkdGgpIDxcbiAgICAgIHRoaXMuX2NvbnRlbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3dpZHRoOiBudW1iZXIgPSAwO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgY29udGFpbmVyUmVmOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgZ2V0IF9jb250YWluZXJFbGVtZW50KCk6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lclJlZikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBAVmlld0NoaWxkKCdjb250ZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHB1YmxpYyBjb250ZW50UmVmOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgZ2V0IF9jb250ZW50RWxlbWVudCgpOiBIVE1MRGl2RWxlbWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb250ZW50UmVmKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc2Nyb2xsVW5pdCddIHx8IGNoYW5nZXNbJ2NsaWNrU2Nyb2xsTXVsdGlwbGllciddKSB7XG4gICAgICBpZiAodGhpcy5fY29udGFpbmVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLl93aWR0aCA9IHRoaXMuX2NvbnRhaW5lckVsZW1lbnQ/LmNsaWVudFdpZHRoO1xuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2dldEJhY2tncm91bmRDb2xvckZvckJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fd2lkdGggPSB0aGlzLmNvbnRlbnRSZWY/Lm5hdGl2ZUVsZW1lbnQud2lkdGg7XG4gICAgdGhpcy5fZ2V0QmFja2dyb3VuZENvbG9yRm9yQnV0dG9ucygpO1xuICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzY3JvbGwoZGlyZWN0aW9uOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBpeGVscyA9IGRpcmVjdGlvbiAqIHRoaXMuc2Nyb2xsVW5pdCAqIHRoaXMuY2xpY2tTY3JvbGxNdWx0aXBsaWVyO1xuICAgIGxldCBwb3NpdGlvbiA9IDA7XG5cbiAgICBpZiAoIXBpeGVscykge1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gMSkge1xuICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2NvbnRlbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvbiA9IHRoaXMuX2NvbnRlbnRFbGVtZW50LnNjcm9sbExlZnQgKyBwaXhlbHM7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5fc2Nyb2xsVG9Qb3NpdGlvbih0aGlzLl9jb250ZW50RWxlbWVudCwgcG9zaXRpb24pO1xuXG4gICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIHdpZHRoQ2hhbmdlZChlbGVtZW50U2l6ZTogSUVsZW1lbnRTaXplKTogdm9pZCB7XG4gICAgaWYgKCFlbGVtZW50U2l6ZSB8fCAhZWxlbWVudFNpemUud2lkdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fd2lkdGggPSBlbGVtZW50U2l6ZS53aWR0aDtcbiAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9zY3JvbGxUb1Bvc2l0aW9uKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBwb3NpdGlvbiA9IE1hdGgucm91bmQocG9zaXRpb24pO1xuXG4gICAgaWYgKGNvbnRhaW5lci5zY3JvbGxMZWZ0ID09PSBwb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlRm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZDtcbiAgICBsZXQgc2Nyb2xsTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gICAgbGV0IHRpbWVvdXRJZDogYW55O1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgcmVzb2x2ZUZuID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbExpc3RlbmVyKTtcbiAgICAgIHJlc29sdmVGbihudWxsKTtcbiAgICB9O1xuXG4gICAgc2Nyb2xsTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgLy8gc2Nyb2xsIGlzIGZpbmlzaGVkIHdoZW4gZWl0aGVyIHRoZSBwb3NpdGlvbiBoYXMgYmVlbiByZWFjaGVkLCBvciAxMDBtcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3Qgc2Nyb2xsIGV2ZW50XG4gICAgICBpZiAoY29udGFpbmVyLnNjcm9sbExlZnQgPT09IHBvc2l0aW9uKSB7XG4gICAgICAgIGZpbmlzaGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZpbmlzaGVkLCAxMDApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsTGlzdGVuZXIpO1xuXG4gICAgY29udGFpbmVyLnNjcm9sbFRvKHtcbiAgICAgIGxlZnQ6IHBvc2l0aW9uLFxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEJhY2tncm91bmRDb2xvckZvckJ1dHRvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ZWRFbGVtZW50Q29sbGVjdGlvbjogSFRNTENvbGxlY3Rpb24gPVxuICAgICAgdGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XG5cbiAgICBpZiAoIXByb2plY3RlZEVsZW1lbnRDb2xsZWN0aW9uIHx8ICFwcm9qZWN0ZWRFbGVtZW50Q29sbGVjdGlvbi5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSBwcm9qZWN0ZWRFbGVtZW50Q29sbGVjdGlvblswXSBhcyBIVE1MRWxlbWVudDtcbiAgICBsZXQgYmFja2dyb3VuZENvbG9yOiBzdHJpbmcgfCBudWxsID0gdGhpcy5fZ2V0QmFja0dyb3VuZENvbG9yKGZpcnN0RWxlbWVudCk7XG5cbiAgICBpZiAoIWJhY2tncm91bmRDb2xvcikge1xuICAgICAgYmFja2dyb3VuZENvbG9yID0gdGhpcy5fZ2V0QW5jZXN0b3JCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zY3JvbGxhYmxlQmdDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEFuY2VzdG9yQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb250ZW50UmVmKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0eXBlIHBhcmVudEJnUmVzdWx0ID0ge1xuICAgICAgcGFyZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyB8IG51bGw7XG4gICAgfTtcblxuICAgIGxldCByZXN1bHQ6IHBhcmVudEJnUmVzdWx0ID0ge1xuICAgICAgcGFyZW50OiAodGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG51bGxcbiAgICB9O1xuXG4gICAgbGV0IGNvdW50ID0gNjtcblxuICAgIGZ1bmN0aW9uIGdldFBhcmVudEJhY2tncm91bmRDb2xvcihcbiAgICAgIGN1cnJlbnRDb250ZXh0OiBwYXJlbnRCZ1Jlc3VsdCxcbiAgICAgIGdldEJhY2tncm91bmRDb2xvcjogKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBzdHJpbmcgfCBudWxsXG4gICAgKTogcGFyZW50QmdSZXN1bHQge1xuICAgICAgY29uc3QgcmVzdWx0OiBwYXJlbnRCZ1Jlc3VsdCA9IHsgcGFyZW50OiBudWxsLCBiYWNrZ3JvdW5kQ29sb3I6IG51bGwgfTtcbiAgICAgIGlmIChjdXJyZW50Q29udGV4dCAmJiBjdXJyZW50Q29udGV4dC5wYXJlbnQpIHtcbiAgICAgICAgcmVzdWx0LmJhY2tncm91bmRDb2xvciA9IGdldEJhY2tncm91bmRDb2xvcihjdXJyZW50Q29udGV4dC5wYXJlbnQpO1xuXG4gICAgICAgIGlmICghcmVzdWx0LmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBjdXJyZW50Q29udGV4dC5wYXJlbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHdoaWxlIChjb3VudCA+IDApIHtcbiAgICAgIGlmIChyZXN1bHQuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gZ2V0UGFyZW50QmFja2dyb3VuZENvbG9yKHJlc3VsdCwgdGhpcy5fZ2V0QmFja0dyb3VuZENvbG9yKTtcblxuICAgICAgaWYgKCFyZXN1bHQucGFyZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY291bnQgPSBjb3VudCAtIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5iYWNrZ3JvdW5kQ29sb3I7XG4gIH1cblxuICBwcml2YXRlIF9nZXRCYWNrR3JvdW5kQ29sb3IoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb21wdXRlZEJhY2tncm91bmRDb2xvciA9XG4gICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpWydiYWNrZ3JvdW5kQ29sb3InXTtcblxuICAgIGlmIChjb21wdXRlZEJhY2tncm91bmRDb2xvciAhPT0gJ3JnYmEoMCwgMCwgMCwgMCknKSB7XG4gICAgICByZXR1cm4gY29tcHV0ZWRCYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiaW1wZGMtc2Nyb2xsYWJsZVwiXG4gICNjb250YWluZXJcbiAgaW1wZGNTaXplRGV0ZWN0b3JcbiAgKHJlc2l6ZWQpPVwid2lkdGhDaGFuZ2VkKCRldmVudClcIj5cbiAgPGEgY2xhc3M9XCJpbXBkYy1zY3JvbGxhYmxlLWxlZnRcIiAoY2xpY2spPVwic2Nyb2xsKC0xKVwiICpuZ0lmPVwiY2FuU2Nyb2xsTGVmdFwiPlxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCBkZWZhdWx0XCI+PC9pPlxuICA8L2E+XG4gIDxkaXYgI2NvbnRlbnQgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lclwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG4gIDxhIGNsYXNzPVwiaW1wZGMtc2Nyb2xsYWJsZS1yaWdodFwiIChjbGljayk9XCJzY3JvbGwoMSlcIiAqbmdJZj1cImNhblNjcm9sbFJpZ2h0XCI+XG4gICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBkZWZhdWx0XCI+PC9pPlxuICA8L2E+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { BrandingModule } from '../branding';
|
|
4
|
+
import { SizeDetectionModule } from '../size-detection';
|
|
5
|
+
import { ScrollableComponent } from './scrollable.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class ScrollableModule {
|
|
8
|
+
constructor() { }
|
|
9
|
+
}
|
|
10
|
+
ScrollableModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
11
|
+
ScrollableModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: ScrollableModule, declarations: [ScrollableComponent], imports: [CommonModule, SizeDetectionModule, BrandingModule], exports: [ScrollableComponent, BrandingModule] });
|
|
12
|
+
ScrollableModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableModule, imports: [CommonModule, SizeDetectionModule, BrandingModule, BrandingModule] });
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableModule, decorators: [{
|
|
14
|
+
type: NgModule,
|
|
15
|
+
args: [{
|
|
16
|
+
imports: [CommonModule, SizeDetectionModule, BrandingModule],
|
|
17
|
+
declarations: [ScrollableComponent],
|
|
18
|
+
exports: [ScrollableComponent, BrandingModule]
|
|
19
|
+
}]
|
|
20
|
+
}], ctorParameters: function () { return []; } });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFPN0QsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixnQkFBZSxDQUFDOzs4R0FETCxnQkFBZ0I7K0dBQWhCLGdCQUFnQixpQkFIWixtQkFBbUIsYUFEeEIsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGNBQWMsYUFFakQsbUJBQW1CLEVBQUUsY0FBYzsrR0FFbEMsZ0JBQWdCLFlBSmpCLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBRTVCLGNBQWM7NEZBRWxDLGdCQUFnQjtrQkFMNUIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO29CQUM1RCxZQUFZLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDbkMsT0FBTyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnJhbmRpbmdNb2R1bGUgfSBmcm9tICcuLi9icmFuZGluZyc7XG5pbXBvcnQgeyBTaXplRGV0ZWN0aW9uTW9kdWxlIH0gZnJvbSAnLi4vc2l6ZS1kZXRlY3Rpb24nO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vc2Nyb2xsYWJsZS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTaXplRGV0ZWN0aW9uTW9kdWxlLCBCcmFuZGluZ01vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1Njcm9sbGFibGVDb21wb25lbnRdLFxuICBleHBvcnRzOiBbU2Nyb2xsYWJsZUNvbXBvbmVudCwgQnJhbmRpbmdNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbGFibGVNb2R1bGUge1xuICBjb25zdHJ1Y3RvcigpIHt9XG59XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './select-icon.component';
|
|
2
|
+
export * from './select-icon.module';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdC1pY29uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc2VsZWN0LWljb24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2VsZWN0LWljb24ubW9kdWxlJztcbiJdfQ==
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/* eslint-disable @angular-eslint/no-conflicting-lifecycle */
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Inject, Input, Optional, Output, Self, ViewChild } from '@angular/core';
|
|
3
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
4
|
+
import { nanoid } from 'nanoid';
|
|
5
|
+
import { BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, map, startWith, Subject } from 'rxjs';
|
|
6
|
+
import { FontAwesomeIcons } from '../../constants';
|
|
7
|
+
import { coerceBooleanPropertyValue } from '../../utilities';
|
|
8
|
+
import { ImpdcFormFieldControl, IMPDC_FORM_ROOT, mixinDisabled, mixinErrorState, mixinTabIndex } from '../form-field';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../form-field";
|
|
11
|
+
import * as i2 from "@angular/forms";
|
|
12
|
+
import * as i3 from "@angular/common";
|
|
13
|
+
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
14
|
+
import * as i5 from "../form-field/form-field.component";
|
|
15
|
+
import * as i6 from "../form-field/controls/input/input.directive";
|
|
16
|
+
import * as i7 from "../form-field/directives/prefix.directive";
|
|
17
|
+
export class ImpdcSelectIconChange {
|
|
18
|
+
constructor(source, value) {
|
|
19
|
+
this.source = source;
|
|
20
|
+
this.value = value;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const _SelectIconComponentBase = mixinTabIndex(mixinDisabled(mixinErrorState(class {
|
|
24
|
+
constructor(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl) {
|
|
25
|
+
this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
|
|
26
|
+
this._formRoot = _formRoot;
|
|
27
|
+
this._parentForm = _parentForm;
|
|
28
|
+
this._parentFormGroup = _parentFormGroup;
|
|
29
|
+
this.ngControl = ngControl;
|
|
30
|
+
this.stateChanges = new Subject();
|
|
31
|
+
}
|
|
32
|
+
})));
|
|
33
|
+
/**
|
|
34
|
+
* The `SelectIconComponent` (`<impdc-select-icon`) is a select dropdown with search that shows all standard icons from Bootstrap 5.
|
|
35
|
+
* To use, import `SelectIconModule` or another module that imports and exports that module from `@impartner/design-components`.
|
|
36
|
+
*/
|
|
37
|
+
export class SelectIconComponent extends _SelectIconComponentBase {
|
|
38
|
+
constructor(_changeDetector, _defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl) {
|
|
39
|
+
super(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl);
|
|
40
|
+
this._changeDetector = _changeDetector;
|
|
41
|
+
this.searchControl = new FormControl('');
|
|
42
|
+
this._uid = `impdc-select-icon-${nanoid()}`;
|
|
43
|
+
this._dropdownOpen = false;
|
|
44
|
+
this._iconOptionsSubject = new BehaviorSubject(FontAwesomeIcons);
|
|
45
|
+
this._cvaOnChange = () => { };
|
|
46
|
+
this._cvaOnTouched = () => { };
|
|
47
|
+
this._placeholder = '- Select -';
|
|
48
|
+
/** Events fire when selection has been changed by the user. */
|
|
49
|
+
this.selectionChange = new EventEmitter();
|
|
50
|
+
/**
|
|
51
|
+
* Events fire when raw value of select changes. Mainly exists to handle
|
|
52
|
+
* two-way binding of `value` input property.
|
|
53
|
+
* @ignore
|
|
54
|
+
*/
|
|
55
|
+
this.valueChange = new EventEmitter();
|
|
56
|
+
this._value = null;
|
|
57
|
+
this._focused = false;
|
|
58
|
+
this.controlType = 'impdc-select-icon';
|
|
59
|
+
this.supportsAffixes = true;
|
|
60
|
+
this.allowSearch = false;
|
|
61
|
+
this.showText = true;
|
|
62
|
+
this.showSelectedText = true;
|
|
63
|
+
const debouncedSearchValues = this.searchControl.valueChanges.pipe(startWith(''), debounceTime(200), distinctUntilChanged());
|
|
64
|
+
this.filteredOptions$ = combineLatest([
|
|
65
|
+
debouncedSearchValues,
|
|
66
|
+
this._iconOptionsSubject.asObservable()
|
|
67
|
+
]).pipe(map(([searchTerm, iconOptions]) => {
|
|
68
|
+
if (!searchTerm) {
|
|
69
|
+
return [...iconOptions];
|
|
70
|
+
}
|
|
71
|
+
const searchTermLowerCase = searchTerm.toLowerCase();
|
|
72
|
+
return iconOptions.filter(option => option.toLowerCase().indexOf(searchTermLowerCase) > -1);
|
|
73
|
+
}));
|
|
74
|
+
if (this.ngControl) {
|
|
75
|
+
this.ngControl.valueAccessor = this;
|
|
76
|
+
}
|
|
77
|
+
this.id = this.id;
|
|
78
|
+
}
|
|
79
|
+
get iconOptions() {
|
|
80
|
+
return [...this._iconOptionsSubject.value];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Set to override the default set of FontAwesome icon options.
|
|
84
|
+
*/
|
|
85
|
+
set iconOptions(iconOptions) {
|
|
86
|
+
if (iconOptions) {
|
|
87
|
+
this._iconOptionsSubject.next([...iconOptions]);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The placeholder text that will be displayed when no selection has been made.
|
|
92
|
+
*
|
|
93
|
+
* @default \- Select -
|
|
94
|
+
*/
|
|
95
|
+
get placeholder() {
|
|
96
|
+
return this._placeholder;
|
|
97
|
+
}
|
|
98
|
+
set placeholder(value) {
|
|
99
|
+
this._placeholder = value;
|
|
100
|
+
this.stateChanges.next();
|
|
101
|
+
}
|
|
102
|
+
get empty() {
|
|
103
|
+
return !this.value;
|
|
104
|
+
}
|
|
105
|
+
/** @ignore */
|
|
106
|
+
focus(options) {
|
|
107
|
+
this._toggleButtonRef.nativeElement.focus(options);
|
|
108
|
+
}
|
|
109
|
+
/* Lifecycle Hooks */
|
|
110
|
+
/** @ignore */
|
|
111
|
+
ngDoCheck() {
|
|
112
|
+
const ngControl = this.ngControl;
|
|
113
|
+
if (!ngControl) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (this._previousControl !== ngControl.control) {
|
|
117
|
+
if (this._previousControl !== undefined &&
|
|
118
|
+
ngControl.disabled !== null &&
|
|
119
|
+
ngControl.disabled !== this.disabled) {
|
|
120
|
+
this.disabled = ngControl?.disabled;
|
|
121
|
+
}
|
|
122
|
+
this._previousControl = ngControl.control;
|
|
123
|
+
}
|
|
124
|
+
this.updateErrorState();
|
|
125
|
+
}
|
|
126
|
+
/** @ignore */
|
|
127
|
+
ngOnChanges(changes) {
|
|
128
|
+
// Managing disabled state is handled via the `mixinDisabled` mixin/generator, but we still need to signal
|
|
129
|
+
// to the parent form field so it can run change detection when disabled state is changed.
|
|
130
|
+
if (changes['disabled']) {
|
|
131
|
+
this.stateChanges.next();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** @ignore */
|
|
135
|
+
ngOnDestroy() {
|
|
136
|
+
this.stateChanges.complete();
|
|
137
|
+
}
|
|
138
|
+
/* ControlValueAccessor */
|
|
139
|
+
/** @ignore */
|
|
140
|
+
writeValue(value) {
|
|
141
|
+
this.value = value;
|
|
142
|
+
this._changeDetector.markForCheck();
|
|
143
|
+
}
|
|
144
|
+
/** @ignore */
|
|
145
|
+
registerOnChange(fn) {
|
|
146
|
+
this._cvaOnChange = fn;
|
|
147
|
+
}
|
|
148
|
+
/** @ignore */
|
|
149
|
+
registerOnTouched(fn) {
|
|
150
|
+
this._cvaOnTouched = fn;
|
|
151
|
+
}
|
|
152
|
+
/** @ignore */
|
|
153
|
+
setDisabledState(isDisabled) {
|
|
154
|
+
this.disabled = isDisabled;
|
|
155
|
+
this._changeDetector.markForCheck();
|
|
156
|
+
}
|
|
157
|
+
/* ImpdcFormFieldControl */
|
|
158
|
+
get value() {
|
|
159
|
+
return this._value;
|
|
160
|
+
}
|
|
161
|
+
set value(value) {
|
|
162
|
+
const newValue = (value && this.iconOptions.find(opt => opt === value)) || null;
|
|
163
|
+
if (newValue !== this._value) {
|
|
164
|
+
this._value = newValue;
|
|
165
|
+
this.stateChanges.next();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
get id() {
|
|
169
|
+
return this._id;
|
|
170
|
+
}
|
|
171
|
+
set id(value) {
|
|
172
|
+
this._id = value || this._uid;
|
|
173
|
+
this.stateChanges.next();
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Used to set requiredness of control in a template-based manner;
|
|
177
|
+
* not necessary when using the Angular reactive forms API and `required` validator.
|
|
178
|
+
*
|
|
179
|
+
* @default false
|
|
180
|
+
*/
|
|
181
|
+
get required() {
|
|
182
|
+
return (this._required ??
|
|
183
|
+
this.ngControl?.control?.hasValidator(Validators.required) ??
|
|
184
|
+
false);
|
|
185
|
+
}
|
|
186
|
+
set required(value) {
|
|
187
|
+
this._required = coerceBooleanPropertyValue(value);
|
|
188
|
+
this.stateChanges.next();
|
|
189
|
+
}
|
|
190
|
+
get focused() {
|
|
191
|
+
return this._focused || this._dropdownOpen;
|
|
192
|
+
}
|
|
193
|
+
/* Internals */
|
|
194
|
+
handleOpenChange(isOpen) {
|
|
195
|
+
this._dropdownOpen = isOpen;
|
|
196
|
+
this.searchControl.reset();
|
|
197
|
+
if (isOpen) {
|
|
198
|
+
this._onFocus();
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
this._onBlur();
|
|
202
|
+
}
|
|
203
|
+
this.stateChanges.next();
|
|
204
|
+
}
|
|
205
|
+
selectIcon(iconName) {
|
|
206
|
+
if (iconName !== this.value) {
|
|
207
|
+
this.value = iconName;
|
|
208
|
+
this.valueChange.emit(this.value);
|
|
209
|
+
this._cvaOnChange(this.value);
|
|
210
|
+
this.selectionChange.emit(this._buildChangeEvent(this.value));
|
|
211
|
+
this._changeDetector.markForCheck();
|
|
212
|
+
}
|
|
213
|
+
if (this._dropdownOpen) {
|
|
214
|
+
this.focus();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
_onFocus() {
|
|
218
|
+
if (!this.disabled) {
|
|
219
|
+
this._focused = true;
|
|
220
|
+
this.stateChanges.next();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Calls the CVA touched callback only if the dropdown is closed.
|
|
225
|
+
*/
|
|
226
|
+
_onBlur() {
|
|
227
|
+
this._focused = false;
|
|
228
|
+
if (!this.disabled && !this._dropdownOpen) {
|
|
229
|
+
this._cvaOnTouched();
|
|
230
|
+
this._changeDetector.markForCheck();
|
|
231
|
+
this.stateChanges.next();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
_buildChangeEvent(value) {
|
|
235
|
+
return new ImpdcSelectIconChange(this, value);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
SelectIconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectIconComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ErrorStateMatcher }, { token: IMPDC_FORM_ROOT, optional: true }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
239
|
+
SelectIconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SelectIconComponent, selector: "impdc-select-icon", inputs: { disabled: "disabled", tabIndex: "tabIndex", allowSearch: "allowSearch", iconOptions: "iconOptions", showText: "showText", showSelectedText: "showSelectedText", placeholder: "placeholder", errorStateMatcher: "errorStateMatcher", value: "value", id: "id", required: "required" }, outputs: { selectionChange: "selectionChange", valueChange: "valueChange" }, host: { listeners: { "focus": "_onFocus(); focus()" }, properties: { "attr.id": "id", "attr.tabindex": "tabIndex", "attr.aria-required": "required.toString()", "attr.aria-disabled": "disabled.toString()", "attr.aria-invalid": "errorState", "class.form-select": "true", "class.is-invalid": "errorState", "class.impdc-form-field-control": "true", "class.impdc-select-icon--required": "required", "class.impdc-select-icon--disabled": "disabled", "class.impdc-select-icon--invalid": "errorState", "class.impdc-select-icon--empty": "empty" }, classAttribute: "impdc-select-icon" }, providers: [
|
|
240
|
+
{
|
|
241
|
+
provide: ImpdcFormFieldControl,
|
|
242
|
+
useExisting: SelectIconComponent
|
|
243
|
+
}
|
|
244
|
+
], viewQueries: [{ propertyName: "_toggleButtonRef", first: true, predicate: ["toggleButton"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n ngbDropdown\n autoClose=\"outside\"\n container=\"body\"\n dropdownClass=\"impartner-hex\"\n (openChange)=\"handleOpenChange($event)\"\n class=\"w-100\">\n <button\n #toggleButton\n class=\"impdc-select-icon--toggle btn border-0 text-start\"\n type=\"button\"\n role=\"combobox\"\n [disabled]=\"disabled\"\n ngbDropdownToggle>\n <ng-container [ngSwitch]=\"empty\">\n <span\n class=\"impdc-select-icon--text impdc-select-icon--placeholder\"\n *ngSwitchCase=\"true\">\n {{ placeholder }}\n </span>\n <div\n class=\"impdc-select-icon--text impdc-select-icon--value-text\"\n *ngSwitchCase=\"false\">\n <i class=\"fas fa-{{ value }}\"></i>\n <span *ngIf=\"showSelectedText\" class=\"ms-2\">{{ value }}</span>\n </div>\n </ng-container>\n </button>\n <div ngbDropdownMenu class=\"select-icon-dropdown-menu\" tabindex=\"-1\">\n <div *ngIf=\"allowSearch\" class=\"select-icon-search\">\n <impdc-form-field>\n <span impdcTextPrefix><i class=\"fas fa-search\"></i></span>\n <input\n impdcInput\n [formControl]=\"searchControl\"\n class=\"select-icon-search-input\"\n type=\"search\" />\n </impdc-form-field>\n </div>\n <div class=\"select-icon-grid\">\n <button\n *ngFor=\"let iconName of filteredOptions$ | async\"\n type=\"button\"\n (click)=\"selectIcon(iconName)\"\n class=\"icon-option\"\n [class.selected]=\"value === iconName\"\n [title]=\"iconName\"\n [attr.aria-labelledby]=\"showText ? id + '_' + iconName : null\">\n <div class=\"icon-container\">\n <i class=\"fs-2xl fas fa-{{ iconName }}\"></i>\n </div>\n <div\n id=\"{{ id }}_{{ iconName }}\"\n class=\"icon-label\"\n [class.sr-only]=\"!showText\">\n {{ iconName }}\n </div>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{padding:0!important;position:relative}:host.impdc-select-icon--disabled{background-color:var(--impd-color-gray-100)}.impdc-select-icon--toggle{font-weight:inherit;padding-right:3.6rem;-webkit-user-select:none;user-select:none;width:100%}:host-context(.is-invalid) .impdc-select-icon--toggle{padding-right:6.6rem}.impdc-select-icon--text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.select-icon-dropdown-menu{background-color:var(--impd-color-white);color:var(--impd-color-gray-600);max-width:51.2rem;min-width:32rem;overflow:hidden;width:100%}.select-icon-search{margin:var(--impd-size-2);font-size:var(--impd-font-size-sm)}.select-icon-grid{display:grid;align-items:start;grid-template-columns:repeat(auto-fit,minmax(4.8rem,1fr));gap:var(--impd-size-4);width:100%;max-height:var(--impd-size-40);overflow-y:auto;overflow-x:hidden;padding:var(--impd-size-4);-webkit-user-select:none;user-select:none}button[ngbDropdownToggle].dropdown-toggle:after{display:none}.icon-option{padding:0;background:unset;border:none}.icon-option:focus{outline:0}.icon-container{height:4rem;width:4rem;margin-left:auto;margin-right:auto;display:flex;align-items:center;justify-content:center;border-radius:50%;justify-items:center}.selected>.icon-container,:hover>.icon-container,:focus>.icon-container{background-color:var(--impartner-hex-primary);color:var(--impartner-hex-white)}.icon-label{text-align:center;font-size:1rem}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i4.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "component", type: i5.FormFieldComponent, selector: "impdc-form-field", exportAs: ["impdcFormField"] }, { kind: "directive", type: i6.InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "directive", type: i7.PrefixDirective, selector: "[impdcPrefix], [impdcTextPrefix]", inputs: ["impdcTextPrefix"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
245
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SelectIconComponent, decorators: [{
|
|
246
|
+
type: Component,
|
|
247
|
+
args: [{ selector: 'impdc-select-icon', inputs: ['disabled', 'tabIndex'], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
248
|
+
class: 'impdc-select-icon',
|
|
249
|
+
'[attr.id]': 'id',
|
|
250
|
+
'[attr.tabindex]': 'tabIndex',
|
|
251
|
+
'[attr.aria-required]': 'required.toString()',
|
|
252
|
+
'[attr.aria-disabled]': 'disabled.toString()',
|
|
253
|
+
'[attr.aria-invalid]': 'errorState',
|
|
254
|
+
'[class.form-select]': 'true',
|
|
255
|
+
'[class.is-invalid]': 'errorState',
|
|
256
|
+
'[class.impdc-form-field-control]': 'true',
|
|
257
|
+
'[class.impdc-select-icon--required]': 'required',
|
|
258
|
+
'[class.impdc-select-icon--disabled]': 'disabled',
|
|
259
|
+
'[class.impdc-select-icon--invalid]': 'errorState',
|
|
260
|
+
'[class.impdc-select-icon--empty]': 'empty',
|
|
261
|
+
'(focus)': '_onFocus(); focus()'
|
|
262
|
+
}, providers: [
|
|
263
|
+
{
|
|
264
|
+
provide: ImpdcFormFieldControl,
|
|
265
|
+
useExisting: SelectIconComponent
|
|
266
|
+
}
|
|
267
|
+
], template: "<div\n ngbDropdown\n autoClose=\"outside\"\n container=\"body\"\n dropdownClass=\"impartner-hex\"\n (openChange)=\"handleOpenChange($event)\"\n class=\"w-100\">\n <button\n #toggleButton\n class=\"impdc-select-icon--toggle btn border-0 text-start\"\n type=\"button\"\n role=\"combobox\"\n [disabled]=\"disabled\"\n ngbDropdownToggle>\n <ng-container [ngSwitch]=\"empty\">\n <span\n class=\"impdc-select-icon--text impdc-select-icon--placeholder\"\n *ngSwitchCase=\"true\">\n {{ placeholder }}\n </span>\n <div\n class=\"impdc-select-icon--text impdc-select-icon--value-text\"\n *ngSwitchCase=\"false\">\n <i class=\"fas fa-{{ value }}\"></i>\n <span *ngIf=\"showSelectedText\" class=\"ms-2\">{{ value }}</span>\n </div>\n </ng-container>\n </button>\n <div ngbDropdownMenu class=\"select-icon-dropdown-menu\" tabindex=\"-1\">\n <div *ngIf=\"allowSearch\" class=\"select-icon-search\">\n <impdc-form-field>\n <span impdcTextPrefix><i class=\"fas fa-search\"></i></span>\n <input\n impdcInput\n [formControl]=\"searchControl\"\n class=\"select-icon-search-input\"\n type=\"search\" />\n </impdc-form-field>\n </div>\n <div class=\"select-icon-grid\">\n <button\n *ngFor=\"let iconName of filteredOptions$ | async\"\n type=\"button\"\n (click)=\"selectIcon(iconName)\"\n class=\"icon-option\"\n [class.selected]=\"value === iconName\"\n [title]=\"iconName\"\n [attr.aria-labelledby]=\"showText ? id + '_' + iconName : null\">\n <div class=\"icon-container\">\n <i class=\"fs-2xl fas fa-{{ iconName }}\"></i>\n </div>\n <div\n id=\"{{ id }}_{{ iconName }}\"\n class=\"icon-label\"\n [class.sr-only]=\"!showText\">\n {{ iconName }}\n </div>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{padding:0!important;position:relative}:host.impdc-select-icon--disabled{background-color:var(--impd-color-gray-100)}.impdc-select-icon--toggle{font-weight:inherit;padding-right:3.6rem;-webkit-user-select:none;user-select:none;width:100%}:host-context(.is-invalid) .impdc-select-icon--toggle{padding-right:6.6rem}.impdc-select-icon--text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.select-icon-dropdown-menu{background-color:var(--impd-color-white);color:var(--impd-color-gray-600);max-width:51.2rem;min-width:32rem;overflow:hidden;width:100%}.select-icon-search{margin:var(--impd-size-2);font-size:var(--impd-font-size-sm)}.select-icon-grid{display:grid;align-items:start;grid-template-columns:repeat(auto-fit,minmax(4.8rem,1fr));gap:var(--impd-size-4);width:100%;max-height:var(--impd-size-40);overflow-y:auto;overflow-x:hidden;padding:var(--impd-size-4);-webkit-user-select:none;user-select:none}button[ngbDropdownToggle].dropdown-toggle:after{display:none}.icon-option{padding:0;background:unset;border:none}.icon-option:focus{outline:0}.icon-container{height:4rem;width:4rem;margin-left:auto;margin-right:auto;display:flex;align-items:center;justify-content:center;border-radius:50%;justify-items:center}.selected>.icon-container,:hover>.icon-container,:focus>.icon-container{background-color:var(--impartner-hex-primary);color:var(--impartner-hex-white)}.icon-label{text-align:center;font-size:1rem}\n"] }]
|
|
268
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.ErrorStateMatcher }, { type: undefined, decorators: [{
|
|
269
|
+
type: Optional
|
|
270
|
+
}, {
|
|
271
|
+
type: Inject,
|
|
272
|
+
args: [IMPDC_FORM_ROOT]
|
|
273
|
+
}] }, { type: i2.NgForm, decorators: [{
|
|
274
|
+
type: Optional
|
|
275
|
+
}] }, { type: i2.FormGroupDirective, decorators: [{
|
|
276
|
+
type: Optional
|
|
277
|
+
}] }, { type: i2.NgControl, decorators: [{
|
|
278
|
+
type: Self
|
|
279
|
+
}, {
|
|
280
|
+
type: Optional
|
|
281
|
+
}] }]; }, propDecorators: { _toggleButtonRef: [{
|
|
282
|
+
type: ViewChild,
|
|
283
|
+
args: ['toggleButton', { static: true, read: ElementRef }]
|
|
284
|
+
}], allowSearch: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], iconOptions: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], showText: [{
|
|
289
|
+
type: Input
|
|
290
|
+
}], showSelectedText: [{
|
|
291
|
+
type: Input
|
|
292
|
+
}], placeholder: [{
|
|
293
|
+
type: Input
|
|
294
|
+
}], errorStateMatcher: [{
|
|
295
|
+
type: Input
|
|
296
|
+
}], selectionChange: [{
|
|
297
|
+
type: Output
|
|
298
|
+
}], valueChange: [{
|
|
299
|
+
type: Output
|
|
300
|
+
}], value: [{
|
|
301
|
+
type: Input
|
|
302
|
+
}], id: [{
|
|
303
|
+
type: Input
|
|
304
|
+
}], required: [{
|
|
305
|
+
type: Input
|
|
306
|
+
}] } });
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWljb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi9zZWxlY3QtaWNvbi9zZWxlY3QtaWNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdC1pY29uL3NlbGVjdC1pY29uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBRUosU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxXQUFXLEVBSVgsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLEdBQUcsRUFFSCxTQUFTLEVBQ1QsT0FBTyxFQUNSLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFnQiwwQkFBMEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFJTCxxQkFBcUIsRUFFckIsZUFBZSxFQUNmLGFBQWEsRUFDYixlQUFlLEVBQ2YsYUFBYSxFQUNkLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFFdkIsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUFtQixNQUEyQixFQUFTLEtBQVU7UUFBOUMsV0FBTSxHQUFOLE1BQU0sQ0FBcUI7UUFBUyxVQUFLLEdB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QUFROzswQkFDUixRQUFROzswQkFDUixJQUFJOzswQkFBSSxRQUFROzRDQXRGVCxnQkFBZ0I7c0JBRHpCLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQXFCdEQsV0FBVztzQkFEakIsS0FBSztnQkFXSyxXQUFXO3NCQURyQixLQUFLO2dCQVlDLFFBQVE7c0JBRGQsS0FBSztnQkFRQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBU0ssV0FBVztzQkFEckIsS0FBSztnQkFXVSxpQkFBaUI7c0JBRGhDLEtBQUs7Z0JBS1UsZUFBZTtzQkFEOUIsTUFBTTtnQkFTUyxXQUFXO3NCQUQxQixNQUFNO2dCQThISSxLQUFLO3NCQURmLEtBQUs7Z0JBZ0JLLEVBQUU7c0JBRFosS0FBSztnQkFpQkssUUFBUTtzQkFEbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGUgKi9cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEb0NoZWNrLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICBOZ0NvbnRyb2wsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvbnRBd2Vzb21lSWNvbnMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHlWYWx1ZSB9IGZyb20gJy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQge1xuICBFcnJvclN0YXRlTWF0Y2hlcixcbiAgSUNhblVwZGF0ZUVycm9yU3RhdGUsXG4gIElIYXNFcnJvclN0YXRlLFxuICBJbXBkY0Zvcm1GaWVsZENvbnRyb2wsXG4gIEltcGRjRm9ybVJvb3QsXG4gIElNUERDX0ZPUk1fUk9PVCxcbiAgbWl4aW5EaXNhYmxlZCxcbiAgbWl4aW5FcnJvclN0YXRlLFxuICBtaXhpblRhYkluZGV4XG59IGZyb20gJy4uL2Zvcm0tZmllbGQnO1xuXG5leHBvcnQgY2xhc3MgSW1wZGNTZWxlY3RJY29uQ2hhbmdlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHNvdXJjZTogU2VsZWN0SWNvbkNvbXBvbmVudCwgcHVibGljIHZhbHVlOiBhbnkpIHt9XG59XG5cbmNvbnN0IF9TZWxlY3RJY29uQ29tcG9uZW50QmFzZSA9IG1peGluVGFiSW5kZXgoXG4gIG1peGluRGlzYWJsZWQoXG4gICAgbWl4aW5FcnJvclN0YXRlKFxuICAgICAgY2xhc3Mge1xuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgICBwdWJsaWMgX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXIsXG4gICAgICAgICAgcHVibGljIF9mb3JtUm9vdDogSW1wZGNGb3JtUm9vdCxcbiAgICAgICAgICBwdWJsaWMgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICAgICAgICBwdWJsaWMgX3BhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgICAgICAgIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGxcbiAgICAgICAgKSB7fVxuICAgICAgfVxuICAgIClcbiAgKVxuKTtcblxuLyoqXG4gKiBUaGUgYFNlbGVjdEljb25Db21wb25lbnRgIChgPGltcGRjLXNlbGVjdC1pY29uYCkgaXMgYSBzZWxlY3QgZHJvcGRvd24gd2l0aCBzZWFyY2ggdGhhdCBzaG93cyBhbGwgc3RhbmRhcmQgaWNvbnMgZnJvbSBCb290c3RyYXAgNS5cbiAqIFRvIHVzZSwgaW1wb3J0IGBTZWxlY3RJY29uTW9kdWxlYCBvciBhbm90aGVyIG1vZHVsZSB0aGF0IGltcG9ydHMgYW5kIGV4cG9ydHMgdGhhdCBtb2R1bGUgZnJvbSBgQGltcGFydG5lci9kZXNpZ24tY29tcG9uZW50c2AuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXNlbGVjdC1pY29uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC1pY29uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LWljb24uY29tcG9uZW50LnNjc3MnXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dHMtbWV0YWRhdGEtcHJvcGVydHlcbiAgaW5wdXRzOiBbJ2Rpc2FibGVkJywgJ3RhYkluZGV4J10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWhvc3QtbWV0YWRhdGEtcHJvcGVydHlcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnaW1wZGMtc2VsZWN0LWljb24nLFxuICAgICdbYXR0ci5pZF0nOiAnaWQnLFxuICAgICdbYXR0ci50YWJpbmRleF0nOiAndGFiSW5kZXgnLFxuICAgICdbYXR0ci5hcmlhLXJlcXVpcmVkXSc6ICdyZXF1aXJlZC50b1N0cmluZygpJyxcbiAgICAnW2F0dHIuYXJpYS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQudG9TdHJpbmcoKScsXG4gICAgJ1thdHRyLmFyaWEtaW52YWxpZF0nOiAnZXJyb3JTdGF0ZScsXG4gICAgJ1tjbGFzcy5mb3JtLXNlbGVjdF0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5pcy1pbnZhbGlkXSc6ICdlcnJvclN0YXRlJyxcbiAgICAnW2NsYXNzLmltcGRjLWZvcm0tZmllbGQtY29udHJvbF0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5pbXBkYy1zZWxlY3QtaWNvbi0tcmVxdWlyZWRdJzogJ3JlcXVpcmVkJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC1pY29uLS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICdbY2xhc3MuaW1wZGMtc2VsZWN0LWljb24tLWludmFsaWRdJzogJ2Vycm9yU3RhdGUnLFxuICAgICdbY2xhc3MuaW1wZGMtc2VsZWN0LWljb24tLWVtcHR5XSc6ICdlbXB0eScsXG4gICAgJyhmb2N1cyknOiAnX29uRm9jdXMoKTsgZm9jdXMoKSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogSW1wZGNGb3JtRmllbGRDb250cm9sLFxuICAgICAgdXNlRXhpc3Rpbmc6IFNlbGVjdEljb25Db21wb25lbnRcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0SWNvbkNvbXBvbmVudFxuICBleHRlbmRzIF9TZWxlY3RJY29uQ29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgSW1wZGNGb3JtRmllbGRDb250cm9sPHN0cmluZyB8IG51bGw+LFxuICAgIElDYW5VcGRhdGVFcnJvclN0YXRlLFxuICAgIElIYXNFcnJvclN0YXRlLFxuICAgIERvQ2hlY2ssXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveVxue1xuICBAVmlld0NoaWxkKCd0b2dnbGVCdXR0b24nLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcm90ZWN0ZWQgX3RvZ2dsZUJ1dHRvblJlZiE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJlZE9wdGlvbnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBfdWlkID0gYGltcGRjLXNlbGVjdC1pY29uLSR7bmFub2lkKCl9YDtcbiAgcHJvdGVjdGVkIF9kcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9pY29uT3B0aW9uc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHJlYWRvbmx5IHN0cmluZ1tdPihcbiAgICBGb250QXdlc29tZUljb25zXG4gICk7XG4gIHByaXZhdGUgX3ByZXZpb3VzQ29udHJvbD86IEFic3RyYWN0Q29udHJvbCB8IG51bGw7XG4gIHByaXZhdGUgX2N2YU9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIF9jdmFPblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogU2V0IHdoZXRoZXIgb3Igbm90IGFuIGlucHV0IGZpZWxkIHdpbGwgYXBwZWFyIGZvciBzZWFyY2hpbmcgYW5kXG4gICAqIGZpbHRlcmluZyBpY29uIG9wdGlvbnMuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhbGxvd1NlYXJjaDogYm9vbGVhbjtcblxuICBwdWJsaWMgZ2V0IGljb25PcHRpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX2ljb25PcHRpb25zU3ViamVjdC52YWx1ZV07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldCBvZiBGb250QXdlc29tZSBpY29uIG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGljb25PcHRpb25zKGljb25PcHRpb25zOiBzdHJpbmdbXSkge1xuICAgIGlmIChpY29uT3B0aW9ucykge1xuICAgICAgdGhpcy5faWNvbk9wdGlvbnNTdWJqZWN0Lm5leHQoWy4uLmljb25PcHRpb25zXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSBpY29uIG5hbWVzIGFzIGxhYmVscyBmb3IgaWNvbiBvcHRpb25zLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1RleHQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBpY29uIGluc2lkZSB0aGUgY29udHJvbC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dTZWxlY3RlZFRleHQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFjZWhvbGRlciB0ZXh0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBubyBzZWxlY3Rpb24gaGFzIGJlZW4gbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXFwtIFNlbGVjdCAtXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmcgPSAnLSBTZWxlY3QgLSc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGVycm9yU3RhdGVNYXRjaGVyITogRXJyb3JTdGF0ZU1hdGNoZXI7XG5cbiAgLyoqIEV2ZW50cyBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhlIHVzZXIuICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SW1wZGNTZWxlY3RJY29uQ2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SW1wZGNTZWxlY3RJY29uQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudHMgZmlyZSB3aGVuIHJhdyB2YWx1ZSBvZiBzZWxlY3QgY2hhbmdlcy4gTWFpbmx5IGV4aXN0cyB0byBoYW5kbGVcbiAgICogdHdvLXdheSBiaW5kaW5nIG9mIGB2YWx1ZWAgaW5wdXQgcHJvcGVydHkuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bGw+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSU1QRENfRk9STV9ST09UKSBfZm9ybVJvb3Q6IEltcGRjRm9ybVJvb3QsXG4gICAgQE9wdGlvbmFsKCkgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICBAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBuZ0NvbnRyb2w6IE5nQ29udHJvbFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsXG4gICAgICBfZm9ybVJvb3QsXG4gICAgICBfcGFyZW50Rm9ybSxcbiAgICAgIF9wYXJlbnRGb3JtR3JvdXAsXG4gICAgICBuZ0NvbnRyb2xcbiAgICApO1xuXG4gICAgdGhpcy5hbGxvd1NlYXJjaCA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1RleHQgPSB0cnVlO1xuICAgIHRoaXMuc2hvd1NlbGVjdGVkVGV4dCA9IHRydWU7XG5cbiAgICBjb25zdCBkZWJvdW5jZWRTZWFyY2hWYWx1ZXMgPSB0aGlzLnNlYXJjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIGRlYm91bmNlZFNlYXJjaFZhbHVlcyxcbiAgICAgIHRoaXMuX2ljb25PcHRpb25zU3ViamVjdC5hc09ic2VydmFibGUoKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtzZWFyY2hUZXJtLCBpY29uT3B0aW9uc10pID0+IHtcbiAgICAgICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICAgICAgcmV0dXJuIFsuLi5pY29uT3B0aW9uc107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWFyY2hUZXJtTG93ZXJDYXNlID0gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gaWNvbk9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRlcm1Mb3dlckNhc2UpID4gLTFcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5pZCA9IHRoaXMuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy52YWx1ZTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBmb2N1cyhvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fdG9nZ2xlQnV0dG9uUmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7XG4gIH1cblxuICAvKiBMaWZlY3ljbGUgSG9va3MgKi9cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IG5nQ29udHJvbCA9IHRoaXMubmdDb250cm9sO1xuXG4gICAgaWYgKCFuZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcHJldmlvdXNDb250cm9sICE9PSBuZ0NvbnRyb2wuY29udHJvbCkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9wcmV2aW91c0NvbnRyb2wgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBuZ0NvbnRyb2wuZGlzYWJsZWQgIT09IG51bGwgJiZcbiAgICAgICAgbmdDb250cm9sLmRpc2FibGVkICE9PSB0aGlzLmRpc2FibGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IG5nQ29udHJvbD8uZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3ByZXZpb3VzQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBNYW5hZ2luZyBkaXNhYmxlZCBzdGF0ZSBpcyBoYW5kbGVkIHZpYSB0aGUgYG1peGluRGlzYWJsZWRgIG1peGluL2dlbmVyYXRvciwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gc2lnbmFsXG4gICAgLy8gdG8gdGhlIHBhcmVudCBmb3JtIGZpZWxkIHNvIGl0IGNhbiBydW4gY2hhbmdlIGRldGVjdGlvbiB3aGVuIGRpc2FibGVkIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qIENvbnRyb2xWYWx1ZUFjY2Vzc29yICovXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2N2YU9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHt9KTogdm9pZCB7XG4gICAgdGhpcy5fY3ZhT25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyogSW1wZGNGb3JtRmllbGRDb250cm9sICovXG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICh2YWx1ZSAmJiB0aGlzLmljb25PcHRpb25zLmZpbmQob3B0ID0+IG9wdCA9PT0gdmFsdWUpKSB8fCBudWxsO1xuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLl91aWQ7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByb3RlY3RlZCBfaWQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHJlcXVpcmVkbmVzcyBvZiBjb250cm9sIGluIGEgdGVtcGxhdGUtYmFzZWQgbWFubmVyO1xuICAgKiBub3QgbmVjZXNzYXJ5IHdoZW4gdXNpbmcgdGhlIEFuZ3VsYXIgcmVhY3RpdmUgZm9ybXMgQVBJIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRvci5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3JlcXVpcmVkID8/XG4gICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpID8/XG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHlWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZCB8fCB0aGlzLl9kcm9wZG93bk9wZW47XG4gIH1cbiAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xUeXBlOiBzdHJpbmcgPSAnaW1wZGMtc2VsZWN0LWljb24nO1xuICBwdWJsaWMgcmVhZG9ubHkgc3VwcG9ydHNBZmZpeGVzOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiBJbnRlcm5hbHMgKi9cblxuICBwcm90ZWN0ZWQgaGFuZGxlT3BlbkNoYW5nZShpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9kcm9wZG93bk9wZW4gPSBpc09wZW47XG4gICAgdGhpcy5zZWFyY2hDb250cm9sLnJlc2V0KCk7XG5cbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICB0aGlzLl9vbkZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uQmx1cigpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RJY29uKGljb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaWNvbk5hbWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpY29uTmFtZTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuX2N2YU9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLl9idWlsZENoYW5nZUV2ZW50KHRoaXMudmFsdWUpKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kcm9wZG93bk9wZW4pIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uRm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgdGhlIENWQSB0b3VjaGVkIGNhbGxiYWNrIG9ubHkgaWYgdGhlIGRyb3Bkb3duIGlzIGNsb3NlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5fZHJvcGRvd25PcGVuKSB7XG4gICAgICB0aGlzLl9jdmFPblRvdWNoZWQoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkQ2hhbmdlRXZlbnQodmFsdWU6IHN0cmluZyB8IG51bGwpOiBJbXBkY1NlbGVjdEljb25DaGFuZ2Uge1xuICAgIHJldHVybiBuZXcgSW1wZGNTZWxlY3RJY29uQ2hhbmdlKHRoaXMsIHZhbHVlKTtcbiAgfVxufVxuIiwiPGRpdlxuICBuZ2JEcm9wZG93blxuICBhdXRvQ2xvc2U9XCJvdXRzaWRlXCJcbiAgY29udGFpbmVyPVwiYm9keVwiXG4gIGRyb3Bkb3duQ2xhc3M9XCJpbXBhcnRuZXItaGV4XCJcbiAgKG9wZW5DaGFuZ2UpPVwiaGFuZGxlT3BlbkNoYW5nZSgkZXZlbnQpXCJcbiAgY2xhc3M9XCJ3LTEwMFwiPlxuICA8YnV0dG9uXG4gICAgI3RvZ2dsZUJ1dHRvblxuICAgIGNsYXNzPVwiaW1wZGMtc2VsZWN0LWljb24tLXRvZ2dsZSBidG4gYm9yZGVyLTAgdGV4dC1zdGFydFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIG5nYkRyb3Bkb3duVG9nZ2xlPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImVtcHR5XCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImltcGRjLXNlbGVjdC1pY29uLS10ZXh0IGltcGRjLXNlbGVjdC1pY29uLS1wbGFjZWhvbGRlclwiXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgIHt7IHBsYWNlaG9sZGVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW1wZGMtc2VsZWN0LWljb24tLXRleHQgaW1wZGMtc2VsZWN0LWljb24tLXZhbHVlLXRleHRcIlxuICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEte3sgdmFsdWUgfX1cIj48L2k+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd1NlbGVjdGVkVGV4dFwiIGNsYXNzPVwibXMtMlwiPnt7IHZhbHVlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvYnV0dG9uPlxuICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cInNlbGVjdC1pY29uLWRyb3Bkb3duLW1lbnVcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgPGRpdiAqbmdJZj1cImFsbG93U2VhcmNoXCIgY2xhc3M9XCJzZWxlY3QtaWNvbi1zZWFyY2hcIj5cbiAgICAgIDxpbXBkYy1mb3JtLWZpZWxkPlxuICAgICAgICA8c3BhbiBpbXBkY1RleHRQcmVmaXg+PGkgY2xhc3M9XCJmYXMgZmEtc2VhcmNoXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgaW1wZGNJbnB1dFxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzZWFyY2hDb250cm9sXCJcbiAgICAgICAgICBjbGFzcz1cInNlbGVjdC1pY29uLXNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgdHlwZT1cInNlYXJjaFwiIC8+XG4gICAgICA8L2ltcGRjLWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdC1pY29uLWdyaWRcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nRm9yPVwibGV0IGljb25OYW1lIG9mIGZpbHRlcmVkT3B0aW9ucyQgfCBhc3luY1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0SWNvbihpY29uTmFtZSlcIlxuICAgICAgICBjbGFzcz1cImljb24tb3B0aW9uXCJcbiAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInZhbHVlID09PSBpY29uTmFtZVwiXG4gICAgICAgIFt0aXRsZV09XCJpY29uTmFtZVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJzaG93VGV4dCA/IGlkICsgJ18nICsgaWNvbk5hbWUgOiBudWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZnMtMnhsIGZhcyBmYS17eyBpY29uTmFtZSB9fVwiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBpZD1cInt7IGlkIH19X3t7IGljb25OYW1lIH19XCJcbiAgICAgICAgICBjbGFzcz1cImljb24tbGFiZWxcIlxuICAgICAgICAgIFtjbGFzcy5zci1vbmx5XT1cIiFzaG93VGV4dFwiPlxuICAgICAgICAgIHt7IGljb25OYW1lIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|