novo-elements 8.3.0 → 8.4.0-next.1
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/addons/ace-editor/AceEditor.d.ts +4 -2
- package/addons/code-editor/CodeEditor.d.ts +31 -0
- package/addons/code-editor/CodeEditor.module.d.ts +9 -0
- package/addons/code-editor/CodeEditor.scss +5 -0
- package/addons/code-editor/index.d.ts +2 -0
- package/addons/code-editor/novo-elements-addons-code-editor.d.ts +5 -0
- package/addons/code-editor/package.json +10 -0
- package/addons/index.d.ts +1 -0
- package/elements/aside/aside.component.scss +1 -1
- package/elements/calendar/Calendar.module.d.ts +2 -3
- package/elements/checkbox/CheckList.scss +1 -1
- package/elements/checkbox/Checkbox.scss +1 -1
- package/elements/common/overlay/Overlay.d.ts +1 -0
- package/elements/date-picker/DatePicker.module.d.ts +2 -2
- package/elements/date-picker/DatePickerInput.d.ts +8 -5
- package/elements/date-picker/MultiDateInput.d.ts +0 -1
- package/elements/date-time-picker/DateTimePicker.module.d.ts +2 -3
- package/elements/drag-drop/drag-drop-box.d.ts +45 -0
- package/elements/drag-drop/drag-drop.module.d.ts +7 -0
- package/elements/drag-drop/index.d.ts +2 -0
- package/elements/drag-drop/novo-elements-elements-drag-drop.d.ts +5 -0
- package/elements/drag-drop/package.json +10 -0
- package/elements/dropdown/Dropdown.d.ts +7 -1
- package/elements/field/formats/date-time-format.d.ts +2 -2
- package/elements/form/Control.d.ts +9 -6
- package/elements/form/ControlTemplates.d.ts +1 -1
- package/elements/form/Form.module.d.ts +6 -6
- package/elements/form/controls/code-editor/CodeEditorControl.d.ts +5 -0
- package/elements/form/controls/code-editor/index.d.ts +1 -0
- package/elements/form/controls/index.d.ts +2 -1
- package/elements/form/extras/FormExtras.module.d.ts +4 -4
- package/elements/form/extras/file/FileInput.d.ts +15 -16
- package/elements/form/extras/file/FileInput.scss +58 -30
- package/elements/index.d.ts +1 -0
- package/elements/query-builder/condition-builder/condition-builder.component.scss +1 -1
- package/elements/query-builder/condition-definitions/address-condition.definition.d.ts +1 -1
- package/elements/select-search/select-search.component.scss +1 -1
- package/elements/table/Table.module.d.ts +5 -6
- package/elements/time-picker/TimePicker.d.ts +2 -3
- package/elements/time-picker/TimePicker.module.d.ts +3 -4
- package/elements/time-picker/TimePickerInput.d.ts +0 -1
- package/esm2020/addons/ace-editor/AceEditor.mjs +8 -4
- package/esm2020/addons/ckeditor/CKEditor.mjs +8 -1
- package/esm2020/addons/code-editor/CodeEditor.mjs +129 -0
- package/esm2020/addons/code-editor/CodeEditor.module.mjs +19 -0
- package/esm2020/addons/code-editor/index.mjs +3 -0
- package/esm2020/addons/code-editor/novo-elements-addons-code-editor.mjs +5 -0
- package/esm2020/addons/index.mjs +2 -1
- package/esm2020/elements/breadcrumbs/breadcrumb-item/BreadcrumbItem.mjs +1 -1
- package/esm2020/elements/calendar/Calendar.module.mjs +5 -7
- package/esm2020/elements/calendar/calendar.component.mjs +3 -3
- package/esm2020/elements/calendar/month-select/month-select.component.mjs +3 -3
- package/esm2020/elements/calendar/month-view/month-view.component.mjs +3 -3
- package/esm2020/elements/calendar/year-select/year-select.component.mjs +3 -3
- package/esm2020/elements/common/overlay/Overlay.mjs +11 -5
- package/esm2020/elements/data-table/cell-headers/data-table-header-cell.component.mjs +1 -1
- package/esm2020/elements/data-table/data-table-clear-button.component.mjs +1 -1
- package/esm2020/elements/data-table/data-table.component.mjs +2 -2
- package/esm2020/elements/date-picker/DatePicker.module.mjs +6 -6
- package/esm2020/elements/date-picker/DatePickerInput.mjs +50 -29
- package/esm2020/elements/date-picker/DateRangeInput.mjs +10 -16
- package/esm2020/elements/date-picker/MultiDateInput.mjs +1 -17
- package/esm2020/elements/date-time-picker/DateTimePicker.module.mjs +4 -5
- package/esm2020/elements/drag-drop/drag-drop-box.mjs +224 -0
- package/esm2020/elements/drag-drop/drag-drop.module.mjs +16 -0
- package/esm2020/elements/drag-drop/index.mjs +3 -0
- package/esm2020/elements/drag-drop/novo-elements-elements-drag-drop.mjs +5 -0
- package/esm2020/elements/dropdown/Dropdown.mjs +29 -4
- package/esm2020/elements/field/formats/date-format.mjs +5 -5
- package/esm2020/elements/field/formats/date-range-format.mjs +5 -5
- package/esm2020/elements/field/formats/date-time-format.mjs +12 -12
- package/esm2020/elements/field/formats/time-format.mjs +6 -6
- package/esm2020/elements/form/Control.mjs +20 -8
- package/esm2020/elements/form/ControlTemplates.mjs +54 -27
- package/esm2020/elements/form/Form.module.mjs +12 -13
- package/esm2020/elements/form/NovoFormControl.mjs +1 -2
- package/esm2020/elements/form/controls/code-editor/CodeEditorControl.mjs +9 -0
- package/esm2020/elements/form/controls/code-editor/index.mjs +2 -0
- package/esm2020/elements/form/controls/index.mjs +3 -2
- package/esm2020/elements/form/controls/timezone/TimezoneControl.mjs +2 -2
- package/esm2020/elements/form/extras/FormExtras.module.mjs +8 -9
- package/esm2020/elements/form/extras/file/FileInput.mjs +38 -261
- package/esm2020/elements/index.mjs +2 -1
- package/esm2020/elements/query-builder/condition-definitions/address-condition.definition.mjs +2 -2
- package/esm2020/elements/query-builder/condition-group/condition-group.component.mjs +1 -1
- package/esm2020/elements/simple-table/cell-header.mjs +2 -2
- package/esm2020/elements/simple-table/cell.mjs +1 -1
- package/esm2020/elements/tabbed-group-picker/TabbedGroupPicker.mjs +1 -1
- package/esm2020/elements/table/Table.mjs +1 -1
- package/esm2020/elements/table/Table.module.mjs +1 -6
- package/esm2020/elements/table/extras/dropdown-cell/DropdownCell.mjs +1 -1
- package/esm2020/elements/time-picker/TimePicker.mjs +5 -6
- package/esm2020/elements/time-picker/TimePicker.module.mjs +4 -5
- package/esm2020/elements/time-picker/TimePickerInput.mjs +3 -65
- package/esm2020/index.mjs +1 -1
- package/esm2020/novo-elements.module.mjs +9 -3
- package/esm2020/novo-elements.providers.mjs +2 -2
- package/esm2020/services/date-format/DateFormat.mjs +153 -47
- package/esm2020/services/global/global.service.mjs +7 -1
- package/esm2020/utils/date/Date.mjs +1 -1
- package/esm2020/utils/date/index.mjs +3 -2
- package/esm2020/utils/date/timezone-support.mjs +87 -0
- package/fesm2015/novo-elements-addons-ace-editor.mjs +7 -3
- package/fesm2015/novo-elements-addons-ace-editor.mjs.map +1 -1
- package/fesm2015/novo-elements-addons-ckeditor.mjs +7 -0
- package/fesm2015/novo-elements-addons-ckeditor.mjs.map +1 -1
- package/fesm2015/novo-elements-addons-code-editor.mjs +150 -0
- package/fesm2015/novo-elements-addons-code-editor.mjs.map +1 -0
- package/fesm2015/novo-elements-addons.mjs +155 -5
- package/fesm2015/novo-elements-addons.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-breadcrumbs.mjs +1 -1
- package/fesm2015/novo-elements-elements-breadcrumbs.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-calendar.mjs +12 -13
- package/fesm2015/novo-elements-elements-calendar.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-common.mjs +10 -2
- package/fesm2015/novo-elements-elements-common.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-data-table.mjs +3 -3
- package/fesm2015/novo-elements-elements-data-table.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-date-picker.mjs +64 -62
- package/fesm2015/novo-elements-elements-date-picker.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-date-time-picker.mjs +3 -4
- package/fesm2015/novo-elements-elements-date-time-picker.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-drag-drop.mjs +245 -0
- package/fesm2015/novo-elements-elements-drag-drop.mjs.map +1 -0
- package/fesm2015/novo-elements-elements-dropdown.mjs +28 -3
- package/fesm2015/novo-elements-elements-dropdown.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-field.mjs +19 -19
- package/fesm2015/novo-elements-elements-field.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-form.mjs +124 -300
- package/fesm2015/novo-elements-elements-form.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-query-builder.mjs +1 -1
- package/fesm2015/novo-elements-elements-query-builder.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-simple-table.mjs +2 -2
- package/fesm2015/novo-elements-elements-simple-table.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-tabbed-group-picker.mjs +1 -1
- package/fesm2015/novo-elements-elements-tabbed-group-picker.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-table.mjs +2 -6
- package/fesm2015/novo-elements-elements-table.mjs.map +1 -1
- package/fesm2015/novo-elements-elements-time-picker.mjs +7 -71
- package/fesm2015/novo-elements-elements-time-picker.mjs.map +1 -1
- package/fesm2015/novo-elements-elements.mjs +1 -0
- package/fesm2015/novo-elements-elements.mjs.map +1 -1
- package/fesm2015/novo-elements-services.mjs +158 -46
- package/fesm2015/novo-elements-services.mjs.map +1 -1
- package/fesm2015/novo-elements-utils.mjs +88 -1
- package/fesm2015/novo-elements-utils.mjs.map +1 -1
- package/fesm2015/novo-elements.mjs +8 -2
- package/fesm2015/novo-elements.mjs.map +1 -1
- package/fesm2020/novo-elements-addons-ace-editor.mjs +7 -3
- package/fesm2020/novo-elements-addons-ace-editor.mjs.map +1 -1
- package/fesm2020/novo-elements-addons-ckeditor.mjs +7 -0
- package/fesm2020/novo-elements-addons-ckeditor.mjs.map +1 -1
- package/fesm2020/novo-elements-addons-code-editor.mjs +150 -0
- package/fesm2020/novo-elements-addons-code-editor.mjs.map +1 -0
- package/fesm2020/novo-elements-addons.mjs +155 -5
- package/fesm2020/novo-elements-addons.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-breadcrumbs.mjs +1 -1
- package/fesm2020/novo-elements-elements-breadcrumbs.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-calendar.mjs +12 -13
- package/fesm2020/novo-elements-elements-calendar.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-common.mjs +8 -2
- package/fesm2020/novo-elements-elements-common.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-data-table.mjs +3 -3
- package/fesm2020/novo-elements-elements-data-table.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-date-picker.mjs +62 -62
- package/fesm2020/novo-elements-elements-date-picker.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-date-time-picker.mjs +3 -4
- package/fesm2020/novo-elements-elements-date-time-picker.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-drag-drop.mjs +244 -0
- package/fesm2020/novo-elements-elements-drag-drop.mjs.map +1 -0
- package/fesm2020/novo-elements-elements-dropdown.mjs +28 -3
- package/fesm2020/novo-elements-elements-dropdown.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-field.mjs +19 -19
- package/fesm2020/novo-elements-elements-field.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-form.mjs +125 -302
- package/fesm2020/novo-elements-elements-form.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-query-builder.mjs +1 -1
- package/fesm2020/novo-elements-elements-query-builder.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-simple-table.mjs +2 -2
- package/fesm2020/novo-elements-elements-simple-table.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-tabbed-group-picker.mjs +1 -1
- package/fesm2020/novo-elements-elements-tabbed-group-picker.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-table.mjs +2 -6
- package/fesm2020/novo-elements-elements-table.mjs.map +1 -1
- package/fesm2020/novo-elements-elements-time-picker.mjs +7 -71
- package/fesm2020/novo-elements-elements-time-picker.mjs.map +1 -1
- package/fesm2020/novo-elements-elements.mjs +1 -0
- package/fesm2020/novo-elements-elements.mjs.map +1 -1
- package/fesm2020/novo-elements-services.mjs +158 -46
- package/fesm2020/novo-elements-services.mjs.map +1 -1
- package/fesm2020/novo-elements-utils.mjs +88 -1
- package/fesm2020/novo-elements-utils.mjs.map +1 -1
- package/fesm2020/novo-elements.mjs +8 -2
- package/fesm2020/novo-elements.mjs.map +1 -1
- package/novo-elements.module.d.ts +1 -1
- package/novo-elements.scss +1 -1
- package/package.json +23 -4
- package/services/date-format/DateFormat.d.ts +62 -3
- package/services/global/global.service.d.ts +3 -0
- package/styles/content/root.scss +1 -1
- package/styles/themes/light-test.scss +1 -1
- package/styles/themes/light.scss +1 -1
- package/styles/variables.scss +1 -1
- package/utils/date/index.d.ts +2 -1
- package/utils/date/timezone-support.d.ts +5 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter, Directive, Input, Output, HostListener, NgModule } from '@angular/core';
|
|
3
|
+
import { ReplaySubject } from 'rxjs';
|
|
4
|
+
|
|
5
|
+
class NovoDragBoxParent {
|
|
6
|
+
constructor(elementRef, renderer) {
|
|
7
|
+
this.elementRef = elementRef;
|
|
8
|
+
this.renderer = renderer;
|
|
9
|
+
this.$destroy = new ReplaySubject(1);
|
|
10
|
+
this.novoDragDropFinish = new EventEmitter();
|
|
11
|
+
this.mutationObserver = new MutationObserver(this.mutationDetected.bind(this));
|
|
12
|
+
}
|
|
13
|
+
get itemsReordered() {
|
|
14
|
+
return this.trackedItems.map(item => item.item);
|
|
15
|
+
}
|
|
16
|
+
get element() {
|
|
17
|
+
return this.elementRef.nativeElement;
|
|
18
|
+
}
|
|
19
|
+
ngAfterViewInit() {
|
|
20
|
+
this.registerChildren();
|
|
21
|
+
this.mutationObserver.observe(this.element, { childList: true });
|
|
22
|
+
}
|
|
23
|
+
ngOnDestroy() {
|
|
24
|
+
this.$destroy.next();
|
|
25
|
+
this.$destroy.complete();
|
|
26
|
+
}
|
|
27
|
+
registerChildren() {
|
|
28
|
+
if (this.items && this.items.length !== this.element.children.length) {
|
|
29
|
+
throw new Error(`Could not match item list to children list - drag box contains ${this.items.length} items, but has ${this.element.children.length} elements`);
|
|
30
|
+
}
|
|
31
|
+
this.trackedItems = [];
|
|
32
|
+
for (let i = 0; i < this.element.children.length; i++) {
|
|
33
|
+
this.registerChild(this.element.children[i], i);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
registerChild(element, index) {
|
|
37
|
+
const listeners = [
|
|
38
|
+
this.renderer.listen(element, 'dragstart', this.onDragStart.bind(this)),
|
|
39
|
+
this.renderer.listen(element, 'drop', this.onDragFinish.bind(this)),
|
|
40
|
+
this.renderer.listen(element, 'dragend', this.onDragStop.bind(this))
|
|
41
|
+
];
|
|
42
|
+
element.draggable = true;
|
|
43
|
+
this.$destroy.subscribe(() => listeners.forEach(cb => cb()));
|
|
44
|
+
this.trackedItems.push({
|
|
45
|
+
item: this.items[index],
|
|
46
|
+
element
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
mutationDetected(mutations) {
|
|
50
|
+
if (this.pickedUp) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const addedNodes = new Set();
|
|
54
|
+
const removedNodes = new Set();
|
|
55
|
+
for (let mutation of mutations) {
|
|
56
|
+
mutation.addedNodes.forEach((a) => {
|
|
57
|
+
if (!removedNodes.delete(a)) {
|
|
58
|
+
addedNodes.add(a);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
mutation.removedNodes.forEach((a) => {
|
|
62
|
+
if (!addedNodes.delete(a)) {
|
|
63
|
+
removedNodes.add(a);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
addedNodes.forEach(node => {
|
|
68
|
+
const idx = Array.prototype.indexOf.call(this.element.children, node);
|
|
69
|
+
this.registerChild(node, idx);
|
|
70
|
+
});
|
|
71
|
+
if (removedNodes.size > 0) {
|
|
72
|
+
this.trackedItems = this.trackedItems.filter(item => !removedNodes.has(item.element));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Per-item listeners */
|
|
76
|
+
onDragStart(event) {
|
|
77
|
+
if (this.shouldBlockDragStart(event)) {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const dataTransfer = event.dataTransfer;
|
|
82
|
+
// Present a native 'move item' effect
|
|
83
|
+
dataTransfer.effectAllowed = 'move';
|
|
84
|
+
this.pickedUp = event.target;
|
|
85
|
+
event.stopPropagation();
|
|
86
|
+
this.savedOrder = [...this.trackedItems];
|
|
87
|
+
}
|
|
88
|
+
// Equivalent of "finally" - this runs whether or not the drag finished on a valid ending location
|
|
89
|
+
onDragStop(event) {
|
|
90
|
+
this.pickedUp = null;
|
|
91
|
+
this.savedOrder = null;
|
|
92
|
+
event.stopPropagation();
|
|
93
|
+
}
|
|
94
|
+
onDragFinish(event) {
|
|
95
|
+
var _a;
|
|
96
|
+
event.preventDefault();
|
|
97
|
+
event.stopPropagation();
|
|
98
|
+
if (!this.element.contains(event.currentTarget)) {
|
|
99
|
+
// this is for a different drag region - ignore
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const draggedItem = (_a = this.trackedItems.find(item => item.element === this.pickedUp)) === null || _a === void 0 ? void 0 : _a.item;
|
|
103
|
+
this.trackedItems = Array.prototype.map.call(this.element.children, child => {
|
|
104
|
+
const item = this.trackedItems.find(item => item.element === child);
|
|
105
|
+
if (!item) {
|
|
106
|
+
throw new Error('DragDrop: Error - could not reassociate an item post-drag');
|
|
107
|
+
}
|
|
108
|
+
return item;
|
|
109
|
+
});
|
|
110
|
+
this.novoDragDropFinish.emit({
|
|
111
|
+
draggedItem,
|
|
112
|
+
allItems: this.itemsReordered,
|
|
113
|
+
event
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/** - end per-item listeners */
|
|
117
|
+
onDragOver(event) {
|
|
118
|
+
if (!this.pickedUp) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
let target = event.target;
|
|
122
|
+
if (!this.element.contains(target)) {
|
|
123
|
+
target = null;
|
|
124
|
+
}
|
|
125
|
+
// In some cases (maybe browser-specific) we may have this event reported from a sub-element of a drag destination.
|
|
126
|
+
// We need to go upwards in the tree to find the actual target
|
|
127
|
+
if (target && !target.draggable) {
|
|
128
|
+
target = this.findDraggableParentOfElement(target);
|
|
129
|
+
}
|
|
130
|
+
// Check if this drag event is within this drag box
|
|
131
|
+
if (target && target.parentElement === this.element) {
|
|
132
|
+
event.stopPropagation();
|
|
133
|
+
event.preventDefault();
|
|
134
|
+
if (event.dataTransfer) {
|
|
135
|
+
event.dataTransfer.dropEffect = 'move';
|
|
136
|
+
}
|
|
137
|
+
this.applyTempSort(this.pickedUp, target);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// if not within this drag box, then move this item back to its original position and show a diabled drag effect
|
|
141
|
+
if (event.dataTransfer) {
|
|
142
|
+
event.dataTransfer.dropEffect = 'none';
|
|
143
|
+
}
|
|
144
|
+
this.resetSorting();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
findDraggableParentOfElement(target) {
|
|
148
|
+
const parentElement = target.parentElement;
|
|
149
|
+
if (!parentElement) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
else if (parentElement.draggable) {
|
|
153
|
+
return parentElement;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
return this.findDraggableParentOfElement(parentElement);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
applyTempSort(showXElement, inPlaceOfY) {
|
|
160
|
+
if (showXElement === inPlaceOfY) {
|
|
161
|
+
// same element - ignoring
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// Apply the "preview" effect from dragging one item to another
|
|
165
|
+
const aIndex = Array.prototype.indexOf.call(this.elementRef.nativeElement.children, showXElement);
|
|
166
|
+
const bIndex = Array.prototype.indexOf.call(this.elementRef.nativeElement.children, inPlaceOfY);
|
|
167
|
+
const diff = bIndex - aIndex;
|
|
168
|
+
let insertPosition;
|
|
169
|
+
if (diff > 0) {
|
|
170
|
+
insertPosition = 'afterend';
|
|
171
|
+
}
|
|
172
|
+
else if (diff < 0) {
|
|
173
|
+
insertPosition = 'beforebegin';
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
throw new Error('DragDrop: Two elements are in the same position');
|
|
177
|
+
}
|
|
178
|
+
inPlaceOfY.insertAdjacentElement(insertPosition, showXElement);
|
|
179
|
+
}
|
|
180
|
+
resetSorting() {
|
|
181
|
+
// return to the order of elements from the last time we called onDragPickup
|
|
182
|
+
if (!this.savedOrder) {
|
|
183
|
+
throw new Error('DragDrop: Cannot reset sorting with no saved order');
|
|
184
|
+
}
|
|
185
|
+
const boxElem = this.elementRef.nativeElement;
|
|
186
|
+
for (let i = 0; i < boxElem.children.length; i++) {
|
|
187
|
+
const item = boxElem.children[i];
|
|
188
|
+
if (this.savedOrder[i].element !== item && i > 0) {
|
|
189
|
+
this.savedOrder[i - 1].element.insertAdjacentElement('afterend', this.savedOrder[i].element);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// If the user has provided classes indicating they only want a certain region to be draggable, ignore
|
|
194
|
+
// this drag event if it is outside of there.
|
|
195
|
+
shouldBlockDragStart(event) {
|
|
196
|
+
const dragTarget = event.target;
|
|
197
|
+
// TODO: Allow for multiple drag targets, and drag exclusion targets
|
|
198
|
+
const userDragTarget = dragTarget.querySelector('.novo-drag-target');
|
|
199
|
+
if (userDragTarget) {
|
|
200
|
+
return !this.isElementWithinEventBounds(userDragTarget, event);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
isElementWithinEventBounds(element, event) {
|
|
204
|
+
const rect = element.getBoundingClientRect();
|
|
205
|
+
const isInside = event.clientX > rect.left && event.clientX < rect.right &&
|
|
206
|
+
event.clientY < rect.bottom && event.clientY > rect.top;
|
|
207
|
+
return isInside;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
NovoDragBoxParent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NovoDragBoxParent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
|
|
211
|
+
NovoDragBoxParent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: NovoDragBoxParent, selector: "[novoDragDrop]", inputs: { items: ["novoDragDrop", "items"] }, outputs: { novoDragDropFinish: "novoDragDropFinish" }, host: { listeners: { "window:dragover": "onDragOver($event)" } }, ngImport: i0 });
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NovoDragBoxParent, decorators: [{
|
|
213
|
+
type: Directive,
|
|
214
|
+
args: [{
|
|
215
|
+
selector: '[novoDragDrop]'
|
|
216
|
+
}]
|
|
217
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { items: [{
|
|
218
|
+
type: Input,
|
|
219
|
+
args: ['novoDragDrop']
|
|
220
|
+
}], novoDragDropFinish: [{
|
|
221
|
+
type: Output
|
|
222
|
+
}], onDragOver: [{
|
|
223
|
+
type: HostListener,
|
|
224
|
+
args: ['window:dragover', ['$event']]
|
|
225
|
+
}] } });
|
|
226
|
+
|
|
227
|
+
class NovoDragDropModule {
|
|
228
|
+
}
|
|
229
|
+
NovoDragDropModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NovoDragDropModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
230
|
+
NovoDragDropModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NovoDragDropModule, declarations: [NovoDragBoxParent], exports: [NovoDragBoxParent] });
|
|
231
|
+
NovoDragDropModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NovoDragDropModule });
|
|
232
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NovoDragDropModule, decorators: [{
|
|
233
|
+
type: NgModule,
|
|
234
|
+
args: [{
|
|
235
|
+
declarations: [NovoDragBoxParent],
|
|
236
|
+
exports: [NovoDragBoxParent]
|
|
237
|
+
}]
|
|
238
|
+
}] });
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Generated bundle index. Do not edit.
|
|
242
|
+
*/
|
|
243
|
+
|
|
244
|
+
export { NovoDragBoxParent, NovoDragDropModule };
|
|
245
|
+
//# sourceMappingURL=novo-elements-elements-drag-drop.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"novo-elements-elements-drag-drop.mjs","sources":["../../../projects/novo-elements/src/elements/drag-drop/drag-drop-box.ts","../../../projects/novo-elements/src/elements/drag-drop/drag-drop.module.ts","../../../projects/novo-elements/src/elements/drag-drop/novo-elements-elements-drag-drop.ts"],"sourcesContent":["import { AfterViewInit, Directive, ElementRef, EventEmitter, HostListener, Input, OnDestroy, Output, Renderer2 } from '@angular/core';\nimport { ReplaySubject } from 'rxjs';\n\nexport interface NovoDragFinishEvent<T> {\n draggedItem: T;\n allItems: T[];\n event: DragEvent;\n}\n\ninterface NovoDragItem<T> {\n item: T;\n element: HTMLElement;\n}\n\n@Directive({\n selector: '[novoDragDrop]'\n})\nexport class NovoDragBoxParent<T> implements AfterViewInit, OnDestroy {\n\n pickedUp?: HTMLElement;\n savedOrder?: NovoDragItem<T>[];\n\n $destroy = new ReplaySubject<void>(1);\n\n @Input('novoDragDrop') items: T[];\n\n @Output() novoDragDropFinish = new EventEmitter<NovoDragFinishEvent<T>>();\n\n private trackedItems: NovoDragItem<T>[];\n\n get itemsReordered(): T[] {\n return this.trackedItems.map(item => item.item);\n }\n\n mutationObserver = new MutationObserver(this.mutationDetected.bind(this));\n\n constructor(private elementRef: ElementRef, private renderer: Renderer2) { }\n\n get element(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n \n ngAfterViewInit(): void {\n this.registerChildren();\n this.mutationObserver.observe(this.element, { childList: true });\n }\n\n ngOnDestroy(): void {\n this.$destroy.next();\n this.$destroy.complete();\n }\n\n private registerChildren(): void {\n if (this.items && this.items.length !== this.element.children.length) {\n throw new Error(`Could not match item list to children list - drag box contains ${this.items.length} items, but has ${this.element.children.length} elements`);\n }\n this.trackedItems = [];\n for (let i = 0; i < this.element.children.length; i++) {\n this.registerChild(this.element.children[i] as HTMLElement, i);\n }\n \n }\n\n private registerChild(element: HTMLElement, index: number) {\n const listeners = [\n this.renderer.listen(element, 'dragstart', this.onDragStart.bind(this)),\n this.renderer.listen(element, 'drop', this.onDragFinish.bind(this)),\n this.renderer.listen(element, 'dragend', this.onDragStop.bind(this))\n ];\n element.draggable = true;\n this.$destroy.subscribe(() => listeners.forEach(cb => cb()));\n this.trackedItems.push({\n item: this.items[index],\n element\n });\n }\n\n mutationDetected(mutations: MutationRecord[]) {\n if (this.pickedUp) {\n return;\n }\n const addedNodes = new Set<HTMLElement>();\n const removedNodes = new Set<HTMLElement>();\n for (let mutation of mutations) {\n mutation.addedNodes.forEach((a: HTMLElement) => {\n if (!removedNodes.delete(a)) {\n addedNodes.add(a);\n }\n });\n mutation.removedNodes.forEach((a: HTMLElement) => {\n if (!addedNodes.delete(a)) {\n removedNodes.add(a);\n }\n });\n }\n addedNodes.forEach(node => {\n const idx = Array.prototype.indexOf.call(this.element.children, node);\n this.registerChild(node, idx);\n });\n if (removedNodes.size > 0) {\n this.trackedItems = this.trackedItems.filter(\n item => !removedNodes.has(item.element));\n }\n }\n\n /** Per-item listeners */\n\n onDragStart(event: DragEvent) {\n if (this.shouldBlockDragStart(event)) {\n event.preventDefault();\n return;\n }\n const dataTransfer = event.dataTransfer;\n // Present a native 'move item' effect\n dataTransfer.effectAllowed = 'move';\n this.pickedUp = event.target as HTMLElement;\n event.stopPropagation();\n this.savedOrder = [...this.trackedItems];\n }\n\n // Equivalent of \"finally\" - this runs whether or not the drag finished on a valid ending location\n onDragStop(event: DragEvent): void {\n this.pickedUp = null;\n this.savedOrder = null;\n event.stopPropagation();\n }\n\n onDragFinish(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.element.contains(event.currentTarget as HTMLElement)) {\n // this is for a different drag region - ignore\n return;\n }\n const draggedItem = this.trackedItems.find(item => item.element === this.pickedUp)?.item;\n this.trackedItems = Array.prototype.map.call(this.element.children, child => {\n const item = this.trackedItems.find(item => item.element === child);\n if (!item) {\n throw new Error('DragDrop: Error - could not reassociate an item post-drag');\n }\n return item;\n });\n this.novoDragDropFinish.emit({\n draggedItem,\n allItems: this.itemsReordered,\n event\n });\n \n }\n \n /** - end per-item listeners */\n\n @HostListener('window:dragover', ['$event'])\n onDragOver(event: DragEvent): void {\n if (!this.pickedUp) {\n return;\n }\n let target = event.target as HTMLElement;\n if (!this.element.contains(target)) {\n target = null;\n }\n // In some cases (maybe browser-specific) we may have this event reported from a sub-element of a drag destination.\n // We need to go upwards in the tree to find the actual target\n if (target && !target.draggable) {\n target = this.findDraggableParentOfElement(target);\n }\n // Check if this drag event is within this drag box\n if (target && target.parentElement === this.element) {\n event.stopPropagation();\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n this.applyTempSort(this.pickedUp, target);\n } else {\n // if not within this drag box, then move this item back to its original position and show a diabled drag effect\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'none';\n }\n this.resetSorting();\n }\n }\n\n private findDraggableParentOfElement(target: HTMLElement): HTMLElement | null {\n const parentElement = target.parentElement;\n if (!parentElement) {\n return null;\n } else if (parentElement.draggable) {\n return parentElement;\n } else {\n return this.findDraggableParentOfElement(parentElement);\n }\n }\n\n private applyTempSort(showXElement: HTMLElement, inPlaceOfY: HTMLElement) {\n if (showXElement === inPlaceOfY) {\n // same element - ignoring\n return;\n }\n // Apply the \"preview\" effect from dragging one item to another\n const aIndex = Array.prototype.indexOf.call(this.elementRef.nativeElement.children, showXElement);\n const bIndex = Array.prototype.indexOf.call(this.elementRef.nativeElement.children, inPlaceOfY);\n const diff = bIndex - aIndex;\n let insertPosition: InsertPosition;\n if (diff > 0) {\n insertPosition = 'afterend';\n } else if (diff < 0) {\n insertPosition = 'beforebegin';\n } else {\n throw new Error('DragDrop: Two elements are in the same position');\n }\n inPlaceOfY.insertAdjacentElement(insertPosition, showXElement);\n }\n\n private resetSorting(): void {\n // return to the order of elements from the last time we called onDragPickup\n if (!this.savedOrder) {\n throw new Error('DragDrop: Cannot reset sorting with no saved order');\n }\n const boxElem = this.elementRef.nativeElement as HTMLElement;\n for (let i = 0; i < boxElem.children.length; i++) {\n const item = boxElem.children[i];\n if (this.savedOrder[i].element !== item && i > 0) {\n this.savedOrder[i - 1].element.insertAdjacentElement('afterend', this.savedOrder[i].element);\n }\n }\n }\n\n // If the user has provided classes indicating they only want a certain region to be draggable, ignore\n // this drag event if it is outside of there.\n private shouldBlockDragStart(event: DragEvent): boolean {\n const dragTarget = event.target as HTMLElement;\n // TODO: Allow for multiple drag targets, and drag exclusion targets\n const userDragTarget = dragTarget.querySelector('.novo-drag-target');\n if (userDragTarget) {\n return !this.isElementWithinEventBounds(userDragTarget, event);\n }\n }\n\n public isElementWithinEventBounds(element: Element, event: DragEvent) {\n const rect = element.getBoundingClientRect();\n const isInside = event.clientX > rect.left && event.clientX < rect.right &&\n event.clientY < rect.bottom && event.clientY > rect.top;\n return isInside;\n }\n}","import { NgModule } from '@angular/core';\nimport { NovoDragBoxParent } from './drag-drop-box';\n\n\n@NgModule({\n declarations: [NovoDragBoxParent],\n exports: [NovoDragBoxParent]\n})\nexport class NovoDragDropModule {}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -65,6 +65,7 @@ class NovoDropdownElement extends NovoDropdowMixins {
|
|
|
65
65
|
/** The Subject to complete all subscriptions when destroyed. */
|
|
66
66
|
this._onDestroy = new Subject();
|
|
67
67
|
this._multiple = false;
|
|
68
|
+
this._scrollToActiveItemOnOpen = false;
|
|
68
69
|
this.clickHandler = this.togglePanel.bind(this);
|
|
69
70
|
this.closeHandler = this.closePanel.bind(this);
|
|
70
71
|
}
|
|
@@ -75,6 +76,13 @@ class NovoDropdownElement extends NovoDropdowMixins {
|
|
|
75
76
|
set multiple(value) {
|
|
76
77
|
this._multiple = coerceBooleanProperty(value);
|
|
77
78
|
}
|
|
79
|
+
/** Whether the dropdown should scroll to the active item whenever it is opened. */
|
|
80
|
+
get scrollToActiveItemOnOpen() {
|
|
81
|
+
return this._scrollToActiveItemOnOpen;
|
|
82
|
+
}
|
|
83
|
+
set scrollToActiveItemOnOpen(value) {
|
|
84
|
+
this._scrollToActiveItemOnOpen = coerceBooleanProperty(value);
|
|
85
|
+
}
|
|
78
86
|
get button() {
|
|
79
87
|
return this._trigger || this._button;
|
|
80
88
|
}
|
|
@@ -111,6 +119,17 @@ class NovoDropdownElement extends NovoDropdowMixins {
|
|
|
111
119
|
this.element.nativeElement.focus(options);
|
|
112
120
|
}
|
|
113
121
|
}
|
|
122
|
+
openPanel() {
|
|
123
|
+
super.openPanel();
|
|
124
|
+
if (this.scrollToActiveItemOnOpen) {
|
|
125
|
+
this._scrollOptionIntoView(this.findFirstSelectedOptionIndex(this.options) || 0);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
findFirstSelectedOptionIndex(options) {
|
|
129
|
+
return options.toArray().findIndex((option) => {
|
|
130
|
+
return option.selected === true;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
114
133
|
set items(items) {
|
|
115
134
|
// this._items = items;
|
|
116
135
|
// this.activeIndex = -1;
|
|
@@ -186,11 +205,15 @@ class NovoDropdownElement extends NovoDropdowMixins {
|
|
|
186
205
|
// this.handleSelection(event.source, event.isUserInput);
|
|
187
206
|
if (event.isUserInput && !this.multiple) {
|
|
188
207
|
this._clearPreviousSelectedOption(this._keyManager.activeItem);
|
|
208
|
+
event.source.select();
|
|
189
209
|
if (!this.keepOpen && this.panelOpen) {
|
|
190
210
|
this.closePanel();
|
|
191
211
|
this.focus();
|
|
192
212
|
}
|
|
193
213
|
}
|
|
214
|
+
else {
|
|
215
|
+
event.source.select();
|
|
216
|
+
}
|
|
194
217
|
});
|
|
195
218
|
}
|
|
196
219
|
/**
|
|
@@ -237,10 +260,10 @@ class NovoDropdownElement extends NovoDropdowMixins {
|
|
|
237
260
|
}
|
|
238
261
|
}
|
|
239
262
|
NovoDropdownElement.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NovoDropdownElement, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
240
|
-
NovoDropdownElement.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: NovoDropdownElement, selector: "novo-dropdown", inputs: { parentScrollSelector: "parentScrollSelector", parentScrollAction: "parentScrollAction", containerClass: "containerClass", side: "side", scrollStrategy: "scrollStrategy", keepOpen: "keepOpen", height: "height", width: "width", appendToBody: "appendToBody", multiple: "multiple" }, outputs: { toggled: "toggled" }, host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "attr.tabIndex": "disabled ? -1 : 0" } }, queries: [{ propertyName: "_button", first: true, predicate: NovoButtonElement, descendants: true }, { propertyName: "_trigger", first: true, predicate: NovoDropDownTrigger, descendants: true }, { propertyName: "optionGroups", predicate: NovoOptgroup, descendants: true }, { propertyName: "options", predicate: NovoOption, descendants: true }], viewQueries: [{ propertyName: "overlay", first: true, predicate: NovoOverlayTemplateComponent, descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
|
|
263
|
+
NovoDropdownElement.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: NovoDropdownElement, selector: "novo-dropdown", inputs: { parentScrollSelector: "parentScrollSelector", parentScrollAction: "parentScrollAction", containerClass: "containerClass", side: "side", scrollStrategy: "scrollStrategy", keepOpen: "keepOpen", height: "height", width: "width", appendToBody: "appendToBody", multiple: "multiple", scrollToActiveItemOnOpen: "scrollToActiveItemOnOpen" }, outputs: { toggled: "toggled" }, host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "attr.tabIndex": "disabled ? -1 : 0" } }, queries: [{ propertyName: "_button", first: true, predicate: NovoButtonElement, descendants: true }, { propertyName: "_trigger", first: true, predicate: NovoDropDownTrigger, descendants: true }, { propertyName: "optionGroups", predicate: NovoOptgroup, descendants: true }, { propertyName: "options", predicate: NovoOption, descendants: true }], viewQueries: [{ propertyName: "overlay", first: true, predicate: NovoOverlayTemplateComponent, descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
|
|
241
264
|
<ng-content select="button,novo-button,[dropdownTrigger]" #trigger></ng-content>
|
|
242
265
|
<novo-overlay-template [parent]="element" [width]="width" [position]="side" [scrollStrategy]="scrollStrategy">
|
|
243
|
-
<div #panel class="dropdown-container {{ containerClass }}" [style.height.px]="height" [class.has-height]="!!height">
|
|
266
|
+
<div #panel class="dropdown-container {{ containerClass }}" [style.max-height.px]="height" [class.has-height]="!!height">
|
|
244
267
|
<ng-content></ng-content>
|
|
245
268
|
</div>
|
|
246
269
|
</novo-overlay-template>
|
|
@@ -254,7 +277,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
|
|
|
254
277
|
args: [{ selector: 'novo-dropdown', template: `
|
|
255
278
|
<ng-content select="button,novo-button,[dropdownTrigger]" #trigger></ng-content>
|
|
256
279
|
<novo-overlay-template [parent]="element" [width]="width" [position]="side" [scrollStrategy]="scrollStrategy">
|
|
257
|
-
<div #panel class="dropdown-container {{ containerClass }}" [style.height.px]="height" [class.has-height]="!!height">
|
|
280
|
+
<div #panel class="dropdown-container {{ containerClass }}" [style.max-height.px]="height" [class.has-height]="!!height">
|
|
258
281
|
<ng-content></ng-content>
|
|
259
282
|
</div>
|
|
260
283
|
</novo-overlay-template>
|
|
@@ -301,6 +324,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
|
|
|
301
324
|
args: ['panel']
|
|
302
325
|
}], multiple: [{
|
|
303
326
|
type: Input
|
|
327
|
+
}], scrollToActiveItemOnOpen: [{
|
|
328
|
+
type: Input
|
|
304
329
|
}], _handleKeydown: [{
|
|
305
330
|
type: HostListener,
|
|
306
331
|
args: ['keydown', ['$event']]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"novo-elements-elements-dropdown.mjs","sources":["../../../projects/novo-elements/src/elements/dropdown/Dropdown.ts","../../../projects/novo-elements/src/elements/dropdown/Dropdown.module.ts","../../../projects/novo-elements/src/elements/dropdown/novo-elements-elements-dropdown.ts"],"sourcesContent":["// NG2\nimport { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { hasModifierKey } from '@angular/cdk/keycodes';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n ViewChild,\n} from '@angular/core';\n// Vendor\nimport { merge, of, Subject, Subscription } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n// App\nimport { NovoButtonElement } from 'novo-elements/elements/button';\nimport {\n CanDisableCtor,\n HasOverlayCtor,\n HasTabIndexCtor,\n mixinDisabled,\n mixinOverlay,\n mixinTabIndex,\n NovoOptgroup,\n NovoOption,\n NovoOptionSelectionChange,\n NovoOverlayTemplateComponent,\n _countGroupLabelsBeforeOption,\n _getOptionScrollPosition,\n} from 'novo-elements/elements/common';\nimport { BooleanInput, Key, notify } from 'novo-elements/utils';\n\n@Directive({\n selector: '[dropdownTrigger]',\n host: {\n class: 'novo-dropdown-trigger',\n },\n})\nexport class NovoDropDownTrigger {\n constructor(public element: ElementRef) {}\n}\n\n// Create Base Class from Mixins\n// Boilerplate for applying mixins\nclass NovoDropdownBase {\n constructor() {}\n}\nconst NovoDropdowMixins: HasOverlayCtor & CanDisableCtor & HasTabIndexCtor & typeof NovoDropdownBase = mixinOverlay(\n mixinTabIndex(mixinDisabled(NovoDropdownBase), 1),\n);\n\n@Component({\n selector: 'novo-dropdown',\n template: `\n <ng-content select=\"button,novo-button,[dropdownTrigger]\" #trigger></ng-content>\n <novo-overlay-template [parent]=\"element\" [width]=\"width\" [position]=\"side\" [scrollStrategy]=\"scrollStrategy\">\n <div #panel class=\"dropdown-container {{ containerClass }}\" [style.height.px]=\"height\" [class.has-height]=\"!!height\">\n <ng-content></ng-content>\n </div>\n </novo-overlay-template>\n `,\n styleUrls: ['./Dropdown.scss'],\n host: {\n '[attr.tabIndex]': 'disabled ? -1 : 0',\n },\n})\nexport class NovoDropdownElement extends NovoDropdowMixins implements OnInit, AfterContentInit, AfterViewInit, OnDestroy {\n @Input()\n parentScrollSelector: string;\n @Input()\n parentScrollAction: string = 'close';\n @Input()\n containerClass: string;\n @Input()\n side:\n | 'default'\n | 'right'\n | 'above-below'\n | 'right-above-below'\n | 'center'\n | 'bottom'\n | 'bottom-left'\n | 'bottom-right'\n | 'top-left'\n | 'top-right' = 'default';\n @Input()\n scrollStrategy: 'reposition' | 'block' | 'close' = 'reposition';\n\n /**\n * Keep dropdown open after an item is selected\n */\n @Input()\n @BooleanInput()\n keepOpen: boolean = false;\n\n @Input()\n height: number;\n @Input()\n width: number = -1; // Defaults to dynamic width (no hardcoded width value and no host width lookup)\n @Input()\n appendToBody: boolean = false; // Deprecated\n @Output()\n toggled: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n @ViewChild(NovoOverlayTemplateComponent)\n overlay: NovoOverlayTemplateComponent;\n\n @ContentChild(NovoButtonElement)\n _button: NovoButtonElement;\n @ContentChild(NovoDropDownTrigger)\n _trigger: NovoDropDownTrigger;\n\n @ContentChildren(NovoOptgroup, { descendants: true })\n optionGroups: QueryList<NovoOptgroup>;\n @ContentChildren(NovoOption, { descendants: true })\n options: QueryList<NovoOption>;\n @ViewChild('panel')\n panel: ElementRef;\n\n private clickHandler: any;\n private closeHandler: any;\n private _selectedOptionChanges = Subscription.EMPTY;\n /** The Subject to complete all subscriptions when destroyed. */\n private _onDestroy: Subject<void> = new Subject();\n /** The FocusKeyManager which handles focus. */\n private _keyManager: ActiveDescendantKeyManager<NovoOption>;\n\n /** Whether the user should be allowed to select multiple options. */\n @Input()\n get multiple(): boolean {\n return this._multiple;\n }\n set multiple(value: boolean) {\n this._multiple = coerceBooleanProperty(value);\n }\n private _multiple: boolean = false;\n\n get button() {\n return this._trigger || this._button;\n }\n\n constructor(public element: ElementRef, private ref: ChangeDetectorRef) {\n super();\n this.clickHandler = this.togglePanel.bind(this);\n this.closeHandler = this.closePanel.bind(this);\n }\n\n public ngOnInit(): void {\n if (this.appendToBody) {\n notify(`'appendToBody' has been deprecated. Please remove this attribute.`);\n }\n }\n\n public ngAfterContentInit(): void {\n // Add a click handler to the button to toggle the menu\n this.button.element.nativeElement.addEventListener('click', this.clickHandler);\n this.button.element.nativeElement.tabIndex = -1;\n this.options.changes.pipe(takeUntil(this._onDestroy)).subscribe(() => {\n this._initKeyManager();\n this._watchSelectionEvents();\n });\n this._initKeyManager();\n this._watchSelectionEvents();\n this.focus();\n }\n\n public ngAfterViewInit(): void {\n this._watchPanelEvents();\n }\n\n public ngOnDestroy(): void {\n this._onDestroy.next();\n this._onDestroy.complete();\n // Remove listener\n if (this.button) {\n this.button.element.nativeElement.removeEventListener('click', this.clickHandler);\n }\n }\n\n focus(options?: FocusOptions): void {\n if (!this.disabled) {\n this.element.nativeElement.focus(options);\n }\n }\n\n public set items(items: QueryList<NovoItemElement>) {\n // this._items = items;\n // this.activeIndex = -1;\n // // Get the innerText of all the items to allow for searching\n // this._textItems = items.map((item: NovoItemElement) => {\n // return item.element.nativeElement.innerText;\n // });\n }\n\n /** Handles all keydown events on the select. */\n @HostListener('keydown', ['$event'])\n _handleKeydown(event: KeyboardEvent): void {\n if (!this.disabled) {\n this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);\n }\n }\n\n /** Handles keyboard events while the select is closed. */\n private _handleClosedKeydown(event: KeyboardEvent): void {\n const key = event.key;\n const isArrowKey = key === Key.ArrowDown || key === Key.ArrowUp || key === Key.ArrowLeft || key === Key.ArrowRight;\n const isOpenKey = key === Key.Enter || key === Key.Space;\n const manager = this._keyManager;\n // Open the select on ALT + arrow key to match the native <select>\n if ((!manager.isTyping() && isOpenKey && !hasModifierKey(event)) || ((this.multiple || event.altKey) && isArrowKey)) {\n event.preventDefault(); // prevents the page from scrolling down when pressing space\n this.openPanel();\n }\n }\n\n /** Handles keyboard events when the selected is open. */\n private _handleOpenKeydown(event: KeyboardEvent): void {\n const manager = this._keyManager;\n const key = event.key;\n const isArrowKey = key === Key.ArrowDown || key === Key.ArrowUp;\n const isTyping = manager.isTyping();\n const isInputField = event.target;\n if (isArrowKey && event.altKey) {\n // Close the select on ALT + arrow key to match the native <select>\n event.preventDefault();\n this.closePanel();\n // Don't do anything in this case if the user is typing,\n // because the typing sequence can include the space key.\n } else if (!isTyping && (key === Key.Enter || key === Key.Space) && manager.activeItem && !hasModifierKey(event)) {\n event.preventDefault();\n this._multiple ? manager.activeItem._selectViaInteraction() : manager.activeItem._clickViaInteraction();\n } else if (!isTyping && this._multiple && ['a', 'A'].includes(key) && event.ctrlKey) {\n event.preventDefault();\n const hasDeselectedOptions = this.options.some((opt) => !opt.disabled && !opt.selected);\n this.options.forEach((option) => {\n if (!option.disabled) {\n hasDeselectedOptions ? option.select() : option.deselect();\n }\n });\n } else if (Key.Escape === key) {\n this.closePanel();\n } else {\n const previouslyFocusedIndex = manager.activeItemIndex;\n manager.onKeydown(event);\n if (this._multiple && isArrowKey && event.shiftKey && manager.activeItem && manager.activeItemIndex !== previouslyFocusedIndex) {\n manager.activeItem._selectViaInteraction();\n }\n }\n }\n\n private _watchPanelEvents() {\n const panelStateChanges = merge(this.overlay.opening, this.overlay.closing);\n panelStateChanges.pipe(takeUntil(this._onDestroy)).subscribe((event: boolean) => this.toggled.emit(event));\n }\n\n private _watchSelectionEvents() {\n const selectionEvents = this.options ? merge(...this.options.map((option) => option.onSelectionChange)) : of();\n this._selectedOptionChanges.unsubscribe();\n this._selectedOptionChanges = selectionEvents.pipe(takeUntil(this._onDestroy)).subscribe((event: NovoOptionSelectionChange) => {\n // this.handleSelection(event.source, event.isUserInput);\n if (event.isUserInput && !this.multiple) {\n this._clearPreviousSelectedOption(this._keyManager.activeItem);\n if (!this.keepOpen && this.panelOpen) {\n this.closePanel();\n this.focus();\n }\n }\n });\n }\n /**\n * Clear any previous selected option and emit a selection change event for this option\n */\n private _clearPreviousSelectedOption(skip: NovoOption) {\n this.options.forEach((option) => {\n if (option !== skip && option.selected) {\n option.deselect();\n }\n });\n }\n\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\n private _initKeyManager() {\n this._keyManager = new ActiveDescendantKeyManager<NovoOption>(this.options).withTypeAhead(250).withHomeAndEnd();\n // .withAllowedModifierKeys(['shiftKey']);\n\n this._keyManager.tabOut.pipe(takeUntil(this._onDestroy)).subscribe(() => {\n if (this.panelOpen) {\n // Restore focus to the trigger before closing. Ensures that the focus\n // position won't be lost if the user got focus into the overlay.\n this.focus();\n this.closePanel();\n }\n });\n\n this._keyManager.change.pipe(takeUntil(this._onDestroy)).subscribe(() => {\n if (this.panelOpen && this.overlay) {\n this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);\n }\n });\n }\n\n /** Scrolls the active option into view. */\n protected _scrollOptionIntoView(index: number): void {\n const labelCount = _countGroupLabelsBeforeOption(index, this.options, this.optionGroups);\n const itemHeight = this._getItemHeight();\n this.panel.nativeElement.scrollTop = _getOptionScrollPosition(\n (index + labelCount) * itemHeight,\n itemHeight,\n this.panel.nativeElement.scrollTop,\n this.panel.nativeElement.offsetHeight,\n );\n }\n\n /** Calculates the height of the select's options. */\n private _getItemHeight(): number {\n let [first] = this.options;\n if (first) {\n return first._getHostElement().offsetHeight;\n }\n return 0;\n }\n}\n\n// Deprecated below here ---------------------------\n\n@Component({\n selector: 'item',\n template: '<novo-option><ng-content></ng-content></novo-option>',\n host: {\n '[class.disabled]': 'disabled',\n '[class.active]': 'active',\n },\n})\nexport class NovoItemElement {\n @Input()\n public disabled: boolean;\n @Input()\n public keepOpen: boolean = false;\n @Output()\n public action: EventEmitter<any> = new EventEmitter();\n\n public active: boolean = false;\n\n constructor(private dropdown: NovoDropdownElement, public element: ElementRef) {\n notify(`'item' element has been deprecated. Please use 'novo-option' and 'novo-optgroup'.`);\n }\n\n @HostListener('click', ['$event'])\n public onClick(event: Event): void {\n // Poor man's disable\n if (!this.disabled) {\n // Close if keepOpen is false\n if (!this.keepOpen) {\n this.dropdown.closePanel();\n }\n // Emit the action\n this.action.emit({ originalEvent: event });\n }\n }\n}\n\n@Component({\n selector: 'list',\n template: '<ng-content></ng-content>',\n})\nexport class NovoDropdownListElement implements AfterContentInit {\n @ContentChildren(NovoItemElement)\n public items: QueryList<NovoItemElement>;\n\n constructor(private dropdown: NovoDropdownElement) {\n notify(`'list' element has been deprecated. Please use novo-option and novo-optgroup.`);\n }\n\n public ngAfterContentInit(): void {\n this.dropdown.items = this.items;\n this.items.changes.subscribe(() => {\n this.dropdown.items = this.items;\n });\n }\n}\n\n@Component({\n selector: 'dropdown-item-header',\n template: '<ng-content></ng-content>',\n})\nexport class NovoDropDownItemHeaderElement {\n constructor() {\n notify(`'dropdown-item-header' element has been deprecated. Please use novo-option and novo-optgroup.`);\n }\n}\n","// NG2\nimport { NgModule } from '@angular/core';\nimport { NovoOptionModule, NovoOverlayModule } from 'novo-elements/elements/common';\n// APP\nimport {\n NovoDropdownElement,\n NovoDropDownItemHeaderElement,\n NovoDropdownListElement,\n NovoDropDownTrigger,\n NovoItemElement,\n} from './Dropdown';\n\n@NgModule({\n imports: [NovoOverlayModule, NovoOptionModule],\n declarations: [NovoDropdownElement, NovoItemElement, NovoDropdownListElement, NovoDropDownItemHeaderElement, NovoDropDownTrigger],\n exports: [NovoDropdownElement, NovoItemElement, NovoDropdownListElement, NovoDropDownItemHeaderElement, NovoDropDownTrigger],\n})\nexport class NovoDropdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"novo-elements-elements-dropdown.mjs","sources":["../../../projects/novo-elements/src/elements/dropdown/Dropdown.ts","../../../projects/novo-elements/src/elements/dropdown/Dropdown.module.ts","../../../projects/novo-elements/src/elements/dropdown/novo-elements-elements-dropdown.ts"],"sourcesContent":["// NG2\nimport { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { hasModifierKey } from '@angular/cdk/keycodes';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n ViewChild,\n} from '@angular/core';\n// Vendor\nimport { merge, of, Subject, Subscription } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n// App\nimport { NovoButtonElement } from 'novo-elements/elements/button';\nimport {\n CanDisableCtor,\n HasOverlayCtor,\n HasTabIndexCtor,\n mixinDisabled,\n mixinOverlay,\n mixinTabIndex,\n NovoOptgroup,\n NovoOption,\n NovoOptionSelectionChange,\n NovoOverlayTemplateComponent,\n _countGroupLabelsBeforeOption,\n _getOptionScrollPosition,\n} from 'novo-elements/elements/common';\nimport { BooleanInput, Key, notify } from 'novo-elements/utils';\n\n@Directive({\n selector: '[dropdownTrigger]',\n host: {\n class: 'novo-dropdown-trigger',\n },\n})\nexport class NovoDropDownTrigger {\n constructor(public element: ElementRef) {}\n}\n\n// Create Base Class from Mixins\n// Boilerplate for applying mixins\nclass NovoDropdownBase {\n constructor() {}\n}\nconst NovoDropdowMixins: HasOverlayCtor & CanDisableCtor & HasTabIndexCtor & typeof NovoDropdownBase = mixinOverlay(\n mixinTabIndex(mixinDisabled(NovoDropdownBase), 1),\n);\n\n@Component({\n selector: 'novo-dropdown',\n template: `\n <ng-content select=\"button,novo-button,[dropdownTrigger]\" #trigger></ng-content>\n <novo-overlay-template [parent]=\"element\" [width]=\"width\" [position]=\"side\" [scrollStrategy]=\"scrollStrategy\">\n <div #panel class=\"dropdown-container {{ containerClass }}\" [style.max-height.px]=\"height\" [class.has-height]=\"!!height\">\n <ng-content></ng-content>\n </div>\n </novo-overlay-template>\n `,\n styleUrls: ['./Dropdown.scss'],\n host: {\n '[attr.tabIndex]': 'disabled ? -1 : 0',\n },\n})\nexport class NovoDropdownElement extends NovoDropdowMixins implements OnInit, AfterContentInit, AfterViewInit, OnDestroy {\n @Input()\n parentScrollSelector: string;\n @Input()\n parentScrollAction: string = 'close';\n @Input()\n containerClass: string;\n @Input()\n side:\n | 'default'\n | 'right'\n | 'above-below'\n | 'right-above-below'\n | 'center'\n | 'bottom'\n | 'bottom-left'\n | 'bottom-right'\n | 'top-left'\n | 'top-right' = 'default';\n @Input()\n scrollStrategy: 'reposition' | 'block' | 'close' = 'reposition';\n\n /**\n * Keep dropdown open after an item is selected\n */\n @Input()\n @BooleanInput()\n keepOpen: boolean = false;\n\n @Input()\n height: number;\n @Input()\n width: number = -1; // Defaults to dynamic width (no hardcoded width value and no host width lookup)\n @Input()\n appendToBody: boolean = false; // Deprecated\n @Output()\n toggled: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n @ViewChild(NovoOverlayTemplateComponent)\n overlay: NovoOverlayTemplateComponent;\n\n @ContentChild(NovoButtonElement)\n _button: NovoButtonElement;\n @ContentChild(NovoDropDownTrigger)\n _trigger: NovoDropDownTrigger;\n\n @ContentChildren(NovoOptgroup, { descendants: true })\n optionGroups: QueryList<NovoOptgroup>;\n @ContentChildren(NovoOption, { descendants: true })\n options: QueryList<NovoOption>;\n @ViewChild('panel')\n panel: ElementRef;\n\n private clickHandler: any;\n private closeHandler: any;\n private _selectedOptionChanges = Subscription.EMPTY;\n /** The Subject to complete all subscriptions when destroyed. */\n private _onDestroy: Subject<void> = new Subject();\n /** The FocusKeyManager which handles focus. */\n private _keyManager: ActiveDescendantKeyManager<NovoOption>;\n\n /** Whether the user should be allowed to select multiple options. */\n @Input()\n get multiple(): boolean {\n return this._multiple;\n }\n set multiple(value: boolean) {\n this._multiple = coerceBooleanProperty(value);\n }\n private _multiple: boolean = false;\n\n /** Whether the dropdown should scroll to the active item whenever it is opened. */\n @Input()\n get scrollToActiveItemOnOpen(): boolean {\n return this._scrollToActiveItemOnOpen;\n }\n set scrollToActiveItemOnOpen(value: boolean) {\n this._scrollToActiveItemOnOpen = coerceBooleanProperty(value);\n }\n private _scrollToActiveItemOnOpen: boolean = false;\n\n get button() {\n return this._trigger || this._button;\n }\n\n constructor(public element: ElementRef, private ref: ChangeDetectorRef) {\n super();\n this.clickHandler = this.togglePanel.bind(this);\n this.closeHandler = this.closePanel.bind(this);\n }\n\n public ngOnInit(): void {\n if (this.appendToBody) {\n notify(`'appendToBody' has been deprecated. Please remove this attribute.`);\n }\n }\n\n public ngAfterContentInit(): void {\n // Add a click handler to the button to toggle the menu\n this.button.element.nativeElement.addEventListener('click', this.clickHandler);\n this.button.element.nativeElement.tabIndex = -1;\n this.options.changes.pipe(takeUntil(this._onDestroy)).subscribe(() => {\n this._initKeyManager();\n this._watchSelectionEvents();\n });\n this._initKeyManager();\n this._watchSelectionEvents();\n this.focus();\n }\n\n public ngAfterViewInit(): void {\n this._watchPanelEvents();\n }\n\n public ngOnDestroy(): void {\n this._onDestroy.next();\n this._onDestroy.complete();\n // Remove listener\n if (this.button) {\n this.button.element.nativeElement.removeEventListener('click', this.clickHandler);\n }\n }\n\n focus(options?: FocusOptions): void {\n if (!this.disabled) {\n this.element.nativeElement.focus(options);\n }\n }\n\n openPanel(): void {\n super.openPanel()\n if (this.scrollToActiveItemOnOpen) {\n this._scrollOptionIntoView(this.findFirstSelectedOptionIndex(this.options) || 0)\n }\n }\n\n private findFirstSelectedOptionIndex(options: QueryList<NovoOption>): number | null {\n return options.toArray().findIndex((option: NovoOption) => {\n return option.selected === true;\n });\n }\n\n\n public set items(items: QueryList<NovoItemElement>) {\n // this._items = items;\n // this.activeIndex = -1;\n // // Get the innerText of all the items to allow for searching\n // this._textItems = items.map((item: NovoItemElement) => {\n // return item.element.nativeElement.innerText;\n // });\n }\n\n /** Handles all keydown events on the select. */\n @HostListener('keydown', ['$event'])\n _handleKeydown(event: KeyboardEvent): void {\n if (!this.disabled) {\n this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);\n }\n }\n\n /** Handles keyboard events while the select is closed. */\n private _handleClosedKeydown(event: KeyboardEvent): void {\n const key = event.key;\n const isArrowKey = key === Key.ArrowDown || key === Key.ArrowUp || key === Key.ArrowLeft || key === Key.ArrowRight;\n const isOpenKey = key === Key.Enter || key === Key.Space;\n const manager = this._keyManager;\n // Open the select on ALT + arrow key to match the native <select>\n if ((!manager.isTyping() && isOpenKey && !hasModifierKey(event)) || ((this.multiple || event.altKey) && isArrowKey)) {\n event.preventDefault(); // prevents the page from scrolling down when pressing space\n this.openPanel();\n }\n }\n\n /** Handles keyboard events when the selected is open. */\n private _handleOpenKeydown(event: KeyboardEvent): void {\n const manager = this._keyManager;\n const key = event.key;\n const isArrowKey = key === Key.ArrowDown || key === Key.ArrowUp;\n const isTyping = manager.isTyping();\n const isInputField = event.target;\n if (isArrowKey && event.altKey) {\n // Close the select on ALT + arrow key to match the native <select>\n event.preventDefault();\n this.closePanel();\n // Don't do anything in this case if the user is typing,\n // because the typing sequence can include the space key.\n } else if (!isTyping && (key === Key.Enter || key === Key.Space) && manager.activeItem && !hasModifierKey(event)) {\n event.preventDefault();\n this._multiple ? manager.activeItem._selectViaInteraction() : manager.activeItem._clickViaInteraction();\n } else if (!isTyping && this._multiple && ['a', 'A'].includes(key) && event.ctrlKey) {\n event.preventDefault();\n const hasDeselectedOptions = this.options.some((opt) => !opt.disabled && !opt.selected);\n this.options.forEach((option) => {\n if (!option.disabled) {\n hasDeselectedOptions ? option.select() : option.deselect();\n }\n });\n } else if (Key.Escape === key) {\n this.closePanel();\n } else {\n const previouslyFocusedIndex = manager.activeItemIndex;\n manager.onKeydown(event);\n if (this._multiple && isArrowKey && event.shiftKey && manager.activeItem && manager.activeItemIndex !== previouslyFocusedIndex) {\n manager.activeItem._selectViaInteraction();\n }\n }\n }\n\n private _watchPanelEvents() {\n const panelStateChanges = merge(this.overlay.opening, this.overlay.closing);\n panelStateChanges.pipe(takeUntil(this._onDestroy)).subscribe((event: boolean) => this.toggled.emit(event));\n }\n\n private _watchSelectionEvents() {\n const selectionEvents = this.options ? merge(...this.options.map((option) => option.onSelectionChange)) : of();\n this._selectedOptionChanges.unsubscribe();\n this._selectedOptionChanges = selectionEvents.pipe(takeUntil(this._onDestroy)).subscribe((event: NovoOptionSelectionChange) => {\n // this.handleSelection(event.source, event.isUserInput);\n if (event.isUserInput && !this.multiple) {\n this._clearPreviousSelectedOption(this._keyManager.activeItem);\n event.source.select();\n if (!this.keepOpen && this.panelOpen) {\n this.closePanel();\n this.focus();\n }\n } else {\n event.source.select();\n }\n });\n }\n /**\n * Clear any previous selected option and emit a selection change event for this option\n */\n private _clearPreviousSelectedOption(skip: NovoOption) {\n this.options.forEach((option) => {\n if (option !== skip && option.selected) {\n option.deselect();\n }\n });\n }\n\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\n private _initKeyManager() {\n this._keyManager = new ActiveDescendantKeyManager<NovoOption>(this.options).withTypeAhead(250).withHomeAndEnd();\n // .withAllowedModifierKeys(['shiftKey']);\n\n this._keyManager.tabOut.pipe(takeUntil(this._onDestroy)).subscribe(() => {\n if (this.panelOpen) {\n // Restore focus to the trigger before closing. Ensures that the focus\n // position won't be lost if the user got focus into the overlay.\n this.focus();\n this.closePanel();\n }\n });\n\n this._keyManager.change.pipe(takeUntil(this._onDestroy)).subscribe(() => {\n if (this.panelOpen && this.overlay) {\n this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);\n }\n });\n }\n\n /** Scrolls the active option into view. */\n protected _scrollOptionIntoView(index: number): void {\n const labelCount = _countGroupLabelsBeforeOption(index, this.options, this.optionGroups);\n const itemHeight = this._getItemHeight();\n this.panel.nativeElement.scrollTop = _getOptionScrollPosition(\n (index + labelCount) * itemHeight,\n itemHeight,\n this.panel.nativeElement.scrollTop,\n this.panel.nativeElement.offsetHeight,\n );\n }\n\n /** Calculates the height of the select's options. */\n private _getItemHeight(): number {\n let [first] = this.options;\n if (first) {\n return first._getHostElement().offsetHeight;\n }\n return 0;\n }\n}\n\n// Deprecated below here ---------------------------\n\n@Component({\n selector: 'item',\n template: '<novo-option><ng-content></ng-content></novo-option>',\n host: {\n '[class.disabled]': 'disabled',\n '[class.active]': 'active',\n },\n})\nexport class NovoItemElement {\n @Input()\n public disabled: boolean;\n @Input()\n public keepOpen: boolean = false;\n @Output()\n public action: EventEmitter<any> = new EventEmitter();\n\n public active: boolean = false;\n\n constructor(private dropdown: NovoDropdownElement, public element: ElementRef) {\n notify(`'item' element has been deprecated. Please use 'novo-option' and 'novo-optgroup'.`);\n }\n\n @HostListener('click', ['$event'])\n public onClick(event: Event): void {\n // Poor man's disable\n if (!this.disabled) {\n // Close if keepOpen is false\n if (!this.keepOpen) {\n this.dropdown.closePanel();\n }\n // Emit the action\n this.action.emit({ originalEvent: event });\n }\n }\n}\n\n@Component({\n selector: 'list',\n template: '<ng-content></ng-content>',\n})\nexport class NovoDropdownListElement implements AfterContentInit {\n @ContentChildren(NovoItemElement)\n public items: QueryList<NovoItemElement>;\n\n constructor(private dropdown: NovoDropdownElement) {\n notify(`'list' element has been deprecated. Please use novo-option and novo-optgroup.`);\n }\n\n public ngAfterContentInit(): void {\n this.dropdown.items = this.items;\n this.items.changes.subscribe(() => {\n this.dropdown.items = this.items;\n });\n }\n}\n\n@Component({\n selector: 'dropdown-item-header',\n template: '<ng-content></ng-content>',\n})\nexport class NovoDropDownItemHeaderElement {\n constructor() {\n notify(`'dropdown-item-header' element has been deprecated. Please use novo-option and novo-optgroup.`);\n }\n}\n","// NG2\nimport { NgModule } from '@angular/core';\nimport { NovoOptionModule, NovoOverlayModule } from 'novo-elements/elements/common';\n// APP\nimport {\n NovoDropdownElement,\n NovoDropDownItemHeaderElement,\n NovoDropdownListElement,\n NovoDropDownTrigger,\n NovoItemElement,\n} from './Dropdown';\n\n@NgModule({\n imports: [NovoOverlayModule, NovoOptionModule],\n declarations: [NovoDropdownElement, NovoItemElement, NovoDropdownListElement, NovoDropDownItemHeaderElement, NovoDropDownTrigger],\n exports: [NovoDropdownElement, NovoItemElement, NovoDropdownListElement, NovoDropDownItemHeaderElement, NovoDropDownTrigger],\n})\nexport class NovoDropdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|