@centreon/ui 24.4.1-sync-release-34022.1 → 24.4.1-test-code-coverage.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 (220) hide show
  1. package/package.json +48 -40
  2. package/src/ActionsList/ActionsList.styles.ts +40 -71
  3. package/src/Button/Icon/index.stories.tsx +1 -1
  4. package/src/Button/Icon/index.tsx +1 -1
  5. package/src/Dashboard/Dashboard.styles.ts +6 -5
  6. package/src/Dialog/Confirm/index.tsx +10 -2
  7. package/src/Dialog/UnsavedChanges/index.tsx +21 -20
  8. package/src/Dialog/UnsavedChanges/translatedLabels.ts +4 -6
  9. package/src/Dialog/index.tsx +8 -1
  10. package/src/Form/Inputs/CheckboxGroup.tsx +4 -1
  11. package/src/Form/Inputs/Text.tsx +3 -1
  12. package/src/Form/Inputs/models.ts +1 -0
  13. package/src/Graph/BarStack/BarStack.cypress.spec.tsx +139 -0
  14. package/src/Graph/BarStack/BarStack.stories.tsx +123 -0
  15. package/src/Graph/BarStack/BarStack.styles.ts +37 -0
  16. package/src/Graph/BarStack/BarStack.tsx +14 -0
  17. package/src/Graph/BarStack/ResponsiveBarStack.tsx +209 -0
  18. package/src/Graph/BarStack/index.ts +1 -0
  19. package/src/Graph/BarStack/models.ts +19 -0
  20. package/src/Graph/BarStack/useResponsiveBarStack.ts +131 -0
  21. package/src/Graph/Gauge/Gauge.cypress.spec.tsx +102 -0
  22. package/src/Graph/Gauge/Gauge.tsx +1 -1
  23. package/src/Graph/HeatMap/HeatMap.cypress.spec.tsx +145 -0
  24. package/src/Graph/HeatMap/HeatMap.stories.tsx +0 -25
  25. package/src/Graph/HeatMap/ResponsiveHeatMap.tsx +8 -2
  26. package/src/Graph/Legend/Legend.tsx +21 -0
  27. package/src/Graph/Legend/index.ts +1 -0
  28. package/src/Graph/Legend/models.ts +11 -0
  29. package/src/Graph/LineChart/BasicComponents/Lines/Threshold/index.tsx +4 -5
  30. package/src/Graph/LineChart/BasicComponents/ThresholdLine.tsx +3 -1
  31. package/src/Graph/LineChart/Header/index.tsx +3 -31
  32. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/useTickGraph.ts +9 -11
  33. package/src/Graph/LineChart/InteractiveComponents/Annotations/Annotation/index.tsx +3 -2
  34. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/GraphValueTooltip.tsx +68 -0
  35. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltip.ts +27 -0
  36. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltipStyles.ts +31 -0
  37. package/src/Graph/LineChart/InteractiveComponents/index.tsx +132 -17
  38. package/src/Graph/LineChart/InteractiveComponents/interactionWithGraphAtoms.ts +7 -27
  39. package/src/Graph/LineChart/Legend/Legend.styles.ts +5 -9
  40. package/src/Graph/LineChart/Legend/LegendHeader.tsx +10 -22
  41. package/src/Graph/LineChart/Legend/index.tsx +17 -55
  42. package/src/Graph/LineChart/LineChart.cypress.spec.tsx +91 -0
  43. package/src/Graph/LineChart/LineChart.styles.ts +8 -0
  44. package/src/Graph/LineChart/LineChart.tsx +106 -116
  45. package/src/Graph/LineChart/LoadingSkeleton.tsx +2 -2
  46. package/src/Graph/LineChart/index.tsx +6 -7
  47. package/src/Graph/LineChart/mockedData/lastDayWithIncompleteValues.json +1320 -0
  48. package/src/Graph/LineChart/mockedData/lastDayWithNullValues.json +1314 -0
  49. package/src/Graph/LineChart/models.ts +12 -1
  50. package/src/Graph/PieChart/PieChart.cypress.spec.tsx +154 -0
  51. package/src/Graph/PieChart/PieChart.stories.tsx +194 -0
  52. package/src/Graph/PieChart/PieChart.styles.ts +39 -0
  53. package/src/Graph/PieChart/PieChart.tsx +14 -0
  54. package/src/Graph/PieChart/ResponsivePie.tsx +243 -0
  55. package/src/Graph/PieChart/index.ts +1 -0
  56. package/src/Graph/PieChart/models.ts +19 -0
  57. package/src/Graph/PieChart/useResponsivePie.ts +81 -0
  58. package/src/Graph/SingleBar/SingleBar.cypress.spec.tsx +121 -0
  59. package/src/Graph/Text/Text.cypress.spec.tsx +101 -0
  60. package/src/Graph/Text/Text.styles.ts +12 -1
  61. package/src/Graph/Text/Text.tsx +17 -12
  62. package/src/Graph/Tree/DescendantNodes.tsx +89 -0
  63. package/src/Graph/Tree/Links.tsx +77 -0
  64. package/src/Graph/Tree/StandaloneTree.tsx +32 -0
  65. package/src/Graph/Tree/Tree.cypress.spec.tsx +195 -0
  66. package/src/Graph/Tree/Tree.stories.tsx +160 -0
  67. package/src/Graph/Tree/Tree.tsx +116 -0
  68. package/src/Graph/Tree/constants.ts +2 -0
  69. package/src/Graph/Tree/index.ts +4 -0
  70. package/src/Graph/Tree/models.ts +55 -0
  71. package/src/Graph/Tree/stories/contents.tsx +164 -0
  72. package/src/Graph/Tree/stories/datas.ts +305 -0
  73. package/src/Graph/Tree/utils.ts +49 -0
  74. package/src/Graph/common/testUtils.ts +71 -0
  75. package/src/Graph/common/timeSeries/index.ts +50 -12
  76. package/src/Graph/common/utils.ts +19 -0
  77. package/src/Graph/index.ts +4 -0
  78. package/src/InputField/Number/Number.cypress.spec.tsx +85 -0
  79. package/src/InputField/Number/Number.stories.tsx +66 -0
  80. package/src/InputField/Number/Number.tsx +74 -0
  81. package/src/InputField/Search/index.tsx +2 -2
  82. package/src/InputField/Select/Autocomplete/Multi/index.tsx +4 -2
  83. package/src/InputField/Select/Autocomplete/index.tsx +10 -3
  84. package/src/InputField/Select/IconPopover/index.tsx +1 -1
  85. package/src/InputField/Select/index.tsx +14 -1
  86. package/src/InputField/Text/index.tsx +38 -38
  87. package/src/Listing/ActionBar/index.tsx +10 -10
  88. package/src/Listing/Cell/DataCell.styles.ts +3 -0
  89. package/src/Listing/Cell/DataCell.tsx +8 -4
  90. package/src/Listing/Listing.cypress.spec.tsx +217 -33
  91. package/src/Listing/Listing.styles.ts +3 -5
  92. package/src/Listing/Row/Row.tsx +7 -3
  93. package/src/Listing/index.stories.tsx +25 -2
  94. package/src/Listing/index.test.tsx +1 -1
  95. package/src/Listing/index.tsx +202 -143
  96. package/src/Listing/models.ts +1 -0
  97. package/src/Listing/useStyleTable.ts +1 -0
  98. package/src/Panel/index.tsx +1 -1
  99. package/src/PopoverMenu/index.tsx +6 -5
  100. package/src/ThemeProvider/index.tsx +3 -0
  101. package/src/TimePeriods/CustomTimePeriod/CompactCustomTimePeriod.styles.ts +6 -7
  102. package/src/TimePeriods/ResolutionTimePeriod.cypress.spec.tsx +12 -9
  103. package/src/Typography/FluidTypography/FluidTypography.cypress.spec.tsx +27 -0
  104. package/src/Typography/FluidTypography/index.stories.tsx +2 -2
  105. package/src/Typography/FluidTypography/index.tsx +21 -28
  106. package/src/api/index.ts +3 -3
  107. package/src/api/useGraphQuery/index.ts +26 -5
  108. package/src/api/useGraphQuery/models.ts +5 -0
  109. package/src/api/useMutationQuery/index.test.ts +4 -4
  110. package/src/api/useMutationQuery/index.ts +24 -13
  111. package/src/components/CollapsibleItem/CollapsibleItem.cypress.spec.tsx +76 -0
  112. package/src/components/CollapsibleItem/CollapsibleItem.stories.tsx +26 -0
  113. package/src/components/CollapsibleItem/CollapsibleItem.tsx +43 -14
  114. package/src/components/CollapsibleItem/useCollapsibleItemStyles.ts +24 -1
  115. package/src/components/DataTable/DataTable.cypress.spec.tsx +14 -33
  116. package/src/components/DataTable/Item/DataTableItem.tsx +4 -60
  117. package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.cypress.spec.tsx +36 -13
  118. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ContactSwitch.tsx +11 -3
  119. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ShareInput.styles.ts +8 -0
  120. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ShareInput.tsx +1 -0
  121. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/useShareInput.tsx +4 -0
  122. package/src/components/Form/{AccessRightsV2 → AccessRights}/models.ts +1 -0
  123. package/src/components/Form/{AccessRightsV2 → AccessRights}/storiesData.ts +23 -22
  124. package/src/components/Form/Dashboard/DashboardDuplicationForm.tsx +85 -0
  125. package/src/components/Form/Dashboard/index.ts +1 -0
  126. package/src/components/Form/FormActions.tsx +7 -2
  127. package/src/components/Form/index.ts +2 -2
  128. package/src/components/ItemComposition/Item.tsx +1 -1
  129. package/src/components/ItemComposition/ItemComposition.cypress.spec.tsx +113 -0
  130. package/src/components/ItemComposition/ItemComposition.stories.tsx +14 -0
  131. package/src/components/ItemComposition/ItemComposition.styles.ts +36 -3
  132. package/src/components/ItemComposition/ItemComposition.tsx +41 -17
  133. package/src/components/List/Item/ListItem.tsx +3 -3
  134. package/src/components/Modal/ConfirmationModal/ConfirmationModal.cypress.spec.tsx +168 -0
  135. package/src/components/Modal/ConfirmationModal/ConfirmationModal.stories.tsx +62 -0
  136. package/src/components/Modal/ConfirmationModal/ConfirmationModal.tsx +87 -0
  137. package/src/components/Modal/Modal.styles.ts +8 -3
  138. package/src/components/Modal/index.ts +2 -0
  139. package/src/components/Tooltip/ConfirmationTooltip/ConfirmationTooltip.stories.tsx +3 -3
  140. package/src/components/Tooltip/ConfirmationTooltip/ConfirmationTooltip.tsx +1 -1
  141. package/src/components/Tooltip/ConfirmationTooltip/models.ts +1 -1
  142. package/src/components/Zoom/Minimap.tsx +129 -0
  143. package/src/components/Zoom/Zoom.cypress.spec.tsx +246 -0
  144. package/src/components/Zoom/Zoom.stories.tsx +115 -0
  145. package/src/components/Zoom/Zoom.styles.tsx +68 -0
  146. package/src/components/Zoom/Zoom.tsx +64 -0
  147. package/src/components/Zoom/ZoomContent.tsx +170 -0
  148. package/src/components/Zoom/constants.ts +2 -0
  149. package/src/components/Zoom/localPoint.ts +51 -0
  150. package/src/components/Zoom/models.ts +25 -0
  151. package/src/components/Zoom/useMinimap.ts +156 -0
  152. package/src/components/Zoom/useZoom.ts +70 -0
  153. package/src/components/Zoom/utils.ts +55 -0
  154. package/src/components/index.ts +1 -0
  155. package/src/index.ts +1 -0
  156. package/src/utils/index.ts +3 -0
  157. package/src/utils/resourcesStatusURL.ts +166 -0
  158. package/src/utils/useFullscreen/Fullscreen.cypress.spec.tsx +130 -0
  159. package/src/utils/useFullscreen/atoms.ts +3 -0
  160. package/src/utils/useFullscreen/index.ts +2 -0
  161. package/src/utils/useFullscreen/translatedLabels.ts +1 -0
  162. package/src/utils/useFullscreen/useFullscreen.ts +73 -0
  163. package/src/utils/useFullscreen/useFullscreenListener.ts +62 -0
  164. package/src/utils/useInfiniteScrollListing.ts +4 -1
  165. package/src/Graph/LineChart/BasicComponents/LoadingProgress.tsx +0 -46
  166. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/TooltipAnchorPoint.tsx +0 -96
  167. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/useTooltipAnchorPoint.ts +0 -107
  168. package/src/Graph/LineChart/Legend/InteractiveValue.tsx +0 -22
  169. package/src/Graph/LineChart/Legend/useInteractiveValues.ts +0 -99
  170. package/src/Typography/FluidTypography/useFluidResizeObserver.ts +0 -56
  171. package/src/components/Form/AccessRights/AccessRights.resource.ts +0 -45
  172. package/src/components/Form/AccessRights/AccessRightsForm.stories.tsx +0 -59
  173. package/src/components/Form/AccessRights/AccessRightsForm.styles.ts +0 -21
  174. package/src/components/Form/AccessRights/AccessRightsForm.tsx +0 -67
  175. package/src/components/Form/AccessRights/AccessRightsFormActions.tsx +0 -80
  176. package/src/components/Form/AccessRights/Input/AddAction.tsx +0 -31
  177. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.stories.tsx +0 -54
  178. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.tsx +0 -72
  179. package/src/components/Form/AccessRights/Input/ContactAccessRightsInput.styles.ts +0 -22
  180. package/src/components/Form/AccessRights/Input/ContactInputField.tsx +0 -105
  181. package/src/components/Form/AccessRights/Input/RoleInputField.tsx +0 -29
  182. package/src/components/Form/AccessRights/List/ContactAccessRightsList.stories.tsx +0 -97
  183. package/src/components/Form/AccessRights/List/ContactAccessRightsList.styles.ts +0 -71
  184. package/src/components/Form/AccessRights/List/ContactAccessRightsList.tsx +0 -51
  185. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.stories.tsx +0 -116
  186. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.tsx +0 -118
  187. package/src/components/Form/AccessRights/List/ContactAccessRightsListItemSkeleton.tsx +0 -26
  188. package/src/components/Form/AccessRights/List/ContactAccessRightsListSkeleton.tsx +0 -28
  189. package/src/components/Form/AccessRights/Stats/AccessRightsStats.styles.ts +0 -18
  190. package/src/components/Form/AccessRights/Stats/AccessRightsStats.tsx +0 -41
  191. package/src/components/Form/AccessRights/__fixtures__/contactAccessRight.mock.ts +0 -54
  192. package/src/components/Form/AccessRights/common/GroupLabel.styles.ts +0 -18
  193. package/src/components/Form/AccessRights/common/GroupLabel.tsx +0 -15
  194. package/src/components/Form/AccessRights/common/Input.styles.ts +0 -48
  195. package/src/components/Form/AccessRights/common/RoleInputSelect.styles.ts +0 -11
  196. package/src/components/Form/AccessRights/common/RoleInputSelect.tsx +0 -57
  197. package/src/components/Form/AccessRights/index.ts +0 -3
  198. package/src/components/Form/AccessRights/useAccessRightsForm.test.tsx +0 -531
  199. package/src/components/Form/AccessRights/useAccessRightsForm.tsx +0 -282
  200. package/src/components/Form/AccessRights/useAccessRightsForm.utils.ts +0 -41
  201. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.stories.tsx +0 -0
  202. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.styles.ts +0 -0
  203. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.tsx +0 -0
  204. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/Actions.styles.ts +0 -0
  205. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/Actions.tsx +0 -0
  206. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/useActions.ts +0 -0
  207. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/Item.tsx +0 -0
  208. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/List.styles.tsx +0 -0
  209. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/List.tsx +0 -0
  210. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/ListItemSkeleton.tsx +0 -0
  211. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/ListSkeleton.tsx +0 -0
  212. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/RemoveAccessRight.tsx +0 -0
  213. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/StateChip.tsx +0 -0
  214. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/useItem.ts +0 -0
  215. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Provider.tsx +0 -0
  216. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Stats/Stats.tsx +0 -0
  217. /package/src/components/Form/{AccessRightsV2 → AccessRights}/atoms.ts +0 -0
  218. /package/src/components/Form/{AccessRightsV2 → AccessRights}/common/RoleSelectField.styles.tsx +0 -0
  219. /package/src/components/Form/{AccessRightsV2 → AccessRights}/common/RoleSelectField.tsx +0 -0
  220. /package/src/components/Form/{AccessRightsV2 → AccessRights}/useAccessRightsInitValues.ts +0 -0
