@fluentui/react-tree 9.0.0-beta.25 → 9.0.0-beta.27

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.
Files changed (184) hide show
  1. package/CHANGELOG.json +136 -1
  2. package/CHANGELOG.md +35 -2
  3. package/dist/index.d.ts +261 -83
  4. package/lib/FlatTree.js +1 -0
  5. package/lib/FlatTree.js.map +1 -0
  6. package/lib/components/FlatTree/FlatTree.js +13 -0
  7. package/lib/components/FlatTree/FlatTree.js.map +1 -0
  8. package/lib/components/FlatTree/FlatTree.types.js +1 -0
  9. package/lib/components/FlatTree/FlatTree.types.js.map +1 -0
  10. package/lib/components/FlatTree/index.js +6 -0
  11. package/lib/components/FlatTree/index.js.map +1 -0
  12. package/lib/components/FlatTree/useFlatControllableCheckedItems.js +63 -0
  13. package/lib/components/FlatTree/useFlatControllableCheckedItems.js.map +1 -0
  14. package/lib/components/FlatTree/useFlatTree.js +3 -0
  15. package/lib/components/FlatTree/useFlatTree.js.map +1 -0
  16. package/lib/{hooks → components/FlatTree}/useFlatTreeNavigation.js +12 -12
  17. package/lib/components/FlatTree/useFlatTreeNavigation.js.map +1 -0
  18. package/lib/components/FlatTree/useFlatTreeStyles.styles.js +30 -0
  19. package/lib/components/FlatTree/useFlatTreeStyles.styles.js.map +1 -0
  20. package/lib/{hooks/useFlatTree.js → components/FlatTree/useHeadlessFlatTree.js} +21 -16
  21. package/lib/components/FlatTree/useHeadlessFlatTree.js.map +1 -0
  22. package/lib/components/Tree/Tree.js +4 -9
  23. package/lib/components/Tree/Tree.js.map +1 -1
  24. package/lib/components/Tree/Tree.types.js.map +1 -1
  25. package/lib/components/Tree/index.js +2 -2
  26. package/lib/components/Tree/index.js.map +1 -1
  27. package/lib/components/Tree/renderTree.js.map +1 -1
  28. package/lib/components/Tree/useControllableCheckedItems.js +94 -0
  29. package/lib/components/Tree/useControllableCheckedItems.js.map +1 -0
  30. package/lib/components/Tree/useTree.js +38 -14
  31. package/lib/components/Tree/useTree.js.map +1 -1
  32. package/lib/components/Tree/useTreeContextValues.js +4 -2
  33. package/lib/components/Tree/useTreeContextValues.js.map +1 -1
  34. package/lib/{hooks/useNestedTreeNavigation.js → components/Tree/useTreeNavigation.js} +6 -6
  35. package/lib/components/Tree/useTreeNavigation.js.map +1 -0
  36. package/lib/components/Tree/useTreeStyles.styles.js +2 -2
  37. package/lib/components/Tree/useTreeStyles.styles.js.map +1 -1
  38. package/lib/components/TreeItem/TreeItem.types.js.map +1 -1
  39. package/lib/components/TreeItem/renderTreeItem.js +2 -4
  40. package/lib/components/TreeItem/renderTreeItem.js.map +1 -1
  41. package/lib/components/TreeItem/useTreeItem.js +49 -51
  42. package/lib/components/TreeItem/useTreeItem.js.map +1 -1
  43. package/lib/components/TreeItem/useTreeItemContextValues.js +8 -14
  44. package/lib/components/TreeItem/useTreeItemContextValues.js.map +1 -1
  45. package/lib/components/TreeItemLayout/TreeItemLayout.types.js.map +1 -1
  46. package/lib/components/TreeItemLayout/renderTreeItemLayout.js +1 -1
  47. package/lib/components/TreeItemLayout/renderTreeItemLayout.js.map +1 -1
  48. package/lib/components/TreeItemLayout/useTreeItemLayout.js +55 -8
  49. package/lib/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
  50. package/lib/components/TreeItemLayout/useTreeItemLayoutStyles.styles.js +15 -8
  51. package/lib/components/TreeItemLayout/useTreeItemLayoutStyles.styles.js.map +1 -1
  52. package/lib/components/TreeItemPersonaLayout/TreeItemPersonaLayout.types.js.map +1 -1
  53. package/lib/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js +1 -1
  54. package/lib/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js.map +1 -1
  55. package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js +6 -1
  56. package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js.map +1 -1
  57. package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutStyles.styles.js +5 -1
  58. package/lib/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutStyles.styles.js.map +1 -1
  59. package/lib/contexts/index.js +0 -1
  60. package/lib/contexts/index.js.map +1 -1
  61. package/lib/contexts/treeContext.js +3 -0
  62. package/lib/contexts/treeContext.js.map +1 -1
  63. package/lib/contexts/treeItemContext.js +5 -0
  64. package/lib/contexts/treeItemContext.js.map +1 -1
  65. package/lib/hooks/useControllableOpenItems.js +6 -3
  66. package/lib/hooks/useControllableOpenItems.js.map +1 -1
  67. package/lib/{components/Tree → hooks}/useRootTree.js +34 -25
  68. package/lib/hooks/useRootTree.js.map +1 -0
  69. package/lib/{components/Tree → hooks}/useSubtree.js +8 -4
  70. package/lib/hooks/useSubtree.js.map +1 -0
  71. package/lib/index.js +2 -2
  72. package/lib/index.js.map +1 -1
  73. package/lib/utils/ImmutableMap.js +41 -0
  74. package/lib/utils/ImmutableMap.js.map +1 -0
  75. package/lib/utils/ImmutableSet.js +7 -2
  76. package/lib/utils/ImmutableSet.js.map +1 -1
  77. package/lib/utils/createCheckedItems.js +18 -0
  78. package/lib/utils/createCheckedItems.js.map +1 -0
  79. package/lib/utils/createHeadlessTree.js +165 -0
  80. package/lib/utils/createHeadlessTree.js.map +1 -0
  81. package/lib/utils/createOpenItems.js +10 -0
  82. package/lib/utils/createOpenItems.js.map +1 -0
  83. package/lib/utils/flattenTree.js.map +1 -1
  84. package/lib/utils/tokens.js +2 -1
  85. package/lib/utils/tokens.js.map +1 -1
  86. package/lib-commonjs/FlatTree.js +6 -0
  87. package/lib-commonjs/FlatTree.js.map +1 -0
  88. package/lib-commonjs/components/FlatTree/FlatTree.js +20 -0
  89. package/lib-commonjs/components/FlatTree/FlatTree.js.map +1 -0
  90. package/lib-commonjs/components/FlatTree/FlatTree.types.js +4 -0
  91. package/lib-commonjs/components/FlatTree/FlatTree.types.js.map +1 -0
  92. package/lib-commonjs/components/FlatTree/index.js +21 -0
  93. package/lib-commonjs/components/FlatTree/index.js.map +1 -0
  94. package/lib-commonjs/components/FlatTree/useFlatControllableCheckedItems.js +78 -0
  95. package/lib-commonjs/components/FlatTree/useFlatControllableCheckedItems.js.map +1 -0
  96. package/lib-commonjs/components/FlatTree/useFlatTree.js +12 -0
  97. package/lib-commonjs/components/FlatTree/useFlatTree.js.map +1 -0
  98. package/lib-commonjs/{hooks → components/FlatTree}/useFlatTreeNavigation.js +12 -12
  99. package/lib-commonjs/components/FlatTree/useFlatTreeNavigation.js.map +1 -0
  100. package/lib-commonjs/components/FlatTree/useFlatTreeStyles.styles.js +53 -0
  101. package/lib-commonjs/components/FlatTree/useFlatTreeStyles.styles.js.map +1 -0
  102. package/lib-commonjs/{hooks/useFlatTree.js → components/FlatTree/useHeadlessFlatTree.js} +23 -18
  103. package/lib-commonjs/components/FlatTree/useHeadlessFlatTree.js.map +1 -0
  104. package/lib-commonjs/components/Tree/Tree.js +3 -3
  105. package/lib-commonjs/components/Tree/Tree.js.map +1 -1
  106. package/lib-commonjs/components/Tree/index.js +2 -2
  107. package/lib-commonjs/components/Tree/index.js.map +1 -1
  108. package/lib-commonjs/components/Tree/useControllableCheckedItems.js +103 -0
  109. package/lib-commonjs/components/Tree/useControllableCheckedItems.js.map +1 -0
  110. package/lib-commonjs/components/Tree/useTree.js +38 -6
  111. package/lib-commonjs/components/Tree/useTree.js.map +1 -1
  112. package/lib-commonjs/components/Tree/useTreeContextValues.js +4 -2
  113. package/lib-commonjs/components/Tree/useTreeContextValues.js.map +1 -1
  114. package/lib-commonjs/{hooks/useNestedTreeNavigation.js → components/Tree/useTreeNavigation.js} +8 -8
  115. package/lib-commonjs/components/Tree/useTreeNavigation.js.map +1 -0
  116. package/lib-commonjs/components/Tree/useTreeStyles.styles.js +2 -2
  117. package/lib-commonjs/components/Tree/useTreeStyles.styles.js.map +1 -1
  118. package/lib-commonjs/components/TreeItem/renderTreeItem.js +1 -3
  119. package/lib-commonjs/components/TreeItem/renderTreeItem.js.map +1 -1
  120. package/lib-commonjs/components/TreeItem/useTreeItem.js +48 -50
  121. package/lib-commonjs/components/TreeItem/useTreeItem.js.map +1 -1
  122. package/lib-commonjs/components/TreeItem/useTreeItemContextValues.js +8 -15
  123. package/lib-commonjs/components/TreeItem/useTreeItemContextValues.js.map +1 -1
  124. package/lib-commonjs/components/TreeItemLayout/renderTreeItemLayout.js +1 -1
  125. package/lib-commonjs/components/TreeItemLayout/renderTreeItemLayout.js.map +1 -1
  126. package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js +55 -8
  127. package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
  128. package/lib-commonjs/components/TreeItemLayout/useTreeItemLayoutStyles.styles.js +12 -8
  129. package/lib-commonjs/components/TreeItemLayout/useTreeItemLayoutStyles.styles.js.map +1 -1
  130. package/lib-commonjs/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js +1 -1
  131. package/lib-commonjs/components/TreeItemPersonaLayout/renderTreeItemPersonaLayout.js.map +1 -1
  132. package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js +6 -1
  133. package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayout.js.map +1 -1
  134. package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutStyles.styles.js +5 -1
  135. package/lib-commonjs/components/TreeItemPersonaLayout/useTreeItemPersonaLayoutStyles.styles.js.map +1 -1
  136. package/lib-commonjs/contexts/index.js +0 -1
  137. package/lib-commonjs/contexts/index.js.map +1 -1
  138. package/lib-commonjs/contexts/treeContext.js +3 -0
  139. package/lib-commonjs/contexts/treeContext.js.map +1 -1
  140. package/lib-commonjs/contexts/treeItemContext.js +5 -0
  141. package/lib-commonjs/contexts/treeItemContext.js.map +1 -1
  142. package/lib-commonjs/hooks/useControllableOpenItems.js +3 -2
  143. package/lib-commonjs/hooks/useControllableOpenItems.js.map +1 -1
  144. package/lib-commonjs/{components/Tree → hooks}/useRootTree.js +31 -22
  145. package/lib-commonjs/hooks/useRootTree.js.map +1 -0
  146. package/lib-commonjs/{components/Tree → hooks}/useSubtree.js +12 -8
  147. package/lib-commonjs/hooks/useSubtree.js.map +1 -0
  148. package/lib-commonjs/index.js +10 -4
  149. package/lib-commonjs/index.js.map +1 -1
  150. package/lib-commonjs/utils/ImmutableMap.js +49 -0
  151. package/lib-commonjs/utils/ImmutableMap.js.map +1 -0
  152. package/lib-commonjs/utils/ImmutableSet.js +7 -2
  153. package/lib-commonjs/utils/ImmutableSet.js.map +1 -1
  154. package/lib-commonjs/utils/createCheckedItems.js +26 -0
  155. package/lib-commonjs/utils/createCheckedItems.js.map +1 -0
  156. package/lib-commonjs/utils/createHeadlessTree.js +179 -0
  157. package/lib-commonjs/utils/createHeadlessTree.js.map +1 -0
  158. package/lib-commonjs/utils/createOpenItems.js +18 -0
  159. package/lib-commonjs/utils/createOpenItems.js.map +1 -0
  160. package/lib-commonjs/utils/tokens.js +2 -1
  161. package/lib-commonjs/utils/tokens.js.map +1 -1
  162. package/package.json +11 -9
  163. package/lib/components/Tree/useRootTree.js.map +0 -1
  164. package/lib/components/Tree/useSubtree.js.map +0 -1
  165. package/lib/contexts/treeItemSlotsContext.js +0 -9
  166. package/lib/contexts/treeItemSlotsContext.js.map +0 -1
  167. package/lib/hooks/index.js +0 -3
  168. package/lib/hooks/index.js.map +0 -1
  169. package/lib/hooks/useFlatTree.js.map +0 -1
  170. package/lib/hooks/useFlatTreeNavigation.js.map +0 -1
  171. package/lib/hooks/useNestedTreeNavigation.js.map +0 -1
  172. package/lib/utils/createFlatTreeItems.js +0 -113
  173. package/lib/utils/createFlatTreeItems.js.map +0 -1
  174. package/lib-commonjs/components/Tree/useRootTree.js.map +0 -1
  175. package/lib-commonjs/components/Tree/useSubtree.js.map +0 -1
  176. package/lib-commonjs/contexts/treeItemSlotsContext.js +0 -25
  177. package/lib-commonjs/contexts/treeItemSlotsContext.js.map +0 -1
  178. package/lib-commonjs/hooks/index.js +0 -8
  179. package/lib-commonjs/hooks/index.js.map +0 -1
  180. package/lib-commonjs/hooks/useFlatTree.js.map +0 -1
  181. package/lib-commonjs/hooks/useFlatTreeNavigation.js.map +0 -1
  182. package/lib-commonjs/hooks/useNestedTreeNavigation.js.map +0 -1
  183. package/lib-commonjs/utils/createFlatTreeItems.js +0 -127
  184. package/lib-commonjs/utils/createFlatTreeItems.js.map +0 -1
