@fluentui/react-combobox 9.0.0-beta.8 → 9.0.0

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 (304) hide show
  1. package/CHANGELOG.json +964 -4
  2. package/CHANGELOG.md +274 -5
  3. package/README.md +1 -3
  4. package/dist/index.d.ts +84 -24
  5. package/lib/Combobox.js.map +1 -1
  6. package/lib/ComboboxField.js +2 -0
  7. package/lib/ComboboxField.js.map +1 -0
  8. package/lib/Dropdown.js.map +1 -1
  9. package/lib/Listbox.js.map +1 -1
  10. package/lib/Option.js.map +1 -1
  11. package/lib/OptionGroup.js.map +1 -1
  12. package/lib/components/Combobox/Combobox.js +0 -1
  13. package/lib/components/Combobox/Combobox.js.map +1 -1
  14. package/lib/components/Combobox/Combobox.types.js.map +1 -1
  15. package/lib/components/Combobox/index.js.map +1 -1
  16. package/lib/components/Combobox/renderCombobox.js +11 -8
  17. package/lib/components/Combobox/renderCombobox.js.map +1 -1
  18. package/lib/components/Combobox/useCombobox.js +191 -16
  19. package/lib/components/Combobox/useCombobox.js.map +1 -1
  20. package/lib/components/Combobox/useComboboxStyles.js +253 -161
  21. package/lib/components/Combobox/useComboboxStyles.js.map +1 -1
  22. package/lib/components/ComboboxField/ComboboxField.js +8 -0
  23. package/lib/components/ComboboxField/ComboboxField.js.map +1 -0
  24. package/lib/components/ComboboxField/index.js +2 -0
  25. package/lib/components/ComboboxField/index.js.map +1 -0
  26. package/lib/components/Dropdown/Dropdown.js +0 -1
  27. package/lib/components/Dropdown/Dropdown.js.map +1 -1
  28. package/lib/components/Dropdown/Dropdown.types.js.map +1 -1
  29. package/lib/components/Dropdown/index.js.map +1 -1
  30. package/lib/components/Dropdown/renderDropdown.js +11 -8
  31. package/lib/components/Dropdown/renderDropdown.js.map +1 -1
  32. package/lib/components/Dropdown/useDropdown.js +90 -9
  33. package/lib/components/Dropdown/useDropdown.js.map +1 -1
  34. package/lib/components/Dropdown/useDropdownStyles.js +237 -155
  35. package/lib/components/Dropdown/useDropdownStyles.js.map +1 -1
  36. package/lib/components/Listbox/Listbox.js +0 -1
  37. package/lib/components/Listbox/Listbox.js.map +1 -1
  38. package/lib/components/Listbox/Listbox.types.js.map +1 -1
  39. package/lib/components/Listbox/index.js.map +1 -1
  40. package/lib/components/Listbox/renderListbox.js +2 -2
  41. package/lib/components/Listbox/renderListbox.js.map +1 -1
  42. package/lib/components/Listbox/useListbox.js +35 -29
  43. package/lib/components/Listbox/useListbox.js.map +1 -1
  44. package/lib/components/Listbox/useListboxStyles.js +16 -20
  45. package/lib/components/Listbox/useListboxStyles.js.map +1 -1
  46. package/lib/components/Option/Option.js +0 -1
  47. package/lib/components/Option/Option.js.map +1 -1
  48. package/lib/components/Option/Option.types.js.map +1 -1
  49. package/lib/components/Option/index.js.map +1 -1
  50. package/lib/components/Option/renderOption.js +4 -3
  51. package/lib/components/Option/renderOption.js.map +1 -1
  52. package/lib/components/Option/useOption.js +61 -46
  53. package/lib/components/Option/useOption.js.map +1 -1
  54. package/lib/components/Option/useOptionStyles.js +103 -80
  55. package/lib/components/Option/useOptionStyles.js.map +1 -1
  56. package/lib/components/OptionGroup/OptionGroup.js +0 -1
  57. package/lib/components/OptionGroup/OptionGroup.js.map +1 -1
  58. package/lib/components/OptionGroup/OptionGroup.types.js.map +1 -1
  59. package/lib/components/OptionGroup/index.js.map +1 -1
  60. package/lib/components/OptionGroup/renderOptionGroup.js +4 -3
  61. package/lib/components/OptionGroup/renderOptionGroup.js.map +1 -1
  62. package/lib/components/OptionGroup/useOptionGroup.js +0 -1
  63. package/lib/components/OptionGroup/useOptionGroup.js.map +1 -1
  64. package/lib/components/OptionGroup/useOptionGroupStyles.js +29 -34
  65. package/lib/components/OptionGroup/useOptionGroupStyles.js.map +1 -1
  66. package/lib/contexts/ComboboxContext.js +14 -9
  67. package/lib/contexts/ComboboxContext.js.map +1 -1
  68. package/lib/contexts/ListboxContext.js +11 -8
  69. package/lib/contexts/ListboxContext.js.map +1 -1
  70. package/lib/contexts/useComboboxContextValues.js +8 -2
  71. package/lib/contexts/useComboboxContextValues.js.map +1 -1
  72. package/lib/contexts/useListboxContextValues.js +10 -6
  73. package/lib/contexts/useListboxContextValues.js.map +1 -1
  74. package/lib/index.js +6 -0
  75. package/lib/index.js.map +1 -1
  76. package/lib/utils/ComboboxBase.types.js.map +1 -1
  77. package/lib/utils/OptionCollection.types.js.map +1 -1
  78. package/lib/utils/Selection.types.js.map +1 -1
  79. package/lib/utils/dropdownKeyActions.js +14 -42
  80. package/lib/utils/dropdownKeyActions.js.map +1 -1
  81. package/lib/utils/internalTokens.js.map +1 -1
  82. package/lib/utils/useComboboxBaseState.js +48 -44
  83. package/lib/utils/useComboboxBaseState.js.map +1 -1
  84. package/lib/utils/useComboboxPopup.js +10 -6
  85. package/lib/utils/useComboboxPopup.js.map +1 -1
  86. package/lib/utils/useOptionCollection.js +13 -23
  87. package/lib/utils/useOptionCollection.js.map +1 -1
  88. package/lib/utils/useScrollOptionsIntoView.js +36 -0
  89. package/lib/utils/useScrollOptionsIntoView.js.map +1 -0
  90. package/lib/utils/useSelection.js +20 -14
  91. package/lib/utils/useSelection.js.map +1 -1
  92. package/lib/utils/useTriggerListboxSlots.js +46 -57
  93. package/lib/utils/useTriggerListboxSlots.js.map +1 -1
  94. package/lib-amd/Combobox.js +6 -0
  95. package/lib-amd/Combobox.js.map +1 -0
  96. package/lib-amd/ComboboxField.js +6 -0
  97. package/lib-amd/ComboboxField.js.map +1 -0
  98. package/lib-amd/Dropdown.js +6 -0
  99. package/lib-amd/Dropdown.js.map +1 -0
  100. package/lib-amd/Listbox.js +6 -0
  101. package/lib-amd/Listbox.js.map +1 -0
  102. package/lib-amd/Option.js +6 -0
  103. package/lib-amd/Option.js.map +1 -0
  104. package/lib-amd/OptionGroup.js +6 -0
  105. package/lib-amd/OptionGroup.js.map +1 -0
  106. package/lib-amd/components/Combobox/Combobox.js +16 -0
  107. package/lib-amd/components/Combobox/Combobox.js.map +1 -0
  108. package/lib-amd/components/Combobox/Combobox.types.js +5 -0
  109. package/lib-amd/components/Combobox/Combobox.types.js.map +1 -0
  110. package/lib-amd/components/Combobox/index.js +10 -0
  111. package/lib-amd/components/Combobox/index.js.map +1 -0
  112. package/lib-amd/components/Combobox/renderCombobox.js +20 -0
  113. package/lib-amd/components/Combobox/renderCombobox.js.map +1 -0
  114. package/lib-amd/components/Combobox/useCombobox.js +206 -0
  115. package/lib-amd/components/Combobox/useCombobox.js.map +1 -0
  116. package/lib-amd/components/Combobox/useComboboxStyles.js +152 -0
  117. package/lib-amd/components/Combobox/useComboboxStyles.js.map +1 -0
  118. package/lib-amd/components/ComboboxField/ComboboxField.js +10 -0
  119. package/lib-amd/components/ComboboxField/ComboboxField.js.map +1 -0
  120. package/lib-amd/components/ComboboxField/index.js +6 -0
  121. package/lib-amd/components/ComboboxField/index.js.map +1 -0
  122. package/lib-amd/components/Dropdown/Dropdown.js +16 -0
  123. package/lib-amd/components/Dropdown/Dropdown.js.map +1 -0
  124. package/lib-amd/components/Dropdown/Dropdown.types.js +5 -0
  125. package/lib-amd/components/Dropdown/Dropdown.types.js.map +1 -0
  126. package/lib-amd/components/Dropdown/index.js +10 -0
  127. package/lib-amd/components/Dropdown/index.js.map +1 -0
  128. package/lib-amd/components/Dropdown/renderDropdown.js +21 -0
  129. package/lib-amd/components/Dropdown/renderDropdown.js.map +1 -0
  130. package/lib-amd/components/Dropdown/useDropdown.js +121 -0
  131. package/lib-amd/components/Dropdown/useDropdown.js.map +1 -0
  132. package/lib-amd/components/Dropdown/useDropdownStyles.js +127 -0
  133. package/lib-amd/components/Dropdown/useDropdownStyles.js.map +1 -0
  134. package/lib-amd/components/Listbox/Listbox.js +16 -0
  135. package/lib-amd/components/Listbox/Listbox.js.map +1 -0
  136. package/lib-amd/components/Listbox/Listbox.types.js +5 -0
  137. package/lib-amd/components/Listbox/Listbox.types.js.map +1 -0
  138. package/lib-amd/components/Listbox/index.js +10 -0
  139. package/lib-amd/components/Listbox/index.js.map +1 -0
  140. package/lib-amd/components/Listbox/renderListbox.js +15 -0
  141. package/lib-amd/components/Listbox/renderListbox.js.map +1 -0
  142. package/lib-amd/components/Listbox/useListbox.js +80 -0
  143. package/lib-amd/components/Listbox/useListbox.js.map +1 -0
  144. package/lib-amd/components/Listbox/useListboxStyles.js +24 -0
  145. package/lib-amd/components/Listbox/useListboxStyles.js.map +1 -0
  146. package/lib-amd/components/Option/Option.js +15 -0
  147. package/lib-amd/components/Option/Option.js.map +1 -0
  148. package/lib-amd/components/Option/Option.types.js +5 -0
  149. package/lib-amd/components/Option/Option.types.js.map +1 -0
  150. package/lib-amd/components/Option/index.js +10 -0
  151. package/lib-amd/components/Option/index.js.map +1 -0
  152. package/lib-amd/components/Option/renderOption.js +16 -0
  153. package/lib-amd/components/Option/renderOption.js.map +1 -0
  154. package/lib-amd/components/Option/useOption.js +117 -0
  155. package/lib-amd/components/Option/useOption.js.map +1 -0
  156. package/lib-amd/components/Option/useOptionStyles.js +73 -0
  157. package/lib-amd/components/Option/useOptionStyles.js.map +1 -0
  158. package/lib-amd/components/OptionGroup/OptionGroup.js +15 -0
  159. package/lib-amd/components/OptionGroup/OptionGroup.js.map +1 -0
  160. package/lib-amd/components/OptionGroup/OptionGroup.types.js +5 -0
  161. package/lib-amd/components/OptionGroup/OptionGroup.types.js.map +1 -0
  162. package/lib-amd/components/OptionGroup/index.js +10 -0
  163. package/lib-amd/components/OptionGroup/index.js.map +1 -0
  164. package/lib-amd/components/OptionGroup/renderOptionGroup.js +16 -0
  165. package/lib-amd/components/OptionGroup/renderOptionGroup.js.map +1 -0
  166. package/lib-amd/components/OptionGroup/useOptionGroup.js +33 -0
  167. package/lib-amd/components/OptionGroup/useOptionGroup.js.map +1 -0
  168. package/lib-amd/components/OptionGroup/useOptionGroupStyles.js +34 -0
  169. package/lib-amd/components/OptionGroup/useOptionGroupStyles.js.map +1 -0
  170. package/lib-amd/contexts/ComboboxContext.js +28 -0
  171. package/lib-amd/contexts/ComboboxContext.js.map +1 -0
  172. package/lib-amd/contexts/ListboxContext.js +23 -0
  173. package/lib-amd/contexts/ListboxContext.js.map +1 -0
  174. package/lib-amd/contexts/useComboboxContextValues.js +23 -0
  175. package/lib-amd/contexts/useComboboxContextValues.js.map +1 -0
  176. package/lib-amd/contexts/useListboxContextValues.js +24 -0
  177. package/lib-amd/contexts/useListboxContextValues.js.map +1 -0
  178. package/lib-amd/index.js +37 -0
  179. package/lib-amd/index.js.map +1 -0
  180. package/lib-amd/utils/ComboboxBase.types.js +5 -0
  181. package/lib-amd/utils/ComboboxBase.types.js.map +1 -0
  182. package/lib-amd/utils/OptionCollection.types.js +5 -0
  183. package/lib-amd/utils/OptionCollection.types.js.map +1 -0
  184. package/lib-amd/utils/Selection.types.js +5 -0
  185. package/lib-amd/utils/Selection.types.js.map +1 -0
  186. package/lib-amd/utils/dropdownKeyActions.js +85 -0
  187. package/lib-amd/utils/dropdownKeyActions.js.map +1 -0
  188. package/lib-amd/utils/internalTokens.js +11 -0
  189. package/lib-amd/utils/internalTokens.js.map +1 -0
  190. package/lib-amd/utils/useComboboxBaseState.js +76 -0
  191. package/lib-amd/utils/useComboboxBaseState.js.map +1 -0
  192. package/lib-amd/utils/useComboboxPopup.js +16 -0
  193. package/lib-amd/utils/useComboboxPopup.js.map +1 -0
  194. package/lib-amd/utils/useOptionCollection.js +65 -0
  195. package/lib-amd/utils/useOptionCollection.js.map +1 -0
  196. package/lib-amd/utils/useScrollOptionsIntoView.js +33 -0
  197. package/lib-amd/utils/useScrollOptionsIntoView.js.map +1 -0
  198. package/lib-amd/utils/useSelection.js +42 -0
  199. package/lib-amd/utils/useSelection.js.map +1 -0
  200. package/lib-amd/utils/useTriggerListboxSlots.js +104 -0
  201. package/lib-amd/utils/useTriggerListboxSlots.js.map +1 -0
  202. package/lib-commonjs/Combobox.js +0 -2
  203. package/lib-commonjs/Combobox.js.map +1 -1
  204. package/lib-commonjs/ComboboxField.js +8 -0
  205. package/lib-commonjs/ComboboxField.js.map +1 -0
  206. package/lib-commonjs/Dropdown.js +0 -2
  207. package/lib-commonjs/Dropdown.js.map +1 -1
  208. package/lib-commonjs/Listbox.js +0 -2
  209. package/lib-commonjs/Listbox.js.map +1 -1
  210. package/lib-commonjs/Option.js +0 -2
  211. package/lib-commonjs/Option.js.map +1 -1
  212. package/lib-commonjs/OptionGroup.js +0 -2
  213. package/lib-commonjs/OptionGroup.js.map +1 -1
  214. package/lib-commonjs/components/Combobox/Combobox.js +0 -7
  215. package/lib-commonjs/components/Combobox/Combobox.js.map +1 -1
  216. package/lib-commonjs/components/Combobox/Combobox.types.js.map +1 -1
  217. package/lib-commonjs/components/Combobox/index.js +0 -6
  218. package/lib-commonjs/components/Combobox/index.js.map +1 -1
  219. package/lib-commonjs/components/Combobox/renderCombobox.js +11 -14
  220. package/lib-commonjs/components/Combobox/renderCombobox.js.map +1 -1
  221. package/lib-commonjs/components/Combobox/useCombobox.js +190 -24
  222. package/lib-commonjs/components/Combobox/useCombobox.js.map +1 -1
  223. package/lib-commonjs/components/Combobox/useComboboxStyles.js +252 -165
  224. package/lib-commonjs/components/Combobox/useComboboxStyles.js.map +1 -1
  225. package/lib-commonjs/components/ComboboxField/ComboboxField.js +14 -0
  226. package/lib-commonjs/components/ComboboxField/ComboboxField.js.map +1 -0
  227. package/lib-commonjs/components/ComboboxField/index.js +8 -0
  228. package/lib-commonjs/components/ComboboxField/index.js.map +1 -0
  229. package/lib-commonjs/components/Dropdown/Dropdown.js +0 -7
  230. package/lib-commonjs/components/Dropdown/Dropdown.js.map +1 -1
  231. package/lib-commonjs/components/Dropdown/Dropdown.types.js.map +1 -1
  232. package/lib-commonjs/components/Dropdown/index.js +0 -6
  233. package/lib-commonjs/components/Dropdown/index.js.map +1 -1
  234. package/lib-commonjs/components/Dropdown/renderDropdown.js +11 -14
  235. package/lib-commonjs/components/Dropdown/renderDropdown.js.map +1 -1
  236. package/lib-commonjs/components/Dropdown/useDropdown.js +89 -17
  237. package/lib-commonjs/components/Dropdown/useDropdown.js.map +1 -1
  238. package/lib-commonjs/components/Dropdown/useDropdownStyles.js +236 -159
  239. package/lib-commonjs/components/Dropdown/useDropdownStyles.js.map +1 -1
  240. package/lib-commonjs/components/Listbox/Listbox.js +0 -7
  241. package/lib-commonjs/components/Listbox/Listbox.js.map +1 -1
  242. package/lib-commonjs/components/Listbox/Listbox.types.js.map +1 -1
  243. package/lib-commonjs/components/Listbox/index.js +0 -6
  244. package/lib-commonjs/components/Listbox/index.js.map +1 -1
  245. package/lib-commonjs/components/Listbox/renderListbox.js +2 -7
  246. package/lib-commonjs/components/Listbox/renderListbox.js.map +1 -1
  247. package/lib-commonjs/components/Listbox/useListbox.js +34 -37
  248. package/lib-commonjs/components/Listbox/useListbox.js.map +1 -1
  249. package/lib-commonjs/components/Listbox/useListboxStyles.js +16 -24
  250. package/lib-commonjs/components/Listbox/useListboxStyles.js.map +1 -1
  251. package/lib-commonjs/components/Option/Option.js +0 -6
  252. package/lib-commonjs/components/Option/Option.js.map +1 -1
  253. package/lib-commonjs/components/Option/Option.types.js.map +1 -1
  254. package/lib-commonjs/components/Option/index.js +0 -6
  255. package/lib-commonjs/components/Option/index.js.map +1 -1
  256. package/lib-commonjs/components/Option/renderOption.js +4 -7
  257. package/lib-commonjs/components/Option/renderOption.js.map +1 -1
  258. package/lib-commonjs/components/Option/useOption.js +60 -52
  259. package/lib-commonjs/components/Option/useOption.js.map +1 -1
  260. package/lib-commonjs/components/Option/useOptionStyles.js +103 -84
  261. package/lib-commonjs/components/Option/useOptionStyles.js.map +1 -1
  262. package/lib-commonjs/components/OptionGroup/OptionGroup.js +0 -6
  263. package/lib-commonjs/components/OptionGroup/OptionGroup.js.map +1 -1
  264. package/lib-commonjs/components/OptionGroup/OptionGroup.types.js.map +1 -1
  265. package/lib-commonjs/components/OptionGroup/index.js +0 -6
  266. package/lib-commonjs/components/OptionGroup/index.js.map +1 -1
  267. package/lib-commonjs/components/OptionGroup/renderOptionGroup.js +4 -7
  268. package/lib-commonjs/components/OptionGroup/renderOptionGroup.js.map +1 -1
  269. package/lib-commonjs/components/OptionGroup/useOptionGroup.js +0 -4
  270. package/lib-commonjs/components/OptionGroup/useOptionGroup.js.map +1 -1
  271. package/lib-commonjs/components/OptionGroup/useOptionGroupStyles.js +29 -38
  272. package/lib-commonjs/components/OptionGroup/useOptionGroupStyles.js.map +1 -1
  273. package/lib-commonjs/contexts/ComboboxContext.js +15 -12
  274. package/lib-commonjs/contexts/ComboboxContext.js.map +1 -1
  275. package/lib-commonjs/contexts/ListboxContext.js +12 -11
  276. package/lib-commonjs/contexts/ListboxContext.js.map +1 -1
  277. package/lib-commonjs/contexts/useComboboxContextValues.js +8 -4
  278. package/lib-commonjs/contexts/useComboboxContextValues.js.map +1 -1
  279. package/lib-commonjs/contexts/useListboxContextValues.js +10 -10
  280. package/lib-commonjs/contexts/useListboxContextValues.js.map +1 -1
  281. package/lib-commonjs/index.js +43 -11
  282. package/lib-commonjs/index.js.map +1 -1
  283. package/lib-commonjs/utils/ComboboxBase.types.js.map +1 -1
  284. package/lib-commonjs/utils/OptionCollection.types.js.map +1 -1
  285. package/lib-commonjs/utils/Selection.types.js.map +1 -1
  286. package/lib-commonjs/utils/dropdownKeyActions.js +14 -46
  287. package/lib-commonjs/utils/dropdownKeyActions.js.map +1 -1
  288. package/lib-commonjs/utils/internalTokens.js.map +1 -1
  289. package/lib-commonjs/utils/useComboboxBaseState.js +48 -50
  290. package/lib-commonjs/utils/useComboboxBaseState.js.map +1 -1
  291. package/lib-commonjs/utils/useComboboxPopup.js +10 -10
  292. package/lib-commonjs/utils/useComboboxPopup.js.map +1 -1
  293. package/lib-commonjs/utils/useOptionCollection.js +13 -26
  294. package/lib-commonjs/utils/useOptionCollection.js.map +1 -1
  295. package/lib-commonjs/utils/useScrollOptionsIntoView.js +43 -0
  296. package/lib-commonjs/utils/useScrollOptionsIntoView.js.map +1 -0
  297. package/lib-commonjs/utils/useSelection.js +20 -17
  298. package/lib-commonjs/utils/useSelection.js.map +1 -1
  299. package/lib-commonjs/utils/useTriggerListboxSlots.js +45 -61
  300. package/lib-commonjs/utils/useTriggerListboxSlots.js.map +1 -1
  301. package/package.json +24 -23
  302. package/Spec-migration.md +0 -13
  303. package/Spec.md +0 -520
  304. package/dist/tsdoc-metadata.json +0 -11
