@centreon/ui 23.10.121 → 24.4.1-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 (365) hide show
  1. package/package.json +59 -41
  2. package/public/mockServiceWorker.js +2 -2
  3. package/src/ActionsList/ActionsList.styles.ts +40 -71
  4. package/src/Button/Icon/index.stories.tsx +1 -1
  5. package/src/Button/Icon/index.tsx +2 -2
  6. package/src/Button/Save/StartIcon.tsx +3 -3
  7. package/src/Button/Save/index.tsx +9 -5
  8. package/src/Checkbox/Checkbox.tsx +2 -2
  9. package/src/Checkbox/CheckboxGroup/index.tsx +2 -2
  10. package/src/Checkbox/fonts/roboto-bold-webfont.ttf +0 -0
  11. package/src/Checkbox/fonts/roboto-bold-webfont.woff +0 -0
  12. package/src/Checkbox/fonts/roboto-bold-webfont.woff2 +0 -0
  13. package/src/Checkbox/fonts/roboto-light-webfont.ttf +0 -0
  14. package/src/Checkbox/fonts/roboto-light-webfont.woff +0 -0
  15. package/src/Checkbox/fonts/roboto-light-webfont.woff2 +0 -0
  16. package/src/Checkbox/fonts/roboto-medium-webfont.ttf +0 -0
  17. package/src/Checkbox/fonts/roboto-medium-webfont.woff +0 -0
  18. package/src/Checkbox/fonts/roboto-medium-webfont.woff2 +0 -0
  19. package/src/Checkbox/fonts/roboto-regular-webfont.ttf +0 -0
  20. package/src/Checkbox/fonts/roboto-regular-webfont.woff +0 -0
  21. package/src/Checkbox/fonts/roboto-regular-webfont.woff2 +0 -0
  22. package/src/Dashboard/Dashboard.styles.ts +6 -5
  23. package/src/Dashboard/Item.tsx +1 -1
  24. package/src/Dashboard/Layout.tsx +2 -2
  25. package/src/Dashboard/utils.ts +1 -1
  26. package/src/Dialog/Confirm/index.tsx +10 -2
  27. package/src/Dialog/UnsavedChanges/index.tsx +21 -20
  28. package/src/Dialog/UnsavedChanges/translatedLabels.ts +4 -6
  29. package/src/Dialog/index.tsx +9 -2
  30. package/src/FallbackPage/FallbackPage.tsx +3 -3
  31. package/src/FileDropZone/index.tsx +3 -1
  32. package/src/Form/Form.cypress.spec.tsx +133 -0
  33. package/src/Form/Inputs/Grid.tsx +8 -4
  34. package/src/Form/Inputs/List/Content.tsx +62 -0
  35. package/src/Form/Inputs/List/List.styles.ts +29 -0
  36. package/src/Form/Inputs/List/List.tsx +58 -0
  37. package/src/Form/Inputs/List/useList.ts +81 -0
  38. package/src/Form/Inputs/Text.tsx +3 -1
  39. package/src/Form/Inputs/index.tsx +3 -1
  40. package/src/Form/Inputs/models.ts +23 -13
  41. package/src/Graph/BarStack/BarStack.cypress.spec.tsx +139 -0
  42. package/src/Graph/BarStack/BarStack.stories.tsx +123 -0
  43. package/src/Graph/BarStack/BarStack.styles.ts +37 -0
  44. package/src/Graph/BarStack/BarStack.tsx +14 -0
  45. package/src/Graph/BarStack/ResponsiveBarStack.tsx +211 -0
  46. package/src/Graph/BarStack/index.ts +1 -0
  47. package/src/Graph/BarStack/models.ts +20 -0
  48. package/src/Graph/BarStack/useResponsiveBarStack.ts +131 -0
  49. package/src/Graph/Gauge/Gauge.cypress.spec.tsx +102 -0
  50. package/src/Graph/Gauge/Gauge.tsx +1 -1
  51. package/src/Graph/HeatMap/HeatMap.cypress.spec.tsx +145 -0
  52. package/src/Graph/HeatMap/HeatMap.stories.tsx +0 -25
  53. package/src/Graph/HeatMap/HeatMap.styles.tsx +1 -0
  54. package/src/Graph/HeatMap/ResponsiveHeatMap.tsx +20 -10
  55. package/src/Graph/HeatMap/model.ts +1 -0
  56. package/src/Graph/Legend/Legend.tsx +21 -0
  57. package/src/Graph/Legend/index.ts +1 -0
  58. package/src/Graph/Legend/models.ts +11 -0
  59. package/src/Graph/LineChart/BasicComponents/Lines/RegularLines/index.tsx +2 -1
  60. package/src/Graph/LineChart/BasicComponents/Lines/StackedLines/index.tsx +3 -4
  61. package/src/Graph/LineChart/BasicComponents/Lines/Threshold/Circle.tsx +2 -2
  62. package/src/Graph/LineChart/BasicComponents/ThresholdLine.tsx +3 -1
  63. package/src/Graph/LineChart/BasicComponents/Thresholds.tsx +2 -2
  64. package/src/Graph/LineChart/BasicComponents/useFilterLines.ts +3 -5
  65. package/src/Graph/LineChart/Header/index.tsx +3 -31
  66. package/src/Graph/LineChart/Icons/Downtime.tsx +3 -3
  67. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/GuidingLines.tsx +2 -2
  68. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/useTickGraph.ts +9 -11
  69. package/src/Graph/LineChart/InteractiveComponents/Annotations/EventAnnotations.tsx +1 -1
  70. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/GraphValueTooltip.tsx +68 -0
  71. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltip.ts +27 -0
  72. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltipStyles.ts +31 -0
  73. package/src/Graph/LineChart/InteractiveComponents/ZoomPreview/index.tsx +2 -1
  74. package/src/Graph/LineChart/InteractiveComponents/index.tsx +132 -17
  75. package/src/Graph/LineChart/InteractiveComponents/interactionWithGraphAtoms.ts +7 -27
  76. package/src/Graph/LineChart/Legend/Legend.styles.ts +75 -33
  77. package/src/Graph/LineChart/Legend/LegendContent.tsx +12 -6
  78. package/src/Graph/LineChart/Legend/LegendHeader.tsx +66 -27
  79. package/src/Graph/LineChart/Legend/index.tsx +35 -45
  80. package/src/Graph/LineChart/Legend/models.ts +5 -0
  81. package/src/Graph/LineChart/Legend/useLegend.ts +12 -13
  82. package/src/Graph/LineChart/LineChart.cypress.spec.tsx +144 -0
  83. package/src/Graph/LineChart/LineChart.styles.ts +8 -0
  84. package/src/Graph/LineChart/LineChart.tsx +118 -117
  85. package/src/Graph/LineChart/LoadingSkeleton.tsx +2 -2
  86. package/src/Graph/LineChart/helpers/doc.ts +16 -13
  87. package/src/Graph/LineChart/helpers/index.ts +1 -1
  88. package/src/Graph/LineChart/index.stories.tsx +17 -2
  89. package/src/Graph/LineChart/index.tsx +6 -7
  90. package/src/Graph/LineChart/mockedData/curvesWithSameColor.json +252 -0
  91. package/src/Graph/LineChart/mockedData/lastDayWithIncompleteValues.json +1320 -0
  92. package/src/Graph/LineChart/mockedData/lastDayWithNullValues.json +1314 -0
  93. package/src/Graph/LineChart/models.ts +12 -1
  94. package/src/Graph/LineChart/useLineChartData.ts +57 -18
  95. package/src/Graph/PieChart/PieChart.cypress.spec.tsx +154 -0
  96. package/src/Graph/PieChart/PieChart.stories.tsx +194 -0
  97. package/src/Graph/PieChart/PieChart.styles.ts +39 -0
  98. package/src/Graph/PieChart/PieChart.tsx +14 -0
  99. package/src/Graph/PieChart/ResponsivePie.tsx +245 -0
  100. package/src/Graph/PieChart/index.ts +1 -0
  101. package/src/Graph/PieChart/models.ts +20 -0
  102. package/src/Graph/PieChart/useResponsivePie.ts +81 -0
  103. package/src/Graph/SingleBar/SingleBar.cypress.spec.tsx +121 -0
  104. package/src/Graph/SingleBar/Thresholds.tsx +2 -2
  105. package/src/Graph/Text/Text.cypress.spec.tsx +101 -0
  106. package/src/Graph/Text/Text.stories.tsx +60 -4
  107. package/src/Graph/Text/Text.styles.ts +12 -1
  108. package/src/Graph/Text/Text.tsx +17 -12
  109. package/src/Graph/Tree/DescendantNodes.tsx +88 -0
  110. package/src/Graph/Tree/Links.tsx +64 -0
  111. package/src/Graph/Tree/StandaloneTree.tsx +32 -0
  112. package/src/Graph/Tree/Tree.cypress.spec.tsx +171 -0
  113. package/src/Graph/Tree/Tree.stories.tsx +144 -0
  114. package/src/Graph/Tree/Tree.tsx +116 -0
  115. package/src/Graph/Tree/constants.ts +2 -0
  116. package/src/Graph/Tree/index.ts +4 -0
  117. package/src/Graph/Tree/models.ts +52 -0
  118. package/src/Graph/Tree/stories/contents.tsx +164 -0
  119. package/src/Graph/Tree/stories/datas.ts +305 -0
  120. package/src/Graph/Tree/utils.ts +49 -0
  121. package/src/Graph/common/testUtils.ts +71 -0
  122. package/src/Graph/common/timeSeries/index.ts +53 -15
  123. package/src/Graph/common/utils.ts +68 -1
  124. package/src/Graph/index.ts +4 -0
  125. package/src/Icon/BaseIcon.tsx +32 -0
  126. package/src/Icon/DowntimeIcon.tsx +14 -0
  127. package/src/InputField/Number/Number.cypress.spec.tsx +85 -0
  128. package/src/InputField/Number/Number.stories.tsx +66 -0
  129. package/src/InputField/Number/Number.tsx +74 -0
  130. package/src/InputField/Search/index.tsx +2 -2
  131. package/src/InputField/Select/Autocomplete/Connected/Multi/index.test.tsx +1 -0
  132. package/src/InputField/Select/Autocomplete/Connected/index.test.tsx +1 -0
  133. package/src/InputField/Select/Autocomplete/Connected/index.tsx +25 -10
  134. package/src/InputField/Select/Autocomplete/Draggable/SortableList.tsx +1 -1
  135. package/src/InputField/Select/Autocomplete/Draggable/SortableListContent.tsx +1 -1
  136. package/src/InputField/Select/Autocomplete/Draggable/index.tsx +1 -1
  137. package/src/InputField/Select/Autocomplete/Multi/index.tsx +4 -2
  138. package/src/InputField/Select/Autocomplete/index.tsx +129 -116
  139. package/src/InputField/Select/IconPopover/index.tsx +3 -3
  140. package/src/InputField/Select/index.tsx +15 -2
  141. package/src/InputField/Text/index.tsx +46 -41
  142. package/src/Listing/ActionBar/index.tsx +11 -10
  143. package/src/Listing/Cell/DataCell.styles.ts +3 -0
  144. package/src/Listing/Cell/DataCell.tsx +23 -5
  145. package/src/Listing/Header/ListingHeader.tsx +1 -1
  146. package/src/Listing/Listing.cypress.spec.tsx +218 -33
  147. package/src/Listing/Listing.styles.ts +4 -7
  148. package/src/Listing/Row/Row.tsx +7 -3
  149. package/src/Listing/index.stories.tsx +39 -5
  150. package/src/Listing/index.test.tsx +1 -1
  151. package/src/Listing/index.tsx +207 -149
  152. package/src/Listing/models.ts +1 -0
  153. package/src/Listing/useStyleTable.ts +1 -0
  154. package/src/Module/LicensedModule/LicenseCheck/index.tsx +24 -9
  155. package/src/Module/LicensedModule/index.tsx +7 -1
  156. package/src/Module/Module.cypress.spec.tsx +129 -0
  157. package/src/Module/index.tsx +2 -4
  158. package/src/Panel/index.tsx +1 -1
  159. package/src/PopoverMenu/index.tsx +9 -8
  160. package/src/RichTextEditor/ContentEditable.tsx +195 -195
  161. package/src/RichTextEditor/RichTextEditor.cypress.spec.tsx +100 -52
  162. package/src/RichTextEditor/RichTextEditor.tsx +21 -4
  163. package/src/RichTextEditor/plugins/ToolbarPlugin/AlignPicker.tsx +21 -20
  164. package/src/RichTextEditor/plugins/ToolbarPlugin/BlockButtons.tsx +35 -77
  165. package/src/RichTextEditor/plugins/ToolbarPlugin/FormatButtons.tsx +29 -83
  166. package/src/RichTextEditor/plugins/ToolbarPlugin/LinkButton.tsx +106 -0
  167. package/src/RichTextEditor/plugins/ToolbarPlugin/ListButton.tsx +155 -0
  168. package/src/RichTextEditor/plugins/ToolbarPlugin/MacrosButton.tsx +23 -39
  169. package/src/RichTextEditor/plugins/ToolbarPlugin/ToolbarPlugin.styles.ts +24 -14
  170. package/src/RichTextEditor/plugins/ToolbarPlugin/UndoRedoButtons.tsx +6 -0
  171. package/src/RichTextEditor/plugins/ToolbarPlugin/index.tsx +5 -10
  172. package/src/RichTextEditor/translatedLabels.ts +3 -0
  173. package/src/SortableItems/index.tsx +2 -7
  174. package/src/StoryBookThemeProvider/index.tsx +35 -36
  175. package/src/ThemeProvider/index.tsx +39 -12
  176. package/src/ThemeProvider/palettes.ts +15 -12
  177. package/src/TimePeriods/CustomTimePeriod/CompactCustomTimePeriod.styles.ts +6 -7
  178. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/PickersStartEndDate.tsx +8 -3
  179. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/models.ts +0 -2
  180. package/src/TimePeriods/DateTimePickerInput.tsx +56 -19
  181. package/src/TimePeriods/ResolutionTimePeriod.cypress.spec.tsx +12 -9
  182. package/src/TimePeriods/TimePeriods.cypress.spec.tsx +9 -33
  183. package/src/TimePeriods/helpers/index.ts +1 -1
  184. package/src/TimePeriods/index.stories.tsx +12 -4
  185. package/src/TimePeriods/index.tsx +2 -2
  186. package/src/TopCounterElements/TopCounterLayout.tsx +3 -0
  187. package/src/TopCounterElements/useCloseOnLegacyPage.tsx +42 -0
  188. package/src/Typography/FluidTypography/FluidTypography.cypress.spec.tsx +27 -0
  189. package/src/Typography/FluidTypography/index.stories.tsx +2 -2
  190. package/src/Typography/FluidTypography/index.tsx +21 -28
  191. package/src/Typography/Subtitle.tsx +55 -0
  192. package/src/api/QueryProvider.tsx +1 -1
  193. package/src/api/TestQueryProvider.tsx +1 -1
  194. package/src/api/buildListingEndpoint/models.ts +2 -1
  195. package/src/api/customFetch.ts +12 -3
  196. package/src/api/index.ts +3 -3
  197. package/src/api/useFetchQuery/index.ts +49 -28
  198. package/src/api/useGraphQuery/index.ts +26 -5
  199. package/src/api/useGraphQuery/models.ts +5 -0
  200. package/src/api/useMutationQuery/index.test.ts +4 -4
  201. package/src/api/useMutationQuery/index.ts +65 -20
  202. package/src/components/Button/Icon/IconButton.tsx +6 -2
  203. package/src/components/CollapsibleItem/CollapsibleItem.cypress.spec.tsx +76 -0
  204. package/src/components/CollapsibleItem/CollapsibleItem.stories.tsx +26 -0
  205. package/src/components/CollapsibleItem/CollapsibleItem.tsx +43 -14
  206. package/src/components/CollapsibleItem/useCollapsibleItemStyles.ts +24 -1
  207. package/src/components/DataTable/DataListing.tsx +6 -0
  208. package/src/components/DataTable/DataTable.cypress.spec.tsx +174 -0
  209. package/src/components/DataTable/DataTable.stories.tsx +40 -0
  210. package/src/components/DataTable/DataTable.styles.ts +3 -0
  211. package/src/components/DataTable/DataTable.tsx +3 -3
  212. package/src/components/DataTable/Item/DataTableItem.styles.ts +7 -2
  213. package/src/components/DataTable/Item/DataTableItem.tsx +4 -60
  214. package/src/components/DataTable/index.ts +3 -1
  215. package/src/components/Form/AccessRights/AccessRights.cypress.spec.tsx +373 -0
  216. package/src/components/Form/AccessRights/AccessRights.stories.tsx +119 -0
  217. package/src/components/Form/AccessRights/AccessRights.styles.ts +10 -0
  218. package/src/components/Form/AccessRights/AccessRights.tsx +60 -0
  219. package/src/components/Form/AccessRights/Actions/Actions.styles.ts +14 -0
  220. package/src/components/Form/AccessRights/Actions/Actions.tsx +81 -0
  221. package/src/components/Form/AccessRights/Actions/useActions.ts +79 -0
  222. package/src/components/Form/AccessRights/List/Item.tsx +90 -0
  223. package/src/components/Form/AccessRights/List/List.styles.tsx +45 -0
  224. package/src/components/Form/AccessRights/List/List.tsx +52 -0
  225. package/src/components/Form/AccessRights/List/ListItemSkeleton.tsx +18 -0
  226. package/src/components/Form/AccessRights/List/ListSkeleton.tsx +22 -0
  227. package/src/components/Form/AccessRights/List/RemoveAccessRight.tsx +38 -0
  228. package/src/components/Form/AccessRights/List/StateChip.tsx +28 -0
  229. package/src/components/Form/AccessRights/List/useItem.ts +64 -0
  230. package/src/components/Form/AccessRights/Provider.tsx +15 -0
  231. package/src/components/Form/AccessRights/ShareInput/ContactSwitch.tsx +50 -0
  232. package/src/components/Form/AccessRights/ShareInput/ShareInput.styles.ts +17 -0
  233. package/src/components/Form/AccessRights/ShareInput/ShareInput.tsx +78 -0
  234. package/src/components/Form/AccessRights/ShareInput/useShareInput.tsx +113 -0
  235. package/src/components/Form/AccessRights/Stats/Stats.tsx +36 -0
  236. package/src/components/Form/AccessRights/atoms.ts +97 -0
  237. package/src/components/Form/AccessRights/common/RoleSelectField.styles.tsx +7 -0
  238. package/src/components/Form/AccessRights/common/RoleSelectField.tsx +45 -0
  239. package/src/components/Form/AccessRights/models.ts +55 -0
  240. package/src/components/Form/AccessRights/storiesData.ts +222 -0
  241. package/src/components/Form/AccessRights/useAccessRightsInitValues.ts +51 -0
  242. package/src/components/Form/Dashboard/DashboardDuplicationForm.tsx +85 -0
  243. package/src/components/Form/Dashboard/DashboardForm.tsx +15 -12
  244. package/src/components/Form/Dashboard/index.ts +1 -0
  245. package/src/components/Form/FormActions.tsx +7 -2
  246. package/src/components/Form/index.ts +2 -1
  247. package/src/components/ItemComposition/Item.tsx +1 -1
  248. package/src/components/ItemComposition/ItemComposition.cypress.spec.tsx +113 -0
  249. package/src/components/ItemComposition/ItemComposition.stories.tsx +14 -0
  250. package/src/components/ItemComposition/ItemComposition.styles.ts +36 -3
  251. package/src/components/ItemComposition/ItemComposition.tsx +41 -17
  252. package/src/components/Layout/PageLayout/PageLayout.tsx +1 -1
  253. package/src/components/Layout/PageLayout/PageLayoutActions.tsx +1 -0
  254. package/src/components/Layout/PageLayout/PageLayoutBody.tsx +1 -0
  255. package/src/components/Layout/PageLayout/PageLayoutHeader.tsx +5 -1
  256. package/src/components/Layout/PageLayout/PageQuickAccess.tsx +76 -0
  257. package/src/components/Layout/PageLayout/index.ts +3 -1
  258. package/src/components/Layout/PageLayout.cypress.spec.tsx +66 -0
  259. package/src/components/List/Item/ListItem.styles.ts +6 -0
  260. package/src/components/List/Item/ListItem.tsx +6 -4
  261. package/src/components/List/Item/Text.tsx +5 -3
  262. package/src/components/Menu/Button/MenuButton.tsx +4 -2
  263. package/src/components/Menu/MenuItem.tsx +5 -3
  264. package/src/components/Menu/MenuItems.tsx +4 -3
  265. package/src/components/Modal/ConfirmationModal/ConfirmationModal.cypress.spec.tsx +168 -0
  266. package/src/components/Modal/ConfirmationModal/ConfirmationModal.stories.tsx +62 -0
  267. package/src/components/Modal/ConfirmationModal/ConfirmationModal.tsx +87 -0
  268. package/src/components/Modal/Modal.styles.ts +10 -2
  269. package/src/components/Modal/ModalActions.tsx +4 -2
  270. package/src/components/Modal/index.ts +2 -0
  271. package/src/components/Tooltip/ConfirmationTooltip/ConfirmationTooltip.stories.tsx +3 -3
  272. package/src/components/Tooltip/ConfirmationTooltip/ConfirmationTooltip.tsx +1 -1
  273. package/src/components/Tooltip/ConfirmationTooltip/models.ts +1 -1
  274. package/src/components/Zoom/Minimap.tsx +127 -0
  275. package/src/components/Zoom/Zoom.cypress.spec.tsx +246 -0
  276. package/src/components/Zoom/Zoom.stories.tsx +115 -0
  277. package/src/components/Zoom/Zoom.styles.tsx +68 -0
  278. package/src/components/Zoom/Zoom.tsx +61 -0
  279. package/src/components/Zoom/ZoomContent.tsx +167 -0
  280. package/src/components/Zoom/constants.ts +2 -0
  281. package/src/components/Zoom/localPoint.ts +51 -0
  282. package/src/components/Zoom/models.ts +25 -0
  283. package/src/components/Zoom/useMinimap.ts +156 -0
  284. package/src/components/Zoom/useZoom.ts +70 -0
  285. package/src/components/Zoom/utils.ts +55 -0
  286. package/src/components/index.ts +1 -0
  287. package/src/fonts/roboto-bold-webfont.ttf +0 -0
  288. package/src/fonts/roboto-bold-webfont.woff +0 -0
  289. package/src/fonts/roboto-bold-webfont.woff2 +0 -0
  290. package/src/fonts/roboto-light-webfont.ttf +0 -0
  291. package/src/fonts/roboto-light-webfont.woff +0 -0
  292. package/src/fonts/roboto-light-webfont.woff2 +0 -0
  293. package/src/fonts/roboto-medium-webfont.ttf +0 -0
  294. package/src/fonts/roboto-medium-webfont.woff +0 -0
  295. package/src/fonts/roboto-medium-webfont.woff2 +0 -0
  296. package/src/fonts/roboto-regular-webfont.ttf +0 -0
  297. package/src/fonts/roboto-regular-webfont.woff +0 -0
  298. package/src/fonts/roboto-regular-webfont.woff2 +0 -0
  299. package/src/index.ts +6 -0
  300. package/src/queryParameters/url/index.ts +5 -1
  301. package/src/utils/index.ts +3 -1
  302. package/src/utils/useFullscreen/Fullscreen.cypress.spec.tsx +130 -0
  303. package/src/utils/useFullscreen/atoms.ts +3 -0
  304. package/src/utils/useFullscreen/index.ts +2 -0
  305. package/src/utils/useFullscreen/translatedLabels.ts +1 -0
  306. package/src/utils/useFullscreen/useFullscreen.ts +73 -0
  307. package/src/utils/useFullscreen/useFullscreenListener.ts +62 -0
  308. package/src/utils/useInfiniteScrollListing.ts +31 -8
  309. package/src/utils/{useLicenseExpirationWarning.cypress.spec.tsx → useLicenseExpirationWarning.test.tsx} +48 -37
  310. package/src/utils/useLicenseExpirationWarning.ts +18 -18
  311. package/src/utils/useLocaleDateTimeFormat/index.ts +3 -0
  312. package/src/utils/usePluralizedTranslation.ts +21 -0
  313. package/src/@assets/icons/downtime.icon.svg +0 -1
  314. package/src/Graph/LineChart/BasicComponents/LoadingProgress.tsx +0 -46
  315. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/TooltipAnchorPoint.tsx +0 -96
  316. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/useTooltipAnchorPoint.ts +0 -107
  317. package/src/Graph/LineChart/Legend/InteractiveValue.tsx +0 -22
  318. package/src/Graph/LineChart/Legend/Marker.tsx +0 -43
  319. package/src/Graph/LineChart/Legend/useInteractiveValues.ts +0 -99
  320. package/src/Typography/FluidTypography/useFluidResizeObserver.ts +0 -56
  321. package/src/components/Form/AccessRights/AccessRights.resource.ts +0 -45
  322. package/src/components/Form/AccessRights/AccessRightsForm.stories.tsx +0 -59
  323. package/src/components/Form/AccessRights/AccessRightsForm.styles.ts +0 -21
  324. package/src/components/Form/AccessRights/AccessRightsForm.tsx +0 -67
  325. package/src/components/Form/AccessRights/AccessRightsFormActions.tsx +0 -80
  326. package/src/components/Form/AccessRights/Input/AddAction.tsx +0 -31
  327. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.stories.tsx +0 -54
  328. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.tsx +0 -72
  329. package/src/components/Form/AccessRights/Input/ContactAccessRightsInput.styles.ts +0 -22
  330. package/src/components/Form/AccessRights/Input/ContactInputField.tsx +0 -105
  331. package/src/components/Form/AccessRights/Input/RoleInputField.tsx +0 -29
  332. package/src/components/Form/AccessRights/List/ContactAccessRightsList.stories.tsx +0 -97
  333. package/src/components/Form/AccessRights/List/ContactAccessRightsList.styles.ts +0 -71
  334. package/src/components/Form/AccessRights/List/ContactAccessRightsList.tsx +0 -51
  335. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.stories.tsx +0 -116
  336. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.tsx +0 -118
  337. package/src/components/Form/AccessRights/List/ContactAccessRightsListItemSkeleton.tsx +0 -26
  338. package/src/components/Form/AccessRights/List/ContactAccessRightsListSkeleton.tsx +0 -28
  339. package/src/components/Form/AccessRights/Stats/AccessRightsStats.styles.ts +0 -18
  340. package/src/components/Form/AccessRights/Stats/AccessRightsStats.tsx +0 -41
  341. package/src/components/Form/AccessRights/__fixtures__/contactAccessRight.mock.ts +0 -52
  342. package/src/components/Form/AccessRights/common/GroupLabel.styles.ts +0 -18
  343. package/src/components/Form/AccessRights/common/GroupLabel.tsx +0 -15
  344. package/src/components/Form/AccessRights/common/Input.styles.ts +0 -48
  345. package/src/components/Form/AccessRights/common/RoleInputSelect.styles.ts +0 -11
  346. package/src/components/Form/AccessRights/common/RoleInputSelect.tsx +0 -57
  347. package/src/components/Form/AccessRights/index.ts +0 -3
  348. package/src/components/Form/AccessRights/useAccessRightsForm.test.tsx +0 -531
  349. package/src/components/Form/AccessRights/useAccessRightsForm.tsx +0 -282
  350. package/src/components/Form/AccessRights/useAccessRightsForm.utils.ts +0 -41
  351. package/src/screens/dashboard/DashboardsDetail.stories.tsx +0 -108
  352. package/src/screens/dashboard/DashboardsOverview.stories.tsx +0 -281
  353. package/src/utils/useDateTimePickerAdapter.ts +0 -309
  354. /package/{public → src/Button}/fonts/roboto-bold-webfont.ttf +0 -0
  355. /package/{public → src/Button}/fonts/roboto-bold-webfont.woff +0 -0
  356. /package/{public → src/Button}/fonts/roboto-bold-webfont.woff2 +0 -0
  357. /package/{public → src/Button}/fonts/roboto-light-webfont.ttf +0 -0
  358. /package/{public → src/Button}/fonts/roboto-light-webfont.woff +0 -0
  359. /package/{public → src/Button}/fonts/roboto-light-webfont.woff2 +0 -0
  360. /package/{public → src/Button}/fonts/roboto-medium-webfont.ttf +0 -0
  361. /package/{public → src/Button}/fonts/roboto-medium-webfont.woff +0 -0
  362. /package/{public → src/Button}/fonts/roboto-medium-webfont.woff2 +0 -0
  363. /package/{public → src/Button}/fonts/roboto-regular-webfont.ttf +0 -0
  364. /package/{public → src/Button}/fonts/roboto-regular-webfont.woff +0 -0
  365. /package/{public → src/Button}/fonts/roboto-regular-webfont.woff2 +0 -0