@@ -0,0 +1,41 @@
1
+ const emptyImmutableMap = createImmutableMap();
2
+ /**
3
+ * properly creates an ImmutableMap instance from an iterable
4
+ */ function createImmutableMap(iterable) {
5
+ const internalMap = new Map(iterable);
6
+ return dangerouslyCreateImmutableMap(internalMap);
7
+ }
8
+ /**
9
+ * Avoid using *dangerouslyCreateImmutableMap*, since this method will expose internally used set, use createImmutableMap instead,
10
+ * @param internalMap - a set that is used internally to store values.
11
+ */ function dangerouslyCreateImmutableMap(internalMap) {
12
+ return {
13
+ size: internalMap.size,
14
+ set: (key, value)=>{
15
+ const nextSet = new Map(internalMap);
16
+ nextSet.set(key, value);
17
+ return dangerouslyCreateImmutableMap(nextSet);
18
+ },
19
+ get: (key)=>internalMap.get(key),
20
+ clear: ()=>emptyImmutableMap,
21
+ delete (value) {
22
+ const nextSet = new Map(internalMap);
23
+ nextSet.delete(value);
24
+ return dangerouslyCreateImmutableMap(nextSet);
25
+ },
26
+ has: (value)=>internalMap.has(value),
27
+ [Symbol.iterator]: ()=>internalMap[Symbol.iterator](),
28
+ // eslint-disable-next-line @typescript-eslint/naming-convention
29
+ dangerouslyGetInternalMap_unstable: ()=>internalMap
30
+ };
31
+ }
32
+ function isImmutableMap(value) {
33
+ return typeof value === 'object' && value !== null && 'dangerouslyGetInternalMap_unstable' in value;
34
+ }
35
+ export const ImmutableMap = {
36
+ empty: emptyImmutableMap,
37
+ create: createImmutableMap,
38
+ isImmutableMap,
39
+ // eslint-disable-next-line @typescript-eslint/naming-convention
40
+ dangerouslyCreate_unstable: dangerouslyCreateImmutableMap
41
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ImmutableMap.ts"],"sourcesContent":["export interface ImmutableMap<Key, Value> {\n clear(): ImmutableMap<Key, Value>;\n delete(key: Key): ImmutableMap<Key, Value>;\n /**\n * Returns a specified element from the Map object. If the value that is associated to the provided key is an object, then you will get a reference to that object and any change made to that object will effectively modify it inside the Map.\n * @returns Returns the element associated with the specified key. If no element is associated with the specified key, undefined is returned.\n */\n get(key: Key): Value | undefined;\n /**\n * @returns boolean indicating whether an element with the specified key exists or not.\n */\n has(key: Key): boolean;\n /**\n * Adds a new element with a specified key and value to the Map. If an element with the same key already exists, the element will be updated.\n */\n set(key: Key, value: Value): ImmutableMap<Key, Value>;\n /**\n * @returns the number of elements in the Map.\n */\n readonly size: number;\n /** Iterates over entries in the Map. */\n [Symbol.iterator](): IterableIterator<[Key, Value]>;\n /**\n * @internal\n * Exposes the internal map used to store values.\n * This is an internal API and should not be used directly.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dangerouslyGetInternalMap_unstable(): Map<Key, Value>;\n}\n\nconst emptyImmutableMap = createImmutableMap<never, never>();\n\n/**\n * properly creates an ImmutableMap instance from an iterable\n */\nfunction createImmutableMap<Key, Value>(iterable?: Iterable<[Key, Value]>): ImmutableMap<Key, Value> {\n const internalMap = new Map(iterable);\n return dangerouslyCreateImmutableMap(internalMap);\n}\n/**\n * Avoid using *dangerouslyCreateImmutableMap*, since this method will expose internally used set, use createImmutableMap instead,\n * @param internalMap - a set that is used internally to store values.\n */\nfunction dangerouslyCreateImmutableMap<Key, Value>(internalMap: Map<Key, Value>): ImmutableMap<Key, Value> {\n return {\n size: internalMap.size,\n set: (key, value) => {\n const nextSet = new Map(internalMap);\n nextSet.set(key, value);\n return dangerouslyCreateImmutableMap(nextSet);\n },\n get: key => internalMap.get(key),\n clear: () => emptyImmutableMap,\n delete(value) {\n const nextSet = new Map(internalMap);\n nextSet.delete(value);\n return dangerouslyCreateImmutableMap(nextSet);\n },\n has: value => internalMap.has(value),\n [Symbol.iterator]: () => internalMap[Symbol.iterator](),\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dangerouslyGetInternalMap_unstable: () => internalMap,\n };\n}\n\nfunction isImmutableMap<Key, Value>(value: unknown): value is ImmutableMap<Key, Value> {\n return typeof value === 'object' && value !== null && 'dangerouslyGetInternalMap_unstable' in value;\n}\n\nexport const ImmutableMap = {\n empty: emptyImmutableMap,\n create: createImmutableMap,\n isImmutableMap,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dangerouslyCreate_unstable: dangerouslyCreateImmutableMap,\n};\n"],"names":["emptyImmutableMap","createImmutableMap","iterable","internalMap","Map","dangerouslyCreateImmutableMap","size","set","key","value","nextSet","get","clear","delete","has","Symbol","iterator","dangerouslyGetInternalMap_unstable","isImmutableMap","ImmutableMap","empty","create","dangerouslyCreate_unstable"],"mappings":"AA+BA,MAAMA,oBAAoBC;AAE1B;;CAEC,GACD,SAASA,mBAA+BC,QAAiC,EAA4B;IACnG,MAAMC,cAAc,IAAIC,IAAIF;IAC5B,OAAOG,8BAA8BF;AACvC;AACA;;;CAGC,GACD,SAASE,8BAA0CF,WAA4B,EAA4B;IACzG,OAAO;QACLG,MAAMH,YAAYG,IAAI;QACtBC,KAAK,CAACC,KAAKC,QAAU;YACnB,MAAMC,UAAU,IAAIN,IAAID;YACxBO,QAAQH,GAAG,CAACC,KAAKC;YACjB,OAAOJ,8BAA8BK;QACvC;QACAC,KAAKH,CAAAA,MAAOL,YAAYQ,GAAG,CAACH;QAC5BI,OAAO,IAAMZ;QACba,QAAOJ,KAAK,EAAE;YACZ,MAAMC,UAAU,IAAIN,IAAID;YACxBO,QAAQG,MAAM,CAACJ;YACf,OAAOJ,8BAA8BK;QACvC;QACAI,KAAKL,CAAAA,QAASN,YAAYW,GAAG,CAACL;QAC9B,CAACM,OAAOC,QAAQ,CAAC,EAAE,IAAMb,WAAW,CAACY,OAAOC,QAAQ,CAAC;QACrD,gEAAgE;QAChEC,oCAAoC,IAAMd;IAC5C;AACF;AAEA,SAASe,eAA2BT,KAAc,EAAqC;IACrF,OAAO,OAAOA,UAAU,YAAYA,UAAU,IAAI,IAAI,wCAAwCA;AAChG;AAEA,OAAO,MAAMU,eAAe;IAC1BC,OAAOpB;IACPqB,QAAQpB;IACRiB;IACA,gEAAgE;IAChEI,4BAA4BjB;AAC9B,EAAE"}
@@ -25,9 +25,12 @@ const emptyImmutableSet = createImmutableSet();
25
25
  return internalSet[Symbol.iterator]();
26
26
  },
27
27
  // eslint-disable-next-line @typescript-eslint/naming-convention
28
- dangerousGetInternalSet_unstable: ()=>internalSet
28
+ dangerouslyGetInternalSet_unstable: ()=>internalSet
29
29
  };
