superdesk-ui-framework 3.0.1-beta.2 → 3.0.1-beta.22

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 (445) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/app/fonts/sd_icons.eot +0 -0
  3. package/app/fonts/sd_icons.svg +14 -7
  4. package/app/fonts/sd_icons.ttf +0 -0
  5. package/app/fonts/sd_icons.woff +0 -0
  6. package/app/img/SD-logo.svg +52 -0
  7. package/app/scripts/toggleBoxNext.js +1 -1
  8. package/app/styles/_accessibility.scss +1 -0
  9. package/app/styles/_big-icon-font.scss +3 -0
  10. package/app/styles/_boxed-list.scss +3 -0
  11. package/app/styles/_buttons.scss +11 -6
  12. package/app/styles/_content-divider.scss +63 -8
  13. package/app/styles/_hamburger.scss +160 -0
  14. package/app/styles/_helpers.scss +35 -5
  15. package/app/styles/_icon-font.scss +20 -10
  16. package/app/styles/_master-desk.scss +3 -2
  17. package/app/styles/_modals.scss +6 -3
  18. package/app/styles/_normalize.scss +4 -0
  19. package/app/styles/_sd-tag-input.scss +221 -296
  20. package/app/styles/_simple-list.scss +1 -0
  21. package/app/styles/_table-list.scss +115 -12
  22. package/app/styles/app.scss +4 -0
  23. package/app/styles/components/_list-item.scss +36 -17
  24. package/app/styles/components/_sd-collapse-box.scss +6 -6
  25. package/app/styles/components/_sd-grid-item.scss +30 -16
  26. package/app/styles/components/_sd-notification-panel.scss +48 -0
  27. package/app/styles/components/_sd-photo-preview.scss +3 -3
  28. package/app/styles/components/_sd-searchbar.scss +7 -0
  29. package/app/styles/design-tokens/_design-tokens-general.scss +3 -6
  30. package/app/styles/design-tokens/_new-colors.scss +16 -6
  31. package/app/styles/dropdowns/_basic-dropdown.scss +6 -0
  32. package/app/styles/form-elements/_forms-general.scss +81 -7
  33. package/app/styles/form-elements/_input-wrap.scss +138 -0
  34. package/app/styles/form-elements/_inputs.scss +577 -102
  35. package/app/styles/grids/_grid-layout.scss +153 -40
  36. package/app/styles/interface-elements/_side-panel.scss +1 -1
  37. package/app/styles/layout/_basic-layout.scss +2 -2
  38. package/app/styles/layout/_editor.scss +10 -4
  39. package/app/styles/menus/_sd-bottom-tabs.scss +70 -0
  40. package/app/styles/menus/_sd-left-navigation.scss +24 -1
  41. package/app/styles/menus/_sd-sidebar-menu.scss +10 -14
  42. package/app/styles/menus/_sd-top-menu.scss +19 -5
  43. package/app/styles/primereact/_pr-dialog.scss +1 -0
  44. package/app/styles/primereact/_pr-dropdown.scss +17 -3
  45. package/app/styles/primereact/_pr-menu.scss +6 -5
  46. package/app-typescript/components/Badge.tsx +3 -2
  47. package/app-typescript/components/ContentDivider.tsx +3 -0
  48. package/app-typescript/components/DatePicker.tsx +71 -36
  49. package/app-typescript/components/DonutChart.tsx +1 -1
  50. package/app-typescript/components/Dropdown.tsx +127 -82
  51. package/app-typescript/components/DurationInput.tsx +400 -0
  52. package/app-typescript/components/EmptyState.tsx +2 -1
  53. package/app-typescript/components/Form/FormLabel.tsx +8 -1
  54. package/app-typescript/components/Form/FormRowNew.tsx +41 -0
  55. package/app-typescript/components/Form/InputBase.tsx +95 -0
  56. package/app-typescript/components/Form/InputNew.tsx +107 -0
  57. package/app-typescript/components/Form/InputWrapper.tsx +79 -0
  58. package/app-typescript/components/Form/index.tsx +4 -0
  59. package/app-typescript/components/Icon.tsx +1 -1
  60. package/app-typescript/components/IconButton.tsx +5 -1
  61. package/app-typescript/components/Input.tsx +39 -42
  62. package/app-typescript/components/Label.tsx +49 -10
  63. package/app-typescript/components/Layouts/AuthoringContainer.tsx +2 -1
  64. package/app-typescript/components/Layouts/AuthoringInnerHeader.tsx +1 -1
  65. package/app-typescript/components/Layouts/AuthoringMain.tsx +4 -2
  66. package/app-typescript/components/Layouts/BottomBarAction.tsx +35 -0
  67. package/app-typescript/components/Layouts/CoreLayout.tsx +63 -0
  68. package/app-typescript/components/Layouts/CoreLayoutContainer.tsx +16 -0
  69. package/app-typescript/components/Layouts/CoreLayoutFooter.tsx +15 -0
  70. package/app-typescript/components/Layouts/CoreLayoutMain.tsx +22 -0
  71. package/app-typescript/components/Layouts/CoreLayoutOverlay.tsx +15 -0
  72. package/app-typescript/components/Layouts/CoreLayoutSlideInMenu.tsx +24 -0
  73. package/app-typescript/components/Layouts/CoreLayoutTopMenu.tsx +35 -0
  74. package/app-typescript/components/Layouts/HamburgerButton.tsx +41 -0
  75. package/app-typescript/components/Layouts/Layout.tsx +2 -2
  76. package/app-typescript/components/Layouts/MainMenu.tsx +101 -0
  77. package/app-typescript/components/Layouts/NotificationPanel.tsx +109 -0
  78. package/app-typescript/components/Layouts/index.tsx +12 -0
  79. package/app-typescript/components/LeftMenu.tsx +127 -116
  80. package/app-typescript/components/Lists/BoxedList.tsx +36 -4
  81. package/app-typescript/components/Lists/ContentList.tsx +38 -10
  82. package/app-typescript/components/Lists/TableList.tsx +283 -151
  83. package/app-typescript/components/Menu.tsx +31 -7
  84. package/app-typescript/components/Modal.tsx +5 -2
  85. package/app-typescript/components/MultiSelect.tsx +35 -5
  86. package/app-typescript/components/NavButton.tsx +4 -0
  87. package/app-typescript/components/Navigation/BottomNav.tsx +83 -0
  88. package/app-typescript/components/SearchBar.tsx +39 -12
  89. package/app-typescript/components/Select.tsx +27 -37
  90. package/app-typescript/components/SelectGrid.tsx +1 -1
  91. package/app-typescript/components/SelectWithTemplate.tsx +32 -7
  92. package/app-typescript/components/Skeleton.tsx +1 -1
  93. package/app-typescript/components/Spacer.tsx +87 -0
  94. package/app-typescript/components/Text/Time.tsx +34 -0
  95. package/app-typescript/components/TimePicker.tsx +38 -15
  96. package/app-typescript/components/Togglebox.tsx +1 -1
  97. package/app-typescript/components/Tooltip.tsx +7 -5
  98. package/app-typescript/components/TreeSelect.tsx +490 -208
  99. package/app-typescript/components/WithSizeObserver.tsx +88 -0
  100. package/app-typescript/dist/components/Alert.d.ts +16 -0
  101. package/app-typescript/dist/components/Autocomplete.d.ts +48 -0
  102. package/app-typescript/dist/components/Avatar.d.ts +33 -0
  103. package/app-typescript/dist/components/Badge.d.ts +13 -0
  104. package/app-typescript/dist/components/Button.d.ts +23 -0
  105. package/app-typescript/dist/components/ButtonGroup.d.ts +12 -0
  106. package/app-typescript/dist/components/CheckButtonGroup.d.ts +11 -0
  107. package/app-typescript/dist/components/CheckGroup.d.ts +9 -0
  108. package/app-typescript/dist/components/Checkbox.d.ts +19 -0
  109. package/app-typescript/dist/components/CheckboxButton.d.ts +19 -0
  110. package/app-typescript/dist/components/DatePicker.d.ts +37 -0
  111. package/app-typescript/dist/components/Divider.d.ts +9 -0
  112. package/app-typescript/dist/components/DonutChart.d.ts +12 -0
  113. package/app-typescript/dist/components/Dropdown.d.ts +28 -0
  114. package/app-typescript/dist/components/DropdownFirst.d.ts +42 -0
  115. package/app-typescript/dist/components/EmptyState.d.ts +11 -0
  116. package/app-typescript/dist/components/FormLabel.d.ts +9 -0
  117. package/app-typescript/dist/components/Genie.d.ts +13 -0
  118. package/app-typescript/dist/components/GridItem.d.ts +69 -0
  119. package/app-typescript/dist/components/GridList.d.ts +14 -0
  120. package/app-typescript/dist/components/HeadingText.d.ts +10 -0
  121. package/app-typescript/dist/components/HelloWorld.d.ts +8 -0
  122. package/app-typescript/dist/components/Icon.d.ts +12 -0
  123. package/app-typescript/dist/components/IconButton.d.ts +12 -0
  124. package/app-typescript/dist/components/IconLabel.d.ts +11 -0
  125. package/app-typescript/dist/components/Input.d.ts +24 -0
  126. package/app-typescript/dist/components/Label.d.ts +15 -0
  127. package/app-typescript/dist/components/LeftMenu.d.ts +26 -0
  128. package/app-typescript/dist/components/Loader.d.ts +8 -0
  129. package/app-typescript/dist/components/NavButton.d.ts +15 -0
  130. package/app-typescript/dist/components/Popover.d.ts +13 -0
  131. package/app-typescript/dist/components/PropsList.d.ts +15 -0
  132. package/app-typescript/dist/components/Radio.d.ts +19 -0
  133. package/app-typescript/dist/components/RadioButton.d.ts +20 -0
  134. package/app-typescript/dist/components/Select.d.ts +29 -0
  135. package/app-typescript/dist/components/SelectWithTemplate.d.ts +32 -0
  136. package/app-typescript/dist/components/SlidingToolbar.d.ts +8 -0
  137. package/app-typescript/dist/components/StrechBar.d.ts +4 -0
  138. package/app-typescript/dist/components/SubNav.d.ts +10 -0
  139. package/app-typescript/dist/components/Switch.d.ts +12 -0
  140. package/app-typescript/dist/components/TabCustom.d.ts +25 -0
  141. package/app-typescript/dist/components/TabList.d.ts +22 -0
  142. package/app-typescript/dist/components/Tag.d.ts +9 -0
  143. package/app-typescript/dist/components/TagInput.d.ts +7 -0
  144. package/app-typescript/dist/components/TagInputTest.d.ts +18 -0
  145. package/app-typescript/dist/components/TimePicker.d.ts +11 -0
  146. package/app-typescript/dist/components/Tooltip.d.ts +11 -0
  147. package/app-typescript/dist/components/_Positioner.d.ts +27 -0
  148. package/app-typescript/dist/index.d.ts +56 -0
  149. package/app-typescript/helpers.tsx +3 -0
  150. package/app-typescript/index.ts +9 -1
  151. package/dist/SD-logo.svg +52 -0
  152. package/dist/examples.bundle.css +942 -9
  153. package/dist/examples.bundle.js +92935 -88376
  154. package/dist/playgrounds/accessible-theme-test.html +1 -1
  155. package/dist/playgrounds/layout-test-2.html +1 -1
  156. package/dist/playgrounds/list-item-test.html +1 -1
  157. package/dist/playgrounds/master-desk.html +1 -1
  158. package/dist/playgrounds/media-carousel.html +1 -1
  159. package/dist/playgrounds/photo-desk.html +1 -1
  160. package/dist/playgrounds/planning.html +1 -1
  161. package/dist/playgrounds/publish.html +1 -1
  162. package/dist/playgrounds/publisher-content-analytics.html +1 -1
  163. package/dist/playgrounds/publisher-content-list-automatic.html +1 -1
  164. package/dist/playgrounds/publisher-content-list-manual.html +1 -1
  165. package/dist/playgrounds/publisher-content-lists.html +1 -1
  166. package/dist/playgrounds/publisher-dashboard.html +1 -1
  167. package/dist/playgrounds/publisher-output-control.html +1 -1
  168. package/dist/playgrounds/react-playgrounds/CoreLayout.tsx +156 -0
  169. package/dist/playgrounds/react-playgrounds/Index.tsx +1 -0
  170. package/dist/playgrounds/react-playgrounds/RundownEditor.tsx +26 -23
  171. package/dist/playgrounds/react-playgrounds/Rundowns.tsx +20 -21
  172. package/dist/playgrounds/react-playgrounds/SamsPlayground.tsx +12 -3
  173. package/dist/playgrounds/react-playgrounds/TestGround.tsx +415 -25
  174. package/dist/playgrounds/react-playgrounds/components/Layout.tsx +2 -2
  175. package/dist/playgrounds/swimlane-view.html +1 -1
  176. package/dist/playgrounds/toasts.html +1 -1
  177. package/dist/playgrounds/video-editor.html +1 -1
  178. package/dist/react/Badges.tsx +18 -0
  179. package/dist/react/ContentDivider.tsx +22 -18
  180. package/dist/react/ContentList.tsx +200 -18
  181. package/dist/react/DatePicker.tsx +31 -6
  182. package/dist/react/Dropdowns.tsx +580 -48
  183. package/dist/react/DurationInput.tsx +108 -0
  184. package/dist/react/Index.tsx +10 -0
  185. package/dist/react/Inputs.tsx +256 -8
  186. package/dist/react/Labels.tsx +51 -1
  187. package/dist/react/LeftNavigations.tsx +71 -44
  188. package/dist/react/MultiSelect.tsx +10 -2
  189. package/dist/react/SelectWithTemplate.tsx +6 -1
  190. package/dist/react/Selects.tsx +55 -0
  191. package/dist/react/TableList.tsx +77 -186
  192. package/dist/react/TimePicker.tsx +22 -12
  193. package/dist/react/Togglebox.tsx +1 -1
  194. package/dist/react/TreeSelect.tsx +270 -48
  195. package/dist/react/WithSizeObserver.tsx +44 -0
  196. package/dist/react/tree-select/TreeSelect.tsx +273 -0
  197. package/dist/react/tree-select/example-1.tsx +71 -0
  198. package/dist/react/tree-select/example-2.tsx +59 -0
  199. package/dist/sd_icons.eot +0 -0
  200. package/dist/sd_icons.svg +14 -7
  201. package/dist/sd_icons.ttf +0 -0
  202. package/dist/sd_icons.woff +0 -0
  203. package/dist/superdesk-ui.bundle.css +4330 -639
  204. package/dist/superdesk-ui.bundle.js +75169 -58238
  205. package/dist/vendor.bundle.js +25027 -25027
  206. package/examples/index.js +4 -0
  207. package/examples/pages/playgrounds/accessible-theme-test.html +1 -1
  208. package/examples/pages/playgrounds/layout-test-2.html +1 -1
  209. package/examples/pages/playgrounds/list-item-test.html +1 -1
  210. package/examples/pages/playgrounds/master-desk.html +1 -1
  211. package/examples/pages/playgrounds/media-carousel.html +1 -1
  212. package/examples/pages/playgrounds/photo-desk.html +1 -1
  213. package/examples/pages/playgrounds/planning.html +1 -1
  214. package/examples/pages/playgrounds/publish.html +1 -1
  215. package/examples/pages/playgrounds/publisher-content-analytics.html +1 -1
  216. package/examples/pages/playgrounds/publisher-content-list-automatic.html +1 -1
  217. package/examples/pages/playgrounds/publisher-content-list-manual.html +1 -1
  218. package/examples/pages/playgrounds/publisher-content-lists.html +1 -1
  219. package/examples/pages/playgrounds/publisher-dashboard.html +1 -1
  220. package/examples/pages/playgrounds/publisher-output-control.html +1 -1
  221. package/examples/pages/playgrounds/react-playgrounds/CoreLayout.tsx +156 -0
  222. package/examples/pages/playgrounds/react-playgrounds/Index.tsx +1 -0
  223. package/examples/pages/playgrounds/react-playgrounds/RundownEditor.tsx +26 -23
  224. package/examples/pages/playgrounds/react-playgrounds/Rundowns.tsx +20 -21
  225. package/examples/pages/playgrounds/react-playgrounds/SamsPlayground.tsx +12 -3
  226. package/examples/pages/playgrounds/react-playgrounds/TestGround.tsx +415 -25
  227. package/examples/pages/playgrounds/react-playgrounds/components/Layout.tsx +2 -2
  228. package/examples/pages/playgrounds/swimlane-view.html +1 -1
  229. package/examples/pages/playgrounds/toasts.html +1 -1
  230. package/examples/pages/playgrounds/video-editor.html +1 -1
  231. package/examples/pages/react/Badges.tsx +18 -0
  232. package/examples/pages/react/ContentDivider.tsx +22 -18
  233. package/examples/pages/react/ContentList.tsx +200 -18
  234. package/examples/pages/react/DatePicker.tsx +31 -6
  235. package/examples/pages/react/Dropdowns.tsx +580 -48
  236. package/examples/pages/react/DurationInput.tsx +108 -0
  237. package/examples/pages/react/Index.tsx +10 -0
  238. package/examples/pages/react/Inputs.tsx +256 -8
  239. package/examples/pages/react/Labels.tsx +51 -1
  240. package/examples/pages/react/LeftNavigations.tsx +71 -44
  241. package/examples/pages/react/MultiSelect.tsx +10 -2
  242. package/examples/pages/react/SelectWithTemplate.tsx +6 -1
  243. package/examples/pages/react/Selects.tsx +55 -0
  244. package/examples/pages/react/TableList.tsx +77 -186
  245. package/examples/pages/react/TimePicker.tsx +22 -12
  246. package/examples/pages/react/Togglebox.tsx +1 -1
  247. package/examples/pages/react/TreeSelect.tsx +270 -48
  248. package/examples/pages/react/WithSizeObserver.tsx +44 -0
  249. package/examples/pages/react/tree-select/TreeSelect.tsx +273 -0
  250. package/examples/pages/react/tree-select/example-1.tsx +71 -0
  251. package/examples/pages/react/tree-select/example-2.tsx +59 -0
  252. package/package.json +8 -8
  253. package/react/components/Alert.js +10 -8
  254. package/react/components/Autocomplete.js +16 -12
  255. package/react/components/Avatar.js +8 -6
  256. package/react/components/Badge.d.ts +1 -0
  257. package/react/components/Badge.js +9 -7
  258. package/react/components/Button.js +8 -6
  259. package/react/components/ButtonGroup.js +7 -5
  260. package/react/components/Carousel.js +4 -2
  261. package/react/components/CheckButtonGroup.js +6 -4
  262. package/react/components/CheckGroup.js +5 -3
  263. package/react/components/Checkbox.js +5 -3
  264. package/react/components/CheckboxButton.js +6 -4
  265. package/react/components/ContentDivider.d.ts +1 -0
  266. package/react/components/ContentDivider.js +10 -6
  267. package/react/components/CreateButton.js +6 -4
  268. package/react/components/DatePicker.d.ts +11 -0
  269. package/react/components/DatePicker.js +44 -35
  270. package/react/components/Divider.js +6 -4
  271. package/react/components/DonutChart.d.ts +1 -1
  272. package/react/components/DonutChart.js +24 -6
  273. package/react/components/DropZone.js +6 -4
  274. package/react/components/Dropdown.d.ts +6 -5
  275. package/react/components/Dropdown.js +63 -35
  276. package/react/components/DropdownFirst.js +18 -11
  277. package/react/components/DurationInput.d.ts +42 -0
  278. package/react/components/DurationInput.js +364 -0
  279. package/react/components/EmptyState.d.ts +1 -0
  280. package/react/components/EmptyState.js +8 -6
  281. package/react/components/Form/FormGroup.js +7 -5
  282. package/react/components/Form/FormItem.js +5 -3
  283. package/react/components/Form/FormLabel.d.ts +4 -1
  284. package/react/components/Form/FormLabel.js +13 -5
  285. package/react/components/Form/FormRow.js +5 -3
  286. package/react/components/Form/FormRowNew.d.ts +12 -0
  287. package/react/components/Form/FormRowNew.js +67 -0
  288. package/react/components/Form/FormText.js +4 -2
  289. package/react/components/Form/InputBase.d.ts +41 -0
  290. package/react/components/Form/InputBase.js +86 -0
  291. package/react/components/Form/InputNew.d.ts +45 -0
  292. package/react/components/Form/InputNew.js +75 -0
  293. package/react/components/Form/InputWrapper.d.ts +28 -0
  294. package/react/components/Form/InputWrapper.js +91 -0
  295. package/react/components/Form/index.d.ts +4 -0
  296. package/react/components/Form/index.js +9 -0
  297. package/react/components/FormLabel.js +5 -3
  298. package/react/components/GridItem.js +9 -7
  299. package/react/components/GridList.js +8 -6
  300. package/react/components/HeadingText.js +4 -2
  301. package/react/components/HelloWorld.js +4 -2
  302. package/react/components/Icon.d.ts +1 -1
  303. package/react/components/Icon.js +9 -7
  304. package/react/components/IconButton.js +8 -6
  305. package/react/components/IconLabel.js +7 -5
  306. package/react/components/IconPicker.js +13 -9
  307. package/react/components/Input.d.ts +6 -2
  308. package/react/components/Input.js +16 -31
  309. package/react/components/Label.d.ts +1 -0
  310. package/react/components/Label.js +28 -10
  311. package/react/components/Layouts/AuthorinInnerSideBar.js +4 -2
  312. package/react/components/Layouts/AuthoringContainer.d.ts +1 -0
  313. package/react/components/Layouts/AuthoringContainer.js +8 -6
  314. package/react/components/Layouts/AuthoringFrame.js +4 -2
  315. package/react/components/Layouts/AuthoringFrameContainer.js +4 -2
  316. package/react/components/Layouts/AuthoringFrameLeftBar.js +4 -2
  317. package/react/components/Layouts/AuthoringFrameMain.js +4 -2
  318. package/react/components/Layouts/AuthoringFrameNavBar.js +4 -2
  319. package/react/components/Layouts/AuthoringFrameOverlay.js +4 -2
  320. package/react/components/Layouts/AuthoringFrameRightBar.js +4 -2
  321. package/react/components/Layouts/AuthoringFrameSidePanel.js +5 -3
  322. package/react/components/Layouts/AuthoringFrameSidePanelOverlay.js +5 -3
  323. package/react/components/Layouts/AuthoringInnerBody.js +4 -2
  324. package/react/components/Layouts/AuthoringInnerHeader.js +7 -5
  325. package/react/components/Layouts/AuthoringMain.js +5 -3
  326. package/react/components/Layouts/AuthoringMainContainer.js +4 -2
  327. package/react/components/Layouts/AuthoringMainContent.js +4 -2
  328. package/react/components/Layouts/AuthoringMainToolBar.js +5 -3
  329. package/react/components/Layouts/BottomBarAction.d.ts +12 -0
  330. package/react/components/Layouts/BottomBarAction.js +59 -0
  331. package/react/components/Layouts/Container.js +9 -7
  332. package/react/components/Layouts/ContentSplitter.js +6 -4
  333. package/react/components/Layouts/CoreLayout.d.ts +20 -0
  334. package/react/components/Layouts/CoreLayout.js +55 -0
  335. package/react/components/Layouts/CoreLayoutContainer.d.ts +9 -0
  336. package/react/components/Layouts/CoreLayoutContainer.js +49 -0
  337. package/react/components/Layouts/CoreLayoutFooter.d.ts +8 -0
  338. package/react/components/Layouts/CoreLayoutFooter.js +49 -0
  339. package/react/components/Layouts/CoreLayoutMain.d.ts +10 -0
  340. package/react/components/Layouts/CoreLayoutMain.js +56 -0
  341. package/react/components/Layouts/CoreLayoutOverlay.d.ts +8 -0
  342. package/react/components/Layouts/CoreLayoutOverlay.js +49 -0
  343. package/react/components/Layouts/CoreLayoutSlideInMenu.d.ts +11 -0
  344. package/react/components/Layouts/CoreLayoutSlideInMenu.js +58 -0
  345. package/react/components/Layouts/CoreLayoutTopMenu.d.ts +14 -0
  346. package/react/components/Layouts/CoreLayoutTopMenu.js +54 -0
  347. package/react/components/Layouts/HamburgerButton.d.ts +14 -0
  348. package/react/components/Layouts/HamburgerButton.js +63 -0
  349. package/react/components/Layouts/HeaderPanel.js +4 -2
  350. package/react/components/Layouts/Layout.js +4 -3
  351. package/react/components/Layouts/LayoutContainer.js +4 -2
  352. package/react/components/Layouts/LeftPanel.js +5 -3
  353. package/react/components/Layouts/MainMenu.d.ts +41 -0
  354. package/react/components/Layouts/MainMenu.js +103 -0
  355. package/react/components/Layouts/MainPanel.js +5 -3
  356. package/react/components/Layouts/NotificationPanel.d.ts +45 -0
  357. package/react/components/Layouts/NotificationPanel.js +110 -0
  358. package/react/components/Layouts/OverlayPanel.js +4 -2
  359. package/react/components/Layouts/PageLayout.js +4 -2
  360. package/react/components/Layouts/Panel.js +16 -14
  361. package/react/components/Layouts/RightPanel.js +4 -2
  362. package/react/components/Layouts/index.d.ts +11 -0
  363. package/react/components/Layouts/index.js +23 -0
  364. package/react/components/LeftMenu.d.ts +5 -1
  365. package/react/components/LeftMenu.js +27 -13
  366. package/react/components/ListItemLoader.js +4 -2
  367. package/react/components/Lists/BoxedList.d.ts +6 -0
  368. package/react/components/Lists/BoxedList.js +36 -15
  369. package/react/components/Lists/ContentList.d.ts +50 -0
  370. package/react/components/Lists/ContentList.js +106 -0
  371. package/react/components/Lists/SimpleList.js +9 -7
  372. package/react/components/Lists/TableList.d.ts +62 -0
  373. package/react/components/Lists/TableList.js +208 -0
  374. package/react/components/Lists/index.js +1 -0
  375. package/react/components/Loader.js +4 -2
  376. package/react/components/Menu.d.ts +2 -1
  377. package/react/components/Menu.js +48 -12
  378. package/react/components/Modal.d.ts +2 -1
  379. package/react/components/Modal.js +30 -9
  380. package/react/components/MultiSelect.d.ts +40 -0
  381. package/react/components/MultiSelect.js +70 -0
  382. package/react/components/NavButton.d.ts +1 -0
  383. package/react/components/NavButton.js +9 -4
  384. package/react/components/Navigation/BottomNav.d.ts +24 -0
  385. package/react/components/Navigation/BottomNav.js +88 -0
  386. package/react/components/Navigation/QuickNavBar.js +13 -9
  387. package/react/components/Navigation/SideBarMenu.js +4 -2
  388. package/react/components/Navigation/SideBarTabs.js +4 -2
  389. package/react/components/Navigation/index.js +1 -0
  390. package/react/components/Popover.js +4 -2
  391. package/react/components/PropsList.js +4 -2
  392. package/react/components/RadioButtonGroup.js +9 -7
  393. package/react/components/RadioGroup.js +6 -4
  394. package/react/components/SearchBar.d.ts +3 -2
  395. package/react/components/SearchBar.js +34 -8
  396. package/react/components/Select.d.ts +5 -1
  397. package/react/components/Select.js +9 -23
  398. package/react/components/SelectGrid.d.ts +1 -1
  399. package/react/components/SelectGrid.js +44 -23
  400. package/react/components/SelectWithTemplate.d.ts +11 -1
  401. package/react/components/SelectWithTemplate.js +23 -12
  402. package/react/components/Skeleton.d.ts +1 -1
  403. package/react/components/Skeleton.js +26 -5
  404. package/react/components/SlidingToolbar.js +6 -4
  405. package/react/components/Spinner.js +6 -4
  406. package/react/components/StrechBar.js +4 -2
  407. package/react/components/SubNav.js +9 -7
  408. package/react/components/Switch.js +6 -4
  409. package/react/components/SwitchGroup.js +5 -3
  410. package/react/components/TabCustom.js +11 -7
  411. package/react/components/TabList.js +6 -4
  412. package/react/components/Tag.js +5 -4
  413. package/react/components/TagInput.js +7 -6
  414. package/react/components/TagInputTest.js +13 -9
  415. package/react/components/Text/Heading.js +10 -8
  416. package/react/components/Text/Text.js +10 -8
  417. package/react/components/Text/Time.d.ts +15 -0
  418. package/react/components/Text/Time.js +65 -0
  419. package/react/components/ThemeSelector.js +7 -5
  420. package/react/components/TimePicker.d.ts +11 -1
  421. package/react/components/TimePicker.js +14 -5
  422. package/react/components/Toast.js +1 -1
  423. package/react/components/ToastMessage.js +6 -5
  424. package/react/components/ToastText.js +1 -1
  425. package/react/components/ToastWrapper.d.ts +2 -2
  426. package/react/components/ToastWrapper.js +14 -10
  427. package/react/components/Togglebox.d.ts +1 -1
  428. package/react/components/Togglebox.js +36 -15
  429. package/react/components/Tooltip.d.ts +1 -0
  430. package/react/components/Tooltip.js +14 -10
  431. package/react/components/TreeSelect.d.ts +80 -0
  432. package/react/components/TreeSelect.js +494 -0
  433. package/react/components/WithSizeObserver.d.ts +25 -0
  434. package/react/components/WithSizeObserver.js +95 -0
  435. package/react/components/_Positioner.js +4 -2
  436. package/react/helpers.d.ts +1 -0
  437. package/react/helpers.js +7 -0
  438. package/react/index.d.ts +9 -0
  439. package/react/index.js +23 -2
  440. package/yarn-error.log +111 -0
  441. package/patches/@superdesk+primereact+5.0.2-4.patch +0 -13
  442. package/sd_icons.eot +0 -0
  443. package/sd_icons.svg +0 -189
  444. package/sd_icons.ttf +0 -0
  445. package/sd_icons.woff +0 -0
