@centreon/ui 23.10.121 → 24.4.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 (374) hide show
  1. package/package.json +64 -45
  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 +217 -0
  42. package/src/Graph/BarStack/BarStack.stories.tsx +125 -0
  43. package/src/Graph/BarStack/BarStack.styles.ts +66 -0
  44. package/src/Graph/BarStack/BarStack.tsx +14 -0
  45. package/src/Graph/BarStack/Graph.tsx +176 -0
  46. package/src/Graph/BarStack/GraphAndLegend.tsx +119 -0
  47. package/src/Graph/BarStack/ResponsiveBarStack.tsx +114 -0
  48. package/src/Graph/BarStack/constants.ts +5 -0
  49. package/src/Graph/BarStack/index.ts +1 -0
  50. package/src/Graph/BarStack/models.ts +19 -0
  51. package/src/Graph/BarStack/useGraphAndLegend.ts +86 -0
  52. package/src/Graph/BarStack/useResponsiveBarStack.ts +106 -0
  53. package/src/Graph/Gauge/Gauge.cypress.spec.tsx +102 -0
  54. package/src/Graph/Gauge/Gauge.tsx +1 -1
  55. package/src/Graph/HeatMap/HeatMap.cypress.spec.tsx +145 -0
  56. package/src/Graph/HeatMap/HeatMap.stories.tsx +0 -25
  57. package/src/Graph/HeatMap/HeatMap.styles.tsx +1 -0
  58. package/src/Graph/HeatMap/ResponsiveHeatMap.tsx +39 -12
  59. package/src/Graph/HeatMap/model.ts +6 -1
  60. package/src/Graph/Legend/Legend.styles.ts +10 -0
  61. package/src/Graph/Legend/Legend.tsx +26 -0
  62. package/src/Graph/Legend/index.ts +1 -0
  63. package/src/Graph/Legend/models.ts +11 -0
  64. package/src/Graph/LineChart/BasicComponents/Lines/RegularLines/index.tsx +2 -1
  65. package/src/Graph/LineChart/BasicComponents/Lines/StackedLines/index.tsx +3 -4
  66. package/src/Graph/LineChart/BasicComponents/Lines/Threshold/Circle.tsx +2 -2
  67. package/src/Graph/LineChart/BasicComponents/ThresholdLine.tsx +3 -1
  68. package/src/Graph/LineChart/BasicComponents/Thresholds.tsx +2 -2
  69. package/src/Graph/LineChart/BasicComponents/useFilterLines.ts +3 -5
  70. package/src/Graph/LineChart/Header/index.tsx +3 -31
  71. package/src/Graph/LineChart/Icons/Downtime.tsx +3 -3
  72. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/GuidingLines.tsx +2 -2
  73. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/useTickGraph.ts +9 -11
  74. package/src/Graph/LineChart/InteractiveComponents/Annotations/EventAnnotations.tsx +1 -1
  75. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/GraphValueTooltip.tsx +68 -0
  76. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltip.ts +27 -0
  77. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltipStyles.ts +31 -0
  78. package/src/Graph/LineChart/InteractiveComponents/ZoomPreview/index.tsx +2 -1
  79. package/src/Graph/LineChart/InteractiveComponents/index.tsx +132 -17
  80. package/src/Graph/LineChart/InteractiveComponents/interactionWithGraphAtoms.ts +7 -27
  81. package/src/Graph/LineChart/Legend/Legend.styles.ts +85 -32
  82. package/src/Graph/LineChart/Legend/LegendContent.tsx +12 -6
  83. package/src/Graph/LineChart/Legend/LegendHeader.tsx +66 -27
  84. package/src/Graph/LineChart/Legend/index.tsx +43 -46
  85. package/src/Graph/LineChart/Legend/models.ts +5 -0
  86. package/src/Graph/LineChart/Legend/useLegend.ts +12 -13
  87. package/src/Graph/LineChart/LineChart.cypress.spec.tsx +144 -0
  88. package/src/Graph/LineChart/LineChart.styles.ts +8 -0
  89. package/src/Graph/LineChart/LineChart.tsx +125 -123
  90. package/src/Graph/LineChart/LoadingSkeleton.tsx +2 -2
  91. package/src/Graph/LineChart/helpers/doc.ts +16 -13
  92. package/src/Graph/LineChart/helpers/index.ts +1 -1
  93. package/src/Graph/LineChart/index.stories.tsx +17 -2
  94. package/src/Graph/LineChart/index.tsx +6 -7
  95. package/src/Graph/LineChart/mockedData/curvesWithSameColor.json +252 -0
  96. package/src/Graph/LineChart/mockedData/lastDayWithIncompleteValues.json +1320 -0
  97. package/src/Graph/LineChart/mockedData/lastDayWithNullValues.json +1314 -0
  98. package/src/Graph/LineChart/models.ts +12 -1
  99. package/src/Graph/LineChart/useLineChartData.ts +68 -18
  100. package/src/Graph/PieChart/PieChart.cypress.spec.tsx +154 -0
  101. package/src/Graph/PieChart/PieChart.stories.tsx +194 -0
  102. package/src/Graph/PieChart/PieChart.styles.ts +39 -0
  103. package/src/Graph/PieChart/PieChart.tsx +14 -0
  104. package/src/Graph/PieChart/ResponsivePie.tsx +245 -0
  105. package/src/Graph/PieChart/index.ts +1 -0
  106. package/src/Graph/PieChart/models.ts +20 -0
  107. package/src/Graph/PieChart/useResponsivePie.ts +81 -0
  108. package/src/Graph/SingleBar/SingleBar.cypress.spec.tsx +121 -0
  109. package/src/Graph/SingleBar/Thresholds.tsx +2 -2
  110. package/src/Graph/Text/Text.cypress.spec.tsx +101 -0
  111. package/src/Graph/Text/Text.stories.tsx +60 -4
  112. package/src/Graph/Text/Text.styles.ts +12 -1
  113. package/src/Graph/Text/Text.tsx +17 -12
  114. package/src/Graph/Tree/DescendantNodes.tsx +88 -0
  115. package/src/Graph/Tree/Links.tsx +64 -0
  116. package/src/Graph/Tree/StandaloneTree.tsx +32 -0
  117. package/src/Graph/Tree/Tree.cypress.spec.tsx +171 -0
  118. package/src/Graph/Tree/Tree.stories.tsx +144 -0
  119. package/src/Graph/Tree/Tree.tsx +116 -0
  120. package/src/Graph/Tree/constants.ts +2 -0
  121. package/src/Graph/Tree/index.ts +4 -0
  122. package/src/Graph/Tree/models.ts +52 -0
  123. package/src/Graph/Tree/stories/contents.tsx +164 -0
  124. package/src/Graph/Tree/stories/datas.ts +305 -0
  125. package/src/Graph/Tree/utils.ts +49 -0
  126. package/src/Graph/common/testUtils.ts +71 -0
  127. package/src/Graph/common/timeSeries/index.ts +53 -15
  128. package/src/Graph/common/utils.ts +69 -1
  129. package/src/Graph/index.ts +4 -0
  130. package/src/Icon/BaseIcon.tsx +32 -0
  131. package/src/Icon/DowntimeIcon.tsx +14 -0
  132. package/src/InputField/Number/Number.cypress.spec.tsx +85 -0
  133. package/src/InputField/Number/Number.stories.tsx +66 -0
  134. package/src/InputField/Number/Number.tsx +74 -0
  135. package/src/InputField/Search/index.tsx +2 -2
  136. package/src/InputField/Select/Autocomplete/Connected/Multi/index.test.tsx +22 -1
  137. package/src/InputField/Select/Autocomplete/Connected/index.test.tsx +3 -2
  138. package/src/InputField/Select/Autocomplete/Connected/index.tsx +35 -17
  139. package/src/InputField/Select/Autocomplete/Draggable/SortableList.tsx +1 -1
  140. package/src/InputField/Select/Autocomplete/Draggable/SortableListContent.tsx +1 -1
  141. package/src/InputField/Select/Autocomplete/Draggable/index.tsx +1 -1
  142. package/src/InputField/Select/Autocomplete/Multi/index.stories.tsx +19 -0
  143. package/src/InputField/Select/Autocomplete/Multi/index.tsx +12 -7
  144. package/src/InputField/Select/Autocomplete/index.tsx +129 -116
  145. package/src/InputField/Select/IconPopover/index.tsx +3 -3
  146. package/src/InputField/Select/index.tsx +15 -2
  147. package/src/InputField/Text/index.tsx +53 -46
  148. package/src/Listing/ActionBar/index.tsx +11 -10
  149. package/src/Listing/Cell/DataCell.styles.ts +3 -0
  150. package/src/Listing/Cell/DataCell.tsx +23 -5
  151. package/src/Listing/Header/ListingHeader.tsx +1 -1
  152. package/src/Listing/Listing.cypress.spec.tsx +218 -33
  153. package/src/Listing/Listing.styles.ts +4 -7
  154. package/src/Listing/Row/Row.tsx +7 -3
  155. package/src/Listing/index.stories.tsx +39 -5
  156. package/src/Listing/index.test.tsx +1 -1
  157. package/src/Listing/index.tsx +207 -149
  158. package/src/Listing/models.ts +1 -0
  159. package/src/Listing/useStyleTable.ts +1 -0
  160. package/src/Module/LicensedModule/LicenseCheck/index.tsx +24 -9
  161. package/src/Module/LicensedModule/index.tsx +7 -1
  162. package/src/Module/Module.cypress.spec.tsx +129 -0
  163. package/src/Module/index.tsx +2 -4
  164. package/src/Panel/index.tsx +1 -1
  165. package/src/PopoverMenu/index.tsx +9 -8
  166. package/src/RichTextEditor/ContentEditable.tsx +195 -195
  167. package/src/RichTextEditor/RichTextEditor.cypress.spec.tsx +100 -52
  168. package/src/RichTextEditor/RichTextEditor.tsx +21 -4
  169. package/src/RichTextEditor/plugins/ToolbarPlugin/AlignPicker.tsx +21 -20
  170. package/src/RichTextEditor/plugins/ToolbarPlugin/BlockButtons.tsx +35 -77
  171. package/src/RichTextEditor/plugins/ToolbarPlugin/FormatButtons.tsx +29 -83
  172. package/src/RichTextEditor/plugins/ToolbarPlugin/LinkButton.tsx +106 -0
  173. package/src/RichTextEditor/plugins/ToolbarPlugin/ListButton.tsx +155 -0
  174. package/src/RichTextEditor/plugins/ToolbarPlugin/MacrosButton.tsx +23 -39
  175. package/src/RichTextEditor/plugins/ToolbarPlugin/ToolbarPlugin.styles.ts +24 -14
  176. package/src/RichTextEditor/plugins/ToolbarPlugin/UndoRedoButtons.tsx +6 -0
  177. package/src/RichTextEditor/plugins/ToolbarPlugin/index.tsx +5 -10
  178. package/src/RichTextEditor/translatedLabels.ts +3 -0
  179. package/src/SortableItems/index.tsx +2 -7
  180. package/src/StoryBookThemeProvider/index.tsx +35 -36
  181. package/src/ThemeProvider/index.tsx +39 -12
  182. package/src/ThemeProvider/palettes.ts +15 -12
  183. package/src/TimePeriods/CustomTimePeriod/CompactCustomTimePeriod.styles.ts +6 -7
  184. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/PickersStartEndDate.tsx +10 -6
  185. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/models.ts +0 -2
  186. package/src/TimePeriods/DateTimePickerInput.tsx +59 -19
  187. package/src/TimePeriods/ResolutionTimePeriod.cypress.spec.tsx +12 -9
  188. package/src/TimePeriods/TimePeriods.cypress.spec.tsx +9 -33
  189. package/src/TimePeriods/helpers/index.ts +1 -1
  190. package/src/TimePeriods/index.stories.tsx +12 -4
  191. package/src/TimePeriods/index.tsx +2 -2
  192. package/src/TopCounterElements/TopCounterLayout.tsx +3 -0
  193. package/src/TopCounterElements/useCloseOnLegacyPage.tsx +42 -0
  194. package/src/Typography/FluidTypography/FluidTypography.cypress.spec.tsx +27 -0
  195. package/src/Typography/FluidTypography/index.stories.tsx +2 -2
  196. package/src/Typography/FluidTypography/index.tsx +21 -28
  197. package/src/Typography/Subtitle.tsx +55 -0
  198. package/src/api/QueryProvider.tsx +1 -1
  199. package/src/api/TestQueryProvider.tsx +1 -1
  200. package/src/api/buildListingEndpoint/getSearchQueryParameterValue.ts +7 -1
  201. package/src/api/buildListingEndpoint/models.ts +3 -1
  202. package/src/api/customFetch.ts +12 -3
  203. package/src/api/index.ts +3 -3
  204. package/src/api/useFetchQuery/index.ts +49 -28
  205. package/src/api/useGraphQuery/index.ts +26 -5
  206. package/src/api/useGraphQuery/models.ts +5 -0
  207. package/src/api/useMutationQuery/index.test.ts +4 -4
  208. package/src/api/useMutationQuery/index.ts +65 -20
  209. package/src/components/Button/Icon/IconButton.tsx +6 -2
  210. package/src/components/CollapsibleItem/CollapsibleItem.cypress.spec.tsx +76 -0
  211. package/src/components/CollapsibleItem/CollapsibleItem.stories.tsx +26 -0
  212. package/src/components/CollapsibleItem/CollapsibleItem.tsx +43 -14
  213. package/src/components/CollapsibleItem/useCollapsibleItemStyles.ts +24 -1
  214. package/src/components/DataTable/DataListing.tsx +6 -0
  215. package/src/components/DataTable/DataTable.cypress.spec.tsx +174 -0
  216. package/src/components/DataTable/DataTable.stories.tsx +40 -0
  217. package/src/components/DataTable/DataTable.styles.ts +3 -0
  218. package/src/components/DataTable/DataTable.tsx +3 -3
  219. package/src/components/DataTable/Item/DataTableItem.styles.ts +7 -2
  220. package/src/components/DataTable/Item/DataTableItem.tsx +4 -60
  221. package/src/components/DataTable/index.ts +3 -1
  222. package/src/components/Form/AccessRights/AccessRights.cypress.spec.tsx +373 -0
  223. package/src/components/Form/AccessRights/AccessRights.stories.tsx +119 -0
  224. package/src/components/Form/AccessRights/AccessRights.styles.ts +10 -0
  225. package/src/components/Form/AccessRights/AccessRights.tsx +60 -0
  226. package/src/components/Form/AccessRights/Actions/Actions.styles.ts +14 -0
  227. package/src/components/Form/AccessRights/Actions/Actions.tsx +81 -0
  228. package/src/components/Form/AccessRights/Actions/useActions.ts +79 -0
  229. package/src/components/Form/AccessRights/List/Item.tsx +90 -0
  230. package/src/components/Form/AccessRights/List/List.styles.tsx +45 -0
  231. package/src/components/Form/AccessRights/List/List.tsx +52 -0
  232. package/src/components/Form/AccessRights/List/ListItemSkeleton.tsx +18 -0
  233. package/src/components/Form/AccessRights/List/ListSkeleton.tsx +22 -0
  234. package/src/components/Form/AccessRights/List/RemoveAccessRight.tsx +38 -0
  235. package/src/components/Form/AccessRights/List/StateChip.tsx +28 -0
  236. package/src/components/Form/AccessRights/List/useItem.ts +64 -0
  237. package/src/components/Form/AccessRights/Provider.tsx +15 -0
  238. package/src/components/Form/AccessRights/ShareInput/ContactSwitch.tsx +50 -0
  239. package/src/components/Form/AccessRights/ShareInput/ShareInput.styles.ts +17 -0
  240. package/src/components/Form/AccessRights/ShareInput/ShareInput.tsx +78 -0
  241. package/src/components/Form/AccessRights/ShareInput/useShareInput.tsx +113 -0
  242. package/src/components/Form/AccessRights/Stats/Stats.tsx +36 -0
  243. package/src/components/Form/AccessRights/atoms.ts +97 -0
  244. package/src/components/Form/AccessRights/common/RoleSelectField.styles.tsx +7 -0
  245. package/src/components/Form/AccessRights/common/RoleSelectField.tsx +45 -0
  246. package/src/components/Form/AccessRights/models.ts +55 -0
  247. package/src/components/Form/AccessRights/storiesData.ts +222 -0
  248. package/src/components/Form/AccessRights/useAccessRightsInitValues.ts +51 -0
  249. package/src/components/Form/Dashboard/DashboardDuplicationForm.tsx +85 -0
  250. package/src/components/Form/Dashboard/DashboardForm.tsx +15 -12
  251. package/src/components/Form/Dashboard/index.ts +1 -0
  252. package/src/components/Form/FormActions.tsx +7 -2
  253. package/src/components/Form/index.ts +2 -1
  254. package/src/components/ItemComposition/Item.tsx +1 -1
  255. package/src/components/ItemComposition/ItemComposition.cypress.spec.tsx +113 -0
  256. package/src/components/ItemComposition/ItemComposition.stories.tsx +14 -0
  257. package/src/components/ItemComposition/ItemComposition.styles.ts +36 -3
  258. package/src/components/ItemComposition/ItemComposition.tsx +41 -17
  259. package/src/components/Layout/PageLayout/PageLayout.tsx +1 -1
  260. package/src/components/Layout/PageLayout/PageLayoutActions.tsx +1 -0
  261. package/src/components/Layout/PageLayout/PageLayoutBody.tsx +1 -0
  262. package/src/components/Layout/PageLayout/PageLayoutHeader.tsx +5 -1
  263. package/src/components/Layout/PageLayout/PageQuickAccess.tsx +76 -0
  264. package/src/components/Layout/PageLayout/index.ts +3 -1
  265. package/src/components/Layout/PageLayout.cypress.spec.tsx +66 -0
  266. package/src/components/List/Item/ListItem.styles.ts +6 -0
  267. package/src/components/List/Item/ListItem.tsx +6 -4
  268. package/src/components/List/Item/Text.tsx +5 -3
  269. package/src/components/Menu/Button/MenuButton.tsx +4 -2
  270. package/src/components/Menu/MenuItem.tsx +5 -3
  271. package/src/components/Menu/MenuItems.tsx +4 -3
  272. package/src/components/Modal/ConfirmationModal/ConfirmationModal.cypress.spec.tsx +168 -0
  273. package/src/components/Modal/ConfirmationModal/ConfirmationModal.stories.tsx +62 -0
  274. package/src/components/Modal/ConfirmationModal/ConfirmationModal.tsx +87 -0
  275. package/src/components/Modal/Modal.styles.ts +10 -2
  276. package/src/components/Modal/ModalActions.tsx +4 -2
  277. package/src/components/Modal/index.ts +2 -0
  278. package/src/components/Tooltip/ConfirmationTooltip/ConfirmationTooltip.stories.tsx +3 -3
  279. package/src/components/Tooltip/ConfirmationTooltip/ConfirmationTooltip.tsx +1 -1
  280. package/src/components/Tooltip/ConfirmationTooltip/models.ts +1 -1
  281. package/src/components/Zoom/Minimap.tsx +127 -0
  282. package/src/components/Zoom/Zoom.cypress.spec.tsx +246 -0
  283. package/src/components/Zoom/Zoom.stories.tsx +115 -0
  284. package/src/components/Zoom/Zoom.styles.tsx +68 -0
  285. package/src/components/Zoom/Zoom.tsx +61 -0
  286. package/src/components/Zoom/ZoomContent.tsx +167 -0
  287. package/src/components/Zoom/constants.ts +2 -0
  288. package/src/components/Zoom/localPoint.ts +51 -0
  289. package/src/components/Zoom/models.ts +25 -0
  290. package/src/components/Zoom/useMinimap.ts +156 -0
  291. package/src/components/Zoom/useZoom.ts +70 -0
  292. package/src/components/Zoom/utils.ts +55 -0
  293. package/src/components/index.ts +1 -0
  294. package/src/fonts/roboto-bold-webfont.ttf +0 -0
  295. package/src/fonts/roboto-bold-webfont.woff +0 -0
  296. package/src/fonts/roboto-bold-webfont.woff2 +0 -0
  297. package/src/fonts/roboto-light-webfont.ttf +0 -0
  298. package/src/fonts/roboto-light-webfont.woff +0 -0
  299. package/src/fonts/roboto-light-webfont.woff2 +0 -0
  300. package/src/fonts/roboto-medium-webfont.ttf +0 -0
  301. package/src/fonts/roboto-medium-webfont.woff +0 -0
  302. package/src/fonts/roboto-medium-webfont.woff2 +0 -0
  303. package/src/fonts/roboto-regular-webfont.ttf +0 -0
  304. package/src/fonts/roboto-regular-webfont.woff +0 -0
  305. package/src/fonts/roboto-regular-webfont.woff2 +0 -0
  306. package/src/index.ts +6 -0
  307. package/src/queryParameters/url/index.ts +5 -1
  308. package/src/utils/index.ts +25 -22
  309. package/src/utils/useFullscreen/Fullscreen.cypress.spec.tsx +133 -0
  310. package/src/utils/useFullscreen/atoms.ts +3 -0
  311. package/src/utils/useFullscreen/index.ts +2 -0
  312. package/src/utils/useFullscreen/translatedLabels.ts +1 -0
  313. package/src/utils/useFullscreen/useFullscreen.ts +73 -0
  314. package/src/utils/useFullscreen/useFullscreenListener.ts +62 -0
  315. package/src/utils/useInfiniteScrollListing.ts +31 -8
  316. package/src/utils/{useLicenseExpirationWarning.cypress.spec.tsx → useLicenseExpirationWarning.test.tsx} +48 -37
  317. package/src/utils/useLicenseExpirationWarning.ts +18 -18
  318. package/src/utils/useLocale/index.ts +10 -0
  319. package/src/utils/useLocale/useLocale.cypress.spec.tsx +40 -0
  320. package/src/utils/useLocaleDateTimeFormat/index.ts +8 -2
  321. package/src/utils/usePluralizedTranslation.ts +21 -0
  322. package/src/@assets/icons/downtime.icon.svg +0 -1
  323. package/src/Graph/LineChart/BasicComponents/LoadingProgress.tsx +0 -46
  324. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/TooltipAnchorPoint.tsx +0 -96
  325. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/useTooltipAnchorPoint.ts +0 -107
  326. package/src/Graph/LineChart/Legend/InteractiveValue.tsx +0 -22
  327. package/src/Graph/LineChart/Legend/Marker.tsx +0 -43
  328. package/src/Graph/LineChart/Legend/useInteractiveValues.ts +0 -99
  329. package/src/Typography/FluidTypography/useFluidResizeObserver.ts +0 -56
  330. package/src/components/Form/AccessRights/AccessRights.resource.ts +0 -45
  331. package/src/components/Form/AccessRights/AccessRightsForm.stories.tsx +0 -59
  332. package/src/components/Form/AccessRights/AccessRightsForm.styles.ts +0 -21
  333. package/src/components/Form/AccessRights/AccessRightsForm.tsx +0 -67
  334. package/src/components/Form/AccessRights/AccessRightsFormActions.tsx +0 -80
  335. package/src/components/Form/AccessRights/Input/AddAction.tsx +0 -31
  336. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.stories.tsx +0 -54
  337. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.tsx +0 -72
  338. package/src/components/Form/AccessRights/Input/ContactAccessRightsInput.styles.ts +0 -22
  339. package/src/components/Form/AccessRights/Input/ContactInputField.tsx +0 -105
  340. package/src/components/Form/AccessRights/Input/RoleInputField.tsx +0 -29
  341. package/src/components/Form/AccessRights/List/ContactAccessRightsList.stories.tsx +0 -97
  342. package/src/components/Form/AccessRights/List/ContactAccessRightsList.styles.ts +0 -71
  343. package/src/components/Form/AccessRights/List/ContactAccessRightsList.tsx +0 -51
  344. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.stories.tsx +0 -116
  345. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.tsx +0 -118
  346. package/src/components/Form/AccessRights/List/ContactAccessRightsListItemSkeleton.tsx +0 -26
  347. package/src/components/Form/AccessRights/List/ContactAccessRightsListSkeleton.tsx +0 -28
  348. package/src/components/Form/AccessRights/Stats/AccessRightsStats.styles.ts +0 -18
  349. package/src/components/Form/AccessRights/Stats/AccessRightsStats.tsx +0 -41
  350. package/src/components/Form/AccessRights/__fixtures__/contactAccessRight.mock.ts +0 -52
  351. package/src/components/Form/AccessRights/common/GroupLabel.styles.ts +0 -18
  352. package/src/components/Form/AccessRights/common/GroupLabel.tsx +0 -15
  353. package/src/components/Form/AccessRights/common/Input.styles.ts +0 -48
  354. package/src/components/Form/AccessRights/common/RoleInputSelect.styles.ts +0 -11
  355. package/src/components/Form/AccessRights/common/RoleInputSelect.tsx +0 -57
  356. package/src/components/Form/AccessRights/index.ts +0 -3
  357. package/src/components/Form/AccessRights/useAccessRightsForm.test.tsx +0 -531
  358. package/src/components/Form/AccessRights/useAccessRightsForm.tsx +0 -282
  359. package/src/components/Form/AccessRights/useAccessRightsForm.utils.ts +0 -41
  360. package/src/screens/dashboard/DashboardsDetail.stories.tsx +0 -108
  361. package/src/screens/dashboard/DashboardsOverview.stories.tsx +0 -281
  362. package/src/utils/useDateTimePickerAdapter.ts +0 -309
  363. /package/{public → src/Button}/fonts/roboto-bold-webfont.ttf +0 -0
  364. /package/{public → src/Button}/fonts/roboto-bold-webfont.woff +0 -0
  365. /package/{public → src/Button}/fonts/roboto-bold-webfont.woff2 +0 -0
  366. /package/{public → src/Button}/fonts/roboto-light-webfont.ttf +0 -0
  367. /package/{public → src/Button}/fonts/roboto-light-webfont.woff +0 -0
  368. /package/{public → src/Button}/fonts/roboto-light-webfont.woff2 +0 -0
  369. /package/{public → src/Button}/fonts/roboto-medium-webfont.ttf +0 -0
  370. /package/{public → src/Button}/fonts/roboto-medium-webfont.woff +0 -0
  371. /package/{public → src/Button}/fonts/roboto-medium-webfont.woff2 +0 -0
  372. /package/{public → src/Button}/fonts/roboto-regular-webfont.ttf +0 -0
  373. /package/{public → src/Button}/fonts/roboto-regular-webfont.woff +0 -0
  374. /package/{public → src/Button}/fonts/roboto-regular-webfont.woff2 +0 -0