30
30
  }
31
+ function isImmutableSet(value) {
32
+ return typeof value === 'object' && value !== null && 'dangerouslyGetInternalSet_unstable' in value;
33
+ }
31
34
  /**
32
35
  * properly creates an ImmutableSet instance from an iterable
33
36
  */ function createImmutableSet(iterable) {
@@ -37,5 +40,7 @@ const emptyImmutableSet = createImmutableSet();
37
40
  export const ImmutableSet = {
38
41
  empty: emptyImmutableSet,
39
42
  create: createImmutableSet,
40
- dangerouslyCreate: dangerouslyCreateImmutableSet
43
+ isImmutableSet,
44
+ // eslint-disable-next-line @typescript-eslint/naming-convention
45
+ dangerouslyCreate_unstable: dangerouslyCreateImmutableSet
41
46
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["ImmutableSet.ts"],"sourcesContent":["export interface ImmutableSet<Value> {\n /**\n * The number of (unique) elements in a ImmutableSet.\n */\n readonly size: number;\n /**\n * Creates a new ImmutableSet containing all previous element plus the one provided as argument\n * @param value - new value to be included in the new ImmutableSet instance\n */\n add(value: Value): ImmutableSet<Value>;\n /**\n * Returns a reference to ImmutableSet.emptySet\n */\n clear(): ImmutableSet<Value>;\n /**\n * Creates a new ImmutableSet with the original items and removes a specified value from the new ImmutableSet.\n */\n delete(value: Value): ImmutableSet<Value>;\n /**\n * @returns a boolean indicating whether an element with the specified value exists in the ImmutableSet or not.\n */\n has(value: Value): boolean;\n /** Iterates over values in the ImmutableSet. */\n [Symbol.iterator](): IterableIterator<Value>;\n /**\n * @internal\n * Exposes the internal set used to store values.\n * This is an internal API and should not be used directly.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dangerousGetInternalSet_unstable(): Set<Value>;\n}\n\nconst emptyImmutableSet = createImmutableSet<never>();\n\n/**\n * Avoid using *dangerouslyCreateImmutableSet*, since this method will expose internally used set, use createImmutableSet instead,\n * @param internalSet - a set that is used internally to store values.\n */\nfunction dangerouslyCreateImmutableSet<Value>(internalSet: Set<Value>): ImmutableSet<Value> {\n return {\n size: internalSet.size,\n add(value) {\n const nextSet = new Set(internalSet);\n nextSet.add(value);\n return dangerouslyCreateImmutableSet(nextSet);\n },\n clear() {\n return emptyImmutableSet;\n },\n delete(value) {\n const nextSet = new Set(internalSet);\n nextSet.delete(value);\n return dangerouslyCreateImmutableSet(nextSet);\n },\n has(value) {\n return internalSet.has(value);\n },\n [Symbol.iterator]() {\n return internalSet[Symbol.iterator]();\n },\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dangerousGetInternalSet_unstable: () => internalSet,\n };\n}\n\n/**\n * properly creates an ImmutableSet instance from an iterable\n */\nfunction createImmutableSet<Value>(iterable?: Iterable<Value>): ImmutableSet<Value> {\n const internalSet = new Set(iterable);\n return dangerouslyCreateImmutableSet(internalSet);\n}\n\nexport const ImmutableSet = {\n empty: emptyImmutableSet,\n create: createImmutableSet,\n dangerouslyCreate: dangerouslyCreateImmutableSet,\n};\n"],"names":["emptyImmutableSet","createImmutableSet","dangerouslyCreateImmutableSet","internalSet","size","add","value","nextSet","Set","clear","delete","has","Symbol","iterator","dangerousGetInternalSet_unstable","iterable","ImmutableSet","empty","create","dangerouslyCreate"],"mappings":"AAiCA,MAAMA,oBAAoBC;AAE1B;;;CAGC,GACD,SAASC,8BAAqCC,WAAuB,EAAuB;IAC1F,OAAO;QACLC,MAAMD,YAAYC,IAAI;QACtBC,KAAIC,KAAK,EAAE;YACT,MAAMC,UAAU,IAAIC,IAAIL;YACxBI,QAAQF,GAAG,CAACC;YACZ,OAAOJ,8BAA8BK;QACvC;QACAE,SAAQ;YACN,OAAOT;QACT;QACAU,QAAOJ,KAAK,EAAE;YACZ,MAAMC,UAAU,IAAIC,IAAIL;YACxBI,QAAQG,MAAM,CAACJ;YACf,OAAOJ,8BAA8BK;QACvC;QACAI,KAAIL,KAAK,EAAE;YACT,OAAOH,YAAYQ,GAAG,CAACL;QACzB;QACA,CAACM,OAAOC,QAAQ,CAAC,IAAG;YAClB,OAAOV,WAAW,CAACS,OAAOC,QAAQ,CAAC;QACrC;QACA,gEAAgE;QAChEC,kCAAkC,IAAMX;IAC1C;AACF;AAEA;;CAEC,GACD,SAASF,mBAA0Bc,QAA0B,EAAuB;IAClF,MAAMZ,cAAc,IAAIK,IAAIO;IAC5B,OAAOb,8BAA8BC;AACvC;AAEA,OAAO,MAAMa,eAAe;IAC1BC,OAAOjB;IACPkB,QAAQjB;IACRkB,mBAAmBjB;AACrB,EAAE"}
1
+ {"version":3,"sources":["ImmutableSet.ts"],"sourcesContent":["export interface ImmutableSet<Value> {\n /**\n * The number of (unique) elements in a ImmutableSet.\n */\n readonly size: number;\n /**\n * Creates a new ImmutableSet containing all previous element plus the one provided as argument\n * @param value - new value to be included in the new ImmutableSet instance\n */\n add(value: Value): ImmutableSet<Value>;\n /**\n * Returns a reference to ImmutableSet.emptySet\n */\n clear(): ImmutableSet<Value>;\n /**\n * Creates a new ImmutableSet with the original items and removes a specified value from the new ImmutableSet.\n */\n delete(value: Value): ImmutableSet<Value>;\n /**\n * @returns a boolean indicating whether an element with the specified value exists in the ImmutableSet or not.\n */\n has(value: Value): boolean;\n /** Iterates over values in the ImmutableSet. */\n [Symbol.iterator](): IterableIterator<Value>;\n /**\n * @internal\n * Exposes the internal set used to store values.\n * This is an internal API and should not be used directly.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dangerouslyGetInternalSet_unstable(): Set<Value>;\n}\n\nconst emptyImmutableSet = createImmutableSet<never>();\n\n/**\n * Avoid using *dangerouslyCreateImmutableSet*, since this method will expose internally used set, use createImmutableSet instead,\n * @param internalSet - a set that is used internally to store values.\n */\nfunction dangerouslyCreateImmutableSet<Value>(internalSet: Set<Value>): ImmutableSet<Value> {\n return {\n size: internalSet.size,\n add(value) {\n const nextSet = new Set(internalSet);\n nextSet.add(value);\n return dangerouslyCreateImmutableSet(nextSet);\n },\n clear() {\n return emptyImmutableSet;\n },\n delete(value) {\n const nextSet = new Set(internalSet);\n nextSet.delete(value);\n return dangerouslyCreateImmutableSet(nextSet);\n },\n has(value) {\n return internalSet.has(value);\n },\n [Symbol.iterator]() {\n return internalSet[Symbol.iterator]();\n },\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dangerouslyGetInternalSet_unstable: () => internalSet,\n };\n}\n\nfunction isImmutableSet<Value>(value: unknown): value is ImmutableSet<Value> {\n return typeof value === 'object' && value !== null && 'dangerouslyGetInternalSet_unstable' in value;\n}\n\n/**\n * properly creates an ImmutableSet instance from an iterable\n */\nfunction createImmutableSet<Value>(iterable?: Iterable<Value>): ImmutableSet<Value> {\n const internalSet = new Set(iterable);\n return dangerouslyCreateImmutableSet(internalSet);\n}\n\nexport const ImmutableSet = {\n empty: emptyImmutableSet,\n create: createImmutableSet,\n isImmutableSet,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n dangerouslyCreate_unstable: dangerouslyCreateImmutableSet,\n};\n"],"names":["emptyImmutableSet","createImmutableSet","dangerouslyCreateImmutableSet","internalSet","size","add","value","nextSet","Set","clear","delete","has","Symbol","iterator","dangerouslyGetInternalSet_unstable","isImmutableSet","iterable","ImmutableSet","empty","create","dangerouslyCreate_unstable"],"mappings":"AAiCA,MAAMA,oBAAoBC;AAE1B;;;CAGC,GACD,SAASC,8BAAqCC,WAAuB,EAAuB;IAC1F,OAAO;QACLC,MAAMD,YAAYC,IAAI;QACtBC,KAAIC,KAAK,EAAE;YACT,MAAMC,UAAU,IAAIC,IAAIL;YACxBI,QAAQF,GAAG,CAACC;YACZ,OAAOJ,8BAA8BK;QACvC;QACAE,SAAQ;YACN,OAAOT;QACT;QACAU,QAAOJ,KAAK,EAAE;YACZ,MAAMC,UAAU,IAAIC,IAAIL;YACxBI,QAAQG,MAAM,CAACJ;YACf,OAAOJ,8BAA8BK;QACvC;QACAI,KAAIL,KAAK,EAAE;YACT,OAAOH,YAAYQ,GAAG,CAACL;QACzB;QACA,CAACM,OAAOC,QAAQ,CAAC,IAAG;YAClB,OAAOV,WAAW,CAACS,OAAOC,QAAQ,CAAC;QACrC;QACA,gEAAgE;QAChEC,oCAAoC,IAAMX;IAC5C;AACF;AAEA,SAASY,eAAsBT,KAAc,EAAgC;IAC3E,OAAO,OAAOA,UAAU,YAAYA,UAAU,IAAI,IAAI,wCAAwCA;AAChG;AAEA;;CAEC,GACD,SAASL,mBAA0Be,QAA0B,EAAuB;IAClF,MAAMb,cAAc,IAAIK,IAAIQ;IAC5B,OAAOd,8BAA8BC;AACvC;AAEA,OAAO,MAAMc,eAAe;IAC1BC,OAAOlB;IACPmB,QAAQlB;IACRc;IACA,gEAAgE;IAChEK,4BAA4BlB;AAC9B,EAAE"}
@@ -0,0 +1,18 @@
1
+ import { ImmutableMap } from './ImmutableMap';
2
+ export function createCheckedItems(iterable) {
3
+ if (iterable === undefined) {
4
+ return ImmutableMap.empty;
5
+ }
6
+ if (ImmutableMap.isImmutableMap(iterable)) {
7
+ return iterable;
8
+ }
9
+ const internalMap = new Map();
10
+ for (const item of iterable){
11
+ if (Array.isArray(item)) {
12
+ internalMap.set(item[0], item[1]);
13
+ } else {
14
+ internalMap.set(item, true);
15
+ }
16
+ }
17
+ return ImmutableMap.dangerouslyCreate_unstable(internalMap);
18
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["createCheckedItems.ts"],"sourcesContent":["import { ImmutableMap } from './ImmutableMap';\nimport type { TreeSelectionValue } from '../Tree';\nimport type { TreeItemValue } from '../TreeItem';\n\nexport function createCheckedItems(iterable?: Iterable<TreeItemValue | [TreeItemValue, TreeSelectionValue]>) {\n if (iterable === undefined) {\n return ImmutableMap.empty;\n }\n if (ImmutableMap.isImmutableMap<TreeItemValue, TreeSelectionValue>(iterable)) {\n return iterable;\n }\n const internalMap = new Map<TreeItemValue, 'mixed' | boolean>();\n for (const item of iterable) {\n if (Array.isArray(item)) {\n internalMap.set(item[0], item[1]);\n } else {\n internalMap.set(item, true);\n }\n }\n return ImmutableMap.dangerouslyCreate_unstable(internalMap);\n}\n"],"names":["ImmutableMap","createCheckedItems","iterable","undefined","empty","isImmutableMap","internalMap","Map","item","Array","isArray","set","dangerouslyCreate_unstable"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB;AAI9C,OAAO,SAASC,mBAAmBC,QAAwE,EAAE;IAC3G,IAAIA,aAAaC,WAAW;QAC1B,OAAOH,aAAaI,KAAK;IAC3B,CAAC;IACD,IAAIJ,aAAaK,cAAc,CAAoCH,WAAW;QAC5E,OAAOA;IACT,CAAC;IACD,MAAMI,cAAc,IAAIC;IACxB,KAAK,MAAMC,QAAQN,SAAU;QAC3B,IAAIO,MAAMC,OAAO,CAACF,OAAO;YACvBF,YAAYK,GAAG,CAACH,IAAI,CAAC,EAAE,EAAEA,IAAI,CAAC,EAAE;QAClC,OAAO;YACLF,YAAYK,GAAG,CAACH,MAAM,IAAI;QAC5B,CAAC;IACH;IACA,OAAOR,aAAaY,0BAA0B,CAACN;AACjD,CAAC"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * creates a list of virtual tree items
3
+ * and provides a map to access each item by id
4
+ */ export function createHeadlessTree(virtualTreeItemProps) {
5
+ const root = createHeadlessTreeRootItem();
6
+ const itemsPerValue = new Map([
7
+ [
8
+ root.value,
9
+ root
10
+ ]
11
+ ]);
12
+ const items = [];
13
+ for(let index = 0; index < virtualTreeItemProps.length; index++){
14
+ const { parentValue =virtualTreeRootId , ...treeItemProps } = virtualTreeItemProps[index];
15
+ const nextItemProps = virtualTreeItemProps[index + 1];
16
+ const currentParent = itemsPerValue.get(parentValue);
17
+ if (!currentParent) {
18
+ if (process.env.NODE_ENV === 'development') {
19
+ // eslint-disable-next-line no-console
20
+ console.error(`useHeadlessTree: item ${virtualTreeItemProps[index].value} is wrongly positioned, did you properly ordered provided item props? make sure provided items are organized`);
21
+ }
22
+ break;
23
+ }
24
+ var _treeItemProps_itemType;
25
+ const itemType = (_treeItemProps_itemType = treeItemProps.itemType) !== null && _treeItemProps_itemType !== void 0 ? _treeItemProps_itemType : treeItemProps.value === undefined || (nextItemProps === null || nextItemProps === void 0 ? void 0 : nextItemProps.parentValue) !== treeItemProps.value ? 'leaf' : 'branch';
26
+ var _currentParent_level;
27
+ const currentLevel = ((_currentParent_level = currentParent.level) !== null && _currentParent_level !== void 0 ? _currentParent_level : 0) + 1;
28
+ const virtualTreeItem = {
29
+ value: treeItemProps.value,
30
+ getTreeItemProps: ()=>({
31
+ ...treeItemProps,
32
+ 'aria-level': currentLevel,
33
+ 'aria-posinset': currentChildrenSize,
34
+ 'aria-setsize': currentParent.childrenValues.length,
35
+ itemType
36
+ }),
37
+ level: currentLevel,
38
+ parentValue,
39
+ childrenValues: [],
40
+ index: -1
41
+ };
42
+ const currentChildrenSize = currentParent.childrenValues.push(virtualTreeItem.value);
43
+ itemsPerValue.set(virtualTreeItem.value, virtualTreeItem);
44
+ items.push(virtualTreeItem);
45
+ }
46
+ var _itemsPerValue_get_parentValue, _itemsPerValue_get;
47
+ const virtualTreeItems = {
48
+ root,
49
+ size: items.length,
50
+ getByIndex: (index)=>items[index],
51
+ getParent: (key)=>{
52
+ var _itemsPerValue_get1;
53
+ return (_itemsPerValue_get = itemsPerValue.get((_itemsPerValue_get_parentValue = (_itemsPerValue_get1 = itemsPerValue.get(key)) === null || _itemsPerValue_get1 === void 0 ? void 0 : _itemsPerValue_get1.parentValue) !== null && _itemsPerValue_get_parentValue !== void 0 ? _itemsPerValue_get_parentValue : root.value)) !== null && _itemsPerValue_get !== void 0 ? _itemsPerValue_get : root;
54
+ },
55
+ get: (key)=>itemsPerValue.get(key),
56
+ subtree: (key)=>HeadlessTreeSubtreeGenerator(key, virtualTreeItems),
57
+ children: (key)=>HeadlessTreeChildrenGenerator(key, virtualTreeItems),
58
+ ancestors: (key)=>HeadlessTreeAncestorsGenerator(key, virtualTreeItems),
59
+ visibleItems: (openItems)=>HeadlessTreeVisibleItemsGenerator(openItems, virtualTreeItems)
60
+ };
61
+ return virtualTreeItems;
62
+ }
63
+ export const virtualTreeRootId = '__fuiHeadlessTreeRoot';
64
+ function createHeadlessTreeRootItem() {
65
+ return {
66
+ parentValue: undefined,
67
+ value: virtualTreeRootId,
68
+ getTreeItemProps: ()=>{
69
+ if (process.env.NODE_ENV !== 'production') {
70
+ // eslint-disable-next-line no-console
71
+ console.error('useHeadlessTree: internal error, trying to access treeitem props from invalid root element');
72
+ }
73
+ return {
74
+ id: virtualTreeRootId,
75
+ value: virtualTreeRootId,
76
+ 'aria-setsize': -1,
77
+ 'aria-level': -1,
78
+ 'aria-posinset': -1,
79
+ itemType: 'branch'
80
+ };
81
+ },
82
+ childrenValues: [],
83
+ get index () {
84
+ if (process.env.NODE_ENV !== 'production') {
85
+ // eslint-disable-next-line no-console
86
+ console.error('useHeadlessTree: internal error, trying to access treeitem props from invalid root element');
87
+ }
88
+ return -1;
89
+ },
90
+ level: 0
91
+ };
92
+ }
93
+ /**
94
+ * Generator that returns all subtree of a given virtual tree item
95
+ * @param key the key of the item to get the subtree from
96
+ */ // eslint-disable-next-line @typescript-eslint/naming-convention
97
+ function* HeadlessTreeSubtreeGenerator(key, virtualTreeItems) {
98
+ const item = virtualTreeItems.get(key);
99
+ if (!item || item.childrenValues.length === 0) {
100
+ return [];
101
+ }
102
+ let counter = item.childrenValues.length;
103
+ let index = item.index;
104
+ while(counter > 0){
105
+ const children = virtualTreeItems.getByIndex(++index);
106
+ yield children;
107
+ counter += children.childrenValues.length - 1;
108
+ }
109
+ }
110
+ /**
111
+ * Generator that returns all children of a given virtual tree item
112
+ * @param key the key of the item to get the children from
113
+ */ // eslint-disable-next-line @typescript-eslint/naming-convention
114
+ function* HeadlessTreeChildrenGenerator(key, virtualTreeItems) {
115
+ const item = virtualTreeItems.get(key);
116
+ if (!item || item.childrenValues.length === 0) {
117
+ return;
118
+ }
119
+ for (const childValue of item.childrenValues){
120
+ yield virtualTreeItems.get(childValue);
121
+ }
122
+ }
123
+ /**
124
+ * Generator that returns all ancestors of a given virtual tree item
125
+ * @param key the key of the item to get the children from
126
+ */ // eslint-disable-next-line @typescript-eslint/naming-convention
127
+ function* HeadlessTreeAncestorsGenerator(key, virtualTreeItems) {
128
+ let parent = virtualTreeItems.getParent(key);
129
+ while(parent !== virtualTreeItems.root){
130
+ yield parent;
131
+ parent = virtualTreeItems.getParent(parent.value);
132
+ }
133
+ }
134
+ /**
135
+ * Generator that returns all visible items of a given virtual tree
136
+ * @param openItems the open items of the tree
137
+ */ // eslint-disable-next-line @typescript-eslint/naming-convention
138
+ function* HeadlessTreeVisibleItemsGenerator(openItems, virtualTreeItems) {
139
+ for(let index = 0, visibleIndex = 0; index < virtualTreeItems.size; index++){
140
+ const item = virtualTreeItems.getByIndex(index);
141
+ if (isItemVisible(item, openItems, virtualTreeItems)) {
142
+ item.index = visibleIndex++;
143
+ yield item;
144
+ } else {
145
+ // Jump the amount of children the current item has, since those items will also be hidden
146
+ index += item.childrenValues.length;
147
+ }
148
+ }
149
+ }
150
+ function isItemVisible(item, openItems, virtualTreeItems) {
151
+ if (item.level === 1) {
152
+ return true;
153
+ }
154
+ while(item.parentValue && item.parentValue !== virtualTreeItems.root.value){
155
+ if (!openItems.has(item.parentValue)) {
156
+ return false;
157
+ }
158
+ const parent = virtualTreeItems.get(item.parentValue);
159
+ if (!parent) {
160
+ return false;
161
+ }
162
+ item = parent;
163
+ }
164
+ return true;
165
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["createHeadlessTree.ts"],"sourcesContent":["import { TreeItemProps, TreeItemType, TreeItemValue } from '../TreeItem';\nimport { ImmutableSet } from './ImmutableSet';\n\nexport type HeadlessTreeItemProps = Omit<TreeItemProps, 'itemType' | 'value'> & {\n value: TreeItemValue;\n itemType?: TreeItemType;\n parentValue?: TreeItemValue;\n};\n\n/**\n * The item that is returned by `createHeadlessTree`, it represents a wrapper around the properties provided to\n * `createHeadlessTree` but with extra information that might be useful on virtual tree scenarios\n */\nexport type HeadlessTreeItem<Props extends HeadlessTreeItemProps> = {\n index: number;\n level: number;\n childrenValues: TreeItemValue[];\n value: TreeItemValue;\n parentValue: TreeItemValue | undefined;\n getTreeItemProps(): Required<Pick<Props, 'value' | 'aria-setsize' | 'aria-level' | 'aria-posinset' | 'itemType'>> &\n Omit<Props, 'parentValue'>;\n};\n\n/**\n * @internal\n */\nexport type HeadlessTree<Props extends HeadlessTreeItemProps> = {\n size: number;\n root: HeadlessTreeItem<HeadlessTreeItemProps>;\n get(key: TreeItemValue): HeadlessTreeItem<Props> | undefined;\n getParent(key: TreeItemValue): HeadlessTreeItem<Props>;\n getByIndex(index: number): HeadlessTreeItem<Props>;\n subtree(key: TreeItemValue): IterableIterator<HeadlessTreeItem<Props>>;\n children(key: TreeItemValue): IterableIterator<HeadlessTreeItem<Props>>;\n visibleItems(openItems: ImmutableSet<TreeItemValue>): IterableIterator<HeadlessTreeItem<Props>>;\n ancestors(key: TreeItemValue): IterableIterator<HeadlessTreeItem<Props>>;\n};\n\n/**\n * creates a list of virtual tree items\n * and provides a map to access each item by id\n */\nexport function createHeadlessTree<Props extends HeadlessTreeItemProps>(\n virtualTreeItemProps: Props[],\n): HeadlessTree<Props> {\n const root = createHeadlessTreeRootItem();\n const itemsPerValue = new Map<TreeItemValue, HeadlessTreeItem<HeadlessTreeItemProps>>([[root.value, root]]);\n const items: HeadlessTreeItem<HeadlessTreeItemProps>[] = [];\n\n for (let index = 0; index < virtualTreeItemProps.length; index++) {\n const { parentValue = virtualTreeRootId, ...treeItemProps } = virtualTreeItemProps[index];\n\n const nextItemProps: Props | undefined = virtualTreeItemProps[index + 1];\n const currentParent = itemsPerValue.get(parentValue);\n if (!currentParent) {\n if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.error(\n `useHeadlessTree: item ${virtualTreeItemProps[index].value} is wrongly positioned, did you properly ordered provided item props? make sure provided items are organized`,\n );\n }\n break;\n }\n const itemType =\n treeItemProps.itemType ??\n (treeItemProps.value === undefined || nextItemProps?.parentValue !== treeItemProps.value ? 'leaf' : 'branch');\n const currentLevel = (currentParent.level ?? 0) + 1;\n\n const virtualTreeItem: HeadlessTreeItem<HeadlessTreeItemProps> = {\n value: treeItemProps.value,\n getTreeItemProps: () => ({\n ...treeItemProps,\n 'aria-level': currentLevel,\n 'aria-posinset': currentChildrenSize,\n 'aria-setsize': currentParent.childrenValues.length,\n itemType,\n }),\n level: currentLevel,\n parentValue,\n childrenValues: [],\n index: -1,\n };\n const currentChildrenSize = currentParent.childrenValues.push(virtualTreeItem.value);\n itemsPerValue.set(virtualTreeItem.value, virtualTreeItem);\n items.push(virtualTreeItem);\n }\n\n const virtualTreeItems: HeadlessTree<HeadlessTreeItemProps> = {\n root,\n size: items.length,\n getByIndex: index => items[index],\n getParent: key => itemsPerValue.get(itemsPerValue.get(key)?.parentValue ?? root.value) ?? root,\n get: key => itemsPerValue.get(key),\n subtree: key => HeadlessTreeSubtreeGenerator(key, virtualTreeItems),\n children: key => HeadlessTreeChildrenGenerator(key, virtualTreeItems),\n ancestors: key => HeadlessTreeAncestorsGenerator(key, virtualTreeItems),\n visibleItems: openItems => HeadlessTreeVisibleItemsGenerator(openItems, virtualTreeItems),\n };\n\n return virtualTreeItems as HeadlessTree<Props>;\n}\n\nexport const virtualTreeRootId = '__fuiHeadlessTreeRoot';\n\nfunction createHeadlessTreeRootItem(): HeadlessTreeItem<HeadlessTreeItemProps> {\n return {\n parentValue: undefined,\n value: virtualTreeRootId,\n getTreeItemProps: () => {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.error('useHeadlessTree: internal error, trying to access treeitem props from invalid root element');\n }\n return {\n id: virtualTreeRootId,\n value: virtualTreeRootId,\n 'aria-setsize': -1,\n 'aria-level': -1,\n 'aria-posinset': -1,\n itemType: 'branch',\n };\n },\n childrenValues: [],\n get index() {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.error('useHeadlessTree: internal error, trying to access treeitem props from invalid root element');\n }\n return -1;\n },\n level: 0,\n };\n}\n\n/**\n * Generator that returns all subtree of a given virtual tree item\n * @param key the key of the item to get the subtree from\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction* HeadlessTreeSubtreeGenerator<Props extends HeadlessTreeItemProps>(\n key: TreeItemValue,\n virtualTreeItems: HeadlessTree<Props>,\n) {\n const item = virtualTreeItems.get(key);\n if (!item || item.childrenValues.length === 0) {\n return [];\n }\n let counter = item.childrenValues.length;\n let index = item.index;\n while (counter > 0) {\n const children = virtualTreeItems.getByIndex(++index);\n yield children;\n counter += children.childrenValues.length - 1;\n }\n}\n\n/**\n * Generator that returns all children of a given virtual tree item\n * @param key the key of the item to get the children from\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction* HeadlessTreeChildrenGenerator<Props extends HeadlessTreeItemProps>(\n key: TreeItemValue,\n virtualTreeItems: HeadlessTree<Props>,\n) {\n const item = virtualTreeItems.get(key);\n if (!item || item.childrenValues.length === 0) {\n return;\n }\n for (const childValue of item.childrenValues) {\n yield virtualTreeItems.get(childValue)!;\n }\n}\n\n/**\n * Generator that returns all ancestors of a given virtual tree item\n * @param key the key of the item to get the children from\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction* HeadlessTreeAncestorsGenerator<Props extends HeadlessTreeItemProps>(\n key: TreeItemValue,\n virtualTreeItems: HeadlessTree<Props>,\n) {\n let parent = virtualTreeItems.getParent(key);\n while (parent !== virtualTreeItems.root) {\n yield parent;\n parent = virtualTreeItems.getParent(parent.value);\n }\n}\n\n/**\n * Generator that returns all visible items of a given virtual tree\n * @param openItems the open items of the tree\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction* HeadlessTreeVisibleItemsGenerator<Props extends HeadlessTreeItemProps>(\n openItems: ImmutableSet<TreeItemValue>,\n virtualTreeItems: HeadlessTree<Props>,\n) {\n for (let index = 0, visibleIndex = 0; index < virtualTreeItems.size; index++) {\n const item = virtualTreeItems.getByIndex(index) as HeadlessTreeItem<Props>;\n if (isItemVisible(item, openItems, virtualTreeItems)) {\n item.index = visibleIndex++;\n yield item;\n } else {\n // Jump the amount of children the current item has, since those items will also be hidden\n index += item.childrenValues.length;\n }\n }\n}\n\nfunction isItemVisible(\n item: HeadlessTreeItem<HeadlessTreeItemProps>,\n openItems: ImmutableSet<TreeItemValue>,\n virtualTreeItems: HeadlessTree<HeadlessTreeItemProps>,\n) {\n if (item.level === 1) {\n return true;\n }\n while (item.parentValue && item.parentValue !== virtualTreeItems.root.value) {\n if (!openItems.has(item.parentValue)) {\n return false;\n }\n const parent = virtualTreeItems.get(item.parentValue);\n if (!parent) {\n return false;\n }\n item = parent;\n }\n return true;\n}\n"],"names":["createHeadlessTree","virtualTreeItemProps","root","createHeadlessTreeRootItem","itemsPerValue","Map","value","items","index","length","parentValue","virtualTreeRootId","treeItemProps","nextItemProps","currentParent","get","process","env","NODE_ENV","console","error","itemType","undefined","currentLevel","level","virtualTreeItem","getTreeItemProps","currentChildrenSize","childrenValues","push","set","virtualTreeItems","size","getByIndex","getParent","key","subtree","HeadlessTreeSubtreeGenerator","children","HeadlessTreeChildrenGenerator","ancestors","HeadlessTreeAncestorsGenerator","visibleItems","openItems","HeadlessTreeVisibleItemsGenerator","id","item","counter","childValue","parent","visibleIndex","isItemVisible","has"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ImmutableSet } from './ImmutableSet';
2
+ export function createOpenItems(iterable) {
3
+ if (iterable === undefined) {
4
+ return ImmutableSet.empty;
5
+ }
6
+ if (ImmutableSet.isImmutableSet(iterable)) {
7
+ return iterable;
8
+ }
9
+ return ImmutableSet.create(iterable);
10
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["createOpenItems.ts"],"sourcesContent":["import { ImmutableSet } from './ImmutableSet';\nimport type { TreeItemValue } from '../TreeItem';\n\nexport function createOpenItems(iterable?: Iterable<TreeItemValue>) {\n if (iterable === undefined) {\n return ImmutableSet.empty;\n }\n if (ImmutableSet.isImmutableSet<TreeItemValue>(iterable)) {\n return iterable;\n }\n return ImmutableSet.create(iterable);\n}\n"],"names":["ImmutableSet","createOpenItems","iterable","undefined","empty","isImmutableSet","create"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB;AAG9C,OAAO,SAASC,gBAAgBC,QAAkC,EAAE;IAClE,IAAIA,aAAaC,WAAW;QAC1B,OAAOH,aAAaI,KAAK;IAC3B,CAAC;IACD,IAAIJ,aAAaK,cAAc,CAAgBH,WAAW;QACxD,OAAOA;IACT,CAAC;IACD,OAAOF,aAAaM,MAAM,CAACJ;AAC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["flattenTree.ts"],"sourcesContent":["import { FlatTreeItemProps } from '../hooks/useFlatTree';\nimport { TreeItemProps, TreeItemValue } from '../TreeItem';\n\nexport type NestedTreeItem<Props extends TreeItemProps> = Omit<Props, 'subtree' | 'itemType'> & {\n value: TreeItemValue;\n subtree?: NestedTreeItem<Props>[];\n};\n\nexport type FlattenedTreeItem<Props extends TreeItemProps> = FlatTreeItemProps & Props;\n\nfunction flattenTreeRecursive<Props extends TreeItemProps>(\n items: NestedTreeItem<Props>[],\n parent?: FlatTreeItemProps & Props,\n level = 1,\n): FlattenedTreeItem<Props>[] {\n return items.reduce<FlattenedTreeItem<Props>[]>((acc, { subtree, ...item }, index) => {\n const flatTreeItem = {\n 'aria-level': level,\n 'aria-posinset': index + 1,\n 'aria-setsize': items.length,\n parentValue: parent?.value,\n ...item,\n } as FlattenedTreeItem<Props>;\n acc.push(flatTreeItem);\n if (subtree !== undefined) {\n acc.push(...flattenTreeRecursive<Props>(subtree, flatTreeItem, level + 1));\n }\n return acc;\n }, []);\n}\n\n/**\n * Converts a nested structure to a flat one which can be consumed by `useFlatTreeItems`\n * @example\n * ```tsx\n * const defaultItems = flattenTree_unstable([\n * {\n * children: <TreeItemLayout>level 1, item 1</TreeItemLayout>,\n * subtree: [\n * {\n * children: <TreeItemLayout>level 2, item 1</TreeItemLayout>,\n * },\n * {\n * children: <TreeItemLayout>level 2, item 2</TreeItemLayout>,\n * },\n * {\n * children: <TreeItemLayout>level 2, item 3</TreeItemLayout>,\n * },\n * ],\n * },\n * {\n * children: <TreeItemLayout>level 1, item 2</TreeItemLayout>,\n * subtree: [\n * {\n * children: <TreeItemLayout>level 2, item 1</TreeItemLayout>,\n * subtree: [\n * {\n * children: <TreeItemLayout>level 3, item 1</TreeItemLayout>,\n * subtree: [\n * {\n * children: <TreeItemLayout>level 4, item 1</TreeItemLayout>,\n * },\n * ],\n * },\n * ],\n * },\n * ],\n * },\n * ]);\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const flattenTree_unstable = <Props extends TreeItemProps>(\n items: NestedTreeItem<Props>[],\n): FlattenedTreeItem<Props>[] => flattenTreeRecursive(items);\n"],"names":["flattenTreeRecursive","items","parent","level","reduce","acc","subtree","item","index","flatTreeItem","length","parentValue","value","push","undefined","flattenTree_unstable"],"mappings":"AAUA,SAASA,qBACPC,KAA8B,EAC9BC,MAAkC,EAClCC,QAAQ,CAAC,EACmB;IAC5B,OAAOF,MAAMG,MAAM,CAA6B,CAACC,KAAK,EAAEC,QAAO,EAAE,GAAGC,MAAM,EAAEC,QAAU;QACpF,MAAMC,eAAe;YACnB,cAAcN;YACd,iBAAiBK,QAAQ;YACzB,gBAAgBP,MAAMS,MAAM;YAC5BC,aAAaT,mBAAAA,oBAAAA,KAAAA,IAAAA,OAAQU,KAAK;YAC1B,GAAGL,IAAI;QACT;QACAF,IAAIQ,IAAI,CAACJ;QACT,IAAIH,YAAYQ,WAAW;YACzBT,IAAIQ,IAAI,IAAIb,qBAA4BM,SAASG,cAAcN,QAAQ;QACzE,CAAC;QACD,OAAOE;IACT,GAAG,EAAE;AACP;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCC,GACD,gEAAgE;AAChE,OAAO,MAAMU,uBAAuB,CAClCd,QAC+BD,qBAAqBC,OAAO"}
1
+ {"version":3,"sources":["flattenTree.ts"],"sourcesContent":["import { HeadlessFlatTreeItemProps } from '../FlatTree';\nimport { TreeItemProps, TreeItemValue } from '../TreeItem';\n\nexport type FlattenTreeItem<Props extends TreeItemProps> = Omit<Props, 'subtree' | 'itemType'> & {\n value: TreeItemValue;\n subtree?: FlattenTreeItem<Props>[];\n};\n\nexport type FlattenedTreeItem<Props extends TreeItemProps> = HeadlessFlatTreeItemProps & Props;\n\nfunction flattenTreeRecursive<Props extends TreeItemProps>(\n items: FlattenTreeItem<Props>[],\n parent?: HeadlessFlatTreeItemProps & Props,\n level = 1,\n): FlattenedTreeItem<Props>[] {\n return items.reduce<FlattenedTreeItem<Props>[]>((acc, { subtree, ...item }, index) => {\n const flatTreeItem = {\n 'aria-level': level,\n 'aria-posinset': index + 1,\n 'aria-setsize': items.length,\n parentValue: parent?.value,\n ...item,\n } as FlattenedTreeItem<Props>;\n acc.push(flatTreeItem);\n if (subtree !== undefined) {\n acc.push(...flattenTreeRecursive<Props>(subtree, flatTreeItem, level + 1));\n }\n return acc;\n }, []);\n}\n\n/**\n * Converts a nested structure to a flat one which can be consumed by `useFlatTreeItems`\n * @example\n * ```tsx\n * const defaultItems = flattenTree_unstable([\n * {\n * children: <TreeItemLayout>level 1, item 1</TreeItemLayout>,\n * subtree: [\n * {\n * children: <TreeItemLayout>level 2, item 1</TreeItemLayout>,\n * },\n * {\n * children: <TreeItemLayout>level 2, item 2</TreeItemLayout>,\n * },\n * {\n * children: <TreeItemLayout>level 2, item 3</TreeItemLayout>,\n * },\n * ],\n * },\n * {\n * children: <TreeItemLayout>level 1, item 2</TreeItemLayout>,\n * subtree: [\n * {\n * children: <TreeItemLayout>level 2, item 1</TreeItemLayout>,\n * subtree: [\n * {\n * children: <TreeItemLayout>level 3, item 1</TreeItemLayout>,\n * subtree: [\n * {\n * children: <TreeItemLayout>level 4, item 1</TreeItemLayout>,\n * },\n * ],\n * },\n * ],\n * },\n * ],\n * },\n * ]);\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const flattenTree_unstable = <Props extends TreeItemProps>(\n items: FlattenTreeItem<Props>[],\n): FlattenedTreeItem<Props>[] => flattenTreeRecursive(items);\n"],"names":["flattenTreeRecursive","items","parent","level","reduce","acc","subtree","item","index","flatTreeItem","length","parentValue","value","push","undefined","flattenTree_unstable"],"mappings":"AAUA,SAASA,qBACPC,KAA+B,EAC/BC,MAA0C,EAC1CC,QAAQ,CAAC,EACmB;IAC5B,OAAOF,MAAMG,MAAM,CAA6B,CAACC,KAAK,EAAEC,QAAO,EAAE,GAAGC,MAAM,EAAEC,QAAU;QACpF,MAAMC,eAAe;YACnB,cAAcN;YACd,iBAAiBK,QAAQ;YACzB,gBAAgBP,MAAMS,MAAM;YAC5BC,aAAaT,mBAAAA,oBAAAA,KAAAA,IAAAA,OAAQU,KAAK;YAC1B,GAAGL,IAAI;QACT;QACAF,IAAIQ,IAAI,CAACJ;QACT,IAAIH,YAAYQ,WAAW;YACzBT,IAAIQ,IAAI,IAAIb,qBAA4BM,SAASG,cAAcN,QAAQ;QACzE,CAAC;QACD,OAAOE;IACT,GAAG,EAAE;AACP;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCC,GACD,gEAAgE;AAChE,OAAO,MAAMU,uBAAuB,CAClCd,QAC+BD,qBAAqBC,OAAO"}
@@ -14,5 +14,6 @@ export const treeDataTypes = {
14
14
  Home,
15
15
  ArrowUp,
16
16
  ArrowDown,
17
- TypeAhead: 'TypeAhead'
17
+ TypeAhead: 'TypeAhead',
18
+ Change: 'Change'
18
19
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["tokens.ts"],"sourcesContent":["import { ArrowDown, ArrowLeft, ArrowRight, ArrowUp, End, Home, Enter } from '@fluentui/keyboard-keys';\nimport { TreeNavigationData_unstable, TreeOpenChangeData } from '../Tree';\n\nexport const treeItemLevelToken = '--fluent-TreeItem--level' as const;\n\nexport const treeAvatarSize = {\n medium: 32,\n small: 24,\n} as const;\n\nexport const treeDataTypes: {\n readonly [K in TreeOpenChangeData['type'] | TreeNavigationData_unstable['type']]: K;\n} = {\n ArrowLeft,\n ArrowRight,\n Enter,\n Click: 'Click',\n ExpandIconClick: 'ExpandIconClick',\n End,\n Home,\n ArrowUp,\n ArrowDown,\n TypeAhead: 'TypeAhead',\n};\n"],"names":["ArrowDown","ArrowLeft","ArrowRight","ArrowUp","End","Home","Enter","treeItemLevelToken","treeAvatarSize","medium","small","treeDataTypes","Click","ExpandIconClick","TypeAhead"],"mappings":"AAAA,SAASA,SAAS,EAAEC,SAAS,EAAEC,UAAU,EAAEC,OAAO,EAAEC,GAAG,EAAEC,IAAI,EAAEC,KAAK,QAAQ,0BAA0B;AAGtG,OAAO,MAAMC,qBAAqB,2BAAoC;AAEtE,OAAO,MAAMC,iBAAiB;IAC5BC,QAAQ;IACRC,OAAO;AACT,EAAW;AAEX,OAAO,MAAMC,gBAET;IACFV;IACAC;IACAI;IACAM,OAAO;IACPC,iBAAiB;IACjBT;IACAC;IACAF;IACAH;IACAc,WAAW;AACb,EAAE"}
1
+ {"version":3,"sources":["tokens.ts"],"sourcesContent":["import { ArrowDown, ArrowLeft, ArrowRight, ArrowUp, End, Home, Enter } from '@fluentui/keyboard-keys';\nimport { TreeCheckedChangeData, TreeNavigationData_unstable, TreeOpenChangeData } from '../Tree';\n\nexport const treeItemLevelToken = '--fluent-TreeItem--level' as const;\n\nexport const treeAvatarSize = {\n medium: 32,\n small: 24,\n} as const;\n\nexport const treeDataTypes: {\n readonly [K in TreeOpenChangeData['type'] | TreeNavigationData_unstable['type'] | TreeCheckedChangeData['type']]: K;\n} = {\n ArrowLeft,\n ArrowRight,\n Enter,\n Click: 'Click',\n ExpandIconClick: 'ExpandIconClick',\n End,\n Home,\n ArrowUp,\n ArrowDown,\n TypeAhead: 'TypeAhead',\n Change: 'Change',\n};\n"],"names":["ArrowDown","ArrowLeft","ArrowRight","ArrowUp","End","Home","Enter","treeItemLevelToken","treeAvatarSize","medium","small","treeDataTypes","Click","ExpandIconClick","TypeAhead","Change"],"mappings":"AAAA,SAASA,SAAS,EAAEC,SAAS,EAAEC,UAAU,EAAEC,OAAO,EAAEC,GAAG,EAAEC,IAAI,EAAEC,KAAK,QAAQ,0BAA0B;AAGtG,OAAO,MAAMC,qBAAqB,2BAAoC;AAEtE,OAAO,MAAMC,iBAAiB;IAC5BC,QAAQ;IACRC,OAAO;AACT,EAAW;AAEX,OAAO,MAAMC,gBAET;IACFV;IACAC;IACAI;IACAM,OAAO;IACPC,iBAAiB;IACjBT;IACAC;IACAF;IACAH;IACAc,WAAW;IACXC,QAAQ;AACV,EAAE"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _exportStar = require("@swc/helpers/lib/_export_star.js").default;
6
+ _exportStar(require("./components/FlatTree/index"), exports);
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FlatTree.js"],"sourcesContent":["export * from './components/FlatTree/index';\n"],"names":[],"mappings":";;;;;oBAAc"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "FlatTree", {
6
+ enumerable: true,
7
+ get: ()=>FlatTree
8
+ });
9
+ const _interopRequireWildcard = require("@swc/helpers/lib/_interop_require_wildcard.js").default;
10
+ const _react = /*#__PURE__*/ _interopRequireWildcard(require("react"));
11
+ const _index = require("../Tree/index");
12
+ const _useFlatTree = require("./useFlatTree");
13
+ const _useFlatTreeStylesStyles = require("./useFlatTreeStyles.styles");
14
+ const FlatTree = /*#__PURE__*/ _react.forwardRef((props, ref)=>{
15
+ const state = (0, _useFlatTree.useFlatTree_unstable)(props, ref);
16
+ const contextValues = (0, _index.useTreeContextValues_unstable)(state);
17
+ (0, _useFlatTreeStylesStyles.useFlatTreeStyles_unstable)(state);
18
+ return (0, _index.renderTree_unstable)(state, contextValues);
19
+ });
20
+ FlatTree.displayName = 'FlatTree';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FlatTree.js"],"sourcesContent":["import * as React from 'react';\nimport { useTreeContextValues_unstable as useFlatTreeContextValues_unstable, renderTree_unstable as renderFlatTree_unstable } from '../Tree/index';\nimport { useFlatTree_unstable } from './useFlatTree';\nimport { useFlatTreeStyles_unstable } from './useFlatTreeStyles.styles';\n/**\n * FlatTree component - TODO: add more docs\n */ export const FlatTree = /*#__PURE__*/ React.forwardRef((props, ref)=>{\n const state = useFlatTree_unstable(props, ref);\n const contextValues = useFlatTreeContextValues_unstable(state);\n useFlatTreeStyles_unstable(state);\n return renderFlatTree_unstable(state, contextValues);\n});\nFlatTree.displayName = 'FlatTree';\n"],"names":["FlatTree","React","forwardRef","props","ref","state","useFlatTree_unstable","contextValues","useFlatTreeContextValues_unstable","useFlatTreeStyles_unstable","renderFlatTree_unstable","displayName"],"mappings":";;;;+BAMiBA;;aAAAA;;;6DANM;uBAC4G;6BAC9F;yCACM;AAGhC,MAAMA,WAAW,WAAW,GAAGC,OAAMC,UAAU,CAAC,CAACC,OAAOC,MAAM;IACrE,MAAMC,QAAQC,IAAAA,iCAAoB,EAACH,OAAOC;IAC1C,MAAMG,gBAAgBC,IAAAA,oCAAiC,EAACH;IACxDI,IAAAA,mDAA0B,EAACJ;IAC3B,OAAOK,IAAAA,0BAAuB,EAACL,OAAOE;AAC1C;AACAP,SAASW,WAAW,GAAG"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ renderFlatTree_unstable: ()=>_index.renderTree_unstable,
13
+ useFlatTreeContextValues_unstable: ()=>_index.useTreeContextValues_unstable
14
+ });
15
+ const _exportStar = require("@swc/helpers/lib/_export_star.js").default;
16
+ _exportStar(require("./FlatTree"), exports);
17
+ _exportStar(require("./FlatTree.types"), exports);
18
+ const _index = require("../Tree/index");
19
+ _exportStar(require("./useHeadlessFlatTree"), exports);
20
+ _exportStar(require("./useFlatTree"), exports);
21
+ _exportStar(require("./useFlatTreeStyles.styles"), exports);
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.js"],"sourcesContent":["export * from './FlatTree';\nexport * from './FlatTree.types';\nexport { renderTree_unstable as renderFlatTree_unstable, useTreeContextValues_unstable as useFlatTreeContextValues_unstable } from '../Tree/index';\nexport * from './useHeadlessFlatTree';\nexport * from './useFlatTree';\nexport * from './useFlatTreeStyles.styles';\n"],"names":["renderFlatTree_unstable","renderTree_unstable","useFlatTreeContextValues_unstable","useTreeContextValues_unstable"],"mappings":";;;;;;;;;;;IAEgCA,uBAAuB,MAA9CC,0BAAmB;IAA8DC,iCAAiC,MAAlEC,oCAA6B;;;oBAFxE;oBACA;uBACqH;oBACrH;oBACA;oBACA"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ useFlatControllableCheckedItems: ()=>useFlatControllableCheckedItems,
13
+ createNextFlatCheckedItems: ()=>createNextFlatCheckedItems
14
+ });
15
+ const _interopRequireWildcard = require("@swc/helpers/lib/_interop_require_wildcard.js").default;
16
+ const _reactUtilities = require("@fluentui/react-utilities");
17
+ const _immutableMap = require("../../utils/ImmutableMap");
18
+ const _react = /*#__PURE__*/ _interopRequireWildcard(require("react"));
19
+ const _createCheckedItems = require("../../utils/createCheckedItems");
20
+ function useFlatControllableCheckedItems(props) {
21
+ const [checkedItems, setCheckedItems] = (0, _reactUtilities.useControllableState)({
22
+ initialState: _immutableMap.ImmutableMap.empty,
23
+ state: _react.useMemo(()=>props.checkedItems && (0, _createCheckedItems.createCheckedItems)(props.checkedItems), [
24
+ props.checkedItems
25
+ ]),
26
+ defaultState: ()=>(0, _createCheckedItems.createCheckedItems)(props.defaultCheckedItems)
27
+ });
28
+ return [
29
+ checkedItems,
30
+ setCheckedItems
31
+ ];
32
+ }
33
+ function createNextFlatCheckedItems(data, previousCheckedItems, virtualTree) {
34
+ if (data.selectionMode === 'single') {
35
+ return _immutableMap.ImmutableMap.create([
36
+ [
37
+ data.value,
38
+ data.checked
39
+ ]
40
+ ]);
41
+ }
42
+ const treeItem = virtualTree.get(data.value);
43
+ if (!treeItem) {
44
+ if (process.env.NODE_ENV !== 'production') {
45
+ // eslint-disable-next-line no-console
46
+ console.error(`useHeadlessFlatTree: tree item ${data.value} not found`);
47
+ }
48
+ return previousCheckedItems;
49
+ }
50
+ const nextCheckedItems = new Map(previousCheckedItems);
51
+ for (const children of virtualTree.subtree(data.value)){
52
+ nextCheckedItems.set(children.value, data.checked);
53
+ }
54
+ nextCheckedItems.set(data.value, data.checked);
55
+ let isAncestorsMixed = false;
56
+ for (const parent of virtualTree.ancestors(treeItem.value)){
57
+ // if one parent is mixed, all ancestors are mixed
58
+ if (isAncestorsMixed) {
59
+ nextCheckedItems.set(parent.value, 'mixed');
60
+ continue;
61
+ }
62
+ const checkedChildren = [];
63
+ for (const child of virtualTree.children(parent.value)){
64
+ var _nextCheckedItems_get;
65
+ if (((_nextCheckedItems_get = nextCheckedItems.get(child.value)) !== null && _nextCheckedItems_get !== void 0 ? _nextCheckedItems_get : false) === data.checked) {
66
+ checkedChildren.push(child);
67
+ }
68
+ }
69
+ if (checkedChildren.length === parent.childrenValues.length) {
70
+ nextCheckedItems.set(parent.value, data.checked);
71
+ } else {
72
+ // if one parent is mixed, all ancestors are mixed
73
+ isAncestorsMixed = true;
74
+ nextCheckedItems.set(parent.value, 'mixed');
75
+ }
76
+ }
77
+ return _immutableMap.ImmutableMap.dangerouslyCreate_unstable(nextCheckedItems);
78
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useFlatControllableCheckedItems.js"],"sourcesContent":["import { useControllableState } from '@fluentui/react-utilities';\nimport { ImmutableMap } from '../../utils/ImmutableMap';\nimport * as React from 'react';\nimport { createCheckedItems } from '../../utils/createCheckedItems';\nexport function useFlatControllableCheckedItems(props) {\n const [checkedItems, setCheckedItems] = useControllableState({\n initialState: ImmutableMap.empty,\n state: React.useMemo(()=>props.checkedItems && createCheckedItems(props.checkedItems), [\n props.checkedItems\n ]),\n defaultState: ()=>createCheckedItems(props.defaultCheckedItems)\n });\n return [\n checkedItems,\n setCheckedItems\n ];\n}\nexport function createNextFlatCheckedItems(data, previousCheckedItems, virtualTree) {\n if (data.selectionMode === 'single') {\n return ImmutableMap.create([\n [\n data.value,\n data.checked\n ]\n ]);\n }\n const treeItem = virtualTree.get(data.value);\n if (!treeItem) {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.error(`useHeadlessFlatTree: tree item ${data.value} not found`);\n }\n return previousCheckedItems;\n }\n const nextCheckedItems = new Map(previousCheckedItems);\n for (const children of virtualTree.subtree(data.value)){\n nextCheckedItems.set(children.value, data.checked);\n }\n nextCheckedItems.set(data.value, data.checked);\n let isAncestorsMixed = false;\n for (const parent of virtualTree.ancestors(treeItem.value)){\n // if one parent is mixed, all ancestors are mixed\n if (isAncestorsMixed) {\n nextCheckedItems.set(parent.value, 'mixed');\n continue;\n }\n const checkedChildren = [];\n for (const child of virtualTree.children(parent.value)){\n var _nextCheckedItems_get;\n if (((_nextCheckedItems_get = nextCheckedItems.get(child.value)) !== null && _nextCheckedItems_get !== void 0 ? _nextCheckedItems_get : false) === data.checked) {\n checkedChildren.push(child);\n }\n }\n if (checkedChildren.length === parent.childrenValues.length) {\n nextCheckedItems.set(parent.value, data.checked);\n } else {\n // if one parent is mixed, all ancestors are mixed\n isAncestorsMixed = true;\n nextCheckedItems.set(parent.value, 'mixed');\n }\n }\n return ImmutableMap.dangerouslyCreate_unstable(nextCheckedItems);\n}\n"],"names":["useFlatControllableCheckedItems","createNextFlatCheckedItems","props","checkedItems","setCheckedItems","useControllableState","initialState","ImmutableMap","empty","state","React","useMemo","createCheckedItems","defaultState","defaultCheckedItems","data","previousCheckedItems","virtualTree","selectionMode","create","value","checked","treeItem","get","process","env","NODE_ENV","console","error","nextCheckedItems","Map","children","subtree","set","isAncestorsMixed","parent","ancestors","checkedChildren","child","_nextCheckedItems_get","push","length","childrenValues","dangerouslyCreate_unstable"],"mappings":";;;;;;;;;;;IAIgBA,+BAA+B,MAA/BA;IAaAC,0BAA0B,MAA1BA;;;gCAjBqB;8BACR;6DACN;oCACY;AAC5B,SAASD,gCAAgCE,KAAK,EAAE;IACnD,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,IAAAA,oCAAoB,EAAC;QACzDC,cAAcC,0BAAY,CAACC,KAAK;QAChCC,OAAOC,OAAMC,OAAO,CAAC,IAAIT,MAAMC,YAAY,IAAIS,IAAAA,sCAAkB,EAACV,MAAMC,YAAY,GAAG;YACnFD,MAAMC,YAAY;SACrB;QACDU,cAAc,IAAID,IAAAA,sCAAkB,EAACV,MAAMY,mBAAmB;IAClE;IACA,OAAO;QACHX;QACAC;KACH;AACL;AACO,SAASH,2BAA2Bc,IAAI,EAAEC,oBAAoB,EAAEC,WAAW,EAAE;IAChF,IAAIF,KAAKG,aAAa,KAAK,UAAU;QACjC,OAAOX,0BAAY,CAACY,MAAM,CAAC;YACvB;gBACIJ,KAAKK,KAAK;gBACVL,KAAKM,OAAO;aACf;SACJ;IACL,CAAC;IACD,MAAMC,WAAWL,YAAYM,GAAG,CAACR,KAAKK,KAAK;IAC3C,IAAI,CAACE,UAAU;QACX,IAAIE,QAAQC,GAAG,CAACC,QAAQ,KAAK,cAAc;YACvC,sCAAsC;YACtCC,QAAQC,KAAK,CAAC,CAAC,+BAA+B,EAAEb,KAAKK,KAAK,CAAC,UAAU,CAAC;QAC1E,CAAC;QACD,OAAOJ;IACX,CAAC;IACD,MAAMa,mBAAmB,IAAIC,IAAId;IACjC,KAAK,MAAMe,YAAYd,YAAYe,OAAO,CAACjB,KAAKK,KAAK,EAAE;QACnDS,iBAAiBI,GAAG,CAACF,SAASX,KAAK,EAAEL,KAAKM,OAAO;IACrD;IACAQ,iBAAiBI,GAAG,CAAClB,KAAKK,KAAK,EAAEL,KAAKM,OAAO;IAC7C,IAAIa,mBAAmB,KAAK;IAC5B,KAAK,MAAMC,UAAUlB,YAAYmB,SAAS,CAACd,SAASF,KAAK,EAAE;QACvD,kDAAkD;QAClD,IAAIc,kBAAkB;YAClBL,iBAAiBI,GAAG,CAACE,OAAOf,KAAK,EAAE;YACnC,QAAS;QACb,CAAC;QACD,MAAMiB,kBAAkB,EAAE;QAC1B,KAAK,MAAMC,SAASrB,YAAYc,QAAQ,CAACI,OAAOf,KAAK,EAAE;YACnD,IAAImB;YACJ,IAAI,AAAC,CAAA,AAACA,CAAAA,wBAAwBV,iBAAiBN,GAAG,CAACe,MAAMlB,KAAK,CAAA,MAAO,IAAI,IAAImB,0BAA0B,KAAK,IAAIA,wBAAwB,KAAK,AAAD,MAAOxB,KAAKM,OAAO,EAAE;gBAC7JgB,gBAAgBG,IAAI,CAACF;YACzB,CAAC;QACL;QACA,IAAID,gBAAgBI,MAAM,KAAKN,OAAOO,cAAc,CAACD,MAAM,EAAE;YACzDZ,iBAAiBI,GAAG,CAACE,OAAOf,KAAK,EAAEL,KAAKM,OAAO;QACnD,OAAO;YACH,kDAAkD;YAClDa,mBAAmB,IAAI;YACvBL,iBAAiBI,GAAG,CAACE,OAAOf,KAAK,EAAE;QACvC,CAAC;IACL;IACA,OAAOb,0BAAY,CAACoC,0BAA0B,CAACd;AACnD"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "useFlatTree_unstable", {
6
+ enumerable: true,
7
+ get: ()=>useFlatTree_unstable
8
+ });
9
+ const _interopRequireWildcard = require("@swc/helpers/lib/_interop_require_wildcard.js").default;
10
+ const _react = /*#__PURE__*/ _interopRequireWildcard(require("react"));
11
+ const _useRootTree = require("../../hooks/useRootTree");
12
+ const useFlatTree_unstable = _useRootTree.useRootTree;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useFlatTree.js"],"sourcesContent":["import * as React from 'react';\nimport { useRootTree } from '../../hooks/useRootTree';\nexport const useFlatTree_unstable = useRootTree;\n"],"names":["useFlatTree_unstable","useRootTree"],"mappings":";;;;+BAEaA;;aAAAA;;;6DAFU;6BACK;AACrB,MAAMA,uBAAuBC,wBAAW"}
@@ -8,13 +8,13 @@ Object.defineProperty(exports, "useFlatTreeNavigation", {
8
8
  });