@@ -0,0 +1,81 @@
1
+ import { useTranslation } from 'react-i18next';
2
+
3
+ import LinkIcon from '@mui/icons-material/Link';
4
+ import { CircularProgress } from '@mui/material';
5
+
6
+ import { Button } from '../../..';
7
+ import { AccessRightInitialValues, Labels } from '../models';
8
+
9
+ import { useActions } from './useActions';
10
+ import { useActionsStyles } from './Actions.styles';
11
+
12
+ interface Props {
13
+ cancel: ({ dirty, values }) => void;
14
+ clear: () => void;
15
+ isSubmitting?: boolean;
16
+ labels: Labels['actions'];
17
+ link?: string;
18
+ submit: (values: Array<AccessRightInitialValues>) => Promise<void>;
19
+ }
20
+
21
+ const Actions = ({
22
+ labels,
23
+ cancel,
24
+ submit,
25
+ link,
26
+ isSubmitting,
27
+ clear
28
+ }: Props): JSX.Element => {
29
+ const { t } = useTranslation();
30
+ const { classes } = useActionsStyles();
31
+
32
+ const { dirty, copyLink, save, formattedValues } = useActions({
33
+ clear,
34
+ labels,
35
+ link,
36
+ submit
37
+ });
38
+
39
+ const onCancel = (): void => {
40
+ cancel({ dirty, values: formattedValues });
41
+ };
42
+
43
+ return (
44
+ <div className={classes.actions}>
45
+ {link ? (
46
+ <Button
47
+ aria-label={t(labels.copyLink)}
48
+ icon={<LinkIcon />}
49
+ iconVariant="start"
50
+ variant="ghost"
51
+ onClick={copyLink}
52
+ >
53
+ {t(labels.copyLink)}
54
+ </Button>
55
+ ) : (
56
+ <div />
57
+ )}
58
+ <div className={classes.cancelAndSave}>
59
+ <Button
60
+ aria-label={t(labels.cancel)}
61
+ variant="secondary"
62
+ onClick={onCancel}
63
+ >
64
+ {t(labels.cancel)}
65
+ </Button>
66
+ <Button
67
+ aria-label={t(labels.save)}
68
+ disabled={isSubmitting || !dirty}
69
+ icon={isSubmitting ? <CircularProgress size={24} /> : null}
70
+ iconVariant={isSubmitting ? 'start' : 'none'}
71
+ variant="primary"
72
+ onClick={save}
73
+ >
74
+ {t(labels.save)}
75
+ </Button>
76
+ </div>
77
+ </div>
78
+ );
79
+ };
80
+
81
+ export default Actions;
@@ -0,0 +1,79 @@
1
+ import { useAtomValue } from 'jotai';
2
+ import { equals, omit } from 'ramda';
3
+
4
+ import { initialValuesAtom, valuesAtom } from '../atoms';
5
+ import { AccessRight, AccessRightInitialValues, Labels } from '../models';
6
+ import { useCopyToClipboard } from '../../../..';
7
+
8
+ const formatValue = (accessRight: AccessRight): AccessRightInitialValues => {
9
+ return omit(['isAdded', 'isUpdated', 'isRemoved'], accessRight);
10
+ };
11
+
12
+ const formatValueForSubmition = (
13
+ accessRight: AccessRight
14
+ ): AccessRightInitialValues => {
15
+ return {
16
+ ...formatValue(accessRight),
17
+ id: Number((accessRight.id as string).split('_')[1])
18
+ };
19
+ };
20
+
21
+ interface Props {
22
+ clear: () => void;
23
+ labels: Labels['actions'];
24
+ link?: string;
25
+ submit: (values: Array<AccessRightInitialValues>) => Promise<void>;
26
+ }
27
+
28
+ interface UseActionsState {
29
+ copyLink: () => void;
30
+ dirty: boolean;
31
+ formattedValues: Array<AccessRightInitialValues>;
32
+ save: () => void;
33
+ }
34
+
35
+ export const useActions = ({
36
+ link,
37
+ labels,
38
+ submit,
39
+ clear
40
+ }: Props): UseActionsState => {
41
+ const values = useAtomValue(valuesAtom);
42
+ const initialValues = useAtomValue(initialValuesAtom);
43
+
44
+ const { copy } = useCopyToClipboard({
45
+ errorMessage: labels.copyError,
46
+ successMessage: labels.copySuccess
47
+ });
48
+
49
+ const formattedValues = values
50
+ .filter(({ isRemoved }) => !isRemoved)
51
+ .map(formatValue);
52
+
53
+ const dirty = !equals(initialValues, formattedValues);
54
+
55
+ const copyLink = (): void => {
56
+ if (!link) {
57
+ return;
58
+ }
59
+ copy(link);
60
+ };
61
+
62
+ const save = (): void => {
63
+ submit(
64
+ values.filter(({ isRemoved }) => !isRemoved).map(formatValueForSubmition)
65
+ )?.then((isError) => {
66
+ if (isError) {
67
+ return;
68
+ }
69
+ clear();
70
+ });
71
+ };
72
+
73
+ return {
74
+ copyLink,
75
+ dirty,
76
+ formattedValues,
77
+ save
78
+ };
79
+ };
@@ -0,0 +1,90 @@
1
+ import { useSetAtom } from 'jotai';
2
+
3
+ import { Chip } from '@mui/material';
4
+
5
+ import { AccessRight, Labels } from '../models';
6
+ import { List } from '../../../List';
7
+ import RoleSelectField from '../common/RoleSelectField';
8
+ import { SelectEntry } from '../../../..';
9
+ import { updateContactRoleDerivedAtom } from '../atoms';
10
+
11
+ import { useItem } from './useItem';
12
+ import { useListStyles } from './List.styles';
13
+ import StateChip from './StateChip';
14
+ import RemoveAccessRight from './RemoveAccessRight';
15
+
16
+ interface Props extends AccessRight {
17
+ index: number;
18
+ labels: Labels['list'];
19
+ roles: Array<SelectEntry>;
20
+ }
21
+
22
+ const Item = ({
23
+ index,
24
+ id,
25
+ isAdded,
26
+ isContactGroup,
27
+ isRemoved,
28
+ isUpdated,
29
+ role,
30
+ name,
31
+ email,
32
+ labels,
33
+ roles
34
+ }: Props): JSX.Element => {
35
+ const { classes } = useListStyles();
36
+ const { initials, groupLabel, getState } = useItem({
37
+ isAdded,
38
+ isContactGroup,
39
+ isRemoved,
40
+ isUpdated,
41
+ list: labels,
42
+ name
43
+ });
44
+ const updateContactRole = useSetAtom(updateContactRoleDerivedAtom);
45
+
46
+ const state = getState();
47
+
48
+ const changeRole = (newRole: string): void => {
49
+ updateContactRole({ id, index, newRole });
50
+ };
51
+
52
+ return (
53
+ <List.Item
54
+ action={
55
+ <>
56
+ {state && <StateChip {...state} />}
57
+ <RoleSelectField
58
+ disabled={isRemoved}
59
+ roles={roles}
60
+ testId={`role-${name}`}
61
+ value={role}
62
+ onChange={changeRole}
63
+ />
64
+ <RemoveAccessRight index={index} isRemoved={isRemoved} name={name} />
65
+ </>
66
+ }
67
+ className={classes.item}
68
+ data-isRemoved={isRemoved}
69
+ >
70
+ <List.Item.Avatar>{initials}</List.Item.Avatar>
71
+ <div className={classes.itemNameAndGroup}>
72
+ <List.Item.Text
73
+ className={classes.name}
74
+ primaryText={name}
75
+ secondaryText={email}
76
+ />
77
+ {groupLabel && (
78
+ <Chip
79
+ data-groupChip={name}
80
+ data-type="group-chip"
81
+ label={groupLabel}
82
+ size="small"
83
+ />
84
+ )}
85
+ </div>
86
+ </List.Item>
87
+ );
88
+ };
89
+
90
+ export default Item;
@@ -0,0 +1,45 @@
1
+ import { makeStyles } from 'tss-react/mui';
2
+
3
+ export const useListStyles = makeStyles()((theme) => ({
4
+ item: {
5
+ '&[data-isRemoved="true"]': {
6
+ '& .MuiAvatar-root,.MuiListItemText-root,[data-type="group-chip"]': {
7
+ filter: 'opacity(0.5)'
8
+ }
9
+ }
10
+ },
11
+ itemNameAndGroup: {
12
+ alignItems: 'center',
13
+ display: 'flex',
14
+ flexDirection: 'row',
15
+ gap: theme.spacing(3),
16
+ width: '100%'
17
+ },
18
+ list: {
19
+ borderBottom: `1px solid ${theme.palette.divider}`,
20
+ borderTop: `1px solid ${theme.palette.divider}`,
21
+ maxHeight: '35vw',
22
+ overflowY: 'auto',
23
+ width: '100%'
24
+ },
25
+ name: {
26
+ flexGrow: 0,
27
+ maxWidth: '200px',
28
+ textOverflow: 'ellipsis',
29
+ whiteSpace: 'nowrap'
30
+ },
31
+ stateChip: {
32
+ '&[data-state="added"]': {
33
+ borderColor: theme.palette.success.main,
34
+ color: theme.palette.success.main
35
+ },
36
+ '&[data-state="removed"]': {
37
+ borderColor: theme.palette.error.main,
38
+ color: theme.palette.error.main
39
+ },
40
+ '&[data-state="updated"]': {
41
+ borderColor: theme.palette.info.main,
42
+ color: theme.palette.info.main
43
+ }
44
+ }
45
+ }));
@@ -0,0 +1,52 @@
1
+ import { useAtomValue } from 'jotai';
2
+ import { useTranslation } from 'react-i18next';
3
+ import { isEmpty } from 'ramda';
4
+
5
+ import { Typography } from '@mui/material';
6
+
7
+ import { valuesAtom } from '../atoms';
8
+ import { List as UIList } from '../../../List';
9
+ import { Labels } from '../models';
10
+ import { SelectEntry, Subtitle } from '../../../..';
11
+
12
+ import { useListStyles } from './List.styles';
13
+ import Item from './Item';
14
+
15
+ interface Props {
16
+ labels: Labels['list'];
17
+ roles: Array<SelectEntry>;
18
+ }
19
+
20
+ const List = ({ labels, roles }: Props): JSX.Element => {
21
+ const { t } = useTranslation();
22
+ const { classes } = useListStyles();
23
+ const values = useAtomValue(valuesAtom);
24
+
25
+ return (
26
+ <div>
27
+ <Subtitle>{t(labels.title)}</Subtitle>
28
+ <div className={classes.list}>
29
+ {isEmpty(values) ? (
30
+ <Typography sx={{ py: 2 }} textAlign="center">
31
+ {t(labels.empty)}
32
+ </Typography>
33
+ ) : (
34
+ <UIList>
35
+ {values.map(({ id, ...rest }, index) => (
36
+ <Item
37
+ id={id}
38
+ key={id}
39
+ labels={labels}
40
+ {...rest}
41
+ index={index}
42
+ roles={roles}
43
+ />
44
+ ))}
45
+ </UIList>
46
+ )}
47
+ </div>
48
+ </div>
49
+ );
50
+ };
51
+
52
+ export default List;
@@ -0,0 +1,18 @@
1
+ import { ReactElement } from 'react';
2
+
3
+ import { List } from '../../../List';
4
+
5
+ import { useListStyles } from './List.styles';
6
+
7
+ const ListItemSkeleton = (): ReactElement => {
8
+ const { classes } = useListStyles();
9
+
10
+ return (
11
+ <List.Item className={classes.item}>
12
+ <List.Item.Avatar.Skeleton />
13
+ <List.Item.Text.Skeleton secondaryText />
14
+ </List.Item>
15
+ );
16
+ };
17
+
18
+ export default ListItemSkeleton;
@@ -0,0 +1,22 @@
1
+ import { ReactElement } from 'react';
2
+
3
+ import { List } from '../../../List';
4
+
5
+ import { useListStyles } from './List.styles';
6
+ import ListItemSkeleton from './ListItemSkeleton';
7
+
8
+ const ListSkeleton = (): ReactElement => {
9
+ const { classes } = useListStyles();
10
+
11
+ return (
12
+ <div className={classes.list}>
13
+ <List>
14
+ {[...Array(3).keys()].map((key) => (
15
+ <ListItemSkeleton key={key} />
16
+ ))}
17
+ </List>
18
+ </div>
19
+ );
20
+ };
21
+
22
+ export default ListSkeleton;
@@ -0,0 +1,38 @@
1
+ import { useSetAtom } from 'jotai';
2
+
3
+ import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';
4
+ import RotateLeftIcon from '@mui/icons-material/RotateLeft';
5
+
6
+ import { IconButton } from '../../..';
7
+ import { removeAccessRightDerivedAtom } from '../atoms';
8
+
9
+ interface Props {
10
+ index: number;
11
+ isRemoved: boolean;
12
+ name: string;
13
+ }
14
+
15
+ const RemoveAccessRight = ({ index, isRemoved, name }: Props): JSX.Element => {
16
+ const removeAccessRight = useSetAtom(removeAccessRightDerivedAtom);
17
+
18
+ const remove = (): void => removeAccessRight({ index });
19
+ const recover = (): void => removeAccessRight({ index, recover: true });
20
+
21
+ const icon = isRemoved ? (
22
+ <RotateLeftIcon fontSize="small" />
23
+ ) : (
24
+ <DeleteOutlineIcon color="error" fontSize="small" />
25
+ );
26
+
27
+ return (
28
+ <IconButton
29
+ data-removed={isRemoved}
30
+ data-testid={`remove-${name}`}
31
+ icon={icon}
32
+ size="small"
33
+ onClick={isRemoved ? recover : remove}
34
+ />
35
+ );
36
+ };
37
+
38
+ export default RemoveAccessRight;
@@ -0,0 +1,28 @@
1
+ import { Chip } from '@mui/material';
2
+
3
+ import { ItemState } from '../models';
4
+
5
+ import { useListStyles } from './List.styles';
6
+
7
+ interface Props {
8
+ label: string;
9
+ state: ItemState;
10
+ }
11
+
12
+ const StateChip = ({ label, state }: Props): JSX.Element => {
13
+ const { classes, cx } = useListStyles();
14
+
15
+ return (
16
+ <div className={cx(classes.state)}>
17
+ <Chip
18
+ className={classes.stateChip}
19
+ data-state={state}
20
+ label={label}
21
+ size="small"
22
+ variant="outlined"
23
+ />
24
+ </div>
25
+ );
26
+ };
27
+
28
+ export default StateChip;
@@ -0,0 +1,64 @@
1
+ import { useCallback, useMemo } from 'react';
2
+
3
+ import { AccessRight, ItemState, Labels } from '../models';
4
+
5
+ interface UseItemState {
6
+ getState: () => { label: string; state: ItemState } | null;
7
+ groupLabel: string | null;
8
+ initials: string;
9
+ }
10
+
11
+ export const useItem = ({
12
+ name,
13
+ isAdded,
14
+ isRemoved,
15
+ isUpdated,
16
+ list,
17
+ isContactGroup
18
+ }: Pick<
19
+ AccessRight,
20
+ 'name' | 'isAdded' | 'isRemoved' | 'isUpdated' | 'isContactGroup'
21
+ > &
22
+ Pick<Labels, 'list'>): UseItemState => {
23
+ const initials = useMemo(
24
+ () =>
25
+ name
26
+ .split(' ')
27
+ .map((n) => n.charAt(0).toUpperCase())
28
+ .slice(0, 2)
29
+ .join(''),
30
+ [name]
31
+ );
32
+
33
+ const getState = useCallback((): {
34
+ label: string;
35
+ state: ItemState;
36
+ } | null => {
37
+ if (isRemoved) {
38
+ return {
39
+ label: list.removed,
40
+ state: ItemState.removed
41
+ };
42
+ }
43
+ if (isAdded) {
44
+ return {
45
+ label: list.added,
46
+ state: ItemState.added
47
+ };
48
+ }
49
+ if (isUpdated) {
50
+ return {
51
+ label: list.updated,
52
+ state: ItemState.updated
53
+ };
54
+ }
55
+
56
+ return null;
57
+ }, [isRemoved, isUpdated, isAdded]);
58
+
59
+ return {
60
+ getState,
61
+ groupLabel: isContactGroup ? list.group : null,
62
+ initials
63
+ };
64
+ };
@@ -0,0 +1,15 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ import { Provider as JotaiProvider, createStore } from 'jotai';
4
+
5
+ interface Props {
6
+ children: ReactNode;
7
+ }
8
+
9
+ const store = createStore();
10
+
11
+ const Provider = ({ children }: Props): JSX.Element => (
12
+ <JotaiProvider store={store}>{children}</JotaiProvider>
13
+ );
14
+
15
+ export default Provider;
@@ -0,0 +1,50 @@
1
+ import { useAtom } from 'jotai';
2
+ import { useTranslation } from 'react-i18next';
3
+
4
+ import { FormControlLabel, Radio, RadioGroup } from '@mui/material';
5
+
6
+ import { ContactType, Labels } from '../models';
7
+ import { contactTypeAtom } from '../atoms';
8
+ import { Subtitle } from '../../../..';
9
+
10
+ import { useContactSwitchStyles } from './ShareInput.styles';
11
+
12
+ interface Props {
13
+ labels: Labels['add'];
14
+ }
15
+
16
+ const ContactSwitch = ({ labels }: Props): JSX.Element => {
17
+ const { classes } = useContactSwitchStyles();
18
+ const { t } = useTranslation();
19
+
20
+ const [contactType, setContactType] = useAtom(contactTypeAtom);
21
+
22
+ const change = (event: React.ChangeEvent<HTMLInputElement>): void => {
23
+ setContactType(event.target.value as ContactType);
24
+ };
25
+
26
+ return (
27
+ <>
28
+ <Subtitle>{t(labels.title)}</Subtitle>
29
+ <RadioGroup
30
+ row
31
+ className={classes.inputs}
32
+ value={contactType}
33
+ onChange={change}
34
+ >
35
+ <FormControlLabel
36
+ control={<Radio />}
37
+ label={labels.contact}
38
+ value={ContactType.Contact}
39
+ />
40
+ <FormControlLabel
41
+ control={<Radio />}
42
+ label={labels.contactGroup}
43
+ value={ContactType.ContactGroup}
44
+ />
45
+ </RadioGroup>
46
+ </>
47
+ );
48
+ };
49
+
50
+ export default ContactSwitch;
@@ -0,0 +1,17 @@
1
+ import { makeStyles } from 'tss-react/mui';
2
+
3
+ export const useShareInputStyles = makeStyles()((theme) => ({
4
+ inputs: {
5
+ display: 'grid',
6
+ gap: theme.spacing(1),
7
+ gridTemplateColumns: `1fr min-content min-content`
8
+ }
9
+ }));
10
+
11
+ export const useContactSwitchStyles = makeStyles()((theme) => ({
12
+ inputs: {
13
+ display: 'flex',
14
+ flexDirection: 'row',
15
+ gap: theme.spacing(2)
16
+ }
17
+ }));
@@ -0,0 +1,78 @@
1
+ import { useTranslation } from 'react-i18next';
2
+ import { isNil } from 'ramda';
3
+
4
+ import AddCircleIcon from '@mui/icons-material/AddCircle';
5
+
6
+ import { IconButton } from '../../..';
7
+ import { Endpoints, Labels } from '../models';
8
+ import { SelectEntry, SingleConnectedAutocompleteField } from '../../../..';
9
+ import RoleSelectField from '../common/RoleSelectField';
10
+
11
+ import ContactSwitch from './ContactSwitch';
12
+ import useShareInput from './useShareInput';
13
+ import { useShareInputStyles } from './ShareInput.styles';
14
+
15
+ interface Props {
16
+ endpoints: Endpoints;
17
+ labels: Labels['add'];
18
+ roles: Array<SelectEntry>;
19
+ }
20
+
21
+ const ShareInput = ({ labels, endpoints, roles }: Props): JSX.Element => {
22
+ const { t } = useTranslation();
23
+ const { classes } = useShareInputStyles();
24
+
25
+ const {
26
+ renderOption,
27
+ selectedContact,
28
+ getOptionDisabled,
29
+ getEndpoint,
30
+ selectContact,
31
+ isContactGroup,
32
+ selectedRole,
33
+ setSelectedRole,
34
+ add,
35
+ changeIdValue
36
+ } = useShareInput(endpoints);
37
+
38
+ return (
39
+ <div>
40
+ <ContactSwitch labels={labels} />
41
+ <div className={classes.inputs}>
42
+ <SingleConnectedAutocompleteField
43
+ clearable
44
+ fullWidth
45
+ changeIdValue={changeIdValue}
46
+ disableClearable={false}
47
+ field="name"
48
+ getEndpoint={getEndpoint}
49
+ getOptionDisabled={getOptionDisabled}
50
+ label={t(
51
+ isContactGroup
52
+ ? t(labels.autocompleteContactGroup)
53
+ : t(labels.autocompleteContact)
54
+ )}
55
+ queryKey={isContactGroup ? labels.contactGroup : labels.contact}
56
+ renderOption={renderOption}
57
+ value={selectedContact}
58
+ onChange={selectContact}
59
+ />
60
+ <RoleSelectField
61
+ disabled={isNil(selectedContact)}
62
+ roles={roles}
63
+ testId="add_role"
64
+ value={selectedRole}
65
+ onChange={setSelectedRole}
66
+ />
67
+ <IconButton
68
+ data-testid="add"
69
+ disabled={isNil(selectedContact)}
70
+ icon={<AddCircleIcon />}
71
+ onClick={add}
72
+ />
73
+ </div>
74
+ </div>
75
+ );
76
+ };
77
+
78
+ export default ShareInput;