novo-elements 5.1.1 → 5.2.3
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/README.md +7 -7
- package/bundles/novo-elements.umd.js +42693 -42665
- package/bundles/novo-elements.umd.js.map +1 -1
- package/bundles/novo-elements.umd.min.js +2 -2
- package/bundles/novo-elements.umd.min.js.map +1 -1
- package/elements/ace-editor/AceEditor.d.ts +37 -37
- package/elements/ace-editor/AceEditor.module.d.ts +2 -2
- package/elements/ace-editor/AceEditor.scss +5 -0
- package/elements/button/Button.d.ts +9 -9
- package/elements/button/Button.module.d.ts +2 -2
- package/elements/button/Button.scss +397 -0
- package/elements/calendar/Calendar.module.d.ts +2 -2
- package/elements/calendar/common/CalendarDateChange.d.ts +25 -25
- package/elements/calendar/common/CalendarDateChange.scss +23 -0
- package/elements/calendar/common/EventTypeLegend.d.ts +7 -7
- package/elements/calendar/day/CalendarAllDayEvent.d.ts +7 -7
- package/elements/calendar/day/CalendarDayEvent.d.ts +8 -8
- package/elements/calendar/day/CalendarDayView.d.ts +148 -148
- package/elements/calendar/day/CalendarDayView.scss +97 -0
- package/elements/calendar/day/CalendarHourSegment.d.ts +7 -7
- package/elements/calendar/month/CalendarMonthDay.d.ts +14 -14
- package/elements/calendar/month/CalendarMonthHeader.d.ts +14 -14
- package/elements/calendar/month/CalendarMonthView.d.ts +110 -110
- package/elements/calendar/month/CalendarMonthView.scss +169 -0
- package/elements/calendar/pipe/DayOfMonth.pipe.d.ts +6 -6
- package/elements/calendar/pipe/EndOfWeekDisplayPipe.pipe.d.ts +6 -6
- package/elements/calendar/pipe/Hours.pipe.d.ts +6 -6
- package/elements/calendar/pipe/Month.pipe.d.ts +6 -6
- package/elements/calendar/pipe/MonthDay.pipe.d.ts +6 -6
- package/elements/calendar/pipe/Weekday.pipe.d.ts +6 -6
- package/elements/calendar/pipe/Year.pipe.d.ts +6 -6
- package/elements/calendar/week/CalendarWeekEvent.d.ts +8 -8
- package/elements/calendar/week/CalendarWeekHeader.d.ts +14 -14
- package/elements/calendar/week/CalendarWeekView.d.ts +156 -156
- package/elements/calendar/week/CalendarWeekView.scss +86 -0
- package/elements/card/Card.d.ts +28 -28
- package/elements/card/Card.module.d.ts +2 -2
- package/elements/card/Card.scss +104 -0
- package/elements/category-dropdown/CategoryDropdown.d.ts +29 -29
- package/elements/category-dropdown/CategoryDropdown.module.d.ts +2 -2
- package/elements/category-dropdown/CategoryDropdown.scss +157 -0
- package/elements/chips/Chips.d.ts +78 -78
- package/elements/chips/Chips.module.d.ts +2 -2
- package/elements/chips/Chips.scss +373 -0
- package/elements/chips/RowChips.d.ts +12 -12
- package/elements/ckeditor/CKEditor.d.ts +44 -44
- package/elements/ckeditor/CKEditor.module.d.ts +2 -2
- package/elements/ckeditor/CKEditor.scss +37 -0
- package/elements/common/common.module.d.ts +2 -2
- package/elements/common/novo-template/novo-template.directive.d.ts +8 -8
- package/elements/data-table/ListInteractionTypes.d.ts +10 -10
- package/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.d.ts +15 -15
- package/elements/data-table/cell-headers/data-table-expand-header-cell.component.d.ts +13 -13
- package/elements/data-table/cell-headers/data-table-header-cell.component.d.ts +81 -81
- package/elements/data-table/cell-headers/data-table-header-cell.directive.d.ts +11 -11
- package/elements/data-table/cells/data-table-cell.component.d.ts +17 -17
- package/elements/data-table/cells/data-table-checkbox-cell.component.d.ts +17 -17
- package/elements/data-table/cells/data-table-expand-cell.component.d.ts +16 -16
- package/elements/data-table/data-table-clear-button.component.d.ts +15 -15
- package/elements/data-table/data-table-expand.directive.d.ts +18 -18
- package/elements/data-table/data-table.component.d.ts +99 -99
- package/elements/data-table/data-table.component.scss +753 -0
- package/elements/data-table/data-table.module.d.ts +2 -2
- package/elements/data-table/data-table.pipes.d.ts +37 -37
- package/elements/data-table/data-table.source.d.ts +22 -22
- package/elements/data-table/interfaces.d.ts +128 -128
- package/elements/data-table/pagination/data-table-pagination.component.d.ts +52 -52
- package/elements/data-table/rows/data-table-header-row.component.d.ts +6 -6
- package/elements/data-table/rows/data-table-row.component.d.ts +7 -7
- package/elements/data-table/services/data-table-filter-utils.d.ts +3 -3
- package/elements/data-table/services/remote-data-table.service.d.ts +8 -8
- package/elements/data-table/services/static-data-table.service.d.ts +12 -12
- package/elements/data-table/sort-filter/sort-filter.directive.d.ts +8 -8
- package/elements/data-table/state/data-table-state.service.d.ts +32 -32
- package/elements/date-picker/DatePicker.d.ts +79 -79
- package/elements/date-picker/DatePicker.module.d.ts +2 -2
- package/elements/date-picker/DatePicker.scss +414 -0
- package/elements/date-picker/DatePickerInput.d.ts +66 -66
- package/elements/date-time-picker/DateTimePicker.d.ts +45 -45
- package/elements/date-time-picker/DateTimePicker.module.d.ts +2 -2
- package/elements/date-time-picker/DateTimePickerInput.d.ts +46 -46
- package/elements/date-time-picker/_DateTimePicker.scss +93 -0
- package/elements/dragula/Dragula.d.ts +13 -13
- package/elements/dragula/Dragula.module.d.ts +2 -2
- package/elements/dragula/Dragula.scss +18 -0
- package/elements/dragula/DragulaService.d.ts +23 -23
- package/elements/dropdown/Dropdown.d.ts +55 -55
- package/elements/dropdown/Dropdown.module.d.ts +2 -2
- package/elements/dropdown/Dropdown.scss +94 -0
- package/elements/expansion/_expansion-theme.scss +50 -0
- package/elements/expansion/accordion.d.ts +21 -21
- package/elements/expansion/expansion-animations.d.ts +9 -9
- package/elements/expansion/expansion-panel-content.d.ts +9 -9
- package/elements/expansion/expansion-panel-header.d.ts +45 -45
- package/elements/expansion/expansion-panel-header.scss +58 -0
- package/elements/expansion/expansion-panel.d.ts +54 -54
- package/elements/expansion/expansion-panel.scss +68 -0
- package/elements/expansion/expansion.module.d.ts +2 -2
- package/elements/form/Control.d.ts +107 -107
- package/elements/form/ControlGroup.d.ts +89 -83
- package/elements/form/ControlGroup.scss +147 -0
- package/elements/form/ControlTemplates.d.ts +9 -9
- package/elements/form/DynamicForm.d.ts +46 -46
- package/elements/form/FieldInteractionApi.d.ts +160 -160
- package/elements/form/FieldInteractionApiTypes.d.ts +29 -29
- package/elements/form/FieldInteractionModals.d.ts +16 -16
- package/elements/form/Form.d.ts +21 -21
- package/elements/form/Form.module.d.ts +2 -2
- package/elements/form/Form.scss +857 -0
- package/elements/form/FormControls.d.ts +22 -22
- package/elements/form/FormInterfaces.d.ts +36 -36
- package/elements/form/FormValidators.d.ts +22 -22
- package/elements/form/NovoFormControl.d.ts +100 -100
- package/elements/form/NovoFormGroup.d.ts +17 -17
- package/elements/form/controls/BaseControl.d.ts +106 -106
- package/elements/form/controls/ControlFactory.d.ts +4 -4
- package/elements/form/controls/ace-editor/AceEditorControl.d.ts +5 -5
- package/elements/form/controls/address/AddressControl.d.ts +5 -5
- package/elements/form/controls/check-list/CheckListControl.d.ts +5 -5
- package/elements/form/controls/checkbox/CheckboxControl.d.ts +5 -5
- package/elements/form/controls/custom/CustomControl.d.ts +5 -5
- package/elements/form/controls/date/DateControl.d.ts +5 -5
- package/elements/form/controls/date-time/DateTimeControl.d.ts +5 -5
- package/elements/form/controls/editor/EditorControl.d.ts +6 -6
- package/elements/form/controls/file/FileControl.d.ts +5 -5
- package/elements/form/controls/grouped/GroupedControl.d.ts +6 -6
- package/elements/form/controls/index.d.ts +19 -19
- package/elements/form/controls/native-select/NativeSelectControl.d.ts +6 -6
- package/elements/form/controls/picker/PickerControl.d.ts +9 -9
- package/elements/form/controls/quick-note/QuickNoteControl.d.ts +6 -6
- package/elements/form/controls/radio/RadioControl.d.ts +6 -6
- package/elements/form/controls/read-only/ReadOnlyControl.d.ts +5 -5
- package/elements/form/controls/select/SelectControl.d.ts +6 -6
- package/elements/form/controls/text-area/TextAreaControl.d.ts +5 -5
- package/elements/form/controls/textbox/TextBoxControl.d.ts +9 -9
- package/elements/form/controls/tiles/TilesControl.d.ts +6 -6
- package/elements/form/controls/time/TimeControl.d.ts +5 -5
- package/elements/form/extras/FormExtras.module.d.ts +2 -2
- package/elements/form/extras/address/Address.d.ts +65 -65
- package/elements/form/extras/address/Address.scss +152 -0
- package/elements/form/extras/checkbox/CheckList.d.ts +20 -20
- package/elements/form/extras/checkbox/Checkbox.d.ts +24 -24
- package/elements/form/extras/checkbox/Checkbox.scss +87 -0
- package/elements/form/extras/file/FileInput.d.ts +72 -72
- package/elements/form/extras/file/FileInput.scss +118 -0
- package/elements/form/extras/file/extras/file/File.d.ts +22 -22
- package/elements/header/Header.d.ts +22 -22
- package/elements/header/Header.module.d.ts +2 -2
- package/elements/header/Header.scss +96 -0
- package/elements/icon/Icon.d.ts +18 -18
- package/elements/icon/Icon.module.d.ts +2 -2
- package/elements/icon/Icon.scss +82 -0
- package/elements/list/List.d.ts +31 -31
- package/elements/list/List.module.d.ts +2 -2
- package/elements/list/List.scss +134 -0
- package/elements/loading/Loading.d.ts +26 -26
- package/elements/loading/Loading.module.d.ts +2 -2
- package/elements/loading/Loading.scss +56 -0
- package/elements/loading/NovoSpinner.scss +172 -0
- package/elements/modal/Modal.d.ts +45 -45
- package/elements/modal/Modal.module.d.ts +2 -2
- package/elements/modal/Modal.scss +207 -0
- package/elements/modal/ModalService.d.ts +10 -10
- package/elements/multi-picker/MultiPicker.d.ts +107 -107
- package/elements/multi-picker/MultiPicker.module.d.ts +2 -2
- package/elements/multi-picker/_MultiPicker.scss +74 -0
- package/elements/overlay/Overlay.d.ts +57 -57
- package/elements/overlay/Overlay.module.d.ts +2 -2
- package/elements/picker/Picker.d.ts +69 -69
- package/elements/picker/Picker.module.d.ts +2 -2
- package/elements/picker/Picker.scss +438 -0
- package/elements/picker/extras/base-picker-results/BasePickerResults.d.ts +91 -91
- package/elements/picker/extras/checklist-picker-results/ChecklistPickerResults.d.ts +21 -21
- package/elements/picker/extras/distributionlist-picker-results/DistributionListPickerResults.d.ts +13 -13
- package/elements/picker/extras/entity-picker-results/EntityPickerResults.d.ts +29 -29
- package/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.d.ts +42 -42
- package/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.scss +136 -0
- package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.d.ts +43 -43
- package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.scss +156 -0
- package/elements/picker/extras/picker-results/PickerResults.d.ts +11 -11
- package/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.d.ts +21 -21
- package/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.scss +65 -0
- package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.d.ts +13 -13
- package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.scss +0 -0
- package/elements/places/places.component.d.ts +71 -71
- package/elements/places/places.component.scss +26 -0
- package/elements/places/places.module.d.ts +2 -2
- package/elements/places/places.service.d.ts +22 -22
- package/elements/popover/PopOver.d.ts +30 -30
- package/elements/popover/PopOver.module.d.ts +2 -2
- package/elements/popover/PopOver.scss +179 -0
- package/elements/popover/PopOverContent.d.ts +45 -45
- package/elements/quick-note/QuickNote.d.ts +139 -139
- package/elements/quick-note/QuickNote.module.d.ts +2 -2
- package/elements/quick-note/QuickNote.scss +52 -0
- package/elements/quick-note/extras/quick-note-results/QuickNoteResults.d.ts +30 -30
- package/elements/radio/Radio.d.ts +26 -26
- package/elements/radio/Radio.module.d.ts +2 -2
- package/elements/radio/Radio.scss +94 -0
- package/elements/search/SearchBox.d.ts +59 -59
- package/elements/search/SearchBox.module.d.ts +2 -2
- package/elements/search/SearchBox.scss +67 -0
- package/elements/select/Select.d.ts +62 -62
- package/elements/select/Select.module.d.ts +2 -2
- package/elements/select/Select.scss +226 -0
- package/elements/simple-table/activity-table-renderers.d.ts +4 -4
- package/elements/simple-table/cell-header.d.ts +62 -62
- package/elements/simple-table/cell.d.ts +73 -73
- package/elements/simple-table/interfaces.d.ts +81 -81
- package/elements/simple-table/pagination.d.ts +37 -37
- package/elements/simple-table/row.d.ts +20 -20
- package/elements/simple-table/simple-table.module.d.ts +2 -2
- package/elements/simple-table/sort.d.ts +20 -20
- package/elements/simple-table/state.d.ts +22 -22
- package/elements/simple-table/table-source.d.ts +62 -62
- package/elements/simple-table/table.d.ts +59 -59
- package/elements/simple-table/table.scss +344 -0
- package/elements/slider/Slider.d.ts +18 -18
- package/elements/slider/Slider.module.d.ts +2 -2
- package/elements/slider/Slider.scss +89 -0
- package/elements/stepper/step-header.component.d.ts +45 -45
- package/elements/stepper/step-header.component.scss +78 -0
- package/elements/stepper/step-label.component.d.ts +5 -5
- package/elements/stepper/step-status.component.d.ts +6 -6
- package/elements/stepper/stepper.animations.d.ts +6 -6
- package/elements/stepper/stepper.component.d.ts +39 -39
- package/elements/stepper/stepper.component.scss +200 -0
- package/elements/stepper/stepper.module.d.ts +2 -2
- package/elements/switch/Switch.d.ts +19 -19
- package/elements/switch/Switch.module.d.ts +2 -2
- package/elements/switch/Switch.scss +143 -0
- package/elements/tabbed-group-picker/TabbedGroupPicker.d.ts +122 -122
- package/elements/tabbed-group-picker/TabbedGroupPicker.module.d.ts +2 -2
- package/elements/tabbed-group-picker/TabbedGroupPicker.scss +186 -0
- package/elements/table/Table.d.ts +184 -184
- package/elements/table/Table.module.d.ts +2 -2
- package/elements/table/Table.scss +585 -0
- package/elements/table/extras/TableExtras.module.d.ts +2 -2
- package/elements/table/extras/base-renderer/BaseRenderer.d.ts +5 -5
- package/elements/table/extras/date-cell/DateCell.d.ts +8 -8
- package/elements/table/extras/dropdown-cell/DropdownCell.d.ts +17 -17
- package/elements/table/extras/dropdown-cell/DropdownCell.scss +58 -0
- package/elements/table/extras/keep-filter-focus/KeepFilterFocus.d.ts +6 -6
- package/elements/table/extras/pagination/Pagination.d.ts +39 -39
- package/elements/table/extras/pagination/Pagination.scss +62 -0
- package/elements/table/extras/percentage-cell/PercentageCell.d.ts +3 -3
- package/elements/table/extras/row-details/RowDetails.d.ts +12 -12
- package/elements/table/extras/table-actions/TableActions.d.ts +2 -2
- package/elements/table/extras/table-cell/TableCell.d.ts +18 -18
- package/elements/table/extras/table-filter/TableFilter.d.ts +13 -13
- package/elements/table/extras/table-footer/TableFooter.d.ts +2 -2
- package/elements/table/extras/table-header/TableHeader.d.ts +2 -2
- package/elements/table/extras/th-orderable/ThOrderable.d.ts +30 -30
- package/elements/table/extras/th-sortable/ThSortable.d.ts +7 -7
- package/elements/tabs/Tabs.d.ts +49 -49
- package/elements/tabs/Tabs.module.d.ts +2 -2
- package/elements/tabs/Tabs.scss +287 -0
- package/elements/tiles/Tiles.d.ts +30 -30
- package/elements/tiles/Tiles.module.d.ts +2 -2
- package/elements/tiles/Tiles.scss +68 -0
- package/elements/time-picker/TimePicker.d.ts +38 -38
- package/elements/time-picker/TimePicker.module.d.ts +2 -2
- package/elements/time-picker/TimePicker.scss +388 -0
- package/elements/time-picker/TimePickerInput.d.ts +52 -52
- package/elements/tip-well/TipWell.d.ts +23 -23
- package/elements/tip-well/TipWell.module.d.ts +2 -2
- package/elements/tip-well/TipWell.scss +31 -0
- package/elements/toast/Toast.d.ts +28 -28
- package/elements/toast/Toast.module.d.ts +2 -2
- package/elements/toast/Toast.scss +413 -0
- package/elements/toast/ToastService.d.ts +40 -40
- package/elements/tooltip/Tooltip.component.d.ts +12 -11
- package/elements/tooltip/Tooltip.directive.d.ts +35 -34
- package/elements/tooltip/Tooltip.module.d.ts +2 -2
- package/elements/tooltip/Tooltip.scss +216 -0
- package/elements/unless/Unless.d.ts +12 -12
- package/elements/unless/Unless.module.d.ts +2 -2
- package/elements/value/EntityList.d.ts +13 -13
- package/elements/value/Render.d.ts +66 -66
- package/elements/value/Value.d.ts +40 -40
- package/elements/value/Value.module.d.ts +2 -2
- package/elements/value/Value.scss +57 -0
- package/elements/value/Values.scss +57 -0
- package/esm2015/elements/ace-editor/AceEditor.js +126 -126
- package/esm2015/elements/ace-editor/AceEditor.module.js +15 -15
- package/esm2015/elements/button/Button.js +74 -74
- package/esm2015/elements/button/Button.module.js +15 -15
- package/esm2015/elements/calendar/Calendar.module.js +81 -81
- package/esm2015/elements/calendar/common/CalendarDateChange.js +60 -60
- package/esm2015/elements/calendar/common/EventTypeLegend.js +32 -32
- package/esm2015/elements/calendar/day/CalendarAllDayEvent.js +40 -40
- package/esm2015/elements/calendar/day/CalendarDayEvent.js +41 -41
- package/esm2015/elements/calendar/day/CalendarDayView.js +302 -302
- package/esm2015/elements/calendar/day/CalendarHourSegment.js +34 -34
- package/esm2015/elements/calendar/month/CalendarMonthDay.js +87 -87
- package/esm2015/elements/calendar/month/CalendarMonthHeader.js +55 -55
- package/esm2015/elements/calendar/month/CalendarMonthView.js +171 -171
- package/esm2015/elements/calendar/pipe/DayOfMonth.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/EndOfWeekDisplayPipe.pipe.js +19 -19
- package/esm2015/elements/calendar/pipe/Hours.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/Month.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/MonthDay.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/Weekday.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/Year.pipe.js +16 -16
- package/esm2015/elements/calendar/week/CalendarWeekEvent.js +38 -38
- package/esm2015/elements/calendar/week/CalendarWeekHeader.js +46 -46
- package/esm2015/elements/calendar/week/CalendarWeekView.js +311 -311
- package/esm2015/elements/card/Card.js +104 -104
- package/esm2015/elements/card/Card.module.js +18 -18
- package/esm2015/elements/category-dropdown/CategoryDropdown.js +159 -159
- package/esm2015/elements/category-dropdown/CategoryDropdown.module.js +17 -17
- package/esm2015/elements/chips/Chips.js +356 -356
- package/esm2015/elements/chips/Chips.module.js +18 -18
- package/esm2015/elements/chips/RowChips.js +86 -86
- package/esm2015/elements/ckeditor/CKEditor.js +237 -237
- package/esm2015/elements/ckeditor/CKEditor.module.js +16 -16
- package/esm2015/elements/common/common.module.js +13 -13
- package/esm2015/elements/common/novo-template/novo-template.directive.js +22 -22
- package/esm2015/elements/data-table/ListInteractionTypes.js +1 -1
- package/esm2015/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.js +73 -73
- package/esm2015/elements/data-table/cell-headers/data-table-expand-header-cell.component.js +47 -47
- package/esm2015/elements/data-table/cell-headers/data-table-header-cell.component.js +501 -501
- package/esm2015/elements/data-table/cell-headers/data-table-header-cell.directive.js +35 -35
- package/esm2015/elements/data-table/cells/data-table-cell.component.js +62 -62
- package/esm2015/elements/data-table/cells/data-table-checkbox-cell.component.js +65 -65
- package/esm2015/elements/data-table/cells/data-table-expand-cell.component.js +52 -52
- package/esm2015/elements/data-table/data-table-clear-button.component.js +54 -54
- package/esm2015/elements/data-table/data-table-expand.directive.js +57 -57
- package/esm2015/elements/data-table/data-table.component.js +665 -665
- package/esm2015/elements/data-table/data-table.module.js +87 -87
- package/esm2015/elements/data-table/data-table.pipes.js +150 -150
- package/esm2015/elements/data-table/data-table.source.js +62 -62
- package/esm2015/elements/data-table/interfaces.js +1 -1
- package/esm2015/elements/data-table/pagination/data-table-pagination.component.js +249 -249
- package/esm2015/elements/data-table/rows/data-table-header-row.component.js +23 -23
- package/esm2015/elements/data-table/rows/data-table-row.component.js +23 -23
- package/esm2015/elements/data-table/services/data-table-filter-utils.js +35 -35
- package/esm2015/elements/data-table/services/remote-data-table.service.js +3 -3
- package/esm2015/elements/data-table/services/static-data-table.service.js +48 -48
- package/esm2015/elements/data-table/sort-filter/sort-filter.directive.js +57 -57
- package/esm2015/elements/data-table/state/data-table-state.service.js +116 -116
- package/esm2015/elements/date-picker/DatePicker.js +493 -493
- package/esm2015/elements/date-picker/DatePicker.module.js +20 -20
- package/esm2015/elements/date-picker/DatePickerInput.js +255 -255
- package/esm2015/elements/date-time-picker/DateTimePicker.js +195 -195
- package/esm2015/elements/date-time-picker/DateTimePicker.module.js +22 -22
- package/esm2015/elements/date-time-picker/DateTimePickerInput.js +151 -151
- package/esm2015/elements/dragula/Dragula.js +66 -66
- package/esm2015/elements/dragula/Dragula.module.js +13 -13
- package/esm2015/elements/dragula/DragulaService.js +117 -117
- package/esm2015/elements/dropdown/Dropdown.js +284 -284
- package/esm2015/elements/dropdown/Dropdown.module.js +15 -15
- package/esm2015/elements/expansion/accordion.js +42 -42
- package/esm2015/elements/expansion/expansion-animations.js +33 -33
- package/esm2015/elements/expansion/expansion-panel-content.js +19 -19
- package/esm2015/elements/expansion/expansion-panel-header.js +131 -131
- package/esm2015/elements/expansion/expansion-panel.js +141 -141
- package/esm2015/elements/expansion/expansion.module.js +34 -34
- package/esm2015/elements/form/Control.js +645 -645
- package/esm2015/elements/form/ControlGroup.js +264 -247
- package/esm2015/elements/form/ControlTemplates.js +162 -161
- package/esm2015/elements/form/DynamicForm.js +221 -221
- package/esm2015/elements/form/FieldInteractionApi.js +680 -680
- package/esm2015/elements/form/FieldInteractionApiTypes.js +1 -1
- package/esm2015/elements/form/FieldInteractionModals.js +63 -63
- package/esm2015/elements/form/Form.js +93 -93
- package/esm2015/elements/form/Form.module.js +86 -86
- package/esm2015/elements/form/FormControls.js +23 -23
- package/esm2015/elements/form/FormInterfaces.js +1 -1
- package/esm2015/elements/form/FormValidators.js +115 -115
- package/esm2015/elements/form/NovoFormControl.js +154 -154
- package/esm2015/elements/form/NovoFormGroup.js +32 -32
- package/esm2015/elements/form/controls/BaseControl.js +101 -101
- package/esm2015/elements/form/controls/ControlFactory.js +47 -47
- package/esm2015/elements/form/controls/ace-editor/AceEditorControl.js +9 -9
- package/esm2015/elements/form/controls/address/AddressControl.js +11 -11
- package/esm2015/elements/form/controls/check-list/CheckListControl.js +10 -10
- package/esm2015/elements/form/controls/checkbox/CheckboxControl.js +9 -9
- package/esm2015/elements/form/controls/custom/CustomControl.js +10 -10
- package/esm2015/elements/form/controls/date/DateControl.js +9 -9
- package/esm2015/elements/form/controls/date-time/DateTimeControl.js +9 -9
- package/esm2015/elements/form/controls/editor/EditorControl.js +10 -10
- package/esm2015/elements/form/controls/file/FileControl.js +12 -12
- package/esm2015/elements/form/controls/grouped/GroupedControl.js +7 -7
- package/esm2015/elements/form/controls/index.js +20 -20
- package/esm2015/elements/form/controls/native-select/NativeSelectControl.js +11 -11
- package/esm2015/elements/form/controls/picker/PickerControl.js +17 -17
- package/esm2015/elements/form/controls/quick-note/QuickNoteControl.js +11 -11
- package/esm2015/elements/form/controls/radio/RadioControl.js +11 -11
- package/esm2015/elements/form/controls/read-only/ReadOnlyControl.js +10 -10
- package/esm2015/elements/form/controls/select/SelectControl.js +12 -12
- package/esm2015/elements/form/controls/text-area/TextAreaControl.js +9 -9
- package/esm2015/elements/form/controls/textbox/TextBoxControl.js +44 -44
- package/esm2015/elements/form/controls/tiles/TilesControl.js +11 -11
- package/esm2015/elements/form/controls/time/TimeControl.js +9 -9
- package/esm2015/elements/form/extras/FormExtras.module.js +36 -36
- package/esm2015/elements/form/extras/address/Address.js +512 -512
- package/esm2015/elements/form/extras/checkbox/CheckList.js +107 -107
- package/esm2015/elements/form/extras/checkbox/Checkbox.js +80 -80
- package/esm2015/elements/form/extras/file/FileInput.js +320 -320
- package/esm2015/elements/form/extras/file/extras/file/File.js +40 -40
- package/esm2015/elements/header/Header.js +96 -96
- package/esm2015/elements/header/Header.module.js +14 -14
- package/esm2015/elements/icon/Icon.js +53 -53
- package/esm2015/elements/icon/Icon.module.js +11 -11
- package/esm2015/elements/list/List.js +132 -132
- package/esm2015/elements/list/List.module.js +33 -33
- package/esm2015/elements/loading/Loading.js +174 -174
- package/esm2015/elements/loading/Loading.module.js +15 -15
- package/esm2015/elements/modal/Modal.js +138 -138
- package/esm2015/elements/modal/Modal.module.js +16 -16
- package/esm2015/elements/modal/ModalService.js +31 -31
- package/esm2015/elements/multi-picker/MultiPicker.js +600 -600
- package/esm2015/elements/multi-picker/MultiPicker.module.js +18 -18
- package/esm2015/elements/overlay/Overlay.js +238 -238
- package/esm2015/elements/overlay/Overlay.module.js +18 -18
- package/esm2015/elements/picker/Picker.js +343 -343
- package/esm2015/elements/picker/Picker.module.js +50 -50
- package/esm2015/elements/picker/extras/base-picker-results/BasePickerResults.js +353 -353
- package/esm2015/elements/picker/extras/checklist-picker-results/ChecklistPickerResults.js +127 -127
- package/esm2015/elements/picker/extras/distributionlist-picker-results/DistributionListPickerResults.js +63 -63
- package/esm2015/elements/picker/extras/entity-picker-results/EntityPickerResults.js +221 -221
- package/esm2015/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.js +264 -264
- package/esm2015/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.js +193 -193
- package/esm2015/elements/picker/extras/picker-results/PickerResults.js +60 -60
- package/esm2015/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.js +79 -79
- package/esm2015/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.js +79 -79
- package/esm2015/elements/places/places.component.js +369 -369
- package/esm2015/elements/places/places.module.js +18 -18
- package/esm2015/elements/places/places.service.js +248 -248
- package/esm2015/elements/popover/PopOver.js +144 -144
- package/esm2015/elements/popover/PopOver.module.js +14 -14
- package/esm2015/elements/popover/PopOverContent.js +198 -198
- package/esm2015/elements/quick-note/QuickNote.js +572 -572
- package/esm2015/elements/quick-note/QuickNote.module.js +19 -19
- package/esm2015/elements/quick-note/extras/quick-note-results/QuickNoteResults.js +138 -138
- package/esm2015/elements/radio/Radio.js +89 -89
- package/esm2015/elements/radio/Radio.module.js +16 -16
- package/esm2015/elements/search/SearchBox.js +193 -193
- package/esm2015/elements/search/SearchBox.module.js +19 -19
- package/esm2015/elements/select/Select.js +363 -358
- package/esm2015/elements/select/Select.module.js +19 -18
- package/esm2015/elements/simple-table/activity-table-renderers.js +16 -16
- package/esm2015/elements/simple-table/cell-header.js +278 -278
- package/esm2015/elements/simple-table/cell.js +291 -291
- package/esm2015/elements/simple-table/interfaces.js +1 -1
- package/esm2015/elements/simple-table/pagination.js +175 -175
- package/esm2015/elements/simple-table/row.js +66 -66
- package/esm2015/elements/simple-table/simple-table.module.js +92 -92
- package/esm2015/elements/simple-table/sort.js +87 -87
- package/esm2015/elements/simple-table/state.js +38 -38
- package/esm2015/elements/simple-table/table-source.js +70 -70
- package/esm2015/elements/simple-table/table.js +238 -238
- package/esm2015/elements/slider/Slider.js +81 -81
- package/esm2015/elements/slider/Slider.module.js +16 -16
- package/esm2015/elements/stepper/step-header.component.js +90 -90
- package/esm2015/elements/stepper/step-label.component.js +16 -16
- package/esm2015/elements/stepper/step-status.component.js +26 -26
- package/esm2015/elements/stepper/stepper.animations.js +19 -19
- package/esm2015/elements/stepper/stepper.component.js +139 -139
- package/esm2015/elements/stepper/stepper.module.js +21 -21
- package/esm2015/elements/switch/Switch.js +88 -88
- package/esm2015/elements/switch/Switch.module.js +16 -16
- package/esm2015/elements/tabbed-group-picker/TabbedGroupPicker.js +261 -261
- package/esm2015/elements/tabbed-group-picker/TabbedGroupPicker.module.js +33 -33
- package/esm2015/elements/table/Table.js +940 -940
- package/esm2015/elements/table/Table.module.js +40 -40
- package/esm2015/elements/table/extras/TableExtras.module.js +59 -59
- package/esm2015/elements/table/extras/base-renderer/BaseRenderer.js +8 -8
- package/esm2015/elements/table/extras/date-cell/DateCell.js +31 -31
- package/esm2015/elements/table/extras/dropdown-cell/DropdownCell.js +44 -44
- package/esm2015/elements/table/extras/keep-filter-focus/KeepFilterFocus.js +19 -19
- package/esm2015/elements/table/extras/pagination/Pagination.js +125 -125
- package/esm2015/elements/table/extras/percentage-cell/PercentageCell.js +15 -15
- package/esm2015/elements/table/extras/row-details/RowDetails.js +44 -44
- package/esm2015/elements/table/extras/table-actions/TableActions.js +11 -11
- package/esm2015/elements/table/extras/table-cell/TableCell.js +82 -82
- package/esm2015/elements/table/extras/table-filter/TableFilter.js +59 -59
- package/esm2015/elements/table/extras/table-footer/TableFooter.js +11 -11
- package/esm2015/elements/table/extras/table-header/TableHeader.js +11 -11
- package/esm2015/elements/table/extras/th-orderable/ThOrderable.js +125 -125
- package/esm2015/elements/table/extras/th-sortable/ThSortable.js +37 -37
- package/esm2015/elements/tabs/Tabs.js +253 -253
- package/esm2015/elements/tabs/Tabs.module.js +31 -31
- package/esm2015/elements/tiles/Tiles.js +154 -154
- package/esm2015/elements/tiles/Tiles.module.js +16 -16
- package/esm2015/elements/time-picker/TimePicker.js +201 -201
- package/esm2015/elements/time-picker/TimePicker.module.js +21 -21
- package/esm2015/elements/time-picker/TimePickerInput.js +202 -202
- package/esm2015/elements/tip-well/TipWell.js +94 -94
- package/esm2015/elements/tip-well/TipWell.module.js +16 -16
- package/esm2015/elements/toast/Toast.js +111 -111
- package/esm2015/elements/toast/Toast.module.js +15 -15
- package/esm2015/elements/toast/ToastService.js +92 -92
- package/esm2015/elements/tooltip/Tooltip.component.js +37 -34
- package/esm2015/elements/tooltip/Tooltip.directive.js +189 -187
- package/esm2015/elements/tooltip/Tooltip.module.js +16 -16
- package/esm2015/elements/unless/Unless.js +56 -56
- package/esm2015/elements/unless/Unless.module.js +15 -15
- package/esm2015/elements/value/EntityList.js +84 -84
- package/esm2015/elements/value/Render.js +415 -415
- package/esm2015/elements/value/Value.js +160 -160
- package/esm2015/elements/value/Value.module.js +17 -17
- package/esm2015/index.js +221 -221
- package/esm2015/novo-elements.js +25 -25
- package/esm2015/novo-elements.module.js +128 -128
- package/esm2015/novo-elements.providers.js +50 -50
- package/esm2015/pipes/Pipes.module.js +15 -15
- package/esm2015/pipes/decode-uri/DecodeURI.js +18 -18
- package/esm2015/pipes/group-by/GroupBy.js +24 -24
- package/esm2015/pipes/plural/Plural.js +349 -349
- package/esm2015/services/data-provider/ArrayCollection.js +301 -301
- package/esm2015/services/data-provider/Collection.js +1 -1
- package/esm2015/services/data-provider/CollectionEvent.js +21 -21
- package/esm2015/services/data-provider/PagedArrayCollection.js +78 -78
- package/esm2015/services/data-provider/PagedCollection.js +1 -1
- package/esm2015/services/date-format/DateFormat.js +189 -189
- package/esm2015/services/global/global.service.js +18 -18
- package/esm2015/services/novo-label-service.js +279 -279
- package/esm2015/services/options/OptionsService.js +26 -26
- package/esm2015/services/security/Security.js +67 -67
- package/esm2015/services/storage/storage.service.js +16 -16
- package/esm2015/services/template/NovoTemplateService.js +33 -33
- package/esm2015/utils/Helpers.js +395 -395
- package/esm2015/utils/app-bridge/AppBridge.js +710 -710
- package/esm2015/utils/calendar-utils/CalendarUtils.js +321 -321
- package/esm2015/utils/component-utils/ComponentUtils.js +20 -20
- package/esm2015/utils/countries/Countries.js +17538 -17538
- package/esm2015/utils/deferred/Deferred.js +14 -14
- package/esm2015/utils/form-utils/FormUtils.js +793 -788
- package/esm2015/utils/key-codes/KeyCodes.js +95 -95
- package/esm2015/utils/notifier/notifier.util.js +10 -10
- package/esm2015/utils/outside-click/OutsideClick.js +60 -60
- package/fesm2015/novo-elements.js +43328 -43295
- package/fesm2015/novo-elements.js.map +1 -1
- package/index.d.ts +225 -225
- package/novo-elements.d.ts +24 -24
- package/novo-elements.metadata.json +1 -1
- package/novo-elements.module.d.ts +2 -2
- package/novo-elements.providers.d.ts +5 -5
- package/novo-elements.scss +110 -0
- package/package.json +1 -1
- package/pipes/Pipes.module.d.ts +2 -2
- package/pipes/decode-uri/DecodeURI.d.ts +4 -4
- package/pipes/group-by/GroupBy.d.ts +4 -4
- package/pipes/plural/Plural.d.ts +4 -4
- package/services/data-provider/ArrayCollection.d.ts +178 -178
- package/services/data-provider/Collection.d.ts +93 -93
- package/services/data-provider/CollectionEvent.d.ts +17 -17
- package/services/data-provider/PagedArrayCollection.d.ts +18 -18
- package/services/data-provider/PagedCollection.d.ts +15 -15
- package/services/date-format/DateFormat.d.ts +13 -13
- package/services/global/global.service.d.ts +11 -11
- package/services/novo-label-service.d.ts +142 -142
- package/services/options/OptionsService.d.ts +9 -9
- package/services/security/Security.d.ts +19 -19
- package/services/storage/storage.service.d.ts +5 -5
- package/services/template/NovoTemplateService.d.ts +7 -7
- package/styles/content/typography.scss +200 -0
- package/styles/global/cdk.scss +106 -0
- package/styles/global/flex-grid.scss +156 -0
- package/styles/global/functions.scss +174 -0
- package/styles/global/include-media.scss +578 -0
- package/styles/global/layout.scss +3 -0
- package/styles/global/reset.scss +451 -0
- package/styles/global/variables.scss +324 -0
- package/utils/Helpers.d.ts +68 -68
- package/utils/app-bridge/AppBridge.d.ts +178 -178
- package/utils/calendar-utils/CalendarUtils.d.ts +150 -150
- package/utils/component-utils/ComponentUtils.d.ts +6 -6
- package/utils/countries/Countries.d.ts +51 -51
- package/utils/deferred/Deferred.d.ts +4 -4
- package/utils/form-utils/FormUtils.d.ts +77 -77
- package/utils/key-codes/KeyCodes.d.ts +93 -93
- package/utils/notifier/notifier.util.d.ts +1 -1
- package/utils/outside-click/OutsideClick.d.ts +24 -24
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
// NG2
|
|
2
|
-
import { NgModule } from '@angular/core';
|
|
3
|
-
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import { CommonModule } from '@angular/common';
|
|
5
|
-
import { OverlayModule } from '@angular/cdk/overlay';
|
|
6
|
-
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
7
|
-
// APP
|
|
8
|
-
import { NovoOverlayTemplateComponent } from './Overlay';
|
|
9
|
-
export class NovoOverlayModule {
|
|
10
|
-
}
|
|
11
|
-
NovoOverlayModule.decorators = [
|
|
12
|
-
{ type: NgModule, args: [{
|
|
13
|
-
imports: [CommonModule, FormsModule, OverlayModule, ScrollingModule],
|
|
14
|
-
declarations: [NovoOverlayTemplateComponent],
|
|
15
|
-
exports: [NovoOverlayTemplateComponent, ScrollingModule],
|
|
16
|
-
},] }
|
|
17
|
-
];
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
// NG2
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { OverlayModule } from '@angular/cdk/overlay';
|
|
6
|
+
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
7
|
+
// APP
|
|
8
|
+
import { NovoOverlayTemplateComponent } from './Overlay';
|
|
9
|
+
export class NovoOverlayModule {
|
|
10
|
+
}
|
|
11
|
+
NovoOverlayModule.decorators = [
|
|
12
|
+
{ type: NgModule, args: [{
|
|
13
|
+
imports: [CommonModule, FormsModule, OverlayModule, ScrollingModule],
|
|
14
|
+
declarations: [NovoOverlayTemplateComponent],
|
|
15
|
+
exports: [NovoOverlayTemplateComponent, ScrollingModule],
|
|
16
|
+
},] }
|
|
17
|
+
];
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3ZlcmxheS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvbm92by1lbGVtZW50cy9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsiZWxlbWVudHMvb3ZlcmxheS9PdmVybGF5Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNO0FBQ04sT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsTUFBTTtBQUNOLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU96RCxNQUFNLE9BQU8saUJBQWlCOzs7WUFMN0IsUUFBUSxTQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGVBQWUsQ0FBQztnQkFDcEUsWUFBWSxFQUFFLENBQUMsNEJBQTRCLENBQUM7Z0JBQzVDLE9BQU8sRUFBRSxDQUFDLDRCQUE0QixFQUFFLGVBQWUsQ0FBQzthQUN6RCIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbi8vIEFQUFxuaW1wb3J0IHsgTm92b092ZXJsYXlUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vT3ZlcmxheSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBPdmVybGF5TW9kdWxlLCBTY3JvbGxpbmdNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtOb3ZvT3ZlcmxheVRlbXBsYXRlQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW05vdm9PdmVybGF5VGVtcGxhdGVDb21wb25lbnQsIFNjcm9sbGluZ01vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5vdm9PdmVybGF5TW9kdWxlIHt9XG4iXX0=
|
|
@@ -1,343 +1,343 @@
|
|
|
1
|
-
// NG2
|
|
2
|
-
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
3
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
-
// Vendor
|
|
5
|
-
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
6
|
-
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
7
|
-
import { fromEvent } from 'rxjs';
|
|
8
|
-
// APP
|
|
9
|
-
import { KeyCodes } from '../../utils/key-codes/KeyCodes';
|
|
10
|
-
import { PickerResults } from './extras/picker-results/PickerResults';
|
|
11
|
-
import { ComponentUtils } from '../../utils/component-utils/ComponentUtils';
|
|
12
|
-
import { Helpers } from '../../utils/Helpers';
|
|
13
|
-
import { NovoOverlayTemplateComponent } from '../overlay/Overlay';
|
|
14
|
-
import { notify } from '../../utils/notifier/notifier.util';
|
|
15
|
-
// Value accessor for the component (supports ngModel)
|
|
16
|
-
const PICKER_VALUE_ACCESSOR = {
|
|
17
|
-
provide: NG_VALUE_ACCESSOR,
|
|
18
|
-
useExisting: forwardRef(() => NovoPickerElement),
|
|
19
|
-
multi: true,
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* @description This class is the directive definition of the Picker. If you add and attribute of `picker` to an input,
|
|
23
|
-
* it will create an instance of the picker which wraps the input in all of the picker HTML elements and functionality.
|
|
24
|
-
* Picker should be added as a two-way bound ngModel instance `[(picker)]=""` in order to have the picker options
|
|
25
|
-
* dynamically populate.
|
|
26
|
-
*/
|
|
27
|
-
export class NovoPickerElement {
|
|
28
|
-
constructor(element, componentUtils, ref) {
|
|
29
|
-
this.element = element;
|
|
30
|
-
this.componentUtils = componentUtils;
|
|
31
|
-
this.ref = ref;
|
|
32
|
-
this.closeOnSelect = true;
|
|
33
|
-
this.selected = [];
|
|
34
|
-
// Deprecated
|
|
35
|
-
this.appendToBody = false;
|
|
36
|
-
// Deprecated
|
|
37
|
-
this.parentScrollAction = 'close';
|
|
38
|
-
// Side the dropdown will open
|
|
39
|
-
this.side = 'left';
|
|
40
|
-
// Autoselects the first option in the results
|
|
41
|
-
this.autoSelectFirstOption = true;
|
|
42
|
-
this._disablePickerInput = false;
|
|
43
|
-
// Emitter for selects
|
|
44
|
-
this.changed = new EventEmitter();
|
|
45
|
-
this.select = new EventEmitter();
|
|
46
|
-
this.focus = new EventEmitter();
|
|
47
|
-
this.blur = new EventEmitter();
|
|
48
|
-
this.typing = new EventEmitter();
|
|
49
|
-
this.term = '';
|
|
50
|
-
this.onModelChange = () => { };
|
|
51
|
-
this.onModelTouched = () => { };
|
|
52
|
-
}
|
|
53
|
-
// Disable from typing into the picker (result template does everything)
|
|
54
|
-
set disablePickerInput(v) {
|
|
55
|
-
this._disablePickerInput = coerceBooleanProperty(v);
|
|
56
|
-
}
|
|
57
|
-
get disablePickerInput() {
|
|
58
|
-
return this._disablePickerInput;
|
|
59
|
-
}
|
|
60
|
-
ngOnInit() {
|
|
61
|
-
if (this.overrideElement) {
|
|
62
|
-
this.element = this.overrideElement;
|
|
63
|
-
}
|
|
64
|
-
if (this.appendToBody) {
|
|
65
|
-
notify(`'appendToBody' has been deprecated. Please remove this attribute.`);
|
|
66
|
-
}
|
|
67
|
-
// Custom results template
|
|
68
|
-
this.resultsComponent = this.config.resultsTemplate || PickerResults;
|
|
69
|
-
// Get all distinct key up events from the input and only fire if long enough and distinct
|
|
70
|
-
// let input = this.element.nativeElement.querySelector('input');
|
|
71
|
-
const pasteObserver = fromEvent(this.input.nativeElement, 'paste').pipe(debounceTime(250), distinctUntilChanged());
|
|
72
|
-
pasteObserver.subscribe((event) => this.onDebouncedKeyup(event), (err) => this.hideResults(err));
|
|
73
|
-
const keyboardObserver = fromEvent(this.input.nativeElement, 'keyup').pipe(debounceTime(250), distinctUntilChanged());
|
|
74
|
-
keyboardObserver.subscribe((event) => this.onDebouncedKeyup(event), (err) => this.hideResults(err));
|
|
75
|
-
}
|
|
76
|
-
onDebouncedKeyup(event) {
|
|
77
|
-
if ([KeyCodes.ESC, KeyCodes.UP, KeyCodes.DOWN, KeyCodes.ENTER, KeyCodes.TAB].includes(event['keyCode'])) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
this.show(event.target.value);
|
|
81
|
-
}
|
|
82
|
-
openPanel() {
|
|
83
|
-
this.container.openPanel();
|
|
84
|
-
}
|
|
85
|
-
closePanel() {
|
|
86
|
-
this.container.closePanel();
|
|
87
|
-
}
|
|
88
|
-
get panelOpen() {
|
|
89
|
-
return this.container && this.container.panelOpen;
|
|
90
|
-
}
|
|
91
|
-
show(term) {
|
|
92
|
-
this.openPanel();
|
|
93
|
-
// Show the results inside
|
|
94
|
-
this.showResults(term);
|
|
95
|
-
}
|
|
96
|
-
onKeyDown(event) {
|
|
97
|
-
if (this.disablePickerInput) {
|
|
98
|
-
Helpers.swallowEvent(event);
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
if (this.panelOpen && !this.disablePickerInput) {
|
|
102
|
-
if (event.keyCode === KeyCodes.ESC || event.keyCode === KeyCodes.TAB) {
|
|
103
|
-
this.hideResults();
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
if (event.keyCode === KeyCodes.UP) {
|
|
107
|
-
this.popup.instance.prevActiveMatch();
|
|
108
|
-
this.ref.markForCheck();
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
if (event.keyCode === KeyCodes.DOWN) {
|
|
112
|
-
this.popup.instance.nextActiveMatch();
|
|
113
|
-
this.ref.markForCheck();
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (event.keyCode === KeyCodes.ENTER) {
|
|
117
|
-
const activeMatch = this.popup.instance.activeMatch;
|
|
118
|
-
if (!this.selected.find((selected) => activeMatch && activeMatch.value && selected.value === activeMatch.value)) {
|
|
119
|
-
this.popup.instance.selectActiveMatch();
|
|
120
|
-
this.ref.markForCheck();
|
|
121
|
-
}
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
if ((event.keyCode === KeyCodes.BACKSPACE || event.keyCode === KeyCodes.DELETE) && !Helpers.isBlank(this._value)) {
|
|
125
|
-
this.clearValue(false);
|
|
126
|
-
this.closePanel();
|
|
127
|
-
}
|
|
128
|
-
if (event.keyCode === KeyCodes.DELETE && Helpers.isBlank(this._value)) {
|
|
129
|
-
this.clearValue(true);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
clearValue(wipeTerm) {
|
|
134
|
-
this._value = null;
|
|
135
|
-
this.select.emit(this._value);
|
|
136
|
-
this.changed.emit({ value: this._value, rawValue: { label: '', value: this._value } });
|
|
137
|
-
this.onModelChange(this._value);
|
|
138
|
-
if (wipeTerm) {
|
|
139
|
-
this.term = '';
|
|
140
|
-
this.hideResults();
|
|
141
|
-
}
|
|
142
|
-
this.ref.markForCheck();
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* @description When the input's focus event is called this method calls the debounced function that displays the
|
|
146
|
-
* results.
|
|
147
|
-
*/
|
|
148
|
-
onFocus(event) {
|
|
149
|
-
if (!this.panelOpen) {
|
|
150
|
-
this.show();
|
|
151
|
-
}
|
|
152
|
-
this.focus.emit(event);
|
|
153
|
-
}
|
|
154
|
-
// Creates an instance of the results (called popup) and adds all the bindings to that instance.
|
|
155
|
-
showResults(term) {
|
|
156
|
-
// Update Matches
|
|
157
|
-
if (this.popup) {
|
|
158
|
-
// Update existing list or create the DOM element
|
|
159
|
-
this.popup.instance.config = this.config;
|
|
160
|
-
this.popup.instance.term = this.term;
|
|
161
|
-
this.popup.instance.selected = this.selected;
|
|
162
|
-
this.popup.instance.autoSelectFirstOption = this.autoSelectFirstOption;
|
|
163
|
-
this.ref.markForCheck();
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
this.popup = this.componentUtils.append(this.resultsComponent, this.results);
|
|
167
|
-
this.popup.instance.parent = this;
|
|
168
|
-
this.popup.instance.config = this.config;
|
|
169
|
-
this.popup.instance.term = this.term;
|
|
170
|
-
this.popup.instance.selected = this.selected;
|
|
171
|
-
this.popup.instance.autoSelectFirstOption = this.autoSelectFirstOption;
|
|
172
|
-
this.popup.instance.overlay = this.container.overlayRef;
|
|
173
|
-
this.ref.markForCheck();
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Tells the overlay component to hide the picker results from the DOM without deleting the dynamically allocated popup instance created in
|
|
177
|
-
// showResults. The popup instance will remain in memory from the first time the results are shown until this component is destroyed.
|
|
178
|
-
hideResults(err) {
|
|
179
|
-
this.closePanel();
|
|
180
|
-
this.ref.markForCheck();
|
|
181
|
-
}
|
|
182
|
-
// Cleans up listeners for the popup - will get executed no matter how the popup is closed.
|
|
183
|
-
onOverlayClosed() {
|
|
184
|
-
if (this.popup && this.popup.instance && this.popup.instance.cleanUp) {
|
|
185
|
-
this.popup.instance.cleanUp();
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// get accessor
|
|
189
|
-
get value() {
|
|
190
|
-
return this._value;
|
|
191
|
-
}
|
|
192
|
-
// set accessor including call the onchange callback
|
|
193
|
-
set value(selected) {
|
|
194
|
-
if (!selected) {
|
|
195
|
-
this.term = '';
|
|
196
|
-
this._value = null;
|
|
197
|
-
this.onModelChange(this._value);
|
|
198
|
-
}
|
|
199
|
-
else if (selected.value !== this._value) {
|
|
200
|
-
this.term = this.clearValueOnSelect ? '' : selected.label;
|
|
201
|
-
this._value = selected.value;
|
|
202
|
-
this.changed.emit({ value: selected.value, rawValue: { label: this.term, value: selected.value } });
|
|
203
|
-
this.select.emit(selected);
|
|
204
|
-
this.onModelChange(selected.value);
|
|
205
|
-
if (this.popup) {
|
|
206
|
-
this.popup.instance.selected = this.selected;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
this.changed.emit({ value: selected.value, rawValue: { label: this.term, value: this._value } });
|
|
211
|
-
this.select.emit(selected);
|
|
212
|
-
}
|
|
213
|
-
this.ref.markForCheck();
|
|
214
|
-
}
|
|
215
|
-
// Makes sure to clear the model if the user clears the text box
|
|
216
|
-
checkTerm(event) {
|
|
217
|
-
this.typing.emit(event);
|
|
218
|
-
if (!event || !event.length) {
|
|
219
|
-
this._value = null;
|
|
220
|
-
this.onModelChange(this._value);
|
|
221
|
-
}
|
|
222
|
-
this.ref.markForCheck();
|
|
223
|
-
}
|
|
224
|
-
// Set touched on blur
|
|
225
|
-
onTouched(event) {
|
|
226
|
-
this.onModelTouched();
|
|
227
|
-
this.blur.emit(event);
|
|
228
|
-
}
|
|
229
|
-
// From ControlValueAccessor interface
|
|
230
|
-
writeValue(value) {
|
|
231
|
-
if (this.clearValueOnSelect) {
|
|
232
|
-
this.term = '';
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
if (typeof value === 'string' && !this.config.useGetLabels) {
|
|
236
|
-
this.term = value;
|
|
237
|
-
}
|
|
238
|
-
else if (value && value.label) {
|
|
239
|
-
this.term = value.label;
|
|
240
|
-
}
|
|
241
|
-
else if (value && value.firstName) {
|
|
242
|
-
this.term = `${value.firstName} ${value.lastName}`;
|
|
243
|
-
}
|
|
244
|
-
else if (value && value.name) {
|
|
245
|
-
this.term = value.name;
|
|
246
|
-
}
|
|
247
|
-
else if (typeof this.config.getLabels === 'function') {
|
|
248
|
-
this.config.getLabels(value).then((result) => {
|
|
249
|
-
if (result) {
|
|
250
|
-
this.term = result.length ? result[0].label || '' : result.label || '';
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
this.term = value;
|
|
254
|
-
}
|
|
255
|
-
this.ref.markForCheck();
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
else if (value && value.title) {
|
|
259
|
-
this.term = value.title;
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
this.term = value || '';
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
this._value = value;
|
|
266
|
-
this.ref.markForCheck();
|
|
267
|
-
}
|
|
268
|
-
registerOnChange(fn) {
|
|
269
|
-
this.onModelChange = fn;
|
|
270
|
-
}
|
|
271
|
-
registerOnTouched(fn) {
|
|
272
|
-
this.onModelTouched = fn;
|
|
273
|
-
}
|
|
274
|
-
setDisabledState(disabled) {
|
|
275
|
-
this._disablePickerInput = disabled;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
NovoPickerElement.decorators = [
|
|
279
|
-
{ type: Component, args: [{
|
|
280
|
-
selector: 'novo-picker',
|
|
281
|
-
providers: [PICKER_VALUE_ACCESSOR],
|
|
282
|
-
template: `
|
|
283
|
-
<i class="bhi-more" *ngIf="config?.entityIcon && !_value"></i>
|
|
284
|
-
<i class="bhi-{{ config?.entityIcon }} entity-icon {{ config?.entityIcon }}" *ngIf="config?.entityIcon && _value"></i>
|
|
285
|
-
<input
|
|
286
|
-
type="text"
|
|
287
|
-
class="picker-input"
|
|
288
|
-
[(ngModel)]="term"
|
|
289
|
-
[class.entity-picker]="config?.entityIcon"
|
|
290
|
-
[class.entity-selected]="config?.entityIcon && _value"
|
|
291
|
-
(ngModelChange)="checkTerm($event)"
|
|
292
|
-
[placeholder]="placeholder"
|
|
293
|
-
(keydown)="onKeyDown($event)"
|
|
294
|
-
(focus)="onFocus($event)"
|
|
295
|
-
(click)="onFocus($event)"
|
|
296
|
-
(blur)="onTouched($event)"
|
|
297
|
-
autocomplete="off"
|
|
298
|
-
#input
|
|
299
|
-
[disabled]="disablePickerInput"
|
|
300
|
-
/>
|
|
301
|
-
<i class="bhi-search" *ngIf="(!_value || clearValueOnSelect) && !disablePickerInput"></i>
|
|
302
|
-
<i
|
|
303
|
-
class="bhi-times"
|
|
304
|
-
[class.entity-selected]="config?.entityIcon && _value"
|
|
305
|
-
*ngIf="_value && !clearValueOnSelect && !disablePickerInput"
|
|
306
|
-
(click)="clearValue(true)"
|
|
307
|
-
></i>
|
|
308
|
-
<novo-overlay-template class="picker-results-container" [parent]="element" position="above-below" (closing)="onOverlayClosed()">
|
|
309
|
-
<span #results></span>
|
|
310
|
-
<ng-content></ng-content>
|
|
311
|
-
</novo-overlay-template>
|
|
312
|
-
`
|
|
313
|
-
},] }
|
|
314
|
-
];
|
|
315
|
-
NovoPickerElement.ctorParameters = () => [
|
|
316
|
-
{ type: ElementRef },
|
|
317
|
-
{ type: ComponentUtils },
|
|
318
|
-
{ type: ChangeDetectorRef }
|
|
319
|
-
];
|
|
320
|
-
NovoPickerElement.propDecorators = {
|
|
321
|
-
results: [{ type: ViewChild, args: ['results', { read: ViewContainerRef, static: true },] }],
|
|
322
|
-
config: [{ type: Input }],
|
|
323
|
-
placeholder: [{ type: Input }],
|
|
324
|
-
clearValueOnSelect: [{ type: Input }],
|
|
325
|
-
closeOnSelect: [{ type: Input }],
|
|
326
|
-
selected: [{ type: Input }],
|
|
327
|
-
appendToBody: [{ type: Input }],
|
|
328
|
-
parentScrollSelector: [{ type: Input }],
|
|
329
|
-
parentScrollAction: [{ type: Input }],
|
|
330
|
-
containerClass: [{ type: Input }],
|
|
331
|
-
side: [{ type: Input }],
|
|
332
|
-
autoSelectFirstOption: [{ type: Input }],
|
|
333
|
-
overrideElement: [{ type: Input }],
|
|
334
|
-
disablePickerInput: [{ type: Input }],
|
|
335
|
-
changed: [{ type: Output }],
|
|
336
|
-
select: [{ type: Output }],
|
|
337
|
-
focus: [{ type: Output }],
|
|
338
|
-
blur: [{ type: Output }],
|
|
339
|
-
typing: [{ type: Output }],
|
|
340
|
-
container: [{ type: ViewChild, args: [NovoOverlayTemplateComponent, { static: true },] }],
|
|
341
|
-
input: [{ type: ViewChild, args: ['input', { static: true },] }]
|
|
342
|
-
};
|
|
343
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGlja2VyLmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL2NoYXJsZXMuYmFybmVzL0RvY3VtZW50cy9kZXYvbm92by1lbGVtZW50cy9wcm9qZWN0cy9ub3ZvLWVsZW1lbnRzL3NyYy8iLCJzb3VyY2VzIjpbImVsZW1lbnRzL3BpY2tlci9QaWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTTtBQUNOLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUVULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxTQUFTO0FBQ1QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsTUFBTTtBQUNOLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFHNUQsc0RBQXNEO0FBQ3RELE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixD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QUVOLE1BQU07b0JBRU4sTUFBTTttQkFFTixNQUFNO3FCQUVOLE1BQU07d0JBR04sU0FBUyxTQUFDLDRCQUE0QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtvQkFFeEQsU0FBUyxTQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBORzJcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NvbnRhaW5lclJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbi8vIFZlbmRvclxyXG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuLy8gQVBQXHJcbmltcG9ydCB7IEtleUNvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMva2V5LWNvZGVzL0tleUNvZGVzJztcclxuaW1wb3J0IHsgUGlja2VyUmVzdWx0cyB9IGZyb20gJy4vZXh0cmFzL3BpY2tlci1yZXN1bHRzL1BpY2tlclJlc3VsdHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRVdGlscyB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbXBvbmVudC11dGlscy9Db21wb25lbnRVdGlscyc7XHJcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICcuLi8uLi91dGlscy9IZWxwZXJzJztcclxuaW1wb3J0IHsgTm92b092ZXJsYXlUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL292ZXJsYXkvT3ZlcmxheSc7XHJcbmltcG9ydCB7IG5vdGlmeSB9IGZyb20gJy4uLy4uL3V0aWxzL25vdGlmaWVyL25vdGlmaWVyLnV0aWwnO1xyXG5pbXBvcnQgeyBOb3ZvQ29udHJvbENvbmZpZyB9IGZyb20gJy4uL2Zvcm0vRm9ybUNvbnRyb2xzJztcclxuXHJcbi8vIFZhbHVlIGFjY2Vzc29yIGZvciB0aGUgY29tcG9uZW50IChzdXBwb3J0cyBuZ01vZGVsKVxyXG5jb25zdCBQSUNLRVJfVkFMVUVfQUNDRVNTT1IgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTm92b1BpY2tlckVsZW1lbnQpLFxyXG4gIG11bHRpOiB0cnVlLFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIGNsYXNzIGlzIHRoZSBkaXJlY3RpdmUgZGVmaW5pdGlvbiBvZiB0aGUgUGlja2VyLiBJZiB5b3UgYWRkIGFuZCBhdHRyaWJ1dGUgb2YgYHBpY2tlcmAgdG8gYW4gaW5wdXQsXHJcbiAqIGl0IHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBwaWNrZXIgd2hpY2ggd3JhcHMgdGhlIGlucHV0IGluIGFsbCBvZiB0aGUgcGlja2VyIEhUTUwgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdHkuXHJcbiAqIFBpY2tlciBzaG91bGQgYmUgYWRkZWQgYXMgYSB0d28td2F5IGJvdW5kIG5nTW9kZWwgaW5zdGFuY2UgYFsocGlja2VyKV09XCJcImAgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgcGlja2VyIG9wdGlvbnNcclxuICogZHluYW1pY2FsbHkgcG9wdWxhdGUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25vdm8tcGlja2VyJyxcclxuICBwcm92aWRlcnM6IFtQSUNLRVJfVkFMVUVfQUNDRVNTT1JdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8aSBjbGFzcz1cImJoaS1tb3JlXCIgKm5nSWY9XCJjb25maWc/LmVudGl0eUljb24gJiYgIV92YWx1ZVwiPjwvaT5cclxuICAgIDxpIGNsYXNzPVwiYmhpLXt7IGNvbmZpZz8uZW50aXR5SWNvbiB9fSBlbnRpdHktaWNvbiB7eyBjb25maWc/LmVudGl0eUljb24gfX1cIiAqbmdJZj1cImNvbmZpZz8uZW50aXR5SWNvbiAmJiBfdmFsdWVcIj48L2k+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBjbGFzcz1cInBpY2tlci1pbnB1dFwiXHJcbiAgICAgIFsobmdNb2RlbCldPVwidGVybVwiXHJcbiAgICAgIFtjbGFzcy5lbnRpdHktcGlja2VyXT1cImNvbmZpZz8uZW50aXR5SWNvblwiXHJcbiAgICAgIFtjbGFzcy5lbnRpdHktc2VsZWN0ZWRdPVwiY29uZmlnPy5lbnRpdHlJY29uICYmIF92YWx1ZVwiXHJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrVGVybSgkZXZlbnQpXCJcclxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxyXG4gICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgKGNsaWNrKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgIChibHVyKT1cIm9uVG91Y2hlZCgkZXZlbnQpXCJcclxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgI2lucHV0XHJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlUGlja2VySW5wdXRcIlxyXG4gICAgLz5cclxuICAgIDxpIGNsYXNzPVwiYmhpLXNlYXJjaFwiICpuZ0lmPVwiKCFfdmFsdWUgfHwgY2xlYXJWYWx1ZU9uU2VsZWN0KSAmJiAhZGlzYWJsZVBpY2tlcklucHV0XCI+PC9pPlxyXG4gICAgPGlcclxuICAgICAgY2xhc3M9XCJiaGktdGltZXNcIlxyXG4gICAgICBbY2xhc3MuZW50aXR5LXNlbGVjdGVkXT1cImNvbmZpZz8uZW50aXR5SWNvbiAmJiBfdmFsdWVcIlxyXG4gICAgICAqbmdJZj1cIl92YWx1ZSAmJiAhY2xlYXJWYWx1ZU9uU2VsZWN0ICYmICFkaXNhYmxlUGlja2VySW5wdXRcIlxyXG4gICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSh0cnVlKVwiXHJcbiAgICA+PC9pPlxyXG4gICAgPG5vdm8tb3ZlcmxheS10ZW1wbGF0ZSBjbGFzcz1cInBpY2tlci1yZXN1bHRzLWNvbnRhaW5lclwiIFtwYXJlbnRdPVwiZWxlbWVudFwiIHBvc2l0aW9uPVwiYWJvdmUtYmVsb3dcIiAoY2xvc2luZyk9XCJvbk92ZXJsYXlDbG9zZWQoKVwiPlxyXG4gICAgICA8c3BhbiAjcmVzdWx0cz48L3NwYW4+XHJcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvbm92by1vdmVybGF5LXRlbXBsYXRlPlxyXG4gIGAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOb3ZvUGlja2VyRWxlbWVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLy8gQ29udGFpbmVyIGZvciB0aGUgcmVzdWx0c1xyXG4gIEBWaWV3Q2hpbGQoJ3Jlc3VsdHMnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHJlc3VsdHM6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29uZmlnOiBOb3ZvQ29udHJvbENvbmZpZ1snY29uZmlnJ107XHJcbiAgQElucHV0KClcclxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgY2xlYXJWYWx1ZU9uU2VsZWN0OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgY2xvc2VPblNlbGVjdDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBzZWxlY3RlZDogQXJyYXk8YW55PiA9IFtdO1xyXG4gIC8vIERlcHJlY2F0ZWRcclxuICBASW5wdXQoKVxyXG4gIGFwcGVuZFRvQm9keTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vIERlcHJlY2F0ZWRcclxuICBASW5wdXQoKVxyXG4gIHBhcmVudFNjcm9sbFNlbGVjdG9yOiBzdHJpbmc7XHJcbiAgLy8gRGVwcmVjYXRlZFxyXG4gIEBJbnB1dCgpXHJcbiAgcGFyZW50U2Nyb2xsQWN0aW9uOiBzdHJpbmcgPSAnY2xvc2UnO1xyXG4gIC8vIEN1c3RvbSBjbGFzcyBmb3IgdGhlIGRyb3Bkb3duIGNvbnRhaW5lclxyXG4gIEBJbnB1dCgpXHJcbiAgY29udGFpbmVyQ2xhc3M6IHN0cmluZztcclxuICAvLyBTaWRlIHRoZSBkcm9wZG93biB3aWxsIG9wZW5cclxuICBASW5wdXQoKVxyXG4gIHNpZGU6IHN0cmluZyA9ICdsZWZ0JztcclxuICAvLyBBdXRvc2VsZWN0cyB0aGUgZmlyc3Qgb3B0aW9uIGluIHRoZSByZXN1bHRzXHJcbiAgQElucHV0KClcclxuICBhdXRvU2VsZWN0Rmlyc3RPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpXHJcbiAgb3ZlcnJpZGVFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAvLyBEaXNhYmxlIGZyb20gdHlwaW5nIGludG8gdGhlIHBpY2tlciAocmVzdWx0IHRlbXBsYXRlIGRvZXMgZXZlcnl0aGluZylcclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlUGlja2VySW5wdXQodjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZGlzYWJsZVBpY2tlcklucHV0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc2FibGVQaWNrZXJJbnB1dCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlUGlja2VySW5wdXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kaXNhYmxlUGlja2VySW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gRW1pdHRlciBmb3Igc2VsZWN0c1xyXG4gIEBPdXRwdXQoKVxyXG4gIGNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgZm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHR5cGluZzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoTm92b092ZXJsYXlUZW1wbGF0ZUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwdWJsaWMgY29udGFpbmVyOiBOb3ZvT3ZlcmxheVRlbXBsYXRlQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwcml2YXRlIGlucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICB0ZXJtOiBzdHJpbmcgPSAnJztcclxuICByZXN1bHRzQ29tcG9uZW50OiBhbnk7XHJcbiAgcG9wdXA6IENvbXBvbmVudFJlZjxhbnk+O1xyXG4gIF92YWx1ZTogYW55O1xyXG4gIG9uTW9kZWxDaGFuZ2U6IEZ1bmN0aW9uID0gKCkgPT4geyB9O1xyXG4gIG9uTW9kZWxUb3VjaGVkOiBGdW5jdGlvbiA9ICgpID0+IHsgfTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgY29tcG9uZW50VXRpbHM6IENvbXBvbmVudFV0aWxzLCBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLm92ZXJyaWRlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLm92ZXJyaWRlRWxlbWVudDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFwcGVuZFRvQm9keSkge1xyXG4gICAgICBub3RpZnkoYCdhcHBlbmRUb0JvZHknIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSByZW1vdmUgdGhpcyBhdHRyaWJ1dGUuYCk7XHJcbiAgICB9XHJcbiAgICAvLyBDdXN0b20gcmVzdWx0cyB0ZW1wbGF0ZVxyXG4gICAgdGhpcy5yZXN1bHRzQ29tcG9uZW50ID0gdGhpcy5jb25maWcucmVzdWx0c1RlbXBsYXRlIHx8IFBpY2tlclJlc3VsdHM7XHJcbiAgICAvLyBHZXQgYWxsIGRpc3RpbmN0IGtleSB1cCBldmVudHMgZnJvbSB0aGUgaW5wdXQgYW5kIG9ubHkgZmlyZSBpZiBsb25nIGVub3VnaCBhbmQgZGlzdGluY3RcclxuICAgIC8vIGxldCBpbnB1dCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICBjb25zdCBwYXN0ZU9ic2VydmVyID0gZnJvbUV2ZW50KHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3Bhc3RlJykucGlwZShcclxuICAgICAgZGVib3VuY2VUaW1lKDI1MCksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICApO1xyXG4gICAgcGFzdGVPYnNlcnZlci5zdWJzY3JpYmUoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4gdGhpcy5vbkRlYm91bmNlZEtleXVwKGV2ZW50KSwgKGVycikgPT4gdGhpcy5oaWRlUmVzdWx0cyhlcnIpKTtcclxuICAgIGNvbnN0IGtleWJvYXJkT2JzZXJ2ZXIgPSBmcm9tRXZlbnQodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAna2V5dXAnKS5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICk7XHJcbiAgICBrZXlib2FyZE9ic2VydmVyLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMub25EZWJvdW5jZWRLZXl1cChldmVudCksIChlcnIpID0+IHRoaXMuaGlkZVJlc3VsdHMoZXJyKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGVib3VuY2VkS2V5dXAoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBpZiAoW0tleUNvZGVzLkVTQywgS2V5Q29kZXMuVVAsIEtleUNvZGVzLkRPV04sIEtleUNvZGVzLkVOVEVSLCBLZXlDb2Rlcy5UQUJdLmluY2x1ZGVzKGV2ZW50WydrZXlDb2RlJ10pKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvdygoZXZlbnQudGFyZ2V0IGFzIGFueSkudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5QYW5lbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udGFpbmVyLm9wZW5QYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlUGFuZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnRhaW5lci5jbG9zZVBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHBhbmVsT3BlbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5wYW5lbE9wZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3codGVybT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVuUGFuZWwoKTtcclxuICAgIC8vIFNob3cgdGhlIHJlc3VsdHMgaW5zaWRlXHJcbiAgICB0aGlzLnNob3dSZXN1bHRzKHRlcm0pO1xyXG4gIH1cclxuXHJcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlUGlja2VySW5wdXQpIHtcclxuICAgICAgSGVscGVycy5zd2FsbG93RXZlbnQoZXZlbnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4gJiYgIXRoaXMuZGlzYWJsZVBpY2tlcklucHV0KSB7XHJcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5FU0MgfHwgZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZXMuVEFCKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlUmVzdWx0cygpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGVzLlVQKSB7XHJcbiAgICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5wcmV2QWN0aXZlTWF0Y2goKTtcclxuICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5ET1dOKSB7XHJcbiAgICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5uZXh0QWN0aXZlTWF0Y2goKTtcclxuICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5FTlRFUikge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZU1hdGNoID0gdGhpcy5wb3B1cC5pbnN0YW5jZS5hY3RpdmVNYXRjaDtcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWQuZmluZCgoc2VsZWN0ZWQpID0+IGFjdGl2ZU1hdGNoICYmIGFjdGl2ZU1hdGNoLnZhbHVlICYmIHNlbGVjdGVkLnZhbHVlID09PSBhY3RpdmVNYXRjaC52YWx1ZSkpIHtcclxuICAgICAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2Uuc2VsZWN0QWN0aXZlTWF0Y2goKTtcclxuICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZXMuQkFDS1NQQUNFIHx8IGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGVzLkRFTEVURSkgJiYgIUhlbHBlcnMuaXNCbGFuayh0aGlzLl92YWx1ZSkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyVmFsdWUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5ERUxFVEUgJiYgSGVscGVycy5pc0JsYW5rKHRoaXMuX3ZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJWYWx1ZSh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJWYWx1ZSh3aXBlVGVybSkge1xyXG4gICAgdGhpcy5fdmFsdWUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3QuZW1pdCh0aGlzLl92YWx1ZSk7XHJcbiAgICB0aGlzLmNoYW5nZWQuZW1pdCh7IHZhbHVlOiB0aGlzLl92YWx1ZSwgcmF3VmFsdWU6IHsgbGFiZWw6ICcnLCB2YWx1ZTogdGhpcy5fdmFsdWUgfSB9KTtcclxuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLl92YWx1ZSk7XHJcblxyXG4gICAgaWYgKHdpcGVUZXJtKSB7XHJcbiAgICAgIHRoaXMudGVybSA9ICcnO1xyXG4gICAgICB0aGlzLmhpZGVSZXN1bHRzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBXaGVuIHRoZSBpbnB1dCdzIGZvY3VzIGV2ZW50IGlzIGNhbGxlZCB0aGlzIG1ldGhvZCBjYWxscyB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGlzcGxheXMgdGhlXHJcbiAgICogcmVzdWx0cy5cclxuICAgKi9cclxuICBvbkZvY3VzKGV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb2N1cy5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc3VsdHMgKGNhbGxlZCBwb3B1cCkgYW5kIGFkZHMgYWxsIHRoZSBiaW5kaW5ncyB0byB0aGF0IGluc3RhbmNlLlxyXG4gIHNob3dSZXN1bHRzKHRlcm0/OiBhbnkpIHtcclxuICAgIC8vIFVwZGF0ZSBNYXRjaGVzXHJcbiAgICBpZiAodGhpcy5wb3B1cCkge1xyXG4gICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgbGlzdCBvciBjcmVhdGUgdGhlIERPTSBlbGVtZW50XHJcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2UuY29uZmlnID0gdGhpcy5jb25maWc7XHJcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2UudGVybSA9IHRoaXMudGVybTtcclxuICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQ7XHJcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2UuYXV0b1NlbGVjdEZpcnN0T3B0aW9uID0gdGhpcy5hdXRvU2VsZWN0Rmlyc3RPcHRpb247XHJcbiAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wb3B1cCA9IHRoaXMuY29tcG9uZW50VXRpbHMuYXBwZW5kKHRoaXMucmVzdWx0c0NvbXBvbmVudCwgdGhpcy5yZXN1bHRzKTtcclxuICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICB0aGlzLnBvcHVwLmluc3RhbmNlLmNvbmZpZyA9IHRoaXMuY29uZmlnO1xyXG4gICAgICB0aGlzLnBvcHVwLmluc3RhbmNlLnRlcm0gPSB0aGlzLnRlcm07XHJcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2Uuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xyXG4gICAgICB0aGlzLnBvcHVwLmluc3RhbmNlLmF1dG9TZWxlY3RGaXJzdE9wdGlvbiA9IHRoaXMuYXV0b1NlbGVjdEZpcnN0T3B0aW9uO1xyXG4gICAgICB0aGlzLnBvcHVwLmluc3RhbmNlLm92ZXJsYXkgPSB0aGlzLmNvbnRhaW5lci5vdmVybGF5UmVmO1xyXG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFRlbGxzIHRoZSBvdmVybGF5IGNvbXBvbmVudCB0byBoaWRlIHRoZSBwaWNrZXIgcmVzdWx0cyBmcm9tIHRoZSBET00gd2l0aG91dCBkZWxldGluZyB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHBvcHVwIGluc3RhbmNlIGNyZWF0ZWQgaW5cclxuICAvLyBzaG93UmVzdWx0cy4gVGhlIHBvcHVwIGluc3RhbmNlIHdpbGwgcmVtYWluIGluIG1lbW9yeSBmcm9tIHRoZSBmaXJzdCB0aW1lIHRoZSByZXN1bHRzIGFyZSBzaG93biB1bnRpbCB0aGlzIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXHJcbiAgaGlkZVJlc3VsdHMoZXJyPzogYW55KSB7XHJcbiAgICB0aGlzLmNsb3NlUGFuZWwoKTtcclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2xlYW5zIHVwIGxpc3RlbmVycyBmb3IgdGhlIHBvcHVwIC0gd2lsbCBnZXQgZXhlY3V0ZWQgbm8gbWF0dGVyIGhvdyB0aGUgcG9wdXAgaXMgY2xvc2VkLlxyXG4gIG9uT3ZlcmxheUNsb3NlZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBvcHVwICYmIHRoaXMucG9wdXAuaW5zdGFuY2UgJiYgdGhpcy5wb3B1cC5pbnN0YW5jZS5jbGVhblVwKSB7XHJcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2UuY2xlYW5VcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGFjY2Vzc29yXHJcbiAgZ2V0IHZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gc2V0IGFjY2Vzc29yIGluY2x1ZGluZyBjYWxsIHRoZSBvbmNoYW5nZSBjYWxsYmFja1xyXG4gIHNldCB2YWx1ZShzZWxlY3RlZCkge1xyXG4gICAgaWYgKCFzZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLnRlcm0gPSAnJztcclxuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xyXG4gICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5fdmFsdWUpO1xyXG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZC52YWx1ZSAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy50ZXJtID0gdGhpcy5jbGVhclZhbHVlT25TZWxlY3QgPyAnJyA6IHNlbGVjdGVkLmxhYmVsO1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IHNlbGVjdGVkLnZhbHVlO1xyXG4gICAgICB0aGlzLmNoYW5nZWQuZW1pdCh7IHZhbHVlOiBzZWxlY3RlZC52YWx1ZSwgcmF3VmFsdWU6IHsgbGFiZWw6IHRoaXMudGVybSwgdmFsdWU6IHNlbGVjdGVkLnZhbHVlIH0gfSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0LmVtaXQoc2VsZWN0ZWQpO1xyXG4gICAgICB0aGlzLm9uTW9kZWxDaGFuZ2Uoc2VsZWN0ZWQudmFsdWUpO1xyXG4gICAgICBpZiAodGhpcy5wb3B1cCkge1xyXG4gICAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2Uuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNoYW5nZWQuZW1pdCh7IHZhbHVlOiBzZWxlY3RlZC52YWx1ZSwgcmF3VmFsdWU6IHsgbGFiZWw6IHRoaXMudGVybSwgdmFsdWU6IHRoaXMuX3ZhbHVlIH0gfSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0LmVtaXQoc2VsZWN0ZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvLyBNYWtlcyBzdXJlIHRvIGNsZWFyIHRoZSBtb2RlbCBpZiB0aGUgdXNlciBjbGVhcnMgdGhlIHRleHQgYm94XHJcbiAgY2hlY2tUZXJtKGV2ZW50KSB7XHJcbiAgICB0aGlzLnR5cGluZy5lbWl0KGV2ZW50KTtcclxuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XHJcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLl92YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8vIFNldCB0b3VjaGVkIG9uIGJsdXJcclxuICBvblRvdWNoZWQoZXZlbnQ/OiBFdmVudCkge1xyXG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5ibHVyLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNsZWFyVmFsdWVPblNlbGVjdCkge1xyXG4gICAgICB0aGlzLnRlcm0gPSAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF0aGlzLmNvbmZpZy51c2VHZXRMYWJlbHMpIHtcclxuICAgICAgICB0aGlzLnRlcm0gPSB2YWx1ZTtcclxuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS5sYWJlbCkge1xyXG4gICAgICAgIHRoaXMudGVybSA9IHZhbHVlLmxhYmVsO1xyXG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLmZpcnN0TmFtZSkge1xyXG4gICAgICAgIHRoaXMudGVybSA9IGAke3ZhbHVlLmZpcnN0TmFtZX0gJHt2YWx1ZS5sYXN0TmFtZX1gO1xyXG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLm5hbWUpIHtcclxuICAgICAgICB0aGlzLnRlcm0gPSB2YWx1ZS5uYW1lO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5nZXRMYWJlbHMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZy5nZXRMYWJlbHModmFsdWUpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLnRlcm0gPSByZXN1bHQubGVuZ3RoID8gcmVzdWx0WzBdLmxhYmVsIHx8ICcnIDogcmVzdWx0LmxhYmVsIHx8ICcnO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50ZXJtID0gdmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS50aXRsZSkge1xyXG4gICAgICAgIHRoaXMudGVybSA9IHZhbHVlLnRpdGxlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudGVybSA9IHZhbHVlIHx8ICcnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgIHRoaXMub25Nb2RlbFRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rpc2FibGVQaWNrZXJJbnB1dCA9IGRpc2FibGVkO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1
|
+
// NG2
|
|
2
|
+
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
3
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
// Vendor
|
|
5
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
6
|
+
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
7
|
+
import { fromEvent } from 'rxjs';
|
|
8
|
+
// APP
|
|
9
|
+
import { KeyCodes } from '../../utils/key-codes/KeyCodes';
|
|
10
|
+
import { PickerResults } from './extras/picker-results/PickerResults';
|
|
11
|
+
import { ComponentUtils } from '../../utils/component-utils/ComponentUtils';
|
|
12
|
+
import { Helpers } from '../../utils/Helpers';
|
|
13
|
+
import { NovoOverlayTemplateComponent } from '../overlay/Overlay';
|
|
14
|
+
import { notify } from '../../utils/notifier/notifier.util';
|
|
15
|
+
// Value accessor for the component (supports ngModel)
|
|
16
|
+
const PICKER_VALUE_ACCESSOR = {
|
|
17
|
+
provide: NG_VALUE_ACCESSOR,
|
|
18
|
+
useExisting: forwardRef(() => NovoPickerElement),
|
|
19
|
+
multi: true,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* @description This class is the directive definition of the Picker. If you add and attribute of `picker` to an input,
|
|
23
|
+
* it will create an instance of the picker which wraps the input in all of the picker HTML elements and functionality.
|
|
24
|
+
* Picker should be added as a two-way bound ngModel instance `[(picker)]=""` in order to have the picker options
|
|
25
|
+
* dynamically populate.
|
|
26
|
+
*/
|
|
27
|
+
export class NovoPickerElement {
|
|
28
|
+
constructor(element, componentUtils, ref) {
|
|
29
|
+
this.element = element;
|
|
30
|
+
this.componentUtils = componentUtils;
|
|
31
|
+
this.ref = ref;
|
|
32
|
+
this.closeOnSelect = true;
|
|
33
|
+
this.selected = [];
|
|
34
|
+
// Deprecated
|
|
35
|
+
this.appendToBody = false;
|
|
36
|
+
// Deprecated
|
|
37
|
+
this.parentScrollAction = 'close';
|
|
38
|
+
// Side the dropdown will open
|
|
39
|
+
this.side = 'left';
|
|
40
|
+
// Autoselects the first option in the results
|
|
41
|
+
this.autoSelectFirstOption = true;
|
|
42
|
+
this._disablePickerInput = false;
|
|
43
|
+
// Emitter for selects
|
|
44
|
+
this.changed = new EventEmitter();
|
|
45
|
+
this.select = new EventEmitter();
|
|
46
|
+
this.focus = new EventEmitter();
|
|
47
|
+
this.blur = new EventEmitter();
|
|
48
|
+
this.typing = new EventEmitter();
|
|
49
|
+
this.term = '';
|
|
50
|
+
this.onModelChange = () => { };
|
|
51
|
+
this.onModelTouched = () => { };
|
|
52
|
+
}
|
|
53
|
+
// Disable from typing into the picker (result template does everything)
|
|
54
|
+
set disablePickerInput(v) {
|
|
55
|
+
this._disablePickerInput = coerceBooleanProperty(v);
|
|
56
|
+
}
|
|
57
|
+
get disablePickerInput() {
|
|
58
|
+
return this._disablePickerInput;
|
|
59
|
+
}
|
|
60
|
+
ngOnInit() {
|
|
61
|
+
if (this.overrideElement) {
|
|
62
|
+
this.element = this.overrideElement;
|
|
63
|
+
}
|
|
64
|
+
if (this.appendToBody) {
|
|
65
|
+
notify(`'appendToBody' has been deprecated. Please remove this attribute.`);
|
|
66
|
+
}
|
|
67
|
+
// Custom results template
|
|
68
|
+
this.resultsComponent = this.config.resultsTemplate || PickerResults;
|
|
69
|
+
// Get all distinct key up events from the input and only fire if long enough and distinct
|
|
70
|
+
// let input = this.element.nativeElement.querySelector('input');
|
|
71
|
+
const pasteObserver = fromEvent(this.input.nativeElement, 'paste').pipe(debounceTime(250), distinctUntilChanged());
|
|
72
|
+
pasteObserver.subscribe((event) => this.onDebouncedKeyup(event), (err) => this.hideResults(err));
|
|
73
|
+
const keyboardObserver = fromEvent(this.input.nativeElement, 'keyup').pipe(debounceTime(250), distinctUntilChanged());
|
|
74
|
+
keyboardObserver.subscribe((event) => this.onDebouncedKeyup(event), (err) => this.hideResults(err));
|
|
75
|
+
}
|
|
76
|
+
onDebouncedKeyup(event) {
|
|
77
|
+
if ([KeyCodes.ESC, KeyCodes.UP, KeyCodes.DOWN, KeyCodes.ENTER, KeyCodes.TAB].includes(event['keyCode'])) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.show(event.target.value);
|
|
81
|
+
}
|
|
82
|
+
openPanel() {
|
|
83
|
+
this.container.openPanel();
|
|
84
|
+
}
|
|
85
|
+
closePanel() {
|
|
86
|
+
this.container.closePanel();
|
|
87
|
+
}
|
|
88
|
+
get panelOpen() {
|
|
89
|
+
return this.container && this.container.panelOpen;
|
|
90
|
+
}
|
|
91
|
+
show(term) {
|
|
92
|
+
this.openPanel();
|
|
93
|
+
// Show the results inside
|
|
94
|
+
this.showResults(term);
|
|
95
|
+
}
|
|
96
|
+
onKeyDown(event) {
|
|
97
|
+
if (this.disablePickerInput) {
|
|
98
|
+
Helpers.swallowEvent(event);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (this.panelOpen && !this.disablePickerInput) {
|
|
102
|
+
if (event.keyCode === KeyCodes.ESC || event.keyCode === KeyCodes.TAB) {
|
|
103
|
+
this.hideResults();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (event.keyCode === KeyCodes.UP) {
|
|
107
|
+
this.popup.instance.prevActiveMatch();
|
|
108
|
+
this.ref.markForCheck();
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (event.keyCode === KeyCodes.DOWN) {
|
|
112
|
+
this.popup.instance.nextActiveMatch();
|
|
113
|
+
this.ref.markForCheck();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (event.keyCode === KeyCodes.ENTER) {
|
|
117
|
+
const activeMatch = this.popup.instance.activeMatch;
|
|
118
|
+
if (!this.selected.find((selected) => activeMatch && activeMatch.value && selected.value === activeMatch.value)) {
|
|
119
|
+
this.popup.instance.selectActiveMatch();
|
|
120
|
+
this.ref.markForCheck();
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if ((event.keyCode === KeyCodes.BACKSPACE || event.keyCode === KeyCodes.DELETE) && !Helpers.isBlank(this._value)) {
|
|
125
|
+
this.clearValue(false);
|
|
126
|
+
this.closePanel();
|
|
127
|
+
}
|
|
128
|
+
if (event.keyCode === KeyCodes.DELETE && Helpers.isBlank(this._value)) {
|
|
129
|
+
this.clearValue(true);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
clearValue(wipeTerm) {
|
|
134
|
+
this._value = null;
|
|
135
|
+
this.select.emit(this._value);
|
|
136
|
+
this.changed.emit({ value: this._value, rawValue: { label: '', value: this._value } });
|
|
137
|
+
this.onModelChange(this._value);
|
|
138
|
+
if (wipeTerm) {
|
|
139
|
+
this.term = '';
|
|
140
|
+
this.hideResults();
|
|
141
|
+
}
|
|
142
|
+
this.ref.markForCheck();
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* @description When the input's focus event is called this method calls the debounced function that displays the
|
|
146
|
+
* results.
|
|
147
|
+
*/
|
|
148
|
+
onFocus(event) {
|
|
149
|
+
if (!this.panelOpen) {
|
|
150
|
+
this.show();
|
|
151
|
+
}
|
|
152
|
+
this.focus.emit(event);
|
|
153
|
+
}
|
|
154
|
+
// Creates an instance of the results (called popup) and adds all the bindings to that instance.
|
|
155
|
+
showResults(term) {
|
|
156
|
+
// Update Matches
|
|
157
|
+
if (this.popup) {
|
|
158
|
+
// Update existing list or create the DOM element
|
|
159
|
+
this.popup.instance.config = this.config;
|
|
160
|
+
this.popup.instance.term = this.term;
|
|
161
|
+
this.popup.instance.selected = this.selected;
|
|
162
|
+
this.popup.instance.autoSelectFirstOption = this.autoSelectFirstOption;
|
|
163
|
+
this.ref.markForCheck();
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.popup = this.componentUtils.append(this.resultsComponent, this.results);
|
|
167
|
+
this.popup.instance.parent = this;
|
|
168
|
+
this.popup.instance.config = this.config;
|
|
169
|
+
this.popup.instance.term = this.term;
|
|
170
|
+
this.popup.instance.selected = this.selected;
|
|
171
|
+
this.popup.instance.autoSelectFirstOption = this.autoSelectFirstOption;
|
|
172
|
+
this.popup.instance.overlay = this.container.overlayRef;
|
|
173
|
+
this.ref.markForCheck();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Tells the overlay component to hide the picker results from the DOM without deleting the dynamically allocated popup instance created in
|
|
177
|
+
// showResults. The popup instance will remain in memory from the first time the results are shown until this component is destroyed.
|
|
178
|
+
hideResults(err) {
|
|
179
|
+
this.closePanel();
|
|
180
|
+
this.ref.markForCheck();
|
|
181
|
+
}
|
|
182
|
+
// Cleans up listeners for the popup - will get executed no matter how the popup is closed.
|
|
183
|
+
onOverlayClosed() {
|
|
184
|
+
if (this.popup && this.popup.instance && this.popup.instance.cleanUp) {
|
|
185
|
+
this.popup.instance.cleanUp();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// get accessor
|
|
189
|
+
get value() {
|
|
190
|
+
return this._value;
|
|
191
|
+
}
|
|
192
|
+
// set accessor including call the onchange callback
|
|
193
|
+
set value(selected) {
|
|
194
|
+
if (!selected) {
|
|
195
|
+
this.term = '';
|
|
196
|
+
this._value = null;
|
|
197
|
+
this.onModelChange(this._value);
|
|
198
|
+
}
|
|
199
|
+
else if (selected.value !== this._value) {
|
|
200
|
+
this.term = this.clearValueOnSelect ? '' : selected.label;
|
|
201
|
+
this._value = selected.value;
|
|
202
|
+
this.changed.emit({ value: selected.value, rawValue: { label: this.term, value: selected.value } });
|
|
203
|
+
this.select.emit(selected);
|
|
204
|
+
this.onModelChange(selected.value);
|
|
205
|
+
if (this.popup) {
|
|
206
|
+
this.popup.instance.selected = this.selected;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
this.changed.emit({ value: selected.value, rawValue: { label: this.term, value: this._value } });
|
|
211
|
+
this.select.emit(selected);
|
|
212
|
+
}
|
|
213
|
+
this.ref.markForCheck();
|
|
214
|
+
}
|
|
215
|
+
// Makes sure to clear the model if the user clears the text box
|
|
216
|
+
checkTerm(event) {
|
|
217
|
+
this.typing.emit(event);
|
|
218
|
+
if (!event || !event.length) {
|
|
219
|
+
this._value = null;
|
|
220
|
+
this.onModelChange(this._value);
|
|
221
|
+
}
|
|
222
|
+
this.ref.markForCheck();
|
|
223
|
+
}
|
|
224
|
+
// Set touched on blur
|
|
225
|
+
onTouched(event) {
|
|
226
|
+
this.onModelTouched();
|
|
227
|
+
this.blur.emit(event);
|
|
228
|
+
}
|
|
229
|
+
// From ControlValueAccessor interface
|
|
230
|
+
writeValue(value) {
|
|
231
|
+
if (this.clearValueOnSelect) {
|
|
232
|
+
this.term = '';
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
if (typeof value === 'string' && !this.config.useGetLabels) {
|
|
236
|
+
this.term = value;
|
|
237
|
+
}
|
|
238
|
+
else if (value && value.label) {
|
|
239
|
+
this.term = value.label;
|
|
240
|
+
}
|
|
241
|
+
else if (value && value.firstName) {
|
|
242
|
+
this.term = `${value.firstName} ${value.lastName}`;
|
|
243
|
+
}
|
|
244
|
+
else if (value && value.name) {
|
|
245
|
+
this.term = value.name;
|
|
246
|
+
}
|
|
247
|
+
else if (typeof this.config.getLabels === 'function') {
|
|
248
|
+
this.config.getLabels(value).then((result) => {
|
|
249
|
+
if (result) {
|
|
250
|
+
this.term = result.length ? result[0].label || '' : result.label || '';
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
this.term = value;
|
|
254
|
+
}
|
|
255
|
+
this.ref.markForCheck();
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
else if (value && value.title) {
|
|
259
|
+
this.term = value.title;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
this.term = value || '';
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
this._value = value;
|
|
266
|
+
this.ref.markForCheck();
|
|
267
|
+
}
|
|
268
|
+
registerOnChange(fn) {
|
|
269
|
+
this.onModelChange = fn;
|
|
270
|
+
}
|
|
271
|
+
registerOnTouched(fn) {
|
|
272
|
+
this.onModelTouched = fn;
|
|
273
|
+
}
|
|
274
|
+
setDisabledState(disabled) {
|
|
275
|
+
this._disablePickerInput = disabled;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
NovoPickerElement.decorators = [
|
|
279
|
+
{ type: Component, args: [{
|
|
280
|
+
selector: 'novo-picker',
|
|
281
|
+
providers: [PICKER_VALUE_ACCESSOR],
|
|
282
|
+
template: `
|
|
283
|
+
<i class="bhi-more" *ngIf="config?.entityIcon && !_value"></i>
|
|
284
|
+
<i class="bhi-{{ config?.entityIcon }} entity-icon {{ config?.entityIcon }}" *ngIf="config?.entityIcon && _value"></i>
|
|
285
|
+
<input
|
|
286
|
+
type="text"
|
|
287
|
+
class="picker-input"
|
|
288
|
+
[(ngModel)]="term"
|
|
289
|
+
[class.entity-picker]="config?.entityIcon"
|
|
290
|
+
[class.entity-selected]="config?.entityIcon && _value"
|
|
291
|
+
(ngModelChange)="checkTerm($event)"
|
|
292
|
+
[placeholder]="placeholder"
|
|
293
|
+
(keydown)="onKeyDown($event)"
|
|
294
|
+
(focus)="onFocus($event)"
|
|
295
|
+
(click)="onFocus($event)"
|
|
296
|
+
(blur)="onTouched($event)"
|
|
297
|
+
autocomplete="off"
|
|
298
|
+
#input
|
|
299
|
+
[disabled]="disablePickerInput"
|
|
300
|
+
/>
|
|
301
|
+
<i class="bhi-search" *ngIf="(!_value || clearValueOnSelect) && !disablePickerInput"></i>
|
|
302
|
+
<i
|
|
303
|
+
class="bhi-times"
|
|
304
|
+
[class.entity-selected]="config?.entityIcon && _value"
|
|
305
|
+
*ngIf="_value && !clearValueOnSelect && !disablePickerInput"
|
|
306
|
+
(click)="clearValue(true)"
|
|
307
|
+
></i>
|
|
308
|
+
<novo-overlay-template class="picker-results-container" [parent]="element" position="above-below" (closing)="onOverlayClosed()">
|
|
309
|
+
<span #results></span>
|
|
310
|
+
<ng-content></ng-content>
|
|
311
|
+
</novo-overlay-template>
|
|
312
|
+
`
|
|
313
|
+
},] }
|
|
314
|
+
];
|
|
315
|
+
NovoPickerElement.ctorParameters = () => [
|
|
316
|
+
{ type: ElementRef },
|
|
317
|
+
{ type: ComponentUtils },
|
|
318
|
+
{ type: ChangeDetectorRef }
|
|
319
|
+
];
|
|
320
|
+
NovoPickerElement.propDecorators = {
|
|
321
|
+
results: [{ type: ViewChild, args: ['results', { read: ViewContainerRef, static: true },] }],
|
|
322
|
+
config: [{ type: Input }],
|
|
323
|
+
placeholder: [{ type: Input }],
|
|
324
|
+
clearValueOnSelect: [{ type: Input }],
|
|
325
|
+
closeOnSelect: [{ type: Input }],
|
|
326
|
+
selected: [{ type: Input }],
|
|
327
|
+
appendToBody: [{ type: Input }],
|
|
328
|
+
parentScrollSelector: [{ type: Input }],
|
|
329
|
+
parentScrollAction: [{ type: Input }],
|
|
330
|
+
containerClass: [{ type: Input }],
|
|
331
|
+
side: [{ type: Input }],
|
|
332
|
+
autoSelectFirstOption: [{ type: Input }],
|
|
333
|
+
overrideElement: [{ type: Input }],
|
|
334
|
+
disablePickerInput: [{ type: Input }],
|
|
335
|
+
changed: [{ type: Output }],
|
|
336
|
+
select: [{ type: Output }],
|
|
337
|
+
focus: [{ type: Output }],
|
|
338
|
+
blur: [{ type: Output }],
|
|
339
|
+
typing: [{ type: Output }],
|
|
340
|
+
container: [{ type: ViewChild, args: [NovoOverlayTemplateComponent, { static: true },] }],
|
|
341
|
+
input: [{ type: ViewChild, args: ['input', { static: true },] }]
|
|
342
|
+
};
|
|
343
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGlja2VyLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL25vdm8tZWxlbWVudHMvbm92by1lbGVtZW50cy9wcm9qZWN0cy9ub3ZvLWVsZW1lbnRzL3NyYy8iLCJzb3VyY2VzIjpbImVsZW1lbnRzL3BpY2tlci9QaWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTTtBQUNOLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUVULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxTQUFTO0FBQ1QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsTUFBTTtBQUNOLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFHNUQsc0RBQXNEO0FBQ3RELE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO0lB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QU07b0JBRU4sTUFBTTttQkFFTixNQUFNO3FCQUVOLE1BQU07d0JBR04sU0FBUyxTQUFDLDRCQUE0QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtvQkFFeEQsU0FBUyxTQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBORzJcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8vIFZlbmRvclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbi8vIEFQUFxuaW1wb3J0IHsgS2V5Q29kZXMgfSBmcm9tICcuLi8uLi91dGlscy9rZXktY29kZXMvS2V5Q29kZXMnO1xuaW1wb3J0IHsgUGlja2VyUmVzdWx0cyB9IGZyb20gJy4vZXh0cmFzL3BpY2tlci1yZXN1bHRzL1BpY2tlclJlc3VsdHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50VXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9jb21wb25lbnQtdXRpbHMvQ29tcG9uZW50VXRpbHMnO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gJy4uLy4uL3V0aWxzL0hlbHBlcnMnO1xuaW1wb3J0IHsgTm92b092ZXJsYXlUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL292ZXJsYXkvT3ZlcmxheSc7XG5pbXBvcnQgeyBub3RpZnkgfSBmcm9tICcuLi8uLi91dGlscy9ub3RpZmllci9ub3RpZmllci51dGlsJztcbmltcG9ydCB7IE5vdm9Db250cm9sQ29uZmlnIH0gZnJvbSAnLi4vZm9ybS9Gb3JtQ29udHJvbHMnO1xuXG4vLyBWYWx1ZSBhY2Nlc3NvciBmb3IgdGhlIGNvbXBvbmVudCAoc3VwcG9ydHMgbmdNb2RlbClcbmNvbnN0IFBJQ0tFUl9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5vdm9QaWNrZXJFbGVtZW50KSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIGNsYXNzIGlzIHRoZSBkaXJlY3RpdmUgZGVmaW5pdGlvbiBvZiB0aGUgUGlja2VyLiBJZiB5b3UgYWRkIGFuZCBhdHRyaWJ1dGUgb2YgYHBpY2tlcmAgdG8gYW4gaW5wdXQsXG4gKiBpdCB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcGlja2VyIHdoaWNoIHdyYXBzIHRoZSBpbnB1dCBpbiBhbGwgb2YgdGhlIHBpY2tlciBIVE1MIGVsZW1lbnRzIGFuZCBmdW5jdGlvbmFsaXR5LlxuICogUGlja2VyIHNob3VsZCBiZSBhZGRlZCBhcyBhIHR3by13YXkgYm91bmQgbmdNb2RlbCBpbnN0YW5jZSBgWyhwaWNrZXIpXT1cIlwiYCBpbiBvcmRlciB0byBoYXZlIHRoZSBwaWNrZXIgb3B0aW9uc1xuICogZHluYW1pY2FsbHkgcG9wdWxhdGUuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25vdm8tcGlja2VyJyxcbiAgcHJvdmlkZXJzOiBbUElDS0VSX1ZBTFVFX0FDQ0VTU09SXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aSBjbGFzcz1cImJoaS1tb3JlXCIgKm5nSWY9XCJjb25maWc/LmVudGl0eUljb24gJiYgIV92YWx1ZVwiPjwvaT5cbiAgICA8aSBjbGFzcz1cImJoaS17eyBjb25maWc/LmVudGl0eUljb24gfX0gZW50aXR5LWljb24ge3sgY29uZmlnPy5lbnRpdHlJY29uIH19XCIgKm5nSWY9XCJjb25maWc/LmVudGl0eUljb24gJiYgX3ZhbHVlXCI+PC9pPlxuICAgIDxpbnB1dFxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgY2xhc3M9XCJwaWNrZXItaW5wdXRcIlxuICAgICAgWyhuZ01vZGVsKV09XCJ0ZXJtXCJcbiAgICAgIFtjbGFzcy5lbnRpdHktcGlja2VyXT1cImNvbmZpZz8uZW50aXR5SWNvblwiXG4gICAgICBbY2xhc3MuZW50aXR5LXNlbGVjdGVkXT1cImNvbmZpZz8uZW50aXR5SWNvbiAmJiBfdmFsdWVcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tUZXJtKCRldmVudClcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIm9uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAoYmx1cik9XCJvblRvdWNoZWQoJGV2ZW50KVwiXG4gICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgI2lucHV0XG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVBpY2tlcklucHV0XCJcbiAgICAvPlxuICAgIDxpIGNsYXNzPVwiYmhpLXNlYXJjaFwiICpuZ0lmPVwiKCFfdmFsdWUgfHwgY2xlYXJWYWx1ZU9uU2VsZWN0KSAmJiAhZGlzYWJsZVBpY2tlcklucHV0XCI+PC9pPlxuICAgIDxpXG4gICAgICBjbGFzcz1cImJoaS10aW1lc1wiXG4gICAgICBbY2xhc3MuZW50aXR5LXNlbGVjdGVkXT1cImNvbmZpZz8uZW50aXR5SWNvbiAmJiBfdmFsdWVcIlxuICAgICAgKm5nSWY9XCJfdmFsdWUgJiYgIWNsZWFyVmFsdWVPblNlbGVjdCAmJiAhZGlzYWJsZVBpY2tlcklucHV0XCJcbiAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKHRydWUpXCJcbiAgICA+PC9pPlxuICAgIDxub3ZvLW92ZXJsYXktdGVtcGxhdGUgY2xhc3M9XCJwaWNrZXItcmVzdWx0cy1jb250YWluZXJcIiBbcGFyZW50XT1cImVsZW1lbnRcIiBwb3NpdGlvbj1cImFib3ZlLWJlbG93XCIgKGNsb3NpbmcpPVwib25PdmVybGF5Q2xvc2VkKClcIj5cbiAgICAgIDxzcGFuICNyZXN1bHRzPjwvc3Bhbj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L25vdm8tb3ZlcmxheS10ZW1wbGF0ZT5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgTm92b1BpY2tlckVsZW1lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyBDb250YWluZXIgZm9yIHRoZSByZXN1bHRzXG4gIEBWaWV3Q2hpbGQoJ3Jlc3VsdHMnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICByZXN1bHRzOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBJbnB1dCgpXG4gIGNvbmZpZzogTm92b0NvbnRyb2xDb25maWdbJ2NvbmZpZyddO1xuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKVxuICBjbGVhclZhbHVlT25TZWxlY3Q6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIGNsb3NlT25TZWxlY3Q6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBzZWxlY3RlZDogQXJyYXk8YW55PiA9IFtdO1xuICAvLyBEZXByZWNhdGVkXG4gIEBJbnB1dCgpXG4gIGFwcGVuZFRvQm9keTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBEZXByZWNhdGVkXG4gIEBJbnB1dCgpXG4gIHBhcmVudFNjcm9sbFNlbGVjdG9yOiBzdHJpbmc7XG4gIC8vIERlcHJlY2F0ZWRcbiAgQElucHV0KClcbiAgcGFyZW50U2Nyb2xsQWN0aW9uOiBzdHJpbmcgPSAnY2xvc2UnO1xuICAvLyBDdXN0b20gY2xhc3MgZm9yIHRoZSBkcm9wZG93biBjb250YWluZXJcbiAgQElucHV0KClcbiAgY29udGFpbmVyQ2xhc3M6IHN0cmluZztcbiAgLy8gU2lkZSB0aGUgZHJvcGRvd24gd2lsbCBvcGVuXG4gIEBJbnB1dCgpXG4gIHNpZGU6IHN0cmluZyA9ICdsZWZ0JztcbiAgLy8gQXV0b3NlbGVjdHMgdGhlIGZpcnN0IG9wdGlvbiBpbiB0aGUgcmVzdWx0c1xuICBASW5wdXQoKVxuICBhdXRvU2VsZWN0Rmlyc3RPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBvdmVycmlkZUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgLy8gRGlzYWJsZSBmcm9tIHR5cGluZyBpbnRvIHRoZSBwaWNrZXIgKHJlc3VsdCB0ZW1wbGF0ZSBkb2VzIGV2ZXJ5dGhpbmcpXG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlUGlja2VySW5wdXQodjogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVQaWNrZXJJbnB1dCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgfVxuXG4gIGdldCBkaXNhYmxlUGlja2VySW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVQaWNrZXJJbnB1dDtcbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVQaWNrZXJJbnB1dDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEVtaXR0ZXIgZm9yIHNlbGVjdHNcbiAgQE91dHB1dCgpXG4gIGNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgc2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIGZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgdHlwaW5nOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKE5vdm9PdmVybGF5VGVtcGxhdGVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHB1YmxpYyBjb250YWluZXI6IE5vdm9PdmVybGF5VGVtcGxhdGVDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBpbnB1dDogRWxlbWVudFJlZjtcblxuICB0ZXJtOiBzdHJpbmcgPSAnJztcbiAgcmVzdWx0c0NvbXBvbmVudDogYW55O1xuICBwb3B1cDogQ29tcG9uZW50UmVmPGFueT47XG4gIF92YWx1ZTogYW55O1xuICBvbk1vZGVsQ2hhbmdlOiBGdW5jdGlvbiA9ICgpID0+IHsgfTtcbiAgb25Nb2RlbFRvdWNoZWQ6IEZ1bmN0aW9uID0gKCkgPT4geyB9O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIGNvbXBvbmVudFV0aWxzOiBDb21wb25lbnRVdGlscywgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5vdmVycmlkZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMub3ZlcnJpZGVFbGVtZW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5hcHBlbmRUb0JvZHkpIHtcbiAgICAgIG5vdGlmeShgJ2FwcGVuZFRvQm9keScgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHJlbW92ZSB0aGlzIGF0dHJpYnV0ZS5gKTtcbiAgICB9XG4gICAgLy8gQ3VzdG9tIHJlc3VsdHMgdGVtcGxhdGVcbiAgICB0aGlzLnJlc3VsdHNDb21wb25lbnQgPSB0aGlzLmNvbmZpZy5yZXN1bHRzVGVtcGxhdGUgfHwgUGlja2VyUmVzdWx0cztcbiAgICAvLyBHZXQgYWxsIGRpc3RpbmN0IGtleSB1cCBldmVudHMgZnJvbSB0aGUgaW5wdXQgYW5kIG9ubHkgZmlyZSBpZiBsb25nIGVub3VnaCBhbmQgZGlzdGluY3RcbiAgICAvLyBsZXQgaW5wdXQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGNvbnN0IHBhc3RlT2JzZXJ2ZXIgPSBmcm9tRXZlbnQodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAncGFzdGUnKS5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICk7XG4gICAgcGFzdGVPYnNlcnZlci5zdWJzY3JpYmUoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4gdGhpcy5vbkRlYm91bmNlZEtleXVwKGV2ZW50KSwgKGVycikgPT4gdGhpcy5oaWRlUmVzdWx0cyhlcnIpKTtcbiAgICBjb25zdCBrZXlib2FyZE9ic2VydmVyID0gZnJvbUV2ZW50KHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ2tleXVwJykucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICApO1xuICAgIGtleWJvYXJkT2JzZXJ2ZXIuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5vbkRlYm91bmNlZEtleXVwKGV2ZW50KSwgKGVycikgPT4gdGhpcy5oaWRlUmVzdWx0cyhlcnIpKTtcbiAgfVxuXG4gIHByaXZhdGUgb25EZWJvdW5jZWRLZXl1cChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoW0tleUNvZGVzLkVTQywgS2V5Q29kZXMuVVAsIEtleUNvZGVzLkRPV04sIEtleUNvZGVzLkVOVEVSLCBLZXlDb2Rlcy5UQUJdLmluY2x1ZGVzKGV2ZW50WydrZXlDb2RlJ10pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2hvdygoZXZlbnQudGFyZ2V0IGFzIGFueSkudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIG9wZW5QYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRhaW5lci5vcGVuUGFuZWwoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZVBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyLmNsb3NlUGFuZWwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFuZWxPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5wYW5lbE9wZW47XG4gIH1cblxuICBwcml2YXRlIHNob3codGVybT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3BlblBhbmVsKCk7XG4gICAgLy8gU2hvdyB0aGUgcmVzdWx0cyBpbnNpZGVcbiAgICB0aGlzLnNob3dSZXN1bHRzKHRlcm0pO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZVBpY2tlcklucHV0KSB7XG4gICAgICBIZWxwZXJzLnN3YWxsb3dFdmVudChldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhbmVsT3BlbiAmJiAhdGhpcy5kaXNhYmxlUGlja2VySW5wdXQpIHtcbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5FU0MgfHwgZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZXMuVEFCKSB7XG4gICAgICAgIHRoaXMuaGlkZVJlc3VsdHMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZXMuVVApIHtcbiAgICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5wcmV2QWN0aXZlTWF0Y2goKTtcbiAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGVzLkRPV04pIHtcbiAgICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5uZXh0QWN0aXZlTWF0Y2goKTtcbiAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGVzLkVOVEVSKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZU1hdGNoID0gdGhpcy5wb3B1cC5pbnN0YW5jZS5hY3RpdmVNYXRjaDtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkLmZpbmQoKHNlbGVjdGVkKSA9PiBhY3RpdmVNYXRjaCAmJiBhY3RpdmVNYXRjaC52YWx1ZSAmJiBzZWxlY3RlZC52YWx1ZSA9PT0gYWN0aXZlTWF0Y2gudmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5zZWxlY3RBY3RpdmVNYXRjaCgpO1xuICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5CQUNLU1BBQ0UgfHwgZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZXMuREVMRVRFKSAmJiAhSGVscGVycy5pc0JsYW5rKHRoaXMuX3ZhbHVlKSkge1xuICAgICAgICB0aGlzLmNsZWFyVmFsdWUoZmFsc2UpO1xuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5ERUxFVEUgJiYgSGVscGVycy5pc0JsYW5rKHRoaXMuX3ZhbHVlKSkge1xuICAgICAgICB0aGlzLmNsZWFyVmFsdWUodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJWYWx1ZSh3aXBlVGVybSkge1xuICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdC5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZWQuZW1pdCh7IHZhbHVlOiB0aGlzLl92YWx1ZSwgcmF3VmFsdWU6IHsgbGFiZWw6ICcnLCB2YWx1ZTogdGhpcy5fdmFsdWUgfSB9KTtcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5fdmFsdWUpO1xuXG4gICAgaWYgKHdpcGVUZXJtKSB7XG4gICAgICB0aGlzLnRlcm0gPSAnJztcbiAgICAgIHRoaXMuaGlkZVJlc3VsdHMoKTtcbiAgICB9XG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZW4gdGhlIGlucHV0J3MgZm9jdXMgZXZlbnQgaXMgY2FsbGVkIHRoaXMgbWV0aG9kIGNhbGxzIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkaXNwbGF5cyB0aGVcbiAgICogcmVzdWx0cy5cbiAgICovXG4gIG9uRm9jdXMoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gICAgdGhpcy5mb2N1cy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc3VsdHMgKGNhbGxlZCBwb3B1cCkgYW5kIGFkZHMgYWxsIHRoZSBiaW5kaW5ncyB0byB0aGF0IGluc3RhbmNlLlxuICBzaG93UmVzdWx0cyh0ZXJtPzogYW55KSB7XG4gICAgLy8gVXBkYXRlIE1hdGNoZXNcbiAgICBpZiAodGhpcy5wb3B1cCkge1xuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGxpc3Qgb3IgY3JlYXRlIHRoZSBET00gZWxlbWVudFxuICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5jb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2UudGVybSA9IHRoaXMudGVybTtcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2Uuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5hdXRvU2VsZWN0Rmlyc3RPcHRpb24gPSB0aGlzLmF1dG9TZWxlY3RGaXJzdE9wdGlvbjtcbiAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBvcHVwID0gdGhpcy5jb21wb25lbnRVdGlscy5hcHBlbmQodGhpcy5yZXN1bHRzQ29tcG9uZW50LCB0aGlzLnJlc3VsdHMpO1xuICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5wYXJlbnQgPSB0aGlzO1xuICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5jb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2UudGVybSA9IHRoaXMudGVybTtcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2Uuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5hdXRvU2VsZWN0Rmlyc3RPcHRpb24gPSB0aGlzLmF1dG9TZWxlY3RGaXJzdE9wdGlvbjtcbiAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2Uub3ZlcmxheSA9IHRoaXMuY29udGFpbmVyLm92ZXJsYXlSZWY7XG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBUZWxscyB0aGUgb3ZlcmxheSBjb21wb25lbnQgdG8gaGlkZSB0aGUgcGlja2VyIHJlc3VsdHMgZnJvbSB0aGUgRE9NIHdpdGhvdXQgZGVsZXRpbmcgdGhlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwb3B1cCBpbnN0YW5jZSBjcmVhdGVkIGluXG4gIC8vIHNob3dSZXN1bHRzLiBUaGUgcG9wdXAgaW5zdGFuY2Ugd2lsbCByZW1haW4gaW4gbWVtb3J5IGZyb20gdGhlIGZpcnN0IHRpbWUgdGhlIHJlc3VsdHMgYXJlIHNob3duIHVudGlsIHRoaXMgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgaGlkZVJlc3VsdHMoZXJyPzogYW55KSB7XG4gICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBDbGVhbnMgdXAgbGlzdGVuZXJzIGZvciB0aGUgcG9wdXAgLSB3aWxsIGdldCBleGVjdXRlZCBubyBtYXR0ZXIgaG93IHRoZSBwb3B1cCBpcyBjbG9zZWQuXG4gIG9uT3ZlcmxheUNsb3NlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb3B1cCAmJiB0aGlzLnBvcHVwLmluc3RhbmNlICYmIHRoaXMucG9wdXAuaW5zdGFuY2UuY2xlYW5VcCkge1xuICAgICAgdGhpcy5wb3B1cC5pbnN0YW5jZS5jbGVhblVwKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0IGFjY2Vzc29yXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvLyBzZXQgYWNjZXNzb3IgaW5jbHVkaW5nIGNhbGwgdGhlIG9uY2hhbmdlIGNhbGxiYWNrXG4gIHNldCB2YWx1ZShzZWxlY3RlZCkge1xuICAgIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMudGVybSA9ICcnO1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkLnZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy50ZXJtID0gdGhpcy5jbGVhclZhbHVlT25TZWxlY3QgPyAnJyA6IHNlbGVjdGVkLmxhYmVsO1xuICAgICAgdGhpcy5fdmFsdWUgPSBzZWxlY3RlZC52YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHsgdmFsdWU6IHNlbGVjdGVkLnZhbHVlLCByYXdWYWx1ZTogeyBsYWJlbDogdGhpcy50ZXJtLCB2YWx1ZTogc2VsZWN0ZWQudmFsdWUgfSB9KTtcbiAgICAgIHRoaXMuc2VsZWN0LmVtaXQoc2VsZWN0ZWQpO1xuICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHNlbGVjdGVkLnZhbHVlKTtcbiAgICAgIGlmICh0aGlzLnBvcHVwKSB7XG4gICAgICAgIHRoaXMucG9wdXAuaW5zdGFuY2Uuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYW5nZWQuZW1pdCh7IHZhbHVlOiBzZWxlY3RlZC52YWx1ZSwgcmF3VmFsdWU6IHsgbGFiZWw6IHRoaXMudGVybSwgdmFsdWU6IHRoaXMuX3ZhbHVlIH0gfSk7XG4gICAgICB0aGlzLnNlbGVjdC5lbWl0KHNlbGVjdGVkKTtcbiAgICB9XG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBNYWtlcyBzdXJlIHRvIGNsZWFyIHRoZSBtb2RlbCBpZiB0aGUgdXNlciBjbGVhcnMgdGhlIHRleHQgYm94XG4gIGNoZWNrVGVybShldmVudCkge1xuICAgIHRoaXMudHlwaW5nLmVtaXQoZXZlbnQpO1xuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBTZXQgdG91Y2hlZCBvbiBibHVyXG4gIG9uVG91Y2hlZChldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZCgpO1xuICAgIHRoaXMuYmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmNsZWFyVmFsdWVPblNlbGVjdCkge1xuICAgICAgdGhpcy50ZXJtID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF0aGlzLmNvbmZpZy51c2VHZXRMYWJlbHMpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLmxhYmVsKSB7XG4gICAgICAgIHRoaXMudGVybSA9IHZhbHVlLmxhYmVsO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS5maXJzdE5hbWUpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gYCR7dmFsdWUuZmlyc3ROYW1lfSAke3ZhbHVlLmxhc3ROYW1lfWA7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLm5hbWUpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdmFsdWUubmFtZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmdldExhYmVscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmNvbmZpZy5nZXRMYWJlbHModmFsdWUpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMudGVybSA9IHJlc3VsdC5sZW5ndGggPyByZXN1bHRbMF0ubGFiZWwgfHwgJycgOiByZXN1bHQubGFiZWwgfHwgJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGVybSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLnRpdGxlKSB7XG4gICAgICAgIHRoaXMudGVybSA9IHZhbHVlLnRpdGxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2FibGVQaWNrZXJJbnB1dCA9IGRpc2FibGVkO1xuICB9XG59XG4iXX0=
|