@centreon/ui 23.10.44 → 23.10.46

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 (438) hide show
  1. package/README.md +44 -14
  2. package/package.json +86 -26
  3. package/public/README.md +39 -0
  4. package/public/mockServiceWorker.js +303 -0
  5. package/src/@assets/README.md +5 -0
  6. package/src/@assets/brand/centreon-logo-one-line-dark.svg +1 -0
  7. package/src/@assets/brand/centreon-logo-one-line-light.svg +1 -0
  8. package/src/@assets/icons/downtime.icon.svg +1 -0
  9. package/src/@types/aria-attributes.d.ts +10 -0
  10. package/src/@types/data-attributes.d.ts +3 -0
  11. package/src/@types/globals.d.ts +9 -0
  12. package/src/@types/vite-env.d.ts +2 -0
  13. package/src/ActionsList/index.tsx +12 -3
  14. package/src/Button/Icon/index.tsx +1 -1
  15. package/src/Button/Save/index.stories.tsx +10 -5
  16. package/src/Button/Save/index.tsx +1 -1
  17. package/src/Checkbox/Checkbox.tsx +107 -0
  18. package/src/Checkbox/CheckboxGroup/index.stories.tsx +41 -0
  19. package/src/Checkbox/CheckboxGroup/index.tsx +66 -0
  20. package/src/Checkbox/index.stories.tsx +39 -0
  21. package/src/Checkbox/index.tsx +2 -0
  22. package/src/Dashboard/Dashboard.styles.ts +87 -0
  23. package/src/Dashboard/DashboardLayout.stories.tsx +104 -0
  24. package/src/Dashboard/Grid.tsx +70 -0
  25. package/src/Dashboard/Item.tsx +90 -0
  26. package/src/Dashboard/Layout.tsx +74 -0
  27. package/src/Dashboard/index.tsx +9 -0
  28. package/src/Dashboard/utils.ts +28 -0
  29. package/src/Dialog/Confirm/index.tsx +17 -4
  30. package/src/Dialog/Duplicate/index.test.tsx +1 -1
  31. package/src/Dialog/index.tsx +14 -2
  32. package/src/FallbackPage/FallbackPage.tsx +2 -2
  33. package/src/FileDropZone/index.tsx +1 -1
  34. package/src/Form/CollapsibleGroup.tsx +15 -5
  35. package/src/Form/{index.stories.tsx → Form.stories.tsx} +2 -3
  36. package/src/Form/Form.styles.ts +11 -0
  37. package/src/Form/{index.tsx → Form.tsx} +38 -16
  38. package/src/Form/FormButtons.tsx +2 -4
  39. package/src/Form/Inputs/Autocomplete.tsx +1 -1
  40. package/src/Form/Inputs/Checkbox.tsx +57 -0
  41. package/src/Form/Inputs/CheckboxGroup.tsx +76 -0
  42. package/src/Form/Inputs/Grid.tsx +4 -2
  43. package/src/Form/Inputs/Radio.tsx +1 -1
  44. package/src/Form/Inputs/Switch.tsx +1 -1
  45. package/src/Form/Inputs/Text.tsx +18 -7
  46. package/src/Form/Inputs/index.tsx +30 -12
  47. package/src/Form/Inputs/models.ts +17 -2
  48. package/src/Form/index.ts +1 -0
  49. package/src/Form/storiesData.tsx +50 -3
  50. package/src/Graph/BasicComponents/Axes/UnitLabel.tsx +20 -0
  51. package/src/Graph/BasicComponents/Axes/index.tsx +88 -0
  52. package/src/Graph/BasicComponents/Axes/models.ts +26 -0
  53. package/src/Graph/BasicComponents/Axes/useAxisY.ts +100 -0
  54. package/src/Graph/BasicComponents/Grids/index.tsx +20 -0
  55. package/src/Graph/BasicComponents/Lines/RegularLines/index.tsx +91 -0
  56. package/src/Graph/BasicComponents/Lines/RegularLines/useRegularLines.ts +15 -0
  57. package/src/Graph/BasicComponents/Lines/StackedLines/index.tsx +76 -0
  58. package/src/Graph/BasicComponents/Lines/StackedLines/useStackedLines.ts +39 -0
  59. package/src/Graph/BasicComponents/Lines/Threshold/BasicThreshold.tsx +51 -0
  60. package/src/Graph/BasicComponents/Lines/Threshold/Circle.tsx +43 -0
  61. package/src/Graph/BasicComponents/Lines/Threshold/ThresholdWithPatternLines.tsx +73 -0
  62. package/src/Graph/BasicComponents/Lines/Threshold/ThresholdWithVariation.tsx +59 -0
  63. package/src/Graph/BasicComponents/Lines/Threshold/helpers/index.ts +69 -0
  64. package/src/Graph/BasicComponents/Lines/Threshold/index.tsx +138 -0
  65. package/src/Graph/BasicComponents/Lines/Threshold/models.ts +105 -0
  66. package/src/Graph/BasicComponents/Lines/Threshold/useCoordinateCircle.ts +46 -0
  67. package/src/Graph/BasicComponents/Lines/Threshold/useScaleThreshold.ts +171 -0
  68. package/src/Graph/BasicComponents/Lines/index.tsx +180 -0
  69. package/src/Graph/BasicComponents/Lines/models.ts +42 -0
  70. package/src/Graph/BasicComponents/LoadingProgress.tsx +46 -0
  71. package/src/Graph/BasicComponents/useFilterLines.ts +60 -0
  72. package/src/Graph/Graph.styles.ts +45 -0
  73. package/src/Graph/Graph.tsx +217 -0
  74. package/src/Graph/Header/index.tsx +65 -0
  75. package/src/Graph/Icons/Downtime.tsx +9 -0
  76. package/src/Graph/InteractiveComponents/AnchorPoint/AnchorPoint.styles.ts +58 -0
  77. package/src/Graph/InteractiveComponents/AnchorPoint/GuidingLines.tsx +45 -0
  78. package/src/Graph/InteractiveComponents/AnchorPoint/RegularAnchorPoint.tsx +66 -0
  79. package/src/Graph/InteractiveComponents/AnchorPoint/StackedAnchorPoint.tsx +76 -0
  80. package/src/Graph/InteractiveComponents/AnchorPoint/TooltipAnchorPoint.tsx +70 -0
  81. package/src/Graph/InteractiveComponents/AnchorPoint/index.tsx +20 -0
  82. package/src/Graph/InteractiveComponents/AnchorPoint/models.ts +62 -0
  83. package/src/Graph/InteractiveComponents/AnchorPoint/useTickGraph.ts +94 -0
  84. package/src/Graph/InteractiveComponents/AnchorPoint/useTooltipAnchorPoint.ts +107 -0
  85. package/src/Graph/InteractiveComponents/Annotations/Annotation/Area.tsx +114 -0
  86. package/src/Graph/InteractiveComponents/Annotations/Annotation/Line.tsx +103 -0
  87. package/src/Graph/InteractiveComponents/Annotations/Annotation/index.tsx +81 -0
  88. package/src/Graph/InteractiveComponents/Annotations/Area/Downtime.tsx +27 -0
  89. package/src/Graph/InteractiveComponents/Annotations/EventAnnotations.tsx +61 -0
  90. package/src/Graph/InteractiveComponents/Annotations/Line/Acknowledgement.tsx +27 -0
  91. package/src/Graph/InteractiveComponents/Annotations/Line/Comments.tsx +25 -0
  92. package/src/Graph/InteractiveComponents/Annotations/annotationsAtoms.ts +183 -0
  93. package/src/Graph/InteractiveComponents/Annotations/index.tsx +49 -0
  94. package/src/Graph/InteractiveComponents/Annotations/models.ts +25 -0
  95. package/src/Graph/InteractiveComponents/Annotations/useAnnotation.ts +56 -0
  96. package/src/Graph/InteractiveComponents/Bar.tsx +21 -0
  97. package/src/Graph/InteractiveComponents/TimeShiftZones/TimeShiftIcon.tsx +62 -0
  98. package/src/Graph/InteractiveComponents/TimeShiftZones/TimeShiftZone.tsx +74 -0
  99. package/src/Graph/InteractiveComponents/TimeShiftZones/index.tsx +85 -0
  100. package/src/Graph/InteractiveComponents/TimeShiftZones/models.ts +12 -0
  101. package/src/Graph/InteractiveComponents/TimeShiftZones/useTimeShiftZones.ts +72 -0
  102. package/src/Graph/InteractiveComponents/Tooltip/index.tsx +59 -0
  103. package/src/Graph/InteractiveComponents/Tooltip/models.ts +9 -0
  104. package/src/Graph/InteractiveComponents/Tooltip/useGraphTooltip.ts +67 -0
  105. package/src/Graph/InteractiveComponents/ZoomPreview/index.tsx +38 -0
  106. package/src/Graph/InteractiveComponents/ZoomPreview/models.ts +9 -0
  107. package/src/Graph/InteractiveComponents/ZoomPreview/useZoomPreview.ts +107 -0
  108. package/src/Graph/InteractiveComponents/ZoomPreview/zoomPreviewAtoms.ts +3 -0
  109. package/src/Graph/InteractiveComponents/index.tsx +168 -0
  110. package/src/Graph/InteractiveComponents/interactionWithGraphAtoms.ts +51 -0
  111. package/src/Graph/Legend/InteractiveValue.tsx +22 -0
  112. package/src/Graph/Legend/Legend.styles.ts +71 -0
  113. package/src/Graph/Legend/LegendContent.tsx +27 -0
  114. package/src/Graph/Legend/LegendHeader.tsx +45 -0
  115. package/src/Graph/Legend/Marker.tsx +43 -0
  116. package/src/Graph/Legend/index.tsx +166 -0
  117. package/src/Graph/Legend/models.ts +11 -0
  118. package/src/Graph/Legend/useInteractiveValues.ts +86 -0
  119. package/src/Graph/Legend/useLegend.ts +114 -0
  120. package/src/Graph/LoadingSkeleton.tsx +44 -0
  121. package/src/Graph/common/index.ts +35 -0
  122. package/src/Graph/graphAtoms.ts +6 -0
  123. package/src/Graph/helpers/doc.ts +560 -0
  124. package/src/Graph/helpers/index.ts +58 -0
  125. package/src/Graph/index.stories.tsx +372 -0
  126. package/src/Graph/index.tsx +90 -0
  127. package/src/Graph/mockedData/annotationData.json +326 -0
  128. package/src/Graph/mockedData/exclusionPeriodFirstPeriod.json +588 -0
  129. package/src/Graph/mockedData/exclusionPeriodSecondPeriod.json +588 -0
  130. package/src/Graph/mockedData/exclusionPeriodThirdPeriod.json +581 -0
  131. package/src/Graph/mockedData/lastDay.json +1326 -0
  132. package/src/Graph/mockedData/lastDayAreaStack.json +3106 -0
  133. package/src/Graph/mockedData/lastDayForward.json +1338 -0
  134. package/src/Graph/mockedData/lastDayThreshold.json +2352 -0
  135. package/src/Graph/mockedData/lastMonth.json +1674 -0
  136. package/src/Graph/mockedData/lastWeek.json +2202 -0
  137. package/src/Graph/mockedData/zoomPreview.json +742 -0
  138. package/src/Graph/models.ts +150 -0
  139. package/src/Graph/timeSeries/index.test.ts +506 -0
  140. package/src/Graph/timeSeries/index.ts +512 -0
  141. package/src/Graph/timeSeries/models.ts +120 -0
  142. package/src/Graph/translatedLabels.ts +9 -0
  143. package/src/Graph/useGraphData.ts +47 -0
  144. package/src/Graph/useGraphIntersection.ts +36 -0
  145. package/src/Home.stories.mdx +1 -84
  146. package/src/Image/index.stories.tsx +2 -2
  147. package/src/Image/index.test.tsx +3 -3
  148. package/src/InputField/Search/PersistentTooltip.tsx +7 -2
  149. package/src/InputField/Select/Autocomplete/Connected/Multi/MultiConnectedAutocompleteField.cypress.spec.tsx +161 -0
  150. package/src/InputField/Select/Autocomplete/Connected/Multi/index.test.tsx +3 -22
  151. package/src/InputField/Select/Autocomplete/Connected/Multi/utils/index.ts +22 -0
  152. package/src/InputField/Select/Autocomplete/Connected/index.stories.tsx +0 -3
  153. package/src/InputField/Select/Autocomplete/Connected/index.test.tsx +1 -1
  154. package/src/InputField/Select/Autocomplete/Connected/index.tsx +16 -3
  155. package/src/InputField/Select/Autocomplete/Draggable/index.stories.tsx +0 -2
  156. package/src/InputField/Select/Autocomplete/index.stories.tsx +1 -10
  157. package/src/InputField/Select/Autocomplete/index.tsx +1 -1
  158. package/src/InputField/Select/index.tsx +1 -1
  159. package/src/InputField/Text/index.tsx +4 -2
  160. package/src/Listing/ActionBar/index.tsx +1 -1
  161. package/src/Listing/Cell/DataCell.styles.ts +24 -0
  162. package/src/Listing/Cell/DataCell.tsx +38 -63
  163. package/src/Listing/Cell/index.tsx +83 -3
  164. package/src/Listing/EmptyResult/EmptyResult.tsx +13 -0
  165. package/src/Listing/Header/Cell/ListingHeaderCell.styles.ts +71 -0
  166. package/src/Listing/Header/{SortableCell/Content.tsx → Cell/ListingHeaderCell.tsx} +16 -81
  167. package/src/Listing/Header/Cell/SelectActionListingHeaderCell.styles.ts +26 -0
  168. package/src/Listing/Header/Cell/SelectActionListingHeaderCell.tsx +70 -0
  169. package/src/Listing/Header/ListingHeader.styles.ts +16 -0
  170. package/src/Listing/Header/{index.tsx → ListingHeader.tsx} +25 -102
  171. package/src/Listing/Header/_internals/DraggableIconButton.tsx +35 -0
  172. package/src/Listing/Header/{PredefinedSelectionList.tsx → _internals/PredefinedSelectionList.tsx} +1 -1
  173. package/src/Listing/Header/index.ts +1 -0
  174. package/src/Listing/Listing.cypress.spec.tsx +120 -0
  175. package/src/Listing/Listing.styles.ts +76 -0
  176. package/src/Listing/ListingDocs.mdx +61 -0
  177. package/src/Listing/Row/EmptyRow.styles.ts +14 -0
  178. package/src/Listing/Row/EmptyRow.tsx +30 -0
  179. package/src/Listing/{Row.tsx → Row/Row.tsx} +9 -8
  180. package/src/Listing/Row/SkeletonLoaderRows.tsx +23 -0
  181. package/src/Listing/index.stories.tsx +137 -34
  182. package/src/Listing/index.test.tsx +1 -1
  183. package/src/Listing/index.tsx +120 -157
  184. package/src/Listing/models.ts +1 -0
  185. package/src/Listing/tableAtoms.ts +2 -0
  186. package/src/Listing/useStyleTable.ts +1 -1
  187. package/src/ListingPage/index.tsx +1 -1
  188. package/src/Logo/CentreonLogo.tsx +2 -2
  189. package/src/Module/LicensedModule/LicenseCheck/index.stories.tsx +0 -2
  190. package/src/Panel/Memoized.tsx +1 -1
  191. package/src/Panel/Section/index.test.tsx +1 -1
  192. package/src/Panel/Section/index.tsx +1 -1
  193. package/src/Panel/index.tsx +7 -5
  194. package/src/RichTextEditor/ContentEditable.tsx +27 -7
  195. package/src/RichTextEditor/RichTextEditor.cypress.spec.tsx +204 -0
  196. package/src/RichTextEditor/RichTextEditor.tsx +86 -45
  197. package/src/RichTextEditor/plugins/FloatingLinkEditorPlugin.tsx +1 -0
  198. package/src/Snackbar/index.tsx +14 -4
  199. package/src/Snackbar/useSnackbar.tsx +5 -1
  200. package/src/SortableItems/SortableItem.tsx +1 -1
  201. package/src/ThemeProvider/index.tsx +35 -29
  202. package/src/ThemeProvider/palettes.ts +419 -201
  203. package/src/TimePeriods/CustomTimePeriod/CompactCustomTimePeriod.styles.ts +51 -0
  204. package/src/TimePeriods/CustomTimePeriod/CompactCustomTimePeriod.tsx +95 -0
  205. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/ErrorText.tsx +14 -0
  206. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/PickersStartEndDate.tsx +163 -0
  207. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/index.tsx +76 -0
  208. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/models.ts +61 -0
  209. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/usePickersStartEndDate.ts +82 -0
  210. package/src/TimePeriods/CustomTimePeriod/index.tsx +66 -0
  211. package/src/TimePeriods/DateTimePickerInput.tsx +49 -0
  212. package/src/TimePeriods/ResolutionTimePeriod.cypress.spec.tsx +65 -0
  213. package/src/TimePeriods/SelectedTimePeriod.tsx +102 -0
  214. package/src/TimePeriods/TimePeriods.cypress.spec.tsx +510 -0
  215. package/src/TimePeriods/TimePeriods.styles.ts +22 -0
  216. package/src/TimePeriods/helpers/index.ts +26 -0
  217. package/src/TimePeriods/index.stories.tsx +98 -0
  218. package/src/TimePeriods/index.tsx +78 -0
  219. package/src/TimePeriods/mockedData.ts +12 -0
  220. package/src/TimePeriods/models.ts +97 -0
  221. package/src/TimePeriods/timePeriodsAtoms.ts +102 -0
  222. package/src/TimePeriods/translatedLabels.ts +9 -0
  223. package/src/TimePeriods/useSortTimePeriods.ts +31 -0
  224. package/src/TimePeriods/useTimePeriod.ts +49 -0
  225. package/src/Typography/FluidTypography/index.stories.tsx +63 -0
  226. package/src/Typography/FluidTypography/index.tsx +51 -0
  227. package/src/Typography/FluidTypography/useFluidResizeObserver.ts +56 -0
  228. package/src/Typography/{index.stories.tsx → Typography.stories.tsx} +5 -5
  229. package/src/WallpaperPage/index.stories.tsx +1 -1
  230. package/src/Wizard/ActionsBar.test.tsx +1 -1
  231. package/src/Wizard/index.stories.tsx +5 -18
  232. package/src/Wizard/index.test.tsx +1 -1
  233. package/src/Wizard/index.tsx +13 -3
  234. package/src/Wizard/models.ts +1 -0
  235. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-dashboard-normal-1-snap.png +0 -0
  236. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-dashboard-with-item-header-1-snap.png +0 -0
  237. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-dashboard-with-many-panels-1-snap.png +0 -0
  238. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-fluid-typography-basic-1-snap.png +0 -0
  239. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-fluid-typography-with-20-px-height-1-snap.png +0 -0
  240. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-fluid-typography-with-200-px-width-1-snap.png +0 -0
  241. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-fluid-typography-with-heading-5-variant-1-snap.png +0 -0
  242. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-fluid-typography-with-long-text-1-snap.png +0 -0
  243. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-listing-as-empty-state-1-snap.png +0 -0
  244. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-listing-loading-with-no-data-1-snap.png +0 -0
  245. package/src/__image_snapshots__/storyshots-test-js-image-story-shots-listing-with-editable-and-sortable-columns-1-snap.png +0 -0
  246. package/src/api/TestQueryProvider.tsx +2 -1
  247. package/src/api/customFetch.ts +10 -0
  248. package/src/api/useFetchQuery/index.ts +8 -7
  249. package/src/api/useMutationQuery/index.ts +32 -17
  250. package/src/api/useRequest/index.ts +9 -6
  251. package/src/base/tokens/README.md +3 -0
  252. package/src/base/tokens/source/$metadata.json +5 -0
  253. package/src/base/tokens/source/base.json +142 -0
  254. package/src/base/tokens/themes/base.tokens.d.ts +38 -0
  255. package/src/base/tokens/themes/base.tokens.json +695 -0
  256. package/src/base/tokens/themes/base.tokens.ts +38 -0
  257. package/src/base/tokens/themes/ui-dark.tokens.d.ts +38 -0
  258. package/src/base/tokens/themes/ui-dark.tokens.json +695 -0
  259. package/src/base/tokens/themes/ui-dark.tokens.ts +38 -0
  260. package/src/base/tokens/themes/ui-light.tokens.d.ts +38 -0
  261. package/src/base/tokens/themes/ui-light.tokens.json +695 -0
  262. package/src/base/tokens/themes/ui-light.tokens.ts +38 -0
  263. package/src/components/Button/Button.stories.tsx +34 -0
  264. package/src/components/Button/Button.styles.ts +44 -0
  265. package/src/components/Button/Button.tsx +78 -0
  266. package/src/components/Button/Icon/IconButton.stories.tsx +18 -0
  267. package/src/components/Button/Icon/IconButton.styles.ts +14 -0
  268. package/src/components/Button/Icon/IconButton.tsx +58 -0
  269. package/src/components/Button/Icon/index.tsx +1 -0
  270. package/src/components/Button/index.ts +2 -0
  271. package/src/components/DataTable/DataTable.stories.tsx +51 -0
  272. package/src/components/DataTable/DataTable.styles.ts +27 -0
  273. package/src/components/DataTable/DataTable.tsx +35 -0
  274. package/src/components/DataTable/EmptyState/DataTableEmptyState.stories.tsx +21 -0
  275. package/src/components/DataTable/EmptyState/DataTableEmptyState.styles.ts +26 -0
  276. package/src/components/DataTable/EmptyState/DataTableEmptyState.tsx +53 -0
  277. package/src/components/DataTable/Item/DataTableItem.stories.tsx +25 -0
  278. package/src/components/DataTable/Item/DataTableItem.styles.ts +39 -0
  279. package/src/components/DataTable/Item/DataTableItem.tsx +102 -0
  280. package/src/components/DataTable/Item/DataTableItemSkeleton.tsx +13 -0
  281. package/src/components/DataTable/index.ts +10 -0
  282. package/src/components/Form/AccessRights/AccessRights.resource.ts +45 -0
  283. package/src/components/Form/AccessRights/AccessRightsForm.stories.tsx +59 -0
  284. package/src/components/Form/AccessRights/AccessRightsForm.styles.ts +21 -0
  285. package/src/components/Form/AccessRights/AccessRightsForm.tsx +67 -0
  286. package/src/components/Form/AccessRights/AccessRightsFormActions.tsx +80 -0
  287. package/src/components/Form/AccessRights/Input/AddAction.tsx +31 -0
  288. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.stories.tsx +54 -0
  289. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.tsx +72 -0
  290. package/src/components/Form/AccessRights/Input/ContactAccessRightsInput.styles.ts +22 -0
  291. package/src/components/Form/AccessRights/Input/ContactInputField.tsx +105 -0
  292. package/src/components/Form/AccessRights/Input/RoleInputField.tsx +29 -0
  293. package/src/components/Form/AccessRights/List/ContactAccessRightsList.stories.tsx +97 -0
  294. package/src/components/Form/AccessRights/List/ContactAccessRightsList.styles.ts +71 -0
  295. package/src/components/Form/AccessRights/List/ContactAccessRightsList.tsx +51 -0
  296. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.stories.tsx +116 -0
  297. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.tsx +118 -0
  298. package/src/components/Form/AccessRights/List/ContactAccessRightsListItemSkeleton.tsx +26 -0
  299. package/src/components/Form/AccessRights/List/ContactAccessRightsListSkeleton.tsx +28 -0
  300. package/src/components/Form/AccessRights/Stats/AccessRightsStats.styles.ts +18 -0
  301. package/src/components/Form/AccessRights/Stats/AccessRightsStats.tsx +41 -0
  302. package/src/components/Form/AccessRights/__fixtures__/contactAccessRight.mock.ts +52 -0
  303. package/src/components/Form/AccessRights/common/GroupLabel.styles.ts +18 -0
  304. package/src/components/Form/AccessRights/common/GroupLabel.tsx +15 -0
  305. package/src/components/Form/AccessRights/common/Input.styles.ts +48 -0
  306. package/src/components/Form/AccessRights/common/RoleInputSelect.styles.ts +11 -0
  307. package/src/components/Form/AccessRights/common/RoleInputSelect.tsx +57 -0
  308. package/src/components/Form/AccessRights/index.ts +3 -0
  309. package/src/components/Form/AccessRights/useAccessRightsForm.test.tsx +531 -0
  310. package/src/components/Form/AccessRights/useAccessRightsForm.tsx +282 -0
  311. package/src/components/Form/AccessRights/useAccessRightsForm.utils.ts +41 -0
  312. package/src/components/Form/Dashboard/Dashboard.resource.ts +4 -0
  313. package/src/components/Form/Dashboard/DashboardForm.stories.ts +39 -0
  314. package/src/components/Form/Dashboard/DashboardForm.styles.ts +13 -0
  315. package/src/components/Form/Dashboard/DashboardForm.tsx +101 -0
  316. package/src/components/Form/Dashboard/index.ts +2 -0
  317. package/src/components/Form/Dashboard/translatedLabels.ts +6 -0
  318. package/src/components/Form/Form.models.ts +1 -0
  319. package/src/components/Form/Form.resource.ts +1 -0
  320. package/src/components/Form/Form.styles.ts +17 -0
  321. package/src/components/Form/FormActions.tsx +57 -0
  322. package/src/components/Form/index.ts +3 -0
  323. package/src/components/Header/Header.styles.ts +0 -0
  324. package/src/components/Header/PageHeader/PageHeader.stories.tsx +97 -0
  325. package/src/components/Header/PageHeader/PageHeader.styles.ts +99 -0
  326. package/src/components/Header/PageHeader/PageHeader.tsx +15 -0
  327. package/src/components/Header/PageHeader/PageHeaderActions.tsx +17 -0
  328. package/src/components/Header/PageHeader/PageHeaderMain.tsx +15 -0
  329. package/src/components/Header/PageHeader/PageHeaderMenu.tsx +15 -0
  330. package/src/components/Header/PageHeader/PageHeaderTitle.tsx +47 -0
  331. package/src/components/Header/PageHeader/index.ts +12 -0
  332. package/src/components/Header/index.ts +1 -0
  333. package/src/components/Icon/Icon.styles.ts +0 -0
  334. package/src/components/Icon/Icon.tsx +2 -0
  335. package/src/components/Icon/index.ts +0 -0
  336. package/src/components/Layout/AreaIndicator.styles.ts +33 -0
  337. package/src/components/Layout/AreaIndicator.tsx +35 -0
  338. package/src/components/Layout/PageLayout/PageLayout.stories.tsx +81 -0
  339. package/src/components/Layout/PageLayout/PageLayout.styles.ts +40 -0
  340. package/src/components/Layout/PageLayout/PageLayout.tsx +21 -0
  341. package/src/components/Layout/PageLayout/PageLayoutActions.tsx +15 -0
  342. package/src/components/Layout/PageLayout/PageLayoutBody.tsx +24 -0
  343. package/src/components/Layout/PageLayout/PageLayoutHeader.tsx +15 -0
  344. package/src/components/Layout/PageLayout/index.ts +10 -0
  345. package/src/components/Layout/index.ts +1 -0
  346. package/src/components/List/Item/Avatar.tsx +21 -0
  347. package/src/components/List/Item/AvatarSkeleton.tsx +17 -0
  348. package/src/components/List/Item/ListItem.stories.tsx +41 -0
  349. package/src/components/List/Item/ListItem.styles.ts +57 -0
  350. package/src/components/List/Item/ListItem.tsx +32 -0
  351. package/src/components/List/Item/Text.tsx +25 -0
  352. package/src/components/List/Item/TextSkeleton.tsx +22 -0
  353. package/src/components/List/Item/index.ts +14 -0
  354. package/src/components/List/List.stories.tsx +70 -0
  355. package/src/components/List/List.styles.ts +8 -0
  356. package/src/components/List/List.tsx +19 -0
  357. package/src/components/List/index.ts +6 -0
  358. package/src/components/Menu/Button/MenuButton.stories.tsx +16 -0
  359. package/src/components/Menu/Button/MenuButton.styles.ts +27 -0
  360. package/src/components/Menu/Button/MenuButton.tsx +62 -0
  361. package/src/components/Menu/Button/index.ts +1 -0
  362. package/src/components/Menu/Menu.stories.tsx +71 -0
  363. package/src/components/Menu/Menu.styles.ts +70 -0
  364. package/src/components/Menu/Menu.tsx +25 -0
  365. package/src/components/Menu/MenuDivider.tsx +13 -0
  366. package/src/components/Menu/MenuItem.tsx +36 -0
  367. package/src/components/Menu/MenuItems.tsx +35 -0
  368. package/src/components/Menu/index.ts +12 -0
  369. package/src/components/Menu/useMenu.tsx +79 -0
  370. package/src/components/Modal/Modal.stories.tsx +111 -0
  371. package/src/components/Modal/Modal.styles.ts +59 -0
  372. package/src/components/Modal/Modal.tsx +59 -0
  373. package/src/components/Modal/ModalActions.tsx +62 -0
  374. package/src/components/Modal/ModalBody.tsx +15 -0
  375. package/src/components/Modal/ModalHeader.tsx +21 -0
  376. package/src/components/Modal/index.ts +12 -0
  377. package/src/components/README.md +3 -0
  378. package/src/components/Tooltip/TextOverflowTooltip/TextOverflowTooltip.stories.tsx +70 -0
  379. package/src/components/Tooltip/TextOverflowTooltip/TextOverflowTooltip.styles.ts +5 -0
  380. package/src/components/Tooltip/TextOverflowTooltip/TextOverflowTooltip.tsx +115 -0
  381. package/src/components/Tooltip/TextOverflowTooltip/index.tsx +1 -0
  382. package/src/components/Tooltip/Tooltip.stories.tsx +41 -0
  383. package/src/components/Tooltip/Tooltip.styles.ts +5 -0
  384. package/src/components/Tooltip/Tooltip.tsx +46 -0
  385. package/src/components/Tooltip/index.ts +1 -0
  386. package/src/components/index.ts +9 -0
  387. package/src/index.ts +7 -19
  388. package/src/screens/dashboard/DashboardsDetail.stories.tsx +108 -0
  389. package/src/screens/dashboard/DashboardsOverview.stories.tsx +281 -0
  390. package/src/styles/tokens/themes/_ui-dark.tokens.json +695 -0
  391. package/src/styles/tokens/themes/_ui-light.tokens.json +695 -0
  392. package/src/utils/docsURL.ts +31 -0
  393. package/src/utils/getNormalizedId.ts +1 -3
  394. package/src/utils/index.ts +19 -0
  395. package/src/utils/panelSize.ts +15 -0
  396. package/src/utils/sanitizedHTML.ts +18 -0
  397. package/src/utils/useCopyToClipboard.ts +2 -3
  398. package/src/utils/useDateTimePickerAdapter.ts +309 -0
  399. package/src/utils/useDebounce.ts +1 -3
  400. package/src/utils/useDeepCallback.ts +1 -3
  401. package/src/utils/useDeepMemo.ts +1 -3
  402. package/src/utils/useInfiniteScrollListing.ts +106 -0
  403. package/src/utils/useIntersectionObserver.ts +5 -5
  404. package/src/utils/useKeyObserver.tsx +1 -3
  405. package/src/utils/useLocaleDateTimeFormat/index.test.tsx +1 -1
  406. package/src/utils/useLocaleDateTimeFormat/index.ts +1 -2
  407. package/src/utils/useLocaleDateTimeFormat/localeFallback.test.tsx +1 -1
  408. package/src/utils/useMemoComponent.ts +1 -1
  409. package/src/utils/useResizeObserver.ts +6 -0
  410. package/{setupTests.js → test/setupTests.js} +1 -1
  411. package/{src → test}/testRenderer.tsx +1 -1
  412. package/.storybook/main.js +0 -82
  413. package/.storybook/preview.tsx +0 -21
  414. package/jest.config.js +0 -20
  415. package/src/Listing/Header/SortableCell/DraggableIcon.tsx +0 -41
  416. package/src/Listing/Skeleton.tsx +0 -11
  417. package/src/storyshots.test.js +0 -52
  418. package/testRunner.js +0 -36
  419. package/tsconfig.json +0 -29
  420. package/types/declarations.d.ts +0 -9
  421. /package/{assets → public/brand}/centreon-logo-one-line-dark.svg +0 -0
  422. /package/{assets → public/brand}/centreon-logo-one-line-light.svg +0 -0
  423. /package/{fonts/fonts-generated → public/fonts}/roboto-bold-webfont.ttf +0 -0
  424. /package/{fonts/fonts-generated → public/fonts}/roboto-bold-webfont.woff +0 -0
  425. /package/{fonts/fonts-generated → public/fonts}/roboto-bold-webfont.woff2 +0 -0
  426. /package/{fonts/fonts-generated → public/fonts}/roboto-light-webfont.ttf +0 -0
  427. /package/{fonts/fonts-generated → public/fonts}/roboto-light-webfont.woff +0 -0
  428. /package/{fonts/fonts-generated → public/fonts}/roboto-light-webfont.woff2 +0 -0
  429. /package/{fonts/fonts-generated → public/fonts}/roboto-medium-webfont.ttf +0 -0
  430. /package/{fonts/fonts-generated → public/fonts}/roboto-medium-webfont.woff +0 -0
  431. /package/{fonts/fonts-generated → public/fonts}/roboto-medium-webfont.woff2 +0 -0
  432. /package/{fonts/fonts-generated → public/fonts}/roboto-regular-webfont.ttf +0 -0
  433. /package/{fonts/fonts-generated → public/fonts}/roboto-regular-webfont.woff +0 -0
  434. /package/{fonts/fonts-generated → public/fonts}/roboto-regular-webfont.woff2 +0 -0
  435. /package/{assets → src/@assets/images}/not-authorized-template-background-dark.svg +0 -0
  436. /package/{assets → src/@assets/images}/not-authorized-template-background-light.svg +0 -0
  437. /package/src/Listing/Header/{Label.tsx → _internals/Label.tsx} +0 -0
  438. /package/src/Typography/{index.tsx → story.utils.tsx} +0 -0
