@fluentui/priority-overflow 9.0.2 → 9.1.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.json +75 -1
- package/CHANGELOG.md +21 -2
- package/dist/index.d.ts +16 -0
- package/lib/consts.js +2 -0
- package/lib/consts.js.map +1 -0
- package/lib/debounce.js +13 -14
- package/lib/debounce.js.map +1 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib/overflowManager.js +257 -207
- package/lib/overflowManager.js.map +1 -1
- package/lib/priorityQueue.js +85 -86
- package/lib/priorityQueue.js.map +1 -1
- package/lib/types.js +1 -2
- package/lib/types.js.map +1 -1
- package/lib-commonjs/consts.js +16 -0
- package/lib-commonjs/consts.js.map +1 -0
- package/lib-commonjs/debounce.js +1 -3
- package/lib-commonjs/debounce.js.map +1 -1
- package/lib-commonjs/index.js +0 -3
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/overflowManager.js +111 -61
- package/lib-commonjs/overflowManager.js.map +1 -1
- package/lib-commonjs/priorityQueue.js +1 -3
- package/lib-commonjs/priorityQueue.js.map +1 -1
- package/lib-commonjs/types.js +0 -3
- package/lib-commonjs/types.js.map +1 -1
- package/package.json +3 -2
- package/.swcrc +0 -30
package/lib/overflowManager.js
CHANGED
@@ -1,217 +1,267 @@
|
|
1
|
+
var _groups, _groupId;
|
2
|
+
import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';
|
1
3
|
import { debounce } from './debounce';
|
2
4
|
import { createPriorityQueue } from './priorityQueue';
|
3
5
|
/**
|
4
6
|
* @internal
|
5
7
|
* @returns overflow manager instance
|
6
|
-
*/
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
});
|
30
|
-
const invisibleItemQueue = createPriorityQueue((a, b) => {
|
31
|
-
const itemA = overflowItems[a];
|
32
|
-
const itemB = overflowItems[b];
|
33
|
-
// Higher priority at the top of the queue
|
34
|
-
const priority = itemB.priority - itemA.priority;
|
35
|
-
if (priority !== 0) {
|
36
|
-
return priority;
|
37
|
-
}
|
38
|
-
const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
|
39
|
-
// equal priority, use DOM order
|
40
|
-
// eslint-disable-next-line no-bitwise
|
41
|
-
return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
|
42
|
-
});
|
43
|
-
const visibleItemQueue = createPriorityQueue((a, b) => {
|
44
|
-
const itemA = overflowItems[a];
|
45
|
-
const itemB = overflowItems[b];
|
46
|
-
// Lower priority at the top of the queue
|
47
|
-
const priority = itemA.priority - itemB.priority;
|
48
|
-
if (priority !== 0) {
|
49
|
-
return priority;
|
50
|
-
}
|
51
|
-
const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
|
52
|
-
// equal priority, use DOM order
|
53
|
-
// eslint-disable-next-line no-bitwise
|
54
|
-
return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
|
55
|
-
});
|
56
|
-
const getOffsetSize = el => {
|
57
|
-
return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
|
58
|
-
};
|
59
|
-
const makeItemVisible = () => {
|
60
|
-
const nextVisible = invisibleItemQueue.dequeue();
|
61
|
-
visibleItemQueue.enqueue(nextVisible);
|
62
|
-
const item = overflowItems[nextVisible];
|
63
|
-
options.onUpdateItemVisibility({
|
64
|
-
item,
|
65
|
-
visible: true
|
66
|
-
});
|
67
|
-
if (item.groupId) {
|
68
|
-
overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
|
69
|
-
overflowGroups[item.groupId].visibleItemIds.add(item.id);
|
70
|
-
}
|
71
|
-
return getOffsetSize(item.element);
|
72
|
-
};
|
73
|
-
const makeItemInvisible = () => {
|
74
|
-
const nextInvisible = visibleItemQueue.dequeue();
|
75
|
-
invisibleItemQueue.enqueue(nextInvisible);
|
76
|
-
const item = overflowItems[nextInvisible];
|
77
|
-
const width = getOffsetSize(item.element);
|
78
|
-
options.onUpdateItemVisibility({
|
79
|
-
item,
|
80
|
-
visible: false
|
8
|
+
*/ export function createOverflowManager() {
|
9
|
+
let container;
|
10
|
+
let overflowMenu;
|
11
|
+
// Set as true when resize observer is observing
|
12
|
+
let observing = false;
|
13
|
+
// If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
|
14
|
+
// Initially true to force dispatch on first mount
|
15
|
+
let forceDispatch = true;
|
16
|
+
const options = {
|
17
|
+
padding: 10,
|
18
|
+
overflowAxis: 'horizontal',
|
19
|
+
overflowDirection: 'end',
|
20
|
+
minimumVisible: 0,
|
21
|
+
onUpdateItemVisibility: ()=>undefined,
|
22
|
+
onUpdateOverflow: ()=>undefined
|
23
|
+
};
|
24
|
+
const overflowItems = {};
|
25
|
+
const overflowDividers = {};
|
26
|
+
const resizeObserver = new ResizeObserver((entries)=>{
|
27
|
+
if (!entries[0] || !container) {
|
28
|
+
return;
|
29
|
+
}
|
30
|
+
update();
|
81
31
|
});
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
32
|
+
const getNextItem = (queueToDequeue, queueToEnqueue)=>{
|
33
|
+
const nextItem = queueToDequeue.dequeue();
|
34
|
+
queueToEnqueue.enqueue(nextItem);
|
35
|
+
return overflowItems[nextItem];
|
36
|
+
};
|
37
|
+
const createGroupManager = ()=>{
|
38
|
+
const groupVisibility = {};
|
39
|
+
const groups = {};
|
40
|
+
function updateGroupVisibility(groupId) {
|
41
|
+
const group = groups[groupId];
|
42
|
+
if (group.invisibleItemIds.size && group.visibleItemIds.size) {
|
43
|
+
groupVisibility[groupId] = 'overflow';
|
44
|
+
} else if (group.visibleItemIds.size === 0) {
|
45
|
+
groupVisibility[groupId] = 'hidden';
|
46
|
+
} else {
|
47
|
+
groupVisibility[groupId] = 'visible';
|
48
|
+
}
|
49
|
+
}
|
50
|
+
function isGroupVisible(groupId) {
|
51
|
+
return groupVisibility[groupId] === 'visible' || groupVisibility[groupId] === 'overflow';
|
52
|
+
}
|
53
|
+
return {
|
54
|
+
groupVisibility: ()=>groupVisibility,
|
55
|
+
isSingleItemVisible (itemId, groupId) {
|
56
|
+
return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;
|
57
|
+
},
|
58
|
+
addItem (itemId, groupId) {
|
59
|
+
var _;
|
60
|
+
(_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {
|
61
|
+
visibleItemIds: new Set(),
|
62
|
+
invisibleItemIds: new Set()
|
63
|
+
};
|
64
|
+
groups[groupId].visibleItemIds.add(itemId);
|
65
|
+
updateGroupVisibility(groupId);
|
66
|
+
},
|
67
|
+
removeItem (itemId, groupId) {
|
68
|
+
groups[groupId].invisibleItemIds.delete(itemId);
|
69
|
+
groups[groupId].visibleItemIds.delete(itemId);
|
70
|
+
updateGroupVisibility(groupId);
|
71
|
+
},
|
72
|
+
showItem (itemId, groupId) {
|
73
|
+
groups[groupId].invisibleItemIds.delete(itemId);
|
74
|
+
groups[groupId].visibleItemIds.add(itemId);
|
75
|
+
updateGroupVisibility(groupId);
|
76
|
+
},
|
77
|
+
hideItem (itemId, groupId) {
|
78
|
+
groups[groupId].invisibleItemIds.add(itemId);
|
79
|
+
groups[groupId].visibleItemIds.delete(itemId);
|
80
|
+
updateGroupVisibility(groupId);
|
81
|
+
}
|
82
|
+
};
|
83
|
+
};
|
84
|
+
const groupManager = createGroupManager();
|
85
|
+
const invisibleItemQueue = createPriorityQueue((a, b)=>{
|
86
|
+
const itemA = overflowItems[a];
|
87
|
+
const itemB = overflowItems[b];
|
88
|
+
// Higher priority at the top of the queue
|
89
|
+
const priority = itemB.priority - itemA.priority;
|
90
|
+
if (priority !== 0) {
|
91
|
+
return priority;
|
92
|
+
}
|
93
|
+
const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
|
94
|
+
// equal priority, use DOM order
|
95
|
+
// eslint-disable-next-line no-bitwise
|
96
|
+
return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
|
102
97
|
});
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
98
|
+
const visibleItemQueue = createPriorityQueue((a, b)=>{
|
99
|
+
const itemA = overflowItems[a];
|
100
|
+
const itemB = overflowItems[b];
|
101
|
+
// Lower priority at the top of the queue
|
102
|
+
const priority = itemA.priority - itemB.priority;
|
103
|
+
if (priority !== 0) {
|
104
|
+
return priority;
|
105
|
+
}
|
106
|
+
const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
|
107
|
+
// equal priority, use DOM order
|
108
|
+
// eslint-disable-next-line no-bitwise
|
109
|
+
return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
|
107
110
|
});
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;
|
115
|
-
// Snapshot of the visible/invisible state to compare for updates
|
116
|
-
const visibleTop = visibleItemQueue.peek();
|
117
|
-
const invisibleTop = invisibleItemQueue.peek();
|
118
|
-
const visibleItemIds = visibleItemQueue.all();
|
119
|
-
let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {
|
120
|
-
const child = overflowItems[visibleItemId].element;
|
121
|
-
return sum + getOffsetSize(child);
|
122
|
-
}, 0);
|
123
|
-
// Add items until available width is filled - can result in overflow
|
124
|
-
while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {
|
125
|
-
currentWidth += makeItemVisible();
|
126
|
-
}
|
127
|
-
// Remove items until there's no more overflow
|
128
|
-
while (currentWidth > availableSize && visibleItemQueue.size() > 0) {
|
129
|
-
if (visibleItemQueue.size() <= options.minimumVisible) {
|
130
|
-
break;
|
131
|
-
}
|
132
|
-
currentWidth -= makeItemInvisible();
|
133
|
-
}
|
134
|
-
// make sure the overflow menu can fit
|
135
|
-
if (visibleItemQueue.size() > options.minimumVisible && invisibleItemQueue.size() > 0 && currentWidth + overflowMenuOffset > availableSize) {
|
136
|
-
makeItemInvisible();
|
137
|
-
}
|
138
|
-
// only update when the state of visible/invisible items has changed
|
139
|
-
if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {
|
140
|
-
return true;
|
141
|
-
}
|
142
|
-
return false;
|
143
|
-
};
|
144
|
-
const forceUpdate = () => {
|
145
|
-
if (processOverflowItems() || forceDispatch) {
|
146
|
-
forceDispatch = false;
|
147
|
-
dispatchOverflowUpdate();
|
148
|
-
}
|
149
|
-
};
|
150
|
-
const update = debounce(forceUpdate);
|
151
|
-
const observe = (observedContainer, userOptions) => {
|
152
|
-
Object.assign(options, userOptions);
|
153
|
-
observing = true;
|
154
|
-
Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));
|
155
|
-
container = observedContainer;
|
156
|
-
resizeObserver.observe(container);
|
157
|
-
};
|
158
|
-
const disconnect = () => {
|
159
|
-
observing = false;
|
160
|
-
resizeObserver.disconnect();
|
161
|
-
};
|
162
|
-
const addItem = item => {
|
163
|
-
if (overflowItems[item.id]) {
|
164
|
-
return;
|
165
|
-
}
|
166
|
-
overflowItems[item.id] = item;
|
167
|
-
// some options can affect priority which are only set on `observe`
|
168
|
-
if (observing) {
|
169
|
-
// Updates to elements might not change the queue tops
|
170
|
-
// i.e. new element is enqueued but the top of the queue stays the same
|
171
|
-
// force a dispatch on the next batched update
|
172
|
-
forceDispatch = true;
|
173
|
-
visibleItemQueue.enqueue(item.id);
|
174
|
-
}
|
175
|
-
if (item.groupId) {
|
176
|
-
if (!overflowGroups[item.groupId]) {
|
177
|
-
overflowGroups[item.groupId] = {
|
178
|
-
visibleItemIds: new Set(),
|
179
|
-
invisibleItemIds: new Set()
|
180
|
-
};
|
181
|
-
}
|
182
|
-
overflowGroups[item.groupId].visibleItemIds.add(item.id);
|
183
|
-
}
|
184
|
-
update();
|
185
|
-
};
|
186
|
-
const addOverflowMenu = el => {
|
187
|
-
overflowMenu = el;
|
188
|
-
};
|
189
|
-
const removeOverflowMenu = () => {
|
190
|
-
overflowMenu = undefined;
|
191
|
-
};
|
192
|
-
const removeItem = itemId => {
|
193
|
-
if (!overflowItems[itemId]) {
|
194
|
-
return;
|
195
|
-
}
|
196
|
-
const item = overflowItems[itemId];
|
197
|
-
visibleItemQueue.remove(itemId);
|
198
|
-
invisibleItemQueue.remove(itemId);
|
199
|
-
if (item.groupId) {
|
200
|
-
overflowGroups[item.groupId].visibleItemIds.delete(item.id);
|
201
|
-
overflowGroups[item.groupId].invisibleItemIds.delete(item.id);
|
111
|
+
const getOffsetSize = (el)=>{
|
112
|
+
return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
|
113
|
+
};
|
114
|
+
function computeSizeChange(entry) {
|
115
|
+
const dividerWidth = entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId] ? getOffsetSize(overflowDividers[entry.groupId].element) : 0;
|
116
|
+
return getOffsetSize(entry.element) + dividerWidth;
|
202
117
|
}
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
118
|
+
const showItem = ()=>{
|
119
|
+
const item = getNextItem(invisibleItemQueue, visibleItemQueue);
|
120
|
+
options.onUpdateItemVisibility({
|
121
|
+
item,
|
122
|
+
visible: true
|
123
|
+
});
|
124
|
+
if (item.groupId) {
|
125
|
+
groupManager.showItem(item.id, item.groupId);
|
126
|
+
if (groupManager.isSingleItemVisible(item.id, item.groupId)) {
|
127
|
+
var _overflowDividers_item_groupId;
|
128
|
+
(_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(DATA_OVERFLOWING);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
return computeSizeChange(item);
|
132
|
+
};
|
133
|
+
const hideItem = ()=>{
|
134
|
+
const item = getNextItem(visibleItemQueue, invisibleItemQueue);
|
135
|
+
const width = computeSizeChange(item);
|
136
|
+
options.onUpdateItemVisibility({
|
137
|
+
item,
|
138
|
+
visible: false
|
139
|
+
});
|
140
|
+
if (item.groupId) {
|
141
|
+
if (groupManager.isSingleItemVisible(item.id, item.groupId)) {
|
142
|
+
var _overflowDividers_item_groupId;
|
143
|
+
(_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.setAttribute(DATA_OVERFLOWING, '');
|
144
|
+
}
|
145
|
+
groupManager.hideItem(item.id, item.groupId);
|
146
|
+
}
|
147
|
+
return width;
|
148
|
+
};
|
149
|
+
const dispatchOverflowUpdate = ()=>{
|
150
|
+
const visibleItemIds = visibleItemQueue.all();
|
151
|
+
const invisibleItemIds = invisibleItemQueue.all();
|
152
|
+
const visibleItems = visibleItemIds.map((itemId)=>overflowItems[itemId]);
|
153
|
+
const invisibleItems = invisibleItemIds.map((itemId)=>overflowItems[itemId]);
|
154
|
+
options.onUpdateOverflow({
|
155
|
+
visibleItems,
|
156
|
+
invisibleItems,
|
157
|
+
groupVisibility: groupManager.groupVisibility()
|
158
|
+
});
|
159
|
+
};
|
160
|
+
const processOverflowItems = ()=>{
|
161
|
+
if (!container) {
|
162
|
+
return false;
|
163
|
+
}
|
164
|
+
const totalDividersWidth = Object.values(overflowDividers).map((dvdr)=>dvdr.groupId ? getOffsetSize(dvdr.element) : 0).reduce((prev, current)=>prev + current, 0);
|
165
|
+
const availableSize = getOffsetSize(container) - options.padding - totalDividersWidth - (overflowMenu ? getOffsetSize(overflowMenu) : 0);
|
166
|
+
// Snapshot of the visible/invisible state to compare for updates
|
167
|
+
const visibleTop = visibleItemQueue.peek();
|
168
|
+
const invisibleTop = invisibleItemQueue.peek();
|
169
|
+
let currentWidth = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
|
170
|
+
// Add items until available width is filled - can result in overflow
|
171
|
+
while(currentWidth < availableSize && invisibleItemQueue.size() > 0){
|
172
|
+
currentWidth += showItem();
|
173
|
+
}
|
174
|
+
// Remove items until there's no more overflow
|
175
|
+
while(currentWidth > availableSize && visibleItemQueue.size() > options.minimumVisible){
|
176
|
+
currentWidth -= hideItem();
|
177
|
+
}
|
178
|
+
// only update when the state of visible/invisible items has changed
|
179
|
+
return visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop;
|
180
|
+
};
|
181
|
+
const forceUpdate = ()=>{
|
182
|
+
if (processOverflowItems() || forceDispatch) {
|
183
|
+
forceDispatch = false;
|
184
|
+
dispatchOverflowUpdate();
|
185
|
+
}
|
186
|
+
};
|
187
|
+
const update = debounce(forceUpdate);
|
188
|
+
const observe = (observedContainer, userOptions)=>{
|
189
|
+
Object.assign(options, userOptions);
|
190
|
+
observing = true;
|
191
|
+
Object.values(overflowItems).forEach((item)=>visibleItemQueue.enqueue(item.id));
|
192
|
+
container = observedContainer;
|
193
|
+
resizeObserver.observe(container);
|
194
|
+
};
|
195
|
+
const disconnect = ()=>{
|
196
|
+
observing = false;
|
197
|
+
resizeObserver.disconnect();
|
198
|
+
};
|
199
|
+
const addItem = (item)=>{
|
200
|
+
if (overflowItems[item.id]) {
|
201
|
+
return;
|
202
|
+
}
|
203
|
+
overflowItems[item.id] = item;
|
204
|
+
// some options can affect priority which are only set on `observe`
|
205
|
+
if (observing) {
|
206
|
+
// Updates to elements might not change the queue tops
|
207
|
+
// i.e. new element is enqueued but the top of the queue stays the same
|
208
|
+
// force a dispatch on the next batched update
|
209
|
+
forceDispatch = true;
|
210
|
+
visibleItemQueue.enqueue(item.id);
|
211
|
+
}
|
212
|
+
if (item.groupId) {
|
213
|
+
groupManager.addItem(item.id, item.groupId);
|
214
|
+
item.element.setAttribute(DATA_OVERFLOW_GROUP, item.groupId);
|
215
|
+
}
|
216
|
+
update();
|
217
|
+
};
|
218
|
+
const addOverflowMenu = (el)=>{
|
219
|
+
overflowMenu = el;
|
220
|
+
};
|
221
|
+
const addDivider = (divider)=>{
|
222
|
+
if (!divider.groupId || overflowDividers[divider.groupId]) {
|
223
|
+
return;
|
224
|
+
}
|
225
|
+
divider.element.setAttribute(DATA_OVERFLOW_GROUP, divider.groupId);
|
226
|
+
overflowDividers[divider.groupId] = divider;
|
227
|
+
};
|
228
|
+
const removeOverflowMenu = ()=>{
|
229
|
+
overflowMenu = undefined;
|
230
|
+
};
|
231
|
+
const removeDivider = (groupId)=>{
|
232
|
+
if (!overflowDividers[groupId]) {
|
233
|
+
return;
|
234
|
+
}
|
235
|
+
const divider = overflowDividers[groupId];
|
236
|
+
if (divider.groupId) {
|
237
|
+
delete overflowDividers[groupId];
|
238
|
+
divider.element.removeAttribute(DATA_OVERFLOW_GROUP);
|
239
|
+
}
|
240
|
+
};
|
241
|
+
const removeItem = (itemId)=>{
|
242
|
+
if (!overflowItems[itemId]) {
|
243
|
+
return;
|
244
|
+
}
|
245
|
+
const item = overflowItems[itemId];
|
246
|
+
visibleItemQueue.remove(itemId);
|
247
|
+
invisibleItemQueue.remove(itemId);
|
248
|
+
if (item.groupId) {
|
249
|
+
groupManager.removeItem(item.id, item.groupId);
|
250
|
+
item.element.removeAttribute(DATA_OVERFLOW_GROUP);
|
251
|
+
}
|
252
|
+
delete overflowItems[itemId];
|
253
|
+
update();
|
254
|
+
};
|
255
|
+
return {
|
256
|
+
addItem,
|
257
|
+
disconnect,
|
258
|
+
forceUpdate,
|
259
|
+
observe,
|
260
|
+
removeItem,
|
261
|
+
update,
|
262
|
+
addOverflowMenu,
|
263
|
+
removeOverflowMenu,
|
264
|
+
addDivider,
|
265
|
+
removeDivider
|
266
|
+
};
|
216
267
|
}
|
217
|
-
//# sourceMappingURL=overflowManager.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","makeItemVisible","nextVisible","dequeue","enqueue","item","visible","groupId","invisibleItemIds","delete","id","visibleItemIds","add","makeItemInvisible","nextInvisible","width","dispatchOverflowUpdate","all","visibleItems","map","itemId","invisibleItems","groupVisibility","Object","forEach","groupState","size","processOverflowItems","availableSize","overflowMenuOffset","visibleTop","peek","invisibleTop","currentWidth","reduce","sum","visibleItemId","child","forceUpdate","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove"],"sources":["../src/overflowManager.ts"],"sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n // Set as true when resize observer is observing\n let observing = false;\n // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change\n let forceDispatch = false;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (): boolean => {\n if (!container) {\n return false;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() <= options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // make sure the overflow menu can fit\n if (\n visibleItemQueue.size() > options.minimumVisible &&\n invisibleItemQueue.size() > 0 &&\n currentWidth + overflowMenuOffset > availableSize\n ) {\n makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n return true;\n }\n\n return false;\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n // Updates to elements might not change the queue tops\n // i.e. new element is enqueued but the top of the queue stays the same\n // force a dispatch on the next batched update\n forceDispatch = true;\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n };\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"sources":["overflowManager.ts"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { debounce } from './debounce';\nimport { createPriorityQueue, PriorityQueue } from './priorityQueue';\nimport type {\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n ObserveOptions,\n OverflowDividerEntry,\n} from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n let overflowMenu: HTMLElement | undefined;\n // Set as true when resize observer is observing\n let observing = false;\n // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change\n // Initially true to force dispatch on first mount\n let forceDispatch = true;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowDividers: Record<string, OverflowDividerEntry> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const getNextItem = (queueToDequeue: PriorityQueue<string>, queueToEnqueue: PriorityQueue<string>) => {\n const nextItem = queueToDequeue.dequeue();\n queueToEnqueue.enqueue(nextItem);\n return overflowItems[nextItem];\n };\n\n const createGroupManager = () => {\n const groupVisibility: Record<string, OverflowGroupState> = {};\n const groups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n function updateGroupVisibility(groupId: string) {\n const group = groups[groupId];\n if (group.invisibleItemIds.size && group.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (group.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n }\n function isGroupVisible(groupId: string) {\n return groupVisibility[groupId] === 'visible' || groupVisibility[groupId] === 'overflow';\n }\n return {\n groupVisibility: () => groupVisibility,\n isSingleItemVisible(itemId: string, groupId: string) {\n return (\n isGroupVisible(groupId) &&\n groups[groupId].visibleItemIds.has(itemId) &&\n groups[groupId].visibleItemIds.size === 1\n );\n },\n addItem(itemId: string, groupId: string) {\n groups[groupId] ??= {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n removeItem(itemId: string, groupId: string) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n },\n showItem(itemId: string, groupId: string) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n hideItem(itemId: string, groupId: string) {\n groups[groupId].invisibleItemIds.add(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n },\n };\n };\n\n const groupManager = createGroupManager();\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n function computeSizeChange(entry: OverflowItemEntry) {\n const dividerWidth =\n entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId]\n ? getOffsetSize(overflowDividers[entry.groupId].element)\n : 0;\n\n return getOffsetSize(entry.element) + dividerWidth;\n }\n\n const showItem = () => {\n const item = getNextItem(invisibleItemQueue, visibleItemQueue);\n options.onUpdateItemVisibility({ item, visible: true });\n\n if (item.groupId) {\n groupManager.showItem(item.id, item.groupId);\n\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n overflowDividers[item.groupId]?.element.removeAttribute(DATA_OVERFLOWING);\n }\n }\n\n return computeSizeChange(item);\n };\n\n const hideItem = () => {\n const item = getNextItem(visibleItemQueue, invisibleItemQueue);\n const width = computeSizeChange(item);\n options.onUpdateItemVisibility({ item, visible: false });\n\n if (item.groupId) {\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n overflowDividers[item.groupId]?.element.setAttribute(DATA_OVERFLOWING, '');\n }\n\n groupManager.hideItem(item.id, item.groupId);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility: groupManager.groupVisibility() });\n };\n\n const processOverflowItems = (): boolean => {\n if (!container) {\n return false;\n }\n const totalDividersWidth = Object.values(overflowDividers)\n .map(dvdr => (dvdr.groupId ? getOffsetSize(dvdr.element) : 0))\n .reduce((prev, current) => prev + current, 0);\n\n const availableSize =\n getOffsetSize(container) -\n options.padding -\n totalDividersWidth -\n (overflowMenu ? getOffsetSize(overflowMenu) : 0);\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n let currentWidth = visibleItemQueue\n .all()\n .map(id => overflowItems[id].element)\n .map(getOffsetSize)\n .reduce((prev, current) => prev + current, 0);\n\n // Add items until available width is filled - can result in overflow\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += showItem();\n }\n\n // Remove items until there's no more overflow\n while (currentWidth > availableSize && visibleItemQueue.size() > options.minimumVisible) {\n currentWidth -= hideItem();\n }\n\n // only update when the state of visible/invisible items has changed\n return visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop;\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach(item => visibleItemQueue.enqueue(item.id));\n\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n observing = false;\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n if (overflowItems[item.id]) {\n return;\n }\n\n overflowItems[item.id] = item;\n\n // some options can affect priority which are only set on `observe`\n if (observing) {\n // Updates to elements might not change the queue tops\n // i.e. new element is enqueued but the top of the queue stays the same\n // force a dispatch on the next batched update\n forceDispatch = true;\n visibleItemQueue.enqueue(item.id);\n }\n\n if (item.groupId) {\n groupManager.addItem(item.id, item.groupId);\n item.element.setAttribute(DATA_OVERFLOW_GROUP, item.groupId);\n }\n\n update();\n };\n\n const addOverflowMenu: OverflowManager['addOverflowMenu'] = el => {\n overflowMenu = el;\n };\n\n const addDivider: OverflowManager['addDivider'] = divider => {\n if (!divider.groupId || overflowDividers[divider.groupId]) {\n return;\n }\n\n divider.element.setAttribute(DATA_OVERFLOW_GROUP, divider.groupId);\n overflowDividers[divider.groupId] = divider;\n };\n\n const removeOverflowMenu: OverflowManager['removeOverflowMenu'] = () => {\n overflowMenu = undefined;\n };\n\n const removeDivider: OverflowManager['removeDivider'] = groupId => {\n if (!overflowDividers[groupId]) {\n return;\n }\n const divider = overflowDividers[groupId];\n if (divider.groupId) {\n delete overflowDividers[groupId];\n divider.element.removeAttribute(DATA_OVERFLOW_GROUP);\n }\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n if (!overflowItems[itemId]) {\n return;\n }\n\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n groupManager.removeItem(item.id, item.groupId);\n item.element.removeAttribute(DATA_OVERFLOW_GROUP);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n addOverflowMenu,\n removeOverflowMenu,\n addDivider,\n removeDivider,\n };\n}\n"],"names":["groups","groupId","DATA_OVERFLOWING","DATA_OVERFLOW_GROUP","debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowDividers","resizeObserver","ResizeObserver","entries","update","getNextItem","queueToDequeue","queueToEnqueue","nextItem","dequeue","enqueue","createGroupManager","groupVisibility","updateGroupVisibility","group","invisibleItemIds","size","visibleItemIds","isGroupVisible","isSingleItemVisible","itemId","has","addItem","Set","add","removeItem","delete","showItem","hideItem","groupManager","invisibleItemQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","offsetWidth","offsetHeight","computeSizeChange","entry","dividerWidth","id","item","visible","removeAttribute","width","setAttribute","dispatchOverflowUpdate","all","visibleItems","map","invisibleItems","processOverflowItems","totalDividersWidth","Object","values","dvdr","reduce","prev","current","availableSize","visibleTop","peek","invisibleTop","currentWidth","forceUpdate","observe","observedContainer","userOptions","assign","forEach","disconnect","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"mappings":"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"}
|