@@ -4,22 +4,18 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useComboboxBaseState = void 0;
7
-
8
7
  const React = /*#__PURE__*/require("react");
9
-
10
8
  const react_utilities_1 = /*#__PURE__*/require("@fluentui/react-utilities");
11
-
12
9
  const useOptionCollection_1 = /*#__PURE__*/require("../utils/useOptionCollection");
13
-
14
10
  const useSelection_1 = /*#__PURE__*/require("../utils/useSelection");
15
11
  /**
16
12
  * State shared between Combobox and Dropdown components
17
13
  */
18
-
19
-
20
14
  const useComboboxBaseState = props => {
21
15
  const {
22
16
  appearance = 'outline',
17
+ children,
18
+ editable = false,
23
19
  inlinePopup = false,
24
20
  multiselect,
25
21
  onOpenChange,
@@ -28,87 +24,89 @@ const useComboboxBaseState = props => {
28
24
  const optionCollection = useOptionCollection_1.useOptionCollection();
29
25
  const {
30
26
  getOptionAtIndex,
31
- getOptionById,
32
- getOptionsMatchingValue
27
+ getOptionsMatchingText
33
28
  } = optionCollection;
34
29
  const [activeOption, setActiveOption] = React.useState();
30
+ // track whether keyboard focus outline should be shown
31
+ // tabster/keyborg doesn't work here, since the actual keyboard focus target doesn't move
32
+ const [focusVisible, setFocusVisible] = React.useState(false);
33
+ // track focused state to conditionally render collapsed listbox
34
+ const [hasFocus, setHasFocus] = React.useState(false);
35
+ const ignoreNextBlur = React.useRef(false);
36
+ const selectionState = useSelection_1.useSelection(props);
35
37
  const {
36
- selectedOptions,
37
- selectOption
38
- } = useSelection_1.useSelection(props); // update value based on selectedOptions
39
-
38
+ selectedOptions
39
+ } = selectionState;
40
+ // calculate value based on props, internal value changes, and selected options
40
41
  const isFirstMount = react_utilities_1.useFirstMount();
42
+ const [controllableValue, setValue] = react_utilities_1.useControllableState({
43
+ state: props.value,
44
+ initialState: undefined
45
+ });
41
46
  const value = React.useMemo(() => {
42
- // don't compute value if it is defined through props,
43
- if (props.value !== undefined) {
44
- return props.value;
47
+ // don't compute the value if it is defined through props or setValue,
48
+ if (controllableValue !== undefined) {
49
+ return controllableValue;
45
50
  }
46
-
51
+ // handle defaultValue here, so it is overridden by selection
47
52
  if (isFirstMount && props.defaultValue !== undefined) {
48
53
  return props.defaultValue;
49
54
  }
50
-
51
55
  if (multiselect) {
52
- return selectedOptions.join(', ');
56
+ // editable inputs should not display multiple selected options in the input as text
57
+ return editable ? '' : selectedOptions.join(', ');
53
58
  }
54
-
55
59
  return selectedOptions[0];
56
- }, [isFirstMount, multiselect, props.defaultValue, props.value, selectedOptions]); // Handle open state, which is shared with options in context
57
-
60
+ }, [controllableValue, editable, isFirstMount, multiselect, props.defaultValue, selectedOptions]);
61
+ // Handle open state, which is shared with options in context
58
62
  const [open, setOpenState] = react_utilities_1.useControllableState({
59
63
  state: props.open,
60
64
  defaultState: props.defaultOpen,
61
65
  initialState: false
62
66
  });
63
-
64
- const setOpen = (event, newState) => {
67
+ const setOpen = React.useCallback((event, newState) => {
65
68
  onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(event, {
66
69
  open: newState
67
70
  });
68
71
  setOpenState(newState);
69
- };
70
-
71
- const onOptionClick = (event, option) => {
72
- // clicked option should always become active option
73
- setActiveOption(getOptionById(option.id)); // close on option click for single-select
74
-
75
- !multiselect && setOpen(event, false); // handle selection change
76
-
77
- selectOption(event, option);
78
- }; // update active option based on change in open state
79
-
80
-
72
+ }, [onOpenChange, setOpenState]);
73
+ // update active option based on change in open state or children
81
74
  React.useEffect(() => {
82
- if (open) {
83
- // if there is a selection, start at the most recently selected item
84
- if (selectedOptions.length > 0) {
85
- const lastSelectedOption = getOptionsMatchingValue(v => v === selectedOptions[selectedOptions.length - 1]).pop();
86
- lastSelectedOption && setActiveOption(lastSelectedOption);
87
- } // default to starting at the first option
75
+ if (open && !activeOption) {
76
+ // if it is single-select and there is a selected option, start at the selected option
77
+ if (!multiselect && selectedOptions.length > 0) {
78
+ const selectedOption = getOptionsMatchingText(v => v === selectedOptions[0]).pop();
79
+ selectedOption && setActiveOption(selectedOption);
80
+ }
81
+ // default to starting at the first option
88
82
  else {
89
83
  setActiveOption(getOptionAtIndex(0));
90
84
  }
91
- } else {
85
+ } else if (!open) {
92
86
  // reset the active option when closing
93
87
  setActiveOption(undefined);
94
- } // this should only be run in response to changes in the open state
88
+ }
89
+ // this should only be run in response to changes in the open state or children
95
90
  // eslint-disable-next-line react-hooks/exhaustive-deps
96
-
97
- }, [open]);
98
- return { ...optionCollection,
91
+ }, [open, children]);
92
+ return {
93
+ ...optionCollection,
94
+ ...selectionState,
99
95
  activeOption,
100
96
  appearance,
97
+ focusVisible,
98
+ hasFocus,
99
+ ignoreNextBlur,
101
100
  inlinePopup,
102
- onOptionClick,
103
101
  open,
104
- selectedOptions,
105
- selectOption,
106
102
  setActiveOption,
103
+ setFocusVisible,
104
+ setHasFocus,
107
105
  setOpen,
106
+ setValue,
108
107
  size,
109
108
  value
110
109
  };