@@ -3,6 +3,9 @@ import addDays from 'date-fns/addDays';
3
3
  import format from 'date-fns/format';
4
4
  import {Calendar, LocaleSettings, CalendarProps} from '@superdesk/primereact/calendar';
5
5
  import {throttle} from 'lodash';
6
+ // import classNames from 'classnames';
7
+ import nextId from "react-id-generator";
8
+ import { InputWrapper } from './Form';
6
9
 
7
10
  export type DatePickerLocaleSettings = Omit<LocaleSettings, 'today' | 'clear'>;
8
11
 
@@ -29,6 +32,17 @@ interface IDatePickerBase {
29
32
  }}
30
33
  */
31
34
  locale?: DatePickerLocaleSettings;
35
+
36
+ // label props
37
+ inlineLabel?: boolean;
38
+ required?: boolean;
39
+ fullWidth?: boolean;
40
+ invalid?: boolean;
41
+ labelHidden?: boolean;
42
+ tabindex?: number;
43
+ label?: string;
44
+ info?: string;
45
+ error?: string;
32
46
  }
33
47
 
34
48
  interface IDatePicker extends IDatePickerBase {
@@ -53,6 +67,7 @@ interface IState {
53
67
  // valid means it can be parsed
54
68
  // if a value is invalid on blur, it will be set to an empty string and `props.onChange` called with `null`
55
69
  valid: boolean;
70
+ invalid: boolean;
56
71
  }
57
72
 
58
73
  // tries to parse primereact/calendar value format to IDatePicker['value']
@@ -65,7 +80,6 @@ function parseFromPrimeReactCalendarFormat(value: CalendarProps['value']): IDate
65
80
  return null;
66
81
  } else {
67
82
  // at this point value is a free input string that can't be parsed to a Date inside primereact/calendar
68
-
69
83
  return 'failed-to-parse';
70
84
  }