@@ -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
- getRowProperty: () => 'subItems',
81
- labelCollapse: 'Collapse',
82
- labelExpand: 'Expand'
83
- }}
84
123
  totalRows={10}
85
124
  />
86
125
  </div>
@@ -88,34 +127,179 @@ 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();
191
+ cy.findByLabelText(`Collapse ${index}`).should('exist');
101
192
 
102
- cy.findByLabelText(`Collapse ${index}`).should('exist');
193
+ subItems.forEach(({ name, description }) => {
194
+ cy.contains(name).should('exist');
195
+ cy.contains(description).should('exist');
196
+ });
103
197
 
104
- subItems.forEach(({ name, description }) => {
105
- cy.contains(name).should('exist');
106
- cy.contains(description).should('exist');
198
+ cy.findByLabelText(`Collapse ${index}`).click();
107
199
  });
200
+
201
+ cy.makeSnapshot();
108
202
  });
109
203
 
110
- cy.makeSnapshot();
204
+ it('collapses the row when the corresponding icon is clicked', () => {
205
+ mountListingForSubItems({});
206
+
207
+ cy.findByLabelText(`Expand 0`).click();
208
+
209
+ cy.contains('Sub item 10').should('be.visible');
210
+
211
+ cy.findByLabelText('Collapse 0').click();
212
+
213
+ cy.contains('Sub item 10').should('not.exist');
214
+
215
+ cy.makeSnapshot();
216
+ });
217
+
218
+ it('displays only one row as hovered when mutilple rows are expanded and a sub item row is hovered', () => {
219
+ mountListingForSubItems({ isSmallListing: true });
220
+
221
+ cy.findByLabelText('Expand 2').click();
222
+ cy.findByLabelText('Expand 0').click();
223
+
224
+ cy.findByLabelText('Collapse 0').should('be.visible');
225
+ cy.findByLabelText('Collapse 2').should('be.visible');
226
+
227
+ cy.contains('Sub Item 0').realHover();
228
+
229
+ cy.get('[data-isHovered="true"]').should('have.length', 1);
230
+ cy.get('[data-isHovered="true"]').contains('Sub Item 0').should('exist');
231
+
232
+ cy.findByLabelText('Collapse 0').click();
233
+ cy.findByLabelText('Collapse 2').click();
234
+ });
235
+
236
+ it('selects displayed rows when a row is selected and another row is selected with the shift key', () => {
237
+ mountListingForSubItems({ canCheckSubItems: true, isSmallListing: true });
238
+
239
+ cy.findByLabelText('Expand 0').click();
240
+
241
+ cy.findByLabelText('Collapse 0').should('be.visible');
242
+
243
+ cy.findAllByLabelText('Select row 0').eq(0).click();
244
+ cy.get('body').type('{shift}', { release: false });
245
+ cy.findByLabelText('Select row 50').eq(0).click();
246
+
247
+ cy.findAllByLabelText('Select row 0').eq(0).should('be.checked');
248
+ cy.findAllByLabelText('Select row 0').eq(1).should('be.checked');
249
+ cy.findByLabelText('Select row 10').should('be.checked');
250
+ cy.findByLabelText('Select row 20').should('be.checked');
251
+ cy.findByLabelText('Select row 30').should('be.checked');
252
+ cy.findByLabelText('Select row 40').should('be.checked');
253
+ cy.findByLabelText('Select row 50').should('be.checked');
254
+
255
+ cy.findByLabelText('Collapse 0').click();
256
+ });
257
+
258
+ it('selects displayed rows when the corresponding checkbox is clicked', () => {
259
+ mountListingForSubItems({ canCheckSubItems: true, isSmallListing: true });
260
+
261
+ cy.findByLabelText('Expand 0').click();
262
+
263
+ cy.findByLabelText('Collapse 0').should('be.visible');
264
+
265
+ cy.findAllByLabelText('Select all').eq(0).click();
266
+
267
+ cy.findAllByLabelText('Select row 0').eq(0).should('be.checked');
268
+ tenElements.forEach((_, index) => {
269
+ if (index === 0) {
270
+ cy.findAllByLabelText('Select row 0').eq(1).should('be.checked');
271
+
272
+ return;
273
+ }
274
+ cy.findByLabelText(`Select row ${index * 10}`).should('be.checked');
275
+ });
276
+ cy.findByLabelText('Select row 1').should('be.checked');
277
+ cy.findByLabelText('Select row 2').should('be.checked');
278
+
279
+ cy.findByLabelText('Collapse 0').click();
280
+ });
111
281
  });