111
110
  };
112
-
113
111
  exports.useComboboxBaseState = useComboboxBaseState;
114
112
  //# sourceMappingURL=useComboboxBaseState.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["utils/useComboboxBaseState.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport { useControllableState, useFirstMount } from '@fluentui/react-utilities';\nimport { useOptionCollection } from '../utils/useOptionCollection';\nimport { OptionValue } from '../utils/OptionCollection.types';\nimport { useSelection } from '../utils/useSelection';\nimport type { ComboboxBaseProps, ComboboxBaseOpenEvents } from './ComboboxBase.types';\n\n/**\n * State shared between Combobox and Dropdown components\n */\nexport const useComboboxBaseState = (props: ComboboxBaseProps) => {\n const { appearance = 'outline', inlinePopup = false, multiselect, onOpenChange, size = 'medium' } = props;\n\n const optionCollection = useOptionCollection();\n const { getOptionAtIndex, getOptionById, getOptionsMatchingValue } = optionCollection;\n\n const [activeOption, setActiveOption] = React.useState<OptionValue | undefined>();\n const { selectedOptions, selectOption } = useSelection(props);\n\n // update value based on selectedOptions\n const isFirstMount = useFirstMount();\n const value = React.useMemo(() => {\n // don't compute value if it is defined through props,\n if (props.value !== undefined) {\n return props.value;\n }\n\n if (isFirstMount && props.defaultValue !== undefined) {\n return props.defaultValue;\n }\n\n if (multiselect) {\n return selectedOptions.join(', ');\n }\n\n return selectedOptions[0];\n }, [isFirstMount, multiselect, props.defaultValue, props.value, selectedOptions]);\n\n // Handle open state, which is shared with options in context\n const [open, setOpenState] = useControllableState({\n state: props.open,\n defaultState: props.defaultOpen,\n initialState: false,\n });\n\n const setOpen = (event: ComboboxBaseOpenEvents, newState: boolean) => {\n onOpenChange?.(event, { open: newState });\n setOpenState(newState);\n };\n\n const onOptionClick = (event: React.MouseEvent<HTMLElement>, option: OptionValue) => {\n // clicked option should always become active option\n setActiveOption(getOptionById(option.id));\n\n // close on option click for single-select\n !multiselect && setOpen(event, false);\n\n // handle selection change\n selectOption(event, option);\n };\n\n // update active option based on change in open state\n React.useEffect(() => {\n if (open) {\n // if there is a selection, start at the most recently selected item\n if (selectedOptions.length > 0) {\n const lastSelectedOption = getOptionsMatchingValue(\n v => v === selectedOptions[selectedOptions.length - 1],\n ).pop();\n lastSelectedOption && setActiveOption(lastSelectedOption);\n }\n // default to starting at the first option\n else {\n setActiveOption(getOptionAtIndex(0));\n }\n } else {\n // reset the active option when closing\n setActiveOption(undefined);\n }\n // this should only be run in response to changes in the open state\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n return {\n ...optionCollection,\n activeOption,\n appearance,\n inlinePopup,\n onOptionClick,\n open,\n selectedOptions,\n selectOption,\n setActiveOption,\n setOpen,\n size,\n value,\n };\n};\n"],"sourceRoot":"../src/"}