@@ -1,7 +1,8 @@
1
+ /* eslint-disable no-alert */
1
2
  /* eslint-disable react/prop-types */
2
- import { React, useState } from 'react';
3
+ import { useState } from 'react';
3
4
 
4
- import { ComponentMeta, ComponentStory } from '@storybook/react';
5
+ import { Meta, StoryObj } from '@storybook/react';
5
6
  import { equals, prop } from 'ramda';
6
7
  import { makeStyles } from 'tss-react/mui';
7
8
 
@@ -12,11 +13,11 @@ import { ListingVariant } from '@centreon/ui-context';
12
13
 
13
14
  import { ListingProps } from '..';
14
15
 
15
- import { Column, ColumnType } from './models';
16
+ import { Column, ColumnType, SortOrder } from './models';
16
17
 
17
18
  import Listing from '.';
18
19
 
19
- export default {
20
+ const meta: Meta<typeof Listing> = {
20
21
  argTypes: {
21
22
  checkable: { control: 'boolean' },
22
23
  currentPage: { control: 'number' },
@@ -26,7 +27,10 @@ export default {
26
27
  },
27
28
  component: Listing,
28
29
  title: 'Listing'
29
- } as ComponentMeta<typeof Listing>;
30
+ };
31
+ export default meta;
32
+
33
+ type Story = StoryObj<typeof Listing>;
30
34
 
31
35
  const useStyles = makeStyles()((theme) => ({
32
36
  listing: {
@@ -48,6 +52,12 @@ const ComponentColumn = ({ row, isSelected }): JSX.Element => (
48
52
  </>
49
53
  );
50
54
 
55
+ const ButtonColumn = ({ row }): JSX.Element => (
56
+ <Button size="small" onClick={() => alert(JSON.stringify(row))}>
57
+ Click to reveal details about {row.name}
58
+ </Button>
59
+ );
60
+
51
61
  const defaultColumns = [
52
62
  {
53
63
  getFormattedString: ({ name }): string => name,
@@ -131,7 +141,7 @@ const predefinedRowsSelection = [
131
141
  }
132
142
  ];
133
143
 
134
- const Story = ({
144
+ const StoryTemplate = ({
135
145
  columns = defaultColumns,
136
146
  checkable = true,
137
147
  viewerModeConfiguration,
@@ -153,7 +163,7 @@ const Story = ({
153
163
  limit={listing.length}
154
164
  predefinedRowsSelection={predefinedRowsSelection}
155
165
  rowColorConditions={rowColorConditions}
156
- rows={listing}
166
+ rows={props.rows ?? listing}
157
167
  selectedRows={selected}
158
168
  totalRows={listing.length}
159
169
  viewerModeConfiguration={viewerModeConfiguration}
@@ -164,7 +174,7 @@ const Story = ({
164
174
  );
165
175
  };
166
176
 
167
- export const normal = (): JSX.Element => <Story />;
177
+ export const normal = (): JSX.Element => <StoryTemplate />;
168
178
 
169
179
  export const WithSpecifiedViewMode = (): JSX.Element => {
170
180
  const [viewMode, setViewMode] = useState(ListingVariant.extended);
@@ -173,7 +183,7 @@ export const WithSpecifiedViewMode = (): JSX.Element => {
173
183
  : ListingVariant.compact;
174
184
 
175
185
  return (
176
- <Story
186
+ <StoryTemplate
177
187
  viewMode={viewMode}
178
188
  viewerModeConfiguration={{
179
189
  onClick: () => setViewMode(newViewMode),
@@ -184,11 +194,15 @@ export const WithSpecifiedViewMode = (): JSX.Element => {
184
194
  };
185
195
 
186
196
  export const loadingWithNoData = (): JSX.Element => {
187
- return <Story loading rows={[]} totalRows={0} />;
197
+ return <StoryTemplate loading rows={[]} totalRows={0} />;
188
198
  };
189
199
 
190
200
  export const loadingWithData = (): JSX.Element => {
191
- return <Story loading />;
201
+ return <StoryTemplate loading />;
202
+ };
203
+
204
+ export const asEmptyState = (): JSX.Element => {
205
+ return <StoryTemplate rows={[]} />;
192
206
  };
193
207
 
194
208
  const actions = (
@@ -197,12 +211,16 @@ const actions = (
197
211
  </Button>
198
212
  );
199
213
 
200
- export const withActions = (): JSX.Element => <Story actions={actions} />;
214
+ export const withActions = (): JSX.Element => (
215
+ <StoryTemplate actions={actions} />
216
+ );
201
217
 
202
- export const withoutCheckboxes = (): JSX.Element => <Story checkable={false} />;
218
+ export const withoutCheckboxes = (): JSX.Element => (
219
+ <StoryTemplate checkable={false} />
220
+ );
203
221
 
204
222
  export const withShortLabelColumns = (): JSX.Element => (
205
- <Story columns={columnsWithShortLabel} />
223
+ <StoryTemplate columns={columnsWithShortLabel} />
206
224
  );
207
225
 
208
226
  const editableColumns = [
@@ -210,12 +228,14 @@ const editableColumns = [
210
228
  getFormattedString: ({ name }): string => name,
211
229
  id: 'name',
212
230
  label: 'Name',
231
+ sortable: true,
213
232
  type: ColumnType.string
214
233
  },
215
234
  {
216
235
  getFormattedString: ({ description }): string => description,
217
236
  id: 'description',
218
237
  label: 'Description',
238
+ sortable: true,
219
239
  type: ColumnType.string
220
240
  },
221
241
  {
@@ -243,40 +263,123 @@ const ListingWithEditableColumns = (): JSX.Element => {
243
263
  setSelectedColumnIds(defaultColumnIds);
244
264
  };
245
265
 
266
+ const [sortedRows, setSortedRows] = useState(listing);
267
+ const [sortParams, setSortParams] = useState({
268
+ sortField: editableColumns[0].id,
269
+ sortOrder: 'desc'
270
+ });
271
+
272
+ const onSort = (params: {
273
+ sortField: string;
274
+ sortOrder: SortOrder;
275
+ }): void => {
276
+ const rows = [...sortedRows];
277
+ rows.sort((a, b) =>
278
+ params.sortOrder === 'desc'
279
+ ? a[params.sortField]?.localeCompare(b[params.sortField])
280
+ : b[params.sortField]?.localeCompare(a[params.sortField])
281
+ );
282
+ setSortedRows(rows);
283
+ setSortParams(params);
284
+ };
285
+
246
286
  return (
247
- <Story
287
+ <StoryTemplate
248
288
  columnConfiguration={{
249
289
  selectedColumnIds,
250
290
  sortable: true
251
291
  }}
252
292
  columns={editableColumns}
293
+ rows={sortedRows}
294
+ sortField={sortParams.sortField}
295
+ sortOrder={sortParams.sortOrder as SortOrder}
253
296
  onResetColumns={resetColumns}
254
297
  onSelectColumns={setSelectedColumnIds}
298
+ onSort={onSort}
255
299
  />
256
300
  );
257
301
  };
258
302
 
259
- export const withEditableColumns = (): JSX.Element => (
303
+ export const withEditableAndSortableColumns = (): JSX.Element => (
260
304
  <ListingWithEditableColumns />
261
305
  );
262
306
 
263
- const TemplateListing: ComponentStory<typeof Listing> = (args) => (
264
- <Listing
265
- {...args}
266
- columns={editableColumns}
267
- disableRowCheckCondition={(row): boolean => row.disableCheckbox}
268
- disableRowCondition={(row): boolean => row.disableRow}
269
- predefinedRowsSelection={predefinedRowsSelection}
270
- rowColorConditions={rowColorConditions}
271
- rows={listing}
272
- />
273
- );
307
+ export const PlaygroundListing: Story = {
308
+ args: {
309
+ checkable: true,
310
+ columns: editableColumns,
311
+ currentPage: 1,
312
+ disableRowCheckCondition: (row): boolean => row.disableCheckbox,
313
+ disableRowCondition: (row): boolean => row.disableRow,
314
+ limit: 10,
315
+ loading: false,
316
+ predefinedRowsSelection,
317
+ rowColorConditions,
318
+ rows: listing,
319
+ totalRows: 10
320
+ }
321
+ };
322
+
323
+ const listingWithSubItems = [...tenElements].map((_, index) => ({
324
+ active: false,
325
+ description: `Entity ${index}`,
326
+ disableCheckbox: false,
327
+ disableRow: false,
328
+ id: index,
329
+ name: `E${index}`,
330
+ selected: false,
331
+ subItems:
332
+ index % 2 === 0
333
+ ? [...tenElements].map((__, subIndex) => ({
334
+ active: false,
335
+ description: `Sub item ${subIndex + (index + 10) * 10} description`,
336
+ disableCheckbox: false,
337
+ disableRow: false,
338
+ id: subIndex + (index + 10) * 10,
339
+ name: `Sub Item ${subIndex + (index + 10) * 10}`,
340
+ selected: false
341
+ }))
342
+ : undefined
343
+ }));
274
344
 
275
- export const PlaygroundListing = TemplateListing.bind({});
276
- PlaygroundListing.args = {
277
- checkable: true,
278
- currentPage: 1,
279
- limit: 10,
280
- loading: false,
281
- totalRows: 10
345
+ const columnsWithSubItems = [
346
+ {
347
+ getFormattedString: ({ name }): string => name,
348
+ id: 'name',
349
+ label: 'Name',
350
+ type: ColumnType.string
351
+ },
352
+ {
353
+ getFormattedString: ({ description }): string => description,
354
+ id: 'description',
355
+ label: 'Description',
356
+ type: ColumnType.string
357
+ },
358
+ {
359
+ Component: ButtonColumn,
360
+ displaySubItemsCaret: true,
361
+ id: '#',
362
+ label: 'Custom',
363
+ type: ColumnType.component,
364
+ width: '350px'
365
+ }
366
+ ];
367
+
368
+ export const ListingWithSubItems = {
369
+ args: {
370
+ checkable: true,
371
+ columns: columnsWithSubItems,
372
+ currentPage: 1,
373
+ limit: 10,
374
+ loading: false,
375
+ rows: listingWithSubItems,
376
+ subItems: {
377
+ canCheckSubItems: false,
378
+ enable: true,
379
+ labelCollapse: 'Collapse',
380
+ labelExpand: 'Expand',
381
+ rowProperty: 'subItems'
382
+ },
383
+ totalRows: 10
384
+ }
282
385
  };
@@ -2,7 +2,7 @@ import { useState } from 'react';
2
2
 
3
3
  import { prop } from 'ramda';
4
4
 
5
- import { render, fireEvent, within } from '../testRenderer';
5
+ import { render, fireEvent, within } from '../../test/testRenderer';
6
6
 
7
7
  import { ColumnType } from './models';
8
8
  import { labelAddColumns } from './translatedLabels';
@@ -18,50 +18,46 @@ import {
18
18
  map,
19
19
  not,
20
20
  pick,
21
+ pluck,
21
22
  prop,
22
23
  propEq,
24
+ reduce,
23
25
  reject,
24
26
  slice,
25
27
  subtract,
26
28
  uniqBy
27
29
  } from 'ramda';
28
30
  import { useTranslation } from 'react-i18next';
29
- import { makeStyles } from 'tss-react/mui';
31
+ import { useAtomValue } from 'jotai';
30
32
 
31
- import {
32
- Box,
33
- LinearProgress,
34
- Table,
35
- TableBody,
36
- TableRow,
37
- useTheme
38
- } from '@mui/material';
33
+ import { Box, LinearProgress, Table, TableBody } from '@mui/material';
39
34
 
40
35
  import { ListingVariant } from '@centreon/ui-context';
41
36
 
42
- import useKeyObserver from '../utils/useKeyObserver';
43
- import useMemoComponent from '../utils/useMemoComponent';
37
+ import { useKeyObserver, useMemoComponent } from '../utils';
44
38
 
45
39
  import ListingActionBar from './ActionBar';
46
40
  import Cell from './Cell';
47
41
  import DataCell from './Cell/DataCell';
48
42
  import Checkbox from './Checkbox';
49
43
  import getCumulativeOffset from './getCumulativeOffset';
50
- import ListingHeader, { headerHeight } from './Header/index';
51
44
  import {
52
45
  Column,
53
46
  ColumnConfiguration,
54
47
  PredefinedRowSelection,
55
48
  RowColorCondition,
56
49
  RowId,
57
- SortOrder,
58
- TableStyleAtom as TableStyle
50
+ SortOrder
59
51
  } from './models';
60
- import ListingRow from './Row';
61
- import ListingLoadingSkeleton from './Skeleton';
52
+ import ListingRow from './Row/Row';
62
53
  import { labelNoResultFound } from './translatedLabels';
63
54
  import useResizeObserver from './useResizeObserver';
64
55
  import useStyleTable from './useStyleTable';
56
+ import { loadingIndicatorHeight, useListingStyles } from './Listing.styles';
57
+ import { EmptyResult } from './EmptyResult/EmptyResult';
58
+ import { SkeletonLoader } from './Row/SkeletonLoaderRows';
59
+ import { ListingHeader } from './Header';
60
+ import { subItemsPivotsAtom } from './tableAtoms';
65
61
 
66
62
  const getVisibleColumns = ({
67
63
  columnConfiguration,
@@ -78,88 +74,6 @@ const getVisibleColumns = ({
78
74
  ) as Array<Column>;
79
75
  };
80
76
 
81
- const loadingIndicatorHeight = 3;
82
-
83
- interface StylesProps {
84
- checkable: boolean;
85
- currentVisibleColumns: Array<Column>;
86
- dataStyle: TableStyle;
87
- getGridTemplateColumn: string;
88
- rows: Array<unknown>;
89
- viewMode: ListingVariant;
90
- }
91
-
92
- const useStyles = makeStyles<StylesProps>()(
93
- (
94
- theme,
95
- { dataStyle, getGridTemplateColumn, rows, checkable, currentVisibleColumns }
96
- ) => ({
97
- actionBar: {
98
- alignItems: 'center',
99
- display: 'flex'
100
- },
101
- checkbox: {
102
- justifyContent: 'start'
103
- },
104
- container: {
105
- background: 'none',
106
- display: 'flex',
107
- flexDirection: 'column',
108
- height: '100%',
109
- width: '100%'
110
- },
111
- emptyDataCell: {
112
- flexDirection: 'column',
113
- gridColumn: `auto / span ${
114
- checkable
115
- ? currentVisibleColumns.length + 1
116
- : currentVisibleColumns.length
117
- }`,
118
- justifyContent: 'center'
119
- },
120
- emptyDataRow: {
121
- display: 'contents'
122
- },
123
- loadingIndicator: {
124
- height: loadingIndicatorHeight,
125
- width: '100%'
126
- },
127
- table: {
128
- '.listingHeader > div > div:first-of-type': {
129
- paddingLeft: theme.spacing(1.5)
130
- },
131
- '.listingHeader div div': {
132
- backgroundColor: theme.palette.background.listingHeader,
133
- boxShadow: `-1px 0px 0px 0px ${theme.palette.background.listingHeader}`,
134
- height: dataStyle.header.height,
135
- padding: 0
136
- },
137
- alignItems: 'center',
138
- display: 'grid',
139
- gridTemplateColumns: getGridTemplateColumn,
140
- gridTemplateRows: `${theme.spacing(dataStyle.header.height / 8)} repeat(${
141
- rows?.length
142
- }, ${dataStyle.body.height}px)`,
143
- position: 'relative'
144
- },
145
- tableBody: {
146
- '.MuiTableRow-root > div:first-of-type': {
147
- paddingLeft: theme.spacing(1.5)
148
- },
149
-
150
- display: 'contents',
151
- 'div:first-of-type': {
152
- gridColumnStart: 1
153
- },
154
- position: 'relative'
155
- },
156
- tableWrapper: {
157
- borderBottom: 'none',
158
- overflow: 'auto'
159
- }
160
- })
161
- );
162
-
163
77
  interface CustomStyle {
164
78
  customStyleViewerModeContainer?: string;
165
79
  customStyleViewerModeIcon?: string;
@@ -196,7 +110,7 @@ export interface Props<TRow> {
196
110
  onRowClick?: (row: TRow) => void;
197
111
  onSelectColumns?: (selectedColumnIds: Array<string>) => void;
198
112
  onSelectRows?: (rows: Array<TRow>) => void;
199
- onSort?: (sortParams) => void;
113
+ onSort?: (sortParams: { sortField: string; sortOrder: SortOrder }) => void;
200
114
  paginated?: boolean;
201
115
  predefinedRowsSelection?: Array<PredefinedRowSelection>;
202
116
  rowColorConditions?: Array<RowColorCondition>;
@@ -204,6 +118,13 @@ export interface Props<TRow> {
204
118
  selectedRows?: Array<TRow>;
205
119
  sortField?: string;
206
120
  sortOrder?: SortOrder;
121
+ subItems?: {
122
+ canCheckSubItems: boolean;
123
+ enable: boolean;
124
+ labelCollapse: string;
125
+ labelExpand: string;
126
+ rowProperty: string;
127
+ };
207
128
  totalRows?: number;
208
129
  viewMode?: ListingVariant;
209
130
  viewerModeConfiguration?: ViewerModeConfiguration;
@@ -250,7 +171,14 @@ const Listing = <TRow extends { id: RowId }>({
250
171
  viewMode = ListingVariant.compact,
251
172
  widthToMoveTablePagination,
252
173
  getHighlightRowCondition,
253
- viewerModeConfiguration
174
+ viewerModeConfiguration,
175
+ subItems = {
176
+ canCheckSubItems: false,
177
+ enable: false,
178
+ labelCollapse: 'Collapse',
179
+ labelExpand: 'Expand',
180
+ rowProperty: ''
181
+ }
254
182
  }: Props<TRow>): JSX.Element => {
255
183
  const currentVisibleColumns = getVisibleColumns({
256
184
  columnConfiguration,
@@ -262,14 +190,6 @@ const Listing = <TRow extends { id: RowId }>({
262
190
  viewMode
263
191
  });
264
192
 
265
- const { classes } = useStyles({
266
- checkable,
267
- currentVisibleColumns,
268
- dataStyle,
269
- getGridTemplateColumn,
270
- rows,
271
- viewMode
272
- });
273
193
  const { t } = useTranslation();
274
194
 
275
195
  const [tableTopOffset, setTableTopOffset] = React.useState(0);
@@ -283,7 +203,36 @@ const Listing = <TRow extends { id: RowId }>({
283
203
  const containerRef = React.useRef<HTMLDivElement>();
284
204
  const actionBarRef = React.useRef<HTMLDivElement>();
285
205
 
286
- const theme = useTheme();
206
+ const subItemsPivots = useAtomValue(subItemsPivotsAtom);
207
+
208
+ const rowsToDisplay = React.useMemo(
209
+ () =>
210
+ subItems?.enable
211
+ ? reduce<TRow, Array<TRow>>(
212
+ (acc, row): Array<TRow> => {
213
+ if (
214
+ row[subItems.rowProperty] &&
215
+ subItemsPivots.includes(row.id)
216
+ ) {
217
+ return [...acc, row, ...row[subItems.rowProperty]];
218
+ }
219
+
220
+ return [...acc, row];
221
+ },
222
+ [],
223
+ rows
224
+ )
225
+ : rows,
226
+ [rows, subItemsPivots, subItems]
227
+ );
228
+
229
+ const { classes, theme } = useListingStyles({
230
+ dataStyle,
231
+ getGridTemplateColumn,
232
+ limit,
233
+ rows: rowsToDisplay,
234
+ viewMode
235
+ });
287
236
 
288
237
  useResizeObserver({
289
238
  onResize: () => {
@@ -490,9 +439,9 @@ const Listing = <TRow extends { id: RowId }>({
490
439
 
491
440
  return `calc(100vh - ${tableTopOffset}px - ${
492
441
  actionBarRef.current?.offsetHeight
493
- }px - ${headerHeight}px - ${loadingIndicatorHeight}px - ${theme.spacing(
494
- 1
495
- )})`;
442
+ }px - ${
443
+ dataStyle.header.height
444
+ }px - ${loadingIndicatorHeight}px - ${theme.spacing(1)})`;
496
445
  };
497
446
 
498
447
  const changeLimit = (updatedLimit: string): void => {
@@ -515,6 +464,19 @@ const Listing = <TRow extends { id: RowId }>({
515
464
 
516
465
  const areColumnsEditable = not(isNil(onSelectColumns));
517
466
 
467
+ const allSubItemIds = React.useMemo(
468
+ () =>
469
+ reduce<TRow | number, Array<string | number>>(
470
+ (acc, row) => [
471
+ ...acc,
472
+ ...pluck('id', row[subItems?.rowProperty || ''] || [])
473
+ ],
474
+ [],
475
+ rows
476
+ ),
477
+ [rows, subItems]
478
+ );
479
+
518
480
  return (
519
481
  <>
520
482
  {loading && rows.length > 0 && (
@@ -588,14 +550,16 @@ const Listing = <TRow extends { id: RowId }>({
588
550
  component="div"
589
551
  onMouseLeave={clearHoveredRow}
590
552
  >
591
- {rows.map((row, index) => {
553
+ {rowsToDisplay.map((row, index) => {
592
554
  const isRowSelected = isSelected(row);
593
-
594
555
  const isRowHovered = equals(hoveredRowId, getId(row));
556
+ const isSubItem = allSubItemIds.includes(row.id);
595
557
 
596
558
  return (
597
559
  <ListingRow
598
- checkable={checkable}
560
+ checkable={
561
+ checkable && (!isSubItem || subItems.canCheckSubItems)
562
+ }
599
563
  columnConfiguration={columnConfiguration}
600
564
  columnIds={columns.map(prop('id'))}
601
565
  disableRowCondition={disableRowCondition}
@@ -612,6 +576,7 @@ const Listing = <TRow extends { id: RowId }>({
612
576
  row={row}
613
577
  rowColorConditions={rowColorConditions}
614
578
  shiftKeyDownRowPivot={shiftKeyDownRowPivot}
579
+ subItemsPivots={subItemsPivots}
615
580
  tabIndex={-1}
616
581
  viewMode={viewMode}
617
582
  visibleColumns={visibleColumns}
@@ -621,66 +586,64 @@ const Listing = <TRow extends { id: RowId }>({
621
586
  onFocus={(): void => hoverRow(row)}
622
587
  onMouseOver={(): void => hoverRow(row)}
623
588
  >
624
- {checkable && (
625
- <Cell
626
- align="left"
627
- className={classes.checkbox}
628
- disableRowCondition={disableRowCondition}
629
- isRowHovered={isRowHovered}
630
- row={row}
631
- rowColorConditions={rowColorConditions}
632
- onClick={(event): void => selectRow(event, row)}
633
- >
634
- <Checkbox
635
- checked={isRowSelected}
636
- disabled={
637
- disableRowCheckCondition(row) ||
638
- disableRowCondition(row)
639
- }
640
- inputProps={{
641
- 'aria-label': `Select row ${getId(row)}`
642
- }}
589
+ {checkable &&
590
+ (!isSubItem || subItems.canCheckSubItems ? (
591
+ <Cell
592
+ align="left"
593
+ className={classes.checkbox}
594
+ disableRowCondition={disableRowCondition}
595
+ isRowHovered={isRowHovered}
596
+ row={row}
597
+ rowColorConditions={rowColorConditions}
598
+ onClick={(event): void => selectRow(event, row)}
599
+ >
600
+ <Checkbox
601
+ checked={isRowSelected}
602
+ disabled={
603
+ disableRowCheckCondition(row) ||
604
+ disableRowCondition(row)
605
+ }
606
+ inputProps={{
607
+ 'aria-label': `Select row ${getId(row)}`
608
+ }}
609
+ />
610
+ </Cell>
611
+ ) : (
612
+ <Cell
613
+ align="left"
614
+ disableRowCondition={disableRowCondition}
615
+ isRowHovered={isRowHovered}
616
+ row={row}
617
+ rowColorConditions={rowColorConditions}
643
618
  />
644
- </Cell>
645
- )}
619
+ ))}
646
620
 
647
621
  {visibleColumns.map((column) => (
648
622
  <DataCell
649
- areColumnsEditable={areColumnsEditable}
650
623
  column={column}
651
624
  disableRowCondition={disableRowCondition}
652
625
  getHighlightRowCondition={getHighlightRowCondition}
653
626
  isRowHovered={isRowHovered}
654
627
  isRowSelected={isRowSelected}
655
628
  key={`${getId(row)}-${column.id}`}
629
+ labelCollapse={subItems.labelCollapse}
630
+ labelExpand={subItems.labelExpand}
656
631
  row={row}
657
632
  rowColorConditions={rowColorConditions}
633
+ subItemsRowProperty={subItems?.rowProperty}
658
634
  viewMode={viewMode}
659
635
  />
660
636
  ))}
661
637
  </ListingRow>
662
638
  );
663
639
  })}
664
- {rows.length < 1 && (
665
- <TableRow
666
- className={classes.emptyDataRow}
667
- component="div"
668
- tabIndex={-1}
669
- >
670
- <Cell
671
- align="center"
672
- className={classes.emptyDataCell}
673
- disableRowCondition={(): boolean => false}
674
- isRowHovered={false}
675
- >
676
- {loading ? (
677
- <ListingLoadingSkeleton />
678
- ) : (
679
- t(labelNoResultFound)
680
- )}
681
- </Cell>
682
- </TableRow>
683
- )}
640
+
641
+ {rows.length < 1 &&
642
+ (loading ? (
643
+ <SkeletonLoader rows={limit} />
644
+ ) : (
645
+ <EmptyResult label={t(labelNoResultFound)} />
646
+ ))}
684
647
  </TableBody>
685
648
  </Table>
686
649
  </Box>