@leanix/components 0.4.21 → 0.4.22
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/{esm2020 → esm2022}/lib/core-ui/components/badge/badge.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/button/button.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/button-group/button-group.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/card/card.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/collapsible/collapsible.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/colored-label/colored-label.component.mjs +4 -4
- package/esm2022/lib/core-ui/components/ellipsis/ellipsis.component.mjs +139 -0
- package/{esm2020 → esm2022}/lib/core-ui/components/file-download-button/file-download-button.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/icon-scale/icon-scale.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/spinner/spinner.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/table/table-header/table-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/table/table.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/components/tiny-spinner/tiny-spinner.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/core-ui.module.mjs +72 -72
- package/{esm2020 → esm2022}/lib/core-ui/directives/after-view-init.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/directives/autoclose-group.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/directives/autoclose.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/directives/autofocus.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/directives/html.directive.mjs +4 -4
- package/esm2022/lib/core-ui/linkify/linkify.pipe.mjs +144 -0
- package/{esm2020 → esm2022}/lib/core-ui/linkify/unlinkify.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/br.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/contrast-color.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/custom-date.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/highlight-range.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/highlight-term.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/lx-is-uuid.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/lx-time-ago.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/lx-translate.pipe.mjs +5 -5
- package/{esm2020 → esm2022}/lib/core-ui/pipes/markdown.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/nbsp.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/sort.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/translation-after.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/translation-before.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/translation-between.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/pipes/unescape-curly-braces.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/services/resize-observer.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core-ui/tooltip/tooltip.component.mjs +4 -4
- package/esm2022/lib/core-ui/tooltip/tooltip.directive.mjs +105 -0
- package/{esm2020 → esm2022}/lib/core-ui/tooltip/tooltip.module.mjs +5 -5
- package/esm2022/lib/forms-ui/components/basic-dropdown/basic-dropdown.component.mjs +120 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/basic-dropdown-item/basic-dropdown-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/breadcrumb/breadcrumb.component.mjs +4 -4
- package/esm2022/lib/forms-ui/components/cdk-options-dropdown/cdk-options-dropdown.component.mjs +216 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/cdk-options-sub-dropdown/cdk-options-sub-dropdown.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/copy-button/copy-button.component.mjs +4 -4
- package/esm2022/lib/forms-ui/components/currency/currency-input.component.mjs +145 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/currency/currency-symbol.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/date-input/date-input.component.mjs +7 -7
- package/{esm2020 → esm2022}/lib/forms-ui/components/date-picker-ui/datepicker-inner.component.mjs +6 -6
- package/esm2022/lib/forms-ui/components/date-picker-ui/datepicker-ui.module.mjs +27 -0
- package/esm2022/lib/forms-ui/components/date-picker-ui/datepicker.component.mjs +205 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/date-picker-ui/datepicker.config.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/date-picker-ui/daypicker.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/forms-ui/components/date-picker-ui/monthpicker.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/forms-ui/components/date-picker-ui/yearpicker.component.mjs +6 -6
- package/esm2022/lib/forms-ui/components/drag-and-drop-list/drag-and-drop-list-item/drag-and-drop-list-item.component.mjs +49 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/drag-and-drop-list/drag-and-drop-list.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/drag-and-drop-list/drag-and-drop-list.module.mjs +5 -5
- package/esm2022/lib/forms-ui/components/drag-and-drop-list/keyboard-sortable-item/keyboard-sortable-item.directive.mjs +134 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/drag-and-drop-list/keyboard-sortable-list/keyboard-sortable-list.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/error-message/error-message.component.mjs +7 -7
- package/{esm2020 → esm2022}/lib/forms-ui/components/expanded-dropdown/expanded-dropdown.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/form-error/form-error.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/icon/icon.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/input/input.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/keyboard-select.directive.mjs +4 -4
- package/esm2022/lib/forms-ui/components/multi-select/multi-select.component.mjs +255 -0
- package/esm2022/lib/forms-ui/components/option/option.component.mjs +84 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/option-group/option-group.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/option-group-dropdown/option-group-dropdown.component.mjs +4 -4
- package/esm2022/lib/forms-ui/components/options-dropdown/options-dropdown.component.mjs +185 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/options-sub-dropdown/options-sub-dropdown.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/picker/picker-trigger.directive.mjs +7 -7
- package/{esm2020 → esm2022}/lib/forms-ui/components/picker/picker.component.mjs +19 -19
- package/esm2022/lib/forms-ui/components/picker-option/picker-option.component.mjs +118 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/pill-item/pill-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/pill-list/pill-list.component.mjs +4 -4
- package/esm2022/lib/forms-ui/components/responsive-input/responsive-input.component.mjs +100 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/select-list/select-list.component.mjs +4 -4
- package/esm2022/lib/forms-ui/components/single-select/single-select.component.mjs +279 -0
- package/{esm2020 → esm2022}/lib/forms-ui/components/slider-toggle/slider-toggle.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/sorting-dropdown/sorting-dropdown.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/components/sorting-dropdown-trigger/sorting-dropdown-trigger.component.mjs +4 -4
- package/esm2022/lib/forms-ui/directives/contenteditable.directive.mjs +129 -0
- package/esm2022/lib/forms-ui/directives/form-error.directive.mjs +109 -0
- package/{esm2020 → esm2022}/lib/forms-ui/directives/form-submit.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/directives/keyboard-action-source.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/directives/mark-invalid.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/directives/select-dropdown.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/directives/selectable-item.directive.mjs +7 -7
- package/{esm2020 → esm2022}/lib/forms-ui/directives/selected-option.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/forms-ui.module.mjs +102 -102
- package/{esm2020 → esm2022}/lib/forms-ui/models/base-select.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/pipes/filter-selection.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/pipes/filter-term.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/forms-ui/pipes/format-number.pipe.mjs +4 -4
- package/esm2022/lib/modal-ui/components/modal/modal.component.mjs +213 -0
- package/{esm2020 → esm2022}/lib/modal-ui/components/modal-footer/modal-footer.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modal-ui/components/modal-header/modal-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modal-ui/directives/modal-content.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/modal-ui/modal.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/popover-ui/components/popover/popover.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/popover-ui/directives/popover-click.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/popover-ui/directives/popover-content.directive.mjs +4 -4
- package/esm2022/lib/popover-ui/directives/popover-hover.directive.mjs +87 -0
- package/{esm2020 → esm2022}/lib/popover-ui/popover-ui.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/tab-ui/components/tab/tab.component.mjs +14 -14
- package/esm2022/lib/tab-ui/components/tab-group/tab-group.component.mjs +71 -0
- package/{esm2020 → esm2022}/lib/tab-ui/tab-ui.module.mjs +5 -5
- package/{fesm2020 → fesm2022}/leanix-components.mjs +767 -768
- package/fesm2022/leanix-components.mjs.map +1 -0
- package/lib/core-ui/components/badge/badge.component.d.ts +1 -1
- package/lib/core-ui/components/button/button.component.d.ts +1 -1
- package/lib/core-ui/components/button-group/button-group.component.d.ts +1 -1
- package/lib/core-ui/components/card/card.component.d.ts +1 -1
- package/lib/core-ui/components/collapsible/collapsible.component.d.ts +1 -1
- package/lib/core-ui/components/colored-label/colored-label.component.d.ts +1 -1
- package/lib/core-ui/components/ellipsis/ellipsis.component.d.ts +1 -1
- package/lib/core-ui/components/file-download-button/file-download-button.component.d.ts +1 -1
- package/lib/core-ui/components/icon-scale/icon-scale.component.d.ts +1 -1
- package/lib/core-ui/components/spinner/spinner.component.d.ts +1 -1
- package/lib/core-ui/components/table/table-header/table-header.component.d.ts +1 -1
- package/lib/core-ui/components/table/table.component.d.ts +1 -1
- package/lib/core-ui/directives/autoclose.directive.d.ts +1 -1
- package/lib/core-ui/directives/autofocus.directive.d.ts +1 -1
- package/lib/core-ui/directives/html.directive.d.ts +1 -1
- package/lib/core-ui/pipes/sort.pipe.d.ts +1 -1
- package/lib/core-ui/services/resize-observer.service.d.ts +1 -1
- package/lib/core-ui/tooltip/tooltip.component.d.ts +1 -1
- package/lib/core-ui/tooltip/tooltip.directive.d.ts +1 -1
- package/lib/forms-ui/components/basic-dropdown/basic-dropdown.component.d.ts +1 -1
- package/lib/forms-ui/components/basic-dropdown-item/basic-dropdown-item.component.d.ts +1 -1
- package/lib/forms-ui/components/breadcrumb/breadcrumb.component.d.ts +2 -2
- package/lib/forms-ui/components/cdk-options-dropdown/cdk-options-dropdown.component.d.ts +1 -1
- package/lib/forms-ui/components/cdk-options-sub-dropdown/cdk-options-sub-dropdown.component.d.ts +1 -1
- package/lib/forms-ui/components/copy-button/copy-button.component.d.ts +1 -1
- package/lib/forms-ui/components/currency/currency-input.component.d.ts +4 -4
- package/lib/forms-ui/components/currency/currency-symbol.component.d.ts +1 -1
- package/lib/forms-ui/components/date-input/date-input.component.d.ts +2 -2
- package/lib/forms-ui/components/date-picker-ui/datepicker-inner.component.d.ts +1 -1
- package/lib/forms-ui/components/date-picker-ui/datepicker.component.d.ts +1 -1
- package/lib/forms-ui/components/drag-and-drop-list/drag-and-drop-list-item/drag-and-drop-list-item.component.d.ts +1 -1
- package/lib/forms-ui/components/drag-and-drop-list/drag-and-drop-list.component.d.ts +1 -1
- package/lib/forms-ui/components/drag-and-drop-list/keyboard-sortable-item/keyboard-sortable-item.directive.d.ts +1 -1
- package/lib/forms-ui/components/drag-and-drop-list/keyboard-sortable-list/keyboard-sortable-list.directive.d.ts +1 -1
- package/lib/forms-ui/components/error-message/error-message.component.d.ts +1 -1
- package/lib/forms-ui/components/expanded-dropdown/expanded-dropdown.component.d.ts +1 -1
- package/lib/forms-ui/components/form-error/form-error.component.d.ts +1 -1
- package/lib/forms-ui/components/icon/icon.component.d.ts +2 -2
- package/lib/forms-ui/components/input/input.component.d.ts +1 -1
- package/lib/forms-ui/components/keyboard-select.directive.d.ts +1 -1
- package/lib/forms-ui/components/multi-select/multi-select.component.d.ts +3 -3
- package/lib/forms-ui/components/option/option.component.d.ts +1 -1
- package/lib/forms-ui/components/option-group/option-group.component.d.ts +1 -1
- package/lib/forms-ui/components/option-group-dropdown/option-group-dropdown.component.d.ts +3 -3
- package/lib/forms-ui/components/options-dropdown/options-dropdown.component.d.ts +1 -1
- package/lib/forms-ui/components/options-sub-dropdown/options-sub-dropdown.component.d.ts +1 -1
- package/lib/forms-ui/components/picker/picker.component.d.ts +1 -1
- package/lib/forms-ui/components/picker-option/picker-option.component.d.ts +1 -1
- package/lib/forms-ui/components/pill-item/pill-item.component.d.ts +1 -1
- package/lib/forms-ui/components/pill-list/pill-list.component.d.ts +1 -1
- package/lib/forms-ui/components/select-list/select-list.component.d.ts +1 -1
- package/lib/forms-ui/components/single-select/single-select.component.d.ts +2 -2
- package/lib/forms-ui/components/slider-toggle/slider-toggle.component.d.ts +1 -1
- package/lib/forms-ui/components/sorting-dropdown/sorting-dropdown.component.d.ts +1 -1
- package/lib/forms-ui/components/sorting-dropdown-trigger/sorting-dropdown-trigger.component.d.ts +1 -1
- package/lib/forms-ui/directives/contenteditable.directive.d.ts +2 -2
- package/lib/forms-ui/directives/form-error.directive.d.ts +2 -2
- package/lib/forms-ui/directives/mark-invalid.directive.d.ts +1 -1
- package/lib/forms-ui/directives/selectable-item.directive.d.ts +1 -1
- package/lib/forms-ui/models/base-select.directive.d.ts +1 -1
- package/lib/forms-ui/models/single-select-padding.interface.d.ts +1 -1
- package/lib/forms-ui/models/sorting.interface.d.ts +1 -1
- package/lib/modal-ui/components/modal/modal.component.d.ts +1 -1
- package/lib/modal-ui/components/modal-footer/modal-footer.component.d.ts +1 -1
- package/lib/modal-ui/components/modal-header/modal-header.component.d.ts +1 -1
- package/lib/popover-ui/components/popover/popover.component.d.ts +1 -1
- package/lib/popover-ui/directives/popover-click.directive.d.ts +1 -1
- package/lib/popover-ui/directives/popover-hover.directive.d.ts +1 -1
- package/lib/tab-ui/components/tab/tab.component.d.ts +1 -1
- package/lib/tab-ui/components/tab-group/tab-group.component.d.ts +1 -1
- package/package.json +13 -19
- package/esm2020/lib/core-ui/components/ellipsis/ellipsis.component.mjs +0 -139
- package/esm2020/lib/core-ui/linkify/linkify.pipe.mjs +0 -144
- package/esm2020/lib/core-ui/tooltip/tooltip.directive.mjs +0 -105
- package/esm2020/lib/forms-ui/components/basic-dropdown/basic-dropdown.component.mjs +0 -120
- package/esm2020/lib/forms-ui/components/cdk-options-dropdown/cdk-options-dropdown.component.mjs +0 -216
- package/esm2020/lib/forms-ui/components/currency/currency-input.component.mjs +0 -145
- package/esm2020/lib/forms-ui/components/date-picker-ui/datepicker-ui.module.mjs +0 -28
- package/esm2020/lib/forms-ui/components/date-picker-ui/datepicker.component.mjs +0 -205
- package/esm2020/lib/forms-ui/components/drag-and-drop-list/drag-and-drop-list-item/drag-and-drop-list-item.component.mjs +0 -49
- package/esm2020/lib/forms-ui/components/drag-and-drop-list/keyboard-sortable-item/keyboard-sortable-item.directive.mjs +0 -134
- package/esm2020/lib/forms-ui/components/multi-select/multi-select.component.mjs +0 -255
- package/esm2020/lib/forms-ui/components/option/option.component.mjs +0 -84
- package/esm2020/lib/forms-ui/components/options-dropdown/options-dropdown.component.mjs +0 -185
- package/esm2020/lib/forms-ui/components/picker-option/picker-option.component.mjs +0 -118
- package/esm2020/lib/forms-ui/components/responsive-input/responsive-input.component.mjs +0 -100
- package/esm2020/lib/forms-ui/components/single-select/single-select.component.mjs +0 -279
- package/esm2020/lib/forms-ui/directives/contenteditable.directive.mjs +0 -129
- package/esm2020/lib/forms-ui/directives/form-error.directive.mjs +0 -109
- package/esm2020/lib/modal-ui/components/modal/modal.component.mjs +0 -213
- package/esm2020/lib/popover-ui/directives/popover-hover.directive.mjs +0 -87
- package/esm2020/lib/tab-ui/components/tab-group/tab-group.component.mjs +0 -71
- package/fesm2015/leanix-components.mjs +0 -8448
- package/fesm2015/leanix-components.mjs.map +0 -1
- package/fesm2020/leanix-components.mjs.map +0 -1
- package/src/lib/forms-ui/components/date-picker-ui/README.md +0 -8
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/leanix-components.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core-ui/annotations/required.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core-ui/core-ui.constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core-ui/functions/core-css.helpers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core-ui/tooltip/to-cdk-position.function.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core-ui/tooltip/tooltip-position.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/components/currency/currency-symbol-map.constant.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/components/date-picker-ui/date-formatter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/components/date-picker-ui/isBs3.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/components/drag-and-drop-list/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/helpers/key-codes.constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/helpers/keyboard-navigation.helpers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/models/dropdown-item.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/models/single-select-padding.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/models/sorting.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/validators/date-in-foreseeable-future.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/forms-ui/validators/string-not-in-array.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modal-ui/modal.constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/shared/date-helpers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/shared/html-helpers.function.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/shared/misc-helpers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/shared/observe.mjs +0 -0
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import { Component, ContentChild, EventEmitter, forwardRef, Input, Output, TemplateRef, ViewChild } from '@angular/core';
|
|
2
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
-
import { get, includes, isEqual } from 'lodash/fp';
|
|
4
|
-
import { fromEvent, Subject } from 'rxjs';
|
|
5
|
-
import { distinctUntilChanged, filter, map, takeUntil, tap } from 'rxjs/operators';
|
|
6
|
-
import { SelectDropdownDirective } from '../../directives/select-dropdown.directive';
|
|
7
|
-
import { SelectedOptionDirective } from '../../directives/selected-option.directive';
|
|
8
|
-
import { ARROW_LEFT, ARROW_RIGHT, BACKSPACE, ESCAPE, TAB } from '../../helpers/key-codes.constants';
|
|
9
|
-
import { getKeyboardNavigationEvents } from '../../helpers/keyboard-navigation.helpers';
|
|
10
|
-
import { BaseSelectDirective } from '../../models/base-select.directive';
|
|
11
|
-
import { BasicDropdownComponent } from '../basic-dropdown/basic-dropdown.component';
|
|
12
|
-
import { KeyboardSelectAction } from '../keyboard-select.directive';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@angular/common";
|
|
15
|
-
import * as i2 from "@angular/forms";
|
|
16
|
-
import * as i3 from "../../directives/mark-invalid.directive";
|
|
17
|
-
export class SingleSelectComponent extends BaseSelectDirective {
|
|
18
|
-
constructor(cd) {
|
|
19
|
-
super();
|
|
20
|
-
this.cd = cd;
|
|
21
|
-
this.selectionBackground = 'white';
|
|
22
|
-
this.size = 'default';
|
|
23
|
-
this.dropdownWidthScale = '1x';
|
|
24
|
-
this.padding = 'default';
|
|
25
|
-
this.selectionChange = new EventEmitter();
|
|
26
|
-
this.blur = new EventEmitter();
|
|
27
|
-
this.allowClear = true;
|
|
28
|
-
this.tabIndex = 0;
|
|
29
|
-
this.markInvalid = false;
|
|
30
|
-
this.destroyed$ = new Subject();
|
|
31
|
-
this.isInputFocusedViaTab = false;
|
|
32
|
-
}
|
|
33
|
-
static calculateNewCursorPostionOnKeyboardNavigation(cursorPosition, keyCode) {
|
|
34
|
-
switch (keyCode) {
|
|
35
|
-
case ARROW_LEFT:
|
|
36
|
-
cursorPosition--;
|
|
37
|
-
break;
|
|
38
|
-
case ARROW_RIGHT:
|
|
39
|
-
cursorPosition++;
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
return cursorPosition;
|
|
43
|
-
}
|
|
44
|
-
static getKeyboardSelectAction(cursorPosition, keyCode) {
|
|
45
|
-
if (cursorPosition <= -1 && keyCode === ARROW_RIGHT) {
|
|
46
|
-
return KeyboardSelectAction.NEXT;
|
|
47
|
-
}
|
|
48
|
-
if (cursorPosition === -1 && keyCode === ARROW_LEFT) {
|
|
49
|
-
return KeyboardSelectAction.LAST;
|
|
50
|
-
}
|
|
51
|
-
if (cursorPosition < -1 && keyCode === ARROW_LEFT) {
|
|
52
|
-
return KeyboardSelectAction.PREV;
|
|
53
|
-
}
|
|
54
|
-
if (cursorPosition <= -1 && keyCode === BACKSPACE) {
|
|
55
|
-
return KeyboardSelectAction.EXECUTE;
|
|
56
|
-
}
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
get selectedOptionTmpl() {
|
|
60
|
-
return this.explicitSelectedOption || this.implicitSelectedOption;
|
|
61
|
-
}
|
|
62
|
-
get dropdownTmpl() {
|
|
63
|
-
return this.explicitDropdown || this.implicitDropdown;
|
|
64
|
-
}
|
|
65
|
-
get cursorStyle() {
|
|
66
|
-
if (this.disabled) {
|
|
67
|
-
return 'default';
|
|
68
|
-
}
|
|
69
|
-
else if (this.allowQuery) {
|
|
70
|
-
return 'text';
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
return 'pointer';
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
get dropdownWidth() {
|
|
77
|
-
switch (this.dropdownWidthScale) {
|
|
78
|
-
case '1x':
|
|
79
|
-
return undefined;
|
|
80
|
-
case '1.5x':
|
|
81
|
-
return '150%';
|
|
82
|
-
case '2x':
|
|
83
|
-
return '200%';
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
resetInput() {
|
|
87
|
-
this.queryControl.reset('', { emitEvent: false });
|
|
88
|
-
}
|
|
89
|
-
focus() {
|
|
90
|
-
this.queryInput.nativeElement.focus();
|
|
91
|
-
}
|
|
92
|
-
focusAndOpen() {
|
|
93
|
-
this.queryInput.nativeElement.focus();
|
|
94
|
-
this.open.next(true);
|
|
95
|
-
}
|
|
96
|
-
ngOnDestroy() {
|
|
97
|
-
super.ngOnDestroy();
|
|
98
|
-
this.destroyed$.next();
|
|
99
|
-
}
|
|
100
|
-
ngAfterViewInit() {
|
|
101
|
-
super.ngAfterViewInit();
|
|
102
|
-
this.open
|
|
103
|
-
.pipe(distinctUntilChanged(), filter((open) => open && !!this.dropdownComponent), map(() => this.selection), takeUntil(this.destroyed$))
|
|
104
|
-
.subscribe((selection) => {
|
|
105
|
-
if (selection) {
|
|
106
|
-
const index = this.determineHighlightIndex(this.dropdownComponent.options, selection, this.dropdownComponent.itemKey);
|
|
107
|
-
if (index > -1) {
|
|
108
|
-
this.dropdownComponent.select(index);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
this.selectFirstOption();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
this.selectFirstOption();
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
// keyboard event handling
|
|
119
|
-
const sourceElement = this.queryInput.nativeElement;
|
|
120
|
-
// handle keyboard navigation for the selection
|
|
121
|
-
fromEvent(sourceElement, 'keydown')
|
|
122
|
-
.pipe(map((event) => this.mapToEventSet(event, sourceElement, this.virtualCursorPosition)), tap((eventSet) => {
|
|
123
|
-
if (!this.allowQuery && eventSet.event.keyCode !== BACKSPACE) {
|
|
124
|
-
// additional check for even.code for userEvent API compatibility
|
|
125
|
-
if (eventSet.event.keyCode !== TAB && eventSet.event.code !== 'Tab') {
|
|
126
|
-
// if querying is disabled, only the tab key press event will be propagated, so that you can still defocus.
|
|
127
|
-
eventSet.event.preventDefault();
|
|
128
|
-
}
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
if (eventSet.virtualCursorPosition === 0 &&
|
|
132
|
-
eventSet.inputCursorPosition === 0 &&
|
|
133
|
-
eventSet.event.keyCode === BACKSPACE &&
|
|
134
|
-
this.selection &&
|
|
135
|
-
this.allowClear) {
|
|
136
|
-
this.removeSelection();
|
|
137
|
-
eventSet.inputCursorPosition = undefined; // set to null to prevent continuing in the stream
|
|
138
|
-
}
|
|
139
|
-
if (typeof eventSet.inputCursorPosition === 'number' && eventSet.inputCursorPosition > 0) {
|
|
140
|
-
this.virtualCursorPosition = 0;
|
|
141
|
-
}
|
|
142
|
-
else if (eventSet.virtualCursorPosition === -1 && eventSet.event.keyCode === ARROW_RIGHT) {
|
|
143
|
-
eventSet.event.preventDefault();
|
|
144
|
-
this.selectionKeyboardSelectAction$.next(KeyboardSelectAction.UNSELECT);
|
|
145
|
-
this.virtualCursorPosition = 0;
|
|
146
|
-
eventSet.inputCursorPosition = undefined; // set to null to prevent continuing in the stream
|
|
147
|
-
}
|
|
148
|
-
}), filter((eventSet) => this.allowQuery && eventSet.inputCursorPosition === 0), map((eventSet) => eventSet.event), filter((event) => includes(event.keyCode, [ARROW_RIGHT, ARROW_LEFT, BACKSPACE])), map((event) => {
|
|
149
|
-
this.virtualCursorPosition = SingleSelectComponent.calculateNewCursorPostionOnKeyboardNavigation(this.virtualCursorPosition, event.keyCode);
|
|
150
|
-
return {
|
|
151
|
-
cursorPosition: this.virtualCursorPosition,
|
|
152
|
-
event
|
|
153
|
-
};
|
|
154
|
-
}), map((positionSet) => {
|
|
155
|
-
const action = SingleSelectComponent.getKeyboardSelectAction(positionSet.cursorPosition, positionSet.event.keyCode);
|
|
156
|
-
if (action === KeyboardSelectAction.NEXT) {
|
|
157
|
-
// prevent cursor from moving in the input field, while we are still in the selection items
|
|
158
|
-
positionSet.event.preventDefault();
|
|
159
|
-
}
|
|
160
|
-
return action;
|
|
161
|
-
}), takeUntil(this.destroyed$))
|
|
162
|
-
.subscribe(this.selectionKeyboardSelectAction$);
|
|
163
|
-
const keyboardEvents = getKeyboardNavigationEvents(sourceElement, this.destroyed$);
|
|
164
|
-
keyboardEvents.verticalNavigation$.subscribe((event) => {
|
|
165
|
-
event.preventDefault();
|
|
166
|
-
});
|
|
167
|
-
keyboardEvents.close$.subscribe((event) => {
|
|
168
|
-
if (event.keyCode === ESCAPE && this.dropdownOpen) {
|
|
169
|
-
event.preventDefault();
|
|
170
|
-
event.stopImmediatePropagation();
|
|
171
|
-
}
|
|
172
|
-
this.open.next(false);
|
|
173
|
-
});
|
|
174
|
-
keyboardEvents.dropdownKeyboardEvent$.subscribe(this.optionsKeyboardSelectAction$);
|
|
175
|
-
keyboardEvents.enter$.subscribe(() => this.open.next(!this.dropdownOpen));
|
|
176
|
-
keyboardEvents.space$.pipe(filter(() => !this.allowQuery)).subscribe(() => {
|
|
177
|
-
if (this.dropdownOpen) {
|
|
178
|
-
this.optionsKeyboardSelectAction$.next(KeyboardSelectAction.EXECUTE);
|
|
179
|
-
}
|
|
180
|
-
this.open.next(!this.dropdownOpen);
|
|
181
|
-
});
|
|
182
|
-
keyboardEvents.openOnArrowDown$.subscribe(() => this.open.next(true));
|
|
183
|
-
}
|
|
184
|
-
selectOption(option) {
|
|
185
|
-
this.selection = option;
|
|
186
|
-
this.selectionChange.emit(option);
|
|
187
|
-
this.propagateChange(option);
|
|
188
|
-
this.resetSelectState();
|
|
189
|
-
// This timeout makes sure that the dropdown will be closed at the end
|
|
190
|
-
// of all the callbacks in the open subscriptions.
|
|
191
|
-
setTimeout(() => {
|
|
192
|
-
this.open.next(false);
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
removeSelection() {
|
|
196
|
-
this.selection = null;
|
|
197
|
-
this.cd.markForCheck();
|
|
198
|
-
this.cd.detectChanges();
|
|
199
|
-
this.selectionChange.emit(this.selection);
|
|
200
|
-
this.propagateChange(this.selection);
|
|
201
|
-
this.resetSelectState();
|
|
202
|
-
}
|
|
203
|
-
propagateChange(_value) { }
|
|
204
|
-
writeValue(newSelection) {
|
|
205
|
-
this.selection = newSelection;
|
|
206
|
-
}
|
|
207
|
-
setDisabledState(isDisabled) {
|
|
208
|
-
this.disabled = isDisabled;
|
|
209
|
-
}
|
|
210
|
-
registerOnChange(fn) {
|
|
211
|
-
this.propagateChange = fn;
|
|
212
|
-
}
|
|
213
|
-
registerOnTouched(_fn) { }
|
|
214
|
-
focusedViaTab() {
|
|
215
|
-
this.isInputFocusedViaTab = true;
|
|
216
|
-
}
|
|
217
|
-
determineHighlightIndex(options, selection, itemKey) {
|
|
218
|
-
return itemKey
|
|
219
|
-
? options.findIndex((option) => isEqual(get(itemKey, selection), get(itemKey, option)) || isEqual(selection, get(itemKey, option)))
|
|
220
|
-
: options.findIndex((option) => isEqual(selection, option));
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
SingleSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: SingleSelectComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
224
|
-
SingleSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: SingleSelectComponent, selector: "lx-single-select", inputs: { selection: "selection", selectionBackground: "selectionBackground", size: "size", dropdownWidthScale: "dropdownWidthScale", padding: "padding", allowClear: "allowClear", tabIndex: "tabIndex", markInvalid: "markInvalid" }, outputs: { selectionChange: "selectionChange", blur: "blur" }, providers: [
|
|
225
|
-
{
|
|
226
|
-
provide: NG_VALUE_ACCESSOR,
|
|
227
|
-
multi: true,
|
|
228
|
-
useExisting: forwardRef(() => SingleSelectComponent)
|
|
229
|
-
}
|
|
230
|
-
], queries: [{ propertyName: "explicitDropdown", first: true, predicate: SelectDropdownDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "explicitSelectedOption", first: true, predicate: SelectedOptionDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "dropdownComponent", first: true, predicate: BasicDropdownComponent, descendants: true }], viewQueries: [{ propertyName: "implicitSelectedOption", first: true, predicate: ["selectedOption"], descendants: true, static: true }, { propertyName: "implicitDropdown", first: true, predicate: ["dropdown"], descendants: true, static: true }, { propertyName: "queryInput", first: true, predicate: ["queryInput"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"dropdownOpen\" class=\"backdrop\" (click)=\"handleBackdropClick($event)\"></div>\n<div\n [lxMarkInvalid]=\"markInvalid\"\n class=\"selectContainer {{ padding }}Padding\"\n [class.open]=\"dropdownOpen\"\n [class.top]=\"(dropdownDirection$ | async) === 'TOP'\"\n [class.bottom]=\"(dropdownDirection$ | async) === 'BOTTOM'\"\n [class.disabled]=\"disabled\"\n [class.grayBackground]=\"selectionBackground === 'gray'\"\n [class.defaultSize]=\"size === 'default'\"\n [class.smallSize]=\"size === 'small'\"\n [class.select2Size]=\"size === 'select2'\"\n [class.largeSize]=\"size === 'large'\"\n [style.cursor]=\"cursorStyle\"\n [class.focused]=\"isInputFocused\"\n [class.focusedVisible]=\"isInputFocusedViaTab\"\n (click)=\"handleClick($event.target === toggle)\"\n>\n <div class=\"selectionContainer\">\n <div class=\"inputContainer\">\n <div *ngIf=\"!selection && selection !== 0 && !queryInput?.value\" class=\"placeholder\" [attr.title]=\"placeholder\">\n {{ placeholder }}\n </div>\n <div\n *ngIf=\"!allowQuery || !queryInput?.value\"\n class=\"selection\"\n [class.lowerOpacity]=\"allowQuery && !queryInput?.value && dropdownOpen\"\n [class.lightgrayColor]=\"!allowQuery && dropdownOpen\"\n (click)=\"$event.stopPropagation(); focus()\"\n >\n <ng-container *ngTemplateOutlet=\"selectedOptionTmpl\"></ng-container>\n </div>\n <input\n #queryInput\n class=\"queryInput\"\n type=\"text\"\n [class.isHidden]=\"!allowQuery\"\n (keydown.enter)=\"$event.preventDefault()\"\n (focus)=\"isInputFocused = true\"\n (blur)=\"isInputFocused = false; isInputFocusedViaTab = false; blur.emit($event)\"\n (keyup.tab)=\"focusedViaTab()\"\n (keyup.shift.tab)=\"focusedViaTab()\"\n [tabIndex]=\"disabled ? -1 : tabIndex\"\n [formControl]=\"queryControl\"\n [readOnly]=\"!allowQuery\"\n />\n </div>\n <div class=\"iconContainer\">\n <i *ngIf=\"(selection || selection === 0) && allowClear && !disabled\" class=\"far fa-times\" (click)=\"removeSelection()\"></i>\n <i #toggle class=\"fas fa-angle-down\" aria-hidden=\"true\"></i>\n </div>\n </div>\n <div class=\"optionsContainer\" [style.width]=\"dropdownWidth\" #optionsContainer>\n <ng-container *ngIf=\"dropdownOpen\">\n <ng-container *ngTemplateOutlet=\"dropdownTmpl\"></ng-container>\n </ng-container>\n </div>\n</div>\n\n<ng-template #selectedOption>\n <ng-content select=\".selectedOption\"></ng-content>\n</ng-template>\n<ng-template #dropdown>\n <ng-content select=\".dropdownComponent\"></ng-content>\n</ng-template>\n", styles: [":host ::ng-deep .selectedOption{overflow:hidden;text-overflow:ellipsis}.selectContainer{position:relative;height:auto;padding:0;box-sizing:border-box;background:#fff;border:1px solid #99a5bb;box-shadow:inset 0 1px 1px #00000012;border-radius:3px}.selectContainer.grayBackground{background:#eaedf1;border-color:#eaedf1;box-shadow:none}.selectContainer.open{z-index:1049;background:#fff;border:1px solid #e1e5eb}.selectContainer.open.bottom{box-shadow:0 6px 6px #21252933;border-bottom-color:#fff;border-bottom-left-radius:0;border-bottom-right-radius:0}.selectContainer.open.bottom .optionsContainer{border-bottom:solid 1px #e1e5eb;border-left:solid 1px #e1e5eb;border-right:solid 1px #e1e5eb;box-shadow:0 6px 6px #21252933;top:100%;border-top:0;border-top-left-radius:0;border-top-right-radius:0}.selectContainer.open.top{box-shadow:0 -4px 6px #21252933;border-top:0;border-top-left-radius:0;border-top-right-radius:0}.selectContainer.open.top .optionsContainer{border-bottom:solid 1px #e1e5eb;border-left:solid 1px #e1e5eb;border-right:solid 1px #e1e5eb;box-shadow:0 -4px 6px #21252933;margin-bottom:0;border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;top:none;bottom:100%}.selectContainer:not(.open).focused{outline:0;border:1px solid #5599ff}.selectContainer:not(.open).focusedVisible{outline:1px auto Highlight;outline:1px auto -webkit-focus-ring-color}.selectContainer.disabled{background-color:#eaedf1;cursor:not-allowed!important}.selectContainer.defaultPadding .selectionContainer{padding-left:12px}.selectContainer.narrowPadding .selectionContainer{padding-left:4px}.selectContainer .lightgrayColor{color:#8594ad}.selectionContainer{display:flex}.inputContainer{flex:1;position:relative;white-space:nowrap}.queryInput{width:100%;-webkit-appearance:none;appearance:none;border:0;padding-left:0;background:transparent;position:relative;cursor:inherit}.queryInput::-ms-clear{display:none}.queryInput:focus{outline:0}.queryInput.isHidden{opacity:0}.placeholder{position:absolute;width:100%;text-align:left;color:#8594ad;overflow:hidden;word-break:break-all;white-space:nowrap;text-overflow:ellipsis}.iconContainer{display:flex;align-items:center;text-align:center}.iconContainer .far,.iconContainer .fas{width:10px;cursor:pointer}.disabled .iconContainer .far,.disabled .iconContainer .fas{cursor:inherit;color:#8594ad}.iconContainer .fa-angle-down{margin:0 12px}.iconContainer .fa-times{margin-left:4px}.selection{width:100%;position:absolute;display:flex;align-items:center}.selection.lowerOpacity{opacity:.7}.backdrop{position:fixed;inset:0;z-index:1048}.optionsContainer{position:absolute;left:-1px;right:-1px;padding:0;border-radius:3px;background:#fff;z-index:1001}.defaultSize .inputContainer,.defaultSize .queryInput,.defaultSize .selection,.defaultSize .iconContainer{height:29px}.defaultSize .inputContainer{line-height:29px}.defaultSize .selectionContainer{min-height:29px}.smallSize .inputContainer,.smallSize .queryInput,.smallSize .selection,.smallSize .iconContainer{height:22px}.smallSize .inputContainer{line-height:22px}.smallSize .selectionContainer{min-height:22px}.select2Size .inputContainer,.select2Size .queryInput,.select2Size .selection,.select2Size .iconContainer{height:26px}.select2Size .inputContainer{line-height:26px}.select2Size .selectionContainer{min-height:26px}.largeSize .inputContainer,.largeSize .queryInput,.largeSize .selection,.largeSize .iconContainer{height:40px}.largeSize .inputContainer{line-height:40px}.largeSize .selectionContainer{min-height:40px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.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: "directive", type: i3.MarkInvalidDirective, selector: "[lxMarkInvalid]", inputs: ["lxMarkInvalid"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
231
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: SingleSelectComponent, decorators: [{
|
|
232
|
-
type: Component,
|
|
233
|
-
args: [{ selector: 'lx-single-select', providers: [
|
|
234
|
-
{
|
|
235
|
-
provide: NG_VALUE_ACCESSOR,
|
|
236
|
-
multi: true,
|
|
237
|
-
useExisting: forwardRef(() => SingleSelectComponent)
|
|
238
|
-
}
|
|
239
|
-
], template: "<div *ngIf=\"dropdownOpen\" class=\"backdrop\" (click)=\"handleBackdropClick($event)\"></div>\n<div\n [lxMarkInvalid]=\"markInvalid\"\n class=\"selectContainer {{ padding }}Padding\"\n [class.open]=\"dropdownOpen\"\n [class.top]=\"(dropdownDirection$ | async) === 'TOP'\"\n [class.bottom]=\"(dropdownDirection$ | async) === 'BOTTOM'\"\n [class.disabled]=\"disabled\"\n [class.grayBackground]=\"selectionBackground === 'gray'\"\n [class.defaultSize]=\"size === 'default'\"\n [class.smallSize]=\"size === 'small'\"\n [class.select2Size]=\"size === 'select2'\"\n [class.largeSize]=\"size === 'large'\"\n [style.cursor]=\"cursorStyle\"\n [class.focused]=\"isInputFocused\"\n [class.focusedVisible]=\"isInputFocusedViaTab\"\n (click)=\"handleClick($event.target === toggle)\"\n>\n <div class=\"selectionContainer\">\n <div class=\"inputContainer\">\n <div *ngIf=\"!selection && selection !== 0 && !queryInput?.value\" class=\"placeholder\" [attr.title]=\"placeholder\">\n {{ placeholder }}\n </div>\n <div\n *ngIf=\"!allowQuery || !queryInput?.value\"\n class=\"selection\"\n [class.lowerOpacity]=\"allowQuery && !queryInput?.value && dropdownOpen\"\n [class.lightgrayColor]=\"!allowQuery && dropdownOpen\"\n (click)=\"$event.stopPropagation(); focus()\"\n >\n <ng-container *ngTemplateOutlet=\"selectedOptionTmpl\"></ng-container>\n </div>\n <input\n #queryInput\n class=\"queryInput\"\n type=\"text\"\n [class.isHidden]=\"!allowQuery\"\n (keydown.enter)=\"$event.preventDefault()\"\n (focus)=\"isInputFocused = true\"\n (blur)=\"isInputFocused = false; isInputFocusedViaTab = false; blur.emit($event)\"\n (keyup.tab)=\"focusedViaTab()\"\n (keyup.shift.tab)=\"focusedViaTab()\"\n [tabIndex]=\"disabled ? -1 : tabIndex\"\n [formControl]=\"queryControl\"\n [readOnly]=\"!allowQuery\"\n />\n </div>\n <div class=\"iconContainer\">\n <i *ngIf=\"(selection || selection === 0) && allowClear && !disabled\" class=\"far fa-times\" (click)=\"removeSelection()\"></i>\n <i #toggle class=\"fas fa-angle-down\" aria-hidden=\"true\"></i>\n </div>\n </div>\n <div class=\"optionsContainer\" [style.width]=\"dropdownWidth\" #optionsContainer>\n <ng-container *ngIf=\"dropdownOpen\">\n <ng-container *ngTemplateOutlet=\"dropdownTmpl\"></ng-container>\n </ng-container>\n </div>\n</div>\n\n<ng-template #selectedOption>\n <ng-content select=\".selectedOption\"></ng-content>\n</ng-template>\n<ng-template #dropdown>\n <ng-content select=\".dropdownComponent\"></ng-content>\n</ng-template>\n", styles: [":host ::ng-deep .selectedOption{overflow:hidden;text-overflow:ellipsis}.selectContainer{position:relative;height:auto;padding:0;box-sizing:border-box;background:#fff;border:1px solid #99a5bb;box-shadow:inset 0 1px 1px #00000012;border-radius:3px}.selectContainer.grayBackground{background:#eaedf1;border-color:#eaedf1;box-shadow:none}.selectContainer.open{z-index:1049;background:#fff;border:1px solid #e1e5eb}.selectContainer.open.bottom{box-shadow:0 6px 6px #21252933;border-bottom-color:#fff;border-bottom-left-radius:0;border-bottom-right-radius:0}.selectContainer.open.bottom .optionsContainer{border-bottom:solid 1px #e1e5eb;border-left:solid 1px #e1e5eb;border-right:solid 1px #e1e5eb;box-shadow:0 6px 6px #21252933;top:100%;border-top:0;border-top-left-radius:0;border-top-right-radius:0}.selectContainer.open.top{box-shadow:0 -4px 6px #21252933;border-top:0;border-top-left-radius:0;border-top-right-radius:0}.selectContainer.open.top .optionsContainer{border-bottom:solid 1px #e1e5eb;border-left:solid 1px #e1e5eb;border-right:solid 1px #e1e5eb;box-shadow:0 -4px 6px #21252933;margin-bottom:0;border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;top:none;bottom:100%}.selectContainer:not(.open).focused{outline:0;border:1px solid #5599ff}.selectContainer:not(.open).focusedVisible{outline:1px auto Highlight;outline:1px auto -webkit-focus-ring-color}.selectContainer.disabled{background-color:#eaedf1;cursor:not-allowed!important}.selectContainer.defaultPadding .selectionContainer{padding-left:12px}.selectContainer.narrowPadding .selectionContainer{padding-left:4px}.selectContainer .lightgrayColor{color:#8594ad}.selectionContainer{display:flex}.inputContainer{flex:1;position:relative;white-space:nowrap}.queryInput{width:100%;-webkit-appearance:none;appearance:none;border:0;padding-left:0;background:transparent;position:relative;cursor:inherit}.queryInput::-ms-clear{display:none}.queryInput:focus{outline:0}.queryInput.isHidden{opacity:0}.placeholder{position:absolute;width:100%;text-align:left;color:#8594ad;overflow:hidden;word-break:break-all;white-space:nowrap;text-overflow:ellipsis}.iconContainer{display:flex;align-items:center;text-align:center}.iconContainer .far,.iconContainer .fas{width:10px;cursor:pointer}.disabled .iconContainer .far,.disabled .iconContainer .fas{cursor:inherit;color:#8594ad}.iconContainer .fa-angle-down{margin:0 12px}.iconContainer .fa-times{margin-left:4px}.selection{width:100%;position:absolute;display:flex;align-items:center}.selection.lowerOpacity{opacity:.7}.backdrop{position:fixed;inset:0;z-index:1048}.optionsContainer{position:absolute;left:-1px;right:-1px;padding:0;border-radius:3px;background:#fff;z-index:1001}.defaultSize .inputContainer,.defaultSize .queryInput,.defaultSize .selection,.defaultSize .iconContainer{height:29px}.defaultSize .inputContainer{line-height:29px}.defaultSize .selectionContainer{min-height:29px}.smallSize .inputContainer,.smallSize .queryInput,.smallSize .selection,.smallSize .iconContainer{height:22px}.smallSize .inputContainer{line-height:22px}.smallSize .selectionContainer{min-height:22px}.select2Size .inputContainer,.select2Size .queryInput,.select2Size .selection,.select2Size .iconContainer{height:26px}.select2Size .inputContainer{line-height:26px}.select2Size .selectionContainer{min-height:26px}.largeSize .inputContainer,.largeSize .queryInput,.largeSize .selection,.largeSize .iconContainer{height:40px}.largeSize .inputContainer{line-height:40px}.largeSize .selectionContainer{min-height:40px}\n"] }]
|
|
240
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { selection: [{
|
|
241
|
-
type: Input
|
|
242
|
-
}], selectionBackground: [{
|
|
243
|
-
type: Input
|
|
244
|
-
}], size: [{
|
|
245
|
-
type: Input
|
|
246
|
-
}], dropdownWidthScale: [{
|
|
247
|
-
type: Input
|
|
248
|
-
}], padding: [{
|
|
249
|
-
type: Input
|
|
250
|
-
}], selectionChange: [{
|
|
251
|
-
type: Output
|
|
252
|
-
}], blur: [{
|
|
253
|
-
type: Output
|
|
254
|
-
}], explicitDropdown: [{
|
|
255
|
-
type: ContentChild,
|
|
256
|
-
args: [SelectDropdownDirective, { read: TemplateRef, static: true }]
|
|
257
|
-
}], explicitSelectedOption: [{
|
|
258
|
-
type: ContentChild,
|
|
259
|
-
args: [SelectedOptionDirective, { read: TemplateRef, static: true }]
|
|
260
|
-
}], dropdownComponent: [{
|
|
261
|
-
type: ContentChild,
|
|
262
|
-
args: [BasicDropdownComponent, { static: false }]
|
|
263
|
-
}], implicitSelectedOption: [{
|
|
264
|
-
type: ViewChild,
|
|
265
|
-
args: ['selectedOption', { static: true }]
|
|
266
|
-
}], implicitDropdown: [{
|
|
267
|
-
type: ViewChild,
|
|
268
|
-
args: ['dropdown', { static: true }]
|
|
269
|
-
}], allowClear: [{
|
|
270
|
-
type: Input
|
|
271
|
-
}], tabIndex: [{
|
|
272
|
-
type: Input
|
|
273
|
-
}], markInvalid: [{
|
|
274
|
-
type: Input
|
|
275
|
-
}], queryInput: [{
|
|
276
|
-
type: ViewChild,
|
|
277
|
-
args: ['queryInput', { static: true }]
|
|
278
|
-
}] } });
|
|
279
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy11aS9jb21wb25lbnRzL3NpbmdsZS1zZWxlY3Qvc2luZ2xlLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy11aS9jb21wb25lbnRzL3NpbmdsZS1zZWxlY3Qvc2luZ2xlLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BHLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3hG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c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVxQyxVQUFVO3NCQUFwRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZ2V0LCBpbmNsdWRlcywgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaC9mcCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTZWxlY3REcm9wZG93bkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc2VsZWN0LWRyb3Bkb3duLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTZWxlY3RlZE9wdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc2VsZWN0ZWQtb3B0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBUlJPV19MRUZULCBBUlJPV19SSUdIVCwgQkFDS1NQQUNFLCBFU0NBUEUsIFRBQiB9IGZyb20gJy4uLy4uL2hlbHBlcnMva2V5LWNvZGVzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRLZXlib2FyZE5hdmlnYXRpb25FdmVudHMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2tleWJvYXJkLW5hdmlnYXRpb24uaGVscGVycyc7XG5pbXBvcnQgeyBCYXNlU2VsZWN0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Jhc2Utc2VsZWN0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3RQYWRkaW5nIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NpbmdsZS1zZWxlY3QtcGFkZGluZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQmFzaWNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2ljLWRyb3Bkb3duL2Jhc2ljLWRyb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBLZXlib2FyZFNlbGVjdEFjdGlvbiB9IGZyb20gJy4uL2tleWJvYXJkLXNlbGVjdC5kaXJlY3RpdmUnO1xuXG5leHBvcnQgdHlwZSBTaW5nbGVTZWxlY3RTaXplID0gJ2RlZmF1bHQnIHwgJ3NtYWxsJyB8ICdzZWxlY3QyJyB8ICdsYXJnZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2x4LXNpbmdsZS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJ3NpbmdsZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2luZ2xlLXNlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2luZ2xlU2VsZWN0Q29tcG9uZW50KVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTaW5nbGVTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBCYXNlU2VsZWN0RGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlTmV3Q3Vyc29yUG9zdGlvbk9uS2V5Ym9hcmROYXZpZ2F0aW9uKGN1cnNvclBvc2l0aW9uOiBudW1iZXIsIGtleUNvZGU6IG51bWJlcikge1xuICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgY2FzZSBBUlJPV19MRUZUOlxuICAgICAgICBjdXJzb3JQb3NpdGlvbi0tO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQVJST1dfUklHSFQ6XG4gICAgICAgIGN1cnNvclBvc2l0aW9uKys7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY3Vyc29yUG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEtleWJvYXJkU2VsZWN0QWN0aW9uKGN1cnNvclBvc2l0aW9uOiBudW1iZXIsIGtleUNvZGU6IG51bWJlcik6IEtleWJvYXJkU2VsZWN0QWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKGN1cnNvclBvc2l0aW9uIDw9IC0xICYmIGtleUNvZGUgPT09IEFSUk9XX1JJR0hUKSB7XG4gICAgICByZXR1cm4gS2V5Ym9hcmRTZWxlY3RBY3Rpb24uTkVYVDtcbiAgICB9XG4gICAgaWYgKGN1cnNvclBvc2l0aW9uID09PSAtMSAmJiBrZXlDb2RlID09PSBBUlJPV19MRUZUKSB7XG4gICAgICByZXR1cm4gS2V5Ym9hcmRTZWxlY3RBY3Rpb24uTEFTVDtcbiAgICB9XG4gICAgaWYgKGN1cnNvclBvc2l0aW9uIDwgLTEgJiYga2V5Q29kZSA9PT0gQVJST1dfTEVGVCkge1xuICAgICAgcmV0dXJuIEtleWJvYXJkU2VsZWN0QWN0aW9uLlBSRVY7XG4gICAgfVxuICAgIGlmIChjdXJzb3JQb3NpdGlvbiA8PSAtMSAmJiBrZXlDb2RlID09PSBCQUNLU1BBQ0UpIHtcbiAgICAgIHJldHVybiBLZXlib2FyZFNlbGVjdEFjdGlvbi5FWEVDVVRFO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNlbGVjdGlvbjogYW55O1xuICBASW5wdXQoKSBzZWxlY3Rpb25CYWNrZ3JvdW5kOiAnd2hpdGUnIHwgJ2dyYXknID0gJ3doaXRlJztcbiAgQElucHV0KCkgc2l6ZTogU2luZ2xlU2VsZWN0U2l6ZSA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgZHJvcGRvd25XaWR0aFNjYWxlOiAnMXgnIHwgJzEuNXgnIHwgJzJ4JyA9ICcxeCc7XG4gIEBJbnB1dCgpIHBhZGRpbmc/OiBTaW5nbGVTZWxlY3RQYWRkaW5nID0gJ2RlZmF1bHQnO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChTZWxlY3REcm9wZG93bkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pIGV4cGxpY2l0RHJvcGRvd24/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFNlbGVjdGVkT3B0aW9uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSkgZXhwbGljaXRTZWxlY3RlZE9wdGlvbj86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoQmFzaWNEcm9wZG93bkNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHByaXZhdGUgZHJvcGRvd25Db21wb25lbnQ/OiBCYXNpY0Ryb3Bkb3duQ29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkT3B0aW9uJywgeyBzdGF0aWM6IHRydWUgfSkgaW1wbGljaXRTZWxlY3RlZE9wdGlvbiE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJywgeyBzdGF0aWM6IHRydWUgfSkgaW1wbGljaXREcm9wZG93biE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9uVG1wbCgpIHtcbiAgICByZXR1cm4gdGhpcy5leHBsaWNpdFNlbGVjdGVkT3B0aW9uIHx8IHRoaXMuaW1wbGljaXRTZWxlY3RlZE9wdGlvbjtcbiAgfVxuXG4gIGdldCBkcm9wZG93blRtcGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwbGljaXREcm9wZG93biB8fCB0aGlzLmltcGxpY2l0RHJvcGRvd247XG4gIH1cblxuICBASW5wdXQoKSBhbGxvd0NsZWFyID0gdHJ1ZTtcbiAgQElucHV0KCkgdGFiSW5kZXg6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIG1hcmtJbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgncXVlcnlJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIHF1ZXJ5SW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIG92ZXJyaWRlIHJlYWRvbmx5IGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBpc0lucHV0Rm9jdXNlZFZpYVRhYiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCBjdXJzb3JTdHlsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuICdkZWZhdWx0JztcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWxsb3dRdWVyeSkge1xuICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdwb2ludGVyJztcbiAgICB9XG4gIH1cblxuICBnZXQgZHJvcGRvd25XaWR0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAodGhpcy5kcm9wZG93bldpZHRoU2NhbGUpIHtcbiAgICAgIGNhc2UgJzF4JzpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNhc2UgJzEuNXgnOlxuICAgICAgICByZXR1cm4gJzE1MCUnO1xuICAgICAgY2FzZSAnMngnOlxuICAgICAgICByZXR1cm4gJzIwMCUnO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0SW5wdXQoKSB7XG4gICAgdGhpcy5xdWVyeUNvbnRyb2wucmVzZXQoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIHRoaXMucXVlcnlJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBmb2N1c0FuZE9wZW4oKSB7XG4gICAgdGhpcy5xdWVyeUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB0aGlzLm9wZW4ubmV4dCh0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLm9wZW5cbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBmaWx0ZXIoKG9wZW4pID0+IG9wZW4gJiYgISF0aGlzLmRyb3Bkb3duQ29tcG9uZW50KSxcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuc2VsZWN0aW9uKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHNlbGVjdGlvbikgPT4ge1xuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRldGVybWluZUhpZ2hsaWdodEluZGV4KHRoaXMuZHJvcGRvd25Db21wb25lbnQhLm9wdGlvbnMsIHNlbGVjdGlvbiwgdGhpcy5kcm9wZG93bkNvbXBvbmVudCEuaXRlbUtleSk7XG4gICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Db21wb25lbnQhLnNlbGVjdChpbmRleCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RPcHRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RGaXJzdE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIGtleWJvYXJkIGV2ZW50IGhhbmRsaW5nXG4gICAgY29uc3Qgc291cmNlRWxlbWVudCA9IHRoaXMucXVlcnlJbnB1dC5uYXRpdmVFbGVtZW50O1xuICAgIC8vIGhhbmRsZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGZvciB0aGUgc2VsZWN0aW9uXG4gICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KHNvdXJjZUVsZW1lbnQsICdrZXlkb3duJylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGV2ZW50KSA9PiB0aGlzLm1hcFRvRXZlbnRTZXQoZXZlbnQsIHNvdXJjZUVsZW1lbnQsIHRoaXMudmlydHVhbEN1cnNvclBvc2l0aW9uKSksXG4gICAgICAgIHRhcCgoZXZlbnRTZXQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dRdWVyeSAmJiBldmVudFNldC5ldmVudC5rZXlDb2RlICE9PSBCQUNLU1BBQ0UpIHtcbiAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgY2hlY2sgZm9yIGV2ZW4uY29kZSBmb3IgdXNlckV2ZW50IEFQSSBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBpZiAoZXZlbnRTZXQuZXZlbnQua2V5Q29kZSAhPT0gVEFCICYmIGV2ZW50U2V0LmV2ZW50LmNvZGUgIT09ICdUYWInKSB7XG4gICAgICAgICAgICAgIC8vIGlmIHF1ZXJ5aW5nIGlzIGRpc2FibGVkLCBvbmx5IHRoZSB0YWIga2V5IHByZXNzIGV2ZW50IHdpbGwgYmUgcHJvcGFnYXRlZCwgc28gdGhhdCB5b3UgY2FuIHN0aWxsIGRlZm9jdXMuXG4gICAgICAgICAgICAgIGV2ZW50U2V0LmV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGV2ZW50U2V0LnZpcnR1YWxDdXJzb3JQb3NpdGlvbiA9PT0gMCAmJlxuICAgICAgICAgICAgZXZlbnRTZXQuaW5wdXRDdXJzb3JQb3NpdGlvbiA9PT0gMCAmJlxuICAgICAgICAgICAgZXZlbnRTZXQuZXZlbnQua2V5Q29kZSA9PT0gQkFDS1NQQUNFICYmXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy5hbGxvd0NsZWFyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgZXZlbnRTZXQuaW5wdXRDdXJzb3JQb3NpdGlvbiA9IHVuZGVmaW5lZDsgLy8gc2V0IHRvIG51bGwgdG8gcHJldmVudCBjb250aW51aW5nIGluIHRoZSBzdHJlYW1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBldmVudFNldC5pbnB1dEN1cnNvclBvc2l0aW9uID09PSAnbnVtYmVyJyAmJiBldmVudFNldC5pbnB1dEN1cnNvclBvc2l0aW9uID4gMCkge1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsQ3Vyc29yUG9zaXRpb24gPSAwO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRTZXQudmlydHVhbEN1cnNvclBvc2l0aW9uID09PSAtMSAmJiBldmVudFNldC5ldmVudC5rZXlDb2RlID09PSBBUlJPV19SSUdIVCkge1xuICAgICAgICAgICAgZXZlbnRTZXQuZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uS2V5Ym9hcmRTZWxlY3RBY3Rpb24kLm5leHQoS2V5Ym9hcmRTZWxlY3RBY3Rpb24uVU5TRUxFQ1QpO1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsQ3Vyc29yUG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgZXZlbnRTZXQuaW5wdXRDdXJzb3JQb3NpdGlvbiA9IHVuZGVmaW5lZDsgLy8gc2V0IHRvIG51bGwgdG8gcHJldmVudCBjb250aW51aW5nIGluIHRoZSBzdHJlYW1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBmaWx0ZXIoKGV2ZW50U2V0KSA9PiB0aGlzLmFsbG93UXVlcnkgJiYgZXZlbnRTZXQuaW5wdXRDdXJzb3JQb3NpdGlvbiA9PT0gMCksXG4gICAgICAgIG1hcCgoZXZlbnRTZXQpID0+IGV2ZW50U2V0LmV2ZW50KSxcbiAgICAgICAgZmlsdGVyKChldmVudCkgPT4gaW5jbHVkZXMoZXZlbnQua2V5Q29kZSwgW0FSUk9XX1JJR0hULCBBUlJPV19MRUZULCBCQUNLU1BBQ0VdKSksXG4gICAgICAgIG1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnZpcnR1YWxDdXJzb3JQb3NpdGlvbiA9IFNpbmdsZVNlbGVjdENvbXBvbmVudC5jYWxjdWxhdGVOZXdDdXJzb3JQb3N0aW9uT25LZXlib2FyZE5hdmlnYXRpb24oXG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxDdXJzb3JQb3NpdGlvbixcbiAgICAgICAgICAgIGV2ZW50LmtleUNvZGVcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJzb3JQb3NpdGlvbjogdGhpcy52aXJ0dWFsQ3Vyc29yUG9zaXRpb24sXG4gICAgICAgICAgICBldmVudFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgICBtYXAoKHBvc2l0aW9uU2V0KSA9PiB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uID0gU2luZ2xlU2VsZWN0Q29tcG9uZW50LmdldEtleWJvYXJkU2VsZWN0QWN0aW9uKHBvc2l0aW9uU2V0LmN1cnNvclBvc2l0aW9uLCBwb3NpdGlvblNldC5ldmVudC5rZXlDb2RlKTtcbiAgICAgICAgICBpZiAoYWN0aW9uID09PSBLZXlib2FyZFNlbGVjdEFjdGlvbi5ORVhUKSB7XG4gICAgICAgICAgICAvLyBwcmV2ZW50IGN1cnNvciBmcm9tIG1vdmluZyBpbiB0aGUgaW5wdXQgZmllbGQsIHdoaWxlIHdlIGFyZSBzdGlsbCBpbiB0aGUgc2VsZWN0aW9uIGl0ZW1zXG4gICAgICAgICAgICBwb3NpdGlvblNldC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5zZWxlY3Rpb25LZXlib2FyZFNlbGVjdEFjdGlvbiQpO1xuXG4gICAgY29uc3Qga2V5Ym9hcmRFdmVudHMgPSBnZXRLZXlib2FyZE5hdmlnYXRpb25FdmVudHMoc291cmNlRWxlbWVudCwgdGhpcy5kZXN0cm95ZWQkKTtcblxuICAgIGtleWJvYXJkRXZlbnRzLnZlcnRpY2FsTmF2aWdhdGlvbiQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcblxuICAgIGtleWJvYXJkRXZlbnRzLmNsb3NlJC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFICYmIHRoaXMuZHJvcGRvd25PcGVuKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcGVuLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAga2V5Ym9hcmRFdmVudHMuZHJvcGRvd25LZXlib2FyZEV2ZW50JC5zdWJzY3JpYmUodGhpcy5vcHRpb25zS2V5Ym9hcmRTZWxlY3RBY3Rpb24kKTtcblxuICAgIGtleWJvYXJkRXZlbnRzLmVudGVyJC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vcGVuLm5leHQoIXRoaXMuZHJvcGRvd25PcGVuKSk7XG4gICAga2V5Ym9hcmRFdmVudHMuc3BhY2UkLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLmFsbG93UXVlcnkpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZHJvcGRvd25PcGVuKSB7XG4gICAgICAgIHRoaXMub3B0aW9uc0tleWJvYXJkU2VsZWN0QWN0aW9uJC5uZXh0KEtleWJvYXJkU2VsZWN0QWN0aW9uLkVYRUNVVEUpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcGVuLm5leHQoIXRoaXMuZHJvcGRvd25PcGVuKTtcbiAgICB9KTtcblxuICAgIGtleWJvYXJkRXZlbnRzLm9wZW5PbkFycm93RG93biQuc3Vic2NyaWJlKCgpID0+IHRoaXMub3Blbi5uZXh0KHRydWUpKTtcbiAgfVxuXG4gIHNlbGVjdE9wdGlvbihvcHRpb246IGFueSkge1xuICAgIHRoaXMuc2VsZWN0aW9uID0gb3B0aW9uO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChvcHRpb24pO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKG9wdGlvbik7XG5cbiAgICB0aGlzLnJlc2V0U2VsZWN0U3RhdGUoKTtcblxuICAgIC8vIFRoaXMgdGltZW91dCBtYWtlcyBzdXJlIHRoYXQgdGhlIGRyb3Bkb3duIHdpbGwgYmUgY2xvc2VkIGF0IHRoZSBlbmRcbiAgICAvLyBvZiBhbGwgdGhlIGNhbGxiYWNrcyBpbiB0aGUgb3BlbiBzdWJzY3JpcHRpb25zLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vcGVuLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0aW9uKCkge1xuICAgIHRoaXMuc2VsZWN0aW9uID0gbnVsbDtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGlvbik7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5zZWxlY3Rpb24pO1xuXG4gICAgdGhpcy5yZXNldFNlbGVjdFN0YXRlKCk7XG4gIH1cblxuICBwcm9wYWdhdGVDaGFuZ2UoX3ZhbHVlOiBhbnkpIHt9XG5cbiAgd3JpdGVWYWx1ZShuZXdTZWxlY3Rpb246IGFueSkge1xuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoX2ZuOiBhbnkpIHt9XG5cbiAgZm9jdXNlZFZpYVRhYigpIHtcbiAgICB0aGlzLmlzSW5wdXRGb2N1c2VkVmlhVGFiID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lSGlnaGxpZ2h0SW5kZXgob3B0aW9uczogYW55W10sIHNlbGVjdGlvbjogYW55LCBpdGVtS2V5Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGl0ZW1LZXlcbiAgICAgID8gb3B0aW9ucy5maW5kSW5kZXgoKG9wdGlvbikgPT4gaXNFcXVhbChnZXQoaXRlbUtleSwgc2VsZWN0aW9uKSwgZ2V0KGl0ZW1LZXksIG9wdGlvbikpIHx8IGlzRXF1YWwoc2VsZWN0aW9uLCBnZXQoaXRlbUtleSwgb3B0aW9uKSkpXG4gICAgICA6IG9wdGlvbnMuZmluZEluZGV4KChvcHRpb24pID0+IGlzRXF1YWwoc2VsZWN0aW9uLCBvcHRpb24pKTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImRyb3Bkb3duT3BlblwiIGNsYXNzPVwiYmFja2Ryb3BcIiAoY2xpY2spPVwiaGFuZGxlQmFja2Ryb3BDbGljaygkZXZlbnQpXCI+PC9kaXY+XG48ZGl2XG4gIFtseE1hcmtJbnZhbGlkXT1cIm1hcmtJbnZhbGlkXCJcbiAgY2xhc3M9XCJzZWxlY3RDb250YWluZXIge3sgcGFkZGluZyB9fVBhZGRpbmdcIlxuICBbY2xhc3Mub3Blbl09XCJkcm9wZG93bk9wZW5cIlxuICBbY2xhc3MudG9wXT1cIihkcm9wZG93bkRpcmVjdGlvbiQgfCBhc3luYykgPT09ICdUT1AnXCJcbiAgW2NsYXNzLmJvdHRvbV09XCIoZHJvcGRvd25EaXJlY3Rpb24kIHwgYXN5bmMpID09PSAnQk9UVE9NJ1wiXG4gIFtjbGFzcy5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtjbGFzcy5ncmF5QmFja2dyb3VuZF09XCJzZWxlY3Rpb25CYWNrZ3JvdW5kID09PSAnZ3JheSdcIlxuICBbY2xhc3MuZGVmYXVsdFNpemVdPVwic2l6ZSA9PT0gJ2RlZmF1bHQnXCJcbiAgW2NsYXNzLnNtYWxsU2l6ZV09XCJzaXplID09PSAnc21hbGwnXCJcbiAgW2NsYXNzLnNlbGVjdDJTaXplXT1cInNpemUgPT09ICdzZWxlY3QyJ1wiXG4gIFtjbGFzcy5sYXJnZVNpemVdPVwic2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gIFtzdHlsZS5jdXJzb3JdPVwiY3Vyc29yU3R5bGVcIlxuICBbY2xhc3MuZm9jdXNlZF09XCJpc0lucHV0Rm9jdXNlZFwiXG4gIFtjbGFzcy5mb2N1c2VkVmlzaWJsZV09XCJpc0lucHV0Rm9jdXNlZFZpYVRhYlwiXG4gIChjbGljayk9XCJoYW5kbGVDbGljaygkZXZlbnQudGFyZ2V0ID09PSB0b2dnbGUpXCJcbj5cbiAgPGRpdiBjbGFzcz1cInNlbGVjdGlvbkNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dENvbnRhaW5lclwiPlxuICAgICAgPGRpdiAqbmdJZj1cIiFzZWxlY3Rpb24gJiYgc2VsZWN0aW9uICE9PSAwICYmICFxdWVyeUlucHV0Py52YWx1ZVwiIGNsYXNzPVwicGxhY2Vob2xkZXJcIiBbYXR0ci50aXRsZV09XCJwbGFjZWhvbGRlclwiPlxuICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiIWFsbG93UXVlcnkgfHwgIXF1ZXJ5SW5wdXQ/LnZhbHVlXCJcbiAgICAgICAgY2xhc3M9XCJzZWxlY3Rpb25cIlxuICAgICAgICBbY2xhc3MubG93ZXJPcGFjaXR5XT1cImFsbG93UXVlcnkgJiYgIXF1ZXJ5SW5wdXQ/LnZhbHVlICYmIGRyb3Bkb3duT3BlblwiXG4gICAgICAgIFtjbGFzcy5saWdodGdyYXlDb2xvcl09XCIhYWxsb3dRdWVyeSAmJiBkcm9wZG93bk9wZW5cIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmb2N1cygpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdGVkT3B0aW9uVG1wbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8aW5wdXRcbiAgICAgICAgI3F1ZXJ5SW5wdXRcbiAgICAgICAgY2xhc3M9XCJxdWVyeUlucHV0XCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbY2xhc3MuaXNIaWRkZW5dPVwiIWFsbG93UXVlcnlcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgIChmb2N1cyk9XCJpc0lucHV0Rm9jdXNlZCA9IHRydWVcIlxuICAgICAgICAoYmx1cik9XCJpc0lucHV0Rm9jdXNlZCA9IGZhbHNlOyBpc0lucHV0Rm9jdXNlZFZpYVRhYiA9IGZhbHNlOyBibHVyLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChrZXl1cC50YWIpPVwiZm9jdXNlZFZpYVRhYigpXCJcbiAgICAgICAgKGtleXVwLnNoaWZ0LnRhYik9XCJmb2N1c2VkVmlhVGFiKClcIlxuICAgICAgICBbdGFiSW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IHRhYkluZGV4XCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cInF1ZXJ5Q29udHJvbFwiXG4gICAgICAgIFtyZWFkT25seV09XCIhYWxsb3dRdWVyeVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpY29uQ29udGFpbmVyXCI+XG4gICAgICA8aSAqbmdJZj1cIihzZWxlY3Rpb24gfHwgc2VsZWN0aW9uID09PSAwKSAmJiBhbGxvd0NsZWFyICYmICFkaXNhYmxlZFwiIGNsYXNzPVwiZmFyIGZhLXRpbWVzXCIgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGlvbigpXCI+PC9pPlxuICAgICAgPGkgI3RvZ2dsZSBjbGFzcz1cImZhcyBmYS1hbmdsZS1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm9wdGlvbnNDb250YWluZXJcIiBbc3R5bGUud2lkdGhdPVwiZHJvcGRvd25XaWR0aFwiICNvcHRpb25zQ29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkcm9wZG93bk9wZW5cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93blRtcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNzZWxlY3RlZE9wdGlvbj5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLnNlbGVjdGVkT3B0aW9uXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd24+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIi5kcm9wZG93bkNvbXBvbmVudFwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { Directive, EventEmitter, HostListener, Input, Output, SecurityContext } from '@angular/core';
|
|
2
|
-
import { intersection, isNil } from 'lodash-es';
|
|
3
|
-
import { NbspPipe } from '../../core-ui/pipes/nbsp.pipe';
|
|
4
|
-
import { trimHtml } from '../../shared/html-helpers.function';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/platform-browser";
|
|
7
|
-
// First version based on https://stackoverflow.com/a/41253897/6813271
|
|
8
|
-
export class ContenteditableDirective {
|
|
9
|
-
constructor(elRef, sanitizer) {
|
|
10
|
-
this.elRef = elRef;
|
|
11
|
-
this.sanitizer = sanitizer;
|
|
12
|
-
this.lxContenteditableModelChange = new EventEmitter();
|
|
13
|
-
/** Allow (sanitized) html */
|
|
14
|
-
this.lxContenteditableHtml = false;
|
|
15
|
-
this.lxContenteditableHtmlPaste = true;
|
|
16
|
-
this.emittedValue = null;
|
|
17
|
-
}
|
|
18
|
-
ngOnChanges(changes) {
|
|
19
|
-
if (changes['lxContenteditableModel']) {
|
|
20
|
-
// On init: if lxContenteditableModel is empty, read from DOM in case the element has content
|
|
21
|
-
if (changes['lxContenteditableModel'].isFirstChange() && !this.lxContenteditableModel) {
|
|
22
|
-
// Prevent Exp.HasChanged: Don't read and emit value from DOM during change detection
|
|
23
|
-
setTimeout(() => {
|
|
24
|
-
this.onInput(true);
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
this.refreshView();
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
onInput(initialInlineData = false) {
|
|
31
|
-
let value = this.elRef.nativeElement[this.getProperty()];
|
|
32
|
-
value = this.cleanContent(value, initialInlineData);
|
|
33
|
-
this.emittedValue = value;
|
|
34
|
-
this.lxContenteditableModelChange.emit(value);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* @param event {ClipboardEvent}
|
|
38
|
-
*/
|
|
39
|
-
onPaste(event) {
|
|
40
|
-
const clipboardEvent = event;
|
|
41
|
-
this.onInput();
|
|
42
|
-
// For text-only contenteditable, remove pasted HTML.
|
|
43
|
-
if (!this.lxContenteditableHtml || !this.lxContenteditableHtmlPaste) {
|
|
44
|
-
let isHtml = true;
|
|
45
|
-
// TODO: Use beforepaste event. See https://www.lucidchart.com/techblog/2014/12/02/definitive-guide-copying-pasting-javascript/.
|
|
46
|
-
if (clipboardEvent.clipboardData && clipboardEvent.clipboardData.types) {
|
|
47
|
-
const types = [].slice.apply(clipboardEvent.clipboardData.types);
|
|
48
|
-
isHtml = intersection(types, ['text/html', 'com.apple.webarchive']).length > 0;
|
|
49
|
-
}
|
|
50
|
-
if (isHtml) {
|
|
51
|
-
// 1 tick wait is required for DOM update
|
|
52
|
-
setTimeout(() => {
|
|
53
|
-
// Cursor will be lost
|
|
54
|
-
// The lint disabling here should be clearified. See if and how this directive is needed.
|
|
55
|
-
this.elRef.nativeElement.innerHTML = this.sanitizer.sanitize(SecurityContext.HTML, this.elRef.nativeElement.innerText.replace(/\n/g, '<br />'));
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
onDrop(event) {
|
|
61
|
-
this.onInput();
|
|
62
|
-
// For text-only contenteditable, don't allow drop content.
|
|
63
|
-
if (!this.lxContenteditableHtml || !this.lxContenteditableHtmlPaste) {
|
|
64
|
-
event.preventDefault();
|
|
65
|
-
event.stopPropagation();
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
cleanContent(value, initialInlineData = false) {
|
|
71
|
-
if (this.lxContenteditableHtml === 'trim' || (this.lxContenteditableHtml && initialInlineData)) {
|
|
72
|
-
value = trimHtml(value);
|
|
73
|
-
}
|
|
74
|
-
else if (initialInlineData && !this.lxContenteditableHtml && value) {
|
|
75
|
-
value = value.replace(/^[\n\s]+/, '');
|
|
76
|
-
value = value.replace(/[\n\s]+$/, '');
|
|
77
|
-
}
|
|
78
|
-
// Some browsers like Chrome insert nbsp; when using contentEditable attribute
|
|
79
|
-
return new NbspPipe().transform(value);
|
|
80
|
-
}
|
|
81
|
-
refreshView() {
|
|
82
|
-
if (!isNil(this.lxContenteditableModel)) {
|
|
83
|
-
const newContent = this.cleanContent(this.lxContenteditableModel);
|
|
84
|
-
// Only refresh if content changed to avoid cursor loss
|
|
85
|
-
// (as ngOnChanges can be triggered an additional time by onInput())
|
|
86
|
-
if (this.emittedValue === null || this.emittedValue !== newContent) {
|
|
87
|
-
this.elRef.nativeElement[this.getProperty()] = this.sanitize(newContent);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
getProperty() {
|
|
92
|
-
return this.lxContenteditableHtml ? 'innerHTML' : 'innerText';
|
|
93
|
-
}
|
|
94
|
-
sanitize(content) {
|
|
95
|
-
return this.lxContenteditableHtml ? this.sanitizer.sanitize(SecurityContext.HTML, content) : content;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
ContenteditableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: ContenteditableDirective, deps: [{ token: i0.ElementRef }, { token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Directive });
|
|
99
|
-
ContenteditableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.1", type: ContenteditableDirective, selector: "[lxContenteditableModel]", inputs: { lxContenteditableModel: "lxContenteditableModel", lxContenteditableHtml: "lxContenteditableHtml", lxContenteditableHtmlPaste: "lxContenteditableHtmlPaste" }, outputs: { lxContenteditableModelChange: "lxContenteditableModelChange" }, host: { listeners: { "input": "onInput()", "blur": "onInput()", "keyup": "onInput()", "paste": "onPaste($event)", "drop": "onDrop($event)" } }, usesOnChanges: true, ngImport: i0 });
|
|
100
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: ContenteditableDirective, decorators: [{
|
|
101
|
-
type: Directive,
|
|
102
|
-
args: [{
|
|
103
|
-
selector: '[lxContenteditableModel]'
|
|
104
|
-
}]
|
|
105
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.DomSanitizer }]; }, propDecorators: { lxContenteditableModel: [{
|
|
106
|
-
type: Input
|
|
107
|
-
}], lxContenteditableModelChange: [{
|
|
108
|
-
type: Output
|
|
109
|
-
}], lxContenteditableHtml: [{
|
|
110
|
-
type: Input
|
|
111
|
-
}], lxContenteditableHtmlPaste: [{
|
|
112
|
-
type: Input
|
|
113
|
-
}], onInput: [{
|
|
114
|
-
type: HostListener,
|
|
115
|
-
args: ['input']
|
|
116
|
-
}, {
|
|
117
|
-
type: HostListener,
|
|
118
|
-
args: ['blur']
|
|
119
|
-
}, {
|
|
120
|
-
type: HostListener,
|
|
121
|
-
args: ['keyup']
|
|
122
|
-
}], onPaste: [{
|
|
123
|
-
type: HostListener,
|
|
124
|
-
args: ['paste', ['$event']]
|
|
125
|
-
}], onDrop: [{
|
|
126
|
-
type: HostListener,
|
|
127
|
-
args: ['drop', ['$event']]
|
|
128
|
-
}] } });
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudGVkaXRhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zLXVpL2RpcmVjdGl2ZXMvY29udGVudGVkaXRhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxlQUFlLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRTVJLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7OztBQUU5RCxzRUFBc0U7QUFJdEUsTUFBTSxPQUFPLHdCQUF3QjtJQVVuQyxZQUFvQixLQUE4QixFQUFVLFNBQXVCO1FBQS9ELFVBQUssR0FBTCxLQUFLLENBQXlCO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBYztRQVB6RSxpQ0FBNEIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3BFLDZCQUE2QjtRQUNwQiwwQkFBcUIsR0FBcUIsS0FBSyxDQUFDO1FBQ2hELCtCQUEwQixHQUFZLElBQUksQ0FBQztRQUU1QyxpQkFBWSxHQUFrQixJQUFJLENBQUM7SUFFMkMsQ0FBQztJQUV2RixXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsd0JBQXdCLENBQUMsRUFBRTtZQUNyQyw2RkFBNkY7WUFDN0YsSUFBSSxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDckYscUZBQXFGO2dCQUNyRixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FB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T0FBTztnQkFXYyxPQUFPO3NCQUF6QyxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF5QkMsTUFBTTtzQkFBdkMsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNlY3VyaXR5Q29udGV4dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBpbnRlcnNlY3Rpb24sIGlzTmlsIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IE5ic3BQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS11aS9waXBlcy9uYnNwLnBpcGUnO1xuaW1wb3J0IHsgdHJpbUh0bWwgfSBmcm9tICcuLi8uLi9zaGFyZWQvaHRtbC1oZWxwZXJzLmZ1bmN0aW9uJztcblxuLy8gRmlyc3QgdmVyc2lvbiBiYXNlZCBvbiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDEyNTM4OTcvNjgxMzI3MVxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2x4Q29udGVudGVkaXRhYmxlTW9kZWxdJ1xufSlcbmV4cG9ydCBjbGFzcyBDb250ZW50ZWRpdGFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiogTW9kZWwgKi9cbiAgQElucHV0KCkgbHhDb250ZW50ZWRpdGFibGVNb2RlbCE6IHN0cmluZztcbiAgQE91dHB1dCgpIGx4Q29udGVudGVkaXRhYmxlTW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEFsbG93IChzYW5pdGl6ZWQpIGh0bWwgKi9cbiAgQElucHV0KCkgbHhDb250ZW50ZWRpdGFibGVIdG1sOiBib29sZWFuIHwgJ3RyaW0nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGx4Q29udGVudGVkaXRhYmxlSHRtbFBhc3RlOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIGVtaXR0ZWRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydseENvbnRlbnRlZGl0YWJsZU1vZGVsJ10pIHtcbiAgICAgIC8vIE9uIGluaXQ6IGlmIGx4Q29udGVudGVkaXRhYmxlTW9kZWwgaXMgZW1wdHksIHJlYWQgZnJvbSBET00gaW4gY2FzZSB0aGUgZWxlbWVudCBoYXMgY29udGVudFxuICAgICAgaWYgKGNoYW5nZXNbJ2x4Q29udGVudGVkaXRhYmxlTW9kZWwnXS5pc0ZpcnN0Q2hhbmdlKCkgJiYgIXRoaXMubHhDb250ZW50ZWRpdGFibGVNb2RlbCkge1xuICAgICAgICAvLyBQcmV2ZW50IEV4cC5IYXNDaGFuZ2VkOiBEb24ndCByZWFkIGFuZCBlbWl0IHZhbHVlIGZyb20gRE9NIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25JbnB1dCh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnKVxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgQEhvc3RMaXN0ZW5lcigna2V5dXAnKVxuICBvbklucHV0KGluaXRpYWxJbmxpbmVEYXRhID0gZmFsc2UpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnRbdGhpcy5nZXRQcm9wZXJ0eSgpXSBhcyBzdHJpbmc7XG4gICAgdmFsdWUgPSB0aGlzLmNsZWFuQ29udGVudCh2YWx1ZSwgaW5pdGlhbElubGluZURhdGEpO1xuICAgIHRoaXMuZW1pdHRlZFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5seENvbnRlbnRlZGl0YWJsZU1vZGVsQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBldmVudCB7Q2xpcGJvYXJkRXZlbnR9XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pIG9uUGFzdGUoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGNsaXBib2FyZEV2ZW50ID0gZXZlbnQgYXMgQ2xpcGJvYXJkRXZlbnQ7XG4gICAgdGhpcy5vbklucHV0KCk7XG4gICAgLy8gRm9yIHRleHQtb25seSBjb250ZW50ZWRpdGFibGUsIHJlbW92ZSBwYXN0ZWQgSFRNTC5cbiAgICBpZiAoIXRoaXMubHhDb250ZW50ZWRpdGFibGVIdG1sIHx8ICF0aGlzLmx4Q29udGVudGVkaXRhYmxlSHRtbFBhc3RlKSB7XG4gICAgICBsZXQgaXNIdG1sOiBib29sZWFuID0gdHJ1ZTtcbiAgICAgIC8vIFRPRE86IFVzZSBiZWZvcmVwYXN0ZSBldmVudC4gU2VlIGh0dHBzOi8vd3d3Lmx1Y2lkY2hhcnQuY29tL3RlY2hibG9nLzIwMTQvMTIvMDIvZGVmaW5pdGl2ZS1ndWlkZS1jb3B5aW5nLXBhc3RpbmctamF2YXNjcmlwdC8uXG4gICAgICBpZiAoY2xpcGJvYXJkRXZlbnQuY2xpcGJvYXJkRGF0YSAmJiBjbGlwYm9hcmRFdmVudC5jbGlwYm9hcmREYXRhLnR5cGVzKSB7XG4gICAgICAgIGNvbnN0IHR5cGVzID0gW10uc2xpY2UuYXBwbHkoY2xpcGJvYXJkRXZlbnQuY2xpcGJvYXJkRGF0YS50eXBlcyk7XG4gICAgICAgIGlzSHRtbCA9IGludGVyc2VjdGlvbih0eXBlcywgWyd0ZXh0L2h0bWwnLCAnY29tLmFwcGxlLndlYmFyY2hpdmUnXSkubGVuZ3RoID4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0h0bWwpIHtcbiAgICAgICAgLy8gMSB0aWNrIHdhaXQgaXMgcmVxdWlyZWQgZm9yIERPTSB1cGRhdGVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gQ3Vyc29yIHdpbGwgYmUgbG9zdFxuICAgICAgICAgIC8vIFRoZSBsaW50IGRpc2FibGluZyBoZXJlIHNob3VsZCBiZSBjbGVhcmlmaWVkLiBTZWUgaWYgYW5kIGhvdyB0aGlzIGRpcmVjdGl2ZSBpcyBuZWVkZWQuXG4gICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFxuICAgICAgICAgICAgU2VjdXJpdHlDb250ZXh0LkhUTUwsXG4gICAgICAgICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuaW5uZXJUZXh0LnJlcGxhY2UoL1xcbi9nLCAnPGJyIC8+JylcbiAgICAgICAgICApITtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pIG9uRHJvcChldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMub25JbnB1dCgpO1xuICAgIC8vIEZvciB0ZXh0LW9ubHkgY29udGVudGVkaXRhYmxlLCBkb24ndCBhbGxvdyBkcm9wIGNvbnRlbnQuXG4gICAgaWYgKCF0aGlzLmx4Q29udGVudGVkaXRhYmxlSHRtbCB8fCAhdGhpcy5seENvbnRlbnRlZGl0YWJsZUh0bWxQYXN0ZSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5Db250ZW50KHZhbHVlOiBzdHJpbmcsIGluaXRpYWxJbmxpbmVEYXRhID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmx4Q29udGVudGVkaXRhYmxlSHRtbCA9PT0gJ3RyaW0nIHx8ICh0aGlzLmx4Q29udGVudGVkaXRhYmxlSHRtbCAmJiBpbml0aWFsSW5saW5lRGF0YSkpIHtcbiAgICAgIHZhbHVlID0gdHJpbUh0bWwodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaW5pdGlhbElubGluZURhdGEgJiYgIXRoaXMubHhDb250ZW50ZWRpdGFibGVIdG1sICYmIHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15bXFxuXFxzXSsvLCAnJyk7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1tcXG5cXHNdKyQvLCAnJyk7XG4gICAgfVxuICAgIC8vIFNvbWUgYnJvd3NlcnMgbGlrZSBDaHJvbWUgaW5zZXJ0IG5ic3A7IHdoZW4gdXNpbmcgY29udGVudEVkaXRhYmxlIGF0dHJpYnV0ZVxuICAgIHJldHVybiBuZXcgTmJzcFBpcGUoKS50cmFuc2Zvcm0odmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlldygpIHtcbiAgICBpZiAoIWlzTmlsKHRoaXMubHhDb250ZW50ZWRpdGFibGVNb2RlbCkpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSB0aGlzLmNsZWFuQ29udGVudCh0aGlzLmx4Q29udGVudGVkaXRhYmxlTW9kZWwpO1xuICAgICAgLy8gT25seSByZWZyZXNoIGlmIGNvbnRlbnQgY2hhbmdlZCB0byBhdm9pZCBjdXJzb3IgbG9zc1xuICAgICAgLy8gKGFzIG5nT25DaGFuZ2VzIGNhbiBiZSB0cmlnZ2VyZWQgYW4gYWRkaXRpb25hbCB0aW1lIGJ5IG9uSW5wdXQoKSlcbiAgICAgIGlmICh0aGlzLmVtaXR0ZWRWYWx1ZSA9PT0gbnVsbCB8fCB0aGlzLmVtaXR0ZWRWYWx1ZSAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnRbdGhpcy5nZXRQcm9wZXJ0eSgpXSA9IHRoaXMuc2FuaXRpemUobmV3Q29udGVudCkhO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJvcGVydHkoKTogJ2lubmVySFRNTCcgfCAnaW5uZXJUZXh0JyB7XG4gICAgcmV0dXJuIHRoaXMubHhDb250ZW50ZWRpdGFibGVIdG1sID8gJ2lubmVySFRNTCcgOiAnaW5uZXJUZXh0JztcbiAgfVxuXG4gIHByaXZhdGUgc2FuaXRpemUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubHhDb250ZW50ZWRpdGFibGVIdG1sID8gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIGNvbnRlbnQpIDogY29udGVudDtcbiAgfVxufVxuIl19
|