@fluentui/priority-overflow 9.1.2 → 9.1.4

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.json CHANGED
@@ -2,7 +2,37 @@
2
2
  "name": "@fluentui/priority-overflow",
3
3
  "entries": [
4
4
  {
5
- "date": "Tue, 25 Jul 2023 13:26:18 GMT",
5
+ "date": "Fri, 11 Aug 2023 12:10:19 GMT",
6
+ "tag": "@fluentui/priority-overflow_v9.1.4",
7
+ "version": "9.1.4",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "vkozlova@microsoft.com",
12
+ "package": "@fluentui/priority-overflow",
13
+ "commit": "b52b54415c4d663885710fc113166be24d810742",
14
+ "comment": "fix: flickering in Overflow"
15
+ }
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "date": "Wed, 09 Aug 2023 13:16:48 GMT",
21
+ "tag": "@fluentui/priority-overflow_v9.1.3",
22
+ "version": "9.1.3",
23
+ "comments": {
24
+ "patch": [
25
+ {
26
+ "author": "vkozlova@microsoft.com",
27
+ "package": "@fluentui/priority-overflow",
28
+ "commit": "6247214bde5df11e951247f0a6d1278cc98490ea",
29
+ "comment": "fix: inaccurate calculation of size"
30
+ }
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "date": "Tue, 25 Jul 2023 13:29:15 GMT",
6
36
  "tag": "@fluentui/priority-overflow_v9.1.2",
7
37
  "version": "9.1.2",
8
38
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,30 @@
1
1
  # Change Log - @fluentui/priority-overflow
2
2
 
3
- This log was last generated on Tue, 25 Jul 2023 13:26:18 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 11 Aug 2023 12:10:19 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## [9.1.4](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.1.4)
8
+
9
+ Fri, 11 Aug 2023 12:10:19 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.1.3..@fluentui/priority-overflow_v9.1.4)
11
+
12
+ ### Patches
13
+
14
+ - fix: flickering in Overflow ([PR #28767](https://github.com/microsoft/fluentui/pull/28767) by vkozlova@microsoft.com)
15
+
16
+ ## [9.1.3](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.1.3)
17
+
18
+ Wed, 09 Aug 2023 13:16:48 GMT
19
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.1.2..@fluentui/priority-overflow_v9.1.3)
20
+
21
+ ### Patches
22
+
23
+ - fix: inaccurate calculation of size ([PR #28728](https://github.com/microsoft/fluentui/pull/28728) by vkozlova@microsoft.com)
24
+
7
25
  ## [9.1.2](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.1.2)
8
26
 
9
- Tue, 25 Jul 2023 13:26:18 GMT
27
+ Tue, 25 Jul 2023 13:29:15 GMT
10
28
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.1.1..@fluentui/priority-overflow_v9.1.2)
11
29
 
12
30
  ### Patches
@@ -1,4 +1,3 @@
1
- var _groups, _groupId;
2
1
  import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';
3
2
  import { debounce } from './debounce';
4
3
  import { createPriorityQueue } from './priorityQueue';
@@ -59,6 +58,7 @@ import { createPriorityQueue } from './priorityQueue';
59
58
  return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;
60
59
  },
61
60
  addItem (itemId, groupId) {
61
+ var _groups, _groupId;
62
62
  var _;
63
63
  (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {
64
64
  visibleItemIds: new Set(),
@@ -85,43 +85,34 @@ import { createPriorityQueue } from './priorityQueue';
85
85
  };
86
86
  };
87
87
  const groupManager = createGroupManager();
88
- const invisibleItemQueue = createPriorityQueue((a, b)=>{
89
- const itemA = overflowItems[a];
90
- const itemB = overflowItems[b];
91
- // Higher priority at the top of the queue
92
- const priority = itemB.priority - itemA.priority;
93
- if (priority !== 0) {
94
- return priority;
88
+ function compareItems(lt, rt) {
89
+ if (!lt || !rt) {
90
+ return 0;
95
91
  }
96
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
97
- // equal priority, use DOM order
98
- // eslint-disable-next-line no-bitwise
99
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
100
- });
101
- const visibleItemQueue = createPriorityQueue((a, b)=>{
102
- const itemA = overflowItems[a];
103
- const itemB = overflowItems[b];
104
- // Lower priority at the top of the queue
105
- const priority = itemA.priority - itemB.priority;
106
- if (priority !== 0) {
107
- return priority;
92
+ const lte = overflowItems[lt];
93
+ const rte = overflowItems[rt];
94
+ if (lte.priority !== rte.priority) {
95
+ return lte.priority > rte.priority ? 1 : -1;
108
96
  }
109
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
110
- // equal priority, use DOM order
97
+ const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
111
98
  // eslint-disable-next-line no-bitwise
112
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
113
- });
114
- const getOffsetSize = (el)=>{
115
- if (sizeCache.has(el)) {
116
- return sizeCache.get(el);
99
+ return lte.element.compareDocumentPosition(rte.element) & positionStatusBit ? 1 : -1;
100
+ }
101
+ function getElementAxisSize(horizontal, vertical, el) {
102
+ if (!sizeCache.has(el)) {
103
+ sizeCache.set(el, options.overflowAxis === 'horizontal' ? el[horizontal] : el[vertical]);
117
104
  }
118
- const offsetSize = options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
119
- sizeCache.set(el, offsetSize);
120
- return offsetSize;
121
- };
122
- function computeSizeChange(entry) {
123
- const dividerWidth = entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId] ? getOffsetSize(overflowDividers[entry.groupId].element) : 0;
124
- return getOffsetSize(entry.element) + dividerWidth;
105
+ return sizeCache.get(el);
106
+ }
107
+ const getOffsetSize = getElementAxisSize.bind(null, 'offsetWidth', 'offsetHeight');
108
+ const getClientSize = getElementAxisSize.bind(null, 'clientWidth', 'clientHeight');
109
+ const invisibleItemQueue = createPriorityQueue((a, b)=>-1 * compareItems(a, b));
110
+ const visibleItemQueue = createPriorityQueue(compareItems);
111
+ function occupiedSize() {
112
+ const totalItemSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
113
+ const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce((acc, [id, state])=>acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0), 0);
114
+ const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
115
+ return totalItemSize + totalDividerSize + overflowMenuSize;
125
116
  }
126
117
  const showItem = ()=>{
127
118
  const item = getNextItem(invisibleItemQueue, visibleItemQueue);
@@ -136,11 +127,9 @@ import { createPriorityQueue } from './priorityQueue';
136
127
  (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(DATA_OVERFLOWING);
137
128
  }
138
129
  }
139
- return computeSizeChange(item);
140
130
  };
141
131
  const hideItem = ()=>{
142
132
  const item = getNextItem(visibleItemQueue, invisibleItemQueue);
143
- const width = computeSizeChange(item);
144
133
  options.onUpdateItemVisibility({
145
134
  item,
146
135
  visible: false
@@ -152,7 +141,6 @@ import { createPriorityQueue } from './priorityQueue';
152
141
  }
153
142
  groupManager.hideItem(item.id, item.groupId);
154
143
  }
155
- return width;
156
144
  };
157
145
  const dispatchOverflowUpdate = ()=>{
158
146
  const visibleItemIds = visibleItemQueue.all();
@@ -170,25 +158,24 @@ import { createPriorityQueue } from './priorityQueue';
170
158
  return false;
171
159
  }
172
160
  sizeCache.clear();
173
- const totalDividersWidth = Object.values(overflowDividers).map((dvdr)=>dvdr.groupId ? getOffsetSize(dvdr.element) : 0).reduce((prev, current)=>prev + current, 0);
174
- function overflowMenuSize() {
175
- return invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
176
- }
177
- const availableSize = getOffsetSize(container) - totalDividersWidth - options.padding;
161
+ const availableSize = getClientSize(container) - options.padding;
178
162
  // Snapshot of the visible/invisible state to compare for updates
179
163
  const visibleTop = visibleItemQueue.peek();
180
164
  const invisibleTop = invisibleItemQueue.peek();
181
- let currentSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
165
+ while(compareItems(invisibleItemQueue.peek(), visibleItemQueue.peek()) > 0){
166
+ hideItem(); // hide elements whose priority become smaller than the highest priority of the hidden one
167
+ }
182
168
  // Run the show/hide step twice - the first step might not be correct if
183
169
  // it was triggered by a new item being added - new items are always visible by default.
184
170
  for(let i = 0; i < 2; i++){
185
171
  // Add items until available width is filled - can result in overflow
186
- while(currentSize + overflowMenuSize() < availableSize && invisibleItemQueue.size() > 0){
187
- currentSize += showItem();
172
+ while(occupiedSize() < availableSize && invisibleItemQueue.size() > 0 || invisibleItemQueue.size() === 1 // attempt to show the last invisible item hoping it's size does not exceed overflow menu size
173
+ ){
174
+ showItem();
188
175
  }
189
176
  // Remove items until there's no more overflow
190
- while(currentSize + overflowMenuSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){
191
- currentSize -= hideItem();
177
+ while(occupiedSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){
178
+ hideItem();
192
179
  }
193
180
  }
194
181
  // only update when the state of visible/invisible items has changed
@@ -1 +1 @@
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 // calls to `offsetWidth or offsetHeight` can happen multiple times in an update\n // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes\n const sizeCache = new Map<HTMLElement, number>();\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 if (sizeCache.has(el)) {\n return sizeCache.get(el)!;\n }\n\n const offsetSize = options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n sizeCache.set(el, offsetSize);\n return offsetSize;\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 sizeCache.clear();\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 function overflowMenuSize() {\n return invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;\n }\n\n const availableSize = getOffsetSize(container) - totalDividersWidth - options.padding;\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 currentSize = visibleItemQueue\n .all()\n .map(id => overflowItems[id].element)\n .map(getOffsetSize)\n .reduce((prev, current) => prev + current, 0);\n\n // Run the show/hide step twice - the first step might not be correct if\n // it was triggered by a new item being added - new items are always visible by default.\n for (let i = 0; i < 2; i++) {\n // Add items until available width is filled - can result in overflow\n while (currentSize + overflowMenuSize() < availableSize && invisibleItemQueue.size() > 0) {\n currentSize += showItem();\n }\n\n // Remove items until there's no more overflow\n while (currentSize + overflowMenuSize() > availableSize && visibleItemQueue.size() > options.minimumVisible) {\n currentSize -= hideItem();\n }\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 sizeCache.clear();\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 sizeCache.delete(item.element);\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","sizeCache","Map","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","get","offsetSize","offsetWidth","offsetHeight","set","computeSizeChange","entry","dividerWidth","id","item","visible","removeAttribute","width","setAttribute","dispatchOverflowUpdate","all","visibleItems","map","invisibleItems","processOverflowItems","clear","totalDividersWidth","Object","values","dvdr","reduce","prev","current","overflowMenuSize","availableSize","visibleTop","peek","invisibleTop","currentSize","i","forceUpdate","observe","observedContainer","userOptions","assign","forEach","disconnect","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"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 // calls to `offsetWidth or offsetHeight` can happen multiple times in an update\n // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes\n const sizeCache = new Map<HTMLElement, number>();\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 function compareItems(lt: string | null, rt: string | null): number {\n if (!lt || !rt) {\n return 0;\n }\n\n const lte = overflowItems[lt];\n const rte = overflowItems[rt];\n\n if (lte.priority !== rte.priority) {\n return lte.priority > rte.priority ? 1 : -1;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // eslint-disable-next-line no-bitwise\n return lte.element.compareDocumentPosition(rte.element) & positionStatusBit ? 1 : -1;\n }\n\n function getElementAxisSize(\n horizontal: 'clientWidth' | 'offsetWidth',\n vertical: 'clientHeight' | 'offsetHeight',\n el: HTMLElement,\n ): number {\n if (!sizeCache.has(el)) {\n sizeCache.set(el, options.overflowAxis === 'horizontal' ? el[horizontal] : el[vertical]);\n }\n\n return sizeCache.get(el)!;\n }\n\n const getOffsetSize = getElementAxisSize.bind(null, 'offsetWidth', 'offsetHeight');\n const getClientSize = getElementAxisSize.bind(null, 'clientWidth', 'clientHeight');\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => -1 * compareItems(a, b));\n\n const visibleItemQueue = createPriorityQueue<string>(compareItems);\n\n function occupiedSize(): number {\n const totalItemSize = visibleItemQueue\n .all()\n .map(id => overflowItems[id].element)\n .map(getOffsetSize)\n .reduce((prev, current) => prev + current, 0);\n\n const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce(\n (acc, [id, state]) =>\n acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0),\n 0,\n );\n\n const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;\n\n return totalItemSize + totalDividerSize + overflowMenuSize;\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\n const hideItem = () => {\n const item = getNextItem(visibleItemQueue, invisibleItemQueue);\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\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 sizeCache.clear();\n\n const availableSize = getClientSize(container) - options.padding;\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n while (compareItems(invisibleItemQueue.peek(), visibleItemQueue.peek()) > 0) {\n hideItem(); // hide elements whose priority become smaller than the highest priority of the hidden one\n }\n\n // Run the show/hide step twice - the first step might not be correct if\n // it was triggered by a new item being added - new items are always visible by default.\n for (let i = 0; i < 2; i++) {\n // Add items until available width is filled - can result in overflow\n while (\n (occupiedSize() < availableSize && invisibleItemQueue.size() > 0) ||\n invisibleItemQueue.size() === 1 // attempt to show the last invisible item hoping it's size does not exceed overflow menu size\n ) {\n showItem();\n }\n\n // Remove items until there's no more overflow\n while (occupiedSize() > availableSize && visibleItemQueue.size() > options.minimumVisible) {\n hideItem();\n }\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 sizeCache.clear();\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 sizeCache.delete(item.element);\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":["DATA_OVERFLOWING","DATA_OVERFLOW_GROUP","debounce","createPriorityQueue","createOverflowManager","sizeCache","Map","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","groups","updateGroupVisibility","groupId","group","invisibleItemIds","size","visibleItemIds","isGroupVisible","isSingleItemVisible","itemId","has","addItem","Set","add","removeItem","delete","showItem","hideItem","groupManager","compareItems","lt","rt","lte","rte","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","all","map","id","reduce","prev","current","totalDividerSize","Object","acc","state","overflowMenuSize","item","visible","removeAttribute","setAttribute","dispatchOverflowUpdate","visibleItems","invisibleItems","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","forceUpdate","observe","observedContainer","userOptions","assign","values","forEach","disconnect","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"mappings":"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"}
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "createOverflowManager", {
9
9
  const _consts = require("./consts");
10
10
  const _debounce = require("./debounce");
11
11
  const _priorityQueue = require("./priorityQueue");
12
- var _groups, _groupId;
13
12
  function createOverflowManager() {
14
13
  // calls to `offsetWidth or offsetHeight` can happen multiple times in an update
15
14
  // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes
@@ -64,6 +63,7 @@ function createOverflowManager() {
64
63
  return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;
65
64
  },
66
65
  addItem (itemId, groupId) {
66
+ var _groups, _groupId;
67
67
  var _;
68
68
  (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {
69
69
  visibleItemIds: new Set(),
@@ -90,43 +90,34 @@ function createOverflowManager() {
90
90
  };
91
91
  };
92
92
  const groupManager = createGroupManager();
93
- const invisibleItemQueue = (0, _priorityQueue.createPriorityQueue)((a, b)=>{
94
- const itemA = overflowItems[a];
95
- const itemB = overflowItems[b];
96
- // Higher priority at the top of the queue
97
- const priority = itemB.priority - itemA.priority;
98
- if (priority !== 0) {
99
- return priority;
93
+ function compareItems(lt, rt) {
94
+ if (!lt || !rt) {
95
+ return 0;
100
96
  }
101
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
102
- // equal priority, use DOM order
103
- // eslint-disable-next-line no-bitwise
104
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
105
- });
106
- const visibleItemQueue = (0, _priorityQueue.createPriorityQueue)((a, b)=>{
107
- const itemA = overflowItems[a];
108
- const itemB = overflowItems[b];
109
- // Lower priority at the top of the queue
110
- const priority = itemA.priority - itemB.priority;
111
- if (priority !== 0) {
112
- return priority;
97
+ const lte = overflowItems[lt];
98
+ const rte = overflowItems[rt];
99
+ if (lte.priority !== rte.priority) {
100
+ return lte.priority > rte.priority ? 1 : -1;
113
101
  }
114
- const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;
115
- // equal priority, use DOM order
102
+ const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;
116
103
  // eslint-disable-next-line no-bitwise
117
- return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;
118
- });
119
- const getOffsetSize = (el)=>{
120
- if (sizeCache.has(el)) {
121
- return sizeCache.get(el);
104
+ return lte.element.compareDocumentPosition(rte.element) & positionStatusBit ? 1 : -1;
105
+ }
106
+ function getElementAxisSize(horizontal, vertical, el) {
107
+ if (!sizeCache.has(el)) {
108
+ sizeCache.set(el, options.overflowAxis === 'horizontal' ? el[horizontal] : el[vertical]);
122
109
  }
123
- const offsetSize = options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;
124
- sizeCache.set(el, offsetSize);
125
- return offsetSize;
126
- };
127
- function computeSizeChange(entry) {
128
- const dividerWidth = entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId] ? getOffsetSize(overflowDividers[entry.groupId].element) : 0;
129
- return getOffsetSize(entry.element) + dividerWidth;
110
+ return sizeCache.get(el);
111
+ }
112
+ const getOffsetSize = getElementAxisSize.bind(null, 'offsetWidth', 'offsetHeight');
113
+ const getClientSize = getElementAxisSize.bind(null, 'clientWidth', 'clientHeight');
114
+ const invisibleItemQueue = (0, _priorityQueue.createPriorityQueue)((a, b)=>-1 * compareItems(a, b));
115
+ const visibleItemQueue = (0, _priorityQueue.createPriorityQueue)(compareItems);
116
+ function occupiedSize() {
117
+ const totalItemSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
118
+ const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce((acc, [id, state])=>acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0), 0);
119
+ const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
120
+ return totalItemSize + totalDividerSize + overflowMenuSize;
130
121
  }
131
122
  const showItem = ()=>{
132
123
  const item = getNextItem(invisibleItemQueue, visibleItemQueue);
@@ -141,11 +132,9 @@ function createOverflowManager() {
141
132
  (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(_consts.DATA_OVERFLOWING);
142
133
  }
143
134
  }
144
- return computeSizeChange(item);
145
135
  };
146
136
  const hideItem = ()=>{
147
137
  const item = getNextItem(visibleItemQueue, invisibleItemQueue);
148
- const width = computeSizeChange(item);
149
138
  options.onUpdateItemVisibility({
150
139
  item,
151
140
  visible: false
@@ -157,7 +146,6 @@ function createOverflowManager() {
157
146
  }
158
147
  groupManager.hideItem(item.id, item.groupId);
159
148
  }
160
- return width;
161
149
  };
162
150
  const dispatchOverflowUpdate = ()=>{
163
151
  const visibleItemIds = visibleItemQueue.all();
@@ -175,25 +163,24 @@ function createOverflowManager() {
175
163
  return false;
176
164
  }
177
165
  sizeCache.clear();
178
- const totalDividersWidth = Object.values(overflowDividers).map((dvdr)=>dvdr.groupId ? getOffsetSize(dvdr.element) : 0).reduce((prev, current)=>prev + current, 0);
179
- function overflowMenuSize() {
180
- return invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;
181
- }
182
- const availableSize = getOffsetSize(container) - totalDividersWidth - options.padding;
166
+ const availableSize = getClientSize(container) - options.padding;
183
167
  // Snapshot of the visible/invisible state to compare for updates
184
168
  const visibleTop = visibleItemQueue.peek();
185
169
  const invisibleTop = invisibleItemQueue.peek();
186
- let currentSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);
170
+ while(compareItems(invisibleItemQueue.peek(), visibleItemQueue.peek()) > 0){
171
+ hideItem(); // hide elements whose priority become smaller than the highest priority of the hidden one
172
+ }
187
173
  // Run the show/hide step twice - the first step might not be correct if
188
174
  // it was triggered by a new item being added - new items are always visible by default.
189
175
  for(let i = 0; i < 2; i++){
190
176
  // Add items until available width is filled - can result in overflow
191
- while(currentSize + overflowMenuSize() < availableSize && invisibleItemQueue.size() > 0){
192
- currentSize += showItem();
177
+ while(occupiedSize() < availableSize && invisibleItemQueue.size() > 0 || invisibleItemQueue.size() === 1 // attempt to show the last invisible item hoping it's size does not exceed overflow menu size
178
+ ){
179
+ showItem();
193
180
  }
194
181
  // Remove items until there's no more overflow
195
- while(currentSize + overflowMenuSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){
196
- currentSize -= hideItem();
182
+ while(occupiedSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){
183
+ hideItem();
197
184
  }
198
185
  }
199
186
  // only update when the state of visible/invisible items has changed
@@ -1 +1 @@
1
- {"version":3,"sources":["overflowManager.js"],"sourcesContent":["var _groups, _groupId;\nimport { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\n/**\n * @internal\n * @returns overflow manager instance\n */ export function createOverflowManager() {\n // calls to `offsetWidth or offsetHeight` can happen multiple times in an update\n // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes\n const sizeCache = new Map();\n let container;\n let overflowMenu;\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 = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: ()=>undefined,\n onUpdateOverflow: ()=>undefined\n };\n const overflowItems = {};\n const overflowDividers = {};\n const resizeObserver = new ResizeObserver((entries)=>{\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n const getNextItem = (queueToDequeue, queueToEnqueue)=>{\n const nextItem = queueToDequeue.dequeue();\n queueToEnqueue.enqueue(nextItem);\n return overflowItems[nextItem];\n };\n const createGroupManager = ()=>{\n const groupVisibility = {};\n const groups = {};\n function updateGroupVisibility(groupId) {\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) {\n return groupVisibility[groupId] === 'visible' || groupVisibility[groupId] === 'overflow';\n }\n return {\n groupVisibility: ()=>groupVisibility,\n isSingleItemVisible (itemId, groupId) {\n return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;\n },\n addItem (itemId, groupId) {\n var _;\n (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {\n visibleItemIds: new Set(),\n invisibleItemIds: new Set()\n };\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n removeItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n },\n showItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n hideItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.add(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n }\n };\n };\n const groupManager = createGroupManager();\n const invisibleItemQueue = createPriorityQueue((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 const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\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 const visibleItemQueue = createPriorityQueue((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 if (priority !== 0) {\n return priority;\n }\n const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\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 const getOffsetSize = (el)=>{\n if (sizeCache.has(el)) {\n return sizeCache.get(el);\n }\n const offsetSize = options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n sizeCache.set(el, offsetSize);\n return offsetSize;\n };\n function computeSizeChange(entry) {\n const dividerWidth = entry.groupId && groupManager.isSingleItemVisible(entry.id, entry.groupId) && overflowDividers[entry.groupId] ? getOffsetSize(overflowDividers[entry.groupId].element) : 0;\n return getOffsetSize(entry.element) + dividerWidth;\n }\n const showItem = ()=>{\n const item = getNextItem(invisibleItemQueue, visibleItemQueue);\n options.onUpdateItemVisibility({\n item,\n visible: true\n });\n if (item.groupId) {\n groupManager.showItem(item.id, item.groupId);\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n var _overflowDividers_item_groupId;\n (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(DATA_OVERFLOWING);\n }\n }\n return computeSizeChange(item);\n };\n const hideItem = ()=>{\n const item = getNextItem(visibleItemQueue, invisibleItemQueue);\n const width = computeSizeChange(item);\n options.onUpdateItemVisibility({\n item,\n visible: false\n });\n if (item.groupId) {\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n var _overflowDividers_item_groupId;\n (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.setAttribute(DATA_OVERFLOWING, '');\n }\n groupManager.hideItem(item.id, item.groupId);\n }\n return width;\n };\n const dispatchOverflowUpdate = ()=>{\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n const visibleItems = visibleItemIds.map((itemId)=>overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map((itemId)=>overflowItems[itemId]);\n options.onUpdateOverflow({\n visibleItems,\n invisibleItems,\n groupVisibility: groupManager.groupVisibility()\n });\n };\n const processOverflowItems = ()=>{\n if (!container) {\n return false;\n }\n sizeCache.clear();\n const totalDividersWidth = Object.values(overflowDividers).map((dvdr)=>dvdr.groupId ? getOffsetSize(dvdr.element) : 0).reduce((prev, current)=>prev + current, 0);\n function overflowMenuSize() {\n return invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;\n }\n const availableSize = getOffsetSize(container) - totalDividersWidth - options.padding;\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n let currentSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);\n // Run the show/hide step twice - the first step might not be correct if\n // it was triggered by a new item being added - new items are always visible by default.\n for(let i = 0; i < 2; i++){\n // Add items until available width is filled - can result in overflow\n while(currentSize + overflowMenuSize() < availableSize && invisibleItemQueue.size() > 0){\n currentSize += showItem();\n }\n // Remove items until there's no more overflow\n while(currentSize + overflowMenuSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){\n currentSize -= 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 const forceUpdate = ()=>{\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n const update = debounce(forceUpdate);\n const observe = (observedContainer, userOptions)=>{\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach((item)=>visibleItemQueue.enqueue(item.id));\n container = observedContainer;\n resizeObserver.observe(container);\n };\n const disconnect = ()=>{\n observing = false;\n sizeCache.clear();\n resizeObserver.disconnect();\n };\n const addItem = (item)=>{\n if (overflowItems[item.id]) {\n return;\n }\n overflowItems[item.id] = item;\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 if (item.groupId) {\n groupManager.addItem(item.id, item.groupId);\n item.element.setAttribute(DATA_OVERFLOW_GROUP, item.groupId);\n }\n update();\n };\n const addOverflowMenu = (el)=>{\n overflowMenu = el;\n };\n const addDivider = (divider)=>{\n if (!divider.groupId || overflowDividers[divider.groupId]) {\n return;\n }\n divider.element.setAttribute(DATA_OVERFLOW_GROUP, divider.groupId);\n overflowDividers[divider.groupId] = divider;\n };\n const removeOverflowMenu = ()=>{\n overflowMenu = undefined;\n };\n const 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 const removeItem = (itemId)=>{\n if (!overflowItems[itemId]) {\n return;\n }\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n if (item.groupId) {\n groupManager.removeItem(item.id, item.groupId);\n item.element.removeAttribute(DATA_OVERFLOW_GROUP);\n }\n sizeCache.delete(item.element);\n delete overflowItems[itemId];\n update();\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":["createOverflowManager","_groups","_groupId","sizeCache","Map","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","groups","updateGroupVisibility","groupId","group","invisibleItemIds","size","visibleItemIds","isGroupVisible","isSingleItemVisible","itemId","has","addItem","_","Set","add","removeItem","delete","showItem","hideItem","groupManager","invisibleItemQueue","createPriorityQueue","a","b","itemA","itemB","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","visibleItemQueue","getOffsetSize","el","get","offsetSize","offsetWidth","offsetHeight","set","computeSizeChange","entry","dividerWidth","id","item","visible","_overflowDividers_item_groupId","removeAttribute","DATA_OVERFLOWING","width","setAttribute","dispatchOverflowUpdate","all","visibleItems","map","invisibleItems","processOverflowItems","clear","totalDividersWidth","Object","values","dvdr","reduce","prev","current","overflowMenuSize","availableSize","visibleTop","peek","invisibleTop","currentSize","i","forceUpdate","debounce","observe","observedContainer","userOptions","assign","forEach","disconnect","DATA_OVERFLOW_GROUP","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"mappings":"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"}
1
+ {"version":3,"sources":["overflowManager.js"],"sourcesContent":["import { DATA_OVERFLOWING, DATA_OVERFLOW_GROUP } from './consts';\nimport { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\n/**\n * @internal\n * @returns overflow manager instance\n */ export function createOverflowManager() {\n // calls to `offsetWidth or offsetHeight` can happen multiple times in an update\n // Use a cache to avoid causing too many recalcs and avoid scripting time to meausure sizes\n const sizeCache = new Map();\n let container;\n let overflowMenu;\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 = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: ()=>undefined,\n onUpdateOverflow: ()=>undefined\n };\n const overflowItems = {};\n const overflowDividers = {};\n const resizeObserver = new ResizeObserver((entries)=>{\n if (!entries[0] || !container) {\n return;\n }\n update();\n });\n const getNextItem = (queueToDequeue, queueToEnqueue)=>{\n const nextItem = queueToDequeue.dequeue();\n queueToEnqueue.enqueue(nextItem);\n return overflowItems[nextItem];\n };\n const createGroupManager = ()=>{\n const groupVisibility = {};\n const groups = {};\n function updateGroupVisibility(groupId) {\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) {\n return groupVisibility[groupId] === 'visible' || groupVisibility[groupId] === 'overflow';\n }\n return {\n groupVisibility: ()=>groupVisibility,\n isSingleItemVisible (itemId, groupId) {\n return isGroupVisible(groupId) && groups[groupId].visibleItemIds.has(itemId) && groups[groupId].visibleItemIds.size === 1;\n },\n addItem (itemId, groupId) {\n var _groups, _groupId;\n var _;\n (_ = (_groups = groups)[_groupId = groupId]) !== null && _ !== void 0 ? _ : _groups[_groupId] = {\n visibleItemIds: new Set(),\n invisibleItemIds: new Set()\n };\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n removeItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n },\n showItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.delete(itemId);\n groups[groupId].visibleItemIds.add(itemId);\n updateGroupVisibility(groupId);\n },\n hideItem (itemId, groupId) {\n groups[groupId].invisibleItemIds.add(itemId);\n groups[groupId].visibleItemIds.delete(itemId);\n updateGroupVisibility(groupId);\n }\n };\n };\n const groupManager = createGroupManager();\n function compareItems(lt, rt) {\n if (!lt || !rt) {\n return 0;\n }\n const lte = overflowItems[lt];\n const rte = overflowItems[rt];\n if (lte.priority !== rte.priority) {\n return lte.priority > rte.priority ? 1 : -1;\n }\n const positionStatusBit = options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n // eslint-disable-next-line no-bitwise\n return lte.element.compareDocumentPosition(rte.element) & positionStatusBit ? 1 : -1;\n }\n function getElementAxisSize(horizontal, vertical, el) {\n if (!sizeCache.has(el)) {\n sizeCache.set(el, options.overflowAxis === 'horizontal' ? el[horizontal] : el[vertical]);\n }\n return sizeCache.get(el);\n }\n const getOffsetSize = getElementAxisSize.bind(null, 'offsetWidth', 'offsetHeight');\n const getClientSize = getElementAxisSize.bind(null, 'clientWidth', 'clientHeight');\n const invisibleItemQueue = createPriorityQueue((a, b)=>-1 * compareItems(a, b));\n const visibleItemQueue = createPriorityQueue(compareItems);\n function occupiedSize() {\n const totalItemSize = visibleItemQueue.all().map((id)=>overflowItems[id].element).map(getOffsetSize).reduce((prev, current)=>prev + current, 0);\n const totalDividerSize = Object.entries(groupManager.groupVisibility()).reduce((acc, [id, state])=>acc + (state !== 'hidden' && overflowDividers[id] ? getOffsetSize(overflowDividers[id].element) : 0), 0);\n const overflowMenuSize = invisibleItemQueue.size() > 0 && overflowMenu ? getOffsetSize(overflowMenu) : 0;\n return totalItemSize + totalDividerSize + overflowMenuSize;\n }\n const showItem = ()=>{\n const item = getNextItem(invisibleItemQueue, visibleItemQueue);\n options.onUpdateItemVisibility({\n item,\n visible: true\n });\n if (item.groupId) {\n groupManager.showItem(item.id, item.groupId);\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n var _overflowDividers_item_groupId;\n (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.removeAttribute(DATA_OVERFLOWING);\n }\n }\n };\n const hideItem = ()=>{\n const item = getNextItem(visibleItemQueue, invisibleItemQueue);\n options.onUpdateItemVisibility({\n item,\n visible: false\n });\n if (item.groupId) {\n if (groupManager.isSingleItemVisible(item.id, item.groupId)) {\n var _overflowDividers_item_groupId;\n (_overflowDividers_item_groupId = overflowDividers[item.groupId]) === null || _overflowDividers_item_groupId === void 0 ? void 0 : _overflowDividers_item_groupId.element.setAttribute(DATA_OVERFLOWING, '');\n }\n groupManager.hideItem(item.id, item.groupId);\n }\n };\n const dispatchOverflowUpdate = ()=>{\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n const visibleItems = visibleItemIds.map((itemId)=>overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map((itemId)=>overflowItems[itemId]);\n options.onUpdateOverflow({\n visibleItems,\n invisibleItems,\n groupVisibility: groupManager.groupVisibility()\n });\n };\n const processOverflowItems = ()=>{\n if (!container) {\n return false;\n }\n sizeCache.clear();\n const availableSize = getClientSize(container) - options.padding;\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n while(compareItems(invisibleItemQueue.peek(), visibleItemQueue.peek()) > 0){\n hideItem(); // hide elements whose priority become smaller than the highest priority of the hidden one\n }\n // Run the show/hide step twice - the first step might not be correct if\n // it was triggered by a new item being added - new items are always visible by default.\n for(let i = 0; i < 2; i++){\n // Add items until available width is filled - can result in overflow\n while(occupiedSize() < availableSize && invisibleItemQueue.size() > 0 || invisibleItemQueue.size() === 1 // attempt to show the last invisible item hoping it's size does not exceed overflow menu size\n ){\n showItem();\n }\n // Remove items until there's no more overflow\n while(occupiedSize() > availableSize && visibleItemQueue.size() > options.minimumVisible){\n 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 const forceUpdate = ()=>{\n if (processOverflowItems() || forceDispatch) {\n forceDispatch = false;\n dispatchOverflowUpdate();\n }\n };\n const update = debounce(forceUpdate);\n const observe = (observedContainer, userOptions)=>{\n Object.assign(options, userOptions);\n observing = true;\n Object.values(overflowItems).forEach((item)=>visibleItemQueue.enqueue(item.id));\n container = observedContainer;\n resizeObserver.observe(container);\n };\n const disconnect = ()=>{\n observing = false;\n sizeCache.clear();\n resizeObserver.disconnect();\n };\n const addItem = (item)=>{\n if (overflowItems[item.id]) {\n return;\n }\n overflowItems[item.id] = item;\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 if (item.groupId) {\n groupManager.addItem(item.id, item.groupId);\n item.element.setAttribute(DATA_OVERFLOW_GROUP, item.groupId);\n }\n update();\n };\n const addOverflowMenu = (el)=>{\n overflowMenu = el;\n };\n const addDivider = (divider)=>{\n if (!divider.groupId || overflowDividers[divider.groupId]) {\n return;\n }\n divider.element.setAttribute(DATA_OVERFLOW_GROUP, divider.groupId);\n overflowDividers[divider.groupId] = divider;\n };\n const removeOverflowMenu = ()=>{\n overflowMenu = undefined;\n };\n const 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 const removeItem = (itemId)=>{\n if (!overflowItems[itemId]) {\n return;\n }\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n if (item.groupId) {\n groupManager.removeItem(item.id, item.groupId);\n item.element.removeAttribute(DATA_OVERFLOW_GROUP);\n }\n sizeCache.delete(item.element);\n delete overflowItems[itemId];\n update();\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":["createOverflowManager","sizeCache","Map","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","groups","updateGroupVisibility","groupId","group","invisibleItemIds","size","visibleItemIds","isGroupVisible","isSingleItemVisible","itemId","has","addItem","_groups","_groupId","_","Set","add","removeItem","delete","showItem","hideItem","groupManager","compareItems","lt","rt","lte","rte","priority","positionStatusBit","Node","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","element","compareDocumentPosition","getElementAxisSize","horizontal","vertical","el","set","get","getOffsetSize","bind","getClientSize","invisibleItemQueue","createPriorityQueue","a","b","visibleItemQueue","occupiedSize","totalItemSize","all","map","id","reduce","prev","current","totalDividerSize","Object","acc","state","overflowMenuSize","item","visible","_overflowDividers_item_groupId","removeAttribute","DATA_OVERFLOWING","setAttribute","dispatchOverflowUpdate","visibleItems","invisibleItems","processOverflowItems","clear","availableSize","visibleTop","peek","invisibleTop","i","forceUpdate","debounce","observe","observedContainer","userOptions","assign","values","forEach","disconnect","DATA_OVERFLOW_GROUP","addOverflowMenu","addDivider","divider","removeOverflowMenu","removeDivider","remove"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/priority-overflow",
3
- "version": "9.1.2",
3
+ "version": "9.1.4",
4
4
  "description": "Vanilla JS utilities to implement overflow menus",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",