@oracle/oraclejet-preact 20.0.0 → 20.0.2

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 (262) hide show
  1. package/amd/BaseCardView-16fda4c3.js +2 -0
  2. package/amd/{BaseCardView-b8119561.js.map → BaseCardView-16fda4c3.js.map} +1 -1
  3. package/amd/BaseTabBarItem-d7c2922b.js +2 -0
  4. package/amd/BaseTabBarItem-d7c2922b.js.map +1 -0
  5. package/amd/CardFlexView-d3eb7373.js +2 -0
  6. package/amd/{CardFlexView-aa2f3de8.js.map → CardFlexView-d3eb7373.js.map} +1 -1
  7. package/amd/CardGridView-842f70cd.js +2 -0
  8. package/amd/{CardGridView-85f90c75.js.map → CardGridView-842f70cd.js.map} +1 -1
  9. package/amd/CheckboxSetContext-2e486ea8.js +2 -0
  10. package/{cjs/CheckboxSetContext-c62db26d.js.map → amd/CheckboxSetContext-2e486ea8.js.map} +1 -1
  11. package/amd/{CollapsibleNavigationList-f0072c90.js → CollapsibleNavigationList-fdeccbfb.js} +2 -2
  12. package/amd/{CollapsibleNavigationList-f0072c90.js.map → CollapsibleNavigationList-fdeccbfb.js.map} +1 -1
  13. package/amd/{DatePicker-88c5bbcd.js → DatePicker-bf521b1c.js} +2 -2
  14. package/amd/{DatePicker-88c5bbcd.js.map → DatePicker-bf521b1c.js.map} +1 -1
  15. package/amd/ExpandableList-a9a86ad8.js +2 -0
  16. package/amd/{ExpandableList-233c279e.js.map → ExpandableList-a9a86ad8.js.map} +1 -1
  17. package/amd/{FlatTreeView-9ecf2be6.js → FlatTreeView-15edd439.js} +2 -2
  18. package/amd/{FlatTreeView-9ecf2be6.js.map → FlatTreeView-15edd439.js.map} +1 -1
  19. package/amd/{InlineSelectSingle-f4438110.js → InlineSelectSingle-7c1cc5b5.js} +2 -2
  20. package/amd/{InlineSelectSingle-f4438110.js.map → InlineSelectSingle-7c1cc5b5.js.map} +1 -1
  21. package/amd/InputDatePicker-7227a858.js +2 -0
  22. package/amd/{InputDatePicker-48633486.js.map → InputDatePicker-7227a858.js.map} +1 -1
  23. package/amd/ListView-6d21e8f9.js +2 -0
  24. package/amd/{ListView-2678b2af.js.map → ListView-6d21e8f9.js.map} +1 -1
  25. package/amd/{MonthView-ea883c49.js → MonthView-96fafba4.js} +2 -2
  26. package/amd/{MonthView-ea883c49.js.map → MonthView-96fafba4.js.map} +1 -1
  27. package/amd/{OverflowTabBar-b142f8d4.js → OverflowTabBar-5ff68da7.js} +2 -2
  28. package/amd/{OverflowTabBar-b142f8d4.js.map → OverflowTabBar-5ff68da7.js.map} +1 -1
  29. package/amd/{OverflowTabBarItem-49a82149.js → OverflowTabBarItem-926b0c8a.js} +2 -2
  30. package/amd/{OverflowTabBarItem-49a82149.js.map → OverflowTabBarItem-926b0c8a.js.map} +1 -1
  31. package/amd/PRIVATE_BaseCardView.js +1 -1
  32. package/amd/PRIVATE_CollapsibleNavigationList.js +1 -1
  33. package/amd/PRIVATE_MonthView.js +1 -1
  34. package/amd/PRIVATE_MonthYearGridView.js +1 -1
  35. package/amd/PRIVATE_SelectCommon.js +1 -1
  36. package/amd/PRIVATE_StyledDatePickerButton.js +1 -1
  37. package/amd/PRIVATE_TableList.js +1 -1
  38. package/amd/{RemovableTabBarItem-e1bee7fa.js → RemovableTabBarItem-9ae273fe.js} +2 -2
  39. package/amd/{RemovableTabBarItem-e1bee7fa.js.map → RemovableTabBarItem-9ae273fe.js.map} +1 -1
  40. package/amd/ReorderableTabBar-0c69bfd4.js +2 -0
  41. package/amd/{ReorderableTabBar-46683bcb.js.map → ReorderableTabBar-0c69bfd4.js.map} +1 -1
  42. package/amd/{SelectMobileFieldInput-83f56b22.js → SelectMobileFieldInput-d499ef86.js} +2 -2
  43. package/amd/{SelectMobileFieldInput-83f56b22.js.map → SelectMobileFieldInput-d499ef86.js.map} +1 -1
  44. package/amd/{SelectMultiple-cb5fdd20.js → SelectMultiple-cc9bffc6.js} +2 -2
  45. package/amd/{SelectMultiple-cb5fdd20.js.map → SelectMultiple-cc9bffc6.js.map} +1 -1
  46. package/amd/{SelectSingle-02e85b6e.js → SelectSingle-2bb35b67.js} +2 -2
  47. package/amd/{SelectSingle-02e85b6e.js.map → SelectSingle-2bb35b67.js.map} +1 -1
  48. package/amd/StyledDatePickerButton-bceb62e1.js +2 -0
  49. package/amd/StyledDatePickerButton-bceb62e1.js.map +1 -0
  50. package/amd/StyledDatePickerButtonStyles.styles.css +17 -0
  51. package/amd/TabBar-de723fbc.js +2 -0
  52. package/amd/{TabBar-fcebb560.js.map → TabBar-de723fbc.js.map} +1 -1
  53. package/amd/TabBarItem-a39c5de3.js +2 -0
  54. package/amd/{TabBarItem-224bc6b3.js.map → TabBarItem-a39c5de3.js.map} +1 -1
  55. package/amd/TabBarLinkItem-944b1e8d.js +2 -0
  56. package/amd/{TabBarLinkItem-57587dbd.js.map → TabBarLinkItem-944b1e8d.js.map} +1 -1
  57. package/amd/TabBarMixed-cfd346bf.js +2 -0
  58. package/amd/{TabBarMixed-8cc4b4ed.js.map → TabBarMixed-cfd346bf.js.map} +1 -1
  59. package/amd/Theme-redwood/theme.css +201 -201
  60. package/amd/Theme-stable/theme.css +218 -218
  61. package/amd/UNSAFE_CardFlexView.js +1 -1
  62. package/amd/UNSAFE_CardGridView.js +1 -1
  63. package/amd/UNSAFE_CheckboxItem.js +1 -1
  64. package/amd/UNSAFE_CheckboxItem.js.map +1 -1
  65. package/amd/UNSAFE_CheckboxSet.js +1 -1
  66. package/amd/UNSAFE_CheckboxSet.js.map +1 -1
  67. package/amd/UNSAFE_DatePicker.js +1 -1
  68. package/amd/UNSAFE_ExpandableList.js +1 -1
  69. package/amd/UNSAFE_FlatTreeView.js +1 -1
  70. package/amd/UNSAFE_InlineSelectSingle.js +1 -1
  71. package/amd/UNSAFE_InputDatePicker.js +1 -1
  72. package/amd/UNSAFE_ListView.js +1 -1
  73. package/amd/UNSAFE_OverflowTabBar.js +1 -1
  74. package/amd/UNSAFE_ReorderableTabBar.js +1 -1
  75. package/amd/UNSAFE_RichCheckboxSet.js +1 -1
  76. package/amd/UNSAFE_RichCheckboxSet.js.map +1 -1
  77. package/amd/UNSAFE_RichSelectionItem.js +1 -1
  78. package/amd/UNSAFE_RichSelectionItem.js.map +1 -1
  79. package/amd/UNSAFE_SelectMultiple.js +1 -1
  80. package/amd/UNSAFE_SelectSingle.js +1 -1
  81. package/amd/UNSAFE_TabBar.js +1 -1
  82. package/amd/UNSAFE_TabBarCommon.js +1 -1
  83. package/amd/UNSAFE_TabBarMixed.js +1 -1
  84. package/amd/UNSAFE_VirtualizedListView.js +1 -1
  85. package/amd/VirtualizedListView-1ae7151d.js +2 -0
  86. package/amd/{VirtualizedListView-a0f338c2.js.map → VirtualizedListView-1ae7151d.js.map} +1 -1
  87. package/amd/{YearsGridView-4aa7bc66.js → YearsGridView-561c3074.js} +2 -2
  88. package/amd/{YearsGridView-4aa7bc66.js.map → YearsGridView-561c3074.js.map} +1 -1
  89. package/amd/{useDisplayValue-e70c76d8.js → useDisplayValue-0e90bf4c.js} +2 -2
  90. package/amd/{useDisplayValue-e70c76d8.js.map → useDisplayValue-0e90bf4c.js.map} +1 -1
  91. package/amd/useSelectCommon-a02ddf3c.js +2 -0
  92. package/amd/useSelectCommon-a02ddf3c.js.map +1 -0
  93. package/cjs/{Chart-13a198f3.js → Chart-966da017.js} +2 -2
  94. package/cjs/{Chart-13a198f3.js.map → Chart-966da017.js.map} +1 -1
  95. package/cjs/CheckboxSet-6865f4fd.js +55 -0
  96. package/{amd/CheckboxSet-f000e5c2.js.map → cjs/CheckboxSet-6865f4fd.js.map} +1 -1
  97. package/cjs/{ColorPalette-9f041744.js → ColorPalette-b14114d8.js} +2 -2
  98. package/cjs/{ColorPalette-9f041744.js.map → ColorPalette-b14114d8.js.map} +1 -1
  99. package/cjs/{ColorPicker-9af6707c.js → ColorPicker-8f0b6000.js} +2 -2
  100. package/cjs/{ColorPicker-9af6707c.js.map → ColorPicker-8f0b6000.js.map} +1 -1
  101. package/cjs/{DatePicker-48c602ff.js → DatePicker-b60f8a7e.js} +3 -3
  102. package/cjs/{DatePicker-48c602ff.js.map → DatePicker-b60f8a7e.js.map} +1 -1
  103. package/cjs/{MonthView-59452edc.js → MonthView-a2661a58.js} +2 -2
  104. package/cjs/{MonthView-59452edc.js.map → MonthView-a2661a58.js.map} +1 -1
  105. package/cjs/{OverflowTabBarItem-2c967a89.js → OverflowTabBarItem-abcd2327.js} +6 -3
  106. package/cjs/OverflowTabBarItem-abcd2327.js.map +1 -0
  107. package/cjs/PRIVATE_Chart.js +4 -4
  108. package/cjs/PRIVATE_MonthView.js +2 -3
  109. package/cjs/PRIVATE_MonthView.js.map +1 -1
  110. package/cjs/PRIVATE_MonthYearGridView.js +2 -3
  111. package/cjs/PRIVATE_MonthYearGridView.js.map +1 -1
  112. package/cjs/PRIVATE_SelectCommon.js +2 -2
  113. package/cjs/PRIVATE_StyledDatePickerButton.js +1 -2
  114. package/cjs/PRIVATE_StyledDatePickerButton.js.map +1 -1
  115. package/cjs/SegmentStyles.styles.css +12 -9
  116. package/cjs/SegmentStyles.styles2.css +9 -12
  117. package/cjs/{SelectMobileFieldInput-111a95a5.js → SelectMobileFieldInput-cbf57541.js} +2 -2
  118. package/cjs/{SelectMobileFieldInput-111a95a5.js.map → SelectMobileFieldInput-cbf57541.js.map} +1 -1
  119. package/cjs/{StyledDatePickerButton-cf4e4dc0.js → StyledDatePickerButton-becd2a7d.js} +2 -8
  120. package/cjs/StyledDatePickerButton-becd2a7d.js.map +1 -0
  121. package/cjs/StyledDatePickerButtonStyles.styles.css +17 -0
  122. package/cjs/{TabBarLinkItem-42785eb3.js → TabBarLinkItem-b0c4b100.js} +2 -2
  123. package/cjs/{TabBarLinkItem-42785eb3.js.map → TabBarLinkItem-b0c4b100.js.map} +1 -1
  124. package/cjs/Theme-redwood/theme.css +117 -117
  125. package/cjs/Theme-stable/theme.css +224 -224
  126. package/cjs/UNSAFE_BarChart.js +4 -4
  127. package/cjs/UNSAFE_CheckboxItem.js +117 -56
  128. package/cjs/UNSAFE_CheckboxItem.js.map +1 -1
  129. package/cjs/UNSAFE_CheckboxSet.js +21 -50
  130. package/cjs/UNSAFE_CheckboxSet.js.map +1 -1
  131. package/cjs/UNSAFE_ColorPalette.js +80 -80
  132. package/cjs/UNSAFE_ColorPicker.js +60 -60
  133. package/cjs/UNSAFE_ComboChart.js +4 -4
  134. package/cjs/UNSAFE_DatePicker.js +4 -4
  135. package/cjs/UNSAFE_InlineSelectSingle.js +2 -2
  136. package/cjs/UNSAFE_InputColor.js +11 -11
  137. package/cjs/UNSAFE_InputDatePicker.js +96 -96
  138. package/cjs/UNSAFE_LineAreaChart.js +4 -4
  139. package/cjs/UNSAFE_OverflowTabBar.js +2 -2
  140. package/cjs/UNSAFE_RichCheckboxSet.js +46 -42
  141. package/cjs/UNSAFE_RichCheckboxSet.js.map +1 -1
  142. package/cjs/UNSAFE_RichSelectionItem.js +154 -91
  143. package/cjs/UNSAFE_RichSelectionItem.js.map +1 -1
  144. package/cjs/UNSAFE_ScatterChart.js +4 -4
  145. package/cjs/UNSAFE_SelectMultiple.js +2 -2
  146. package/cjs/UNSAFE_SelectSingle.js +3 -3
  147. package/cjs/UNSAFE_TabBar.js +2 -2
  148. package/cjs/UNSAFE_TabBarCommon.js +4 -4
  149. package/cjs/UNSAFE_TabBarMixed.js +3 -3
  150. package/cjs/{YearsGridView-b56f7f42.js → YearsGridView-d0d4e8e1.js} +2 -2
  151. package/cjs/{YearsGridView-b56f7f42.js.map → YearsGridView-d0d4e8e1.js.map} +1 -1
  152. package/cjs/{useDisplayValue-60dbe1c3.js → useDisplayValue-4ace417c.js} +2 -2
  153. package/cjs/{useDisplayValue-60dbe1c3.js.map → useDisplayValue-4ace417c.js.map} +1 -1
  154. package/cjs/{useSelectCommon-b0d7feb3.js → useSelectCommon-27afecfa.js} +8 -3
  155. package/cjs/useSelectCommon-27afecfa.js.map +1 -0
  156. package/es/{BaseCardView-85b9a71e.js → BaseCardView-b3d8bae0.js} +4 -1
  157. package/es/{BaseCardView-85b9a71e.js.map → BaseCardView-b3d8bae0.js.map} +1 -1
  158. package/es/{DatePicker-2ab05fbe.js → DatePicker-7287f0f9.js} +3 -3
  159. package/es/{DatePicker-2ab05fbe.js.map → DatePicker-7287f0f9.js.map} +1 -1
  160. package/es/{MonthView-097171eb.js → MonthView-4b2b483a.js} +2 -2
  161. package/es/{MonthView-097171eb.js.map → MonthView-4b2b483a.js.map} +1 -1
  162. package/es/{NavigationListItem-dbd29973.js → NavigationListItem-340ab770.js} +19 -1
  163. package/es/{NavigationListItem-dbd29973.js.map → NavigationListItem-340ab770.js.map} +1 -1
  164. package/es/{OverflowTabBarItem-6966fbc7.js → OverflowTabBarItem-aa0ce915.js} +7 -4
  165. package/es/OverflowTabBarItem-aa0ce915.js.map +1 -0
  166. package/es/PRIVATE_BaseCardView.js +1 -1
  167. package/es/PRIVATE_CollapsibleNavigationList.js +25 -25
  168. package/es/PRIVATE_MonthView.js +2 -3
  169. package/es/PRIVATE_MonthView.js.map +1 -1
  170. package/es/PRIVATE_MonthYearGridView.js +2 -3
  171. package/es/PRIVATE_MonthYearGridView.js.map +1 -1
  172. package/es/PRIVATE_SelectCommon.js +2 -2
  173. package/es/PRIVATE_StyledDatePickerButton.js +1 -2
  174. package/es/PRIVATE_StyledDatePickerButton.js.map +1 -1
  175. package/es/PRIVATE_TableList.js +4 -4
  176. package/es/RadioIconVariants.styles.css +3 -3
  177. package/es/RadioIconVariants.styles2.css +3 -3
  178. package/es/SegmentStyles.styles.css +9 -12
  179. package/es/SegmentStyles.styles2.css +12 -9
  180. package/es/{SelectMobileFieldInput-0a7c968c.js → SelectMobileFieldInput-345c4d45.js} +2 -2
  181. package/es/{SelectMobileFieldInput-0a7c968c.js.map → SelectMobileFieldInput-345c4d45.js.map} +1 -1
  182. package/es/{StyledDatePickerButton-f3971567.js → StyledDatePickerButton-78f2f6e8.js} +2 -8
  183. package/es/StyledDatePickerButton-78f2f6e8.js.map +1 -0
  184. package/es/StyledDatePickerButtonStyles.styles.css +17 -0
  185. package/es/{TabBar-10488830.js → TabBar-67ca442c.js} +3 -1
  186. package/es/{TabBar-10488830.js.map → TabBar-67ca442c.js.map} +1 -1
  187. package/es/{TabBarLinkItem-a9c1072b.js → TabBarLinkItem-e7be54fa.js} +2 -2
  188. package/es/{TabBarLinkItem-a9c1072b.js.map → TabBarLinkItem-e7be54fa.js.map} +1 -1
  189. package/es/Theme-redwood/theme.css +442 -442
  190. package/es/Theme-stable/theme.css +507 -507
  191. package/es/TrainVariants.styles.css +6 -6
  192. package/es/TrainVariants.styles2.css +6 -6
  193. package/es/UNSAFE_CardFlexView.js +1 -1
  194. package/es/UNSAFE_CardGridView.js +1 -1
  195. package/es/UNSAFE_DatePicker.js +4 -4
  196. package/es/UNSAFE_FlatTreeView.js +14 -14
  197. package/es/UNSAFE_InlineSelectSingle.js +2 -2
  198. package/es/UNSAFE_InputDateMask/themes/SegmentStyles.css.js +1 -1
  199. package/es/UNSAFE_InputDateMask.js +1 -1
  200. package/es/UNSAFE_InputDatePicker.js +5 -5
  201. package/es/UNSAFE_InputTimeMask/themes/SegmentStyles.css.js +1 -1
  202. package/es/UNSAFE_InputTimeMask.js +1 -1
  203. package/es/UNSAFE_ListView.js +53 -53
  204. package/es/UNSAFE_NavigationList.js +13 -13
  205. package/es/UNSAFE_OverflowTabBar.js +13 -13
  206. package/es/UNSAFE_RadioItem/themes/redwood/RadioIconTheme.js +1 -1
  207. package/es/UNSAFE_RadioItem/themes/redwood/RadioIconVariants.css.js +1 -1
  208. package/es/UNSAFE_RadioItem/themes/stable/RadioIconTheme.js +1 -1
  209. package/es/UNSAFE_RadioItem/themes/stable/RadioIconVariants.css.js +1 -1
  210. package/es/UNSAFE_RadioItem.js +1 -1
  211. package/es/UNSAFE_ReorderableTabBar.js +12 -12
  212. package/es/UNSAFE_RichSelectionItem.js +1 -1
  213. package/es/UNSAFE_SelectMultiple.js +2 -2
  214. package/es/UNSAFE_SelectSingle.js +3 -3
  215. package/es/UNSAFE_TabBar.js +13 -13
  216. package/es/UNSAFE_TabBarCommon.js +5 -5
  217. package/es/UNSAFE_TabBarMixed.js +12 -12
  218. package/es/UNSAFE_TextArea.js +226 -106
  219. package/es/UNSAFE_TextArea.js.map +1 -1
  220. package/es/UNSAFE_TextAreaAutosize.js +1 -1
  221. package/es/UNSAFE_Train/themes/redwood/TrainTheme.js +1 -1
  222. package/es/UNSAFE_Train/themes/redwood/TrainVariants.css.js +1 -1
  223. package/es/UNSAFE_Train/themes/stable/TrainTheme.js +1 -1
  224. package/es/UNSAFE_Train/themes/stable/TrainVariants.css.js +1 -1
  225. package/es/UNSAFE_Train.js +1 -1
  226. package/es/{YearsGridView-cac4710a.js → YearsGridView-6c18094a.js} +2 -2
  227. package/es/{YearsGridView-cac4710a.js.map → YearsGridView-6c18094a.js.map} +1 -1
  228. package/es/{useDisplayValue-5bbf2830.js → useDisplayValue-65bbc74e.js} +2 -2
  229. package/es/{useDisplayValue-5bbf2830.js.map → useDisplayValue-65bbc74e.js.map} +1 -1
  230. package/es/{useSelectCommon-309d0f07.js → useSelectCommon-a3c69d60.js} +8 -3
  231. package/es/useSelectCommon-a3c69d60.js.map +1 -0
  232. package/es/useTextAreaAltEnter-ac460f4c.js +61 -0
  233. package/es/useTextAreaAltEnter-ac460f4c.js.map +1 -0
  234. package/package.json +2 -2
  235. package/amd/BaseCardView-b8119561.js +0 -2
  236. package/amd/BaseTabBarItem-03c91d3f.js +0 -2
  237. package/amd/BaseTabBarItem-03c91d3f.js.map +0 -1
  238. package/amd/CardFlexView-aa2f3de8.js +0 -2
  239. package/amd/CardGridView-85f90c75.js +0 -2
  240. package/amd/CheckboxSet-f000e5c2.js +0 -2
  241. package/amd/ExpandableList-233c279e.js +0 -2
  242. package/amd/InputDatePicker-48633486.js +0 -2
  243. package/amd/ListView-2678b2af.js +0 -2
  244. package/amd/ReorderableTabBar-46683bcb.js +0 -2
  245. package/amd/StyledDatePickerButton-b664f4f0.js +0 -2
  246. package/amd/StyledDatePickerButton-b664f4f0.js.map +0 -1
  247. package/amd/TabBar-fcebb560.js +0 -2
  248. package/amd/TabBarItem-224bc6b3.js +0 -2
  249. package/amd/TabBarLinkItem-57587dbd.js +0 -2
  250. package/amd/TabBarMixed-8cc4b4ed.js +0 -2
  251. package/amd/VirtualizedListView-a0f338c2.js +0 -2
  252. package/amd/useSelectCommon-28307b63.js +0 -2
  253. package/amd/useSelectCommon-28307b63.js.map +0 -1
  254. package/cjs/CheckboxSetContext-c62db26d.js +0 -12
  255. package/cjs/OverflowTabBarItem-2c967a89.js.map +0 -1
  256. package/cjs/StyledDatePickerButton-cf4e4dc0.js.map +0 -1
  257. package/cjs/useSelectCommon-b0d7feb3.js.map +0 -1
  258. package/es/OverflowTabBarItem-6966fbc7.js.map +0 -1
  259. package/es/StyledDatePickerButton-f3971567.js.map +0 -1
  260. package/es/TextArea-93ce78a7.js +0 -225
  261. package/es/TextArea-93ce78a7.js.map +0 -1
  262. package/es/useSelectCommon-309d0f07.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ExpandableList-233c279e.js","sources":["../../src/UNSAFE_ExpandableList/useExpandCollapse.ts","../../src/UNSAFE_ExpandableList/ExpandableList.tsx"],"sourcesContent":["/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { useCallback } from 'preact/hooks';\nimport { ToggleDetail } from '../UNSAFE_Collection';\nimport { useUser } from '../hooks/UNSAFE_useUser';\nimport { containsKey, Keys } from '../utils/UNSAFE_keys';\n\n/**\n * A hook that handles mouse and keyboard gesture that toggles the expanded state.\n * @param keyExtractor\n * @param expanded\n * @param onToggle\n * @returns\n */\nexport function useExpandCollapse<K>(\n keyExtractor: (element: HTMLElement) => K | null,\n expanded: Keys<K>,\n onToggle?: (detail: ToggleDetail<K>) => void\n) {\n const { direction } = useUser();\n\n const onClick = useCallback(\n (event: MouseEvent) => {\n handleToggle(event, keyExtractor, onToggle);\n },\n [keyExtractor, onToggle]\n );\n\n const onKeyUp = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n handleToggle(event, keyExtractor, onToggle);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n const isRtl = direction === 'rtl';\n const isLeftArrow = event.key === 'ArrowLeft' && !isRtl;\n handleArrowKey(isLeftArrow, event.target as HTMLElement, expanded, keyExtractor, onToggle);\n // arrow key might cause it to scroll horizontally\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [keyExtractor, onToggle, expanded, direction]\n );\n\n return onToggle ? { onClick, onKeyDown, onKeyUp } : {};\n}\n\n// prevent default (propagation) for keyDown to prevent scrolling the container\nconst onKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === 'Enter' ||\n event.key === ' ' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight'\n ) {\n event.preventDefault();\n }\n};\n\nconst handleArrowKey = <K>(\n isLeftArrow: boolean,\n target: HTMLElement,\n expanded: Keys<K>,\n keyExtractor: (element: HTMLElement) => K | null,\n onToggle?: (detail: ToggleDetail<K>) => void\n) => {\n const itemKey = keyExtractor(target);\n if (onToggle && itemKey) {\n const contains = containsKey(expanded, itemKey);\n if ((isLeftArrow && contains) || (!isLeftArrow && !contains)) {\n onToggle({ value: itemKey });\n }\n }\n};\n\nconst handleToggle = <K>(\n event: Event,\n keyExtractor: (element: HTMLElement) => K | null,\n onToggle?: (detail: ToggleDetail<K>) => void\n) => {\n const itemKey = keyExtractor(event.target as HTMLElement);\n if (onToggle && itemKey) {\n onToggle({ value: itemKey });\n if (event.type === 'click') {\n event.stopPropagation();\n }\n }\n};\n","import { ComponentChildren, Fragment } from 'preact';\nimport { useState, useCallback, useRef } from 'preact/hooks';\nimport { memo } from 'preact/compat';\nimport { classNames } from '../utils/UNSAFE_classNames';\nimport {\n CurrentKeyDetail,\n ListItemRendererContext,\n SelectionDetail,\n ToggleDetail,\n FlattenedDataState,\n HierarchicalItemRendererContext\n} from '../UNSAFE_Collection';\nimport { useId } from '../hooks/UNSAFE_useId';\nimport { useTranslationBundle } from '../hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '../resources/nls/bundle';\nimport { Keys, containsKey, isSameKey } from '../utils/UNSAFE_keys';\nimport { Button } from '../UNSAFE_Button';\nimport { HiddenAccessible } from '../UNSAFE_HiddenAccessible';\nimport { ExpandIcon } from '../PRIVATE_ThemedIcons/ExpandIcon';\nimport { CollapseIcon } from '../PRIVATE_ThemedIcons/CollapseIcon';\nimport {\n List,\n ListGroupHeader,\n GROUP_SELECTOR,\n excludeGroup,\n GroupLoadingIndicator\n} from '../PRIVATE_List';\nimport { LiveRegion } from '../UNSAFE_LiveRegion';\nimport { CustomRendererContext, PublicListProps } from '../UNSAFE_ListView/List.types';\nimport { useExpandCollapse } from './useExpandCollapse';\nimport { keyExtractor } from '../utils/PRIVATE_collectionUtils';\n\n// these are the props that are different from ListView\ntype SpecificTypes<K, D> = {\n /**\n * A function to render an item or a group header.\n */\n children: (context: HierarchicalItemRendererContext<K, D>) => ComponentChildren;\n /**\n * A FlattenedDataState object that provides information including data and metadata to this ExpandableList.\n * If the value is null, then ExpandableList will show loading indicator until a FlattenedDataState is set.\n */\n data: FlattenedDataState<K, D> | null;\n /**\n * A function to handle when user performs a gesture that toggles the expansion state of a group header\n */\n onToggle?: (detail: ToggleDetail<K>) => void;\n};\n\n/**\n * Props for the ExpandableList Component, which consist of all props from ListView\n * except some which have different signatures.\n */\ntype ExpandableListProps<K, D> = Omit<PublicListProps<K, D>, 'children' | 'data'> &\n SpecificTypes<K, D>;\n\n/**\n * An ExpandableList shows a two-level group of items where each group header can be expand or collapse.\n */\nexport function ExpandableList<K extends string | number, D>({\n children,\n data,\n onSelectionChange,\n onToggle,\n onPersistCurrentItem,\n ...props\n}: ExpandableListProps<K, D>) {\n const [statusText, setStatusText] = useState('');\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n\n const currentKey = useRef<K>();\n const handleOnPersistCurrentItem = useCallback(\n (detail: CurrentKeyDetail<K>) => {\n currentKey.current = detail.value;\n onPersistCurrentItem?.(detail);\n },\n [onPersistCurrentItem]\n );\n\n const updateStateText = useCallback(\n (detail: ToggleDetail<K>) => {\n onToggle?.(detail);\n if (data) {\n const previouslyExpanded = containsKey(data?.expanded, detail.value);\n setStatusText(\n previouslyExpanded\n ? translations.expandableList_groupCollapse()\n : translations.expandableList_groupExpand()\n );\n // we need to clear the live region text otherwise screenreader\n // won't read again if the content did not change the next time\n setTimeout(() => {\n setStatusText('');\n }, 1000);\n }\n },\n [onToggle, data, translations]\n );\n const expandCollapseProps = useExpandCollapse(\n (element: HTMLElement) => {\n if (element.getAttribute('role') === 'treegrid') {\n return currentKey.current === undefined ? null : currentKey.current;\n }\n return keyExtractor(element, GROUP_SELECTOR) as K;\n },\n data == null ? (emptyKeys as Keys<K>) : data.expanded,\n onToggle && updateStateText\n );\n\n const descId = useId();\n const stableDescIdRef = useRef(descId);\n\n const createHierarchicalContext = <K, D>(\n context: ListItemRendererContext<K, D>,\n options?: { expanded: boolean; onToggle: (detail: ToggleDetail<K>) => void }\n ) => {\n const expanderRenderer =\n options !== undefined\n ? () => (\n <Expander\n itemKey={context.metadata.key}\n expanded={options.expanded}\n onToggle={options.onToggle}\n />\n )\n : undefined;\n\n return {\n ...context,\n parentKey: context.metadata.parentKey,\n leaf: context.metadata.isLeaf ?? true,\n depth: context.metadata.treeDepth ?? 1,\n expander: expanderRenderer\n };\n };\n\n const handleSelectionChange = useCallback(\n (detail: SelectionDetail<K>) => {\n if (onSelectionChange && data) {\n const keys = excludeGroup(data, detail.value);\n if (isSameKey(keys, detail.value)) {\n onSelectionChange(detail);\n } else if (keys.keys && keys.keys.size > 0) {\n onSelectionChange({ ...detail, value: keys });\n }\n }\n },\n [onSelectionChange, data]\n );\n\n const customItemRenderer = (context: CustomRendererContext<K, D>) => {\n const itemKey = context.listItemContext.metadata.key;\n const options =\n data && onToggle ? { expanded: containsKey(data.expanded, itemKey), onToggle } : undefined;\n const itemContext = createHierarchicalContext(context.listItemContext, options);\n if (itemContext.leaf) {\n return context.defaultListItem(itemContext, { itemDepth: itemContext.depth + 1 });\n } else {\n return (\n <ListGroupHeader\n key={itemContext.metadata.key}\n ariaDescribedBy={stableDescIdRef.current}\n itemKey={itemContext.metadata.key}\n itemIndex={itemContext.index}\n itemDepth={itemContext.depth}\n isFocused={context.isFocused}\n isFocusRingVisible={context.isFocusRingVisible}\n isActive={context.isActive}\n isGridlineVisible={false}\n isExpandable={true}\n expandedKeys={data == null ? (emptyKeys as Keys<K>) : data.expanded}\n onToggle={onToggle}>\n {children(itemContext)}\n </ListGroupHeader>\n );\n }\n };\n\n return (\n <Fragment>\n <List\n data={data}\n role=\"treegrid\"\n loadingIndicator={<GroupLoadingIndicator />}\n onSelectionChange={handleSelectionChange}\n customItemRenderer={customItemRenderer}\n onPersistCurrentItem={handleOnPersistCurrentItem}\n {...{ ...props, ...expandCollapseProps }}>\n {(context: ListItemRendererContext<K, D>) => {\n return children(context as HierarchicalItemRendererContext<K, D>);\n }}\n </List>\n {onToggle && (\n <Fragment>\n <LiveRegion>{statusText}</LiveRegion>\n <span id={stableDescIdRef.current}>\n <HiddenAccessible>\n {translations.expandableList_expandCollapseInstructionText()}\n </HiddenAccessible>\n </span>\n </Fragment>\n )}\n </Fragment>\n );\n}\n\nconst emptyKeys = { all: false, keys: new Set() };\n\nconst Expander = memo(\n <K,>(props: { itemKey: K; expanded: boolean; onToggle: (detail: ToggleDetail<K>) => void }) => {\n const classes = classNames(['oj-listview-expander']);\n\n const actionHandler = () => {\n props.onToggle({ value: props.itemKey });\n };\n\n return (\n <span class={classes} role=\"presentation\">\n <Button\n onAction={actionHandler}\n variant=\"ghost\"\n startIcon={props.expanded ? <ExpandIcon size=\"6x\" /> : <CollapseIcon size=\"6x\" />}\n />\n </span>\n );\n },\n (prev: any, next: any) => {\n return (\n prev.itemKey === next.itemKey &&\n prev.expanded === next.expanded &&\n prev.onToggle === next.onToggle\n );\n }\n);\n"],"names":["onKeyDown","event","key","preventDefault","handleArrowKey","isLeftArrow","target","expanded","keyExtractor","onToggle","itemKey","contains","containsKey","value","handleToggle","type","stopPropagation","emptyKeys","all","keys","Set","Expander","memo","props","classes","classNames","_jsx","class","role","children","jsx","Button","onAction","variant","startIcon","ExpandIcon","size","CollapseIcon","prev","next","data","onSelectionChange","onPersistCurrentItem","statusText","setStatusText","useState","translations","useTranslationBundle","currentKey","useRef","handleOnPersistCurrentItem","useCallback","detail","current","updateStateText","previouslyExpanded","expandableList_groupCollapse","expandableList_groupExpand","setTimeout","expandCollapseProps","direction","useUser","onClick","onKeyUp","isRtl","useExpandCollapse","element","getAttribute","undefined","GROUP_SELECTOR","descId","useId","stableDescIdRef","handleSelectionChange","excludeGroup","isSameKey","_jsxs","jsxs","Fragment","List","loadingIndicator","GroupLoadingIndicator","customItemRenderer","context","listItemContext","metadata","options","itemContext","expanderRenderer","parentKey","leaf","isLeaf","depth","treeDepth","expander","createHierarchicalContext","defaultListItem","itemDepth","ListGroupHeader","ariaDescribedBy","itemIndex","index","isFocused","isFocusRingVisible","isActive","isGridlineVisible","isExpandable","expandedKeys","LiveRegion","id","HiddenAccessible","expandableList_expandCollapseInstructionText"],"mappings":"4eAqDA,MAAMA,EAAaC,IAED,UAAdA,EAAMC,KACQ,MAAdD,EAAMC,KACQ,cAAdD,EAAMC,KACQ,eAAdD,EAAMC,KAEND,EAAME,gBACP,EAGGC,EAAiB,CACrBC,EACAC,EACAC,EACAC,EACAC,KAEA,MAAMC,EAAUF,EAAaF,GAC7B,GAAIG,GAAYC,EAAS,CACvB,MAAMC,EAAWC,EAAAA,YAAYL,EAAUG,IAClCL,GAAeM,IAAeN,IAAgBM,IACjDF,EAAS,CAAEI,MAAOH,GAErB,GAGGI,EAAe,CACnBb,EACAO,EACAC,KAEA,MAAMC,EAAUF,EAAaP,EAAMK,QAC/BG,GAAYC,IACdD,EAAS,CAAEI,MAAOH,IACC,UAAfT,EAAMc,MACRd,EAAMe,kBAET,ECmHH,MAAMC,EAAY,CAAEC,KAAK,EAAOC,KAAM,IAAIC,KAEpCC,EAAWC,EAAAA,MACVC,IACH,MAAMC,EAAUC,EAAAA,WAAW,CAAC,yBAM5B,OACEC,EAAAA,YAAMC,MAAOH,EAASI,KAAK,eACzBC,SAAAH,EAAAI,IAACC,EAAMA,OACL,CAAAC,SAPgB,KACpBT,EAAMd,SAAS,CAAEI,MAAOU,EAAMb,SAAU,EAOpCuB,QAAQ,QACRC,UAAWX,EAAMhB,SAAWmB,EAAAA,IAACS,EAAAA,eAAW,CAAAC,KAAK,OAAUV,EAAAI,IAACO,EAAYA,aAAA,CAACD,KAAK,UAG9E,IAEJ,CAACE,EAAWC,IAERD,EAAK5B,UAAY6B,EAAK7B,SACtB4B,EAAK/B,WAAagC,EAAKhC,UACvB+B,EAAK7B,WAAa8B,EAAK9B,sCA3KgCoB,SAC3DA,EAAQW,KACRA,EAAIC,kBACJA,EAAiBhC,SACjBA,EAAQiC,qBACRA,KACGnB,IAEH,MAAOoB,EAAYC,GAAiBC,EAAQA,SAAC,IACvCC,EAAeC,uBAAiC,4BAEhDC,EAAaC,EAAAA,SACbC,EAA6BC,eAChCC,IACCJ,EAAWK,QAAUD,EAAOvC,MAC5B6B,IAAuBU,EAAO,GAEhC,CAACV,IAGGY,EAAkBH,eACrBC,IAEC,GADA3C,IAAW2C,GACPZ,EAAM,CACR,MAAMe,EAAqB3C,EAAAA,YAAY4B,GAAMjC,SAAU6C,EAAOvC,OAC9D+B,EACEW,EACIT,EAAaU,+BACbV,EAAaW,8BAInBC,YAAW,KACTd,EAAc,GAAG,GAChB,IACJ,IAEH,CAACnC,EAAU+B,EAAMM,IAEba,WD9ENnD,EACAD,EACAE,GAEA,MAAMmD,UAAEA,GAAcC,EAAAA,UAEhBC,EAAUX,eACblD,IACCa,EAAab,EAAOO,EAAcC,EAAS,GAE7C,CAACD,EAAcC,IAGXsD,EAAUZ,eACblD,IACC,GAAkB,UAAdA,EAAMC,KAAiC,MAAdD,EAAMC,IACjCY,EAAab,EAAOO,EAAcC,QAC7B,GAAkB,cAAdR,EAAMC,KAAqC,eAAdD,EAAMC,IAAsB,CAClE,MAAM8D,EAAsB,QAAdJ,EACRvD,EAA4B,cAAdJ,EAAMC,MAAwB8D,EAClD5D,EAAeC,EAAaJ,EAAMK,OAAuBC,EAAUC,EAAcC,GAEjFR,EAAME,iBACNF,EAAMe,iBACP,IAEH,CAACR,EAAcC,EAAUF,EAAUqD,IAGrC,OAAOnD,EAAW,CAAEqD,UAAS9D,YAAW+D,WAAY,CAAA,CACtD,CCgD8BE,EACzBC,GACsC,aAAjCA,EAAQC,aAAa,aACOC,IAAvBpB,EAAWK,QAAwB,KAAOL,EAAWK,QAEvD7C,EAAYA,aAAC0D,EAASG,EAAAA,iBAEvB,MAAR7B,EAAgBvB,EAAwBuB,EAAKjC,SAC7CE,GAAY6C,GAGRgB,EAASC,EAAAA,QACTC,EAAkBvB,SAAOqB,GA0BzBG,EAAwBtB,eAC3BC,IACC,GAAIX,GAAqBD,EAAM,CAC7B,MAAMrB,EAAOuD,EAAYA,aAAClC,EAAMY,EAAOvC,OACnC8D,YAAUxD,EAAMiC,EAAOvC,OACzB4B,EAAkBW,GACTjC,EAAKA,MAAQA,EAAKA,KAAKiB,KAAO,GACvCK,EAAkB,IAAKW,EAAQvC,MAAOM,GAEzC,IAEH,CAACsB,EAAmBD,IA+BtB,OACEoC,EAACC,KAAAC,EAAQA,oBACPpD,EAAAA,IAACqD,EAAAA,MACCvC,KAAMA,EACNZ,KAAK,WACLoD,iBAAkBtD,EAAAI,IAACmD,wBAAwB,CAAA,GAC3CxC,kBAAmBgC,EACnBS,mBAnCsBC,IAC1B,MAAMzE,EAAUyE,EAAQC,gBAAgBC,SAASnF,IAC3CoF,EACJ9C,GAAQ/B,EAAW,CAAEF,SAAUK,EAAAA,YAAY4B,EAAKjC,SAAUG,GAAUD,iBAAa2D,EAC7EmB,EA1C0B,EAChCJ,EACAG,KAEA,MAAME,OACQpB,IAAZkB,EACI,IACE5D,EAAAI,IAACT,EAAQ,CACPX,QAASyE,EAAQE,SAASnF,IAC1BK,SAAU+E,EAAQ/E,SAClBE,SAAU6E,EAAQ7E,gBAGtB2D,EAEN,MAAO,IACFe,EACHM,UAAWN,EAAQE,SAASI,UAC5BC,KAAMP,EAAQE,SAASM,SAAU,EACjCC,MAAOT,EAAQE,SAASQ,WAAa,EACrCC,SAAUN,EACX,EAqBmBO,CAA0BZ,EAAQC,gBAAiBE,GACvE,OAAIC,EAAYG,KACPP,EAAQa,gBAAgBT,EAAa,CAAEU,UAAWV,EAAYK,MAAQ,IAG3ElE,EAACI,IAAAoE,mBAECC,gBAAiB3B,EAAgBnB,QACjC3C,QAAS6E,EAAYF,SAASnF,IAC9BkG,UAAWb,EAAYc,MACvBJ,UAAWV,EAAYK,MACvBU,UAAWnB,EAAQmB,UACnBC,mBAAoBpB,EAAQoB,mBAC5BC,SAAUrB,EAAQqB,SAClBC,mBAAmB,EACnBC,cAAc,EACdC,aAAsB,MAARnE,EAAgBvB,EAAwBuB,EAAKjC,SAC3DE,SAAUA,WACToB,EAAS0D,IAZLA,EAAYF,SAASnF,IAe/B,EAWGwC,qBAAsBQ,KACb3B,KAAUoC,WACjBwB,GACOtD,EAASsD,KAGnB1E,GACCmE,EAACC,KAAAC,EAAQA,SACP,CAAAjD,SAAA,CAAAH,EAAAI,IAAC8E,EAAUA,WAAE,CAAA/E,SAAAc,IACbjB,EAAAA,YAAMmF,GAAIrC,EAAgBnB,QAAOxB,SAC/BH,EAACI,IAAAgF,EAAgBA,2BACdhE,EAAaiE,wDAO5B"}
1
+ {"version":3,"file":"ExpandableList-a9a86ad8.js","sources":["../../src/UNSAFE_ExpandableList/useExpandCollapse.ts","../../src/UNSAFE_ExpandableList/ExpandableList.tsx"],"sourcesContent":["/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { useCallback } from 'preact/hooks';\nimport { ToggleDetail } from '../UNSAFE_Collection';\nimport { useUser } from '../hooks/UNSAFE_useUser';\nimport { containsKey, Keys } from '../utils/UNSAFE_keys';\n\n/**\n * A hook that handles mouse and keyboard gesture that toggles the expanded state.\n * @param keyExtractor\n * @param expanded\n * @param onToggle\n * @returns\n */\nexport function useExpandCollapse<K>(\n keyExtractor: (element: HTMLElement) => K | null,\n expanded: Keys<K>,\n onToggle?: (detail: ToggleDetail<K>) => void\n) {\n const { direction } = useUser();\n\n const onClick = useCallback(\n (event: MouseEvent) => {\n handleToggle(event, keyExtractor, onToggle);\n },\n [keyExtractor, onToggle]\n );\n\n const onKeyUp = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n handleToggle(event, keyExtractor, onToggle);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n const isRtl = direction === 'rtl';\n const isLeftArrow = event.key === 'ArrowLeft' && !isRtl;\n handleArrowKey(isLeftArrow, event.target as HTMLElement, expanded, keyExtractor, onToggle);\n // arrow key might cause it to scroll horizontally\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [keyExtractor, onToggle, expanded, direction]\n );\n\n return onToggle ? { onClick, onKeyDown, onKeyUp } : {};\n}\n\n// prevent default (propagation) for keyDown to prevent scrolling the container\nconst onKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === 'Enter' ||\n event.key === ' ' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight'\n ) {\n event.preventDefault();\n }\n};\n\nconst handleArrowKey = <K>(\n isLeftArrow: boolean,\n target: HTMLElement,\n expanded: Keys<K>,\n keyExtractor: (element: HTMLElement) => K | null,\n onToggle?: (detail: ToggleDetail<K>) => void\n) => {\n const itemKey = keyExtractor(target);\n if (onToggle && itemKey) {\n const contains = containsKey(expanded, itemKey);\n if ((isLeftArrow && contains) || (!isLeftArrow && !contains)) {\n onToggle({ value: itemKey });\n }\n }\n};\n\nconst handleToggle = <K>(\n event: Event,\n keyExtractor: (element: HTMLElement) => K | null,\n onToggle?: (detail: ToggleDetail<K>) => void\n) => {\n const itemKey = keyExtractor(event.target as HTMLElement);\n if (onToggle && itemKey) {\n onToggle({ value: itemKey });\n if (event.type === 'click') {\n event.stopPropagation();\n }\n }\n};\n","import { ComponentChildren, Fragment } from 'preact';\nimport { useState, useCallback, useRef } from 'preact/hooks';\nimport { memo } from 'preact/compat';\nimport { classNames } from '../utils/UNSAFE_classNames';\nimport {\n CurrentKeyDetail,\n ListItemRendererContext,\n SelectionDetail,\n ToggleDetail,\n FlattenedDataState,\n HierarchicalItemRendererContext\n} from '../UNSAFE_Collection';\nimport { useId } from '../hooks/UNSAFE_useId';\nimport { useTranslationBundle } from '../hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '../resources/nls/bundle';\nimport { Keys, containsKey, isSameKey } from '../utils/UNSAFE_keys';\nimport { Button } from '../UNSAFE_Button';\nimport { HiddenAccessible } from '../UNSAFE_HiddenAccessible';\nimport { ExpandIcon } from '../PRIVATE_ThemedIcons/ExpandIcon';\nimport { CollapseIcon } from '../PRIVATE_ThemedIcons/CollapseIcon';\nimport {\n List,\n ListGroupHeader,\n GROUP_SELECTOR,\n excludeGroup,\n GroupLoadingIndicator\n} from '../PRIVATE_List';\nimport { LiveRegion } from '../UNSAFE_LiveRegion';\nimport { CustomRendererContext, PublicListProps } from '../UNSAFE_ListView/List.types';\nimport { useExpandCollapse } from './useExpandCollapse';\nimport { keyExtractor } from '../utils/PRIVATE_collectionUtils';\n\n// these are the props that are different from ListView\ntype SpecificTypes<K, D> = {\n /**\n * A function to render an item or a group header.\n */\n children: (context: HierarchicalItemRendererContext<K, D>) => ComponentChildren;\n /**\n * A FlattenedDataState object that provides information including data and metadata to this ExpandableList.\n * If the value is null, then ExpandableList will show loading indicator until a FlattenedDataState is set.\n */\n data: FlattenedDataState<K, D> | null;\n /**\n * A function to handle when user performs a gesture that toggles the expansion state of a group header\n */\n onToggle?: (detail: ToggleDetail<K>) => void;\n};\n\n/**\n * Props for the ExpandableList Component, which consist of all props from ListView\n * except some which have different signatures.\n */\ntype ExpandableListProps<K, D> = Omit<PublicListProps<K, D>, 'children' | 'data'> &\n SpecificTypes<K, D>;\n\n/**\n * An ExpandableList shows a two-level group of items where each group header can be expand or collapse.\n */\nexport function ExpandableList<K extends string | number, D>({\n children,\n data,\n onSelectionChange,\n onToggle,\n onPersistCurrentItem,\n ...props\n}: ExpandableListProps<K, D>) {\n const [statusText, setStatusText] = useState('');\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n\n const currentKey = useRef<K>();\n const handleOnPersistCurrentItem = useCallback(\n (detail: CurrentKeyDetail<K>) => {\n currentKey.current = detail.value;\n onPersistCurrentItem?.(detail);\n },\n [onPersistCurrentItem]\n );\n\n const updateStateText = useCallback(\n (detail: ToggleDetail<K>) => {\n onToggle?.(detail);\n if (data) {\n const previouslyExpanded = containsKey(data?.expanded, detail.value);\n setStatusText(\n previouslyExpanded\n ? translations.expandableList_groupCollapse()\n : translations.expandableList_groupExpand()\n );\n // we need to clear the live region text otherwise screenreader\n // won't read again if the content did not change the next time\n setTimeout(() => {\n setStatusText('');\n }, 1000);\n }\n },\n [onToggle, data, translations]\n );\n const expandCollapseProps = useExpandCollapse(\n (element: HTMLElement) => {\n if (element.getAttribute('role') === 'treegrid') {\n return currentKey.current === undefined ? null : currentKey.current;\n }\n return keyExtractor(element, GROUP_SELECTOR) as K;\n },\n data == null ? (emptyKeys as Keys<K>) : data.expanded,\n onToggle && updateStateText\n );\n\n const descId = useId();\n const stableDescIdRef = useRef(descId);\n\n const createHierarchicalContext = <K, D>(\n context: ListItemRendererContext<K, D>,\n options?: { expanded: boolean; onToggle: (detail: ToggleDetail<K>) => void }\n ) => {\n const expanderRenderer =\n options !== undefined\n ? () => (\n <Expander\n itemKey={context.metadata.key}\n expanded={options.expanded}\n onToggle={options.onToggle}\n />\n )\n : undefined;\n\n return {\n ...context,\n parentKey: context.metadata.parentKey,\n leaf: context.metadata.isLeaf ?? true,\n depth: context.metadata.treeDepth ?? 1,\n expander: expanderRenderer\n };\n };\n\n const handleSelectionChange = useCallback(\n (detail: SelectionDetail<K>) => {\n if (onSelectionChange && data) {\n const keys = excludeGroup(data, detail.value);\n if (isSameKey(keys, detail.value)) {\n onSelectionChange(detail);\n } else if (keys.keys && keys.keys.size > 0) {\n onSelectionChange({ ...detail, value: keys });\n }\n }\n },\n [onSelectionChange, data]\n );\n\n const customItemRenderer = (context: CustomRendererContext<K, D>) => {\n const itemKey = context.listItemContext.metadata.key;\n const options =\n data && onToggle ? { expanded: containsKey(data.expanded, itemKey), onToggle } : undefined;\n const itemContext = createHierarchicalContext(context.listItemContext, options);\n if (itemContext.leaf) {\n return context.defaultListItem(itemContext, { itemDepth: itemContext.depth + 1 });\n } else {\n return (\n <ListGroupHeader\n key={itemContext.metadata.key}\n ariaDescribedBy={stableDescIdRef.current}\n itemKey={itemContext.metadata.key}\n itemIndex={itemContext.index}\n itemDepth={itemContext.depth}\n isFocused={context.isFocused}\n isFocusRingVisible={context.isFocusRingVisible}\n isActive={context.isActive}\n isGridlineVisible={false}\n isExpandable={true}\n expandedKeys={data == null ? (emptyKeys as Keys<K>) : data.expanded}\n onToggle={onToggle}>\n {children(itemContext)}\n </ListGroupHeader>\n );\n }\n };\n\n return (\n <Fragment>\n <List\n data={data}\n role=\"treegrid\"\n loadingIndicator={<GroupLoadingIndicator />}\n onSelectionChange={handleSelectionChange}\n customItemRenderer={customItemRenderer}\n onPersistCurrentItem={handleOnPersistCurrentItem}\n {...{ ...props, ...expandCollapseProps }}>\n {(context: ListItemRendererContext<K, D>) => {\n return children(context as HierarchicalItemRendererContext<K, D>);\n }}\n </List>\n {onToggle && (\n <Fragment>\n <LiveRegion>{statusText}</LiveRegion>\n <span id={stableDescIdRef.current}>\n <HiddenAccessible>\n {translations.expandableList_expandCollapseInstructionText()}\n </HiddenAccessible>\n </span>\n </Fragment>\n )}\n </Fragment>\n );\n}\n\nconst emptyKeys = { all: false, keys: new Set() };\n\nconst Expander = memo(\n <K,>(props: { itemKey: K; expanded: boolean; onToggle: (detail: ToggleDetail<K>) => void }) => {\n const classes = classNames(['oj-listview-expander']);\n\n const actionHandler = () => {\n props.onToggle({ value: props.itemKey });\n };\n\n return (\n <span class={classes} role=\"presentation\">\n <Button\n onAction={actionHandler}\n variant=\"ghost\"\n startIcon={props.expanded ? <ExpandIcon size=\"6x\" /> : <CollapseIcon size=\"6x\" />}\n />\n </span>\n );\n },\n (prev: any, next: any) => {\n return (\n prev.itemKey === next.itemKey &&\n prev.expanded === next.expanded &&\n prev.onToggle === next.onToggle\n );\n }\n);\n"],"names":["onKeyDown","event","key","preventDefault","handleArrowKey","isLeftArrow","target","expanded","keyExtractor","onToggle","itemKey","contains","containsKey","value","handleToggle","type","stopPropagation","emptyKeys","all","keys","Set","Expander","memo","props","classes","classNames","_jsx","class","role","children","jsx","Button","onAction","variant","startIcon","ExpandIcon","size","CollapseIcon","prev","next","data","onSelectionChange","onPersistCurrentItem","statusText","setStatusText","useState","translations","useTranslationBundle","currentKey","useRef","handleOnPersistCurrentItem","useCallback","detail","current","updateStateText","previouslyExpanded","expandableList_groupCollapse","expandableList_groupExpand","setTimeout","expandCollapseProps","direction","useUser","onClick","onKeyUp","isRtl","useExpandCollapse","element","getAttribute","undefined","GROUP_SELECTOR","descId","useId","stableDescIdRef","handleSelectionChange","excludeGroup","isSameKey","_jsxs","jsxs","Fragment","List","loadingIndicator","GroupLoadingIndicator","customItemRenderer","context","listItemContext","metadata","options","itemContext","expanderRenderer","parentKey","leaf","isLeaf","depth","treeDepth","expander","createHierarchicalContext","defaultListItem","itemDepth","ListGroupHeader","ariaDescribedBy","itemIndex","index","isFocused","isFocusRingVisible","isActive","isGridlineVisible","isExpandable","expandedKeys","LiveRegion","id","HiddenAccessible","expandableList_expandCollapseInstructionText"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- define(['exports', 'preact/jsx-runtime', 'preact/hooks', './mergeProps-bcfa6a92', './collectionUtils-77dc5fa1', './LoadMoreCollection-895f1ed5', './classNames-08d99695', './TabbableModeContext-a9c97640', './useId-c9578d26', './View-35699bb2', './UNSAFE_FlatTreeView/themes/TreeViewStyles.css', './UNSAFE_FlatTreeView/themes/TreeViewContract.css', './Flex-4b81b412', './Skeleton-3e52c94a', './useHover-8b8a1496', './clientHints-6d361eaa', './Expander-8808dc90', './UNSAFE_FlatTreeView/themes/redwood/TreeViewTheme.css', './useSelection-aecb6b23', './useAdditiveSelection-4c04d01c', './ReorderableContext-6d10a1b7', './keys-4755c121', './LayerHost-0b288129', 'preact/compat', './useExpandCollapse-41860b2a', './useComponentTheme-5aa41a8f', './useUser-08901aba', './useNavigation-4d87e7e6', './Selector-b38f6c0c', './LiveRegion-dbefb95b', './HiddenAccessible-037ef42d', './useTranslationBundle-e4dd341e'], (function(e,t,n,a,r,l,i,s,o,d,c,u,x,m,y,g,b,p,v,h,f,j,k,S,w,C,T,K,A,F,E,V){"use strict";function I({children:e,indentation:a=0}){const[r,l]=n.useState(!1);return n.useEffect((()=>{setTimeout((()=>{l(!0)}),50)}),[]),r&&e?t.jsx("div",{role:"presentation",children:t.jsx(d.View,{paddingInlineStart:a,children:[...Array(1)].map(((t,n)=>e(n)))})}):null}function M({indentation:e=0,isLeaf:n=!1}){return t.jsx(d.View,{paddingInlineStart:P(e,!n||void 0),children:t.jsx(d.View,{padding:[0,"4px"],children:t.jsxs(x.Flex,{height:"9x",align:"center",gap:"2x",children:[!n&&t.jsx(m.Skeleton,{width:"6x",height:"6x",borderRadius:"4px"}),t.jsx(m.Skeleton,{height:"5x",borderRadius:"4px"})]})})})}function N(){return t.jsxs(t.Fragment,{children:[t.jsx(M,{}),t.jsx(M,{indentation:1}),t.jsx(M,{indentation:2,isLeaf:!0})]})}function L({itemKey:e,depth:a,context:r,children:l,isExpanded:u,onToggle:m,selected:g,isSelectable:p,isCheckboxless:v,isTabbable:h,isLoading:f,isFocusRingVisible:j}){const k=n.useRef(null),S=P(a,u),w=P(a+1,u),{isHover:C,hoverProps:T}=y.useHover(),K=i.classNames([c.styles.treeItemStyles.base,j&&c.styles.treeItemStyles.focused,!0===g&&c.styles.treeItemStyles.selected,!0===g&&v&&c.styles.treeItemStyles.checkboxlessSelected,p&&!g&&C&&c.styles.treeItemStyles.hovered]);return t.jsxs(t.Fragment,{children:[t.jsx("div",{ref:k,id:o.useId(),tabIndex:R()?-1:void 0,"data-oj-key":e,"data-oj-tree-item":"",class:K,role:"treeitem","aria-level":a+1,"aria-selected":g?"true":"false",...void 0!==u&&{"aria-expanded":u},..."number"==typeof e&&{"data-oj-key-type":"number"},...T,children:t.jsxs(t.Fragment,{children:[!0===g&&C&&t.jsx("div",{class:c.styles.selectedHoveredOverlay}),t.jsx(s.TabbableModeContext.Provider,{value:{isTabbable:h},children:t.jsx(d.View,{paddingInlineStart:S,children:t.jsxs(x.Flex,{align:"center",children:[void 0!==u&&t.jsx(b.Expander,{itemKey:e,expanded:u,onToggle:m}),l(r)]})})})]})}),f?t.jsx(I,{indentation:w,children:()=>t.jsx(N,{})}):null]})}const R=()=>{const{platform:e}=g.getClientHints();return"ios"===e||"android"===e},P=(e,t)=>{const n=void 0===t?"40px":"0px";return`calc(${Math.max(0,e)} * ${u.treeViewVars.indentWidth} + ${n})`};function H({children:e,minimumCount:a=1,onSkeletonVisible:r}){const[l,s]=n.useState(!1);n.useEffect((()=>{setTimeout((()=>{s(!0),r?.()}),50)}),[r]);const o=i.classNames([c.styles.skeletonStyles.container]);return l&&e?t.jsx("div",{class:o,role:"presentation",children:[...Array(a)].map(((t,n)=>e(n)))}):null}function U({data:e,children:n,selectionMode:a,onToggle:r=()=>{},viewportConfig:i,hasMore:s=!1,onLoadMore:o=()=>{},loadMoreIndicator:d=D,updateContext:c}){return t.jsx(t.Fragment,{children:null===e?null:t.jsx(l.LoadMoreCollection,{data:e,viewportConfig:i,hasMore:s,onLoadMore:o,loadMoreIndicator:d,children:e=>{const l=e.data.metadata.key,i={index:e.index,data:e.data.data,metadata:{key:l}};c&&c(i);const s=e.data.metadata.expanded;return t.jsx(L,{itemKey:i.metadata.key,context:i,depth:e.data.metadata.treeDepth,isExpanded:"ongoing"===s||s,onToggle:r,isSelectable:"none"!==a,isCheckboxless:"single"===a,selected:e.data.metadata.selected,isLoading:"ongoing"===s,isTabbable:!1,isFocusRingVisible:e.data.metadata.hasFocus,children:n},i.metadata.key)}})})}const D=t.jsx("div",{class:l.LOADMORE_STYLE_CLASS,children:t.jsx(H,{minimumCount:1,children:()=>t.jsx(N,{})})}),_="[data-oj-tree-item]";const B=(e,t,n,a)=>{if(e&&null!==t){const r=Array.from(e.querySelectorAll(a)),l=r.findIndex((e=>e.dataset.ojKey==t));for(let e=l;e>=0;e--){const t=r[e].getAttribute("aria-level");if(null!==t&&Number(t)==n-1)return r[e]}}return null};const O=e=>t.jsx(H,{minimumCount:8,onSkeletonVisible:e,children:()=>t.jsx(N,{})}),$=e=>e.id,q=(e,t)=>{const n=t.map((e=>e.metadata.key)),a=n.indexOf(e.value.start),r=n.indexOf(e.value.end),l=Math.min(a,r),i=Math.max(a,r);return-1===l?{offset:0,count:-1}:n.slice(l,i+1)};e.FlatTreeView=function({"aria-label":e,"aria-labelledby":l,"aria-describedby":i,data:s,selectionMode:d="none",selectedKeys:c={all:!1,keys:new Set},onSelectionChange:u,onToggle:x,viewportConfig:m,...y}){const g=n.useRef(null),[b,f]=n.useState(),{collection_loading:k,collection_loaded:S}=V.useTranslationBundle("@oracle/oraclejet-preact"),I=o.useId(),M=n.useCallback((e=>{if(g.current){const t=r.findElementByKey(g.current,e,_);return"true"===t?.getAttribute("aria-expanded")}return!1}),[]),{treeNavigationProps:N,currentKey:L,showFocusRing:P}=function(e,t,l,i){const{direction:s}=T.useUser(),o={ArrowUp:e=>r.getPrevNextKey(t.current,e,!0,_),ArrowDown:e=>r.getPrevNextKey(t.current,e,!1,_)},{navigationProps:d,currentKey:c,onCurrentKeyChange:u,showFocusRing:x}=K.useNavigation(e,t,i,_,o,void 0,void 0,void 0,void 0,!0,!1,!0,!1),m=n.useCallback((e=>"tree"===e.getAttribute("role")?void 0===c?null:c:r.keyExtractor(e,_)),[c,r.keyExtractor]),y=n.useCallback((e=>{if("ArrowLeft"===e.key||"ArrowRight"===e.key){const n="rtl"===s,a="ArrowLeft"===e.key&&!n,i=m(e.target);if(i){const e=l(i);if(a&&!e&&t.current){const e=r.findElementByKey(t.current,i,_);if(e){const n=e.getAttribute("aria-level"),a=null!==n&&B(t.current,i,Number(n),_),r=a&&m(a);j.isKeyDefined(r)&&u?.({value:r})}}else if(!a&&e){const e=r.getPrevNextKey(t.current,i,!1,_)();j.isKeyDefined(e)&&u?.({value:e})}}}}),[s,l,u,m]);return{treeNavigationProps:a.mergeProps(d,{onKeyUp:y}),currentKey:c,showFocusRing:x}}(s,g,M,$),H=n.useMemo((()=>s?.map((e=>{const t=e.metadata.key,n={...e};return n.metadata.selected=j.containsKey(c,t),n.metadata.hasFocus=L===t&&P,n}))||[]),[s,c,L,P]),D=w.useExpandCollapse((e=>"tree"===e.getAttribute("role")?void 0===L?null:L:r.keyExtractor(e,_)),M,x,!0),z=n.useRef(),W=n.useCallback((e=>{u&&(!1===e.value.all&&e.value.keys.size>0&&(z.current=Array.from(e.value.keys.values()).pop()),u(e))}),[z,u]),Y=n.useCallback((e=>{if(s&&u){const t=q(e,s);if(Array.isArray(t))if("shiftSpace"===e.eventType?z.current=e.value.start:z.current=e.value.end,"multipleToggle"===d){const e=j.addKeys(c,t);u({value:e,target:null})}else u({value:{all:!1,keys:new Set(t)},target:null})}}),[s,c,u]),{selectionProps:G}=v.useSelection((e=>e===g.current?void 0===L?null:L:r.keyExtractor(e,_)),c,"multipleToggle"===d?"none":d,!1,"replace",W,z.current,L,((e,t)=>r.getPrevNextKey(g.current,e,t,_)),void 0,(e=>{if(g.current){const t=r.findElementByKey(g.current,e,_);t&&t.scrollIntoView({block:"nearest"})}}),Y),{eventProps:J}=h.useAdditiveSelection((e=>e===g.current?void 0===L?null:L:r.keyExtractor(e,_)),c,"multipleToggle"===d?"multiple":"none",!1,(e=>s?s.findIndex((t=>t.metadata.key===e)):-1),((e,t)=>{if(s){return s.map((e=>e.metadata.key)).slice(e,t)}return[]}),((e,t)=>r.getPrevNextKey(g.current,e,t,_)),L,W,Y),Q=n.useCallback((e=>{"multiple"!==d&&"multipleToggle"!==d||u&&(e.metaKey||e.ctrlKey)&&"a"===e.key&&(e.preventDefault(),u({value:{all:!0,deletedKeys:new Set},target:e.target}))}),[u,d]),{classes:X}=C.useComponentTheme(p.TreeViewRedwoodTheme);m=r.getViewportConfig(g,m);const Z=n.useCallback((e=>{const n=e.metadata.key;e.selector="none"===d||"single"===d?void 0:e=>t.jsx("div",{"aria-hidden":!R()||void 0,children:t.jsx(A.Selector,{"aria-label":R()?e:void 0,rowKey:n,selectedKeys:c,onChange:u})})}),[d,c,u]),ee=n.useCallback((()=>{f(k())}),[k]);return t.jsxs(t.Fragment,{children:[t.jsx("div",{"aria-label":e,"aria-labelledby":l,"aria-describedby":null==s?i?[...new Set(i.split(/\s+/).concat(I))].join(" "):I:i,ref:g,role:"tree","aria-multiselectable":"multiple"===d,tabIndex:0,class:X,...a.mergeProps(N,G,J,D,{onKeyDown:Q}),children:null==s?O(ee):t.jsx(U,{data:H,selectionMode:d,onToggle:x,viewportConfig:m,updateContext:Z,...y})}),t.jsx(E.HiddenAccessible,{id:I,children:k()}),t.jsx(F.LiveRegion,{children:null==s?b:b===k()?S():""})]})}}));
2
- //# sourceMappingURL=FlatTreeView-9ecf2be6.js.map
1
+ define(['exports', 'preact/jsx-runtime', 'preact/hooks', './mergeProps-bcfa6a92', './collectionUtils-77dc5fa1', './LoadMoreCollection-895f1ed5', './classNames-08d99695', './TabbableModeContext-a9c97640', './useId-c9578d26', './View-35699bb2', './UNSAFE_FlatTreeView/themes/TreeViewStyles.css', './UNSAFE_FlatTreeView/themes/TreeViewContract.css', './Expander-8808dc90', './Flex-4b81b412', './Skeleton-3e52c94a', './useHover-8b8a1496', './clientHints-6d361eaa', './UNSAFE_FlatTreeView/themes/redwood/TreeViewTheme.css', './useSelection-aecb6b23', './useAdditiveSelection-4c04d01c', './ReorderableContext-6d10a1b7', './keys-4755c121', './LayerHost-0b288129', 'preact/compat', './useExpandCollapse-41860b2a', './useComponentTheme-5aa41a8f', './useUser-08901aba', './useNavigation-4d87e7e6', './Selector-b38f6c0c', './LiveRegion-dbefb95b', './HiddenAccessible-037ef42d', './useTranslationBundle-e4dd341e'], (function(e,t,n,a,r,l,i,s,o,d,c,u,x,m,y,g,b,p,v,h,f,j,k,S,w,C,T,K,A,F,E,V){"use strict";function I({children:e,indentation:a=0}){const[r,l]=n.useState(!1);return n.useEffect((()=>{setTimeout((()=>{l(!0)}),50)}),[]),r&&e?t.jsx("div",{role:"presentation",children:t.jsx(d.View,{paddingInlineStart:a,children:[...Array(1)].map(((t,n)=>e(n)))})}):null}function M({indentation:e=0,isLeaf:n=!1}){return t.jsx(d.View,{paddingInlineStart:P(e,!n||void 0),children:t.jsx(d.View,{padding:[0,"4px"],children:t.jsxs(m.Flex,{height:"9x",align:"center",gap:"2x",children:[!n&&t.jsx(y.Skeleton,{width:"6x",height:"6x",borderRadius:"4px"}),t.jsx(y.Skeleton,{height:"5x",borderRadius:"4px"})]})})})}function N(){return t.jsxs(t.Fragment,{children:[t.jsx(M,{}),t.jsx(M,{indentation:1}),t.jsx(M,{indentation:2,isLeaf:!0})]})}function L({itemKey:e,depth:a,context:r,children:l,isExpanded:u,onToggle:y,selected:b,isSelectable:p,isCheckboxless:v,isTabbable:h,isLoading:f,isFocusRingVisible:j}){const k=n.useRef(null),S=P(a,u),w=P(a+1,u),{isHover:C,hoverProps:T}=g.useHover(),K=i.classNames([c.styles.treeItemStyles.base,j&&c.styles.treeItemStyles.focused,!0===b&&c.styles.treeItemStyles.selected,!0===b&&v&&c.styles.treeItemStyles.checkboxlessSelected,p&&!b&&C&&c.styles.treeItemStyles.hovered]);return t.jsxs(t.Fragment,{children:[t.jsx("div",{ref:k,id:o.useId(),tabIndex:R()?-1:void 0,"data-oj-key":e,"data-oj-tree-item":"",class:K,role:"treeitem","aria-level":a+1,"aria-selected":b?"true":"false",...void 0!==u&&{"aria-expanded":u},..."number"==typeof e&&{"data-oj-key-type":"number"},...T,children:t.jsxs(t.Fragment,{children:[!0===b&&C&&t.jsx("div",{class:c.styles.selectedHoveredOverlay}),t.jsx(s.TabbableModeContext.Provider,{value:{isTabbable:h},children:t.jsx(d.View,{paddingInlineStart:S,children:t.jsxs(m.Flex,{align:"center",children:[void 0!==u&&t.jsx(x.Expander,{itemKey:e,expanded:u,onToggle:y}),l(r)]})})})]})}),f?t.jsx(I,{indentation:w,children:()=>t.jsx(N,{})}):null]})}const R=()=>{const{platform:e}=b.getClientHints();return"ios"===e||"android"===e},P=(e,t)=>{const n=void 0===t?"40px":"0px";return`calc(${Math.max(0,e)} * ${u.treeViewVars.indentWidth} + ${n})`};function H({children:e,minimumCount:a=1,onSkeletonVisible:r}){const[l,s]=n.useState(!1);n.useEffect((()=>{setTimeout((()=>{s(!0),r?.()}),50)}),[r]);const o=i.classNames([c.styles.skeletonStyles.container]);return l&&e?t.jsx("div",{class:o,role:"presentation",children:[...Array(a)].map(((t,n)=>e(n)))}):null}function U({data:e,children:n,selectionMode:a,onToggle:r=()=>{},viewportConfig:i,hasMore:s=!1,onLoadMore:o=()=>{},loadMoreIndicator:d=D,updateContext:c}){return t.jsx(t.Fragment,{children:null===e?null:t.jsx(l.LoadMoreCollection,{data:e,viewportConfig:i,hasMore:s,onLoadMore:o,loadMoreIndicator:d,children:e=>{const l=e.data.metadata.key,i={index:e.index,data:e.data.data,metadata:{key:l}};c&&c(i);const s=e.data.metadata.expanded;return t.jsx(L,{itemKey:i.metadata.key,context:i,depth:e.data.metadata.treeDepth,isExpanded:"ongoing"===s||s,onToggle:r,isSelectable:"none"!==a,isCheckboxless:"single"===a,selected:e.data.metadata.selected,isLoading:"ongoing"===s,isTabbable:!1,isFocusRingVisible:e.data.metadata.hasFocus,children:n},i.metadata.key)}})})}const D=t.jsx("div",{class:l.LOADMORE_STYLE_CLASS,children:t.jsx(H,{minimumCount:1,children:()=>t.jsx(N,{})})}),_="[data-oj-tree-item]";const B=(e,t,n,a)=>{if(e&&null!==t){const r=Array.from(e.querySelectorAll(a)),l=r.findIndex((e=>e.dataset.ojKey==t));for(let e=l;e>=0;e--){const t=r[e].getAttribute("aria-level");if(null!==t&&Number(t)==n-1)return r[e]}}return null};const O=e=>t.jsx(H,{minimumCount:8,onSkeletonVisible:e,children:()=>t.jsx(N,{})}),$=e=>e.id,q=(e,t)=>{const n=t.map((e=>e.metadata.key)),a=n.indexOf(e.value.start),r=n.indexOf(e.value.end),l=Math.min(a,r),i=Math.max(a,r);return-1===l?{offset:0,count:-1}:n.slice(l,i+1)};e.FlatTreeView=function({"aria-label":e,"aria-labelledby":l,"aria-describedby":i,data:s,selectionMode:d="none",selectedKeys:c={all:!1,keys:new Set},onSelectionChange:u,onToggle:x,viewportConfig:m,...y}){const g=n.useRef(null),[b,f]=n.useState(),{collection_loading:k,collection_loaded:S}=V.useTranslationBundle("@oracle/oraclejet-preact"),I=o.useId(),M=n.useCallback((e=>{if(g.current){const t=r.findElementByKey(g.current,e,_);return"true"===t?.getAttribute("aria-expanded")}return!1}),[]),{treeNavigationProps:N,currentKey:L,showFocusRing:P}=function(e,t,l,i){const{direction:s}=T.useUser(),o={ArrowUp:e=>r.getPrevNextKey(t.current,e,!0,_),ArrowDown:e=>r.getPrevNextKey(t.current,e,!1,_)},{navigationProps:d,currentKey:c,onCurrentKeyChange:u,showFocusRing:x}=K.useNavigation(e,t,i,_,o,void 0,void 0,void 0,void 0,!0,!1,!0,!1),m=n.useCallback((e=>"tree"===e.getAttribute("role")?void 0===c?null:c:r.keyExtractor(e,_)),[c,r.keyExtractor]),y=n.useCallback((e=>{if("ArrowLeft"===e.key||"ArrowRight"===e.key){const n="rtl"===s,a="ArrowLeft"===e.key&&!n,i=m(e.target);if(i){const e=l(i);if(a&&!e&&t.current){const e=r.findElementByKey(t.current,i,_);if(e){const n=e.getAttribute("aria-level"),a=null!==n&&B(t.current,i,Number(n),_),r=a&&m(a);j.isKeyDefined(r)&&u?.({value:r})}}else if(!a&&e){const e=r.getPrevNextKey(t.current,i,!1,_)();j.isKeyDefined(e)&&u?.({value:e})}}}}),[s,l,u,m]);return{treeNavigationProps:a.mergeProps(d,{onKeyUp:y}),currentKey:c,showFocusRing:x}}(s,g,M,$),H=n.useMemo((()=>s?.map((e=>{const t=e.metadata.key,n={...e};return n.metadata.selected=j.containsKey(c,t),n.metadata.hasFocus=L===t&&P,n}))||[]),[s,c,L,P]),D=w.useExpandCollapse((e=>"tree"===e.getAttribute("role")?void 0===L?null:L:r.keyExtractor(e,_)),M,x,!0),z=n.useRef(),W=n.useCallback((e=>{u&&(!1===e.value.all&&e.value.keys.size>0&&(z.current=Array.from(e.value.keys.values()).pop()),u(e))}),[z,u]),Y=n.useCallback((e=>{if(s&&u){const t=q(e,s);if(Array.isArray(t))if("shiftSpace"===e.eventType?z.current=e.value.start:z.current=e.value.end,"multipleToggle"===d){const e=j.addKeys(c,t);u({value:e,target:null})}else u({value:{all:!1,keys:new Set(t)},target:null})}}),[s,c,u]),{selectionProps:G}=v.useSelection((e=>e===g.current?void 0===L?null:L:r.keyExtractor(e,_)),c,"multipleToggle"===d?"none":d,!1,"replace",W,z.current,L,((e,t)=>r.getPrevNextKey(g.current,e,t,_)),void 0,(e=>{if(g.current){const t=r.findElementByKey(g.current,e,_);t&&t.scrollIntoView({block:"nearest"})}}),Y),{eventProps:J}=h.useAdditiveSelection((e=>e===g.current?void 0===L?null:L:r.keyExtractor(e,_)),c,"multipleToggle"===d?"multiple":"none",!1,(e=>s?s.findIndex((t=>t.metadata.key===e)):-1),((e,t)=>{if(s){return s.map((e=>e.metadata.key)).slice(e,t)}return[]}),((e,t)=>r.getPrevNextKey(g.current,e,t,_)),L,W,Y),Q=n.useCallback((e=>{"multiple"!==d&&"multipleToggle"!==d||u&&(e.metaKey||e.ctrlKey)&&"a"===e.key&&(e.preventDefault(),u({value:{all:!0,deletedKeys:new Set},target:e.target}))}),[u,d]),{classes:X}=C.useComponentTheme(p.TreeViewRedwoodTheme);m=r.getViewportConfig(g,m);const Z=n.useCallback((e=>{const n=e.metadata.key;e.selector="none"===d||"single"===d?void 0:e=>t.jsx("div",{"aria-hidden":!R()||void 0,children:t.jsx(A.Selector,{"aria-label":R()?e:void 0,rowKey:n,selectedKeys:c,onChange:u})})}),[d,c,u]),ee=n.useCallback((()=>{f(k())}),[k]);return t.jsxs(t.Fragment,{children:[t.jsx("div",{"aria-label":e,"aria-labelledby":l,"aria-describedby":null==s?i?[...new Set(i.split(/\s+/).concat(I))].join(" "):I:i,ref:g,role:"tree","aria-multiselectable":"multiple"===d,tabIndex:0,class:X,...a.mergeProps(N,G,J,D,{onKeyDown:Q}),children:null==s?O(ee):t.jsx(U,{data:H,selectionMode:d,onToggle:x,viewportConfig:m,updateContext:Z,...y})}),t.jsx(E.HiddenAccessible,{id:I,children:k()}),t.jsx(F.LiveRegion,{children:null==s?b:b===k()?S():""})]})}}));
2
+ //# sourceMappingURL=FlatTreeView-15edd439.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FlatTreeView-9ecf2be6.js","sources":["../../src/UNSAFE_FlatTreeView/NodeSkeletonContainer.tsx","../../src/UNSAFE_FlatTreeView/TreeItemSkeletons.tsx","../../src/UNSAFE_FlatTreeView/TreeItem.tsx","../../src/UNSAFE_FlatTreeView/SkeletonContainer.tsx","../../src/UNSAFE_FlatTreeView/LoadMoreTreeCollection.tsx","../../src/UNSAFE_FlatTreeView/TreeViewUtils.ts","../../src/UNSAFE_FlatTreeView/useTreeNavigation.ts","../../src/UNSAFE_FlatTreeView/FlatTreeView.tsx"],"sourcesContent":["/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { ComponentChildren } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { Size } from '#utils/UNSAFE_size';\nimport { View } from '#UNSAFE_View';\n\ntype Props = {\n /**\n * Allows to pass and access the properties from child elements\n **/\n children?: (index: number) => ComponentChildren;\n indentation?: Size;\n};\n\n/**\n * Allows to specify the time delay for rendering the component\n **/\nconst timerValue = 50;\n\n/**\n * Represents the skeleton for a tree item in expanding state\n **/\nexport function NodeSkeletonContainer({ children, indentation = 0 }: Props) {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n setTimeout(() => {\n setIsVisible(true);\n }, timerValue);\n }, []);\n\n return isVisible && children ? (\n <div role=\"presentation\">\n <View paddingInlineStart={indentation as Size}>\n {[...Array(1)].map((_element, index) => children(index))}\n </View>\n </div>\n ) : null;\n}\n","import { calcIndentation } from './TreeItem';\nimport { View } from '#UNSAFE_View';\nimport { Skeleton } from '#UNSAFE_Skeleton';\nimport { Flex } from '#UNSAFE_Flex';\nimport { Size } from '#utils/UNSAFE_size';\n\ntype Props = {\n indentation?: number;\n isLeaf?: boolean;\n};\n\nfunction TreeItemSkeleton({ indentation = 0, isLeaf = false }: Props) {\n return (\n <View paddingInlineStart={calcIndentation(indentation, isLeaf ? undefined : true) as Size}>\n <View padding={[0, '4px']}>\n <Flex height=\"9x\" align=\"center\" gap=\"2x\">\n {!isLeaf && <Skeleton width=\"6x\" height=\"6x\" borderRadius=\"4px\" />}\n <Skeleton height=\"5x\" borderRadius=\"4px\" />\n </Flex>\n </View>\n </View>\n );\n}\n\nexport function TreeItemSkeletons() {\n return (\n <>\n <TreeItemSkeleton />\n <TreeItemSkeleton indentation={1} />\n <TreeItemSkeleton indentation={2} isLeaf={true} />\n </>\n );\n}\n","import { ComponentChildren } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { Size } from '#utils/UNSAFE_size';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { ToggleDetail, ListItemRendererContext } from '#UNSAFE_Collection';\nimport { View } from '#UNSAFE_View';\nimport { styles } from './themes/TreeViewStyles.css';\nimport { treeViewVars as cssVars } from './themes/TreeViewContract.css';\nimport { Expander } from '#PRIVATE_Expander';\nimport { Flex } from '#UNSAFE_Flex';\nimport { NodeSkeletonContainer } from './NodeSkeletonContainer';\nimport { TreeItemSkeletons } from './TreeItemSkeletons';\nimport { useId } from '#hooks/UNSAFE_useId';\nimport { useHover } from '#hooks/UNSAFE_useHover';\nimport { getClientHints } from '#utils/PRIVATE_clientHints';\n\ntype Props<K, D> = {\n children: (context: ListItemRendererContext<K, D>) => ComponentChildren;\n itemKey: K;\n depth: number;\n context: ListItemRendererContext<K, D>;\n isExpanded: boolean | undefined;\n onToggle: (detail: ToggleDetail<K>) => void;\n selected: boolean | 'partial';\n isSelectable: boolean;\n isCheckboxless: boolean;\n isTabbable: boolean;\n isLoading?: boolean;\n isFocusRingVisible: boolean;\n};\n\nexport function TreeItem<K extends string | number, D>({\n itemKey,\n depth,\n context,\n children,\n isExpanded,\n onToggle,\n selected,\n isSelectable,\n isCheckboxless,\n isTabbable,\n isLoading,\n isFocusRingVisible\n}: Props<K, D>) {\n const rootRef = useRef<HTMLDivElement>(null);\n const indentation = calcIndentation(depth, isExpanded);\n const skeletonIndentation = calcIndentation(depth + 1, isExpanded);\n\n const { isHover, hoverProps } = useHover();\n\n const classes = classNames([\n styles.treeItemStyles.base,\n isFocusRingVisible && styles.treeItemStyles.focused,\n selected === true && styles.treeItemStyles.selected,\n selected === true && isCheckboxless && styles.treeItemStyles.checkboxlessSelected,\n isSelectable && !selected && isHover && styles.treeItemStyles.hovered\n ]);\n\n return (\n <>\n <div\n ref={rootRef}\n id={useId()}\n tabIndex={isMobile() ? -1 : undefined}\n data-oj-key={itemKey}\n data-oj-tree-item=\"\"\n class={classes}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={selected ? 'true' : 'false'}\n {...(isExpanded !== undefined && { 'aria-expanded': isExpanded })}\n {...(typeof itemKey === 'number' && { 'data-oj-key-type': 'number' })}\n {...hoverProps}>\n <>\n {selected === true && isHover && <div class={styles.selectedHoveredOverlay}></div>}\n <TabbableModeContext.Provider value={{ isTabbable }}>\n <View paddingInlineStart={indentation as Size}>\n <Flex align=\"center\">\n {isExpanded !== undefined && (\n <Expander itemKey={itemKey} expanded={isExpanded} onToggle={onToggle} />\n )}\n {children(context)}\n </Flex>\n </View>\n </TabbableModeContext.Provider>\n </>\n </div>\n {isLoading ? (\n <NodeSkeletonContainer indentation={skeletonIndentation as Size}>\n {() => {\n return <TreeItemSkeletons />;\n }}\n </NodeSkeletonContainer>\n ) : null}\n </>\n );\n}\n\nexport const isMobile = () => {\n const { platform } = getClientHints();\n return platform === 'ios' || platform === 'android';\n};\n\nexport const calcIndentation = (depth: number, isExpanded?: boolean) => {\n const expanderPlaceholder = isExpanded === undefined ? '40px' : '0px';\n return `calc(${Math.max(0, depth)} * ${cssVars.indentWidth} + ${expanderPlaceholder})`;\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { ComponentChildren } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { classNames } from '../utils/UNSAFE_classNames';\nimport { styles } from './themes/TreeViewStyles.css';\n\ntype Props = {\n /**\n * Allows to pass and access the properties from child elements\n **/\n children?: (index: number) => ComponentChildren;\n /**\n * Allows to specify number of skeletons to be rendered on initial load\n **/\n minimumCount?: number;\n /**\n * Callback when skeleton do become visible, handler can use this\n * to update its live region.\n */\n onSkeletonVisible?: () => void;\n};\n\n/**\n * Allows to specify the time delay for rendering the component\n **/\nconst timerValue = 50;\n\n/**\n * SkeletonContainer renders 'minimumCount' number of skeletons\n * of the variant specified from its child element - Skeleton's prop after\n * 'timerValue' ms delay\n **/\nexport function SkeletonContainer({ children, minimumCount = 1, onSkeletonVisible }: Props) {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n setTimeout(() => {\n setIsVisible(true);\n onSkeletonVisible?.();\n }, timerValue);\n }, [onSkeletonVisible]);\n\n const containerClasses = classNames([styles.skeletonStyles.container]);\n return isVisible && children ? (\n <div class={containerClasses} role=\"presentation\">\n {[...Array(minimumCount)].map((_element, index) => children(index))}\n </div>\n ) : null;\n}\n","import { ItemContext } from '#UNSAFE_Collection';\nimport { LoadMoreCollection } from '#PRIVATE_LoadMoreCollection';\nimport { TreeItem } from './TreeItem';\nimport { InternalTreeNode, LoadMoreTreeCollectionProps as Props } from './TreeView.types';\nimport { SkeletonContainer } from './SkeletonContainer';\nimport { TreeItemSkeletons } from './TreeItemSkeletons';\nimport { LOADMORE_STYLE_CLASS } from '#PRIVATE_LoadMoreCollection';\n// TODO: add this import due to issue JET-67485, need to update once Stable is introduced\nimport './themes/redwood/TreeViewTheme.css';\n\n/**\n * Component that receives the flattened data and renders the hierarchy betweens items based on the shaped metadata.\n * In order to maximize performance, only items that are visible in the viewport are rendered.\n * This is an internal component that is used by FlatTreeView.\n */\nexport function LoadMoreTreeCollection<K extends string | number, D>({\n data,\n children,\n selectionMode,\n onToggle = () => {},\n viewportConfig,\n hasMore = false,\n onLoadMore = () => {},\n loadMoreIndicator = defaultLoadMoreIndicator,\n updateContext\n}: Props<K, D>) {\n const createTreeItem = (context: ItemContext<InternalTreeNode<K, D>>) => {\n const key = context.data.metadata.key;\n const treeItemContext = {\n index: context.index,\n data: context.data.data,\n metadata: { key }\n };\n // allow container to inject additional things to context\n if (updateContext) {\n updateContext(treeItemContext);\n }\n const expanded = context.data.metadata.expanded;\n return (\n <TreeItem\n key={treeItemContext.metadata.key}\n itemKey={treeItemContext.metadata.key}\n context={treeItemContext}\n depth={context.data.metadata.treeDepth}\n isExpanded={expanded === 'ongoing' ? true : expanded}\n onToggle={onToggle}\n isSelectable={selectionMode !== 'none'}\n isCheckboxless={selectionMode === 'single'} // TODO: need to update when checkboxless multiple is added\n selected={context.data.metadata.selected}\n isLoading={expanded === 'ongoing'}\n isTabbable={false}\n isFocusRingVisible={context.data.metadata.hasFocus}>\n {children}\n </TreeItem>\n );\n };\n\n return (\n <>\n {data === null ? null : (\n <LoadMoreCollection\n data={data}\n viewportConfig={viewportConfig}\n hasMore={hasMore}\n onLoadMore={onLoadMore}\n loadMoreIndicator={loadMoreIndicator}>\n {createTreeItem}\n </LoadMoreCollection>\n )}\n </>\n );\n}\n\nconst defaultLoadMoreIndicator = (\n <div class={LOADMORE_STYLE_CLASS}>\n <SkeletonContainer minimumCount={1}>\n {() => {\n return <TreeItemSkeletons />;\n }}\n </SkeletonContainer>\n </div>\n);\n","/**\n * Item selector for tree item\n */\nexport const TREE_ITEM_SELECTOR = '[data-oj-tree-item]';\n","import { RefObject } from 'preact';\nimport { useCallback } from 'preact/hooks';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { useUser } from '#hooks/UNSAFE_useUser';\nimport { findElementByKey, keyExtractor, getPrevNextKey } from '#utils/PRIVATE_collectionUtils';\nimport { isKeyDefined } from '#utils/UNSAFE_keys';\nimport { useNavigation } from '#hooks/PRIVATE_useListCommon';\nimport { TREE_ITEM_SELECTOR } from './TreeViewUtils';\n\nexport function useTreeNavigation<K extends string | number>(\n data: any | null,\n rootRef: RefObject<HTMLDivElement>,\n isExpanded: (key: K) => boolean,\n idExtractor: (elem: Element) => string\n) {\n const { direction } = useUser();\n\n const arrowKeyAndHandlers = {\n ArrowUp: (key?: K) => getPrevNextKey(rootRef.current, key, true, TREE_ITEM_SELECTOR),\n ArrowDown: (key?: K) => getPrevNextKey(rootRef.current, key, false, TREE_ITEM_SELECTOR)\n };\n\n const { navigationProps, currentKey, onCurrentKeyChange, showFocusRing } = useNavigation(\n data,\n rootRef,\n idExtractor,\n TREE_ITEM_SELECTOR,\n arrowKeyAndHandlers,\n undefined, // currentItemOverride,\n undefined, //onPersistCurrentItem,\n undefined,\n undefined,\n true, // should always allow shift key\n false, // TODO: update allowTabbableMode when F2 mode is added\n true,\n false\n );\n\n const itemKeyExtractor = useCallback(\n (element: HTMLElement) => {\n if (element.getAttribute('role') === 'tree') {\n return currentKey === undefined ? null : currentKey;\n }\n return keyExtractor(element, TREE_ITEM_SELECTOR) as K;\n },\n [currentKey, keyExtractor]\n );\n\n const onKeyUp = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n const isRtl = direction === 'rtl';\n const isLeftArrow = event.key === 'ArrowLeft' && !isRtl;\n const itemKey = itemKeyExtractor(event.target as HTMLElement);\n if (itemKey) {\n const contains = isExpanded(itemKey);\n // arrow left on a collapsed node, go to its parent\n if (isLeftArrow && !contains && rootRef.current) {\n const item = findElementByKey(rootRef.current, itemKey, TREE_ITEM_SELECTOR);\n if (item) {\n const treeDepth = item.getAttribute('aria-level');\n const parent =\n treeDepth !== null &&\n findParentElementByKey(\n rootRef.current,\n itemKey,\n Number(treeDepth),\n TREE_ITEM_SELECTOR\n );\n const newKey = parent && itemKeyExtractor(parent as HTMLElement);\n if (isKeyDefined(newKey)) {\n onCurrentKeyChange?.({ value: newKey as K });\n }\n }\n } else if (!isLeftArrow && contains) {\n // arrow right on an expanded node, go to its first child\n const newKey = getPrevNextKey(rootRef.current, itemKey, false, TREE_ITEM_SELECTOR)();\n if (isKeyDefined(newKey)) {\n onCurrentKeyChange?.({ value: newKey as K });\n }\n }\n }\n }\n },\n [direction, isExpanded, onCurrentKeyChange, itemKeyExtractor]\n );\n\n const treeNavigationProps = mergeProps(navigationProps, { onKeyUp });\n return { treeNavigationProps, currentKey, showFocusRing };\n}\n\nconst findParentElementByKey = <K extends string | number>(\n root: HTMLElement | null,\n key: K | null,\n treeDepth: number,\n itemSelector: string\n) => {\n if (root && key !== null) {\n const items = Array.from(root.querySelectorAll(itemSelector));\n const index = items.findIndex((i) => (i as HTMLElement).dataset['ojKey'] == key);\n for (let i = index; i >= 0; i--) {\n const level = items[i].getAttribute('aria-level');\n if (level !== null && Number(level) == treeDepth - 1) {\n return items[i];\n }\n }\n }\n return null;\n};\n","import { useMemo, useRef, useCallback, useState } from 'preact/hooks';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { SelectionDetail, ListItemRendererContext } from '#UNSAFE_Collection';\nimport { getViewportConfig } from '#utils/PRIVATE_collectionUtils';\nimport { FlattenedTreeNode, InternalTreeNode, FlatTreeViewProps as Props } from './TreeView.types';\nimport { LoadMoreTreeCollection } from './LoadMoreTreeCollection';\nimport {\n useSelection,\n useAdditiveSelection,\n SelectionRangeDetail\n} from '#hooks/PRIVATE_useSelection';\nimport { useExpandCollapse } from '#hooks/PRIVATE_useListCommon';\nimport { keyExtractor, getPrevNextKey, findElementByKey } from '#utils/PRIVATE_collectionUtils';\nimport { addKeys, containsKey } from '#utils/UNSAFE_keys';\nimport { useComponentTheme } from '#hooks/UNSAFE_useComponentTheme';\nimport { TreeViewRedwoodTheme } from './themes/redwood/TreeViewTheme.css';\nimport { useTreeNavigation } from './useTreeNavigation';\nimport { Selector } from '#UNSAFE_Selector';\nimport { isMobile } from './TreeItem';\nimport { SkeletonContainer } from './SkeletonContainer';\nimport { TreeItemSkeletons } from './TreeItemSkeletons';\nimport { LiveRegion } from '#UNSAFE_LiveRegion';\nimport { HiddenAccessible } from '#UNSAFE_HiddenAccessible';\nimport { useId } from '#hooks/UNSAFE_useId';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport { BundleType } from '#resources/nls/bundle';\nimport { TREE_ITEM_SELECTOR } from './TreeViewUtils';\n\n/**\n * A FlatTreeView displays flattened data as a tree with highly interactive features.\n */\nexport function FlatTreeView<K extends string | number, D>({\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n data,\n selectionMode = 'none',\n selectedKeys = { all: false, keys: new Set() },\n onSelectionChange,\n onToggle,\n viewportConfig,\n ...rest\n}: Props<K, D>) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [liveRegion, setLiveRegion] = useState<string>();\n const { collection_loading, collection_loaded } = useTranslationBundle<BundleType>(\n '@oracle/oraclejet-preact'\n );\n const loadingDescId = useId();\n\n const isExpanded = useCallback((key: K) => {\n if (rootRef.current) {\n const elem = findElementByKey(rootRef.current, key, TREE_ITEM_SELECTOR);\n return elem?.getAttribute('aria-expanded') === 'true';\n }\n return false;\n }, []);\n\n const { treeNavigationProps, currentKey, showFocusRing } = useTreeNavigation(\n data,\n rootRef,\n isExpanded,\n idExtractor\n );\n\n const items: InternalTreeNode<K, D>[] = useMemo(\n () =>\n data?.map((value: FlattenedTreeNode<K, D>) => {\n const itemKey = value.metadata.key;\n const newValue = { ...value } as InternalTreeNode<K, D>;\n newValue.metadata.selected = containsKey(selectedKeys, itemKey);\n newValue.metadata.hasFocus = currentKey === itemKey && showFocusRing;\n return newValue;\n }) || [],\n [data, selectedKeys, currentKey, showFocusRing]\n );\n\n const expandCollapseProps = useExpandCollapse(\n (element: HTMLElement) => {\n if (element.getAttribute('role') === 'tree') {\n return currentKey === undefined ? null : currentKey;\n }\n return keyExtractor(element, TREE_ITEM_SELECTOR) as K;\n },\n isExpanded,\n onToggle,\n true\n );\n\n // tracking the anchor key which is used for shift+click selection\n const anchorKey = useRef<K | undefined>();\n\n const handleSelectionChange = useCallback(\n (detail: SelectionDetail<K>) => {\n if (onSelectionChange) {\n if (detail.value.all === false && detail.value.keys.size > 0) {\n // during regular selection, the last key selected by a user gesture is the anchor key\n anchorKey.current = Array.from(detail.value.keys.values()).pop();\n }\n onSelectionChange(detail);\n }\n },\n [anchorKey, onSelectionChange]\n );\n\n const handleSelectionRangeChange = useCallback(\n (detail: SelectionRangeDetail<K>) => {\n if (data && onSelectionChange) {\n const value = handleSelectionRange(detail, data);\n if (Array.isArray(value)) {\n if (detail.eventType === 'shiftSpace') {\n // during range selection by shift+space, the first key selected by a user gesture is the anchor key\n anchorKey.current = detail.value.start;\n } else {\n // during range selection by shift+click/arrow keys, the last key selected by a user gesture is the anchor key\n anchorKey.current = detail.value.end;\n }\n if (selectionMode === 'multipleToggle') {\n const keys = addKeys(selectedKeys, value);\n onSelectionChange({ value: keys, target: null });\n } else {\n onSelectionChange({ value: { all: false, keys: new Set(value) }, target: null });\n }\n }\n }\n },\n [data, selectedKeys, onSelectionChange]\n );\n\n // single or multiple selection mode\n const { selectionProps } = useSelection(\n (element: HTMLElement) => {\n if (element === rootRef.current) {\n return currentKey === undefined ? null : currentKey;\n }\n return keyExtractor(element, TREE_ITEM_SELECTOR) as K;\n },\n selectedKeys,\n selectionMode === 'multipleToggle' ? 'none' : selectionMode,\n false,\n 'replace',\n handleSelectionChange,\n anchorKey.current,\n currentKey,\n (currentKey: K | undefined, isPrev: boolean) =>\n getPrevNextKey(rootRef.current, currentKey, isPrev, TREE_ITEM_SELECTOR),\n undefined,\n (key: K) => {\n if (rootRef.current) {\n const elem = findElementByKey(rootRef.current, key, TREE_ITEM_SELECTOR);\n if (elem) {\n elem.scrollIntoView({ block: 'nearest' });\n }\n }\n },\n handleSelectionRangeChange\n );\n\n // multipleToggle selection mode\n const { eventProps: multipleToggleSelectionProps } = useAdditiveSelection(\n (element: HTMLElement) => {\n if (element === rootRef.current) {\n return currentKey === undefined ? null : currentKey;\n }\n return keyExtractor(element, TREE_ITEM_SELECTOR) as K;\n },\n selectedKeys,\n selectionMode === 'multipleToggle' ? 'multiple' : 'none',\n false,\n (key: K) => {\n if (data) {\n return data.findIndex((value: FlattenedTreeNode<K, D>) => value.metadata.key === key);\n }\n return -1;\n },\n (startIndex: number, endIndex: number) => {\n if (data) {\n const keys = data.map((value: FlattenedTreeNode<K, D>) => value.metadata.key);\n return keys.slice(startIndex, endIndex);\n }\n return [];\n },\n (currentKey: K | undefined, isPrev: boolean) =>\n getPrevNextKey(rootRef.current, currentKey, isPrev, TREE_ITEM_SELECTOR),\n currentKey,\n handleSelectionChange,\n handleSelectionRangeChange\n );\n\n //Note: onKeyUp doesn't work with the cmd key\n const selectAllWithKeyboard = useCallback(\n (event: KeyboardEvent) => {\n if (selectionMode === 'multiple' || selectionMode === 'multipleToggle') {\n if (onSelectionChange && (event.metaKey || event.ctrlKey) && event.key === 'a') {\n event.preventDefault();\n onSelectionChange({\n value: { all: true, deletedKeys: new Set() },\n target: event.target\n });\n }\n }\n },\n [onSelectionChange, selectionMode]\n );\n\n const { classes } = useComponentTheme(TreeViewRedwoodTheme);\n viewportConfig = getViewportConfig(rootRef, viewportConfig);\n\n const updateContextCallback = useCallback(\n (context: ListItemRendererContext<K, D>) => {\n const key = context.metadata.key;\n context.selector =\n selectionMode === 'none' || selectionMode === 'single'\n ? undefined\n : (ariaLabel?: string) => (\n <div aria-hidden={isMobile() ? undefined : true}>\n <Selector\n aria-label={isMobile() ? ariaLabel : undefined}\n rowKey={key}\n selectedKeys={selectedKeys}\n onChange={onSelectionChange}\n />\n </div>\n );\n },\n [selectionMode, selectedKeys, onSelectionChange]\n );\n\n const updateLiveRegion = useCallback(() => {\n setLiveRegion(collection_loading());\n }, [collection_loading]);\n\n return (\n <>\n <div\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={\n data == null\n ? ariaDescribedBy\n ? [...new Set(ariaDescribedBy.split(/\\s+/).concat(loadingDescId))].join(' ')\n : loadingDescId\n : ariaDescribedBy\n }\n ref={rootRef}\n role=\"tree\"\n aria-multiselectable={selectionMode === 'multiple' ? true : false}\n tabIndex={0}\n class={classes}\n {...mergeProps(\n treeNavigationProps,\n selectionProps,\n multipleToggleSelectionProps,\n expandCollapseProps,\n { onKeyDown: selectAllWithKeyboard }\n )}>\n {data == null ? (\n defaultLoadingIndicator(updateLiveRegion)\n ) : (\n <LoadMoreTreeCollection\n data={items}\n selectionMode={selectionMode}\n onToggle={onToggle}\n viewportConfig={viewportConfig}\n updateContext={updateContextCallback}\n {...rest}></LoadMoreTreeCollection>\n )}\n </div>\n <HiddenAccessible id={loadingDescId}>{collection_loading()}</HiddenAccessible>\n <LiveRegion>\n {data == null ? liveRegion : liveRegion === collection_loading() ? collection_loaded() : ''}\n </LiveRegion>\n </>\n );\n}\n\nconst defaultLoadingIndicator = (callback: () => void) => {\n return (\n <SkeletonContainer minimumCount={8} onSkeletonVisible={callback}>\n {() => {\n return <TreeItemSkeletons />;\n }}\n </SkeletonContainer>\n );\n};\n\nconst idExtractor = (elem: Element) => elem.id;\n\n/**\n * A helper function to handle range selection\n */\nexport const handleSelectionRange = <K, D>(\n detail: SelectionRangeDetail<K>,\n data: FlattenedTreeNode<K, D>[]\n) => {\n const keys = data.map((value: FlattenedTreeNode<K, D>) => {\n return value.metadata.key;\n });\n const startIndex = keys.indexOf(detail.value.start);\n const endIndex = keys.indexOf(detail.value.end);\n const minIndex = Math.min(startIndex, endIndex);\n const maxIndex = Math.max(startIndex, endIndex);\n if (minIndex === -1) {\n // return a range to fetch so we can find all the keys, maxIndex should not be -1\n return { offset: 0, count: -1 };\n } else {\n // range of keys are in the current viewport, return them\n return keys.slice(minIndex, maxIndex + 1);\n }\n};\n"],"names":["NodeSkeletonContainer","children","indentation","isVisible","setIsVisible","useState","useEffect","setTimeout","_jsx","role","View","paddingInlineStart","Array","map","_element","index","TreeItemSkeleton","isLeaf","calcIndentation","undefined","padding","_jsxs","Flex","height","align","gap","Skeleton","width","borderRadius","TreeItemSkeletons","_Fragment","TreeItem","itemKey","depth","context","isExpanded","onToggle","selected","isSelectable","isCheckboxless","isTabbable","isLoading","isFocusRingVisible","rootRef","useRef","skeletonIndentation","isHover","hoverProps","useHover","classes","classNames","styles","treeItemStyles","base","focused","checkboxlessSelected","hovered","jsx","ref","id","useId","tabIndex","isMobile","class","selectedHoveredOverlay","TabbableModeContext","Provider","value","Expander","expanded","platform","getClientHints","expanderPlaceholder","Math","max","cssVars","treeViewVars","indentWidth","SkeletonContainer","minimumCount","onSkeletonVisible","containerClasses","skeletonStyles","container","LoadMoreTreeCollection","data","selectionMode","viewportConfig","hasMore","onLoadMore","loadMoreIndicator","defaultLoadMoreIndicator","updateContext","LoadMoreCollection","key","metadata","treeItemContext","treeDepth","hasFocus","LOADMORE_STYLE_CLASS","TREE_ITEM_SELECTOR","findParentElementByKey","root","itemSelector","items","from","querySelectorAll","findIndex","i","dataset","level","getAttribute","Number","defaultLoadingIndicator","callback","idExtractor","elem","handleSelectionRange","detail","keys","startIndex","indexOf","start","endIndex","end","minIndex","min","maxIndex","offset","count","slice","ariaLabel","ariaLabelledBy","ariaDescribedBy","selectedKeys","all","Set","onSelectionChange","rest","liveRegion","setLiveRegion","collection_loading","collection_loaded","useTranslationBundle","loadingDescId","useCallback","current","findElementByKey","treeNavigationProps","currentKey","showFocusRing","direction","useUser","arrowKeyAndHandlers","ArrowUp","getPrevNextKey","ArrowDown","navigationProps","onCurrentKeyChange","useNavigation","itemKeyExtractor","element","keyExtractor","onKeyUp","event","isRtl","isLeftArrow","target","contains","item","parent","newKey","isKeyDefined","mergeProps","useTreeNavigation","useMemo","newValue","containsKey","expandCollapseProps","useExpandCollapse","anchorKey","handleSelectionChange","size","values","pop","handleSelectionRangeChange","isArray","eventType","addKeys","selectionProps","useSelection","isPrev","scrollIntoView","block","eventProps","multipleToggleSelectionProps","useAdditiveSelection","selectAllWithKeyboard","metaKey","ctrlKey","preventDefault","deletedKeys","useComponentTheme","TreeViewRedwoodTheme","getViewportConfig","updateContextCallback","selector","Selector","rowKey","onChange","updateLiveRegion","split","concat","join","onKeyDown","HiddenAccessible","LiveRegion"],"mappings":"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"}
1
+ {"version":3,"file":"FlatTreeView-15edd439.js","sources":["../../src/UNSAFE_FlatTreeView/NodeSkeletonContainer.tsx","../../src/UNSAFE_FlatTreeView/TreeItemSkeletons.tsx","../../src/UNSAFE_FlatTreeView/TreeItem.tsx","../../src/UNSAFE_FlatTreeView/SkeletonContainer.tsx","../../src/UNSAFE_FlatTreeView/LoadMoreTreeCollection.tsx","../../src/UNSAFE_FlatTreeView/TreeViewUtils.ts","../../src/UNSAFE_FlatTreeView/useTreeNavigation.ts","../../src/UNSAFE_FlatTreeView/FlatTreeView.tsx"],"sourcesContent":["/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { ComponentChildren } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { Size } from '#utils/UNSAFE_size';\nimport { View } from '#UNSAFE_View';\n\ntype Props = {\n /**\n * Allows to pass and access the properties from child elements\n **/\n children?: (index: number) => ComponentChildren;\n indentation?: Size;\n};\n\n/**\n * Allows to specify the time delay for rendering the component\n **/\nconst timerValue = 50;\n\n/**\n * Represents the skeleton for a tree item in expanding state\n **/\nexport function NodeSkeletonContainer({ children, indentation = 0 }: Props) {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n setTimeout(() => {\n setIsVisible(true);\n }, timerValue);\n }, []);\n\n return isVisible && children ? (\n <div role=\"presentation\">\n <View paddingInlineStart={indentation as Size}>\n {[...Array(1)].map((_element, index) => children(index))}\n </View>\n </div>\n ) : null;\n}\n","import { calcIndentation } from './TreeItem';\nimport { View } from '#UNSAFE_View';\nimport { Skeleton } from '#UNSAFE_Skeleton';\nimport { Flex } from '#UNSAFE_Flex';\nimport { Size } from '#utils/UNSAFE_size';\n\ntype Props = {\n indentation?: number;\n isLeaf?: boolean;\n};\n\nfunction TreeItemSkeleton({ indentation = 0, isLeaf = false }: Props) {\n return (\n <View paddingInlineStart={calcIndentation(indentation, isLeaf ? undefined : true) as Size}>\n <View padding={[0, '4px']}>\n <Flex height=\"9x\" align=\"center\" gap=\"2x\">\n {!isLeaf && <Skeleton width=\"6x\" height=\"6x\" borderRadius=\"4px\" />}\n <Skeleton height=\"5x\" borderRadius=\"4px\" />\n </Flex>\n </View>\n </View>\n );\n}\n\nexport function TreeItemSkeletons() {\n return (\n <>\n <TreeItemSkeleton />\n <TreeItemSkeleton indentation={1} />\n <TreeItemSkeleton indentation={2} isLeaf={true} />\n </>\n );\n}\n","import { ComponentChildren } from 'preact';\nimport { useRef } from 'preact/hooks';\nimport { Size } from '#utils/UNSAFE_size';\nimport { classNames } from '#utils/UNSAFE_classNames';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport { ToggleDetail, ListItemRendererContext } from '#UNSAFE_Collection';\nimport { View } from '#UNSAFE_View';\nimport { styles } from './themes/TreeViewStyles.css';\nimport { treeViewVars as cssVars } from './themes/TreeViewContract.css';\nimport { Expander } from '#PRIVATE_Expander';\nimport { Flex } from '#UNSAFE_Flex';\nimport { NodeSkeletonContainer } from './NodeSkeletonContainer';\nimport { TreeItemSkeletons } from './TreeItemSkeletons';\nimport { useId } from '#hooks/UNSAFE_useId';\nimport { useHover } from '#hooks/UNSAFE_useHover';\nimport { getClientHints } from '#utils/PRIVATE_clientHints';\n\ntype Props<K, D> = {\n children: (context: ListItemRendererContext<K, D>) => ComponentChildren;\n itemKey: K;\n depth: number;\n context: ListItemRendererContext<K, D>;\n isExpanded: boolean | undefined;\n onToggle: (detail: ToggleDetail<K>) => void;\n selected: boolean | 'partial';\n isSelectable: boolean;\n isCheckboxless: boolean;\n isTabbable: boolean;\n isLoading?: boolean;\n isFocusRingVisible: boolean;\n};\n\nexport function TreeItem<K extends string | number, D>({\n itemKey,\n depth,\n context,\n children,\n isExpanded,\n onToggle,\n selected,\n isSelectable,\n isCheckboxless,\n isTabbable,\n isLoading,\n isFocusRingVisible\n}: Props<K, D>) {\n const rootRef = useRef<HTMLDivElement>(null);\n const indentation = calcIndentation(depth, isExpanded);\n const skeletonIndentation = calcIndentation(depth + 1, isExpanded);\n\n const { isHover, hoverProps } = useHover();\n\n const classes = classNames([\n styles.treeItemStyles.base,\n isFocusRingVisible && styles.treeItemStyles.focused,\n selected === true && styles.treeItemStyles.selected,\n selected === true && isCheckboxless && styles.treeItemStyles.checkboxlessSelected,\n isSelectable && !selected && isHover && styles.treeItemStyles.hovered\n ]);\n\n return (\n <>\n <div\n ref={rootRef}\n id={useId()}\n tabIndex={isMobile() ? -1 : undefined}\n data-oj-key={itemKey}\n data-oj-tree-item=\"\"\n class={classes}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={selected ? 'true' : 'false'}\n {...(isExpanded !== undefined && { 'aria-expanded': isExpanded })}\n {...(typeof itemKey === 'number' && { 'data-oj-key-type': 'number' })}\n {...hoverProps}>\n <>\n {selected === true && isHover && <div class={styles.selectedHoveredOverlay}></div>}\n <TabbableModeContext.Provider value={{ isTabbable }}>\n <View paddingInlineStart={indentation as Size}>\n <Flex align=\"center\">\n {isExpanded !== undefined && (\n <Expander itemKey={itemKey} expanded={isExpanded} onToggle={onToggle} />\n )}\n {children(context)}\n </Flex>\n </View>\n </TabbableModeContext.Provider>\n </>\n </div>\n {isLoading ? (\n <NodeSkeletonContainer indentation={skeletonIndentation as Size}>\n {() => {\n return <TreeItemSkeletons />;\n }}\n </NodeSkeletonContainer>\n ) : null}\n </>\n );\n}\n\nexport const isMobile = () => {\n const { platform } = getClientHints();\n return platform === 'ios' || platform === 'android';\n};\n\nexport const calcIndentation = (depth: number, isExpanded?: boolean) => {\n const expanderPlaceholder = isExpanded === undefined ? '40px' : '0px';\n return `calc(${Math.max(0, depth)} * ${cssVars.indentWidth} + ${expanderPlaceholder})`;\n};\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\nimport { ComponentChildren } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { classNames } from '../utils/UNSAFE_classNames';\nimport { styles } from './themes/TreeViewStyles.css';\n\ntype Props = {\n /**\n * Allows to pass and access the properties from child elements\n **/\n children?: (index: number) => ComponentChildren;\n /**\n * Allows to specify number of skeletons to be rendered on initial load\n **/\n minimumCount?: number;\n /**\n * Callback when skeleton do become visible, handler can use this\n * to update its live region.\n */\n onSkeletonVisible?: () => void;\n};\n\n/**\n * Allows to specify the time delay for rendering the component\n **/\nconst timerValue = 50;\n\n/**\n * SkeletonContainer renders 'minimumCount' number of skeletons\n * of the variant specified from its child element - Skeleton's prop after\n * 'timerValue' ms delay\n **/\nexport function SkeletonContainer({ children, minimumCount = 1, onSkeletonVisible }: Props) {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n setTimeout(() => {\n setIsVisible(true);\n onSkeletonVisible?.();\n }, timerValue);\n }, [onSkeletonVisible]);\n\n const containerClasses = classNames([styles.skeletonStyles.container]);\n return isVisible && children ? (\n <div class={containerClasses} role=\"presentation\">\n {[...Array(minimumCount)].map((_element, index) => children(index))}\n </div>\n ) : null;\n}\n","import { ItemContext } from '#UNSAFE_Collection';\nimport { LoadMoreCollection } from '#PRIVATE_LoadMoreCollection';\nimport { TreeItem } from './TreeItem';\nimport { InternalTreeNode, LoadMoreTreeCollectionProps as Props } from './TreeView.types';\nimport { SkeletonContainer } from './SkeletonContainer';\nimport { TreeItemSkeletons } from './TreeItemSkeletons';\nimport { LOADMORE_STYLE_CLASS } from '#PRIVATE_LoadMoreCollection';\n// TODO: add this import due to issue JET-67485, need to update once Stable is introduced\nimport './themes/redwood/TreeViewTheme.css';\n\n/**\n * Component that receives the flattened data and renders the hierarchy betweens items based on the shaped metadata.\n * In order to maximize performance, only items that are visible in the viewport are rendered.\n * This is an internal component that is used by FlatTreeView.\n */\nexport function LoadMoreTreeCollection<K extends string | number, D>({\n data,\n children,\n selectionMode,\n onToggle = () => {},\n viewportConfig,\n hasMore = false,\n onLoadMore = () => {},\n loadMoreIndicator = defaultLoadMoreIndicator,\n updateContext\n}: Props<K, D>) {\n const createTreeItem = (context: ItemContext<InternalTreeNode<K, D>>) => {\n const key = context.data.metadata.key;\n const treeItemContext = {\n index: context.index,\n data: context.data.data,\n metadata: { key }\n };\n // allow container to inject additional things to context\n if (updateContext) {\n updateContext(treeItemContext);\n }\n const expanded = context.data.metadata.expanded;\n return (\n <TreeItem\n key={treeItemContext.metadata.key}\n itemKey={treeItemContext.metadata.key}\n context={treeItemContext}\n depth={context.data.metadata.treeDepth}\n isExpanded={expanded === 'ongoing' ? true : expanded}\n onToggle={onToggle}\n isSelectable={selectionMode !== 'none'}\n isCheckboxless={selectionMode === 'single'} // TODO: need to update when checkboxless multiple is added\n selected={context.data.metadata.selected}\n isLoading={expanded === 'ongoing'}\n isTabbable={false}\n isFocusRingVisible={context.data.metadata.hasFocus}>\n {children}\n </TreeItem>\n );\n };\n\n return (\n <>\n {data === null ? null : (\n <LoadMoreCollection\n data={data}\n viewportConfig={viewportConfig}\n hasMore={hasMore}\n onLoadMore={onLoadMore}\n loadMoreIndicator={loadMoreIndicator}>\n {createTreeItem}\n </LoadMoreCollection>\n )}\n </>\n );\n}\n\nconst defaultLoadMoreIndicator = (\n <div class={LOADMORE_STYLE_CLASS}>\n <SkeletonContainer minimumCount={1}>\n {() => {\n return <TreeItemSkeletons />;\n }}\n </SkeletonContainer>\n </div>\n);\n","/**\n * Item selector for tree item\n */\nexport const TREE_ITEM_SELECTOR = '[data-oj-tree-item]';\n","import { RefObject } from 'preact';\nimport { useCallback } from 'preact/hooks';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { useUser } from '#hooks/UNSAFE_useUser';\nimport { findElementByKey, keyExtractor, getPrevNextKey } from '#utils/PRIVATE_collectionUtils';\nimport { isKeyDefined } from '#utils/UNSAFE_keys';\nimport { useNavigation } from '#hooks/PRIVATE_useListCommon';\nimport { TREE_ITEM_SELECTOR } from './TreeViewUtils';\n\nexport function useTreeNavigation<K extends string | number>(\n data: any | null,\n rootRef: RefObject<HTMLDivElement>,\n isExpanded: (key: K) => boolean,\n idExtractor: (elem: Element) => string\n) {\n const { direction } = useUser();\n\n const arrowKeyAndHandlers = {\n ArrowUp: (key?: K) => getPrevNextKey(rootRef.current, key, true, TREE_ITEM_SELECTOR),\n ArrowDown: (key?: K) => getPrevNextKey(rootRef.current, key, false, TREE_ITEM_SELECTOR)\n };\n\n const { navigationProps, currentKey, onCurrentKeyChange, showFocusRing } = useNavigation(\n data,\n rootRef,\n idExtractor,\n TREE_ITEM_SELECTOR,\n arrowKeyAndHandlers,\n undefined, // currentItemOverride,\n undefined, //onPersistCurrentItem,\n undefined,\n undefined,\n true, // should always allow shift key\n false, // TODO: update allowTabbableMode when F2 mode is added\n true,\n false\n );\n\n const itemKeyExtractor = useCallback(\n (element: HTMLElement) => {\n if (element.getAttribute('role') === 'tree') {\n return currentKey === undefined ? null : currentKey;\n }\n return keyExtractor(element, TREE_ITEM_SELECTOR) as K;\n },\n [currentKey, keyExtractor]\n );\n\n const onKeyUp = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n const isRtl = direction === 'rtl';\n const isLeftArrow = event.key === 'ArrowLeft' && !isRtl;\n const itemKey = itemKeyExtractor(event.target as HTMLElement);\n if (itemKey) {\n const contains = isExpanded(itemKey);\n // arrow left on a collapsed node, go to its parent\n if (isLeftArrow && !contains && rootRef.current) {\n const item = findElementByKey(rootRef.current, itemKey, TREE_ITEM_SELECTOR);\n if (item) {\n const treeDepth = item.getAttribute('aria-level');\n const parent =\n treeDepth !== null &&\n findParentElementByKey(\n rootRef.current,\n itemKey,\n Number(treeDepth),\n TREE_ITEM_SELECTOR\n );\n const newKey = parent && itemKeyExtractor(parent as HTMLElement);\n if (isKeyDefined(newKey)) {\n onCurrentKeyChange?.({ value: newKey as K });\n }\n }\n } else if (!isLeftArrow && contains) {\n // arrow right on an expanded node, go to its first child\n const newKey = getPrevNextKey(rootRef.current, itemKey, false, TREE_ITEM_SELECTOR)();\n if (isKeyDefined(newKey)) {\n onCurrentKeyChange?.({ value: newKey as K });\n }\n }\n }\n }\n },\n [direction, isExpanded, onCurrentKeyChange, itemKeyExtractor]\n );\n\n const treeNavigationProps = mergeProps(navigationProps, { onKeyUp });\n return { treeNavigationProps, currentKey, showFocusRing };\n}\n\nconst findParentElementByKey = <K extends string | number>(\n root: HTMLElement | null,\n key: K | null,\n treeDepth: number,\n itemSelector: string\n) => {\n if (root && key !== null) {\n const items = Array.from(root.querySelectorAll(itemSelector));\n const index = items.findIndex((i) => (i as HTMLElement).dataset['ojKey'] == key);\n for (let i = index; i >= 0; i--) {\n const level = items[i].getAttribute('aria-level');\n if (level !== null && Number(level) == treeDepth - 1) {\n return items[i];\n }\n }\n }\n return null;\n};\n","import { useMemo, useRef, useCallback, useState } from 'preact/hooks';\nimport { mergeProps } from '#utils/UNSAFE_mergeProps';\nimport { SelectionDetail, ListItemRendererContext } from '#UNSAFE_Collection';\nimport { getViewportConfig } from '#utils/PRIVATE_collectionUtils';\nimport { FlattenedTreeNode, InternalTreeNode, FlatTreeViewProps as Props } from './TreeView.types';\nimport { LoadMoreTreeCollection } from './LoadMoreTreeCollection';\nimport {\n useSelection,\n useAdditiveSelection,\n SelectionRangeDetail\n} from '#hooks/PRIVATE_useSelection';\nimport { useExpandCollapse } from '#hooks/PRIVATE_useListCommon';\nimport { keyExtractor, getPrevNextKey, findElementByKey } from '#utils/PRIVATE_collectionUtils';\nimport { addKeys, containsKey } from '#utils/UNSAFE_keys';\nimport { useComponentTheme } from '#hooks/UNSAFE_useComponentTheme';\nimport { TreeViewRedwoodTheme } from './themes/redwood/TreeViewTheme.css';\nimport { useTreeNavigation } from './useTreeNavigation';\nimport { Selector } from '#UNSAFE_Selector';\nimport { isMobile } from './TreeItem';\nimport { SkeletonContainer } from './SkeletonContainer';\nimport { TreeItemSkeletons } from './TreeItemSkeletons';\nimport { LiveRegion } from '#UNSAFE_LiveRegion';\nimport { HiddenAccessible } from '#UNSAFE_HiddenAccessible';\nimport { useId } from '#hooks/UNSAFE_useId';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport { BundleType } from '#resources/nls/bundle';\nimport { TREE_ITEM_SELECTOR } from './TreeViewUtils';\n\n/**\n * A FlatTreeView displays flattened data as a tree with highly interactive features.\n */\nexport function FlatTreeView<K extends string | number, D>({\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n data,\n selectionMode = 'none',\n selectedKeys = { all: false, keys: new Set() },\n onSelectionChange,\n onToggle,\n viewportConfig,\n ...rest\n}: Props<K, D>) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [liveRegion, setLiveRegion] = useState<string>();\n const { collection_loading, collection_loaded } = useTranslationBundle<BundleType>(\n '@oracle/oraclejet-preact'\n );\n const loadingDescId = useId();\n\n const isExpanded = useCallback((key: K) => {\n if (rootRef.current) {\n const elem = findElementByKey(rootRef.current, key, TREE_ITEM_SELECTOR);\n return elem?.getAttribute('aria-expanded') === 'true';\n }\n return false;\n }, []);\n\n const { treeNavigationProps, currentKey, showFocusRing } = useTreeNavigation(\n data,\n rootRef,\n isExpanded,\n idExtractor\n );\n\n const items: InternalTreeNode<K, D>[] = useMemo(\n () =>\n data?.map((value: FlattenedTreeNode<K, D>) => {\n const itemKey = value.metadata.key;\n const newValue = { ...value } as InternalTreeNode<K, D>;\n newValue.metadata.selected = containsKey(selectedKeys, itemKey);\n newValue.metadata.hasFocus = currentKey === itemKey && showFocusRing;\n return newValue;\n }) || [],\n [data, selectedKeys, currentKey, showFocusRing]\n );\n\n const expandCollapseProps = useExpandCollapse(\n (element: HTMLElement) => {\n if (element.getAttribute('role') === 'tree') {\n return currentKey === undefined ? null : currentKey;\n }\n return keyExtractor(element, TREE_ITEM_SELECTOR) as K;\n },\n isExpanded,\n onToggle,\n true\n );\n\n // tracking the anchor key which is used for shift+click selection\n const anchorKey = useRef<K | undefined>();\n\n const handleSelectionChange = useCallback(\n (detail: SelectionDetail<K>) => {\n if (onSelectionChange) {\n if (detail.value.all === false && detail.value.keys.size > 0) {\n // during regular selection, the last key selected by a user gesture is the anchor key\n anchorKey.current = Array.from(detail.value.keys.values()).pop();\n }\n onSelectionChange(detail);\n }\n },\n [anchorKey, onSelectionChange]\n );\n\n const handleSelectionRangeChange = useCallback(\n (detail: SelectionRangeDetail<K>) => {\n if (data && onSelectionChange) {\n const value = handleSelectionRange(detail, data);\n if (Array.isArray(value)) {\n if (detail.eventType === 'shiftSpace') {\n // during range selection by shift+space, the first key selected by a user gesture is the anchor key\n anchorKey.current = detail.value.start;\n } else {\n // during range selection by shift+click/arrow keys, the last key selected by a user gesture is the anchor key\n anchorKey.current = detail.value.end;\n }\n if (selectionMode === 'multipleToggle') {\n const keys = addKeys(selectedKeys, value);\n onSelectionChange({ value: keys, target: null });\n } else {\n onSelectionChange({ value: { all: false, keys: new Set(value) }, target: null });\n }\n }\n }\n },\n [data, selectedKeys, onSelectionChange]\n );\n\n // single or multiple selection mode\n const { selectionProps } = useSelection(\n (element: HTMLElement) => {\n if (element === rootRef.current) {\n return currentKey === undefined ? null : currentKey;\n }\n return keyExtractor(element, TREE_ITEM_SELECTOR) as K;\n },\n selectedKeys,\n selectionMode === 'multipleToggle' ? 'none' : selectionMode,\n false,\n 'replace',\n handleSelectionChange,\n anchorKey.current,\n currentKey,\n (currentKey: K | undefined, isPrev: boolean) =>\n getPrevNextKey(rootRef.current, currentKey, isPrev, TREE_ITEM_SELECTOR),\n undefined,\n (key: K) => {\n if (rootRef.current) {\n const elem = findElementByKey(rootRef.current, key, TREE_ITEM_SELECTOR);\n if (elem) {\n elem.scrollIntoView({ block: 'nearest' });\n }\n }\n },\n handleSelectionRangeChange\n );\n\n // multipleToggle selection mode\n const { eventProps: multipleToggleSelectionProps } = useAdditiveSelection(\n (element: HTMLElement) => {\n if (element === rootRef.current) {\n return currentKey === undefined ? null : currentKey;\n }\n return keyExtractor(element, TREE_ITEM_SELECTOR) as K;\n },\n selectedKeys,\n selectionMode === 'multipleToggle' ? 'multiple' : 'none',\n false,\n (key: K) => {\n if (data) {\n return data.findIndex((value: FlattenedTreeNode<K, D>) => value.metadata.key === key);\n }\n return -1;\n },\n (startIndex: number, endIndex: number) => {\n if (data) {\n const keys = data.map((value: FlattenedTreeNode<K, D>) => value.metadata.key);\n return keys.slice(startIndex, endIndex);\n }\n return [];\n },\n (currentKey: K | undefined, isPrev: boolean) =>\n getPrevNextKey(rootRef.current, currentKey, isPrev, TREE_ITEM_SELECTOR),\n currentKey,\n handleSelectionChange,\n handleSelectionRangeChange\n );\n\n //Note: onKeyUp doesn't work with the cmd key\n const selectAllWithKeyboard = useCallback(\n (event: KeyboardEvent) => {\n if (selectionMode === 'multiple' || selectionMode === 'multipleToggle') {\n if (onSelectionChange && (event.metaKey || event.ctrlKey) && event.key === 'a') {\n event.preventDefault();\n onSelectionChange({\n value: { all: true, deletedKeys: new Set() },\n target: event.target\n });\n }\n }\n },\n [onSelectionChange, selectionMode]\n );\n\n const { classes } = useComponentTheme(TreeViewRedwoodTheme);\n viewportConfig = getViewportConfig(rootRef, viewportConfig);\n\n const updateContextCallback = useCallback(\n (context: ListItemRendererContext<K, D>) => {\n const key = context.metadata.key;\n context.selector =\n selectionMode === 'none' || selectionMode === 'single'\n ? undefined\n : (ariaLabel?: string) => (\n <div aria-hidden={isMobile() ? undefined : true}>\n <Selector\n aria-label={isMobile() ? ariaLabel : undefined}\n rowKey={key}\n selectedKeys={selectedKeys}\n onChange={onSelectionChange}\n />\n </div>\n );\n },\n [selectionMode, selectedKeys, onSelectionChange]\n );\n\n const updateLiveRegion = useCallback(() => {\n setLiveRegion(collection_loading());\n }, [collection_loading]);\n\n return (\n <>\n <div\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={\n data == null\n ? ariaDescribedBy\n ? [...new Set(ariaDescribedBy.split(/\\s+/).concat(loadingDescId))].join(' ')\n : loadingDescId\n : ariaDescribedBy\n }\n ref={rootRef}\n role=\"tree\"\n aria-multiselectable={selectionMode === 'multiple' ? true : false}\n tabIndex={0}\n class={classes}\n {...mergeProps(\n treeNavigationProps,\n selectionProps,\n multipleToggleSelectionProps,\n expandCollapseProps,\n { onKeyDown: selectAllWithKeyboard }\n )}>\n {data == null ? (\n defaultLoadingIndicator(updateLiveRegion)\n ) : (\n <LoadMoreTreeCollection\n data={items}\n selectionMode={selectionMode}\n onToggle={onToggle}\n viewportConfig={viewportConfig}\n updateContext={updateContextCallback}\n {...rest}></LoadMoreTreeCollection>\n )}\n </div>\n <HiddenAccessible id={loadingDescId}>{collection_loading()}</HiddenAccessible>\n <LiveRegion>\n {data == null ? liveRegion : liveRegion === collection_loading() ? collection_loaded() : ''}\n </LiveRegion>\n </>\n );\n}\n\nconst defaultLoadingIndicator = (callback: () => void) => {\n return (\n <SkeletonContainer minimumCount={8} onSkeletonVisible={callback}>\n {() => {\n return <TreeItemSkeletons />;\n }}\n </SkeletonContainer>\n );\n};\n\nconst idExtractor = (elem: Element) => elem.id;\n\n/**\n * A helper function to handle range selection\n */\nexport const handleSelectionRange = <K, D>(\n detail: SelectionRangeDetail<K>,\n data: FlattenedTreeNode<K, D>[]\n) => {\n const keys = data.map((value: FlattenedTreeNode<K, D>) => {\n return value.metadata.key;\n });\n const startIndex = keys.indexOf(detail.value.start);\n const endIndex = keys.indexOf(detail.value.end);\n const minIndex = Math.min(startIndex, endIndex);\n const maxIndex = Math.max(startIndex, endIndex);\n if (minIndex === -1) {\n // return a range to fetch so we can find all the keys, maxIndex should not be -1\n return { offset: 0, count: -1 };\n } else {\n // range of keys are in the current viewport, return them\n return keys.slice(minIndex, maxIndex + 1);\n }\n};\n"],"names":["NodeSkeletonContainer","children","indentation","isVisible","setIsVisible","useState","useEffect","setTimeout","_jsx","role","View","paddingInlineStart","Array","map","_element","index","TreeItemSkeleton","isLeaf","calcIndentation","undefined","padding","_jsxs","Flex","height","align","gap","Skeleton","width","borderRadius","TreeItemSkeletons","_Fragment","TreeItem","itemKey","depth","context","isExpanded","onToggle","selected","isSelectable","isCheckboxless","isTabbable","isLoading","isFocusRingVisible","rootRef","useRef","skeletonIndentation","isHover","hoverProps","useHover","classes","classNames","styles","treeItemStyles","base","focused","checkboxlessSelected","hovered","jsx","ref","id","useId","tabIndex","isMobile","class","selectedHoveredOverlay","TabbableModeContext","Provider","value","Expander","expanded","platform","getClientHints","expanderPlaceholder","Math","max","cssVars","treeViewVars","indentWidth","SkeletonContainer","minimumCount","onSkeletonVisible","containerClasses","skeletonStyles","container","LoadMoreTreeCollection","data","selectionMode","viewportConfig","hasMore","onLoadMore","loadMoreIndicator","defaultLoadMoreIndicator","updateContext","LoadMoreCollection","key","metadata","treeItemContext","treeDepth","hasFocus","LOADMORE_STYLE_CLASS","TREE_ITEM_SELECTOR","findParentElementByKey","root","itemSelector","items","from","querySelectorAll","findIndex","i","dataset","level","getAttribute","Number","defaultLoadingIndicator","callback","idExtractor","elem","handleSelectionRange","detail","keys","startIndex","indexOf","start","endIndex","end","minIndex","min","maxIndex","offset","count","slice","ariaLabel","ariaLabelledBy","ariaDescribedBy","selectedKeys","all","Set","onSelectionChange","rest","liveRegion","setLiveRegion","collection_loading","collection_loaded","useTranslationBundle","loadingDescId","useCallback","current","findElementByKey","treeNavigationProps","currentKey","showFocusRing","direction","useUser","arrowKeyAndHandlers","ArrowUp","getPrevNextKey","ArrowDown","navigationProps","onCurrentKeyChange","useNavigation","itemKeyExtractor","element","keyExtractor","onKeyUp","event","isRtl","isLeftArrow","target","contains","item","parent","newKey","isKeyDefined","mergeProps","useTreeNavigation","useMemo","newValue","containsKey","expandCollapseProps","useExpandCollapse","anchorKey","handleSelectionChange","size","values","pop","handleSelectionRangeChange","isArray","eventType","addKeys","selectionProps","useSelection","isPrev","scrollIntoView","block","eventProps","multipleToggleSelectionProps","useAdditiveSelection","selectAllWithKeyboard","metaKey","ctrlKey","preventDefault","deletedKeys","useComponentTheme","TreeViewRedwoodTheme","getViewportConfig","updateContextCallback","selector","Selector","rowKey","onChange","updateLiveRegion","split","concat","join","onKeyDown","HiddenAccessible","LiveRegion"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- define(['exports', 'preact/jsx-runtime', 'preact/compat', 'preact/hooks', './Flex-4b81b412', './Label-701506b1', './useDisplayValue-e70c76d8', './Separator-181f7541', './logger-0f873e29', './TabbableModeContext-a9c97640', './LayerHost-0b288129', 'css!./UserAssistanceStyles.styles.css', 'module', './UNSAFE_UserAssistance/themes/redwood/UserAssistanceVariants.css', './InlineUserAssistance-a59440e5', 'css!./MessageBannerStyles.styles.css', 'module', './UNSAFE_MessageBanner/themes/redwood/MessageBannerVariants.css', 'preact', 'css!./TooltipContentStyles.styles.css', 'module', './hooks/UNSAFE_useTooltip/themes/redwood/TooltipContentVariants.css', './tooltipUtils-2bb62284', 'css!./IconStyle.styles.css', './IconButton-dc1be00e', 'css!./MessageStyles.styles.css', './MessageFormattingUtils-ea0be23e', './TransitionGroup-3b9d81b6', './MessagesContext-602a69a2', 'css!./HiddenAccessibleStyles.styles.css', 'css!./ComponentMessageStyles.styles.css', 'module', './UNSAFE_ComponentMessage/themes/redwood/ComponentMessageVariants.css', './FormFieldContext-a024b891', './Popup-6b57cc3e', 'css!./LabelStyles.styles.css', 'module', './UNSAFE_Label/themes/redwood/LabelVariants.css', './InputGroupContext-372087af', 'module', './UNSAFE_Popup/themes/redwood/PopupVariants.css', './View-35699bb2', './FormContext-6b0879a0', './useFormContext-b8cbbb21', './useLoadingIndicatorTimer-20a3bf5f', './useTextField-3ab0a23b', './useTranslationBundle-e4dd341e', './keyboardUtils-fb6219eb', './tabbableUtils-f95361a6', './unsafeDomAccess-602c5dde', './useSelectCommon-28307b63'], (function(e,s,t,n,o,a,r,i,l,c,d,u,b,p,h,S,m,y,x,C,g,F,v,f,w,A,T,U,E,L,k,I,K,B,R,P,M,_,j,V,N,D,O,z,Y,$,G,H,W,q,Z){"use strict";const J={isTabbable:!1};const Q=t.forwardRef((function(e,t){const{data:l,itemRenderer:d,itemText:u,label:b,onLoadRange:p,testId:S,userAssistancePosition:m="belowList"}=e,{collectionRendererContext:y,formFieldContext:x,hasUserAssistance:C,isEmptyResults:g,isUserFiltering:F,labelProps:v,listContainerProps:f,selectSingleFieldProps:w,selectFieldInputProps:A,userAssistanceProps:T}=function({"aria-describedby":e,assistiveText:s,data:t,hasBackIcon:o="never",hasClearIcon:a="never",helpSourceLink:i,helpSourceText:l,isLoading:c,itemText:d,label:u,onBackIconAction:b,onCommit:p,onFilter:h,placeholder:S,textAlign:m,valueItem:y,virtualKeyboard:x},C){const g=n.useRef(null),{textAlign:F}=z.useFormContext(),v=m??F??"start",f=null!=t&&!Z.isBeforeDataFetch(t),w=f&&0===t?.totalSize,A=n.useRef(t),T=n.useRef(y),U=n.useRef(!0),[E,L]=n.useState(void 0===y?void 0:new Set([y.key])),k=Y.useLoadingIndicatorTimer(c??!1),I=r.useDisplayValue(d,y,"InlineSelectSingle");n.useImperativeHandle(C,(()=>({focus:()=>g.current?.focus(),blur:()=>g.current?.blur(),[q.UNSAFE_DOM_ACCESS]:g.current})),[]);const{currentRowKeyRef:K,currentRowOverride:B,dropdownRef:R,isFocused:P,isUserFiltering:M,onCurrentKeyChange:_,searchText:j,setCurrentRowOverride:V,stopFiltering:N,updateFiltering:D,userInput:O}=Z.useSelectCommon({data:t,inputRef:g,isFocused:!0,onFilter:h}),{baseId:J,formFieldContext:Q,inputProps:X,labelProps:ee,userAssistanceProps:se}=$.useTextField({ariaDescribedBy:e,helpSourceLink:i,helpSourceText:l,isFocused:P,isLoading:k,value:void 0!==y||void 0}),te=`${J}-list`;Q.hasValue=c||Q.hasValue;const ne=G.useTranslationBundle("@oracle/oraclejet-preact"),oe=f?0===t?.totalSize?ne.select_noMatchesFound():1===t?.totalSize?ne.select_oneMatchFound():"exact"===t?.sizePrecision?ne.select_sizeMatchesFound({TOTAL_SIZE:`${t?.totalSize}`}):ne.select_sizeOrMoreMatchesFound({TOTAL_SIZE:`${t?.totalSize}`}):"";T.current!==y&&(T.current=y,L(void 0===y?void 0:new Set([y.key]))),A.current!==t&&(A.current=t,M&&null!=t&&0===t.offset&&t.data.length>0&&V({rowKey:Z.isSearchTextEmptyOrUndefined(j)?void 0:t.data[0].metadata.key})),U.current&&(U.current=!1,V({rowKey:[...E??[void 0]][0]}));const ae=n.useCallback(((e,s)=>{p?.({value:e,previousValue:void 0!==y?y.key:void 0,reason:s.reason})}),[p,y]),re=n.useCallback((e=>{L(new Set),ae(void 0,e)}),[ae]),ie=n.useCallback((()=>M&&""===O&&void 0!==y),[M,O,y]),le=n.useCallback((e=>{N();const s=e.context.key;L(new Set([s])),ae(s,{reason:"itemAction"})}),[ae,N]),ce=n.useCallback((({value:e})=>{D(e),h?.({searchText:e})}),[h,D]),de=n.useCallback((e=>{if(!H.isControlOrFunctionKey(e))switch(e.code){case H.KEYS.UP:case H.KEYS.DOWN:e.preventDefault();break;case H.KEYS.ENTER:case H.KEYS.TAB:{if(Z.isPhone())return;const s={reason:e.code===H.KEYS.TAB?"tabKey":"itemAction"};if(ie())return void re(s);if(null==t||0===t.data.length)return;if(N(),void 0!==K.current&&null!=t&&t.data.length>0)return L(new Set([K.current])),void ae(K.current,s);ae(y?.key??void 0,s);break}}}),[re,K,t,ie,ae,N,y]),ue=n.useCallback((e=>{if(!H.isControlOrFunctionKey(e))switch(e.code){case H.KEYS.UP:case H.KEYS.DOWN:if(null!=t&&R.current){const e=W.allTabbableElements(R.current,void 0,!0)[0];e?.focus(),void 0===B.rowKey&&V({rowKey:t.data[0]?.metadata?.key})}e.preventDefault()}}),[B,t,R,V]),be=n.useCallback((e=>{e.code===H.KEYS.TAB&&void 0!==K.current&&null!=t&&t.data.length>0&&(L(new Set([K.current])),ae(K.current,{reason:"tabKey"}))}),[K,t,ae]),pe=n.useCallback((()=>{N(),re({reason:"itemAction"}),g.current?.focus(),h?.({searchText:void 0})}),[re,h,N]),he=Z.useCollectionRenderer({currentKey:B.rowKey,searchText:j,selectedKeys:E,onCurrentKeyChange:_,onItemAction:le});return n.useEffect((()=>{const e=R.current?.querySelector('div[role="listbox"][tabindex="0"]');e?.setAttribute("tabindex","-1")})),{collectionRendererContext:he,formFieldContext:Q,hasUserAssistance:Boolean(s||i),isEmptyResults:w,isUserFiltering:M,labelProps:{...ee,children:u},listContainerProps:{id:te,dropdownListRef:R,onKeyDown:be},selectSingleFieldProps:{contentVariant:"input",hasInsideLabel:!0,isBackButtonShown:"always"===o,isClearButtonShown:"conditionally"===a&&void 0!==y,onBackButtonClick:b,onClearButtonClick:pe,styleVariant:"embedded"},selectFieldInputProps:{...X,"aria-controls":te,"aria-expanded":!0,displayValue:I,hasEmptyLabel:!1,hasInsideLabel:!0,inputRef:g,isAddToListShown:!1,isAdvancedSearchShown:!1,isRequired:!1,isUserFiltering:M,liveRegionText:oe,onInput:ce,onKeyDown:de,onKeyUp:ue,placeholder:S,textAlign:v,userInput:O,variant:"embedded",virtualKeyboard:x},userAssistanceProps:{...se,assistiveText:s,fieldLabel:u,helpSourceLink:i,helpSourceText:l}}}(e,t),U=n.useCallback((({onPersistCurrentRowKey:e,onRowAction:t,selected:n,searchText:o,currentRowKeyOverride:a})=>s.jsx(Z.DefaultList,{"aria-label":b,componentName:"InlineSelectSingle",currentItemVariant:"highlight",currentKey:a,data:l,itemRenderer:d,itemText:u,onCurrentKeyChange:e,onItemAction:t,onLoadRange:p,searchText:F?o:void 0,selectedKeys:n,selectionMode:"single"})),[l,F,d,u,b,p]),E=s.jsx(D.View,{minWidth:"100%",padding:"2x",children:s.jsx(h.InlineUserAssistance,{testId:S&&`${S}_userAssistance`,...T})});return s.jsx(o.Flex,{direction:"column",gap:"2x",maxHeight:"100%",width:"100%",children:s.jsxs(B.FormFieldContext.Provider,{value:x,children:[s.jsxs(D.View,{flex:0,children:[s.jsx(r.SelectSingleField,{...w,label:s.jsx(a.Label,{...v}),testId:S&&`${S}_selectSingleField`,children:s.jsx(r.SelectSingleFieldInput,{...A})}),"aboveList"===m&&s.jsx(i.Separator,{}),"aboveList"===m&&C&&s.jsxs(s.Fragment,{children:[E,s.jsx(i.Separator,{})]})]}),"aboveList"!==m&&s.jsx(i.Separator,{}),s.jsx(Z.DropdownList,{...f,hasBottomGap:"aboveList"===m,hasTopGap:!1,children:s.jsx(c.TabbableModeContext.Provider,{value:J,children:g?s.jsx(Z.EmptyResults,{}):U(y)})}),"belowList"===m&&C&&s.jsxs("div",{children:[s.jsx(i.Separator,{}),E]})]})})}));e.InlineSelectSingle=Q}));
2
- //# sourceMappingURL=InlineSelectSingle-f4438110.js.map
1
+ define(['exports', 'preact/jsx-runtime', 'preact/compat', 'preact/hooks', './Flex-4b81b412', './Label-701506b1', './useDisplayValue-0e90bf4c', './Separator-181f7541', './logger-0f873e29', './TabbableModeContext-a9c97640', './LayerHost-0b288129', 'css!./UserAssistanceStyles.styles.css', 'module', './UNSAFE_UserAssistance/themes/redwood/UserAssistanceVariants.css', './InlineUserAssistance-a59440e5', 'css!./MessageBannerStyles.styles.css', 'module', './UNSAFE_MessageBanner/themes/redwood/MessageBannerVariants.css', 'preact', 'css!./TooltipContentStyles.styles.css', 'module', './hooks/UNSAFE_useTooltip/themes/redwood/TooltipContentVariants.css', './tooltipUtils-2bb62284', 'css!./IconStyle.styles.css', './IconButton-dc1be00e', 'css!./MessageStyles.styles.css', './MessageFormattingUtils-ea0be23e', './TransitionGroup-3b9d81b6', './MessagesContext-602a69a2', 'css!./HiddenAccessibleStyles.styles.css', 'css!./ComponentMessageStyles.styles.css', 'module', './UNSAFE_ComponentMessage/themes/redwood/ComponentMessageVariants.css', './FormFieldContext-a024b891', './Popup-6b57cc3e', 'css!./LabelStyles.styles.css', 'module', './UNSAFE_Label/themes/redwood/LabelVariants.css', './InputGroupContext-372087af', 'module', './UNSAFE_Popup/themes/redwood/PopupVariants.css', './View-35699bb2', './FormContext-6b0879a0', './useFormContext-b8cbbb21', './useLoadingIndicatorTimer-20a3bf5f', './useTextField-3ab0a23b', './useTranslationBundle-e4dd341e', './keyboardUtils-fb6219eb', './tabbableUtils-f95361a6', './unsafeDomAccess-602c5dde', './useSelectCommon-a02ddf3c'], (function(e,s,t,n,o,a,r,i,l,c,d,u,b,p,h,S,m,y,x,C,g,F,v,f,w,A,T,U,E,L,k,I,K,B,R,P,M,_,j,V,N,D,O,z,Y,$,G,H,W,q,Z){"use strict";const J={isTabbable:!1};const Q=t.forwardRef((function(e,t){const{data:l,itemRenderer:d,itemText:u,label:b,onLoadRange:p,testId:S,userAssistancePosition:m="belowList"}=e,{collectionRendererContext:y,formFieldContext:x,hasUserAssistance:C,isEmptyResults:g,isUserFiltering:F,labelProps:v,listContainerProps:f,selectSingleFieldProps:w,selectFieldInputProps:A,userAssistanceProps:T}=function({"aria-describedby":e,assistiveText:s,data:t,hasBackIcon:o="never",hasClearIcon:a="never",helpSourceLink:i,helpSourceText:l,isLoading:c,itemText:d,label:u,onBackIconAction:b,onCommit:p,onFilter:h,placeholder:S,textAlign:m,valueItem:y,virtualKeyboard:x},C){const g=n.useRef(null),{textAlign:F}=z.useFormContext(),v=m??F??"start",f=null!=t&&!Z.isBeforeDataFetch(t),w=f&&0===t?.totalSize,A=n.useRef(t),T=n.useRef(y),U=n.useRef(!0),[E,L]=n.useState(void 0===y?void 0:new Set([y.key])),k=Y.useLoadingIndicatorTimer(c??!1),I=r.useDisplayValue(d,y,"InlineSelectSingle");n.useImperativeHandle(C,(()=>({focus:()=>g.current?.focus(),blur:()=>g.current?.blur(),[q.UNSAFE_DOM_ACCESS]:g.current})),[]);const{currentRowKeyRef:K,currentRowOverride:B,dropdownRef:R,isFocused:P,isUserFiltering:M,onCurrentKeyChange:_,searchText:j,setCurrentRowOverride:V,stopFiltering:N,updateFiltering:D,userInput:O}=Z.useSelectCommon({data:t,inputRef:g,isFocused:!0,onFilter:h}),{baseId:J,formFieldContext:Q,inputProps:X,labelProps:ee,userAssistanceProps:se}=$.useTextField({ariaDescribedBy:e,helpSourceLink:i,helpSourceText:l,isFocused:P,isLoading:k,value:void 0!==y||void 0}),te=`${J}-list`;Q.hasValue=c||Q.hasValue;const ne=G.useTranslationBundle("@oracle/oraclejet-preact"),oe=f?0===t?.totalSize?ne.select_noMatchesFound():1===t?.totalSize?ne.select_oneMatchFound():"exact"===t?.sizePrecision?ne.select_sizeMatchesFound({TOTAL_SIZE:`${t?.totalSize}`}):ne.select_sizeOrMoreMatchesFound({TOTAL_SIZE:`${t?.totalSize}`}):"";T.current!==y&&(T.current=y,L(void 0===y?void 0:new Set([y.key]))),A.current!==t&&(A.current=t,M&&null!=t&&0===t.offset&&t.data.length>0&&V({rowKey:Z.isSearchTextEmptyOrUndefined(j)?void 0:t.data[0].metadata.key})),U.current&&(U.current=!1,V({rowKey:[...E??[void 0]][0]}));const ae=n.useCallback(((e,s)=>{p?.({value:e,previousValue:void 0!==y?y.key:void 0,reason:s.reason})}),[p,y]),re=n.useCallback((e=>{L(new Set),ae(void 0,e)}),[ae]),ie=n.useCallback((()=>M&&""===O&&void 0!==y),[M,O,y]),le=n.useCallback((e=>{N();const s=e.context.key;L(new Set([s])),ae(s,{reason:"itemAction"})}),[ae,N]),ce=n.useCallback((({value:e})=>{D(e),h?.({searchText:e})}),[h,D]),de=n.useCallback((e=>{if(!H.isControlOrFunctionKey(e))switch(e.code){case H.KEYS.UP:case H.KEYS.DOWN:e.preventDefault();break;case H.KEYS.ENTER:case H.KEYS.TAB:{if(Z.isPhone())return;const s={reason:e.code===H.KEYS.TAB?"tabKey":"itemAction"};if(ie())return void re(s);if(null==t||0===t.data.length)return;if(N(),void 0!==K.current&&null!=t&&t.data.length>0)return L(new Set([K.current])),void ae(K.current,s);ae(y?.key??void 0,s);break}}}),[re,K,t,ie,ae,N,y]),ue=n.useCallback((e=>{if(!H.isControlOrFunctionKey(e))switch(e.code){case H.KEYS.UP:case H.KEYS.DOWN:if(null!=t&&R.current){const e=W.allTabbableElements(R.current,void 0,!0)[0];e?.focus(),void 0===B.rowKey&&V({rowKey:t.data[0]?.metadata?.key})}e.preventDefault()}}),[B,t,R,V]),be=n.useCallback((e=>{e.code===H.KEYS.TAB&&void 0!==K.current&&null!=t&&t.data.length>0&&(L(new Set([K.current])),ae(K.current,{reason:"tabKey"}))}),[K,t,ae]),pe=n.useCallback((()=>{N(),re({reason:"itemAction"}),g.current?.focus(),h?.({searchText:void 0})}),[re,h,N]),he=Z.useCollectionRenderer({currentKey:B.rowKey,searchText:j,selectedKeys:E,onCurrentKeyChange:_,onItemAction:le});return n.useEffect((()=>{const e=R.current?.querySelector('div[role="listbox"][tabindex="0"]');e?.setAttribute("tabindex","-1")})),{collectionRendererContext:he,formFieldContext:Q,hasUserAssistance:Boolean(s||i),isEmptyResults:w,isUserFiltering:M,labelProps:{...ee,children:u},listContainerProps:{id:te,dropdownListRef:R,onKeyDown:be},selectSingleFieldProps:{contentVariant:"input",hasInsideLabel:!0,isBackButtonShown:"always"===o,isClearButtonShown:"conditionally"===a&&void 0!==y,onBackButtonClick:b,onClearButtonClick:pe,styleVariant:"embedded"},selectFieldInputProps:{...X,"aria-controls":te,"aria-expanded":!0,displayValue:I,hasEmptyLabel:!1,hasInsideLabel:!0,inputRef:g,isAddToListShown:!1,isAdvancedSearchShown:!1,isRequired:!1,isUserFiltering:M,liveRegionText:oe,onInput:ce,onKeyDown:de,onKeyUp:ue,placeholder:S,textAlign:v,userInput:O,variant:"embedded",virtualKeyboard:x},userAssistanceProps:{...se,assistiveText:s,fieldLabel:u,helpSourceLink:i,helpSourceText:l}}}(e,t),U=n.useCallback((({onPersistCurrentRowKey:e,onRowAction:t,selected:n,searchText:o,currentRowKeyOverride:a})=>s.jsx(Z.DefaultList,{"aria-label":b,componentName:"InlineSelectSingle",currentItemVariant:"highlight",currentKey:a,data:l,itemRenderer:d,itemText:u,onCurrentKeyChange:e,onItemAction:t,onLoadRange:p,searchText:F?o:void 0,selectedKeys:n,selectionMode:"single"})),[l,F,d,u,b,p]),E=s.jsx(D.View,{minWidth:"100%",padding:"2x",children:s.jsx(h.InlineUserAssistance,{testId:S&&`${S}_userAssistance`,...T})});return s.jsx(o.Flex,{direction:"column",gap:"2x",maxHeight:"100%",width:"100%",children:s.jsxs(B.FormFieldContext.Provider,{value:x,children:[s.jsxs(D.View,{flex:0,children:[s.jsx(r.SelectSingleField,{...w,label:s.jsx(a.Label,{...v}),testId:S&&`${S}_selectSingleField`,children:s.jsx(r.SelectSingleFieldInput,{...A})}),"aboveList"===m&&s.jsx(i.Separator,{}),"aboveList"===m&&C&&s.jsxs(s.Fragment,{children:[E,s.jsx(i.Separator,{})]})]}),"aboveList"!==m&&s.jsx(i.Separator,{}),s.jsx(Z.DropdownList,{...f,hasBottomGap:"aboveList"===m,hasTopGap:!1,children:s.jsx(c.TabbableModeContext.Provider,{value:J,children:g?s.jsx(Z.EmptyResults,{}):U(y)})}),"belowList"===m&&C&&s.jsxs("div",{children:[s.jsx(i.Separator,{}),E]})]})})}));e.InlineSelectSingle=Q}));
2
+ //# sourceMappingURL=InlineSelectSingle-7c1cc5b5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InlineSelectSingle-f4438110.js","sources":["../../src/UNSAFE_InlineSelectSingle/InlineSelectSingle.tsx","../../src/UNSAFE_InlineSelectSingle/useInlineSelectSingle.ts"],"sourcesContent":["/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type { ContextType, JSX, Ref } from 'preact';\nimport { forwardRef } from 'preact/compat';\nimport { useCallback } from 'preact/hooks';\n\nimport {\n DefaultList,\n DropdownList,\n EmptyResults,\n type SelectSingleCollectionRendererContext\n} from '#PRIVATE_SelectCommon';\nimport { Flex } from '#UNSAFE_Flex';\nimport { Label } from '#UNSAFE_Label';\nimport { SelectSingleField } from '#UNSAFE_SelectSingle/SelectSingleField';\nimport { SelectSingleFieldInput } from '#UNSAFE_SelectSingle/SelectSingleFieldInput';\nimport { Separator } from '#UNSAFE_Separator';\nimport { InlineUserAssistance } from '#UNSAFE_UserAssistance';\nimport { View } from '#UNSAFE_View';\nimport { FormFieldContext } from '#hooks/UNSAFE_useFormFieldContext';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport type { Data, InlineSelectHandle, InlineSelectSingleProps, Key } from './types';\nimport { useInlineSelectSingle } from './useInlineSelectSingle';\n\nconst PREVENT_TABBING = { isTabbable: false } satisfies ContextType<typeof TabbableModeContext>;\n\n/**\n * A InlineSelectSingle is a text field with an inline list that supports single selection and search filtering.\n * Note: This is only meant to be used by the Spectra Smart Search component. As such, it only has limited features\n * needed for the Smart Search component.\n */\nfunction InlineSelectSingleImpl<K extends Key, D extends Data>(\n props: InlineSelectSingleProps<K, D>,\n ref: Ref<InlineSelectHandle>\n) {\n const {\n data,\n itemRenderer,\n itemText,\n label,\n onLoadRange,\n testId,\n userAssistancePosition = 'belowList'\n } = props;\n const {\n collectionRendererContext,\n formFieldContext,\n hasUserAssistance,\n isEmptyResults,\n isUserFiltering,\n labelProps,\n listContainerProps,\n selectSingleFieldProps,\n selectFieldInputProps,\n userAssistanceProps\n } = useInlineSelectSingle(props, ref);\n\n const defaultCollectionRenderer = useCallback(\n ({\n onPersistCurrentRowKey,\n onRowAction,\n selected,\n searchText,\n currentRowKeyOverride\n }: SelectSingleCollectionRendererContext<K, D>) => (\n <DefaultList\n aria-label={label}\n componentName=\"InlineSelectSingle\"\n currentItemVariant=\"highlight\"\n currentKey={currentRowKeyOverride}\n data={data}\n itemRenderer={itemRenderer}\n itemText={itemText}\n onCurrentKeyChange={onPersistCurrentRowKey}\n onItemAction={onRowAction}\n onLoadRange={onLoadRange}\n searchText={isUserFiltering ? searchText : undefined}\n selectedKeys={selected}\n selectionMode=\"single\"\n />\n ),\n [data, isUserFiltering, itemRenderer, itemText, label, onLoadRange]\n );\n\n const userAssistance = (\n <View minWidth=\"100%\" padding=\"2x\">\n <InlineUserAssistance\n testId={testId && `${testId}_userAssistance`}\n {...userAssistanceProps}\n />\n </View>\n );\n\n return (\n <Flex direction=\"column\" gap=\"2x\" maxHeight=\"100%\" width=\"100%\">\n <FormFieldContext.Provider value={formFieldContext}>\n <View flex={0}>\n <SelectSingleField\n {...selectSingleFieldProps}\n label={<Label {...labelProps} />}\n testId={testId && `${testId}_selectSingleField`}>\n <SelectSingleFieldInput {...selectFieldInputProps} />\n </SelectSingleField>\n {/* Render separator & UA without gaps when we are configured for UA between the field and the dropdown */}\n {userAssistancePosition === 'aboveList' && <Separator />}\n {userAssistancePosition === 'aboveList' && hasUserAssistance && (\n <>\n {userAssistance}\n <Separator />\n </>\n )}\n </View>\n {/* Render separator with gaps when we are not configured for UA between the field and the dropdown */}\n {userAssistancePosition !== 'aboveList' && <Separator />}\n <DropdownList\n {...listContainerProps}\n // Add bottom gap only when we are configured to show UA above the list\n hasBottomGap={userAssistancePosition === 'aboveList'}\n hasTopGap={false}>\n <TabbableModeContext.Provider value={PREVENT_TABBING}>\n {isEmptyResults ? (\n <EmptyResults />\n ) : (\n defaultCollectionRenderer(collectionRendererContext)\n )}\n </TabbableModeContext.Provider>\n </DropdownList>\n {userAssistancePosition === 'belowList' && hasUserAssistance && (\n <div>\n <Separator />\n {userAssistance}\n </div>\n )}\n </FormFieldContext.Provider>\n </Flex>\n );\n}\n\nexport const InlineSelectSingle = forwardRef(InlineSelectSingleImpl) as {\n <K extends Key, D extends Data>(\n props: InlineSelectSingleProps<K, D> & { ref?: Ref<InlineSelectHandle> }\n ): JSX.Element;\n}; // forwardRef will remove generics, so we cast it explicitly to preserve generics.;\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type { ComponentProps, Ref } from 'preact';\nimport { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'preact/hooks';\n\nimport {\n type DropdownList,\n isBeforeDataFetch,\n isPhone,\n isSearchTextEmptyOrUndefined,\n useCollectionRenderer,\n UseCollectionRendererSelectSingleParams,\n useSelectCommon\n} from '#PRIVATE_SelectCommon';\nimport type { Label } from '#UNSAFE_Label';\nimport type { SelectSingleField } from '#UNSAFE_SelectSingle/SelectSingleField';\nimport type { SelectSingleFieldInput } from '#UNSAFE_SelectSingle/SelectSingleFieldInput';\nimport { useDisplayValue } from '#UNSAFE_SelectSingle/useDisplayValue';\nimport type { InlineUserAssistance } from '#UNSAFE_UserAssistance';\nimport { useFormContext } from '#hooks/UNSAFE_useFormContext';\nimport { useLoadingIndicatorTimer } from '#hooks/UNSAFE_useLoadingIndicatorTimer';\nimport { useTextField } from '#hooks/UNSAFE_useTextField';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { isControlOrFunctionKey, KEYS } from '#utils/PRIVATE_keyboardUtils';\nimport { allTabbableElements } from '#utils/PRIVATE_tabbableUtils';\nimport type { ValueUpdateDetail } from '#utils/UNSAFE_valueUpdateDetail';\nimport type {\n CommitMetadata,\n Data,\n InlineSelectHandle,\n InlineSelectSingleProps,\n Key\n} from './types';\nimport { UNSAFE_DOM_ACCESS } from '#utils/UNSAFE_unsafeDomAccess';\n\ntype UseInlineSelectSingleOptions<K extends Key, D extends Data> = InlineSelectSingleProps<K, D>;\n\n/**\n * A custom hook for determining prop values for the InlineSelectSingle's child\n * components from its own props.\n * @param param0 options\n * @param ref The ref handle of the component.\n */\nexport function useInlineSelectSingle<K extends Key, D extends Data>(\n {\n 'aria-describedby': ariaDescribedBy,\n assistiveText,\n data,\n hasBackIcon = 'never',\n hasClearIcon = 'never',\n helpSourceLink,\n helpSourceText,\n isLoading: propIsLoading,\n itemText,\n label,\n onBackIconAction,\n onCommit: propOnCommit,\n onFilter,\n placeholder,\n textAlign: propTextAlign,\n valueItem,\n virtualKeyboard\n }: UseInlineSelectSingleOptions<K, D>,\n ref: Ref<InlineSelectHandle>\n) {\n const inputRef = useRef<HTMLInputElement>(null);\n const { textAlign: formTextAlign } = useFormContext();\n const textAlign = propTextAlign ?? formTextAlign ?? 'start';\n const isDataFetched = data != null && !isBeforeDataFetch<K, D>(data);\n const isEmptyResults = isDataFetched && data?.totalSize === 0;\n\n // Refs to keep track of prop changes and sync internal state\n const prevDataRef = useRef(data);\n const prevValueItemRef = useRef(valueItem);\n const isInitialRender = useRef(true);\n\n // State for holding the selected keys in the list\n const [selectedKeys, setSelectedKeys] = useState(\n valueItem === undefined ? undefined : new Set([valueItem.key])\n );\n\n // The incoming propIsLoading tells us that we are in a loading state, but we don't want to\n // show the loading indicator until after a delay, because showing it immediately could result\n // in unwanted flashing. The isLoading var below will be set to true by useLoadingIndicatorTimer\n // after the delay, when the timer expires, at which point we should show the loading indicator.\n // If propIsLoading is set to false before the timer expires, then the timer will be cancelled\n // and no loading indicator will be shown.\n // (ListView detects its loading state by checking data === null. While it would be nice for\n // us to be consistent and check valueItems === null, we need to use a separate isLoading prop.\n // If valueItems === null triggers our loading state, then the selections in the dropdown\n // are cleared for that period of time, which is undesirable.)\n const isLoading = useLoadingIndicatorTimer(propIsLoading ?? false);\n const displayValue = useDisplayValue(itemText, valueItem, 'InlineSelectSingle');\n\n // add methods to the ref\n useImperativeHandle(\n ref,\n () => ({\n focus: () => inputRef.current?.focus(),\n blur: () => inputRef.current?.blur(),\n [UNSAFE_DOM_ACCESS]: inputRef.current!\n }),\n []\n );\n\n const {\n currentRowKeyRef,\n currentRowOverride,\n dropdownRef,\n isFocused,\n isUserFiltering,\n onCurrentKeyChange,\n searchText,\n setCurrentRowOverride,\n stopFiltering,\n updateFiltering,\n userInput\n } = useSelectCommon<K, D>({\n data,\n inputRef,\n // The component can only be in a focused visual state\n isFocused: true,\n onFilter\n });\n\n const { baseId, formFieldContext, inputProps, labelProps, userAssistanceProps } = useTextField({\n ariaDescribedBy,\n helpSourceLink,\n helpSourceText,\n isFocused,\n isLoading,\n value: valueItem !== undefined ? true : undefined\n });\n const listId = `${baseId}-list`;\n\n // If we're waiting for the selected values to load, the component should look like it\n // has a value in the meantime.\n // Use the original propIsLoading instead of isLoading because we don't want to delay\n // the inside label position by a timer like we do the progressive loading indicator.\n formFieldContext.hasValue = propIsLoading || formFieldContext.hasValue;\n\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const liveRegionText = isDataFetched\n ? data?.totalSize === 0\n ? translations.select_noMatchesFound()\n : data?.totalSize === 1\n ? translations.select_oneMatchFound()\n : data?.sizePrecision === 'exact'\n ? translations.select_sizeMatchesFound({ TOTAL_SIZE: `${data?.totalSize}` })\n : translations.select_sizeOrMoreMatchesFound({ TOTAL_SIZE: `${data?.totalSize}` })\n : '';\n\n /**\n * Lifecycle updates\n */\n // When the valueItem changes, save the new selectedKeys\n if (prevValueItemRef.current !== valueItem) {\n prevValueItemRef.current = valueItem;\n setSelectedKeys(valueItem === undefined ? undefined : new Set([valueItem.key]));\n }\n\n // When data changes, highlight the first result\n if (prevDataRef.current !== data) {\n prevDataRef.current = data;\n // when filtering, set the first result of the filtered data set to be the current item\n // (check the data offset so we don't try to highlight again if the user scrolls through\n // the list and more data is fetched)\n if (isUserFiltering && data != null && data.offset === 0 && data.data.length > 0) {\n // if there are results and search text, highlight the first row, otherwise clear\n // an existing highlight\n setCurrentRowOverride({\n rowKey: !isSearchTextEmptyOrUndefined(searchText) ? data.data[0].metadata.key : undefined\n });\n }\n }\n\n // During the initial render, set the current row override if we have selected values.\n // This way pressing DOWN arrow will start the navigation from the selected row.\n if (isInitialRender.current) {\n isInitialRender.current = false;\n setCurrentRowOverride({ rowKey: [...(selectedKeys ?? [undefined])][0] });\n }\n\n /**\n * A helper onCommit wrapper that consumes the metadata and calls the\n * propOnCommit with only the necessary information.\n * (Similar to onCommit in useSelectSingle.ts)\n */\n const onCommit = useCallback(\n (value: K | undefined, metadata: CommitMetadata) => {\n propOnCommit?.({\n value: value,\n previousValue: valueItem !== undefined ? valueItem.key : undefined,\n reason: metadata.reason\n });\n },\n [propOnCommit, valueItem]\n );\n\n /**\n * A helper function to clear the selectedKeys and commits empty value.\n * (Similar to clearValue in useSelectSingle.ts but without dropdown related logic)\n */\n const clearValue = useCallback(\n (metadata: CommitMetadata) => {\n setSelectedKeys(new Set<K>());\n // call the onCommit callback so that the consuming code can update the valueItem\n onCommit(undefined, metadata);\n },\n [onCommit]\n );\n\n /**\n * Determine if we need to clear the value because the user has deleted all the text.\n * (Similar to isClearValueNeeded in useSelectSingle.ts)\n */\n const isClearValueNeeded = useCallback(() => {\n return isUserFiltering && userInput === '' && valueItem !== undefined;\n }, [isUserFiltering, userInput, valueItem]);\n\n /**\n * Handler for List.onItemAction\n * (Similar to useSelectSingle.ts's onItemAction but without dropdown related logic)\n * This is used for handling:\n * - Commits value when one performs an action on the list\n */\n const handleItemAction = useCallback<\n UseCollectionRendererSelectSingleParams<K, D>['onItemAction']\n >(\n (detail) => {\n // after selecting a value, the user is no longer actively filtering, so update related\n // state accordingly so that the newly selected value appears in the field\n stopFiltering();\n\n const newKey = detail.context.key;\n // update the selectedKeys so that the selection visual state of the collection\n // updates immediately while waiting for a new valueItem to be set\n setSelectedKeys(new Set([newKey]));\n // call the onCommit callback so that the consuming code can update the valueItem\n onCommit(newKey, { reason: 'itemAction' });\n },\n [onCommit, stopFiltering]\n );\n\n /**\n * Handler for SelectSingleFieldInput.onInput\n * This is used for handling:\n * - Typing in text in the field should filter the results (i.e. invoke onFilter with the text)\n */\n const handleFieldInput = useCallback(\n ({ value }: ValueUpdateDetail<string>) => {\n updateFiltering(value);\n onFilter?.({ searchText: value });\n },\n [onFilter, updateFiltering]\n );\n\n /**\n * Handler for SelectSingleFieldInput.onKeyDown\n * This is used for handling:\n * - Prevents default browser behavior on UP/DOWN to avoid scrolling\n * - Clears value or selects current row on ENTER\n * - Clears value or selects current row on TAB\n */\n const handleFieldKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // ignore ctrl and fn key events\n if (isControlOrFunctionKey(event)) return;\n\n switch (event.code) {\n case KEYS.UP:\n case KEYS.DOWN:\n // prevent the default action, since we do not want the page to scroll\n event.preventDefault();\n break;\n case KEYS.ENTER:\n case KEYS.TAB: {\n // if this is on a mobile device (only phone and not in tablet devices), do not do anything\n if (isPhone()) return;\n\n // Otherwise, proceed\n const commitMetadata: CommitMetadata = {\n reason: event.code === KEYS.TAB ? 'tabKey' : 'itemAction'\n };\n // check to see if we need to clear the value\n if (isClearValueNeeded()) {\n // in this case, clear the value and return.\n clearValue(commitMetadata);\n return;\n }\n\n // if there is no data to select, no need to handle this event\n if (data == null || data.data.length === 0) return;\n\n // If we will be making a selection, the user is no longer actively filtering,\n // so update related state accordingly so that the newly selected value appears in the field.\n stopFiltering();\n\n // Current design have this component in a dropdown/modal. So, pressing Tab from\n // the main field without doing any other interaction is still considered a selection\n // unlike SelectSingle (see JET-68215). So, we handle both Enter and Tab similarly.\n // If there is a currentRow in the dropdown (meaning a highlighted item that would\n // have keyboard focus if the dropdown list had physical focus, which may be different\n // from the currently selected item), select it and commit it.\n if (currentRowKeyRef.current !== undefined && data != null && data.data.length > 0) {\n setSelectedKeys(new Set<K>([currentRowKeyRef.current]));\n onCommit(currentRowKeyRef.current, commitMetadata);\n return;\n }\n // Otherwise commit the currently selected value again so that a valueAction event\n // can be fired from the core-pack side.\n onCommit(valueItem?.key ?? undefined, commitMetadata);\n break;\n }\n }\n },\n [clearValue, currentRowKeyRef, data, isClearValueNeeded, onCommit, stopFiltering, valueItem]\n );\n\n /**\n * Handler for SelectSingleFieldInput.onKeyUp\n * This is used for handling:\n * - Pressing UP/DOWN from the main field should move the focus to the list\n * - If Ctrl or Fn key is pressed, then ignore the event\n */\n const handleFieldKeyUp = useCallback(\n (event: KeyboardEvent) => {\n // ignore ctrl and fn key events\n if (isControlOrFunctionKey(event)) return;\n\n switch (event.code) {\n case KEYS.UP:\n case KEYS.DOWN:\n // Transfer physical focus into the dropdown only if the data is present and the dropdown\n // has rendered the data. Otherwise, keep the focus in the field.\n if (data != null && dropdownRef.current) {\n // get the focusable element from the dropdown.\n // consider element with tabindex=-1 as well.\n const firstFocusableElem = allTabbableElements(dropdownRef.current, undefined, true)[0];\n // focus the first element if it exists\n firstFocusableElem?.focus();\n\n // set the first row as current row if there is no current row at the moment\n if (currentRowOverride.rowKey === undefined) {\n setCurrentRowOverride({ rowKey: data.data[0]?.metadata?.key });\n }\n }\n // prevent the default action, since we are handling it\n event.preventDefault();\n break;\n }\n },\n [currentRowOverride, data, dropdownRef, setCurrentRowOverride]\n );\n\n /**\n * Handler for DropdownList.onKeyDown\n * This is used for handling:\n * - Pressing Tab when highlighted on a list item should select & commit that item as value\n */\n const handleListKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.code) {\n case KEYS.TAB:\n // if there is a currentRow in the dropdown, select it and commit it\n if (currentRowKeyRef.current !== undefined && data != null && data.data.length > 0) {\n setSelectedKeys(new Set<K>([currentRowKeyRef.current]));\n onCommit(currentRowKeyRef.current, { reason: 'tabKey' });\n }\n break;\n }\n },\n [currentRowKeyRef, data, onCommit]\n );\n\n /**\n * Handler for ClearButton.onClick\n * This is for handling:\n * - on clicking the clear icon, the value & selection should be cleared.\n */\n const handleClearButtonClick = useCallback(() => {\n // reset the user filter and the value of the component\n stopFiltering();\n // clear the value\n clearValue({ reason: 'itemAction' });\n // set focus to the input\n inputRef.current?.focus();\n // call onFilter with undefined\n onFilter?.({ searchText: undefined });\n }, [clearValue, onFilter, stopFiltering]);\n\n /**\n * Create collection Renderer context. This will be used by the default\n * collectionRenderer.\n */\n const collectionRendererContext = useCollectionRenderer<K, D>({\n currentKey: currentRowOverride.rowKey,\n searchText,\n selectedKeys,\n onCurrentKeyChange,\n onItemAction: handleItemAction\n });\n\n // TODO: JET-73973 - ListView is not respecting TabbableMode\n // Currently List does not respect TabbableMode, so for now explicitly set tabindex=\"-1\".\n // When this bug is fixed, this useEffect can be removed.\n useEffect(() => {\n const list = dropdownRef.current?.querySelector('div[role=\"listbox\"][tabindex=\"0\"]');\n list?.setAttribute('tabindex', '-1');\n });\n\n return {\n collectionRendererContext,\n formFieldContext,\n hasUserAssistance: Boolean(assistiveText || helpSourceLink),\n isEmptyResults,\n isUserFiltering,\n labelProps: {\n ...labelProps,\n children: label\n } satisfies ComponentProps<typeof Label>,\n listContainerProps: {\n id: listId,\n dropdownListRef: dropdownRef,\n onKeyDown: handleListKeyDown\n } satisfies ComponentProps<typeof DropdownList>,\n selectSingleFieldProps: {\n contentVariant: 'input',\n // InlineSelectSingle currently only supports inside label.\n hasInsideLabel: true,\n isBackButtonShown: hasBackIcon === 'always',\n isClearButtonShown: hasClearIcon === 'conditionally' && valueItem !== undefined,\n onBackButtonClick: onBackIconAction,\n onClearButtonClick: handleClearButtonClick,\n styleVariant: 'embedded' as const\n } satisfies Omit<ComponentProps<typeof SelectSingleField>, 'children'>,\n selectFieldInputProps: {\n ...inputProps,\n 'aria-controls': listId,\n // InlineSelectSingle always have the list open, so it will always be in an expanded state.\n 'aria-expanded': true,\n displayValue,\n // InlineSelectSingle currently only supports inside label,\n // so it is expected to always have a label.\n hasEmptyLabel: false,\n // InlineSelectSingle currently only supports inside label.\n hasInsideLabel: true,\n inputRef,\n // InlineSelectSingle currently does not support Add to List.\n isAddToListShown: false,\n // InlineSelectSingle currently does not support Advanced Search.\n isAdvancedSearchShown: false,\n // InlineSelectSingle currently does not support Required.\n isRequired: false,\n isUserFiltering,\n liveRegionText,\n onInput: handleFieldInput,\n onKeyDown: handleFieldKeyDown,\n onKeyUp: handleFieldKeyUp,\n placeholder,\n textAlign,\n userInput,\n variant: 'embedded',\n virtualKeyboard\n } satisfies ComponentProps<typeof SelectSingleFieldInput>,\n userAssistanceProps: {\n ...userAssistanceProps,\n assistiveText,\n fieldLabel: label,\n helpSourceLink,\n helpSourceText\n } satisfies ComponentProps<typeof InlineUserAssistance>\n };\n}\n"],"names":["PREVENT_TABBING","isTabbable","InlineSelectSingle","forwardRef","props","ref","data","itemRenderer","itemText","label","onLoadRange","testId","userAssistancePosition","collectionRendererContext","formFieldContext","hasUserAssistance","isEmptyResults","isUserFiltering","labelProps","listContainerProps","selectSingleFieldProps","selectFieldInputProps","userAssistanceProps","ariaDescribedBy","assistiveText","hasBackIcon","hasClearIcon","helpSourceLink","helpSourceText","isLoading","propIsLoading","onBackIconAction","onCommit","propOnCommit","onFilter","placeholder","textAlign","propTextAlign","valueItem","virtualKeyboard","inputRef","useRef","formTextAlign","useFormContext","isDataFetched","isBeforeDataFetch","totalSize","prevDataRef","prevValueItemRef","isInitialRender","selectedKeys","setSelectedKeys","useState","undefined","Set","key","useLoadingIndicatorTimer","displayValue","useDisplayValue","useImperativeHandle","focus","current","blur","UNSAFE_DOM_ACCESS","currentRowKeyRef","currentRowOverride","dropdownRef","isFocused","onCurrentKeyChange","searchText","setCurrentRowOverride","stopFiltering","updateFiltering","userInput","useSelectCommon","baseId","inputProps","useTextField","value","listId","hasValue","translations","useTranslationBundle","liveRegionText","select_noMatchesFound","select_oneMatchFound","sizePrecision","select_sizeMatchesFound","TOTAL_SIZE","select_sizeOrMoreMatchesFound","offset","length","rowKey","isSearchTextEmptyOrUndefined","metadata","useCallback","previousValue","reason","clearValue","isClearValueNeeded","handleItemAction","detail","newKey","context","handleFieldInput","handleFieldKeyDown","event","isControlOrFunctionKey","code","KEYS","UP","DOWN","preventDefault","ENTER","TAB","isPhone","commitMetadata","handleFieldKeyUp","firstFocusableElem","allTabbableElements","handleListKeyDown","handleClearButtonClick","useCollectionRenderer","currentKey","onItemAction","useEffect","list","querySelector","setAttribute","Boolean","children","id","dropdownListRef","onKeyDown","contentVariant","hasInsideLabel","isBackButtonShown","isClearButtonShown","onBackButtonClick","onClearButtonClick","styleVariant","hasEmptyLabel","isAddToListShown","isAdvancedSearchShown","isRequired","onInput","onKeyUp","variant","fieldLabel","useInlineSelectSingle","defaultCollectionRenderer","onPersistCurrentRowKey","onRowAction","selected","currentRowKeyOverride","_jsx","DefaultList","componentName","currentItemVariant","selectionMode","userAssistance","View","minWidth","padding","jsx","InlineUserAssistance","Flex","direction","gap","maxHeight","width","_jsxs","FormFieldContext","Provider","flex","SelectSingleField","Label","SelectSingleFieldInput","Separator","DropdownList","hasBottomGap","hasTopGap","TabbableModeContext","EmptyResults","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"InlineSelectSingle-7c1cc5b5.js","sources":["../../src/UNSAFE_InlineSelectSingle/InlineSelectSingle.tsx","../../src/UNSAFE_InlineSelectSingle/useInlineSelectSingle.ts"],"sourcesContent":["/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type { ContextType, JSX, Ref } from 'preact';\nimport { forwardRef } from 'preact/compat';\nimport { useCallback } from 'preact/hooks';\n\nimport {\n DefaultList,\n DropdownList,\n EmptyResults,\n type SelectSingleCollectionRendererContext\n} from '#PRIVATE_SelectCommon';\nimport { Flex } from '#UNSAFE_Flex';\nimport { Label } from '#UNSAFE_Label';\nimport { SelectSingleField } from '#UNSAFE_SelectSingle/SelectSingleField';\nimport { SelectSingleFieldInput } from '#UNSAFE_SelectSingle/SelectSingleFieldInput';\nimport { Separator } from '#UNSAFE_Separator';\nimport { InlineUserAssistance } from '#UNSAFE_UserAssistance';\nimport { View } from '#UNSAFE_View';\nimport { FormFieldContext } from '#hooks/UNSAFE_useFormFieldContext';\nimport { TabbableModeContext } from '#hooks/UNSAFE_useTabbableMode';\nimport type { Data, InlineSelectHandle, InlineSelectSingleProps, Key } from './types';\nimport { useInlineSelectSingle } from './useInlineSelectSingle';\n\nconst PREVENT_TABBING = { isTabbable: false } satisfies ContextType<typeof TabbableModeContext>;\n\n/**\n * A InlineSelectSingle is a text field with an inline list that supports single selection and search filtering.\n * Note: This is only meant to be used by the Spectra Smart Search component. As such, it only has limited features\n * needed for the Smart Search component.\n */\nfunction InlineSelectSingleImpl<K extends Key, D extends Data>(\n props: InlineSelectSingleProps<K, D>,\n ref: Ref<InlineSelectHandle>\n) {\n const {\n data,\n itemRenderer,\n itemText,\n label,\n onLoadRange,\n testId,\n userAssistancePosition = 'belowList'\n } = props;\n const {\n collectionRendererContext,\n formFieldContext,\n hasUserAssistance,\n isEmptyResults,\n isUserFiltering,\n labelProps,\n listContainerProps,\n selectSingleFieldProps,\n selectFieldInputProps,\n userAssistanceProps\n } = useInlineSelectSingle(props, ref);\n\n const defaultCollectionRenderer = useCallback(\n ({\n onPersistCurrentRowKey,\n onRowAction,\n selected,\n searchText,\n currentRowKeyOverride\n }: SelectSingleCollectionRendererContext<K, D>) => (\n <DefaultList\n aria-label={label}\n componentName=\"InlineSelectSingle\"\n currentItemVariant=\"highlight\"\n currentKey={currentRowKeyOverride}\n data={data}\n itemRenderer={itemRenderer}\n itemText={itemText}\n onCurrentKeyChange={onPersistCurrentRowKey}\n onItemAction={onRowAction}\n onLoadRange={onLoadRange}\n searchText={isUserFiltering ? searchText : undefined}\n selectedKeys={selected}\n selectionMode=\"single\"\n />\n ),\n [data, isUserFiltering, itemRenderer, itemText, label, onLoadRange]\n );\n\n const userAssistance = (\n <View minWidth=\"100%\" padding=\"2x\">\n <InlineUserAssistance\n testId={testId && `${testId}_userAssistance`}\n {...userAssistanceProps}\n />\n </View>\n );\n\n return (\n <Flex direction=\"column\" gap=\"2x\" maxHeight=\"100%\" width=\"100%\">\n <FormFieldContext.Provider value={formFieldContext}>\n <View flex={0}>\n <SelectSingleField\n {...selectSingleFieldProps}\n label={<Label {...labelProps} />}\n testId={testId && `${testId}_selectSingleField`}>\n <SelectSingleFieldInput {...selectFieldInputProps} />\n </SelectSingleField>\n {/* Render separator & UA without gaps when we are configured for UA between the field and the dropdown */}\n {userAssistancePosition === 'aboveList' && <Separator />}\n {userAssistancePosition === 'aboveList' && hasUserAssistance && (\n <>\n {userAssistance}\n <Separator />\n </>\n )}\n </View>\n {/* Render separator with gaps when we are not configured for UA between the field and the dropdown */}\n {userAssistancePosition !== 'aboveList' && <Separator />}\n <DropdownList\n {...listContainerProps}\n // Add bottom gap only when we are configured to show UA above the list\n hasBottomGap={userAssistancePosition === 'aboveList'}\n hasTopGap={false}>\n <TabbableModeContext.Provider value={PREVENT_TABBING}>\n {isEmptyResults ? (\n <EmptyResults />\n ) : (\n defaultCollectionRenderer(collectionRendererContext)\n )}\n </TabbableModeContext.Provider>\n </DropdownList>\n {userAssistancePosition === 'belowList' && hasUserAssistance && (\n <div>\n <Separator />\n {userAssistance}\n </div>\n )}\n </FormFieldContext.Provider>\n </Flex>\n );\n}\n\nexport const InlineSelectSingle = forwardRef(InlineSelectSingleImpl) as {\n <K extends Key, D extends Data>(\n props: InlineSelectSingleProps<K, D> & { ref?: Ref<InlineSelectHandle> }\n ): JSX.Element;\n}; // forwardRef will remove generics, so we cast it explicitly to preserve generics.;\n","/**\n * @license\n * Copyright (c) %FIRST_YEAR% %CURRENT_YEAR%, Oracle and/or its affiliates.\n * The Universal Permissive License (UPL), Version 1.0\n * as shown at https://oss.oracle.com/licenses/upl/\n * @ignore\n */\n\nimport type { ComponentProps, Ref } from 'preact';\nimport { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'preact/hooks';\n\nimport {\n type DropdownList,\n isBeforeDataFetch,\n isPhone,\n isSearchTextEmptyOrUndefined,\n useCollectionRenderer,\n UseCollectionRendererSelectSingleParams,\n useSelectCommon\n} from '#PRIVATE_SelectCommon';\nimport type { Label } from '#UNSAFE_Label';\nimport type { SelectSingleField } from '#UNSAFE_SelectSingle/SelectSingleField';\nimport type { SelectSingleFieldInput } from '#UNSAFE_SelectSingle/SelectSingleFieldInput';\nimport { useDisplayValue } from '#UNSAFE_SelectSingle/useDisplayValue';\nimport type { InlineUserAssistance } from '#UNSAFE_UserAssistance';\nimport { useFormContext } from '#hooks/UNSAFE_useFormContext';\nimport { useLoadingIndicatorTimer } from '#hooks/UNSAFE_useLoadingIndicatorTimer';\nimport { useTextField } from '#hooks/UNSAFE_useTextField';\nimport { useTranslationBundle } from '#hooks/UNSAFE_useTranslationBundle';\nimport type { BundleType } from '#resources/nls/bundle';\nimport { isControlOrFunctionKey, KEYS } from '#utils/PRIVATE_keyboardUtils';\nimport { allTabbableElements } from '#utils/PRIVATE_tabbableUtils';\nimport type { ValueUpdateDetail } from '#utils/UNSAFE_valueUpdateDetail';\nimport type {\n CommitMetadata,\n Data,\n InlineSelectHandle,\n InlineSelectSingleProps,\n Key\n} from './types';\nimport { UNSAFE_DOM_ACCESS } from '#utils/UNSAFE_unsafeDomAccess';\n\ntype UseInlineSelectSingleOptions<K extends Key, D extends Data> = InlineSelectSingleProps<K, D>;\n\n/**\n * A custom hook for determining prop values for the InlineSelectSingle's child\n * components from its own props.\n * @param param0 options\n * @param ref The ref handle of the component.\n */\nexport function useInlineSelectSingle<K extends Key, D extends Data>(\n {\n 'aria-describedby': ariaDescribedBy,\n assistiveText,\n data,\n hasBackIcon = 'never',\n hasClearIcon = 'never',\n helpSourceLink,\n helpSourceText,\n isLoading: propIsLoading,\n itemText,\n label,\n onBackIconAction,\n onCommit: propOnCommit,\n onFilter,\n placeholder,\n textAlign: propTextAlign,\n valueItem,\n virtualKeyboard\n }: UseInlineSelectSingleOptions<K, D>,\n ref: Ref<InlineSelectHandle>\n) {\n const inputRef = useRef<HTMLInputElement>(null);\n const { textAlign: formTextAlign } = useFormContext();\n const textAlign = propTextAlign ?? formTextAlign ?? 'start';\n const isDataFetched = data != null && !isBeforeDataFetch<K, D>(data);\n const isEmptyResults = isDataFetched && data?.totalSize === 0;\n\n // Refs to keep track of prop changes and sync internal state\n const prevDataRef = useRef(data);\n const prevValueItemRef = useRef(valueItem);\n const isInitialRender = useRef(true);\n\n // State for holding the selected keys in the list\n const [selectedKeys, setSelectedKeys] = useState(\n valueItem === undefined ? undefined : new Set([valueItem.key])\n );\n\n // The incoming propIsLoading tells us that we are in a loading state, but we don't want to\n // show the loading indicator until after a delay, because showing it immediately could result\n // in unwanted flashing. The isLoading var below will be set to true by useLoadingIndicatorTimer\n // after the delay, when the timer expires, at which point we should show the loading indicator.\n // If propIsLoading is set to false before the timer expires, then the timer will be cancelled\n // and no loading indicator will be shown.\n // (ListView detects its loading state by checking data === null. While it would be nice for\n // us to be consistent and check valueItems === null, we need to use a separate isLoading prop.\n // If valueItems === null triggers our loading state, then the selections in the dropdown\n // are cleared for that period of time, which is undesirable.)\n const isLoading = useLoadingIndicatorTimer(propIsLoading ?? false);\n const displayValue = useDisplayValue(itemText, valueItem, 'InlineSelectSingle');\n\n // add methods to the ref\n useImperativeHandle(\n ref,\n () => ({\n focus: () => inputRef.current?.focus(),\n blur: () => inputRef.current?.blur(),\n [UNSAFE_DOM_ACCESS]: inputRef.current!\n }),\n []\n );\n\n const {\n currentRowKeyRef,\n currentRowOverride,\n dropdownRef,\n isFocused,\n isUserFiltering,\n onCurrentKeyChange,\n searchText,\n setCurrentRowOverride,\n stopFiltering,\n updateFiltering,\n userInput\n } = useSelectCommon<K, D>({\n data,\n inputRef,\n // The component can only be in a focused visual state\n isFocused: true,\n onFilter\n });\n\n const { baseId, formFieldContext, inputProps, labelProps, userAssistanceProps } = useTextField({\n ariaDescribedBy,\n helpSourceLink,\n helpSourceText,\n isFocused,\n isLoading,\n value: valueItem !== undefined ? true : undefined\n });\n const listId = `${baseId}-list`;\n\n // If we're waiting for the selected values to load, the component should look like it\n // has a value in the meantime.\n // Use the original propIsLoading instead of isLoading because we don't want to delay\n // the inside label position by a timer like we do the progressive loading indicator.\n formFieldContext.hasValue = propIsLoading || formFieldContext.hasValue;\n\n const translations = useTranslationBundle<BundleType>('@oracle/oraclejet-preact');\n const liveRegionText = isDataFetched\n ? data?.totalSize === 0\n ? translations.select_noMatchesFound()\n : data?.totalSize === 1\n ? translations.select_oneMatchFound()\n : data?.sizePrecision === 'exact'\n ? translations.select_sizeMatchesFound({ TOTAL_SIZE: `${data?.totalSize}` })\n : translations.select_sizeOrMoreMatchesFound({ TOTAL_SIZE: `${data?.totalSize}` })\n : '';\n\n /**\n * Lifecycle updates\n */\n // When the valueItem changes, save the new selectedKeys\n if (prevValueItemRef.current !== valueItem) {\n prevValueItemRef.current = valueItem;\n setSelectedKeys(valueItem === undefined ? undefined : new Set([valueItem.key]));\n }\n\n // When data changes, highlight the first result\n if (prevDataRef.current !== data) {\n prevDataRef.current = data;\n // when filtering, set the first result of the filtered data set to be the current item\n // (check the data offset so we don't try to highlight again if the user scrolls through\n // the list and more data is fetched)\n if (isUserFiltering && data != null && data.offset === 0 && data.data.length > 0) {\n // if there are results and search text, highlight the first row, otherwise clear\n // an existing highlight\n setCurrentRowOverride({\n rowKey: !isSearchTextEmptyOrUndefined(searchText) ? data.data[0].metadata.key : undefined\n });\n }\n }\n\n // During the initial render, set the current row override if we have selected values.\n // This way pressing DOWN arrow will start the navigation from the selected row.\n if (isInitialRender.current) {\n isInitialRender.current = false;\n setCurrentRowOverride({ rowKey: [...(selectedKeys ?? [undefined])][0] });\n }\n\n /**\n * A helper onCommit wrapper that consumes the metadata and calls the\n * propOnCommit with only the necessary information.\n * (Similar to onCommit in useSelectSingle.ts)\n */\n const onCommit = useCallback(\n (value: K | undefined, metadata: CommitMetadata) => {\n propOnCommit?.({\n value: value,\n previousValue: valueItem !== undefined ? valueItem.key : undefined,\n reason: metadata.reason\n });\n },\n [propOnCommit, valueItem]\n );\n\n /**\n * A helper function to clear the selectedKeys and commits empty value.\n * (Similar to clearValue in useSelectSingle.ts but without dropdown related logic)\n */\n const clearValue = useCallback(\n (metadata: CommitMetadata) => {\n setSelectedKeys(new Set<K>());\n // call the onCommit callback so that the consuming code can update the valueItem\n onCommit(undefined, metadata);\n },\n [onCommit]\n );\n\n /**\n * Determine if we need to clear the value because the user has deleted all the text.\n * (Similar to isClearValueNeeded in useSelectSingle.ts)\n */\n const isClearValueNeeded = useCallback(() => {\n return isUserFiltering && userInput === '' && valueItem !== undefined;\n }, [isUserFiltering, userInput, valueItem]);\n\n /**\n * Handler for List.onItemAction\n * (Similar to useSelectSingle.ts's onItemAction but without dropdown related logic)\n * This is used for handling:\n * - Commits value when one performs an action on the list\n */\n const handleItemAction = useCallback<\n UseCollectionRendererSelectSingleParams<K, D>['onItemAction']\n >(\n (detail) => {\n // after selecting a value, the user is no longer actively filtering, so update related\n // state accordingly so that the newly selected value appears in the field\n stopFiltering();\n\n const newKey = detail.context.key;\n // update the selectedKeys so that the selection visual state of the collection\n // updates immediately while waiting for a new valueItem to be set\n setSelectedKeys(new Set([newKey]));\n // call the onCommit callback so that the consuming code can update the valueItem\n onCommit(newKey, { reason: 'itemAction' });\n },\n [onCommit, stopFiltering]\n );\n\n /**\n * Handler for SelectSingleFieldInput.onInput\n * This is used for handling:\n * - Typing in text in the field should filter the results (i.e. invoke onFilter with the text)\n */\n const handleFieldInput = useCallback(\n ({ value }: ValueUpdateDetail<string>) => {\n updateFiltering(value);\n onFilter?.({ searchText: value });\n },\n [onFilter, updateFiltering]\n );\n\n /**\n * Handler for SelectSingleFieldInput.onKeyDown\n * This is used for handling:\n * - Prevents default browser behavior on UP/DOWN to avoid scrolling\n * - Clears value or selects current row on ENTER\n * - Clears value or selects current row on TAB\n */\n const handleFieldKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // ignore ctrl and fn key events\n if (isControlOrFunctionKey(event)) return;\n\n switch (event.code) {\n case KEYS.UP:\n case KEYS.DOWN:\n // prevent the default action, since we do not want the page to scroll\n event.preventDefault();\n break;\n case KEYS.ENTER:\n case KEYS.TAB: {\n // if this is on a mobile device (only phone and not in tablet devices), do not do anything\n if (isPhone()) return;\n\n // Otherwise, proceed\n const commitMetadata: CommitMetadata = {\n reason: event.code === KEYS.TAB ? 'tabKey' : 'itemAction'\n };\n // check to see if we need to clear the value\n if (isClearValueNeeded()) {\n // in this case, clear the value and return.\n clearValue(commitMetadata);\n return;\n }\n\n // if there is no data to select, no need to handle this event\n if (data == null || data.data.length === 0) return;\n\n // If we will be making a selection, the user is no longer actively filtering,\n // so update related state accordingly so that the newly selected value appears in the field.\n stopFiltering();\n\n // Current design have this component in a dropdown/modal. So, pressing Tab from\n // the main field without doing any other interaction is still considered a selection\n // unlike SelectSingle (see JET-68215). So, we handle both Enter and Tab similarly.\n // If there is a currentRow in the dropdown (meaning a highlighted item that would\n // have keyboard focus if the dropdown list had physical focus, which may be different\n // from the currently selected item), select it and commit it.\n if (currentRowKeyRef.current !== undefined && data != null && data.data.length > 0) {\n setSelectedKeys(new Set<K>([currentRowKeyRef.current]));\n onCommit(currentRowKeyRef.current, commitMetadata);\n return;\n }\n // Otherwise commit the currently selected value again so that a valueAction event\n // can be fired from the core-pack side.\n onCommit(valueItem?.key ?? undefined, commitMetadata);\n break;\n }\n }\n },\n [clearValue, currentRowKeyRef, data, isClearValueNeeded, onCommit, stopFiltering, valueItem]\n );\n\n /**\n * Handler for SelectSingleFieldInput.onKeyUp\n * This is used for handling:\n * - Pressing UP/DOWN from the main field should move the focus to the list\n * - If Ctrl or Fn key is pressed, then ignore the event\n */\n const handleFieldKeyUp = useCallback(\n (event: KeyboardEvent) => {\n // ignore ctrl and fn key events\n if (isControlOrFunctionKey(event)) return;\n\n switch (event.code) {\n case KEYS.UP:\n case KEYS.DOWN:\n // Transfer physical focus into the dropdown only if the data is present and the dropdown\n // has rendered the data. Otherwise, keep the focus in the field.\n if (data != null && dropdownRef.current) {\n // get the focusable element from the dropdown.\n // consider element with tabindex=-1 as well.\n const firstFocusableElem = allTabbableElements(dropdownRef.current, undefined, true)[0];\n // focus the first element if it exists\n firstFocusableElem?.focus();\n\n // set the first row as current row if there is no current row at the moment\n if (currentRowOverride.rowKey === undefined) {\n setCurrentRowOverride({ rowKey: data.data[0]?.metadata?.key });\n }\n }\n // prevent the default action, since we are handling it\n event.preventDefault();\n break;\n }\n },\n [currentRowOverride, data, dropdownRef, setCurrentRowOverride]\n );\n\n /**\n * Handler for DropdownList.onKeyDown\n * This is used for handling:\n * - Pressing Tab when highlighted on a list item should select & commit that item as value\n */\n const handleListKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.code) {\n case KEYS.TAB:\n // if there is a currentRow in the dropdown, select it and commit it\n if (currentRowKeyRef.current !== undefined && data != null && data.data.length > 0) {\n setSelectedKeys(new Set<K>([currentRowKeyRef.current]));\n onCommit(currentRowKeyRef.current, { reason: 'tabKey' });\n }\n break;\n }\n },\n [currentRowKeyRef, data, onCommit]\n );\n\n /**\n * Handler for ClearButton.onClick\n * This is for handling:\n * - on clicking the clear icon, the value & selection should be cleared.\n */\n const handleClearButtonClick = useCallback(() => {\n // reset the user filter and the value of the component\n stopFiltering();\n // clear the value\n clearValue({ reason: 'itemAction' });\n // set focus to the input\n inputRef.current?.focus();\n // call onFilter with undefined\n onFilter?.({ searchText: undefined });\n }, [clearValue, onFilter, stopFiltering]);\n\n /**\n * Create collection Renderer context. This will be used by the default\n * collectionRenderer.\n */\n const collectionRendererContext = useCollectionRenderer<K, D>({\n currentKey: currentRowOverride.rowKey,\n searchText,\n selectedKeys,\n onCurrentKeyChange,\n onItemAction: handleItemAction\n });\n\n // TODO: JET-73973 - ListView is not respecting TabbableMode\n // Currently List does not respect TabbableMode, so for now explicitly set tabindex=\"-1\".\n // When this bug is fixed, this useEffect can be removed.\n useEffect(() => {\n const list = dropdownRef.current?.querySelector('div[role=\"listbox\"][tabindex=\"0\"]');\n list?.setAttribute('tabindex', '-1');\n });\n\n return {\n collectionRendererContext,\n formFieldContext,\n hasUserAssistance: Boolean(assistiveText || helpSourceLink),\n isEmptyResults,\n isUserFiltering,\n labelProps: {\n ...labelProps,\n children: label\n } satisfies ComponentProps<typeof Label>,\n listContainerProps: {\n id: listId,\n dropdownListRef: dropdownRef,\n onKeyDown: handleListKeyDown\n } satisfies ComponentProps<typeof DropdownList>,\n selectSingleFieldProps: {\n contentVariant: 'input',\n // InlineSelectSingle currently only supports inside label.\n hasInsideLabel: true,\n isBackButtonShown: hasBackIcon === 'always',\n isClearButtonShown: hasClearIcon === 'conditionally' && valueItem !== undefined,\n onBackButtonClick: onBackIconAction,\n onClearButtonClick: handleClearButtonClick,\n styleVariant: 'embedded' as const\n } satisfies Omit<ComponentProps<typeof SelectSingleField>, 'children'>,\n selectFieldInputProps: {\n ...inputProps,\n 'aria-controls': listId,\n // InlineSelectSingle always have the list open, so it will always be in an expanded state.\n 'aria-expanded': true,\n displayValue,\n // InlineSelectSingle currently only supports inside label,\n // so it is expected to always have a label.\n hasEmptyLabel: false,\n // InlineSelectSingle currently only supports inside label.\n hasInsideLabel: true,\n inputRef,\n // InlineSelectSingle currently does not support Add to List.\n isAddToListShown: false,\n // InlineSelectSingle currently does not support Advanced Search.\n isAdvancedSearchShown: false,\n // InlineSelectSingle currently does not support Required.\n isRequired: false,\n isUserFiltering,\n liveRegionText,\n onInput: handleFieldInput,\n onKeyDown: handleFieldKeyDown,\n onKeyUp: handleFieldKeyUp,\n placeholder,\n textAlign,\n userInput,\n variant: 'embedded',\n virtualKeyboard\n } satisfies ComponentProps<typeof SelectSingleFieldInput>,\n userAssistanceProps: {\n ...userAssistanceProps,\n assistiveText,\n fieldLabel: label,\n helpSourceLink,\n helpSourceText\n } satisfies ComponentProps<typeof InlineUserAssistance>\n };\n}\n"],"names":["PREVENT_TABBING","isTabbable","InlineSelectSingle","forwardRef","props","ref","data","itemRenderer","itemText","label","onLoadRange","testId","userAssistancePosition","collectionRendererContext","formFieldContext","hasUserAssistance","isEmptyResults","isUserFiltering","labelProps","listContainerProps","selectSingleFieldProps","selectFieldInputProps","userAssistanceProps","ariaDescribedBy","assistiveText","hasBackIcon","hasClearIcon","helpSourceLink","helpSourceText","isLoading","propIsLoading","onBackIconAction","onCommit","propOnCommit","onFilter","placeholder","textAlign","propTextAlign","valueItem","virtualKeyboard","inputRef","useRef","formTextAlign","useFormContext","isDataFetched","isBeforeDataFetch","totalSize","prevDataRef","prevValueItemRef","isInitialRender","selectedKeys","setSelectedKeys","useState","undefined","Set","key","useLoadingIndicatorTimer","displayValue","useDisplayValue","useImperativeHandle","focus","current","blur","UNSAFE_DOM_ACCESS","currentRowKeyRef","currentRowOverride","dropdownRef","isFocused","onCurrentKeyChange","searchText","setCurrentRowOverride","stopFiltering","updateFiltering","userInput","useSelectCommon","baseId","inputProps","useTextField","value","listId","hasValue","translations","useTranslationBundle","liveRegionText","select_noMatchesFound","select_oneMatchFound","sizePrecision","select_sizeMatchesFound","TOTAL_SIZE","select_sizeOrMoreMatchesFound","offset","length","rowKey","isSearchTextEmptyOrUndefined","metadata","useCallback","previousValue","reason","clearValue","isClearValueNeeded","handleItemAction","detail","newKey","context","handleFieldInput","handleFieldKeyDown","event","isControlOrFunctionKey","code","KEYS","UP","DOWN","preventDefault","ENTER","TAB","isPhone","commitMetadata","handleFieldKeyUp","firstFocusableElem","allTabbableElements","handleListKeyDown","handleClearButtonClick","useCollectionRenderer","currentKey","onItemAction","useEffect","list","querySelector","setAttribute","Boolean","children","id","dropdownListRef","onKeyDown","contentVariant","hasInsideLabel","isBackButtonShown","isClearButtonShown","onBackButtonClick","onClearButtonClick","styleVariant","hasEmptyLabel","isAddToListShown","isAdvancedSearchShown","isRequired","onInput","onKeyUp","variant","fieldLabel","useInlineSelectSingle","defaultCollectionRenderer","onPersistCurrentRowKey","onRowAction","selected","currentRowKeyOverride","_jsx","DefaultList","componentName","currentItemVariant","selectionMode","userAssistance","View","minWidth","padding","jsx","InlineUserAssistance","Flex","direction","gap","maxHeight","width","_jsxs","FormFieldContext","Provider","flex","SelectSingleField","Label","SelectSingleFieldInput","Separator","DropdownList","hasBottomGap","hasTopGap","TabbableModeContext","EmptyResults","jsxs"],"mappings":"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"}