@fluentui/priority-overflow 9.0.0 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.json CHANGED
@@ -2,7 +2,22 @@
2
2
  "name": "@fluentui/priority-overflow",
3
3
  "entries": [
4
4
  {
5
- "date": "Wed, 18 Jan 2023 16:30:55 GMT",
5
+ "date": "Tue, 07 Feb 2023 14:10:45 GMT",
6
+ "tag": "@fluentui/priority-overflow_v9.0.1",
7
+ "version": "9.0.1",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "lingfangao@hotmail.com",
12
+ "package": "@fluentui/priority-overflow",
13
+ "commit": "7274228423cc06749b72ab6a8a112db6f18f5378",
14
+ "comment": "fix: New overflow items all always dispatch updates to subscriber"
15
+ }
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "date": "Wed, 18 Jan 2023 16:32:53 GMT",
6
21
  "tag": "@fluentui/priority-overflow_v9.0.0",
7
22
  "version": "9.0.0",
8
23
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,21 @@
1
1
  # Change Log - @fluentui/priority-overflow
2
2
 
3
- This log was last generated on Wed, 18 Jan 2023 16:30:55 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 07 Feb 2023 14:10:45 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## [9.0.1](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.0.1)
8
+
9
+ Tue, 07 Feb 2023 14:10:45 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.0.0..@fluentui/priority-overflow_v9.0.1)
11
+
12
+ ### Patches
13
+
14
+ - fix: New overflow items all always dispatch updates to subscriber ([PR #26565](https://github.com/microsoft/fluentui/pull/26565) by lingfangao@hotmail.com)
15
+
7
16
  ## [9.0.0](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.0.0)
8
17
 
9
- Wed, 18 Jan 2023 16:30:55 GMT
18
+ Wed, 18 Jan 2023 16:32:53 GMT
10
19
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.0.0-rc.2..@fluentui/priority-overflow_v9.0.0)
11
20
 
12
21
  ### Patches
@@ -7,7 +7,10 @@ import { createPriorityQueue } from './priorityQueue';
7
7
  export function createOverflowManager() {
8
8
  let container;
9
9
  let overflowMenu;
10
+ // Set as true when resize observer is observing
10
11
  let observing = false;
12
+ // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
13
+ let forceDispatch = false;
11
14
  const options = {
12
15
  padding: 10,
13
16
  overflowAxis: 'horizontal',
@@ -103,10 +106,11 @@ export function createOverflowManager() {
103
106
  groupVisibility
104
107
  });
105
108
  };
106
- const processOverflowItems = availableSize => {
109
+ const processOverflowItems = () => {
107
110
  if (!container) {
108
- return;
111
+ return false;
109
112
  }
113
+ const availableSize = getOffsetSize(container) - options.padding;
110
114
  const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;
111
115
  // Snapshot of the visible/invisible state to compare for updates
112
116
  const visibleTop = visibleItemQueue.peek();
@@ -133,15 +137,15 @@ export function createOverflowManager() {
133
137
  }
134
138
  // only update when the state of visible/invisible items has changed
135
139
  if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {
136
- dispatchOverflowUpdate();
140
+ return true;
137
141
  }
142
+ return false;
138
143
  };
139
144
  const forceUpdate = () => {
140
- if (!container) {
141
- return;
145
+ if (processOverflowItems() || forceDispatch) {
146
+ forceDispatch = false;
147
+ dispatchOverflowUpdate();
142
148
  }
143
- const availableSize = getOffsetSize(container) - options.padding;
144
- processOverflowItems(availableSize);
145
149
  };
146
150
  const update = debounce(forceUpdate);
147
151
  const observe = (observedContainer, userOptions) => {
@@ -162,6 +166,10 @@ export function createOverflowManager() {
162
166
  overflowItems[item.id] = item;
163
167
  // some options can affect priority which are only set on `observe`
164
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;
165
173
  visibleItemQueue.enqueue(item.id);
166
174
  }
167
175
  if (item.groupId) {
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["debounce","createPriorityQueue","createOverflowManager","container","overflowMenu","observing","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"],"sourceRoot":"../src/","sources":["packages/react-components/priority-overflow/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 let observing = 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 = (availableSize: number) => {\n if (!container) {\n return;\n }\n\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 dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\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 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"]}
1
+ {"version":3,"mappings":"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","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"],"sourceRoot":"../src/","sources":["packages/react-components/priority-overflow/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"]}
@@ -9,7 +9,10 @@ define(["require", "exports", "./debounce", "./priorityQueue"], function (requir
9
9
  function createOverflowManager() {
10
10
  var container;
11
11
  var overflowMenu;
12
+ // Set as true when resize observer is observing
12
13
  var observing = false;
14
+ // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
15
+ var forceDispatch = false;
13
16
  var options = {
14
17
  padding: 10,
15
18
  overflowAxis: 'horizontal',
@@ -98,10 +101,11 @@ define(["require", "exports", "./debounce", "./priorityQueue"], function (requir
98
101
  });
99
102
  options.onUpdateOverflow({ visibleItems: visibleItems, invisibleItems: invisibleItems, groupVisibility: groupVisibility });
100
103
  };
101
- var processOverflowItems = function (availableSize) {
104
+ var processOverflowItems = function () {
102
105
  if (!container) {
103
- return;
106
+ return false;
104
107
  }
108
+ var availableSize = getOffsetSize(container) - options.padding;
105
109
  var overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;
106
110
  // Snapshot of the visible/invisible state to compare for updates
107
111
  var visibleTop = visibleItemQueue.peek();
@@ -130,15 +134,15 @@ define(["require", "exports", "./debounce", "./priorityQueue"], function (requir
130
134
  }
131
135
  // only update when the state of visible/invisible items has changed
132
136
  if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {
133
- dispatchOverflowUpdate();
137
+ return true;
134
138
  }
139
+ return false;
135
140
  };
136
141
  var forceUpdate = function () {
137
- if (!container) {
138
- return;
142
+ if (processOverflowItems() || forceDispatch) {
143
+ forceDispatch = false;
144
+ dispatchOverflowUpdate();
139
145
  }
140
- var availableSize = getOffsetSize(container) - options.padding;
141
- processOverflowItems(availableSize);
142
146
  };
143
147
  var update = debounce_1.debounce(forceUpdate);
144
148
  var observe = function (observedContainer, userOptions) {
@@ -159,6 +163,10 @@ define(["require", "exports", "./debounce", "./priorityQueue"], function (requir
159
163
  overflowItems[item.id] = item;
160
164
  // some options can affect priority which are only set on `observe`
161
165
  if (observing) {
166
+ // Updates to elements might not change the queue tops
167
+ // i.e. new element is enqueued but the top of the queue stays the same
168
+ // force a dispatch on the next batched update
169
+ forceDispatch = true;
162
170
  visibleItemQueue.enqueue(item.id);
163
171
  }
164
172
  if (item.groupId) {
@@ -1 +1 @@
1
- {"version":3,"file":"overflowManager.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/overflowManager.ts"],"names":[],"mappings":"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","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 let observing = 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 = (availableSize: number) => {\n if (!container) {\n return;\n }\n\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 dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\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 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"]}
1
+ {"version":3,"file":"overflowManager.js","sourceRoot":"","sources":["../../../../../../../packages/react-components/priority-overflow/src/overflowManager.ts"],"names":[],"mappings":"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","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"]}
@@ -13,7 +13,10 @@ const priorityQueue_1 = /*#__PURE__*/require("./priorityQueue");
13
13
  function createOverflowManager() {
14
14
  let container;
15
15
  let overflowMenu;
16
+ // Set as true when resize observer is observing
16
17
  let observing = false;
18
+ // If true, next update will dispatch to onUpdateOverflow even if queue top states don't change
19
+ let forceDispatch = false;
17
20
  const options = {
18
21
  padding: 10,
19
22
  overflowAxis: 'horizontal',
@@ -109,10 +112,11 @@ function createOverflowManager() {
109
112
  groupVisibility
110
113
  });
111
114
  };
112
- const processOverflowItems = availableSize => {
115
+ const processOverflowItems = () => {
113
116
  if (!container) {
114
- return;
117
+ return false;
115
118
  }
119
+ const availableSize = getOffsetSize(container) - options.padding;
116
120
  const overflowMenuOffset = overflowMenu ? getOffsetSize(overflowMenu) : 0;
117
121
  // Snapshot of the visible/invisible state to compare for updates
118
122
  const visibleTop = visibleItemQueue.peek();
@@ -139,15 +143,15 @@ function createOverflowManager() {
139
143
  }
140
144
  // only update when the state of visible/invisible items has changed
141
145
  if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {
142
- dispatchOverflowUpdate();
146
+ return true;
143
147
  }
148
+ return false;
144
149
  };
145
150
  const forceUpdate = () => {
146
- if (!container) {
147
- return;
151
+ if (processOverflowItems() || forceDispatch) {
152
+ forceDispatch = false;
153
+ dispatchOverflowUpdate();
148
154
  }
149
- const availableSize = getOffsetSize(container) - options.padding;
150
- processOverflowItems(availableSize);
151
155
  };
152
156
  const update = debounce_1.debounce(forceUpdate);
153
157
  const observe = (observedContainer, userOptions) => {
@@ -168,6 +172,10 @@ function createOverflowManager() {
168
172
  overflowItems[item.id] = item;
169
173
  // some options can affect priority which are only set on `observe`
170
174
  if (observing) {
175
+ // Updates to elements might not change the queue tops
176
+ // i.e. new element is enqueued but the top of the queue stays the same
177
+ // force a dispatch on the next batched update
178
+ forceDispatch = true;
171
179
  visibleItemQueue.enqueue(item.id);
172
180
  }
173
181
  if (item.groupId) {
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["createOverflowManager","container","overflowMenu","observing","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","priorityQueue_1","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","debounce_1","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove","exports"],"sourceRoot":"../src/","sources":["packages/react-components/priority-overflow/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 let observing = 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 = (availableSize: number) => {\n if (!container) {\n return;\n }\n\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 dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\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 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"]}
1
+ {"version":3,"mappings":"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","names":["createOverflowManager","container","overflowMenu","observing","forceDispatch","options","padding","overflowAxis","overflowDirection","minimumVisible","onUpdateItemVisibility","undefined","onUpdateOverflow","overflowItems","overflowGroups","resizeObserver","ResizeObserver","entries","update","invisibleItemQueue","priorityQueue_1","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","debounce_1","observe","observedContainer","userOptions","assign","values","disconnect","addItem","Set","addOverflowMenu","removeOverflowMenu","removeItem","remove","exports"],"sourceRoot":"../src/","sources":["packages/react-components/priority-overflow/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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/priority-overflow",
3
- "version": "9.0.0",
3
+ "version": "9.0.1",
4
4
  "description": "Vanilla JS utilities to implement overflow menus",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",