@onewelcome/react-lib-components 6.0.0 → 6.2.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 (346) hide show
  1. package/dist/cjs/.scope.d.ts +2 -0
  2. package/dist/cjs/Button/Button.module.cjs.js +1 -1
  3. package/dist/cjs/Button/IconButton.module.cjs.js +1 -1
  4. package/dist/cjs/ContextMenu/ContextMenu.cjs.js +1 -1
  5. package/dist/cjs/ContextMenu/ContextMenu.cjs.js.map +1 -1
  6. package/dist/cjs/ContextMenu/ContextMenuItem.module.cjs.js +1 -1
  7. package/dist/cjs/ContextMenu/ContextMenuService.cjs.js +1 -1
  8. package/dist/cjs/ContextMenu/ContextMenuService.cjs.js.map +1 -1
  9. package/dist/cjs/DataGrid/DataGridActions/DataGridColumnsToggle.module.cjs.js +1 -1
  10. package/dist/cjs/Form/Fieldset/Fieldset.cjs.js +1 -1
  11. package/dist/cjs/Form/Fieldset/Fieldset.cjs.js.map +1 -1
  12. package/dist/cjs/Form/Input/Input.module.cjs.js +1 -1
  13. package/dist/cjs/Form/Select/MultiSelect/MultiOption.cjs.js +2 -0
  14. package/dist/cjs/Form/Select/MultiSelect/MultiOption.cjs.js.map +1 -0
  15. package/dist/cjs/Form/Select/MultiSelect/MultiSelect.cjs.js +2 -0
  16. package/dist/cjs/Form/Select/MultiSelect/MultiSelect.cjs.js.map +1 -0
  17. package/dist/cjs/Form/Select/MultiSelect/MultiSelect.module.cjs.js +2 -0
  18. package/dist/cjs/Form/Select/MultiSelect/MultiSelect.module.cjs.js.map +1 -0
  19. package/dist/cjs/Form/Select/MultiSelect/SelectButton.cjs.js +2 -0
  20. package/dist/cjs/Form/Select/MultiSelect/SelectButton.cjs.js.map +1 -0
  21. package/dist/cjs/Form/Select/MultiSelect/SelectButton.module.cjs.js +2 -0
  22. package/dist/cjs/Form/Select/MultiSelect/SelectButton.module.cjs.js.map +1 -0
  23. package/dist/cjs/Form/Select/MultiSelect/SelectedOptions.cjs.js +2 -0
  24. package/dist/cjs/Form/Select/MultiSelect/SelectedOptions.cjs.js.map +1 -0
  25. package/dist/cjs/Form/Select/MultiSelect/SelectedOptions.module.cjs.js +2 -0
  26. package/dist/cjs/Form/Select/MultiSelect/SelectedOptions.module.cjs.js.map +1 -0
  27. package/dist/cjs/Form/Select/SelectService.cjs.js +1 -1
  28. package/dist/cjs/Form/Select/SelectService.cjs.js.map +1 -1
  29. package/dist/cjs/Form/Select/SingleSelect/Option.cjs.js +2 -0
  30. package/dist/cjs/Form/Select/SingleSelect/Option.cjs.js.map +1 -0
  31. package/dist/cjs/Form/Select/SingleSelect/Select.cjs.js +2 -0
  32. package/dist/cjs/Form/Select/SingleSelect/Select.cjs.js.map +1 -0
  33. package/dist/cjs/Form/Select/SingleSelect/Select.module.cjs.js +2 -0
  34. package/dist/cjs/Form/Select/useAddNewBtn.cjs.js +2 -0
  35. package/dist/cjs/Form/Select/useAddNewBtn.cjs.js.map +1 -0
  36. package/dist/cjs/Form/Select/useAddNewBtn.module.cjs.js +2 -0
  37. package/dist/cjs/Form/Select/useAddNewBtn.module.cjs.js.map +1 -0
  38. package/dist/cjs/Form/Select/useSearch.cjs.js +2 -0
  39. package/dist/cjs/Form/Select/useSearch.cjs.js.map +1 -0
  40. package/dist/cjs/Form/Textarea/Textarea.module.cjs.js +1 -1
  41. package/dist/cjs/Form/Wrapper/InputWrapper/InputWrapper.module.cjs.js +1 -1
  42. package/dist/cjs/Form/Wrapper/SelectWrapper/SelectWrapper.cjs.js +1 -1
  43. package/dist/cjs/Form/Wrapper/SelectWrapper/SelectWrapper.cjs.js.map +1 -1
  44. package/dist/cjs/Form/Wrapper/SelectWrapper/SelectWrapper.module.cjs.js +1 -1
  45. package/dist/cjs/Form/Wrapper/Wrapper/Wrapper.module.cjs.js +1 -1
  46. package/dist/cjs/Icon/Icon.cjs.js +1 -1
  47. package/dist/cjs/Icon/Icon.cjs.js.map +1 -1
  48. package/dist/cjs/Icon/Icon.module.cjs.js +1 -1
  49. package/dist/cjs/Link/Link.module.cjs.js +1 -1
  50. package/dist/cjs/Notifications/BaseModal/BaseModal.module.cjs.js +1 -1
  51. package/dist/cjs/Notifications/SlideInModal/SlideInModal.module.cjs.js +1 -1
  52. package/dist/cjs/Notifications/Snackbar/SnackbarItem/SnackbarItem.module.cjs.js +1 -1
  53. package/dist/cjs/Pagination/Pagination.cjs.js +1 -1
  54. package/dist/cjs/Pagination/Pagination.cjs.js.map +1 -1
  55. package/dist/cjs/Popover/Popover.cjs.js +1 -1
  56. package/dist/cjs/Popover/Popover.cjs.js.map +1 -1
  57. package/dist/cjs/Popover/Popover.module.cjs.js +1 -1
  58. package/dist/cjs/Stepper/Step.cjs.js +1 -1
  59. package/dist/cjs/Stepper/Step.cjs.js.map +1 -1
  60. package/dist/cjs/Stepper/Step.module.cjs.js +1 -1
  61. package/dist/cjs/Stepper/Stepper.cjs.js +1 -1
  62. package/dist/cjs/Stepper/Stepper.cjs.js.map +1 -1
  63. package/dist/cjs/Tabs/TabButton.module.cjs.js +1 -1
  64. package/dist/cjs/Tag/RemoveButton.cjs.js +2 -0
  65. package/dist/cjs/Tag/RemoveButton.cjs.js.map +1 -0
  66. package/dist/cjs/Tag/RemoveButton.module.cjs.js +2 -0
  67. package/dist/cjs/Tag/RemoveButton.module.cjs.js.map +1 -0
  68. package/dist/cjs/Tag/Tag.cjs.js +1 -1
  69. package/dist/cjs/Tag/Tag.cjs.js.map +1 -1
  70. package/dist/cjs/Tag/Tag.module.cjs.js +1 -1
  71. package/dist/cjs/TextEllipsis/TextEllipsis.module.cjs.js +1 -1
  72. package/dist/cjs/Tiles/Tile.module.cjs.js +1 -1
  73. package/dist/cjs/Tooltip/Tooltip.module.cjs.js +1 -1
  74. package/dist/cjs/Wizard/BaseWizardSteps/BaseWizardSteps.module.cjs.js +1 -1
  75. package/dist/cjs/src/components/ContextMenu/ContextMenu.d.ts +1 -1
  76. package/dist/cjs/src/components/ContextMenu/ContextMenuService.d.ts +4 -1
  77. package/dist/cjs/src/components/Form/Select/MultiSelect/MultiOption.d.ts +6 -0
  78. package/dist/cjs/src/components/Form/Select/MultiSelect/MultiSelect.d.ts +3 -0
  79. package/dist/cjs/src/components/Form/Select/MultiSelect/SelectButton.d.ts +4 -0
  80. package/dist/cjs/src/components/Form/Select/MultiSelect/SelectedOptions.d.ts +11 -0
  81. package/dist/cjs/src/components/Form/Select/Select.interfaces.d.ts +47 -1
  82. package/dist/cjs/src/components/Form/Select/SelectService.d.ts +8 -3
  83. package/dist/cjs/src/components/Form/Select/{Option.d.ts → SingleSelect/Option.d.ts} +1 -0
  84. package/dist/cjs/src/components/Form/Select/SingleSelect/Select.d.ts +3 -0
  85. package/dist/cjs/src/components/Form/Select/SingleSelect/Select.test.d.ts +63 -0
  86. package/dist/cjs/src/components/Form/Select/useAddNewBtn.d.ts +12 -0
  87. package/dist/cjs/src/components/Form/Select/useSearch.d.ts +29 -0
  88. package/dist/cjs/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.d.ts +16 -0
  89. package/dist/cjs/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.d.ts +2 -2
  90. package/dist/cjs/src/components/Icon/Icon.d.ts +1 -0
  91. package/dist/cjs/src/components/Stepper/Stepper.d.ts +0 -1
  92. package/dist/cjs/src/components/Tag/RemoveButton.d.ts +7 -0
  93. package/dist/cjs/src/components/Tag/Tag.d.ts +3 -0
  94. package/dist/cjs/src/hooks/usePosition.cjs.js.map +1 -1
  95. package/dist/cjs/src/hooks/usePosition.d.ts +1 -1
  96. package/dist/cjs/src/index.cjs.js +1 -1
  97. package/dist/cjs/src/index.d.ts +7 -4
  98. package/dist/esm/.scope.d.ts +2 -0
  99. package/dist/esm/Button/Button.module.esm.js +1 -1
  100. package/dist/esm/Button/IconButton.module.esm.js +1 -1
  101. package/dist/esm/ContextMenu/ContextMenu.esm.js +1 -1
  102. package/dist/esm/ContextMenu/ContextMenu.esm.js.map +1 -1
  103. package/dist/esm/ContextMenu/ContextMenuItem.module.esm.js +1 -1
  104. package/dist/esm/ContextMenu/ContextMenuService.esm.js +1 -1
  105. package/dist/esm/ContextMenu/ContextMenuService.esm.js.map +1 -1
  106. package/dist/esm/DataGrid/DataGridActions/DataGridColumnsToggle.module.esm.js +1 -1
  107. package/dist/esm/Form/Fieldset/Fieldset.esm.js +1 -1
  108. package/dist/esm/Form/Fieldset/Fieldset.esm.js.map +1 -1
  109. package/dist/esm/Form/Input/Input.module.esm.js +1 -1
  110. package/dist/esm/Form/Select/MultiSelect/MultiOption.esm.js +2 -0
  111. package/dist/esm/Form/Select/MultiSelect/MultiOption.esm.js.map +1 -0
  112. package/dist/esm/Form/Select/MultiSelect/MultiSelect.esm.js +2 -0
  113. package/dist/esm/Form/Select/MultiSelect/MultiSelect.esm.js.map +1 -0
  114. package/dist/esm/Form/Select/MultiSelect/MultiSelect.module.esm.js +2 -0
  115. package/dist/esm/Form/Select/MultiSelect/MultiSelect.module.esm.js.map +1 -0
  116. package/dist/esm/Form/Select/MultiSelect/SelectButton.esm.js +2 -0
  117. package/dist/esm/Form/Select/MultiSelect/SelectButton.esm.js.map +1 -0
  118. package/dist/esm/Form/Select/MultiSelect/SelectButton.module.esm.js +2 -0
  119. package/dist/esm/Form/Select/MultiSelect/SelectButton.module.esm.js.map +1 -0
  120. package/dist/esm/Form/Select/MultiSelect/SelectedOptions.esm.js +2 -0
  121. package/dist/esm/Form/Select/MultiSelect/SelectedOptions.esm.js.map +1 -0
  122. package/dist/esm/Form/Select/MultiSelect/SelectedOptions.module.esm.js +2 -0
  123. package/dist/esm/Form/Select/MultiSelect/SelectedOptions.module.esm.js.map +1 -0
  124. package/dist/esm/Form/Select/SelectService.esm.js +1 -1
  125. package/dist/esm/Form/Select/SelectService.esm.js.map +1 -1
  126. package/dist/esm/Form/Select/SingleSelect/Option.esm.js +2 -0
  127. package/dist/esm/Form/Select/SingleSelect/Option.esm.js.map +1 -0
  128. package/dist/esm/Form/Select/SingleSelect/Select.esm.js +2 -0
  129. package/dist/esm/Form/Select/SingleSelect/Select.esm.js.map +1 -0
  130. package/dist/esm/Form/Select/SingleSelect/Select.module.esm.js +2 -0
  131. package/dist/esm/Form/Select/useAddNewBtn.esm.js +2 -0
  132. package/dist/esm/Form/Select/useAddNewBtn.esm.js.map +1 -0
  133. package/dist/esm/Form/Select/useAddNewBtn.module.esm.js +2 -0
  134. package/dist/esm/Form/Select/useAddNewBtn.module.esm.js.map +1 -0
  135. package/dist/esm/Form/Select/useSearch.esm.js +2 -0
  136. package/dist/esm/Form/Select/useSearch.esm.js.map +1 -0
  137. package/dist/esm/Form/Textarea/Textarea.module.esm.js +1 -1
  138. package/dist/esm/Form/Wrapper/InputWrapper/InputWrapper.module.esm.js +1 -1
  139. package/dist/esm/Form/Wrapper/SelectWrapper/SelectWrapper.esm.js +1 -1
  140. package/dist/esm/Form/Wrapper/SelectWrapper/SelectWrapper.esm.js.map +1 -1
  141. package/dist/esm/Form/Wrapper/SelectWrapper/SelectWrapper.module.esm.js +1 -1
  142. package/dist/esm/Form/Wrapper/Wrapper/Wrapper.module.esm.js +1 -1
  143. package/dist/esm/Icon/Icon.esm.js +1 -1
  144. package/dist/esm/Icon/Icon.esm.js.map +1 -1
  145. package/dist/esm/Icon/Icon.module.esm.js +1 -1
  146. package/dist/esm/Link/Link.module.esm.js +1 -1
  147. package/dist/esm/Notifications/BaseModal/BaseModal.module.esm.js +1 -1
  148. package/dist/esm/Notifications/SlideInModal/SlideInModal.module.esm.js +1 -1
  149. package/dist/esm/Notifications/Snackbar/SnackbarItem/SnackbarItem.module.esm.js +1 -1
  150. package/dist/esm/Pagination/Pagination.esm.js +1 -1
  151. package/dist/esm/Pagination/Pagination.esm.js.map +1 -1
  152. package/dist/esm/Popover/Popover.esm.js +1 -1
  153. package/dist/esm/Popover/Popover.esm.js.map +1 -1
  154. package/dist/esm/Popover/Popover.module.esm.js +1 -1
  155. package/dist/esm/Stepper/Step.esm.js +1 -1
  156. package/dist/esm/Stepper/Step.esm.js.map +1 -1
  157. package/dist/esm/Stepper/Step.module.esm.js +1 -1
  158. package/dist/esm/Stepper/Stepper.esm.js +1 -1
  159. package/dist/esm/Stepper/Stepper.esm.js.map +1 -1
  160. package/dist/esm/Tabs/TabButton.module.esm.js +1 -1
  161. package/dist/esm/Tag/RemoveButton.esm.js +2 -0
  162. package/dist/esm/Tag/RemoveButton.esm.js.map +1 -0
  163. package/dist/esm/Tag/RemoveButton.module.esm.js +2 -0
  164. package/dist/esm/Tag/RemoveButton.module.esm.js.map +1 -0
  165. package/dist/esm/Tag/Tag.esm.js +1 -1
  166. package/dist/esm/Tag/Tag.esm.js.map +1 -1
  167. package/dist/esm/Tag/Tag.module.esm.js +1 -1
  168. package/dist/esm/TextEllipsis/TextEllipsis.module.esm.js +1 -1
  169. package/dist/esm/Tiles/Tile.module.esm.js +1 -1
  170. package/dist/esm/Tooltip/Tooltip.module.esm.js +1 -1
  171. package/dist/esm/Wizard/BaseWizardSteps/BaseWizardSteps.module.esm.js +1 -1
  172. package/dist/esm/src/components/ContextMenu/ContextMenu.d.ts +1 -1
  173. package/dist/esm/src/components/ContextMenu/ContextMenuService.d.ts +4 -1
  174. package/dist/esm/src/components/Form/Select/MultiSelect/MultiOption.d.ts +6 -0
  175. package/dist/esm/src/components/Form/Select/MultiSelect/MultiSelect.d.ts +3 -0
  176. package/dist/esm/src/components/Form/Select/MultiSelect/MultiSelect.test.d.ts +1 -0
  177. package/dist/esm/src/components/Form/Select/MultiSelect/SelectButton.d.ts +4 -0
  178. package/dist/esm/src/components/Form/Select/MultiSelect/SelectedOptions.d.ts +11 -0
  179. package/dist/esm/src/components/Form/Select/Select.interfaces.d.ts +47 -1
  180. package/dist/esm/src/components/Form/Select/SelectService.d.ts +8 -3
  181. package/dist/esm/src/components/Form/Select/{Option.d.ts → SingleSelect/Option.d.ts} +1 -0
  182. package/dist/esm/src/components/Form/Select/SingleSelect/Option.test.d.ts +1 -0
  183. package/dist/esm/src/components/Form/Select/SingleSelect/Select.d.ts +3 -0
  184. package/dist/esm/src/components/Form/Select/SingleSelect/Select.test.d.ts +63 -0
  185. package/dist/esm/src/components/Form/Select/SingleSelect/SelectKeyboardNavigation.test.d.ts +1 -0
  186. package/dist/esm/src/components/Form/Select/useAddNewBtn.d.ts +12 -0
  187. package/dist/esm/src/components/Form/Select/useSearch.d.ts +29 -0
  188. package/dist/esm/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.d.ts +16 -0
  189. package/dist/esm/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.test.d.ts +1 -0
  190. package/dist/esm/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.d.ts +2 -2
  191. package/dist/esm/src/components/Icon/Icon.d.ts +1 -0
  192. package/dist/esm/src/components/Stepper/Stepper.d.ts +0 -1
  193. package/dist/esm/src/components/Tag/RemoveButton.d.ts +7 -0
  194. package/dist/esm/src/components/Tag/Tag.d.ts +3 -0
  195. package/dist/esm/src/hooks/usePosition.d.ts +1 -1
  196. package/dist/esm/src/hooks/usePosition.esm.js.map +1 -1
  197. package/dist/esm/src/index.d.ts +7 -4
  198. package/dist/esm/src/index.esm.js +1 -1
  199. package/package.json +49 -46
  200. package/src/components/ContextMenu/ContextMenu.tsx +13 -23
  201. package/src/components/ContextMenu/ContextMenuService.ts +47 -1
  202. package/src/components/Form/Fieldset/Fieldset.tsx +3 -1
  203. package/src/{hooks/useWrapper.test.ts → components/Form/Select/MultiSelect/MultiOption.tsx} +13 -10
  204. package/src/components/Form/Select/{Select.module.scss → MultiSelect/MultiSelect.module.scss} +19 -20
  205. package/src/components/Form/Select/MultiSelect/MultiSelect.tsx +363 -0
  206. package/src/components/Form/Select/MultiSelect/SelectButton.module.scss +27 -0
  207. package/src/components/Form/Select/MultiSelect/SelectButton.tsx +37 -0
  208. package/src/components/Form/Select/MultiSelect/SelectedOptions.module.scss +31 -0
  209. package/src/components/Form/Select/MultiSelect/SelectedOptions.tsx +67 -0
  210. package/src/components/Form/Select/Select.interfaces.ts +51 -1
  211. package/src/components/Form/Select/SelectService.ts +46 -13
  212. package/src/components/Form/Select/{Option.tsx → SingleSelect/Option.tsx} +3 -1
  213. package/src/components/Form/Select/SingleSelect/Select.module.scss +232 -0
  214. package/src/components/Form/Select/{Select.tsx → SingleSelect/Select.tsx} +56 -87
  215. package/src/components/Form/Select/useAddNewBtn.module.scss +51 -0
  216. package/src/components/Form/Select/useAddNewBtn.tsx +54 -0
  217. package/src/components/Form/Select/useSearch.tsx +124 -0
  218. package/src/components/Form/Wrapper/InputWrapper/InputWrapper.module.scss +0 -10
  219. package/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.module.scss +27 -0
  220. package/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.tsx +84 -0
  221. package/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.module.scss +0 -4
  222. package/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.tsx +3 -2
  223. package/src/components/Form/Wrapper/Wrapper/Wrapper.module.scss +0 -6
  224. package/src/components/Icon/Icon.module.scss +5 -0
  225. package/src/components/Icon/Icon.tsx +1 -0
  226. package/src/components/Link/Link.module.scss +16 -0
  227. package/src/components/Pagination/Pagination.tsx +2 -2
  228. package/src/components/Popover/Popover.tsx +19 -2
  229. package/src/components/Stepper/Step.tsx +2 -1
  230. package/src/components/Stepper/Stepper.tsx +0 -2
  231. package/src/{hooks/useScroll.test.tsx → components/Tag/RemoveButton.module.scss} +22 -17
  232. package/src/components/Tag/RemoveButton.tsx +52 -0
  233. package/src/components/Tag/Tag.module.scss +23 -2
  234. package/src/components/Tag/Tag.tsx +21 -11
  235. package/src/components/Tooltip/Tooltip.module.scss +1 -0
  236. package/src/font/icomoon.eot +0 -0
  237. package/src/font/icomoon.svg +1 -0
  238. package/src/font/icomoon.ttf +0 -0
  239. package/src/font/icomoon.woff +0 -0
  240. package/src/font/selection.json +1 -1
  241. package/src/hooks/usePosition.ts +1 -1
  242. package/src/index.ts +11 -4
  243. package/src/interfaces.ts +2 -2
  244. package/src/mixins.module.scss +2 -4
  245. package/dist/cjs/Form/Select/Option.cjs.js +0 -2
  246. package/dist/cjs/Form/Select/Option.cjs.js.map +0 -1
  247. package/dist/cjs/Form/Select/Select.cjs.js +0 -2
  248. package/dist/cjs/Form/Select/Select.cjs.js.map +0 -1
  249. package/dist/cjs/Form/Select/Select.module.cjs.js +0 -2
  250. package/dist/cjs/src/components/Form/Select/Select.d.ts +0 -23
  251. package/dist/esm/Form/Select/Option.esm.js +0 -2
  252. package/dist/esm/Form/Select/Option.esm.js.map +0 -1
  253. package/dist/esm/Form/Select/Select.esm.js +0 -2
  254. package/dist/esm/Form/Select/Select.esm.js.map +0 -1
  255. package/dist/esm/Form/Select/Select.module.esm.js +0 -2
  256. package/dist/esm/src/components/Form/Select/Select.d.ts +0 -23
  257. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +0 -64
  258. package/src/components/Button/BaseButton.test.tsx +0 -133
  259. package/src/components/Button/Button.test.tsx +0 -150
  260. package/src/components/Button/IconButton.test.tsx +0 -106
  261. package/src/components/ContextMenu/ContextMenu.test.tsx +0 -358
  262. package/src/components/DataGrid/DataGrid.test.tsx +0 -437
  263. package/src/components/DataGrid/DataGridActions/DataGridActions.test.tsx +0 -204
  264. package/src/components/DataGrid/DataGridActions/DataGridColumnsToggle.test.tsx +0 -99
  265. package/src/components/DataGrid/DataGridBody/DataGridBody.test.tsx +0 -140
  266. package/src/components/DataGrid/DataGridBody/DataGridCell.test.tsx +0 -90
  267. package/src/components/DataGrid/DataGridBody/DataGridRow.test.tsx +0 -117
  268. package/src/components/DataGrid/DataGridHeader/DataGridHeader.test.tsx +0 -276
  269. package/src/components/DataGrid/DataGridHeader/DataGridHeaderCell.test.tsx +0 -144
  270. package/src/components/Form/Checkbox/Checkbox.test.tsx +0 -308
  271. package/src/components/Form/Fieldset/Fieldset.test.tsx +0 -127
  272. package/src/components/Form/FileUpload/FileItem/FileItem.test.tsx +0 -103
  273. package/src/components/Form/FileUpload/FileUpload.test.tsx +0 -374
  274. package/src/components/Form/Form.test.tsx +0 -63
  275. package/src/components/Form/FormControl/FormControl.test.tsx +0 -98
  276. package/src/components/Form/FormGroup/FormGroup.test.tsx +0 -127
  277. package/src/components/Form/FormHelperText/FormHelperText.test.tsx +0 -84
  278. package/src/components/Form/FormSelectorWrapper/FormSelectorWrapper.test.tsx +0 -94
  279. package/src/components/Form/Input/Input.test.tsx +0 -267
  280. package/src/components/Form/Label/Label.test.tsx +0 -68
  281. package/src/components/Form/Radio/Radio.test.tsx +0 -130
  282. package/src/components/Form/Select/Option.test.tsx +0 -57
  283. package/src/components/Form/Select/Select.test.tsx +0 -564
  284. package/src/components/Form/Textarea/Textarea.test.tsx +0 -124
  285. package/src/components/Form/Toggle/Toggle.test.tsx +0 -200
  286. package/src/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.test.tsx +0 -141
  287. package/src/components/Form/Wrapper/InputWrapper/InputWrapper.test.tsx +0 -211
  288. package/src/components/Form/Wrapper/RadioWrapper/RadioWrapper.test.tsx +0 -117
  289. package/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.test.tsx +0 -186
  290. package/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.test.tsx +0 -173
  291. package/src/components/Form/Wrapper/Wrapper/Wrapper.test.tsx +0 -59
  292. package/src/components/Icon/Icon.test.tsx +0 -83
  293. package/src/components/Link/Link.test.tsx +0 -203
  294. package/src/components/Notifications/Banner/Banner.test.tsx +0 -84
  295. package/src/components/Notifications/BaseModal/BaseModal.test.tsx +0 -194
  296. package/src/components/Notifications/BaseModal/BaseModalActions/BaseModalActions.test.tsx +0 -74
  297. package/src/components/Notifications/BaseModal/BaseModalContent/BaseModalContent.test.tsx +0 -71
  298. package/src/components/Notifications/BaseModal/BaseModalHeader/BaseModalHeader.test.tsx +0 -74
  299. package/src/components/Notifications/Dialog/Dialog.test.tsx +0 -118
  300. package/src/components/Notifications/Dialog/DialogActions/DialogActions.test.tsx +0 -61
  301. package/src/components/Notifications/Dialog/DialogTitle/DialogTitle.test.tsx +0 -87
  302. package/src/components/Notifications/DiscardChangesModal/DiscardChangesDialog/DiscardChangesDialog.test.tsx +0 -111
  303. package/src/components/Notifications/DiscardChangesModal/DiscardChangesModal.test.tsx +0 -175
  304. package/src/components/Notifications/Modal/Modal.test.tsx +0 -18
  305. package/src/components/Notifications/NotificationProvider/NotificationContext.test.tsx +0 -449
  306. package/src/components/Notifications/SlideInModal/SlideInModal.test.tsx +0 -90
  307. package/src/components/Notifications/Snackbar/SnackbarContainer/SnackbarContainer.test.tsx +0 -53
  308. package/src/components/Notifications/Snackbar/SnackbarItem/SnackbarItem.test.tsx +0 -77
  309. package/src/components/Notifications/Snackbar/SnackbarProvider/SnackbarProvider.test.tsx +0 -219
  310. package/src/components/Notifications/Snackbar/useSnackbar.test.tsx +0 -136
  311. package/src/components/Pagination/Pagination.test.tsx +0 -183
  312. package/src/components/Popover/Popover.test.tsx +0 -103
  313. package/src/components/ProgressBar/ProgressBar.test.tsx +0 -91
  314. package/src/components/Skeleton/Skeleton.test.tsx +0 -112
  315. package/src/components/StatusIndicator/StatusIndicator.test.tsx +0 -143
  316. package/src/components/Stepper/Stepper.test.tsx +0 -83
  317. package/src/components/Tabs/Tab.test.tsx +0 -49
  318. package/src/components/Tabs/TabButton.test.tsx +0 -65
  319. package/src/components/Tabs/Tabs.test.tsx +0 -291
  320. package/src/components/Tag/Tag.test.tsx +0 -89
  321. package/src/components/TextEllipsis/TextEllipsis.test.tsx +0 -96
  322. package/src/components/Tiles/Tile.test.tsx +0 -183
  323. package/src/components/Tiles/Tiles.test.tsx +0 -162
  324. package/src/components/Tooltip/Tooltip.test.tsx +0 -390
  325. package/src/components/Typography/Typography.test.tsx +0 -177
  326. package/src/components/Wizard/BaseWizardSteps/BaseWizardSteps.test.tsx +0 -90
  327. package/src/components/Wizard/Wizard.test.tsx +0 -218
  328. package/src/components/Wizard/WizardActions/WizardActions.test.tsx +0 -187
  329. package/src/components/Wizard/WizardSteps/WizardSteps.test.tsx +0 -125
  330. package/src/components/_BaseStyling_/BaseStyling.test.tsx +0 -55
  331. package/src/hooks/useAnimation.test.tsx +0 -65
  332. package/src/hooks/useBodyClick.test.tsx +0 -55
  333. package/src/hooks/useDebouncedCallback.test.ts +0 -150
  334. package/src/hooks/useDetermineStatusIcon.test.ts +0 -28
  335. package/src/hooks/useFormSelector.test.ts +0 -56
  336. package/src/hooks/usePosition.test.tsx +0 -510
  337. package/src/hooks/useRepeater.test.tsx +0 -156
  338. package/src/hooks/useSpacing.test.ts +0 -86
  339. package/src/hooks/useUploadFile.test.ts +0 -211
  340. package/src/util/helper.test.tsx +0 -403
  341. /package/dist/cjs/Form/Select/{Select.module.cjs.js.map → SingleSelect/Select.module.cjs.js.map} +0 -0
  342. /package/dist/cjs/src/components/Form/Select/{Option.test.d.ts → MultiSelect/MultiSelect.test.d.ts} +0 -0
  343. /package/dist/{esm/src/components/Form/Select → cjs/src/components/Form/Select/SingleSelect}/Option.test.d.ts +0 -0
  344. /package/dist/cjs/src/components/Form/Select/{Select.test.d.ts → SingleSelect/SelectKeyboardNavigation.test.d.ts} +0 -0
  345. /package/dist/{esm/src/components/Form/Select/Select.test.d.ts → cjs/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.test.d.ts} +0 -0
  346. /package/dist/esm/Form/Select/{Select.module.esm.js.map → SingleSelect/Select.module.esm.js.map} +0 -0