@@ -4,51 +4,49 @@ import { equals, isNil } from 'ramda';
4
4
  import { makeStyles } from 'tss-react/mui';
5
5
 
6
6
  import {
7
- TextField as MuiTextField,
7
+ Box,
8
8
  InputAdornment,
9
+ TextField as MuiTextField,
9
10
  TextFieldProps,
10
11
  Theme,
11
12
  Tooltip,
12
- Typography,
13
- Box
13
+ Typography
14
14
  } from '@mui/material';
15
15
 
16
16
  import { getNormalizedId } from '../../utils';
17
17
 
18
18
  import useAutoSize from './useAutoSize';
19
19
 
20
- const useStyles = makeStyles<{ displayAsBlock: boolean }>()(
21
- (theme: Theme, { displayAsBlock }) => ({
22
- autoSizeCompact: {
23
- paddingRight: theme.spacing(1),
24
- paddingTop: theme.spacing(0.6)
25
- },
26
- hiddenText: {
27
- display: 'table',
28
- lineHeight: 0,
29
- transform: 'scaleY(0)'
30
- },
31
- input: {
32
- fontSize: theme.typography.body1.fontSize
33
- },
34
- inputBase: {
35
- display: displayAsBlock ? 'block' : 'inline-flex',
36
- justifyItems: 'start',
37
- paddingRight: theme.spacing(1)
38
- },
39
- noLabelInput: {
40
- padding: theme.spacing(1)
41
- },
42
- textField: {
43
- transition: theme.transitions.create(['width'], {
44
- duration: theme.transitions.duration.shortest
45
- })
46
- },
47
- transparent: {
48
- backgroundColor: 'transparent'
49
- }
50
- })
51
- );
20
+ const useStyles = makeStyles()((theme: Theme) => ({
21
+ autoSizeCompact: {
22
+ paddingRight: theme.spacing(1),
23
+ paddingTop: theme.spacing(0.6)
24
+ },
25
+ hiddenText: {
26
+ display: 'table',
27
+ lineHeight: 0,
28
+ transform: 'scaleY(0)'
29
+ },
30
+ input: {
31
+ fontSize: theme.typography.body1.fontSize
32
+ },
33
+ inputBase: {
34
+ display: 'inline-flex',
35
+ justifyItems: 'start',
36
+ paddingRight: theme.spacing(1)
37
+ },
38
+ noLabelInput: {
39
+ padding: theme.spacing(1)
40
+ },
41
+ textField: {
42
+ transition: theme.transitions.create(['width'], {
43
+ duration: theme.transitions.duration.shortest
44
+ })
45
+ },
46
+ transparent: {
47
+ backgroundColor: 'transparent'
48
+ }
49
+ }));
52
50
 