1
+ {"version":3,"mappings":"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","names":["useComboboxBaseState","props","appearance","children","editable","inlinePopup","multiselect","onOpenChange","size","optionCollection","useOptionCollection_1","getOptionAtIndex","getOptionsMatchingText","activeOption","setActiveOption","React","useState","focusVisible","setFocusVisible","hasFocus","setHasFocus","ignoreNextBlur","useRef","selectionState","useSelection_1","selectedOptions","isFirstMount","react_utilities_1","controllableValue","setValue","state","value","initialState","undefined","useMemo","defaultValue","join","open","setOpenState","defaultState","defaultOpen","setOpen","useCallback","event","newState","useEffect","length","selectedOption","v","pop","exports"],"sourceRoot":"../src/","sources":["packages/react-components/react-combobox/src/utils/useComboboxBaseState.ts"],"sourcesContent":["import * as React from 'react';\nimport { useControllableState, useFirstMount } from '@fluentui/react-utilities';\nimport { useOptionCollection } from '../utils/useOptionCollection';\nimport { OptionValue } from '../utils/OptionCollection.types';\nimport { useSelection } from '../utils/useSelection';\nimport type { ComboboxBaseProps, ComboboxBaseOpenEvents, ComboboxBaseState } from './ComboboxBase.types';\n\n/**\n * State shared between Combobox and Dropdown components\n */\nexport const useComboboxBaseState = (\n props: ComboboxBaseProps & { children?: React.ReactNode; editable?: boolean },\n): ComboboxBaseState => {\n const {\n appearance = 'outline',\n children,\n editable = false,\n inlinePopup = false,\n multiselect,\n onOpenChange,\n size = 'medium',\n } = props;\n\n const optionCollection = useOptionCollection();\n const { getOptionAtIndex, getOptionsMatchingText } = optionCollection;\n\n const [activeOption, setActiveOption] = React.useState<OptionValue | undefined>();\n\n // track whether keyboard focus outline should be shown\n // tabster/keyborg doesn't work here, since the actual keyboard focus target doesn't move\n const [focusVisible, setFocusVisible] = React.useState(false);\n\n // track focused state to conditionally render collapsed listbox\n const [hasFocus, setHasFocus] = React.useState(false);\n\n const ignoreNextBlur = React.useRef(false);\n\n const selectionState = useSelection(props);\n const { selectedOptions } = selectionState;\n\n // calculate value based on props, internal value changes, and selected options\n const isFirstMount = useFirstMount();\n const [controllableValue, setValue] = useControllableState({\n state: props.value,\n initialState: undefined,\n });\n\n const value = React.useMemo(() => {\n // don't compute the value if it is defined through props or setValue,\n if (controllableValue !== undefined) {\n return controllableValue;\n }\n\n // handle defaultValue here, so it is overridden by selection\n if (isFirstMount && props.defaultValue !== undefined) {\n return props.defaultValue;\n }\n\n if (multiselect) {\n // editable inputs should not display multiple selected options in the input as text\n return editable ? '' : selectedOptions.join(', ');\n }\n\n return selectedOptions[0];\n }, [controllableValue, editable, isFirstMount, multiselect, props.defaultValue, selectedOptions]);\n\n // Handle open state, which is shared with options in context\n const [open, setOpenState] = useControllableState({\n state: props.open,\n defaultState: props.defaultOpen,\n initialState: false,\n });\n\n const setOpen = React.useCallback(\n (event: ComboboxBaseOpenEvents, newState: boolean) => {\n onOpenChange?.(event, { open: newState });\n setOpenState(newState);\n },\n [onOpenChange, setOpenState],\n );\n\n // update active option based on change in open state or children\n React.useEffect(() => {\n if (open && !activeOption) {\n // if it is single-select and there is a selected option, start at the selected option\n if (!multiselect && selectedOptions.length > 0) {\n const selectedOption = getOptionsMatchingText(v => v === selectedOptions[0]).pop();\n selectedOption && setActiveOption(selectedOption);\n }\n // default to starting at the first option\n else {\n setActiveOption(getOptionAtIndex(0));\n }\n } else if (!open) {\n // reset the active option when closing\n setActiveOption(undefined);\n }\n // this should only be run in response to changes in the open state or children\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, children]);\n\n return {\n ...optionCollection,\n ...selectionState,\n activeOption,\n appearance,\n focusVisible,\n hasFocus,\n ignoreNextBlur,\n inlinePopup,\n open,\n setActiveOption,\n setFocusVisible,\n setHasFocus,\n setOpen,\n setValue,\n size,\n value,\n };\n};\n"]}
@@ -4,16 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useComboboxPopup = void 0;
7
-
8
7
  const react_positioning_1 = /*#__PURE__*/require("@fluentui/react-positioning");
9
-
10
8
  const react_utilities_1 = /*#__PURE__*/require("@fluentui/react-utilities");
11
-
12
9
  function useComboboxPopup(props, triggerShorthand, listboxShorthand) {
13
10
  const {
14
11
  positioning
15
- } = props; // popper options
16
-
12
+ } = props;
13
+ // popper options
17
14
  const popperOptions = {
18
15
  position: 'below',
19
16
  align: 'start',
@@ -27,12 +24,15 @@ function useComboboxPopup(props, triggerShorthand, listboxShorthand) {
27
24
  targetRef,
28
25
  containerRef
29
26
  } = react_positioning_1.usePositioning(popperOptions);
30
- return [{ ...triggerShorthand,
27
+ const listboxRef = react_utilities_1.useMergedRefs(listboxShorthand === null || listboxShorthand === void 0 ? void 0 : listboxShorthand.ref, containerRef);
28
+ const listbox = listboxShorthand && {
29
+ ...listboxShorthand,
30
+ ref: listboxRef
31
+ };
32
+ return [{
33
+ ...triggerShorthand,
31
34
  ref: react_utilities_1.useMergedRefs(triggerShorthand === null || triggerShorthand === void 0 ? void 0 : triggerShorthand.ref, targetRef)
32
- }, { ...listboxShorthand,
33
- ref: react_utilities_1.useMergedRefs(listboxShorthand === null || listboxShorthand === void 0 ? void 0 : listboxShorthand.ref, containerRef)
34
- }];
35
+ }, listbox];
35
36
  }
36
-
37
37
  exports.useComboboxPopup = useComboboxPopup;