@@ -21,6 +21,7 @@ import {
21
21
  UseSelectPositionListParams
22
22
  } from "./Select.interfaces";
23
23
 
24
+ /** @scope .*/
24
25
  export const useArrowNavigation = ({
25
26
  expanded,
26
27
  setExpanded,
@@ -31,7 +32,8 @@ export const useArrowNavigation = ({
31
32
  childrenCount,
32
33
  setShouldClick,
33
34
  searchInputRef,
34
- renderSearchCondition
35
+ addBtnRef,
36
+ renderThreshold
35
37
  }: UseArrowNavigationParams) => {
36
38
  const onArrowNavigation = (event: React.KeyboardEvent) => {
37
39
  const codesToPreventDefault = [
@@ -54,12 +56,16 @@ export const useArrowNavigation = ({
54
56
  "MetaRight"
55
57
  ];
56
58
 
57
- /** If the select is expanded, we also want to control the Tab key */
59
+ const isAddBtnFocused = addBtnRef?.current === document.activeElement;
60
+
58
61
  if (expanded) {
59
62
  codesToPreventDefault.push("Tab");
60
63
  }
61
64
 
62
- /** We will handle the way certain key strokes affect the Select, unless we're searching */
65
+ if (addBtnRef) {
66
+ codesToPreventDefaultWhenSearching.push("Tab");
67
+ }
68
+
63
69
  if (codesToPreventDefault.includes(event.code) && !event.metaKey && !isSearching) {
64
70
  event.preventDefault();
65
71
  }
@@ -80,7 +86,14 @@ export const useArrowNavigation = ({
80
86
  setFocusedSelectItem(childrenCount - 1);
81
87
  return;
82
88
  case "Escape":
89
+ setIsSearching(false);
90
+ setExpanded(false);
91
+ return;
83
92
  case "Tab":
93
+ if (addBtnRef?.current) {
94
+ addBtnRef.current.focus();
95
+ return;
96
+ }
84
97
  setIsSearching(false);
85
98
  setExpanded(false);
86
99
  }
@@ -125,10 +138,13 @@ export const useArrowNavigation = ({
125
138
 
126
139
  return;
127
140
  case "Tab":
128
- if (childrenCount >= renderSearchCondition && expanded) {
141
+ if (childrenCount >= renderThreshold && expanded && !isAddBtnFocused) {
129
142
  setIsSearching(true);
130
143
  searchInputRef.current?.focus();
131
144
  return;
145
+ } else if (addBtnRef?.current && expanded && !isAddBtnFocused) {
146
+ addBtnRef.current.focus();
147
+ return;
132
148
  }
133
149
  setExpanded(false);
134
150
 
@@ -160,13 +176,21 @@ export const useArrowNavigation = ({
160
176
  return { onArrowNavigation };
161
177
  };
162
178
 
179
+ /** @scope .*/
163
180
  export const useSelectPositionList = ({
164
181
  expanded,
165
182
  optionListReference,
183
+ addBtnRef,
166
184
  containerReference
167
185
  }: UseSelectPositionListParams) => {
168
- const [optionsListMaxHeight, setOptionsListMaxHeight] = useState("none");
169
- const [opacity, setOpacity] = useState(0); // We set opacity because other wise if we calculate the max height you see the list full height for a split second and then it shortens.
186
+ const [optionsListMaxHeight, setOptionsListMaxHeight] = useState<{
187
+ wrapper?: string;
188
+ list?: string;
189
+ }>({
190
+ wrapper: undefined,
191
+ list: undefined
192
+ });
193
+ const [opacity, setOpacity] = useState(0); // We set opacity because otherwise if we calculate the max height you see the list full height for a split second and then it shortens.
170
194
  const [listPosition, setListPosition] = useState<Partial<Position>>({});
171
195
 
172
196
  useEffect(() => {
@@ -203,6 +227,10 @@ export const useSelectPositionList = ({
203
227
  const calculateOptionListMaxHeight = (position: Position) => {
204
228
  // Calculate max height if there's more space below the select
205
229
  const listHeight = optionListReference.current?.getBoundingClientRect().height;
230
+ const addNewButtonHeightWithMargin = addBtnRef.current
231
+ ? addBtnRef.current.getBoundingClientRect().height +
232
+ parseInt(getComputedStyle(addBtnRef.current).marginBottom)
233
+ : 0;
206
234
  const transformOrigin = position.top !== "initial" ? "top" : "bottom";
207
235
 
208
236
  if (!containerReference.current) {
@@ -214,18 +242,23 @@ export const useSelectPositionList = ({
214
242
 
215
243
  const availableSpace =
216
244
  transformOrigin === "top"
217
- ? window.innerHeight -
218
- containerReference.current.getBoundingClientRect()[transformOrigin] -
219
- 16
220
- : containerReference.current.getBoundingClientRect()[transformOrigin] - 16;
245
+ ? window.innerHeight - containerReference.current.getBoundingClientRect().bottom - 16
246
+ : containerReference.current.getBoundingClientRect().top - 16;
221
247
 
222
- if (listHeight && availableSpace < listHeight) {
223
- setOptionsListMaxHeight(`${availableSpace}px`);
248
+ if (listHeight && availableSpace < listHeight + addNewButtonHeightWithMargin) {
249
+ const maxHeightObject = {
250
+ wrapper: `${availableSpace}px`,
251
+ list:
252
+ addNewButtonHeightWithMargin > 0
253
+ ? `${availableSpace - addNewButtonHeightWithMargin}px`
254
+ : "none"
255
+ };
256
+ setOptionsListMaxHeight(maxHeightObject);
224
257
  setOpacity(100);
225
258
  return;
226
259
  }
227
260
 
228
- setOptionsListMaxHeight("none");
261
+ setOptionsListMaxHeight({ wrapper: undefined, list: undefined });
229
262
  setOpacity(100);
230
263
  };
231
264
 
@@ -37,6 +37,7 @@ export interface Props extends ComponentPropsWithRef<"li"> {
37
37
  childIndex?: number;
38
38
  onOptionSelect?: (ref: React.RefObject<HTMLLIElement>) => void;
39
39
  onFocusChange?: (childIndex: number) => void;
40
+ isAddBtnFocused?: boolean;
40
41
  }
41
42
 
42
43
  const OptionComponent: ForwardRefRenderFunction<HTMLLIElement, Props> = (
@@ -53,6 +54,7 @@ const OptionComponent: ForwardRefRenderFunction<HTMLLIElement, Props> = (
53
54
  onFocusChange,
54
55
  disabled,
55
56
  value,
57
+ isAddBtnFocused,
56
58
  ...rest
57
59
  }: Props,
58
60
  ref
@@ -66,7 +68,7 @@ const OptionComponent: ForwardRefRenderFunction<HTMLLIElement, Props> = (
66
68
  }, [isSelected, shouldClick]);
67
69
 
68
70
  useEffect(() => {
69
- if (innerOptionRef.current && hasFocus && selectOpened && !isSearching) {
71
+ if (innerOptionRef.current && hasFocus && selectOpened && !isSearching && !isAddBtnFocused) {
70
72
  onFocusChange && childIndex && onFocusChange(childIndex);
71
73
  innerOptionRef.current.focus();
72
74
  }
@@ -0,0 +1,232 @@
1
+ /*!
2
+ * Copyright 2022 OneWelcome B.V.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ @use "src/mixins.module";
18
+ @use "src/variables";
19
+
20
+ $listItemHeight: 2.5rem;
21
+
22
+ .select {
23
+ position: relative;
24
+ box-sizing: border-box;
25
+ @include mixins.transition(all, 0.2s, ease-in-out);
26
+ border: 0;
27
+ border-radius: var(--input-border-radius);
28
+ background-color: var(--input-background-color);
29
+ font-size: var(--form-control-font-size);
30
+
31
+ [data-display] {
32
+ color: var(--color-default);
33
+ font-family: var(--font-family);
34
+ }
35
+
36
+ &.expanded {
37
+ .list-wrapper {
38
+ background: var(--light);
39
+ }
40
+ }
41
+
42
+ &:not(.expanded) {
43
+ button:focus:not(.error) {
44
+ border: var(--input-border-width-focus) solid var(--color-focus);
45
+ padding: 0
46
+ calc(variables.$form-element-horizontal-padding-mobile - var(--input-border-width-focus));
47
+ }
48
+ }
49
+
50
+ &:hover:not(.disabled):not(.expanded):not(.error) {
51
+ button:not(:focus) {
52
+ border-color: var(--default);
53
+ border-width: var(--input-border-width);
54
+ background-color: var(--color-blue-grey25);
55
+ }
56
+ }
57
+
58
+ .custom-select {
59
+ position: relative;
60
+ width: 100%;
61
+ min-height: calc(2.625rem - (2 * var(--input-border-width)));
62
+ padding: 0 calc(variables.$form-element-horizontal-padding-mobile - var(--input-border-width));
63
+ background-color: transparent;
64
+ border-color: var(--color-blue-grey500);
65
+ border-style: var(--input-border-style);
66
+ border-width: var(--input-border-width);
67
+ border-radius: var(--input-border-radius);
68
+ font-size: var(--form-control-font-size);
69
+ cursor: pointer;
70
+ @include mixins.transition(all, 0.2s, ease-in-out);
71
+
72
+ &:focus {
73
+ outline: 0;
74
+ }
75
+
76
+ &.error {
77
+ border-color: var(--error);
78
+ color: var(--error);
79
+ }
80
+
81
+ &.error:focus {
82
+ border-width: var(--input-border-width-focus);
83
+ }
84
+
85
+ &.disabled {
86
+ border-color: var(--color-disabled);
87
+ }
88
+ }
89
+
90
+ .list-wrapper {
91
+ border-color: var(--light-grey-border);
92
+ border-style: var(--input-border-style);
93
+ border-width: var(--input-border-width);
94
+ border-radius: var(--input-border-radius);
95
+ box-shadow: 0 8px 10px 0 #01053224;
96
+ position: absolute;
97
+ z-index: variables.$select-z-index;
98
+ top: 44px;
99
+ left: 0;
100
+ width: 100%;
101
+ overflow: auto;
102
+ }
103
+
104
+ ul {
105
+ box-sizing: border-box;
106
+ padding: 0.25rem 0;
107
+ width: 100%;
108
+ margin: 0;
109
+ list-style: none;
110
+ background-color: var(--light);
111
+ border-radius: var(--input-border-radius);
112
+ color: var(--default);
113
+ text-align: left;
114
+ overflow: auto;
115
+ max-height: calc($listItemHeight * 10);
116
+
117
+ li {
118
+ padding: 0.62rem 0.75rem;
119
+ font-size: var(--form-control-font-size);
120
+ margin: 0;
121
+ position: relative;
122
+ line-height: 1.25rem;
123
+ box-sizing: border-box;
124
+ min-height: $listItemHeight;
125
+ cursor: pointer;
126
+
127
+ &:focus {
128
+ outline: var(--input-border-width-focus) solid var(--color-primary300);
129
+ outline-offset: var(--input-border-width-focus);
130
+ }
131
+
132
+ &:hover {
133
+ background-color: var(--color-blue-grey50);
134
+ }
135
+
136
+ &:active {
137
+ background-color: var(--color-blue-grey100);
138
+ }
139
+
140
+ &.disabled {
141
+ color: var(--greyed-out);
142
+ background-color: var(--disabled);
143
+ pointer-events: none;
144
+ }
145
+ }
146
+ }
147
+ }
148
+
149
+ .selected-option {
150
+ content: "";
151
+ position: absolute;
152
+ top: 0;
153
+ left: 0;
154
+ height: 100%;
155
+ border-top-right-radius: 0.125rem;
156
+ border-bottom-right-radius: 0.125rem;
157
+ border-left: 0.25rem solid var(--color-primary);
158
+ color: var(--color-primary);
159
+ }
160
+
161
+ .selected {
162
+ position: absolute;
163
+ top: 50%;
164
+ transform: translateY(-50%);
165
+ pointer-events: none;
166
+ }
167
+
168
+ .status {
169
+ position: absolute;
170
+ top: 50%;
171
+ right: 0.8125rem;
172
+ transform: translateY(-50%);
173
+ display: flex;
174
+ align-items: center;
175
+
176
+ [data-icon-status="success"] {
177
+ color: var(--success);
178
+ font-size: 1.25rem;
179
+ }
180
+
181
+ [data-icon-status="error"] {
182
+ color: var(--error);
183
+ font-size: 1.25rem;
184
+ }
185
+
186
+ .chevron-icon {
187
+ color: var(--default);
188
+ font-size: 0.625rem;
189
+ }
190
+
191
+ * + * {
192
+ margin-left: 1.25rem;
193
+ }
194
+ }
195
+
196
+ .placeholder {
197
+ color: var(--greyed-out);
198
+ }
199
+
200
+ .select-search {
201
+ position: relative;
202
+ width: 100%;
203
+ box-sizing: border-box;
204
+ border-bottom-left-radius: 0;
205
+ border-bottom-right-radius: 0;
206
+ }
207
+
208
+ .disabled {
209
+ cursor: not-allowed;
210
+ color: var(--greyed-out);
211
+ background-color: var(--color-blue-grey25);
212
+
213
+ > * {
214
+ pointer-events: none;
215
+ }
216
+ }
217
+
218
+ @media only screen and (min-width: 30em) {
219
+ .select {
220
+ .custom-select {
221
+ padding: 0
222
+ calc(variables.$form-element-horizontal-padding-desktop - var(--input-border-width));
223
+ }
224
+
225
+ &:not(.expanded) {
226
+ button:focus:not(.error) {
227
+ padding: 0
228
+ calc(variables.$form-element-horizontal-padding-desktop - var(--input-border-width-focus));
229
+ }
230
+ }
231
+ }
232
+ }
@@ -17,7 +17,6 @@
17
17
  import classes from "./Select.module.scss";
18
18
 
19
19
  import React, {
20
- ComponentPropsWithRef,
21
20
  createRef,
22
21
  ForwardRefRenderFunction,
23
22
  Fragment,
@@ -26,37 +25,17 @@ import React, {
26
25
  useRef,
27
26
  useState
28
27
  } from "react";
29
- import { Input, Props as InputProps } from "../Input/Input";
30
- import { Icon, Icons } from "../../Icon/Icon";
31
- import { FormElement } from "../form.interfaces";
32
- import { useBodyClick } from "../../../hooks/useBodyClick";
33
- import readyclasses from "../../../readyclasses.module.scss";
34
- import { filterProps } from "../../../util/helper";
35
- import { useArrowNavigation, useSelectPositionList } from "./SelectService";
36
- import { useDetermineStatusIcon } from "../../../hooks/useDetermineStatusIcon";
37
-
38
- type PartialInputProps = Partial<InputProps>;
39
-
40
- export interface Props extends ComponentPropsWithRef<"select">, FormElement {
41
- children: ReactElement[];
42
- name?: string;
43
- labeledBy?: string;
44
- describedBy?: string;
45
- placeholder?: string;
46
- searchPlaceholder?: string;
47
- searchInputProps?: PartialInputProps & { reset?: boolean };
48
- selectButtonProps?: ComponentPropsWithRef<"button">;
49
- className?: string;
50
- value: string;
51
- clearLabel?: string;
52
- noResultsLabel?: string;
53
- onChange?: (event: React.ChangeEvent<HTMLSelectElement>, child?: ReactElement) => void;
54
- }
55
-
56
- /** Amount of items to be rendered before a search input is rendered */
57
- const renderSearchCondition = 10;
58
-
59
- const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
28
+ import { useBodyClick } from "../../../../hooks/useBodyClick";
29
+ import { useDetermineStatusIcon } from "../../../../hooks/useDetermineStatusIcon";
30
+ import readyclasses from "../../../../readyclasses.module.scss";
31
+ import { filterProps } from "../../../../util/helper";
32
+ import { Icon, Icons } from "../../../Icon/Icon";
33
+ import { SingleSelectProps } from "../Select.interfaces";
34
+ import { useArrowNavigation, useSelectPositionList } from "../SelectService";
35
+ import { useAddNewBtn } from "../useAddNewBtn";
36
+ import { useSearch } from "../useSearch";
37
+
38
+ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, SingleSelectProps> = (
60
39
  {
61
40
  children,
62
41
  name,
@@ -74,25 +53,44 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
74
53
  clearLabel = "Clear selection",
75
54
  noResultsLabel = "No results found",
76
55
  onChange,
56
+ addNew,
57
+ search,
77
58
  ...rest
78
- }: Props,
59
+ }: SingleSelectProps,
79
60
  ref
80
61
  ) => {
81
62
  const [expanded, setExpanded] = useState(false);
82
- const [filter, setFilter] = useState("");
83
63
  const [display, setDisplay] = useState("");
84
64
  const containerReference = useRef<HTMLDivElement>(null);
85
65
  const optionListReference = useRef<HTMLDivElement>(null);
86
- const [isSearching, setIsSearching] = useState(false);
87
66
  const [focusedSelectItem, setFocusedSelectItem] = useState(-1);
88
- const [shouldClick, setShouldClick] =
89
- useState(
90
- false
91
- ); /** We need this, because whenever we use the arrow keys to select the select item, and we focus the currently selected item it fires the "click" listener in Option component. Instead, we only want this to fire if we press "enter" or "spacebar" so we set this to true whenever that is the case, and back to false when it has been executed. */
67
+ const [shouldClick, setShouldClick] = useState(false);
68
+ /** We need this, because whenever we use the arrow keys to select the select item, and we focus the currently selected item it fires the "click" listener in Option component. Instead, we only want this to fire if we press "enter" or "spacebar" so we set this to true whenever that is the case, and back to false when it has been executed. */
92
69
  const [shouldFocusButtonAfterClose, setShouldFocusButtonAfterClose] = useState(false);
70
+ const optionsCount = React.Children.count(children);
71
+ const {
72
+ filter,
73
+ isSearching,
74
+ renderSearch,
75
+ searchInputRef,
76
+ setIsSearching,
77
+ searchThreshold,
78
+ searchVisible
79
+ } = useSearch({
80
+ expanded,
81
+ search,
82
+ searchInputClassName: classes["select-search"],
83
+ optionsCount,
84
+ setFocusedSelectItem,
85
+ searchInputProps,
86
+ searchPlaceholder
87
+ });
88
+ const { addBtnRef, addNewBtnOptionsContainerClassName, renderAddNew } = useAddNewBtn({
89
+ addNew,
90
+ filter
91
+ });
93
92
 
94
93
  const nativeSelect = (ref as React.RefObject<HTMLSelectElement>) || createRef();
95
- const searchInputRef = useRef<HTMLInputElement>(null);
96
94
 
97
95
  const onOptionChangeHandler = (optionElement: HTMLElement | null) => {
98
96
  if (nativeSelect.current && optionElement) {
@@ -111,14 +109,15 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
111
109
  setIsSearching,
112
110
  setFocusedSelectItem,
113
111
  onOptionChangeHandler,
114
- childrenCount: React.Children.count(children),
112
+ childrenCount: optionsCount,
115
113
  setShouldClick,
116
114
  searchInputRef,
117
- renderSearchCondition
115
+ addBtnRef,
116
+ renderThreshold: searchThreshold
118
117
  });
119
118
 
120
119
  const { listPosition, opacity, optionsListMaxHeight, setListPosition, setOpacity } =
121
- useSelectPositionList({ expanded, optionListReference, containerReference });
120
+ useSelectPositionList({ expanded, optionListReference, containerReference, addBtnRef });
122
121
 
123
122
  const syncDisplayValue = (val: string) => {
124
123
  React.Children.forEach(children, child => {
@@ -129,7 +128,7 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
129
128
  };
130
129
 
131
130
  /**
132
- * @description We have to modify the children (Option component) to have a additional props that allows us to keep track of which one is selected and focused at all times and if a filter is active.
131
+ * @description We have to modify the children (Option component) to have an additional props that allows us to keep track of which one is selected and focused at all times and if a filter is active.
133
132
  * The `children` prop can be either a single object (1 child) or an array of multiple children.
134
133
  */
135
134
  const renderOptions = () => {
@@ -165,35 +164,13 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
165
164
  selectOpened: expanded,
166
165
  childIndex: index,
167
166
  hasFocus: focusedSelectItem === index,
168
- shouldClick: shouldClick
167
+ shouldClick: shouldClick,
168
+ isAddBtnFocused: addBtnRef.current === document.activeElement
169
169
  });
170
170
  });
171
171
  }
172
172
  };
173
173
 
174
- const shouldRenderSearch =
175
- expanded && Array.isArray(children) && children.length > renderSearchCondition;
176
-
177
- const renderSearch = () => (
178
- <Input
179
- {...searchInputProps}
180
- ref={searchInputRef}
181
- onFocus={() => setIsSearching(true)}
182
- onBlur={() => setIsSearching(false)}
183
- onChange={filterResults}
184
- className={classes["select-search"]}
185
- wrapperProps={{
186
- className: searchInputProps?.wrapperProps?.className
187
- }}
188
- style={{
189
- display: expanded ? "block" : "none"
190
- }}
191
- type="text"
192
- name="search-option"
193
- placeholder={searchPlaceholder}
194
- />
195
- );
196
-
197
174
  const renderChevronIcon = () => {
198
175
  return expanded ? (
199
176
  <Icon className={classes["chevron-icon"]} icon={Icons.ChevronUp} />
@@ -202,10 +179,6 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
202
179
  );
203
180
  };
204
181
 
205
- const filterResults = (event: React.ChangeEvent<HTMLInputElement>) => {
206
- setFilter(event.currentTarget.value);
207
- };
208
-
209
182
  const icon = useDetermineStatusIcon({ success, error });
210
183
 
211
184
  const nativeOnChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {
@@ -238,16 +211,6 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
238
211
  expanded
239
212
  );
240
213
 
241
- const resetSearchState = () => {
242
- setFilter("");
243
- setIsSearching(false);
244
- setFocusedSelectItem(-1);
245
- };
246
-
247
- useEffect(() => {
248
- searchInputProps?.reset && resetSearchState();
249
- }, [searchInputProps?.reset]);
250
-
251
214
  const additionalClasses = [];
252
215
  expanded && additionalClasses.push(classes.expanded);
253
216
  error && additionalClasses.push(classes.error);
@@ -280,7 +243,7 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
280
243
  className ?? ""
281
244
  }`}
282
245
  >
283
- {Array.isArray(children) && children.length > renderSearchCondition && renderSearch()}
246
+ {searchVisible && renderSearch()}
284
247
  <button
285
248
  {...selectButtonProps}
286
249
  onClick={() => {
@@ -290,7 +253,7 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
290
253
  type="button"
291
254
  name={name}
292
255
  className={`${classes["custom-select"]} ${additionalClasses.join(" ")} `}
293
- style={{ display: shouldRenderSearch ? "none" : "initial" }}
256
+ style={{ display: expanded && searchVisible ? "none" : "initial" }}
294
257
  disabled={disabled}
295
258
  aria-disabled={disabled}
296
259
  aria-invalid={error}
@@ -312,16 +275,22 @@ const SelectComponent: ForwardRefRenderFunction<HTMLSelectElement, Props> = (
312
275
  style={{
313
276
  display: expanded ? "block" : "none",
314
277
  opacity: opacity,
315
- maxHeight: optionsListMaxHeight,
278
+ maxHeight: optionsListMaxHeight.wrapper,
316
279
  pointerEvents: expanded ? "auto" : "none",
317
280
  ...listPosition
318
281
  }}
319
282
  >
320
- <ul role="listbox">{renderOptions()}</ul>
283
+ <ul
284
+ className={addNewBtnOptionsContainerClassName}
285
+ role="listbox"
286
+ style={{ maxHeight: optionsListMaxHeight.list }}
287
+ >
288
+ {renderOptions()}
289
+ </ul>
290
+ {renderAddNew()}
321
291
  </div>
322
292
  </div>
323
293
  </Fragment>
324
294
  );
325
295
  };
326
-
327
296
  export const Select = React.forwardRef(SelectComponent);
@@ -0,0 +1,51 @@
1
+ /*!
2
+ * Copyright 2022 OneWelcome B.V.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ ul.has-sibling {
18
+ padding-bottom: 2px;
19
+ }
20
+
21
+ .action-button {
22
+ border: none;
23
+ border-top: 1px solid var(--color-blue-grey50);
24
+ width: 100%;
25
+ height: 2.5rem;
26
+ padding: 0.625rem 0.75rem;
27
+ margin: 0 0 0.25rem;
28
+ background-color: var(--light);
29
+ border-radius: var(--input-border-radius);
30
+ color: var(--default);
31
+ text-align: left;
32
+ box-sizing: border-box;
33
+ cursor: pointer;
34
+
35
+ font-family: var(--font-family);
36
+ font-size: var(--form-control-font-size);
37
+
38
+ &:focus {
39
+ outline: 1px solid;
40
+ outline-offset: 0;
41
+ border-radius: 0;
42
+ }
43
+
44
+ &:hover {
45
+ background-color: var(--color-blue-grey50);
46
+ }
47
+
48
+ &:active {
49
+ background-color: var(--color-blue-grey100);
50
+ }
51
+ }