@fluentui/web-components 3.0.0-beta.85 → 3.0.0-beta.87
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/CHANGELOG.md +21 -2
- package/dist/dts/dropdown/dropdown.base.d.ts +23 -0
- package/dist/dts/dropdown/dropdown.d.ts +0 -32
- package/dist/dts/tree/index.d.ts +1 -0
- package/dist/dts/tree/tree.base.d.ts +68 -0
- package/dist/dts/tree/tree.d.ts +7 -67
- package/dist/dts/tree-item/index.d.ts +1 -0
- package/dist/dts/tree-item/tree-item.base.d.ts +99 -0
- package/dist/dts/tree-item/tree-item.d.ts +5 -88
- package/dist/dts/tree-item/tree-item.options.d.ts +2 -2
- package/dist/esm/dropdown/dropdown.base.js +50 -0
- package/dist/esm/dropdown/dropdown.base.js.map +1 -1
- package/dist/esm/dropdown/dropdown.js +12 -72
- package/dist/esm/dropdown/dropdown.js.map +1 -1
- package/dist/esm/tree/index.js +1 -0
- package/dist/esm/tree/index.js.map +1 -1
- package/dist/esm/tree/tree.base.js +232 -0
- package/dist/esm/tree/tree.base.js.map +1 -0
- package/dist/esm/tree/tree.js +10 -229
- package/dist/esm/tree/tree.js.map +1 -1
- package/dist/esm/tree/tree.template.js +3 -2
- package/dist/esm/tree/tree.template.js.map +1 -1
- package/dist/esm/tree-item/index.js +1 -0
- package/dist/esm/tree-item/index.js.map +1 -1
- package/dist/esm/tree-item/tree-item.base.js +165 -0
- package/dist/esm/tree-item/tree-item.base.js.map +1 -0
- package/dist/esm/tree-item/tree-item.js +13 -149
- package/dist/esm/tree-item/tree-item.js.map +1 -1
- package/dist/esm/tree-item/tree-item.styles.js +8 -21
- package/dist/esm/tree-item/tree-item.styles.js.map +1 -1
- package/dist/esm/tree-item/tree-item.template.js +5 -7
- package/dist/esm/tree-item/tree-item.template.js.map +1 -1
- package/dist/web-components.d.ts +127 -120
- package/dist/web-components.js +981 -940
- package/dist/web-components.min.js +229 -229
- package/package.json +1 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { attr } from '@microsoft/fast-element';
|
|
3
|
-
import {
|
|
4
|
-
import { swapStates, toggleState } from '../utils/element-internals.js';
|
|
3
|
+
import { swapStates } from '../utils/element-internals.js';
|
|
5
4
|
import { BaseDropdown } from './dropdown.base.js';
|
|
6
5
|
import { DropdownAppearance, DropdownSize } from './dropdown.options.js';
|
|
7
6
|
/**
|
|
@@ -14,32 +13,8 @@ import { DropdownAppearance, DropdownSize } from './dropdown.options.js';
|
|
|
14
13
|
* @public
|
|
15
14
|
*/
|
|
16
15
|
export class Dropdown extends BaseDropdown {
|
|
17
|
-
/**
|
|
18
|
-
* Swaps appearance states when the appearance property changes.
|
|
19
|
-
*
|
|
20
|
-
* @param prev - the previous appearance state
|
|
21
|
-
* @param next - the current appearance state
|
|
22
|
-
* @internal
|
|
23
|
-
*/
|
|
24
|
-
appearanceChanged(prev, next) {
|
|
25
|
-
swapStates(this.elementInternals, prev, next, DropdownAppearance);
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Swaps size states when the size property changes.
|
|
29
|
-
*
|
|
30
|
-
* @param prev - the previous size state
|
|
31
|
-
* @param next - the current size state
|
|
32
|
-
* @internal
|
|
33
|
-
*/
|
|
34
|
-
sizeChanged(prev, next) {
|
|
35
|
-
swapStates(this.elementInternals, prev, next, DropdownSize);
|
|
36
|
-
}
|
|
37
|
-
connectedCallback() {
|
|
38
|
-
super.connectedCallback();
|
|
39
|
-
this.anchorPositionFallback();
|
|
40
|
-
}
|
|
41
16
|
constructor() {
|
|
42
|
-
super();
|
|
17
|
+
super(...arguments);
|
|
43
18
|
/**
|
|
44
19
|
* The appearance of the dropdown.
|
|
45
20
|
*
|
|
@@ -48,61 +23,26 @@ export class Dropdown extends BaseDropdown {
|
|
|
48
23
|
* HTML Attribute: `appearance`
|
|
49
24
|
*/
|
|
50
25
|
this.appearance = DropdownAppearance.outline;
|
|
51
|
-
this.addEventListener('connected', this.listboxConnectedHandler);
|
|
52
|
-
}
|
|
53
|
-
disconnectedCallback() {
|
|
54
|
-
Dropdown.AnchorPositionFallbackObserver?.unobserve(this.listbox);
|
|
55
|
-
super.disconnectedCallback();
|
|
56
26
|
}
|
|
57
27
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* @param e - the event object
|
|
61
|
-
* @internal
|
|
62
|
-
*/
|
|
63
|
-
listboxConnectedHandler(e) {
|
|
64
|
-
const target = e.target;
|
|
65
|
-
if (isListbox(target)) {
|
|
66
|
-
this.listbox = target;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Adds or removes the window event listener based on the open state.
|
|
28
|
+
* Swaps appearance states when the appearance property changes.
|
|
71
29
|
*
|
|
72
|
-
* @param prev - the previous
|
|
73
|
-
* @param next - the current
|
|
30
|
+
* @param prev - the previous appearance state
|
|
31
|
+
* @param next - the current appearance state
|
|
74
32
|
* @internal
|
|
75
33
|
*/
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (next) {
|
|
79
|
-
Dropdown.AnchorPositionFallbackObserver?.observe(this.listbox);
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
Dropdown.AnchorPositionFallbackObserver?.unobserve(this.listbox);
|
|
34
|
+
appearanceChanged(prev, next) {
|
|
35
|
+
swapStates(this.elementInternals, prev, next, DropdownAppearance);
|
|
83
36
|
}
|
|
84
37
|
/**
|
|
85
|
-
*
|
|
86
|
-
* viewport bounds. One static observer is used for all dropdowns.
|
|
38
|
+
* Swaps size states when the size property changes.
|
|
87
39
|
*
|
|
40
|
+
* @param prev - the previous size state
|
|
41
|
+
* @param next - the current size state
|
|
88
42
|
* @internal
|
|
89
43
|
*/
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
Dropdown.AnchorPositionFallbackObserver ??
|
|
93
|
-
new IntersectionObserver((entries) => {
|
|
94
|
-
entries.forEach(({ boundingClientRect, isIntersecting, target }) => {
|
|
95
|
-
if (isListbox(target) && !isIntersecting) {
|
|
96
|
-
if (boundingClientRect.bottom > window.innerHeight) {
|
|
97
|
-
toggleState(target.dropdown.elementInternals, 'flip-block', true);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
if (boundingClientRect.top < 0) {
|
|
101
|
-
toggleState(target.dropdown.elementInternals, 'flip-block', false);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
}, { threshold: 1 });
|
|
44
|
+
sizeChanged(prev, next) {
|
|
45
|
+
swapStates(this.elementInternals, prev, next, DropdownSize);
|
|
106
46
|
}
|
|
107
47
|
}
|
|
108
48
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown.js","sourceRoot":"","sources":["../../../src/dropdown/dropdown.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dropdown.js","sourceRoot":"","sources":["../../../src/dropdown/dropdown.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEzE;;;;;;;;GAQG;AACH,MAAM,OAAO,QAAS,SAAQ,YAAY;IAA1C;;QACE;;;;;;WAMG;QAEI,eAAU,GAAuB,kBAAkB,CAAC,OAAO,CAAC;IAgCrE,CAAC;IA9BC;;;;;;OAMG;IACI,iBAAiB,CAAC,IAAoC,EAAE,IAAoC;QACjG,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACpE,CAAC;IAWD;;;;;;OAMG;IACI,WAAW,CAAC,IAA8B,EAAE,IAA8B;QAC/E,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;CACF;AAhCQ;IADN,IAAI;4CAC8D;AAoB5D;IADN,IAAI;sCACsB"}
|
package/dist/esm/tree/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tree/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tree/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { FASTElement, observable } from '@microsoft/fast-element';
|
|
3
|
+
import { isHTMLElement, keyArrowDown, keyArrowLeft, keyArrowRight, keyArrowUp, keyEnd, keyEnter, keyHome, keySpace, } from '@microsoft/fast-web-utilities';
|
|
4
|
+
import { isTreeItem } from '../tree-item/tree-item.options';
|
|
5
|
+
export class BaseTree extends FASTElement {
|
|
6
|
+
constructor() {
|
|
7
|
+
super();
|
|
8
|
+
/**
|
|
9
|
+
* The currently selected tree item
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
this.currentSelected = null;
|
|
13
|
+
/**
|
|
14
|
+
* The tree item that is designated to be in the tab queue.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
this.currentFocused = null;
|
|
19
|
+
/**
|
|
20
|
+
* The internal {@link https://developer.mozilla.org/docs/Web/API/ElementInternals | `ElementInternals`} instance for the component.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
this.elementInternals = this.attachInternals();
|
|
25
|
+
this.childTreeItems = [];
|
|
26
|
+
this.elementInternals.role = 'tree';
|
|
27
|
+
}
|
|
28
|
+
childTreeItemsChanged() {
|
|
29
|
+
this.updateCurrentSelected();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Updates current selected when slottedTreeItems changes
|
|
33
|
+
*/
|
|
34
|
+
updateCurrentSelected() {
|
|
35
|
+
// force single selection
|
|
36
|
+
// defaults to first one found
|
|
37
|
+
const selectedItem = this.querySelector(`[aria-selected='true']`);
|
|
38
|
+
this.currentSelected = selectedItem;
|
|
39
|
+
// invalidate the current focused item if it is no longer valid
|
|
40
|
+
if (this.currentFocused === null || !this.contains(this.currentFocused)) {
|
|
41
|
+
this.currentFocused = this.getValidFocusableItem();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* KeyDown handler
|
|
46
|
+
*
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
keydownHandler(e) {
|
|
50
|
+
if (e.defaultPrevented) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const item = e.target;
|
|
54
|
+
if (!isTreeItem(item) || this.childTreeItems.length < 1) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
const elements = this.getVisibleNodes();
|
|
58
|
+
switch (e.key) {
|
|
59
|
+
case keyHome: {
|
|
60
|
+
if (elements.length) {
|
|
61
|
+
elements[0].focus();
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
case keyEnd: {
|
|
66
|
+
if (elements.length) {
|
|
67
|
+
elements[elements.length - 1].focus();
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
case keyArrowLeft: {
|
|
72
|
+
if (item?.childTreeItems?.length && item.expanded) {
|
|
73
|
+
item.expanded = false;
|
|
74
|
+
}
|
|
75
|
+
else if (isTreeItem(item.parentElement)) {
|
|
76
|
+
item.parentElement.focus();
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
case keyArrowRight: {
|
|
81
|
+
if (item?.childTreeItems?.length) {
|
|
82
|
+
if (!item.expanded) {
|
|
83
|
+
item.expanded = true;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.focusNextNode(1, item);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
case keyArrowDown: {
|
|
92
|
+
this.focusNextNode(1, item);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
case keyArrowUp: {
|
|
96
|
+
this.focusNextNode(-1, item);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
case keyEnter: {
|
|
100
|
+
// In single-select trees where selection does not follow focus (see note below),
|
|
101
|
+
// the default action is typically to select the focused node.
|
|
102
|
+
this.clickHandler(e);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
case keySpace: {
|
|
106
|
+
item.toggleSelection();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// don't prevent default if we took no action
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Handle focus events
|
|
115
|
+
*
|
|
116
|
+
* @internal
|
|
117
|
+
*/
|
|
118
|
+
focusHandler(e) {
|
|
119
|
+
if (this.childTreeItems.length < 1) {
|
|
120
|
+
// no child items, nothing to do
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (e.target === this) {
|
|
124
|
+
if (this.currentFocused === null) {
|
|
125
|
+
this.currentFocused = this.getValidFocusableItem();
|
|
126
|
+
}
|
|
127
|
+
if (this.currentFocused !== null) {
|
|
128
|
+
this.currentFocused.focus();
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (this.contains(e.target)) {
|
|
133
|
+
this.setAttribute('tabindex', '-1');
|
|
134
|
+
this.currentFocused = e.target;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Handle blur events
|
|
139
|
+
*
|
|
140
|
+
* @internal
|
|
141
|
+
*/
|
|
142
|
+
blurHandler(e) {
|
|
143
|
+
if (e.target instanceof HTMLElement && (e.relatedTarget === null || !this.contains(e.relatedTarget))) {
|
|
144
|
+
this.setAttribute('tabindex', '0');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Handles click events bubbling up
|
|
149
|
+
*
|
|
150
|
+
* @internal
|
|
151
|
+
*/
|
|
152
|
+
clickHandler(e) {
|
|
153
|
+
if (e.defaultPrevented) {
|
|
154
|
+
// handled, do nothing
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (!isTreeItem(e.target)) {
|
|
158
|
+
// not a tree item, ignore
|
|
159
|
+
// return true, do not prevent default
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
const item = e.target;
|
|
163
|
+
item.toggleExpansion();
|
|
164
|
+
item.toggleSelection();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Handles the selected-changed events bubbling up
|
|
168
|
+
* from child tree items
|
|
169
|
+
*
|
|
170
|
+
* @internal
|
|
171
|
+
*/
|
|
172
|
+
changeHandler(e) {
|
|
173
|
+
if (e.defaultPrevented) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (!isTreeItem(e.target)) {
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
const item = e.target;
|
|
180
|
+
if (item.selected) {
|
|
181
|
+
// Deselect the prevously selected item
|
|
182
|
+
if (this.currentSelected && this.currentSelected !== item && isTreeItem(this.currentSelected)) {
|
|
183
|
+
this.currentSelected.selected = false;
|
|
184
|
+
}
|
|
185
|
+
// New selected item
|
|
186
|
+
this.currentSelected = item;
|
|
187
|
+
}
|
|
188
|
+
else if (!item.selected && this.currentSelected === item) {
|
|
189
|
+
// Selected item deselected
|
|
190
|
+
this.currentSelected = null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* checks if there are any nested tree items
|
|
195
|
+
*/
|
|
196
|
+
getValidFocusableItem() {
|
|
197
|
+
const elements = this.getVisibleNodes();
|
|
198
|
+
// default to selected element if there is one
|
|
199
|
+
let focusIndex = elements.findIndex(el => el.selected);
|
|
200
|
+
if (focusIndex === -1) {
|
|
201
|
+
// otherwise first focusable tree item
|
|
202
|
+
focusIndex = elements.findIndex(el => isTreeItem(el));
|
|
203
|
+
}
|
|
204
|
+
if (focusIndex !== -1) {
|
|
205
|
+
return elements[focusIndex];
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
getVisibleNodes() {
|
|
210
|
+
return Array.from(this.querySelectorAll('*')).filter(node => isTreeItem(node) && node.offsetParent !== null);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Move focus to a tree item based on its offset from the provided item
|
|
214
|
+
*/
|
|
215
|
+
focusNextNode(delta, item) {
|
|
216
|
+
const visibleNodes = this.getVisibleNodes();
|
|
217
|
+
if (!visibleNodes.length) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const focusItem = visibleNodes[visibleNodes.indexOf(item) + delta];
|
|
221
|
+
if (isHTMLElement(focusItem)) {
|
|
222
|
+
focusItem.focus();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
__decorate([
|
|
227
|
+
observable
|
|
228
|
+
], BaseTree.prototype, "currentSelected", void 0);
|
|
229
|
+
__decorate([
|
|
230
|
+
observable
|
|
231
|
+
], BaseTree.prototype, "childTreeItems", void 0);
|
|
232
|
+
//# sourceMappingURL=tree.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.base.js","sourceRoot":"","sources":["../../../src/tree/tree.base.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/tree/tree.js
CHANGED
|
@@ -1,28 +1,10 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { attr
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
export class Tree extends FASTElement {
|
|
2
|
+
import { attr } from '@microsoft/fast-element';
|
|
3
|
+
import { TreeItemAppearance, TreeItemSize } from '../tree-item/tree-item.options';
|
|
4
|
+
import { BaseTree } from './tree.base';
|
|
5
|
+
export class Tree extends BaseTree {
|
|
7
6
|
constructor() {
|
|
8
|
-
super();
|
|
9
|
-
/**
|
|
10
|
-
* The currently selected tree item
|
|
11
|
-
* @public
|
|
12
|
-
*/
|
|
13
|
-
this.currentSelected = null;
|
|
14
|
-
/**
|
|
15
|
-
* The tree item that is designated to be in the tab queue.
|
|
16
|
-
*
|
|
17
|
-
* @internal
|
|
18
|
-
*/
|
|
19
|
-
this.currentFocused = null;
|
|
20
|
-
/**
|
|
21
|
-
* The internal {@link https://developer.mozilla.org/docs/Web/API/ElementInternals | `ElementInternals`} instance for the component.
|
|
22
|
-
*
|
|
23
|
-
* @internal
|
|
24
|
-
*/
|
|
25
|
-
this.elementInternals = this.attachInternals();
|
|
7
|
+
super(...arguments);
|
|
26
8
|
/**
|
|
27
9
|
* The size of the tree item element
|
|
28
10
|
* @public
|
|
@@ -35,8 +17,6 @@ export class Tree extends FASTElement {
|
|
|
35
17
|
* HTML Attribute: appearance
|
|
36
18
|
*/
|
|
37
19
|
this.appearance = TreeItemAppearance.subtle;
|
|
38
|
-
this.childTreeItems = [];
|
|
39
|
-
this.elementInternals.role = 'tree';
|
|
40
20
|
}
|
|
41
21
|
sizeChanged() {
|
|
42
22
|
this.updateSizeAndAppearance();
|
|
@@ -44,9 +24,13 @@ export class Tree extends FASTElement {
|
|
|
44
24
|
appearanceChanged() {
|
|
45
25
|
this.updateSizeAndAppearance();
|
|
46
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* child tree items supered change event
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
47
31
|
childTreeItemsChanged() {
|
|
32
|
+
super.childTreeItemsChanged();
|
|
48
33
|
this.updateSizeAndAppearance();
|
|
49
|
-
this.updateCurrentSelected();
|
|
50
34
|
}
|
|
51
35
|
/**
|
|
52
36
|
* 1. Update the child items' size based on the tree's size
|
|
@@ -57,218 +41,15 @@ export class Tree extends FASTElement {
|
|
|
57
41
|
return;
|
|
58
42
|
}
|
|
59
43
|
this.childTreeItems.forEach(item => {
|
|
60
|
-
if (!isTreeItem(item)) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
44
|
item.size = this.size;
|
|
64
45
|
item.appearance = this.appearance;
|
|
65
46
|
});
|
|
66
47
|
}
|
|
67
|
-
/**
|
|
68
|
-
* Updates current selected when slottedTreeItems changes
|
|
69
|
-
*/
|
|
70
|
-
updateCurrentSelected() {
|
|
71
|
-
// force single selection
|
|
72
|
-
// defaults to first one found
|
|
73
|
-
const selectedItem = this.querySelector(`[aria-selected='true']`);
|
|
74
|
-
this.currentSelected = selectedItem;
|
|
75
|
-
// invalidate the current focused item if it is no longer valid
|
|
76
|
-
if (this.currentFocused === null || !this.contains(this.currentFocused)) {
|
|
77
|
-
this.currentFocused = this.getValidFocusableItem();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* KeyDown handler
|
|
82
|
-
*
|
|
83
|
-
* @internal
|
|
84
|
-
*/
|
|
85
|
-
keydownHandler(e) {
|
|
86
|
-
if (e.defaultPrevented) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const item = e.target;
|
|
90
|
-
if (!isTreeItem(item) || this.childTreeItems.length < 1) {
|
|
91
|
-
return true;
|
|
92
|
-
}
|
|
93
|
-
const elements = this.getVisibleNodes();
|
|
94
|
-
switch (e.key) {
|
|
95
|
-
case keyHome: {
|
|
96
|
-
if (elements.length) {
|
|
97
|
-
elements[0].focus();
|
|
98
|
-
}
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
case keyEnd: {
|
|
102
|
-
if (elements.length) {
|
|
103
|
-
elements[elements.length - 1].focus();
|
|
104
|
-
}
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
case keyArrowLeft: {
|
|
108
|
-
if (item?.childTreeItems?.length && item.expanded) {
|
|
109
|
-
item.expanded = false;
|
|
110
|
-
}
|
|
111
|
-
else if (isTreeItem(item.parentElement)) {
|
|
112
|
-
item.parentElement.focus();
|
|
113
|
-
}
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
case keyArrowRight: {
|
|
117
|
-
if (item?.childTreeItems?.length) {
|
|
118
|
-
if (!item.expanded) {
|
|
119
|
-
item.expanded = true;
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
this.focusNextNode(1, item);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
case keyArrowDown: {
|
|
128
|
-
this.focusNextNode(1, item);
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
case keyArrowUp: {
|
|
132
|
-
this.focusNextNode(-1, item);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
case keyEnter: {
|
|
136
|
-
// In single-select trees where selection does not follow focus (see note below),
|
|
137
|
-
// the default action is typically to select the focused node.
|
|
138
|
-
this.clickHandler(e);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
case keySpace: {
|
|
142
|
-
item.toggleSelection();
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
// don't prevent default if we took no action
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Handle focus events
|
|
151
|
-
*
|
|
152
|
-
* @internal
|
|
153
|
-
*/
|
|
154
|
-
focusHandler(e) {
|
|
155
|
-
if (this.childTreeItems.length < 1) {
|
|
156
|
-
// no child items, nothing to do
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
if (e.target === this) {
|
|
160
|
-
if (this.currentFocused === null) {
|
|
161
|
-
this.currentFocused = this.getValidFocusableItem();
|
|
162
|
-
}
|
|
163
|
-
if (this.currentFocused !== null) {
|
|
164
|
-
this.currentFocused.focus();
|
|
165
|
-
}
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
if (this.contains(e.target)) {
|
|
169
|
-
this.setAttribute('tabindex', '-1');
|
|
170
|
-
this.currentFocused = e.target;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Handle blur events
|
|
175
|
-
*
|
|
176
|
-
* @internal
|
|
177
|
-
*/
|
|
178
|
-
blurHandler(e) {
|
|
179
|
-
if (e.target instanceof HTMLElement && (e.relatedTarget === null || !this.contains(e.relatedTarget))) {
|
|
180
|
-
this.setAttribute('tabindex', '0');
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Handles click events bubbling up
|
|
185
|
-
*
|
|
186
|
-
* @internal
|
|
187
|
-
*/
|
|
188
|
-
clickHandler(e) {
|
|
189
|
-
if (e.defaultPrevented) {
|
|
190
|
-
// handled, do nothing
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
if (!isTreeItem(e.target)) {
|
|
194
|
-
// not a tree item, ignore
|
|
195
|
-
// return true, do not prevent default
|
|
196
|
-
return true;
|
|
197
|
-
}
|
|
198
|
-
const item = e.target;
|
|
199
|
-
item.toggleExpansion();
|
|
200
|
-
item.toggleSelection();
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Handles the selected-changed events bubbling up
|
|
204
|
-
* from child tree items
|
|
205
|
-
*
|
|
206
|
-
* @internal
|
|
207
|
-
*/
|
|
208
|
-
changeHandler(e) {
|
|
209
|
-
if (e.defaultPrevented) {
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
if (!isTreeItem(e.target)) {
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
215
|
-
const item = e.target;
|
|
216
|
-
if (item.selected) {
|
|
217
|
-
// Deselect the prevously selected item
|
|
218
|
-
if (this.currentSelected && this.currentSelected !== item && this.currentSelected instanceof TreeItem) {
|
|
219
|
-
this.currentSelected.selected = false;
|
|
220
|
-
}
|
|
221
|
-
// New selected item
|
|
222
|
-
this.currentSelected = item;
|
|
223
|
-
}
|
|
224
|
-
else if (!item.selected && this.currentSelected === item) {
|
|
225
|
-
// Selected item deselected
|
|
226
|
-
this.currentSelected = null;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* checks if there are any nested tree items
|
|
231
|
-
*/
|
|
232
|
-
getValidFocusableItem() {
|
|
233
|
-
const elements = this.getVisibleNodes();
|
|
234
|
-
// default to selected element if there is one
|
|
235
|
-
let focusIndex = elements.findIndex(el => el.selected);
|
|
236
|
-
if (focusIndex === -1) {
|
|
237
|
-
// otherwise first focusable tree item
|
|
238
|
-
focusIndex = elements.findIndex(el => el instanceof TreeItem);
|
|
239
|
-
}
|
|
240
|
-
if (focusIndex !== -1) {
|
|
241
|
-
return elements[focusIndex];
|
|
242
|
-
}
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
getVisibleNodes() {
|
|
246
|
-
return Array.from(this.querySelectorAll('*')).filter(node => isTreeItem(node) && node.offsetParent !== null);
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Move focus to a tree item based on its offset from the provided item
|
|
250
|
-
*/
|
|
251
|
-
focusNextNode(delta, item) {
|
|
252
|
-
const visibleNodes = this.getVisibleNodes();
|
|
253
|
-
if (!visibleNodes.length) {
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
const focusItem = visibleNodes[visibleNodes.indexOf(item) + delta];
|
|
257
|
-
if (isHTMLElement(focusItem)) {
|
|
258
|
-
focusItem.focus();
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
48
|
}
|
|
262
|
-
__decorate([
|
|
263
|
-
observable
|
|
264
|
-
], Tree.prototype, "currentSelected", void 0);
|
|
265
49
|
__decorate([
|
|
266
50
|
attr
|
|
267
51
|
], Tree.prototype, "size", void 0);
|
|
268
52
|
__decorate([
|
|
269
53
|
attr
|
|
270
54
|
], Tree.prototype, "appearance", void 0);
|
|
271
|
-
__decorate([
|
|
272
|
-
observable
|
|
273
|
-
], Tree.prototype, "childTreeItems", void 0);
|
|
274
55
|
//# sourceMappingURL=tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/tree/tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/tree/tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAElF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,OAAO,IAAK,SAAQ,QAAQ;IAAlC;;QACE;;;;WAIG;QAEI,SAAI,GAAiB,YAAY,CAAC,KAAK,CAAC;QAK/C;;;;WAIG;QAEI,eAAU,GAAuB,kBAAkB,CAAC,MAAM,CAAC;IA4BpE,CAAC;IAtCS,WAAW;QACjB,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IASO,iBAAiB;QACvB,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,qBAAqB;QAC1B,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAC9B,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,uBAAuB;QAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAChC,IAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACnC,IAAiB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAvCQ;IADN,IAAI;kCAC0C;AAWxC;IADN,IAAI;wCAC6D"}
|