38
38
  //# sourceMappingURL=useComboboxPopup.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["utils/useComboboxPopup.ts"],"names":[],"mappings":";;;;;;;AAAA,MAAA,mBAAA,gBAAA,OAAA,CAAA,6BAAA,CAAA;;AACA,MAAA,iBAAA,gBAAA,OAAA,CAAA,2BAAA,CAAA;;AAeA,SAAgB,gBAAhB,CACE,KADF,EAEE,gBAFF,EAGE,gBAHF,EAG2D;EAEzD,MAAM;IAAE;EAAF,IAAkB,KAAxB,CAFyD,CAIzD;;EACA,MAAM,aAAa,GAAG;IACpB,QAAQ,EAAE,OADU;IAEpB,KAAK,EAAE,OAFa;IAGpB,MAAM,EAAE;MAAE,SAAS,EAAE,CAAb;MAAgB,QAAQ,EAAE;IAA1B,CAHY;IAIpB,GAAG,mBAAA,CAAA,2BAAA,CAA4B,WAA5B;EAJiB,CAAtB;EAOA,MAAM;IAAE,SAAF;IAAa;EAAb,IAA8B,mBAAA,CAAA,cAAA,CAAe,aAAf,CAApC;EAEA,OAAO,CACL,EAAE,GAAG,gBAAL;IAAuB,GAAG,EAAE,iBAAA,CAAA,aAAA,CAAc,gBAAgB,KAAA,IAAhB,IAAA,gBAAgB,KAAA,KAAA,CAAhB,GAAgB,KAAA,CAAhB,GAAA,gBAAgB,CAAE,GAAhC,EAAqC,SAArC;EAA5B,CADK,EAEL,EAAE,GAAG,gBAAL;IAAuB,GAAG,EAAE,iBAAA,CAAA,aAAA,CAAc,gBAAgB,KAAA,IAAhB,IAAA,gBAAgB,KAAA,KAAA,CAAhB,GAAgB,KAAA,CAAhB,GAAA,gBAAgB,CAAE,GAAhC,EAAqC,YAArC;EAA5B,CAFK,CAAP;AAID;;AArBD,OAAA,CAAA,gBAAA,GAAA,gBAAA","sourcesContent":["import { resolvePositioningShorthand, usePositioning } from '@fluentui/react-positioning';\nimport { ExtractSlotProps, Slot, useMergedRefs } from '@fluentui/react-utilities';\nimport type { ComboboxBaseProps } from './ComboboxBase.types';\nimport { Listbox } from '../components/Listbox/Listbox';\n\nexport function useComboboxPopup(\n props: ComboboxBaseProps,\n triggerShorthand?: ExtractSlotProps<Slot<'button'>>,\n listboxShorthand?: ExtractSlotProps<Slot<typeof Listbox>>,\n): [ExtractSlotProps<Slot<'button'>>, ExtractSlotProps<Slot<typeof Listbox>>];\nexport function useComboboxPopup(\n props: ComboboxBaseProps,\n triggerShorthand?: ExtractSlotProps<Slot<'input'>>,\n listboxShorthand?: ExtractSlotProps<Slot<typeof Listbox>>,\n): [ExtractSlotProps<Slot<'input'>>, ExtractSlotProps<Slot<typeof Listbox>>];\n\nexport function useComboboxPopup(\n props: ComboboxBaseProps,\n triggerShorthand?: ExtractSlotProps<Slot<'input'>> | ExtractSlotProps<Slot<'button'>>,\n listboxShorthand?: ExtractSlotProps<Slot<typeof Listbox>>,\n): [ExtractSlotProps<Slot<'input'>> | ExtractSlotProps<Slot<'button'>>, ExtractSlotProps<Slot<typeof Listbox>>] {\n const { positioning } = props;\n\n // popper options\n const popperOptions = {\n position: 'below' as const,\n align: 'start' as const,\n offset: { crossAxis: 0, mainAxis: 2 },\n ...resolvePositioningShorthand(positioning),\n };\n\n const { targetRef, containerRef } = usePositioning(popperOptions);\n\n return [\n { ...triggerShorthand, ref: useMergedRefs(triggerShorthand?.ref, targetRef) },\n { ...listboxShorthand, ref: useMergedRefs(listboxShorthand?.ref, containerRef) },\n ];\n}\n"],"sourceRoot":"../src/"}
1
+ {"version":3,"mappings":";;;;;;AAAA;AACA;AAeA,SAAgBA,gBAAgB,CAC9BC,KAAwB,EACxBC,gBAAqF,EACrFC,gBAAyD;EAKzD,MAAM;IAAEC;EAAW,CAAE,GAAGH,KAAK;EAE7B;EACA,MAAMI,aAAa,GAAG;IACpBC,QAAQ,EAAE,OAAgB;IAC1BC,KAAK,EAAE,OAAgB;IACvBC,MAAM,EAAE;MAAEC,SAAS,EAAE,CAAC;MAAEC,QAAQ,EAAE;IAAC,CAAE;IACrC,GAAGC,+CAA2B,CAACP,WAAW;GAC3C;EAED,MAAM;IAAEQ,SAAS;IAAEC;EAAY,CAAE,GAAGF,kCAAc,CAACN,aAAa,CAAC;EAEjE,MAAMS,UAAU,GAAGC,+BAAa,CAACZ,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAEa,GAAG,EAAEH,YAAY,CAAC;EACrE,MAAMI,OAAO,GAAGd,gBAAgB,IAAI;IAAE,GAAGA,gBAAgB;IAAEa,GAAG,EAAEF;EAAU,CAAE;EAE5E,OAAO,CAAC;IAAE,GAAGZ,gBAAgB;IAAEc,GAAG,EAAED,+BAAa,CAACb,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAEc,GAAG,EAAEJ,SAAS;EAAC,CAAE,EAAEK,OAAO,CAAC;AACjG;AAxBAC","names":["useComboboxPopup","props","triggerShorthand","listboxShorthand","positioning","popperOptions","position","align","offset","crossAxis","mainAxis","react_positioning_1","targetRef","containerRef","listboxRef","react_utilities_1","ref","listbox","exports"],"sourceRoot":"../src/","sources":["packages/react-components/react-combobox/src/utils/useComboboxPopup.ts"],"sourcesContent":["import { resolvePositioningShorthand, usePositioning } from '@fluentui/react-positioning';\nimport { ExtractSlotProps, Slot, useMergedRefs } from '@fluentui/react-utilities';\nimport type { ComboboxBaseProps } from './ComboboxBase.types';\nimport { Listbox } from '../components/Listbox/Listbox';\n\nexport function useComboboxPopup(\n props: ComboboxBaseProps,\n triggerShorthand?: ExtractSlotProps<Slot<'button'>>,\n listboxShorthand?: ExtractSlotProps<Slot<typeof Listbox>>,\n): [trigger: ExtractSlotProps<Slot<'button'>>, listbox?: ExtractSlotProps<Slot<typeof Listbox>>];\nexport function useComboboxPopup(\n props: ComboboxBaseProps,\n triggerShorthand?: ExtractSlotProps<Slot<'input'>>,\n listboxShorthand?: ExtractSlotProps<Slot<typeof Listbox>>,\n): [trigger: ExtractSlotProps<Slot<'input'>>, listbox?: ExtractSlotProps<Slot<typeof Listbox>>];\n\nexport function useComboboxPopup(\n props: ComboboxBaseProps,\n triggerShorthand?: ExtractSlotProps<Slot<'input'>> | ExtractSlotProps<Slot<'button'>>,\n listboxShorthand?: ExtractSlotProps<Slot<typeof Listbox>>,\n): [\n trigger: ExtractSlotProps<Slot<'input'>> | ExtractSlotProps<Slot<'button'>>,\n listbox?: ExtractSlotProps<Slot<typeof Listbox>>,\n] {\n const { positioning } = props;\n\n // popper options\n const popperOptions = {\n position: 'below' as const,\n align: 'start' as const,\n offset: { crossAxis: 0, mainAxis: 2 },\n ...resolvePositioningShorthand(positioning),\n };\n\n const { targetRef, containerRef } = usePositioning(popperOptions);\n\n const listboxRef = useMergedRefs(listboxShorthand?.ref, containerRef);\n const listbox = listboxShorthand && { ...listboxShorthand, ref: listboxRef };\n\n return [{ ...triggerShorthand, ref: useMergedRefs(triggerShorthand?.ref, targetRef) }, listbox];\n}\n"]}
@@ -4,83 +4,70 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useOptionCollection = void 0;
7
-
8
7
  const React = /*#__PURE__*/require("react");
9
8
  /**
10
9
  * A hook for managing a collection of child Options
11
10
  */