53
51
  interface OptionalLabelInputAdornmentProps {
54
52
  children: React.ReactNode;
@@ -72,7 +70,7 @@ const OptionalLabelInputAdornment = ({
72
70
 
73
71
  type SizeVariant = 'large' | 'medium' | 'small' | 'compact';
74
72
 
75
- export type Props = {
73
+ export type TextProps = {
76
74
  EndAdornment?: React.FC;
77
75
  StartAdornment?: React.FC;
78
76
  ariaLabel?: string;
@@ -80,11 +78,13 @@ export type Props = {
80
78
  autoSizeCustomPadding?: number;
81
79
  autoSizeDefaultWidth?: number;
82
80
  className?: string;
81
+ containerClassName?: string;
83
82
  dataTestId: string;
84
83
  debounced?: boolean;
85
84
  displayErrorInTooltip?: boolean;
86
85
  error?: string;
87
86
  externalValueForAutoSize?: string;
87
+ forceUncontrolled?: boolean;
88
88
  open?: boolean;
89
89
  required?: boolean;
90
90
  size?: SizeVariant;
@@ -112,17 +112,20 @@ const TextField = forwardRef(
112
112
  autoSizeCustomPadding,
113
113
  defaultValue,
114
114
  required = false,
115
+ containerClassName,
116
+ type,
117
+ forceUncontrolled,
115
118
  ...rest
116
- }: Props,
119
+ }: TextProps,
117
120
  ref: React.ForwardedRef<HTMLDivElement>
118
121
  ): JSX.Element => {
119
- const { classes, cx } = useStyles({
120
- displayAsBlock: autoSize && isNil(StartAdornment) && isNil(EndAdornment)
121
- });
122
+ const { classes, cx } = useStyles();
122
123
 
123
124
  const { inputRef, width, changeInputValue, innerValue } = useAutoSize({
124
125
  autoSize,
125
- autoSizeCustomPadding,
126
+ autoSizeCustomPadding: equals(type, 'number')
127
+ ? Math.max(6, autoSizeCustomPadding || 0)
128
+ : autoSizeCustomPadding,
126
129
  autoSizeDefaultWidth,
127
130
  value: externalValueForAutoSize || rest.value
128
131
  });
@@ -130,7 +133,7 @@ const TextField = forwardRef(
130
133
  const tooltipTitle = displayErrorInTooltip && !isNil(error) ? error : '';
131
134
 
132
135
  const getValueProps = useCallback((): object => {
133
- if (debounced) {
136
+ if (debounced || forceUncontrolled) {
134
137
  return {};
135
138
  }
136
139
 
@@ -139,10 +142,13 @@ const TextField = forwardRef(
139
142
  }
140
143
 
141
144
  return { value: innerValue };
142
- }, [innerValue, debounced, defaultValue]);
145
+ }, [innerValue, debounced, defaultValue, forceUncontrolled]);
143
146
 
144
147
  return (
145
- <Box sx={{ width: autoSize ? 'auto' : '100%' }}>
148
+ <Box
149
+ className={containerClassName}
150
+ sx={{ width: autoSize ? 'auto' : '100%' }}
151
+ >
146
152
  <Tooltip placement="top" title={tooltipTitle}>
147
153
  <MuiTextField
148
154
  data-testid={dataTestId}
@@ -150,9 +156,9 @@ const TextField = forwardRef(
150
156
  helperText={displayErrorInTooltip ? undefined : error}
151
157
  id={getNormalizedId(dataTestId || '')}
152
158
  inputProps={{
153
- ...rest.inputProps,
154
159
  'aria-label': ariaLabel,
155
- 'data-testid': dataTestId
160
+ 'data-testid': dataTestId,
161
+ ...rest.inputProps
156
162
  }}
157
163
  label={label}
158
164
  ref={ref}
@@ -191,6 +197,7 @@ const TextField = forwardRef(
191
197
  width: autoSize ? width : undefined,
192
198
  ...rest?.sx
193
199
  }}
200
+ type={type}
194
201
  />
195
202
  </Tooltip>
196
203
  {autoSize && (
@@ -9,10 +9,9 @@ import Divider from '@mui/material/Divider';
9
9
 
10
10
  import { userAtom, ListingVariant } from '@centreon/ui-context';
11
11
 
12
- import { ListingProps } from '../..';
12
+ import { ListingProps, IconButton } from '../..';
13
13
  import { labelOf, labelRowsPerPage } from '../translatedLabels';
14
14
  import { useMemoComponent } from '../../utils';
15
- import IconButton from '../../Button/Icon/index';
16
15
 
17
16
  import StyledPagination from './Pagination';
18
17
  import PaginationActions from './PaginationActions';
@@ -29,6 +28,7 @@ const useStyles = makeStyles<StyleProps>()(
29
28
  paddingLeft: theme.spacing(1)
30
29
  },
31
30
  actions: {
31
+ flex: 1,
32
32
  padding: theme.spacing(1, 0)
33
33
  },
34
34
  container: {
@@ -175,14 +175,15 @@ const MemoListingActionBar = ({
175
175
  </IconButton>
176
176
  )}
177
177
  <div className={classes.ModeViewer} />
178
- {columnConfiguration?.selectedColumnIds && (
179
- <ColumnMultiSelect
180
- columnConfiguration={columnConfiguration}
181
- columns={columns}
182
- onResetColumns={onResetColumns}
183
- onSelectColumns={onSelectColumns}
184
- />
185
- )}
178
+ {columnConfiguration?.selectedColumnIds &&
179
+ columnConfiguration?.sortable && (
180
+ <ColumnMultiSelect
181
+ columnConfiguration={columnConfiguration}
182
+ columns={columns}
183
+ onResetColumns={onResetColumns}
184
+ onSelectColumns={onSelectColumns}
185
+ />
186
+ )}
186
187
  {paginated && (
187
188
  <StyledPagination
188
189
  ActionsComponent={PaginationActions}
@@ -8,6 +8,9 @@ const useStyles = makeStyles()((theme) => ({
8
8
  overflow: 'hidden',
9
9
  whiteSpace: 'nowrap'
10
10
  },
11
+ clickable: {
12
+ cursor: 'default'
13
+ },
11
14
  componentColumn: {
12
15
  width: theme.spacing(2.75)
13
16
  },
@@ -46,7 +46,7 @@ const DataCell = ({
46
46
  labelCollapse,
47
47
  labelExpand
48
48
  }: Props): JSX.Element | null => {
49
- const { classes } = useStyles();
49
+ const { classes, cx } = useStyles();
50
50
  const { dataStyle } = useStyleTable({ listingVariant });
51
51
 
52
52
  const commonCellProps = {
@@ -64,7 +64,7 @@ const DataCell = ({
64
64
 
65
65
  const cellByColumnType = {
66
66
  [ColumnType.string]: (): JSX.Element => {
67
- const { getFormattedString, isTruncated, getColSpan } = column;
67
+ const { getFormattedString, isTruncated, getColSpan, align } = column;
68
68
 
69
69
  const colSpan = getColSpan?.(isRowSelected);
70
70
 
@@ -87,6 +87,7 @@ const DataCell = ({
87
87
  isRowHighlighted={isRowHighlighted}
88
88
  listingVariant={listingVariant}
89
89
  style={{
90
+ alignItems: align,
90
91
  gridColumn
91
92
  }}
92
93
  {...commonCellProps}
@@ -99,7 +100,7 @@ const DataCell = ({
99
100
  );
100
101
  },
101
102
  [ColumnType.component]: (): JSX.Element | null => {
102
- const { getHiddenCondition, clickable } = column;
103
+ const { getHiddenCondition, clickable, align } = column;
103
104
  const Component = column.Component as (
104
105
  props: ComponentColumnProps
105
106
  ) => JSX.Element;
@@ -107,14 +108,31 @@ const DataCell = ({
107
108
  const isCellHidden = getHiddenCondition?.(isRowSelected);
108
109
 
109
110
  if (isCellHidden) {
110
- return null;
111
+ return (
112
+ <Cell
113
+ className={classes.cell}
114
+ isRowHighlighted={isRowHighlighted}
115
+ listingVariant={listingVariant}
116
+ onClick={(e): void => {
117
+ if (!clickable) {
118
+ return;
119
+ }
120
+ e.preventDefault();
121
+ e.stopPropagation();
122
+ }}
123
+ {...commonCellProps}
124
+ />
125
+ );
111
126
  }
112
127
 
113
128
  return (
114
129
  <Cell
115
- className={classes.cell}
130
+ className={cx(classes.cell, clickable && classes.clickable)}
116
131
  isRowHighlighted={isRowHighlighted}
117
132
  listingVariant={listingVariant}
133
+ style={{
134
+ alignItems: align
135
+ }}
118
136
  onClick={(e): void => {
119
137
  if (!clickable) {
120
138
  return;
@@ -71,7 +71,7 @@ const ListingHeader = ({
71
71
  });
72
72
 
73
73
  const getColumnById = (id: string): Column => {
74
- return find(propEq('id', id), columns) as Column;
74
+ return find(propEq(id, 'id'), columns) as Column;
75
75
  };
76
76
 
77
77
  const Content = React.useCallback(
@@ -1,4 +1,8 @@
1
- import { Button } from '@mui/material';
1
+ import { useState } from 'react';
2
+
3
+ import { Button, Typography } from '@mui/material';
4
+
5
+ import { ListingVariant } from '@centreon/ui-context';
2
6
 
3
7
  import { ColumnType } from './models';
4
8
 
@@ -12,20 +16,26 @@ const ButtonColumn = ({ row }: Props): JSX.Element => (
12
16
  <Button size="small">Click to reveal details about {row.name}</Button>
13
17
  );
14
18
 
15
- const generateSubItems = (parentIndex: number): Array<unknown> => {
19
+ const LargeText = (): JSX.Element => (
20
+ <Typography sx={{ whiteSpace: 'normal' }}>
21
+ This is a large text that fills the content
22
+ </Typography>
23
+ );
24
+
25
+ const tenElements = new Array(10).fill(0);
26
+
27
+ const generateSubItems = (): Array<unknown> => {
16
28
  return tenElements.map((__, subIndex) => ({
17
29
  active: false,
18
- description: `Sub item ${subIndex + (parentIndex + 10) * 10} description`,
30
+ description: `Sub item ${subIndex * 10} description`,
19
31
  disableCheckbox: false,
20
32
  disableRow: false,
21
- id: subIndex + (parentIndex + 10) * 10,
22
- name: `Sub Item ${subIndex + (parentIndex + 10) * 10}`,
33
+ id: subIndex * 10,
34
+ name: `Sub Item ${subIndex * 10}`,
23
35
  selected: false
24
36
  }));
25
37
  };
26
38
 
27
- const tenElements = new Array(10).fill(0);
28
-
29
39
  const listingWithSubItems = tenElements.map((_, index) => ({
30
40
  active: false,
31
41
  description: `Entity ${index}`,
@@ -34,9 +44,44 @@ const listingWithSubItems = tenElements.map((_, index) => ({
34
44
  id: index,
35
45
  name: `E${index}`,
36
46
  selected: false,
37
- subItems: index % 2 === 0 ? generateSubItems(index) : undefined
47
+ subItems: index % 2 === 0 ? generateSubItems() : undefined
38
48
  }));
39
49
 
50
+ const listingWithSubItems3Rows = Array(3)
51
+ .fill(0)
52
+ .map((_, index) => ({
53
+ active: false,
54
+ description: `Entity ${index}`,
55
+ disableCheckbox: false,
56
+ disableRow: false,
57
+ id: index,
58
+ name: `E${index}`,
59
+ selected: false,
60
+ subItems: index % 2 === 0 ? generateSubItems() : undefined
61
+ }));
62
+
63
+ const defaultColumn = [
64
+ {
65
+ getFormattedString: ({ name }): string => name,
66
+ id: 'name',
67
+ label: 'Name',
68
+ type: ColumnType.string
69
+ },
70
+ {
71
+ getFormattedString: ({ description }): string => description,
72
+ id: 'description',
73
+ label: 'Description',
74
+ type: ColumnType.string
75
+ },
76
+ {
77
+ Component: LargeText,
78
+ id: '#',
79
+ label: 'Custom',
80
+ type: ColumnType.component,
81
+ width: '100px'
82
+ }
83
+ ];
84
+
40
85
  const columnsWithSubItems = [
41
86
  {
42
87
  getFormattedString: ({ name }): string => name,
@@ -62,25 +107,19 @@ const columnsWithSubItems = [
62
107
 
63
108
  const expandedItems = [0, 8];
64
109
 
65
- const mountListing = (): void => {
110
+ const mountListingResponsive = (listingVariant: ListingVariant): void => {
66
111
  cy.viewport('macbook-13');
67
112
 
68
113
  cy.mount({
69
114
  Component: (
70
115
  <div style={{ height: '100vh' }}>
71
116
  <Listing
72
- checkable
73
- columns={columnsWithSubItems}
117
+ isResponsive
118
+ columns={defaultColumn}
74
119
  currentPage={1}
75
120
  limit={10}
121
+ listingVariant={listingVariant}
76
122
  rows={listingWithSubItems}
77
- subItems={{
78
- canCheckSubItems: false,
79
- enable: true,
80
- labelCollapse: 'Collapse',
81
- labelExpand: 'Expand',
82
- rowProperty: 'subItems'
83
- }}
84
123
  totalRows={10}
85
124
  />
86
125
  </div>
@@ -88,34 +127,180 @@ const mountListing = (): void => {
88
127
  });
89
128
  };
90
129
 
130
+ interface TestComponentProps {
131
+ canCheckSubItems?: boolean;
132
+ isSmallListing?: boolean;
133
+ }
134
+
135
+ const TestComponent = ({
136
+ isSmallListing = false,
137
+ canCheckSubItems = false
138
+ }: TestComponentProps): JSX.Element => {
139
+ const [selectedRows, setSelectedRows] = useState([]);
140
+
141
+ return (
142
+ <Listing
143
+ checkable
144
+ columns={columnsWithSubItems}
145
+ currentPage={1}
146
+ limit={10}
147
+ rows={isSmallListing ? listingWithSubItems3Rows : listingWithSubItems}
148
+ selectedRows={selectedRows}
149
+ subItems={{
150
+ canCheckSubItems,
151
+ enable: true,
152
+ getRowProperty: () => 'subItems',
153
+ labelCollapse: 'Collapse',
154
+ labelExpand: 'Expand'
155
+ }}
156
+ totalRows={10}
157
+ onSelectRows={setSelectedRows}
158
+ />
159
+ );
160
+ };
161
+
162
+ const mountListingForSubItems = ({
163
+ isSmallListing = false,
164
+ canCheckSubItems = false
165
+ }: TestComponentProps): void => {
166
+ cy.viewport('macbook-13');
167
+
168
+ cy.mount({
169
+ Component: (
170
+ <div style={{ height: '100vh' }}>
171
+ <TestComponent
172
+ canCheckSubItems={canCheckSubItems}
173
+ isSmallListing={isSmallListing}
174
+ />
175
+ </div>
176
+ )
177
+ });
178
+ };
179
+
91
180
  describe('Listing', () => {
92
- beforeEach(mountListing);
181
+ describe('Sub items', () => {
182
+ it('expands the row when the corresponding icon is clicked', () => {
183
+ mountListingForSubItems({});
93
184
 
94
- it('expands the row when the corresponding icon si clicked', () => {
95
- cy.contains('E0').should('be.visible');
185
+ cy.contains('E0').should('be.visible');
96
186
 
97
- expandedItems.forEach((index) => {
98
- const subItems = generateSubItems(index);
187
+ expandedItems.forEach((index) => {
188
+ const subItems = generateSubItems(index);
99
189
 
100
- cy.findByLabelText(`Expand ${index}`).click();
190
+ cy.findByLabelText(`Expand ${index}`).click();
101
191
 
102
- cy.findByLabelText(`Collapse ${index}`).should('exist');
192
+ cy.findByLabelText(`Collapse ${index}`).should('exist');
103
193
 
104
- subItems.forEach(({ name, description }) => {
105
- cy.contains(name).should('exist');
106
- cy.contains(description).should('exist');
194
+ subItems.forEach(({ name, description }) => {
195
+ cy.contains(name).should('exist');
196
+ cy.contains(description).should('exist');
197
+ });
198
+
199
+ cy.findByLabelText(`Collapse ${index}`).click();
107
200
  });
201
+
202
+ cy.makeSnapshot();
108
203
  });
109
204
 
110
- cy.makeSnapshot();
205
+ it('collapses the row when the corresponding icon is clicked', () => {
206
+ mountListingForSubItems({});
207
+
208
+ cy.findByLabelText(`Expand 0`).click();
209
+
210
+ cy.contains('Sub item 10').should('be.visible');
211
+
212
+ cy.findByLabelText('Collapse 0').click();
213
+
214
+ cy.contains('Sub item 10').should('not.exist');
215
+
216
+ cy.makeSnapshot();
217
+ });
218
+
219
+ it('displays only one row as hovered when mutilple rows are expanded and a sub item row is hovered', () => {
220
+ mountListingForSubItems({ isSmallListing: true });
221
+
222
+ cy.findByLabelText('Expand 2').click();
223
+ cy.findByLabelText('Expand 0').click();
224
+
225
+ cy.findByLabelText('Collapse 0').should('be.visible');
226
+ cy.findByLabelText('Collapse 2').should('be.visible');
227
+
228
+ cy.contains('Sub Item 0').realHover();
229
+
230
+ cy.get('[data-isHovered="true"]').should('have.length', 1);
231
+ cy.get('[data-isHovered="true"]').contains('Sub Item 0').should('exist');
232
+
233
+ cy.findByLabelText('Collapse 0').click();
234
+ cy.findByLabelText('Collapse 2').click();
235
+ });
236
+
237
+ it('selects displayed rows when a row is selected and another row is selected with the shift key', () => {
238
+ mountListingForSubItems({ canCheckSubItems: true, isSmallListing: true });
239
+
240
+ cy.findByLabelText('Expand 0').click();
241
+
242
+ cy.findByLabelText('Collapse 0').should('be.visible');
243
+
244
+ cy.findAllByLabelText('Select row 0').eq(0).click();
245
+ cy.get('body').type('{shift}', { release: false });
246
+ cy.findByLabelText('Select row 50').eq(0).click();
247
+
248
+ cy.findAllByLabelText('Select row 0').eq(0).should('be.checked');
249
+ cy.findAllByLabelText('Select row 0').eq(1).should('be.checked');
250
+ cy.findByLabelText('Select row 10').should('be.checked');
251
+ cy.findByLabelText('Select row 20').should('be.checked');
252
+ cy.findByLabelText('Select row 30').should('be.checked');
253
+ cy.findByLabelText('Select row 40').should('be.checked');
254
+ cy.findByLabelText('Select row 50').should('be.checked');
255
+
256
+ cy.findByLabelText('Collapse 0').click();
257
+ });
258
+
259
+ it('selects displayed rows when the corresponding checkbox is clicked', () => {
260
+ mountListingForSubItems({ canCheckSubItems: true, isSmallListing: true });
261
+
262
+ cy.findByLabelText('Expand 0').click();
263
+
264
+ cy.findByLabelText('Collapse 0').should('be.visible');
265
+
266
+ cy.findAllByLabelText('Select all').eq(0).click();
267
+
268
+ cy.findAllByLabelText('Select row 0').eq(0).should('be.checked');
269
+ tenElements.forEach((_, index) => {
270
+ if (index === 0) {
271
+ cy.findAllByLabelText('Select row 0').eq(1).should('be.checked');
272
+
273
+ return;
274
+ }
275
+ cy.findByLabelText(`Select row ${index * 10}`).should('be.checked');
276
+ });
277
+ cy.findByLabelText('Select row 1').should('be.checked');
278
+ cy.findByLabelText('Select row 2').should('be.checked');
279
+
280
+ cy.findByLabelText('Collapse 0').click();
281
+ });
111
282
  });
112
283
 
113
- it('collapses the row when the corresponding icon si clicked', () => {
114
- cy.contains('Sub item 100').should('be.visible');
284
+ it('displays the last column on several lines in compact mode when the isResponsive prop is set', () => {
285
+ mountListingResponsive(ListingVariant.compact);
286
+
287
+ cy.get('.MuiTable-root').should(
288
+ 'have.css',
289
+ 'grid-template-rows',
290
+ '30px 85px 85px 85px 85px 85px 85px 85px 85px 85px 85px'
291
+ );
292
+
293
+ cy.makeSnapshot();
294
+ });
115
295
 
116
- cy.findByLabelText('Collapse 0').click();
296
+ it('displays the last column on several lines in extended mode when the isResponsive prop is set', () => {
297
+ mountListingResponsive(ListingVariant.extended);
117
298
 
118
- cy.contains('Sub item 100').should('not.exist');
299
+ cy.get('.MuiTable-root').should(
300
+ 'have.css',
301
+ 'grid-template-rows',
302
+ '38px 85px 85px 85px 85px 85px 85px 85px 85px 85px 85px'
303
+ );
119
304
 
120
305
  cy.makeSnapshot();
121
306
  });
@@ -1,7 +1,5 @@
1
1
  import { makeStyles } from 'tss-react/mui';
2
2
 
3
- import { ListingVariant } from '@centreon/ui-context';
4
-
5
3
  import { TableStyleAtom as TableStyle } from './models';
6
4
 
7
5
  const loadingIndicatorHeight = 3;
@@ -9,13 +7,12 @@ const loadingIndicatorHeight = 3;
9
7
  interface StylesProps {
10
8
  dataStyle: TableStyle;
11
9
  getGridTemplateColumn: string;
12
- limit: number;
13
- listingVariant: ListingVariant;
10
+ isResponsive: string;
14
11
  rows: Array<unknown>;
15
12
  }
16
13
 
17
14
  const useListingStyles = makeStyles<StylesProps>()(
18
- (theme, { dataStyle, getGridTemplateColumn, rows, limit }) => ({
15
+ (theme, { dataStyle, getGridTemplateColumn, rows, isResponsive }) => ({
19
16
  actionBar: {
20
17
  alignItems: 'center',
21
18
  display: 'flex'
@@ -56,8 +53,8 @@ const useListingStyles = makeStyles<StylesProps>()(
56
53
  display: 'grid',
57
54
  gridTemplateColumns: getGridTemplateColumn,
58
55
  gridTemplateRows: `${theme.spacing(dataStyle.header.height / 8)} repeat(${
59
- rows?.length || limit
60
- }, ${dataStyle.body.height}px)`,
56
+ rows?.length || 1
57
+ }, ${isResponsive ? 'auto' : `${dataStyle.body.height}px`})`,
61
58
  position: 'relative'
62
59
  },
63
60
  tableBody: {
@@ -197,7 +197,7 @@ const Row = memo<RowProps>(
197
197
  }
198
198
  );
199
199
 
200
- const IntersectionRow = (props: Props): JSX.Element => {
200
+ const IntersectionRow = ({ isHovered, ...rest }: Props): JSX.Element => {
201
201
  const rowRef = useRef<HTMLDivElement | null>(null);
202
202
  const theme = useTheme();
203
203
  const { isInViewport, setElement } = useViewportIntersection({
@@ -214,8 +214,12 @@ const IntersectionRow = (props: Props): JSX.Element => {
214
214
  }, [getFirstCellElement()]);
215
215
 
216
216
  return (
217
- <div className={classes.intersectionRow} ref={rowRef}>
218
- <Row {...props} isInViewport={isInViewport} />
217
+ <div
218
+ className={classes.intersectionRow}
219
+ data-isHovered={isHovered}
220
+ ref={rowRef}
221
+ >
222
+ <Row {...rest} isHovered={isHovered} isInViewport={isInViewport} />
219
223
  </div>
220
224
  );
221
225
  };