112
282
 
113
- it('collapses the row when the corresponding icon si clicked', () => {
114
- cy.contains('Sub item 100').should('be.visible');
283
+ it('displays the last column on several lines in compact mode when the isResponsive prop is set', () => {
284
+ mountListingResponsive(ListingVariant.compact);
285
+
286
+ cy.get('.MuiTable-root').should(
287
+ 'have.css',
288
+ 'grid-template-rows',
289
+ '30px 85px 85px 85px 85px 85px 85px 85px 85px 85px 85px'
290
+ );
291
+
292
+ cy.makeSnapshot();
293
+ });
115
294
 
116
- cy.findByLabelText('Collapse 0').click();
295
+ it('displays the last column on several lines in extended mode when the isResponsive prop is set', () => {
296
+ mountListingResponsive(ListingVariant.extended);
117
297
 
118
- cy.contains('Sub item 100').should('not.exist');
298
+ cy.get('.MuiTable-root').should(
299
+ 'have.css',
300
+ 'grid-template-rows',
301
+ '38px 85px 85px 85px 85px 85px 85px 85px 85px 85px 85px'
302
+ );
119
303
 
120
304
  cy.makeSnapshot();
121
305
  });
@@ -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,12 +7,12 @@ const loadingIndicatorHeight = 3;
9
7
  interface StylesProps {
10
8
  dataStyle: TableStyle;
11
9
  getGridTemplateColumn: string;
12
- listingVariant: ListingVariant;
10
+ isResponsive: string;
13
11
  rows: Array<unknown>;
14
12
  }
15
13
 
16
14
  const useListingStyles = makeStyles<StylesProps>()(
17
- (theme, { dataStyle, getGridTemplateColumn, rows }) => ({
15
+ (theme, { dataStyle, getGridTemplateColumn, rows, isResponsive }) => ({
18
16
  actionBar: {
19
17
  alignItems: 'center',
20
18
  display: 'flex'
@@ -56,7 +54,7 @@ const useListingStyles = makeStyles<StylesProps>()(
56
54
  gridTemplateColumns: getGridTemplateColumn,
57
55
  gridTemplateRows: `${theme.spacing(dataStyle.header.height / 8)} repeat(${
58
56
  rows?.length || 1
59
- }, ${dataStyle.body.height}px)`,
57
+ }, ${isResponsive ? 'auto' : `${dataStyle.body.height}px`})`,
60
58
  position: 'relative'
61
59
  },
62
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
  };
@@ -40,7 +40,7 @@ const useStyles = makeStyles()((theme) => ({
40
40
  }));
41
41
 
42
42
  const ComponentColumn = ({ row, isSelected }): JSX.Element => (
43
- <>
43
+ <div style={{ display: 'flex', flexDirection: 'row', flexWrap: 'wrap' }}>
44
44
  <span>
45
45
  {'I am '}
46
46
  <b>{`${isSelected ? 'selected' : 'not selected'}`}</b>
@@ -50,7 +50,7 @@ const ComponentColumn = ({ row, isSelected }): JSX.Element => (
50
50
  {'I am '}
51
51
  <b>{`${row.active ? 'active' : 'not active'}`}</b>
52
52
  </span>
53
- </>
53
+ </div>
54
54
  );
55
55
 
56
56
  const ButtonColumn = ({ row }): JSX.Element => (
@@ -395,3 +395,26 @@ export const ListingWithSubItems = {
395
395
  },
396
396
  render: TemplateSubItems
397
397
  };
398
+
399
+ export const ListingWithResponsive = {
400
+ args: {
401
+ checkable: true,
402
+ columns: [
403
+ ...defaultColumns,
404
+ {
405
+ Component: ComponentColumn,
406
+ id: '##',
407
+ label: 'Responsive',
408
+ type: ColumnType.component,
409
+ width: '140px'
410
+ }
411
+ ],
412
+ currentPage: 1,
413
+ isResponsive: true,
414
+ limit: 10,
415
+ loading: false,
416
+ rows: listingWithSubItems,
417
+ totalRows: 10
418
+ },
419
+ render: TemplateSubItems
420
+ };
@@ -216,7 +216,7 @@ describe('Listing', () => {
216
216
  <Listing
217
217
  columnConfiguration={{
218
218
  selectedColumnIds: columns.map(prop('id')),
219
- sortable: false
219
+ sortable: true
220
220
  }}
221
221
  columns={columns}
222
222
  rows={rows}