12
-
13
-
14
11
  const useOptionCollection = () => {
15
12
  const nodes = React.useRef([]);
16
13
  const collectionAPI = React.useMemo(() => {
17
14
  const getCount = () => nodes.current.length;
18
-
19
15
  const getOptionAtIndex = index => {
20
16
  var _a;
21
-
22
17
  return (_a = nodes.current[index]) === null || _a === void 0 ? void 0 : _a.option;
23
18
  };
24
-
25
19
  const getIndexOfId = id => nodes.current.findIndex(node => node.option.id === id);
26
-
27
20
  const getOptionById = id => {
28
21
  const item = nodes.current.find(node => node.option.id === id);
29
22
  return item === null || item === void 0 ? void 0 : item.option;
30
23
  };
31
-
32
- const getOptionsMatchingValue = matcher => {
33
- return nodes.current.filter(node => matcher(node.option.value)).map(node => node.option);
24
+ const getOptionsMatchingText = matcher => {
25
+ return nodes.current.filter(node => matcher(node.option.text)).map(node => node.option);
34
26
  };
35
-
36
27
  return {
37
28
  getCount,
38
29
  getOptionAtIndex,
39
30
  getIndexOfId,
40
31
  getOptionById,
41
- getOptionsMatchingValue
32
+ getOptionsMatchingText
42
33
  };
43
34
  }, []);
44
35
  const registerOption = React.useCallback((option, element) => {
45
36
  var _a;
46
-
47
37
  const index = nodes.current.findIndex(node => {
48
38
  if (!node.element || !element) {
49
39
  return false;
50
40
  }
51
-
52
41
  if (node.option.id === option.id) {
53
42
  return true;
54
- } // use the DOM method compareDocumentPosition to order the current node against registered nodes
43
+ }
44
+ // use the DOM method compareDocumentPosition to order the current node against registered nodes
55
45
  // eslint-disable-next-line no-bitwise
56
-
57
-
58
46
  return node.element.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_PRECEDING;
59
- }); // do not register the option if it already exists
60
-
47
+ });
48
+ // do not register the option if it already exists
61
49
  if (((_a = nodes.current[index]) === null || _a === void 0 ? void 0 : _a.option.id) !== option.id) {
62
50
  const newItem = {
63
51
  element,
64
52
  option
65
- }; // If an index is not found we will push the element to the end.
66
-
53
+ };
54
+ // If an index is not found we will push the element to the end.
67
55
  if (index === -1) {
68
56
  nodes.current = [...nodes.current, newItem];
69
57
  } else {
70
58
  nodes.current.splice(index, 0, newItem);
71
59
  }
72
- } // return the unregister function
73
-
74
-
60
+ }
61
+ // return the unregister function
75
62
  return () => {
76
63
  nodes.current = nodes.current.filter(node => node.option.id !== option.id);
77
64
  };
78
65
  }, []);
79
- return { ...collectionAPI,
66
+ return {
67
+ ...collectionAPI,
80
68
  options: nodes.current.map(node => node.option),
81
69
  registerOption
82
70
  };
83
71
  };
84
-
85
72
  exports.useOptionCollection = useOptionCollection;
86
73
  //# sourceMappingURL=useOptionCollection.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["utils/useOptionCollection.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport type { OptionCollectionState, OptionValue } from './OptionCollection.types';\n\n/**\n * A hook for managing a collection of child Options\n */\nexport const useOptionCollection = (): OptionCollectionState => {\n const nodes = React.useRef<{ option: OptionValue; element: HTMLElement }[]>([]);\n\n const collectionAPI = React.useMemo(() => {\n const getCount = () => nodes.current.length;\n const getOptionAtIndex = (index: number) => nodes.current[index]?.option;\n const getIndexOfId = (id: string) => nodes.current.findIndex(node => node.option.id === id);\n const getOptionById = (id: string) => {\n const item = nodes.current.find(node => node.option.id === id);\n return item?.option;\n };\n const getOptionsMatchingValue = (matcher: (value: string) => boolean) => {\n return nodes.current.filter(node => matcher(node.option.value)).map(node => node.option);\n };\n\n return {\n getCount,\n getOptionAtIndex,\n getIndexOfId,\n getOptionById,\n getOptionsMatchingValue,\n };\n }, []);\n\n const registerOption = React.useCallback((option: OptionValue, element: HTMLElement) => {\n const index = nodes.current.findIndex(node => {\n if (!node.element || !element) {\n return false;\n }\n\n if (node.option.id === option.id) {\n return true;\n }\n\n // use the DOM method compareDocumentPosition to order the current node against registered nodes\n // eslint-disable-next-line no-bitwise\n return node.element.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_PRECEDING;\n });\n\n // do not register the option if it already exists\n if (nodes.current[index]?.option.id !== option.id) {\n const newItem = {\n element,\n option,\n };\n\n // If an index is not found we will push the element to the end.\n if (index === -1) {\n nodes.current = [...nodes.current, newItem];\n } else {\n nodes.current.splice(index, 0, newItem);\n }\n }\n\n // return the unregister function\n return () => {\n nodes.current = nodes.current.filter(node => node.option.id !== option.id);\n };\n }, []);\n\n return {\n ...collectionAPI,\n options: nodes.current.map(node => node.option),\n registerOption,\n };\n};\n"],"sourceRoot":"../src/"}