9
9
  const _reactSharedContexts = require("@fluentui/react-shared-contexts");
10
10
  const _reactUtilities = require("@fluentui/react-utilities");
11
- const _nextTypeAheadElement = require("../utils/nextTypeAheadElement");
12
- const _tokens = require("../utils/tokens");
13
- const _treeItemFilter = require("../utils/treeItemFilter");
14
- const _useHTMLElementWalker = require("./useHTMLElementWalker");
15
- const _useRovingTabIndexes = require("./useRovingTabIndexes");
16
- const _getTreeItemValueFromElement = require("../utils/getTreeItemValueFromElement");
17
- function useFlatTreeNavigation(flatTreeItems) {
11
+ const _nextTypeAheadElement = require("../../utils/nextTypeAheadElement");
12
+ const _tokens = require("../../utils/tokens");
13
+ const _treeItemFilter = require("../../utils/treeItemFilter");
14
+ const _useHTMLElementWalker = require("../../hooks/useHTMLElementWalker");
15
+ const _useRovingTabIndexes = require("../../hooks/useRovingTabIndexes");
16
+ const _getTreeItemValueFromElement = require("../../utils/getTreeItemValueFromElement");
17
+ function useFlatTreeNavigation(virtualTree) {
18
18
  const { targetDocument } = (0, _reactSharedContexts.useFluent_unstable)();
19
19
  const [treeItemWalkerRef, treeItemWalkerRootRef] = (0, _useHTMLElementWalker.useHTMLElementWalkerRef)(_treeItemFilter.treeItemFilter);
20
20
  const [{ rove }, rovingRootRef] = (0, _useRovingTabIndexes.useRovingTabIndex)(_treeItemFilter.treeItemFilter);
@@ -30,7 +30,7 @@ function useFlatTreeNavigation(flatTreeItems) {
30
30
  treeItemWalker.currentElement = data.target;
31
31
  return (0, _nextTypeAheadElement.nextTypeAheadElement)(treeItemWalker, data.event.key);
32
32
  case _tokens.treeDataTypes.ArrowLeft:
33
- return parentElement(flatTreeItems, data.target, treeItemWalker);
33
+ return parentElement(virtualTree, data.target, treeItemWalker);
34
34
  case _tokens.treeDataTypes.ArrowRight:
35
35
  treeItemWalker.currentElement = data.target;
36
36
  return firstChild(data.target, treeItemWalker);
@@ -72,14 +72,14 @@ function firstChild(target, treeWalker) {
72
72
  }
73
73
  return null;
74
74
  }
75
- function parentElement(flatTreeItems, target, treeWalker) {
75
+ function parentElement(virtualTreeItems, target, treeWalker) {
76
76
  const value = (0, _getTreeItemValueFromElement.getTreeItemValueFromElement)(target);
77
77
  if (value === null) {
78
78
  return null;
79
79
  }
80
- const flatTreeItem = flatTreeItems.get(value);
81
- if (flatTreeItem === null || flatTreeItem === void 0 ? void 0 : flatTreeItem.parentValue) {
82
- return treeWalker.root.querySelector(`[${_getTreeItemValueFromElement.dataTreeItemValueAttrName}="${flatTreeItem.parentValue}"]`);
80
+ const virtualTreeItem = virtualTreeItems.get(value);
81
+ if (virtualTreeItem === null || virtualTreeItem === void 0 ? void 0 : virtualTreeItem.parentValue) {
82
+ return treeWalker.root.querySelector(`[${_getTreeItemValueFromElement.dataTreeItemValueAttrName}="${virtualTreeItem.parentValue}"]`);
83
83
  }
84
84
  return null;
85
85
  }