71
85
  }
@@ -77,13 +91,14 @@ function parseToPrimeReactCalendarFormat(value: IDatePicker['value']): CalendarP
77
91
  export class DatePicker extends React.PureComponent<IDatePicker, IState> {
78
92
  private instance: IPrivatePrimeReactCalendarApi | undefined;
79
93
  hidePopupOnScroll: () => void;
94
+ private htmlId = nextId();
80
95
 
81
96
  constructor(props: IDatePicker) {
82
97
  super(props);
83
-
84
98
  this.state = {
85
99
  value: parseToPrimeReactCalendarFormat(this.props.value),
86
100
  valid: true,
101
+ invalid: this.props.invalid ?? false,
87
102
  };
88
103
 
89
104
  this.hidePopupOnScroll = throttle(() => {
@@ -122,7 +137,6 @@ export class DatePicker extends React.PureComponent<IDatePicker, IState> {
122
137
 
123
138
  render() {
124
139
  let locale: LocaleSettings | undefined;
125
-
126
140
  if (this.props.locale != null) {
127
141
  locale = {
128
142
  ...this.props.locale,
@@ -132,7 +146,21 @@ export class DatePicker extends React.PureComponent<IDatePicker, IState> {
132
146
  }
133
147
 
134
148
  return (
135
- <Calendar
149
+ <InputWrapper
150
+ label={this.props.label}
151
+ error={this.props.error}
152
+ required={this.props.required}
153
+ disabled={this.props.disabled}
154
+ invalid={this.state.invalid}
155
+ info={this.props.info}
156
+ inlineLabel={this.props.inlineLabel}
157
+ labelHidden={this.props.labelHidden}
158
+ fullWidth={this.props.fullWidth}
159
+ htmlId={this.htmlId}
160
+ tabindex={this.props.tabindex}>
161
+ <Calendar
162
+ inputId={this.htmlId}
163
+ ariaLabelledBy={this.htmlId + 'label'}
136
164
  ref={(ref) => {
137
165
  this.instance = ref as unknown as IPrivatePrimeReactCalendarApi;
138
166
  }}
@@ -153,24 +181,22 @@ export class DatePicker extends React.PureComponent<IDatePicker, IState> {
153
181
  showIcon={true}
154
182
  icon="icon-calendar"
155
183
  headerTemplate={() => this.props.shortcuts == null ? null : (
156
- <div style={{width: '100%', display: 'flex', justifyContent: 'space-between', marginBottom: 10}}>
157
- {
158
- this.props.shortcuts.map(({label, days}, i) => (
159
- <button
160
- key={i}
161
- className="btn btn--hollow btn--small"
162
- onClick={() => {
163
- this.props.onChange(addDays(new Date(), days));
164
-
165
- if (this.instance != null && typeof this.instance.hideOverlay === 'function') {
166
- this.instance.hideOverlay();
167
- }
168
- }}
169
- >
170
- {label}
171
- </button>
172
- ))
173
- }
184
+ <div
185
+ style={{width: '100%', display: 'flex', justifyContent: 'space-between', marginBottom: 10}}>
186
+ {this.props.shortcuts.map(({label, days}, i) => (
187
+ <button
188
+ key={i}
189
+ className="btn btn--hollow btn--small"
190
+ onClick={() => {
191
+ this.props.onChange(addDays(new Date(), days));
192
+
193
+ if (this.instance != null && typeof this.instance.hideOverlay === 'function') {
194
+ this.instance.hideOverlay();
195
+ }
196
+ }}>
197
+ {label}
198
+ </button>
199
+ ))}
174
200
  </div>
175
201
  )}
176
202
  appendTo={document.body} // making it work inside `overflow:hidden`
@@ -184,8 +210,8 @@ export class DatePicker extends React.PureComponent<IDatePicker, IState> {
184
210
  // restoring internal state to current props value
185
211
  this.setState({valid: true, value: parseToPrimeReactCalendarFormat(this.props.value)});
186
212
  }
187
- }}
188
- />
213
+ }} />
214
+ </InputWrapper>
189
215
  );
190
216
  }
191
217
  }
@@ -199,18 +225,27 @@ export class DatePickerISO extends React.PureComponent<IDatePickerISO> {
199
225
  render() {
200
226
  return (
201
227
  <DatePicker
202
- value={new Date(this.props.value)}
203
- onChange={(value) => {
204
- if (value === null) {
205
- this.props.onChange('');
206
- } else {
207
- this.props.onChange(format(value, 'yyyy-MM-dd'));
208
- }
209
- }}
210
- disabled={this.props.disabled}
211
- shortcuts={this.props.shortcuts}
212
- dateFormat={this.props.dateFormat}
213
- locale={this.props.locale}
228
+ value={new Date(this.props.value)}
229
+ onChange={(value) => {
230
+ if (value === null) {
231
+ this.props.onChange('');
232
+ } else {
233
+ this.props.onChange(format(value, 'yyyy-MM-dd'));
234
+ }
235
+ }}
236
+ disabled={this.props.disabled}
237
+ shortcuts={this.props.shortcuts}
238
+ dateFormat={this.props.dateFormat}
239
+ locale={this.props.locale}
240
+ inlineLabel={this.props.inlineLabel}
241
+ required={this.props.required}
242
+ fullWidth={this.props.fullWidth}
243
+ invalid={this.props.invalid}
244
+ labelHidden={this.props.labelHidden}
245
+ tabindex={this.props.tabindex}
246
+ label={this.props.label}
247
+ info={this.props.info}
248
+ error={this.props.error}
214
249
  />
215
250
  );
216
251
  }
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import * as React from 'react';
2
2
  import { Chart } from '@superdesk/primereact/chart';
3
3
  import { ChartData, ChartOptions } from 'chart.js';
4
4
 
@@ -4,35 +4,42 @@ import { createPopper } from '@popperjs/core';
4
4
  import { useId } from "react-id-generator";
5
5
 
6
6
  export interface IMenuItem {
7
- label: string;
7
+ label: string | React.ReactNode;
8
8
  icon?: string;
9
9
  active?: boolean;
10
10
  onSelect(): void;
11
11
  }
12
12
 
13
+ interface IMenuItemRes extends IMenuItem {
14
+ onChange?(event?: any): void;
15
+ }
16
+
13
17
  export interface ISubmenu {
14
18
  type: 'submenu';
15
- label: string;
19
+ label: string | React.ReactNode;
16
20
  icon?: string;
17
21
  items: Array<IMenuItem | ISubmenu | IMenuGroup | 'divider'>;
18
22
  }
19
23
 
20
24
  export interface IMenuGroup {
21
25
  type: 'group';
22
- label?: string;
26
+ label?: string | React.ReactNode;
23
27
  items: Array<IMenuItem | ISubmenu | IMenuGroup | 'divider'>;
24
28
  }
25
29
 
26
30
  interface IMenu {
27
- label?: string;
31
+ label?: string | React.ReactNode;
28
32
  align?: 'left' | 'right';
29
33
  items: Array<IMenuItem | ISubmenu | IMenuGroup | 'divider'>;
30
34
  header?: Array<IMenuItem | ISubmenu | IMenuGroup | 'divider'>;
31
35
  footer?: Array<IMenuItem | ISubmenu | IMenuGroup | 'divider'>;
32
36
  append?: boolean;
33
37
  children: React.ReactNode;
38
+ onChange?(event?: any): void;
34
39
  }
35
40
 
41
+ const DROPDOWN_ID_CONTAINER = "sd-dropdown-constainer";
42
+
36
43
  export const Dropdown = ({
37
44
  items,
38
45
  header,
@@ -40,15 +47,13 @@ export const Dropdown = ({
40
47
  children,
41
48
  append,
42
49
  align,
50
+ onChange,
43
51
  }: IMenu) => {
44
52
  const [open, setOpen] = React.useState(false);
45
53
  const [change, setChange] = React.useState(false);
46
54
  const [menuID] = useId();
47
- const DROPDOWN_ID = "react-placeholder";
48
55
  const ref = React.useRef(null);
49
- const refSubMenu = React.useRef(null);
50
56
  const buttonRef = React.useRef(null);
51
- const refButtonSubMenu = React.useRef(null);
52
57
  const headerElements = header?.map((el, index) => {
53
58
  return each(el, index);
54
59
  });
@@ -60,12 +65,12 @@ export const Dropdown = ({
60
65
  const footerElements = footer?.map((el, index) => {
61
66
  return each(el, index);
62
67
  });
68
+
63
69
  React.useEffect(() => {
64
- const existingElement = document.getElementById(DROPDOWN_ID);
70
+ const existingElement = document.getElementById(DROPDOWN_ID_CONTAINER);
65
71
  if (!existingElement) {
66
72
  const el = document.createElement("div");
67
- el.id = DROPDOWN_ID;
68
- // style placeholder
73
+ el.id = DROPDOWN_ID_CONTAINER;
69
74
  el.style.position = 'absolute';
70
75
  el.style.top = '0';
71
76
  el.style.left = '0';
@@ -74,7 +79,6 @@ export const Dropdown = ({
74
79
 
75
80
  document.body.appendChild(el);
76
81
  }
77
-
78
82
  }, [change]);
79
83
 
80
84
  React.useLayoutEffect(() => {
@@ -82,17 +86,12 @@ export const Dropdown = ({
82
86
  addInPlaceholder();
83
87
  }
84
88
  setChange(true);
85
-
86
89
  }, [open]);
87
90
 
88
- // structure for append menu
89
91
  function createAppendMenu() {
90
92
  if (header && footer) {
91
93
  return (
92
- <div className='dropdown__menu dropdown__menu--has-head-foot'
93
- id={menuID}
94
- role='menu'
95
- ref={ref}>
94
+ <div className='dropdown__menu dropdown__menu--has-head-foot' id={menuID} role='menu' ref={ref}>
96
95
  <ul className='dropdown__menu-header'>
97
96
  {headerElements}
98
97
  </ul>
@@ -106,10 +105,7 @@ export const Dropdown = ({
106
105
  );
107
106
  } else if (header) {
108
107
  return (
109
- <div className='dropdown__menu dropdown__menu--has-head-foot'
110
- id={menuID}
111
- role='menu'
112
- ref={ref}>
108
+ <div className='dropdown__menu dropdown__menu--has-head-foot' id={menuID} role='menu' ref={ref}>
113
109
  <ul className='dropdown__menu-header'>
114
110
  {headerElements}
115
111
  </ul>
@@ -120,10 +116,7 @@ export const Dropdown = ({
120
116
  );
121
117
  } else if (footer) {
122
118
  return (
123
- <div className='dropdown__menu dropdown__menu--has-head-foot'
124
- id={menuID}
125
- role='menu'
126
- ref={ref}>
119
+ <div className='dropdown__menu dropdown__menu--has-head-foot' id={menuID} role='menu' ref={ref}>
127
120
  <ul className='dropdown__menu-body'>
128
121
  {dropdownElements}
129
122
  </ul>
@@ -134,17 +127,13 @@ export const Dropdown = ({
134
127
  );
135
128
  } else {
136
129
  return (
137
- <ul className='dropdown__menu '
138
- id={menuID}
139
- role='menu'
140
- ref={ref}>
130
+ <ul className='dropdown__menu ' id={menuID} role='menu' ref={ref}>
141
131
  {dropdownElements}
142
132
  </ul>
143
133
  );
144
134
  }
145
135
  }
146
136
 
147
- // toggle menu
148
137
  function toggleDisplay() {
149
138
  if (!open) {
150
139
  let menuRef: any;
@@ -193,14 +182,13 @@ export const Dropdown = ({
193
182
  }
194
183
 
195
184
  function addInPlaceholder() {
196
- const placeholder = document.getElementById(DROPDOWN_ID);
185
+ const placeholder = document.getElementById(DROPDOWN_ID_CONTAINER);
197
186
  let menu = createAppendMenu();
198
187
  if (open) {
199
188
  return ReactDOM.render(menu, placeholder);
200
189
  } else {
201
- const menuDOM = document.getElementById(menuID);
202
- if (menuDOM) {
203
- menuDOM.style.display = 'none';
190
+ if (placeholder) {
191
+ ReactDOM.unmountComponentAtNode(placeholder);
204
192
  }
205
193
  }
206
194
  }
@@ -212,33 +200,13 @@ export const Dropdown = ({
212
200
  submenuItems.push(each(el, key));
213
201
  });
214
202
  return (
215
- <li key={index}>
216
- <div className='dropdown' >
217
- <button
218
- ref={refButtonSubMenu}
219
- className='dropdown__toggle dropdown-toggle'
220
- aria-haspopup="menu"
221
- tabIndex={0}
222
- onMouseOver={() => {
223
- let subMenuRef = refSubMenu.current;
224
- let subToggleRef = refButtonSubMenu.current;
225
- if (subMenuRef && subToggleRef) {
226
- createPopper(subToggleRef, subMenuRef, {
227
- placement: 'right-start',
228
- });
229
- }
230
- }}
231
- onClick={item['onSelect']}>
232
- {item['icon'] ? <i className={'icon-' + item['icon']}></i> : null}
233
- {item['label']}
234
- </button>
235
- <ul ref={refSubMenu}
236
- role='menu'
237
- className='dropdown__menu'>
238
- {submenuItems}
239
- </ul>
240
- </div>
241
- </li>
203
+ <DropdownItemWithSubmenu
204
+ key={index}
205
+ index={index}
206
+ item={item}
207
+ menuID={menuID}
208
+ subMenuItems={submenuItems}
209
+ onChange={onChange} />
242
210
  );
243
211
  } else if (item['type'] === 'group') {
244
212
  let groupItems: any = [];
@@ -258,16 +226,18 @@ export const Dropdown = ({
258
226
  } else {
259
227
  return (
260
228
  <DropdownItem
261
- key={index}
262
- label={item['label']}
263
- icon={item['icon']}
264
- active={item['active']}
265
- onSelect={item['onSelect']} />);
229
+ key={index}
230
+ label={item['label']}
231
+ icon={item['icon']}
232
+ active={item['active']}
233
+ onSelect={item['onSelect']}
234
+ onChange={onChange} />
235
+ );
266
236
  }
267
237
  }
268
238
 
269
239
  return (
270
- <div className={'dropdown ' + (open ? 'open' : '')} >
240
+ <div className={'dropdown ' + (open ? 'open' : '')}>
271
241
  {typeof children === 'object' ?
272
242
  (React.isValidElement(children) ?
273
243
  <div ref={buttonRef} style={{ display: 'content' }}>
@@ -281,11 +251,11 @@ export const Dropdown = ({
281
251
  </div> : null)
282
252
  :
283
253
  <button ref={buttonRef}
284
- className=' dropdown__toggle dropdown-toggle'
285
- aria-haspopup="menu"
286
- tabIndex={0}
287
- aria-expanded={open}
288
- onClick={toggleDisplay}>
254
+ className=' dropdown__toggle dropdown-toggle'
255
+ aria-haspopup="menu"
256
+ tabIndex={0}
257
+ aria-expanded={open}
258
+ onClick={toggleDisplay}>
289
259
  {children}
290
260
  <span className="dropdown__caret"></span>
291
261
  </button>}
@@ -294,7 +264,7 @@ export const Dropdown = ({
294
264
  null : (function() {
295
265
  if (header && footer) {
296
266
  return (
297
- <div className='dropdown__menu dropdown__menu--has-head-foot' role='menu' ref={ref} >
267
+ <div className='dropdown__menu dropdown__menu--has-head-foot' role='menu' ref={ref}>
298
268
  <ul className='dropdown__menu-header'>
299
269
  {headerElements}
300
270
  </ul>
@@ -308,7 +278,7 @@ export const Dropdown = ({
308
278
  );
309
279
  } else if (header) {
310
280
  return (
311
- <div className='dropdown__menu dropdown__menu--has-head-foot' role='menu' ref={ref} >
281
+ <div className='dropdown__menu dropdown__menu--has-head-foot' role='menu' ref={ref}>
312
282
  <ul className='dropdown__menu-header'>
313
283
  {headerElements}
314
284
  </ul>
@@ -319,7 +289,7 @@ export const Dropdown = ({
319
289
  );
320
290
  } else if (footer) {
321
291
  return (
322
- <div className='dropdown__menu dropdown__menu--has-head-foot' role='menu' ref={ref} >
292
+ <div className='dropdown__menu dropdown__menu--has-head-foot' role='menu' ref={ref}>
323
293
  <ul className='dropdown__menu-body'>
324
294
  {dropdownElements}
325
295
  </ul>
@@ -330,7 +300,7 @@ export const Dropdown = ({
330
300
  );
331
301
  } else {
332
302
  return (
333
- <ul className='dropdown__menu' role='menu' ref={ref} >
303
+ <ul className='dropdown__menu' role='menu' ref={ref}>
334
304
  {dropdownElements}
335
305
  </ul>
336
306
  );
@@ -341,18 +311,93 @@ export const Dropdown = ({
341
311
  };
342
312
 
343
313
  const DropdownItem = ({
344
- label,
345
- icon,
346
- active,
347
- onSelect,
348
- }: IMenuItem) => {
314
+ label,
315
+ icon,
316
+ active,
317
+ onSelect,
318
+ onChange,
319
+ }: IMenuItemRes) => {
349
320
  return (
350
321
  <li role='none' className={active ? 'dropdown__menu-item--active' : ''}>
351
- <button tabIndex={0} role='menuitem' onClick={onSelect}>
322
+ <button tabIndex={0}
323
+ role='menuitem'
324
+ onClick={() => {
325
+ setTimeout(() => {
326
+ onSelect();
327
+ });
328
+ if (onChange) {
329
+ onChange();
330
+ }
331
+ }}>
352
332
  <i className={icon ? ('icon-' + icon) : ''}></i>
353
333
  {label}
354
334
  </button>
355
335
  </li>
356
336
  );
337
+ };
338
+
339
+ const DropdownItemWithSubmenu = ({
340
+ index,
341
+ item,
342
+ menuID,
343
+ subMenuItems,
344
+ onChange,
345
+ }: IMenuItem | any) => {
346
+ const [open, setOpen] = React.useState<undefined | boolean>(undefined);
347
+
348
+ const refButtonSubMenu = React.useRef(null);
349
+ const refSubMenu = React.useRef(null);
350
+ const placeholder = document.getElementById(menuID);
357
351
 
352
+ React.useEffect(() => {
353
+ let subMenuRef: any = refSubMenu.current;
354
+ let subToggleRef = refButtonSubMenu.current;
355
+
356
+ if (open === true) {
357
+ placeholder?.appendChild(subMenuRef);
358
+ subMenuRef.style.display = 'block';
359
+ } else if (open === false) {
360
+ placeholder?.removeChild(subMenuRef);
361
+ subMenuRef.style.display = 'none';
362
+ }
363
+
364
+ if (subMenuRef && subToggleRef) {
365
+ createPopper(subToggleRef, subMenuRef, {
366
+ placement: 'right-start',
367
+ });
368
+ }
369
+ }, [open]);
370
+
371
+ return (
372
+ <li key={index} ref={refButtonSubMenu}>
373
+ <div className='dropdown'
374
+ onMouseLeave={() => setOpen(false)}>
375
+ <button
376
+ className='dropdown__toggle dropdown-toggle'
377
+ aria-haspopup="menu"
378
+ tabIndex={0}
379
+ onClick={() => {
380
+ if (item.onSelect) {
381
+ setTimeout(() => {
382
+ item.onSelect();
383
+ });
384
+ }
385
+ if (onChange) {
386
+ onChange();
387
+ }
388
+ }}
389
+ onMouseOver={() => setOpen(true) }>
390
+ {item['icon'] ? <i className={'icon-' + item['icon']}></i> : null}
391
+ {item['label']}
392
+ </button>
393
+ <ul
394
+ role='menu'
395
+ ref={refSubMenu}
396
+ style={{display: 'none'}}
397
+ className='dropdown__menu'>
398
+ {subMenuItems}
399
+ </ul>
400
+ </div>
401
+ </li>
402
+ );
358
403
  };