1
+ {"version":3,"mappings":";;;;;;AAAA;AAGA;;;AAGO,MAAMA,mBAAmB,GAAG,MAA4B;EAC7D,MAAMC,KAAK,GAAGC,KAAK,CAACC,MAAM,CAAkD,EAAE,CAAC;EAE/E,MAAMC,aAAa,GAAGF,KAAK,CAACG,OAAO,CAAC,MAAK;IACvC,MAAMC,QAAQ,GAAG,MAAML,KAAK,CAACM,OAAO,CAACC,MAAM;IAC3C,MAAMC,gBAAgB,GAAIC,KAAa,IAAI;MAAA;MAAC,kBAAK,CAACH,OAAO,CAACG,KAAK,CAAC,0CAAEC,MAAM;IAAA;IACxE,MAAMC,YAAY,GAAIC,EAAU,IAAKZ,KAAK,CAACM,OAAO,CAACO,SAAS,CAACC,IAAI,IAAIA,IAAI,CAACJ,MAAM,CAACE,EAAE,KAAKA,EAAE,CAAC;IAC3F,MAAMG,aAAa,GAAIH,EAAU,IAAI;MACnC,MAAMI,IAAI,GAAGhB,KAAK,CAACM,OAAO,CAACW,IAAI,CAACH,IAAI,IAAIA,IAAI,CAACJ,MAAM,CAACE,EAAE,KAAKA,EAAE,CAAC;MAC9D,OAAOI,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEN,MAAM;IACrB,CAAC;IACD,MAAMQ,sBAAsB,GAAIC,OAAmC,IAAI;MACrE,OAAOnB,KAAK,CAACM,OAAO,CAACc,MAAM,CAACN,IAAI,IAAIK,OAAO,CAACL,IAAI,CAACJ,MAAM,CAACW,IAAI,CAAC,CAAC,CAACC,GAAG,CAACR,IAAI,IAAIA,IAAI,CAACJ,MAAM,CAAC;IACzF,CAAC;IAED,OAAO;MACLL,QAAQ;MACRG,gBAAgB;MAChBG,YAAY;MACZI,aAAa;MACbG;KACD;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMK,cAAc,GAAGtB,KAAK,CAACuB,WAAW,CAAC,CAACd,MAAmB,EAAEe,OAAoB,KAAI;;IACrF,MAAMhB,KAAK,GAAGT,KAAK,CAACM,OAAO,CAACO,SAAS,CAACC,IAAI,IAAG;MAC3C,IAAI,CAACA,IAAI,CAACW,OAAO,IAAI,CAACA,OAAO,EAAE;QAC7B,OAAO,KAAK;;MAGd,IAAIX,IAAI,CAACJ,MAAM,CAACE,EAAE,KAAKF,MAAM,CAACE,EAAE,EAAE;QAChC,OAAO,IAAI;;MAGb;MACA;MACA,OAAOE,IAAI,CAACW,OAAO,CAACC,uBAAuB,CAACD,OAAO,CAAC,GAAGE,IAAI,CAACC,2BAA2B;IACzF,CAAC,CAAC;IAEF;IACA,IAAI,YAAK,CAACtB,OAAO,CAACG,KAAK,CAAC,0CAAEC,MAAM,CAACE,EAAE,MAAKF,MAAM,CAACE,EAAE,EAAE;MACjD,MAAMiB,OAAO,GAAG;QACdJ,OAAO;QACPf;OACD;MAED;MACA,IAAID,KAAK,KAAK,CAAC,CAAC,EAAE;QAChBT,KAAK,CAACM,OAAO,GAAG,CAAC,GAAGN,KAAK,CAACM,OAAO,EAAEuB,OAAO,CAAC;OAC5C,MAAM;QACL7B,KAAK,CAACM,OAAO,CAACwB,MAAM,CAACrB,KAAK,EAAE,CAAC,EAAEoB,OAAO,CAAC;;;IAI3C;IACA,OAAO,MAAK;MACV7B,KAAK,CAACM,OAAO,GAAGN,KAAK,CAACM,OAAO,CAACc,MAAM,CAACN,IAAI,IAAIA,IAAI,CAACJ,MAAM,CAACE,EAAE,KAAKF,MAAM,CAACE,EAAE,CAAC;IAC5E,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IACL,GAAGT,aAAa;IAChB4B,OAAO,EAAE/B,KAAK,CAACM,OAAO,CAACgB,GAAG,CAACR,IAAI,IAAIA,IAAI,CAACJ,MAAM,CAAC;IAC/Ca;GACD;AACH,CAAC;AAjEYS,2BAAmB","names":["useOptionCollection","nodes","React","useRef","collectionAPI","useMemo","getCount","current","length","getOptionAtIndex","index","option","getIndexOfId","id","findIndex","node","getOptionById","item","find","getOptionsMatchingText","matcher","filter","text","map","registerOption","useCallback","element","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","newItem","splice","options","exports"],"sourceRoot":"../src/","sources":["packages/react-components/react-combobox/src/utils/useOptionCollection.ts"],"sourcesContent":["import * as React from 'react';\nimport type { OptionCollectionState, OptionValue } from './OptionCollection.types';\n\n/**\n * A hook for managing a collection of child Options\n */\nexport const useOptionCollection = (): OptionCollectionState => {\n const nodes = React.useRef<{ option: OptionValue; element: HTMLElement }[]>([]);\n\n const collectionAPI = React.useMemo(() => {\n const getCount = () => nodes.current.length;\n const getOptionAtIndex = (index: number) => nodes.current[index]?.option;\n const getIndexOfId = (id: string) => nodes.current.findIndex(node => node.option.id === id);\n const getOptionById = (id: string) => {\n const item = nodes.current.find(node => node.option.id === id);\n return item?.option;\n };\n const getOptionsMatchingText = (matcher: (value: string) => boolean) => {\n return nodes.current.filter(node => matcher(node.option.text)).map(node => node.option);\n };\n\n return {\n getCount,\n getOptionAtIndex,\n getIndexOfId,\n getOptionById,\n getOptionsMatchingText,\n };\n }, []);\n\n const registerOption = React.useCallback((option: OptionValue, element: HTMLElement) => {\n const index = nodes.current.findIndex(node => {\n if (!node.element || !element) {\n return false;\n }\n\n if (node.option.id === option.id) {\n return true;\n }\n\n // use the DOM method compareDocumentPosition to order the current node against registered nodes\n // eslint-disable-next-line no-bitwise\n return node.element.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_PRECEDING;\n });\n\n // do not register the option if it already exists\n if (nodes.current[index]?.option.id !== option.id) {\n const newItem = {\n element,\n option,\n };\n\n // If an index is not found we will push the element to the end.\n if (index === -1) {\n nodes.current = [...nodes.current, newItem];\n } else {\n nodes.current.splice(index, 0, newItem);\n }\n }\n\n // return the unregister function\n return () => {\n nodes.current = nodes.current.filter(node => node.option.id !== option.id);\n };\n }, []);\n\n return {\n ...collectionAPI,\n options: nodes.current.map(node => node.option),\n registerOption,\n };\n};\n"]}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useScrollOptionsIntoView = void 0;
7
+ const React = /*#__PURE__*/require("react");
8
+ const react_utilities_1 = /*#__PURE__*/require("@fluentui/react-utilities");
9
+ function useScrollOptionsIntoView(state) {
10
+ const {
11
+ activeOption
12
+ } = state;
13
+ const scrollContainerRef = React.useRef(null);
14
+ React.useEffect(() => {
15
+ if (scrollContainerRef.current && activeOption && react_utilities_1.canUseDOM()) {
16
+ const activeOptionElement = scrollContainerRef.current.querySelector(`#${activeOption.id}`);
17
+ if (!activeOptionElement) {
18
+ return;
19
+ }
20
+ const {
21
+ offsetHeight,
22
+ offsetTop
23
+ } = activeOptionElement;
24
+ const {
25
+ offsetHeight: parentOffsetHeight,
26
+ scrollTop
27
+ } = scrollContainerRef.current;
28
+ const isAbove = offsetTop < scrollTop;
29
+ const isBelow = offsetTop + offsetHeight > scrollTop + parentOffsetHeight;
30
+ // add a small buffer for general visual nicety
31
+ // it looks slightly better if the option has some space from the top/bottom while arrowing
32
+ const buffer = 2;
33
+ if (isAbove) {
34
+ scrollContainerRef.current.scrollTo(0, offsetTop - buffer);
35
+ } else if (isBelow) {
36
+ scrollContainerRef.current.scrollTo(0, offsetTop - parentOffsetHeight + offsetHeight + buffer);
37
+ }
38
+ }
39
+ }, [activeOption]);
40
+ return scrollContainerRef;
41
+ }
42
+ exports.useScrollOptionsIntoView = useScrollOptionsIntoView;
43
+ //# sourceMappingURL=useScrollOptionsIntoView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":";;;;;;AAAA;AACA;AAGA,SAAgBA,wBAAwB,CAACC,KAAmB;EAC1D,MAAM;IAAEC;EAAY,CAAE,GAAGD,KAAK;EAC9B,MAAME,kBAAkB,GAAGC,KAAK,CAACC,MAAM,CAAiB,IAAI,CAAC;EAE7DD,KAAK,CAACE,SAAS,CAAC,MAAK;IACnB,IAAIH,kBAAkB,CAACI,OAAO,IAAIL,YAAY,IAAIM,2BAAS,EAAE,EAAE;MAC7D,MAAMC,mBAAmB,GAAGN,kBAAkB,CAACI,OAAO,CAACG,aAAa,CAAC,IAAIR,YAAY,CAACS,EAAE,EAAE,CAAgB;MAE1G,IAAI,CAACF,mBAAmB,EAAE;QACxB;;MAGF,MAAM;QAAEG,YAAY;QAAEC;MAAS,CAAE,GAAGJ,mBAAmB;MACvD,MAAM;QAAEG,YAAY,EAAEE,kBAAkB;QAAEC;MAAS,CAAE,GAAGZ,kBAAkB,CAACI,OAAO;MAElF,MAAMS,OAAO,GAAGH,SAAS,GAAGE,SAAS;MACrC,MAAME,OAAO,GAAGJ,SAAS,GAAGD,YAAY,GAAGG,SAAS,GAAGD,kBAAkB;MAEzE;MACA;MACA,MAAMI,MAAM,GAAG,CAAC;MAEhB,IAAIF,OAAO,EAAE;QACXb,kBAAkB,CAACI,OAAO,CAACY,QAAQ,CAAC,CAAC,EAAEN,SAAS,GAAGK,MAAM,CAAC;OAC3D,MAAM,IAAID,OAAO,EAAE;QAClBd,kBAAkB,CAACI,OAAO,CAACY,QAAQ,CAAC,CAAC,EAAEN,SAAS,GAAGC,kBAAkB,GAAGF,YAAY,GAAGM,MAAM,CAAC;;;EAGpG,CAAC,EAAE,CAAChB,YAAY,CAAC,CAAC;EAElB,OAAOC,kBAAkB;AAC3B;AA/BAiB","names":["useScrollOptionsIntoView","state","activeOption","scrollContainerRef","React","useRef","useEffect","current","react_utilities_1","activeOptionElement","querySelector","id","offsetHeight","offsetTop","parentOffsetHeight","scrollTop","isAbove","isBelow","buffer","scrollTo","exports"],"sourceRoot":"../src/","sources":["packages/react-components/react-combobox/src/utils/useScrollOptionsIntoView.ts"],"sourcesContent":["import * as React from 'react';\nimport { canUseDOM } from '@fluentui/react-utilities';\nimport { ListboxState } from '../Listbox';\n\nexport function useScrollOptionsIntoView(state: ListboxState): React.Ref<HTMLDivElement> {\n const { activeOption } = state;\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (scrollContainerRef.current && activeOption && canUseDOM()) {\n const activeOptionElement = scrollContainerRef.current.querySelector(`#${activeOption.id}`) as HTMLElement;\n\n if (!activeOptionElement) {\n return;\n }\n\n const { offsetHeight, offsetTop } = activeOptionElement;\n const { offsetHeight: parentOffsetHeight, scrollTop } = scrollContainerRef.current;\n\n const isAbove = offsetTop < scrollTop;\n const isBelow = offsetTop + offsetHeight > scrollTop + parentOffsetHeight;\n\n // add a small buffer for general visual nicety\n // it looks slightly better if the option has some space from the top/bottom while arrowing\n const buffer = 2;\n\n if (isAbove) {\n scrollContainerRef.current.scrollTo(0, offsetTop - buffer);\n } else if (isBelow) {\n scrollContainerRef.current.scrollTo(0, offsetTop - parentOffsetHeight + offsetHeight + buffer);\n }\n }\n }, [activeOption]);\n\n return scrollContainerRef;\n}\n"]}
@@ -4,33 +4,29 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useSelection = void 0;
7
-
7
+ const react_1 = /*#__PURE__*/require("react");
8
8
  const react_utilities_1 = /*#__PURE__*/require("@fluentui/react-utilities");
9
-
10
9
  const useSelection = props => {
11
10
  const {
12
11
  defaultSelectedOptions,
13
12
  multiselect,
14
- onSelect
13
+ onOptionSelect
15
14
  } = props;
16
15
  const [selectedOptions, setSelectedOptions] = react_utilities_1.useControllableState({
17
16
  state: props.selectedOptions,
18
17
  defaultState: defaultSelectedOptions,
19
18
  initialState: []
20
19
  });
21
-
22
- const selectOption = (event, option) => {
20
+ const selectOption = react_1.useCallback((event, option) => {
23
21
  // if the option is disabled, do nothing
24
22
  if (option.disabled) {
25
23
  return;
26
- } // for single-select, always return the selected option
27
-
28
-
29
- let newSelection = [option.value]; // toggle selected state of the option for multiselect
30
-
24
+ }
25
+ // for single-select, always return the selected option
26
+ let newSelection = [option.value];
27
+ // toggle selected state of the option for multiselect
31
28
  if (multiselect) {
32
29
  const selectedIndex = selectedOptions.findIndex(o => o === option.value);
33
-
34
30
  if (selectedIndex > -1) {
35
31
  // deselect option
36
32
  newSelection = [...selectedOptions.slice(0, selectedIndex), ...selectedOptions.slice(selectedIndex + 1)];
@@ -39,19 +35,26 @@ const useSelection = props => {
39
35
  newSelection = [...selectedOptions, option.value];
40
36
  }
41
37
  }
42
-
43
38
  setSelectedOptions(newSelection);
44
- onSelect === null || onSelect === void 0 ? void 0 : onSelect(event, {
39
+ onOptionSelect === null || onOptionSelect === void 0 ? void 0 : onOptionSelect(event, {
45
40
  optionValue: option.value,
41
+ optionText: option.text,
46
42
  selectedOptions: newSelection
47
43
  });
44
+ }, [onOptionSelect, multiselect, selectedOptions, setSelectedOptions]);
45
+ const clearSelection = event => {
46
+ setSelectedOptions([]);
47
+ onOptionSelect === null || onOptionSelect === void 0 ? void 0 : onOptionSelect(event, {
48
+ optionValue: undefined,
49
+ optionText: undefined,
50
+ selectedOptions: []
51
+ });
48
52
  };
49
-
50
53
  return {
51
- selectedOptions,
52
- selectOption
54
+ clearSelection,
55
+ selectOption,
56
+ selectedOptions
53
57
  };
54
58
  };
55
-
56
59
  exports.useSelection = useSelection;
57
60
  //# sourceMappingURL=useSelection.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["utils/useSelection.ts"],"names":[],"mappings":";;;;;;;AAAA,MAAA,iBAAA,gBAAA,OAAA,CAAA,2BAAA,CAAA;;AAIO,MAAM,YAAY,GAAI,KAAD,IAA0C;EACpE,MAAM;IAAE,sBAAF;IAA0B,WAA1B;IAAuC;EAAvC,IAAoD,KAA1D;EAEA,MAAM,CAAC,eAAD,EAAkB,kBAAlB,IAAwC,iBAAA,CAAA,oBAAA,CAAqB;IACjE,KAAK,EAAE,KAAK,CAAC,eADoD;IAEjE,YAAY,EAAE,sBAFmD;IAGjE,YAAY,EAAE;EAHmD,CAArB,CAA9C;;EAMA,MAAM,YAAY,GAAG,CAAC,KAAD,EAAyB,MAAzB,KAAgD;IACnE;IACA,IAAI,MAAM,CAAC,QAAX,EAAqB;MACnB;IACD,CAJkE,CAMnE;;;IACA,IAAI,YAAY,GAAG,CAAC,MAAM,CAAC,KAAR,CAAnB,CAPmE,CASnE;;IACA,IAAI,WAAJ,EAAiB;MACf,MAAM,aAAa,GAAG,eAAe,CAAC,SAAhB,CAA0B,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAA5C,CAAtB;;MACA,IAAI,aAAa,GAAG,CAAC,CAArB,EAAwB;QACtB;QACA,YAAY,GAAG,CAAC,GAAG,eAAe,CAAC,KAAhB,CAAsB,CAAtB,EAAyB,aAAzB,CAAJ,EAA6C,GAAG,eAAe,CAAC,KAAhB,CAAsB,aAAa,GAAG,CAAtC,CAAhD,CAAf;MACD,CAHD,MAGO;QACL;QACA,YAAY,GAAG,CAAC,GAAG,eAAJ,EAAqB,MAAM,CAAC,KAA5B,CAAf;MACD;IACF;;IAED,kBAAkB,CAAC,YAAD,CAAlB;IACA,QAAQ,KAAA,IAAR,IAAA,QAAQ,KAAA,KAAA,CAAR,GAAQ,KAAA,CAAR,GAAA,QAAQ,CAAG,KAAH,EAAU;MAAE,WAAW,EAAE,MAAM,CAAC,KAAtB;MAA6B,eAAe,EAAE;IAA9C,CAAV,CAAR;EACD,CAvBD;;EAyBA,OAAO;IAAE,eAAF;IAAmB;EAAnB,CAAP;AACD,CAnCM;;AAAM,OAAA,CAAA,YAAA,GAAY,YAAZ","sourcesContent":["import { useControllableState } from '@fluentui/react-utilities';\nimport { OptionValue } from './OptionCollection.types';\nimport { SelectionEvents, SelectionProps, SelectionValue } from './Selection.types';\n\nexport const useSelection = (props: SelectionProps): SelectionValue => {\n const { defaultSelectedOptions, multiselect, onSelect } = props;\n\n const [selectedOptions, setSelectedOptions] = useControllableState({\n state: props.selectedOptions,\n defaultState: defaultSelectedOptions,\n initialState: [],\n });\n\n const selectOption = (event: SelectionEvents, option: OptionValue) => {\n // if the option is disabled, do nothing\n if (option.disabled) {\n return;\n }\n\n // for single-select, always return the selected option\n let newSelection = [option.value];\n\n // toggle selected state of the option for multiselect\n if (multiselect) {\n const selectedIndex = selectedOptions.findIndex(o => o === option.value);\n if (selectedIndex > -1) {\n // deselect option\n newSelection = [...selectedOptions.slice(0, selectedIndex), ...selectedOptions.slice(selectedIndex + 1)];\n } else {\n // select option\n newSelection = [...selectedOptions, option.value];\n }\n }\n\n setSelectedOptions(newSelection);\n onSelect?.(event, { optionValue: option.value, selectedOptions: newSelection });\n };\n\n return { selectedOptions, selectOption };\n};\n"],"sourceRoot":"../src/"}
1
+ {"version":3,"mappings":";;;;;;AAAA;AACA;AAIO,MAAMA,YAAY,GAAIC,KAAqB,IAAoB;EACpE,MAAM;IAAEC,sBAAsB;IAAEC,WAAW;IAAEC;EAAc,CAAE,GAAGH,KAAK;EAErE,MAAM,CAACI,eAAe,EAAEC,kBAAkB,CAAC,GAAGC,sCAAoB,CAAC;IACjEC,KAAK,EAAEP,KAAK,CAACI,eAAe;IAC5BI,YAAY,EAAEP,sBAAsB;IACpCQ,YAAY,EAAE;GACf,CAAC;EAEF,MAAMC,YAAY,GAAGC,mBAAW,CAC9B,CAACC,KAAsB,EAAEC,MAAmB,KAAI;IAC9C;IACA,IAAIA,MAAM,CAACC,QAAQ,EAAE;MACnB;;IAGF;IACA,IAAIC,YAAY,GAAG,CAACF,MAAM,CAACG,KAAK,CAAC;IAEjC;IACA,IAAId,WAAW,EAAE;MACf,MAAMe,aAAa,GAAGb,eAAe,CAACc,SAAS,CAACC,CAAC,IAAIA,CAAC,KAAKN,MAAM,CAACG,KAAK,CAAC;MACxE,IAAIC,aAAa,GAAG,CAAC,CAAC,EAAE;QACtB;QACAF,YAAY,GAAG,CAAC,GAAGX,eAAe,CAACgB,KAAK,CAAC,CAAC,EAAEH,aAAa,CAAC,EAAE,GAAGb,eAAe,CAACgB,KAAK,CAACH,aAAa,GAAG,CAAC,CAAC,CAAC;OACzG,MAAM;QACL;QACAF,YAAY,GAAG,CAAC,GAAGX,eAAe,EAAES,MAAM,CAACG,KAAK,CAAC;;;IAIrDX,kBAAkB,CAACU,YAAY,CAAC;IAChCZ,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAGS,KAAK,EAAE;MAAES,WAAW,EAAER,MAAM,CAACG,KAAK;MAAEM,UAAU,EAAET,MAAM,CAACU,IAAI;MAAEnB,eAAe,EAAEW;IAAY,CAAE,CAAC;EAChH,CAAC,EACD,CAACZ,cAAc,EAAED,WAAW,EAAEE,eAAe,EAAEC,kBAAkB,CAAC,CACnE;EAED,MAAMmB,cAAc,GAAIZ,KAAsB,IAAI;IAChDP,kBAAkB,CAAC,EAAE,CAAC;IACtBF,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAGS,KAAK,EAAE;MAAES,WAAW,EAAEI,SAAS;MAAEH,UAAU,EAAEG,SAAS;MAAErB,eAAe,EAAE;IAAE,CAAE,CAAC;EACjG,CAAC;EAED,OAAO;IAAEoB,cAAc;IAAEd,YAAY;IAAEN;EAAe,CAAE;AAC1D,CAAC;AA3CYsB,oBAAY","names":["useSelection","props","defaultSelectedOptions","multiselect","onOptionSelect","selectedOptions","setSelectedOptions","react_utilities_1","state","defaultState","initialState","selectOption","react_1","event","option","disabled","newSelection","value","selectedIndex","findIndex","o","slice","optionValue","optionText","text","clearSelection","undefined","exports"],"sourceRoot":"../src/","sources":["packages/react-components/react-combobox/src/utils/useSelection.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useControllableState } from '@fluentui/react-utilities';\nimport { OptionValue } from './OptionCollection.types';\nimport { SelectionEvents, SelectionProps, SelectionState } from './Selection.types';\n\nexport const useSelection = (props: SelectionProps): SelectionState => {\n const { defaultSelectedOptions, multiselect, onOptionSelect } = props;\n\n const [selectedOptions, setSelectedOptions] = useControllableState({\n state: props.selectedOptions,\n defaultState: defaultSelectedOptions,\n initialState: [],\n });\n\n const selectOption = useCallback(\n (event: SelectionEvents, option: OptionValue) => {\n // if the option is disabled, do nothing\n if (option.disabled) {\n return;\n }\n\n // for single-select, always return the selected option\n let newSelection = [option.value];\n\n // toggle selected state of the option for multiselect\n if (multiselect) {\n const selectedIndex = selectedOptions.findIndex(o => o === option.value);\n if (selectedIndex > -1) {\n // deselect option\n newSelection = [...selectedOptions.slice(0, selectedIndex), ...selectedOptions.slice(selectedIndex + 1)];\n } else {\n // select option\n newSelection = [...selectedOptions, option.value];\n }\n }\n\n setSelectedOptions(newSelection);\n onOptionSelect?.(event, { optionValue: option.value, optionText: option.text, selectedOptions: newSelection });\n },\n [onOptionSelect, multiselect, selectedOptions, setSelectedOptions],\n );\n\n const clearSelection = (event: SelectionEvents) => {\n setSelectedOptions([]);\n onOptionSelect?.(event, { optionValue: undefined, optionText: undefined, selectedOptions: [] });\n };\n\n return { clearSelection, selectOption, selectedOptions };\n};\n"]}