@centreon/ui 25.3.4 → 25.4.0-MON-191119-npm-develop.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 (176) hide show
  1. package/package.json +25 -11
  2. package/public/mockServiceWorker.js +8 -31
  3. package/src/Button/Save/index.stories.tsx +1 -0
  4. package/src/Checkbox/Checkbox.tsx +3 -1
  5. package/src/Checkbox/CheckboxGroup/index.tsx +6 -1
  6. package/src/Colors/index.tsx +1 -1
  7. package/src/Dashboard/Dashboard.styles.ts +1 -1
  8. package/src/Dashboard/Layout.tsx +1 -1
  9. package/src/Dialog/UnsavedChanges/index.stories.tsx +1 -0
  10. package/src/Form/CollapsibleGroup.tsx +13 -13
  11. package/src/Form/Form.cypress.spec.tsx +137 -2
  12. package/src/Form/Form.stories.tsx +11 -31
  13. package/src/Form/Form.tsx +2 -0
  14. package/src/Form/Inputs/Checkbox.tsx +3 -2
  15. package/src/Form/Inputs/ConnectedAutocomplete.tsx +6 -1
  16. package/src/Form/Inputs/Grid.tsx +18 -29
  17. package/src/Form/Inputs/SubGroupDivider.tsx +7 -0
  18. package/src/Form/Inputs/Text.tsx +1 -0
  19. package/src/Form/Inputs/index.tsx +31 -24
  20. package/src/Form/Inputs/models.ts +8 -1
  21. package/src/Form/Section/FormSection.tsx +34 -0
  22. package/src/Form/Section/PanelTabs.tsx +13 -0
  23. package/src/Form/Section/navigateToSection.ts +9 -0
  24. package/src/Form/storiesData.tsx +14 -4
  25. package/src/Graph/BarChart/BarChart.cypress.spec.tsx +46 -6
  26. package/src/Graph/BarChart/BarChart.stories.tsx +60 -0
  27. package/src/Graph/BarChart/BarChart.tsx +56 -32
  28. package/src/Graph/BarChart/BarGroup.tsx +22 -32
  29. package/src/Graph/BarChart/MemoizedGroup.tsx +8 -11
  30. package/src/Graph/BarChart/ResponsiveBarChart.tsx +145 -32
  31. package/src/Graph/BarChart/Tooltip/BarChartTooltip.tsx +2 -2
  32. package/src/Graph/Chart/BasicComponents/Lines/StackedLines/index.tsx +7 -1
  33. package/src/Graph/Chart/BasicComponents/Lines/StackedLines/useStackedLines.ts +18 -45
  34. package/src/Graph/Chart/BasicComponents/Lines/index.tsx +42 -28
  35. package/src/Graph/Chart/Chart.cypress.spec.tsx +85 -15
  36. package/src/Graph/Chart/Chart.stories.tsx +84 -1
  37. package/src/Graph/Chart/Chart.tsx +17 -4
  38. package/src/Graph/Chart/InteractiveComponents/AnchorPoint/RegularAnchorPoint.tsx +8 -2
  39. package/src/Graph/Chart/InteractiveComponents/AnchorPoint/StackedAnchorPoint.tsx +10 -3
  40. package/src/Graph/Chart/InteractiveComponents/AnchorPoint/useTickGraph.ts +19 -2
  41. package/src/Graph/Chart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltip.ts +2 -4
  42. package/src/Graph/Chart/InteractiveComponents/ZoomPreview/index.tsx +14 -3
  43. package/src/Graph/Chart/InteractiveComponents/ZoomPreview/models.ts +3 -0
  44. package/src/Graph/Chart/InteractiveComponents/ZoomPreview/useZoomPreview.ts +12 -10
  45. package/src/Graph/Chart/InteractiveComponents/index.tsx +63 -5
  46. package/src/Graph/Chart/Legend/index.tsx +26 -2
  47. package/src/Graph/Chart/index.tsx +45 -45
  48. package/src/Graph/Chart/models.ts +8 -0
  49. package/src/Graph/Chart/useChartData.ts +14 -2
  50. package/src/Graph/Gauge/Gauge.tsx +18 -14
  51. package/src/Graph/Gauge/ResponsiveGauge.tsx +10 -6
  52. package/src/Graph/Gauge/useResizeObserver.ts +68 -0
  53. package/src/Graph/SingleBar/ResponsiveSingleBar.tsx +18 -16
  54. package/src/Graph/SingleBar/ThresholdLine.tsx +4 -4
  55. package/src/Graph/SingleBar/models.ts +1 -0
  56. package/src/Graph/Text/Text.styles.ts +2 -2
  57. package/src/Graph/Text/Text.tsx +23 -10
  58. package/src/Graph/Timeline/ResponsiveTimeline.tsx +4 -0
  59. package/src/Graph/Timeline/Timeline.tsx +21 -4
  60. package/src/Graph/Tree/Links.tsx +2 -2
  61. package/src/Graph/Tree/Tree.tsx +2 -2
  62. package/src/Graph/Tree/constants.ts +1 -1
  63. package/src/Graph/common/BaseChart/BaseChart.tsx +6 -1
  64. package/src/Graph/common/BaseChart/ChartSvgWrapper.tsx +5 -4
  65. package/src/Graph/common/BaseChart/Header/index.tsx +3 -1
  66. package/src/Graph/common/BaseChart/useComputeBaseChartDimensions.ts +13 -9
  67. package/src/Graph/common/timeSeries/index.test.ts +20 -0
  68. package/src/Graph/common/timeSeries/index.ts +225 -44
  69. package/src/Graph/common/timeSeries/models.ts +6 -2
  70. package/src/Graph/common/utils.ts +45 -12
  71. package/src/Graph/index.ts +3 -1
  72. package/src/Graph/mockedData/dataWithMissingPoint.json +74 -0
  73. package/src/Graph/mockedData/pingServiceWithStackedKeys.json +205 -0
  74. package/src/Icon/RegexIcon.tsx +20 -0
  75. package/src/Icon/index.ts +1 -0
  76. package/src/InputField/Select/Autocomplete/Connected/Multi/MultiConnectedAutocompleteField.cypress.spec.tsx +68 -14
  77. package/src/InputField/Select/Autocomplete/Connected/index.tsx +49 -14
  78. package/src/InputField/Select/Autocomplete/Multi/Listbox.tsx +78 -0
  79. package/src/InputField/Select/Autocomplete/Multi/Multi.styles.ts +26 -0
  80. package/src/InputField/Select/Autocomplete/Multi/Multi.tsx +124 -0
  81. package/src/InputField/Select/Autocomplete/Multi/index.tsx +1 -117
  82. package/src/InputField/Select/Autocomplete/index.tsx +28 -17
  83. package/src/InputField/Select/Option.tsx +3 -3
  84. package/src/InputField/Select/index.tsx +4 -0
  85. package/src/InputField/Text/index.tsx +4 -2
  86. package/src/InputField/translatedLabels.ts +4 -0
  87. package/src/Listing/ActionBar/Pagination.tsx +10 -23
  88. package/src/Listing/ActionBar/PaginationActions.tsx +1 -10
  89. package/src/Listing/ActionBar/index.tsx +1 -1
  90. package/src/Listing/Cell/DataCell.tsx +6 -6
  91. package/src/Listing/Cell/EllipsisTypography.tsx +10 -32
  92. package/src/Listing/Cell/index.tsx +37 -76
  93. package/src/Listing/Checkbox.tsx +8 -20
  94. package/src/Listing/Header/Cell/ListingHeaderCell.tsx +17 -14
  95. package/src/Listing/Header/Cell/SelectActionListingHeaderCell.tsx +5 -9
  96. package/src/Listing/Header/ListingHeader.tsx +2 -5
  97. package/src/Listing/Header/_internals/Label.tsx +1 -17
  98. package/src/Listing/Row/EmptyRow.tsx +2 -6
  99. package/src/Listing/Row/Row.tsx +7 -36
  100. package/src/Listing/index.stories.tsx +1 -0
  101. package/src/Listing/index.tsx +26 -26
  102. package/src/Listing/useStyleTable.ts +58 -32
  103. package/src/ListingPage/index.stories.tsx +1 -0
  104. package/src/Module/index.tsx +8 -2
  105. package/src/MultiSelectEntries/index.stories.tsx +1 -0
  106. package/src/MultiSelectEntries/index.tsx +1 -1
  107. package/src/Pagination/Pagination.cypress.spec.tsx +137 -0
  108. package/src/Pagination/Pagination.stories.tsx +46 -0
  109. package/src/Pagination/Pagination.styles.ts +56 -0
  110. package/src/Pagination/Pagination.tsx +146 -0
  111. package/src/Pagination/index.ts +3 -0
  112. package/src/Pagination/utils.ts +7 -0
  113. package/src/SortableItems/index.stories.tsx +2 -2
  114. package/src/StoryBookThemeProvider/index.tsx +3 -1
  115. package/src/ThemeProvider/base.css +49 -0
  116. package/src/ThemeProvider/index.tsx +21 -47
  117. package/src/ThemeProvider/palettes.ts +3 -1
  118. package/src/ThemeProvider/tailwindcss.css +230 -0
  119. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/PickersStartEndDate.tsx +9 -11
  120. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/models.ts +1 -0
  121. package/src/TimePeriods/DateTimePickerInput.tsx +3 -1
  122. package/src/api/models.ts +9 -0
  123. package/src/api/useGraphQuery/index.ts +108 -12
  124. package/src/components/Avatar/Avatar.stories.tsx +1 -0
  125. package/src/components/Button/Button.module.css +38 -0
  126. package/src/components/Button/Button.stories.tsx +25 -0
  127. package/src/components/Button/Button.tsx +2 -5
  128. package/src/components/CrudPage/CrudPage.stories.tsx +1 -0
  129. package/src/components/CrudPage/CrudPageRoot.tsx +1 -1
  130. package/src/components/DataTable/DataTable.stories.tsx +1 -0
  131. package/src/components/DataTable/EmptyState/DataTableEmptyState.stories.tsx +1 -0
  132. package/src/components/DataTable/EmptyState/DataTableEmptyState.styles.ts +3 -1
  133. package/src/components/DataTable/EmptyState/DataTableEmptyState.tsx +4 -1
  134. package/src/components/DataTable/Item/DataTableItem.stories.tsx +1 -0
  135. package/src/components/Form/AccessRights/AccessRights.stories.tsx +1 -0
  136. package/src/components/Form/AccessRights/ShareInput/ShareInput.tsx +4 -3
  137. package/src/components/Form/AccessRights/ShareInput/useShareInput.tsx +15 -10
  138. package/src/components/Form/FormActions.tsx +21 -12
  139. package/src/components/Layout/AreaIndicator.tsx +4 -6
  140. package/src/components/Layout/PageLayout/PageLayout.stories.tsx +1 -0
  141. package/src/components/Layout/PageLayout/PageLayout.tsx +9 -3
  142. package/src/components/Layout/PageLayout/PageLayoutActions.tsx +5 -3
  143. package/src/components/Layout/PageLayout/PageLayoutBody.tsx +5 -3
  144. package/src/components/Layout/PageLayout/PageLayoutHeader.tsx +5 -3
  145. package/src/components/Layout/PageLayout/PageQuickAccess.tsx +17 -17
  146. package/src/components/Menu/Button/MenuButton.tsx +6 -6
  147. package/src/components/Menu/MenuDivider.tsx +1 -5
  148. package/src/components/Menu/MenuItem.tsx +1 -5
  149. package/src/components/Menu/MenuItems.tsx +5 -4
  150. package/src/components/Modal/ConfirmationModal/ConfirmationModal.stories.tsx +1 -0
  151. package/src/components/Modal/ConfirmationModal/ConfirmationModal.tsx +4 -1
  152. package/src/components/Modal/Modal.stories.tsx +21 -0
  153. package/src/components/Modal/Modal.styles.ts +1 -19
  154. package/src/components/Modal/Modal.tsx +1 -1
  155. package/src/components/Modal/ModalBody.tsx +6 -4
  156. package/src/components/Modal/ModalHeader.tsx +9 -5
  157. package/src/components/Modal/modal.module.css +16 -0
  158. package/src/components/Tabs/Tab.styles.ts +0 -6
  159. package/src/components/Tabs/Tabs.tsx +37 -15
  160. package/src/index.ts +3 -0
  161. package/src/queryParameters/url/index.ts +7 -2
  162. package/src/utils/index.ts +1 -0
  163. package/src/utils/useLocale/index.ts +9 -0
  164. package/src/utils/useLocale/useLocale.cypress.spec.tsx +38 -0
  165. package/src/utils/useLocaleDateTimeFormat/index.ts +4 -2
  166. package/src/utils/usePluralizedTranslation.ts +2 -3
  167. package/src/Listing/Cell/DataCell.styles.ts +0 -27
  168. package/src/Listing/Header/Cell/ListingHeaderCell.styles.ts +0 -71
  169. package/src/Listing/Header/Cell/SelectActionListingHeaderCell.styles.ts +0 -26
  170. package/src/Listing/Header/ListingHeader.styles.ts +0 -16
  171. package/src/Listing/Listing.styles.ts +0 -78
  172. package/src/Listing/Row/EmptyRow.styles.ts +0 -14
  173. package/src/components/Button/Button.styles.ts +0 -44
  174. package/src/components/Layout/AreaIndicator.styles.ts +0 -33
  175. package/src/components/Menu/Button/MenuButton.styles.ts +0 -27
  176. package/src/components/Menu/Menu.styles.ts +0 -68
@@ -1,11 +1,12 @@
1
1
  import { useAtomValue } from 'jotai';
2
- import { equals } from 'ramda';
2
+ import { equals, mergeDeepRight } from 'ramda';
3
3
  import { CSSInterpolation } from 'tss-react';
4
4
 
5
5
  import {
6
6
  ButtonProps,
7
7
  InputBaseProps,
8
8
  ThemeProvider as MuiThemeProvider,
9
+ PaletteOptions,
9
10
  StyledEngineProvider,
10
11
  Theme,
11
12
  createTheme
@@ -21,6 +22,7 @@ import RobotoLightWoff2 from '../fonts/roboto-light-webfont.woff2';
21
22
  import RobotoMediumWoff2 from '../fonts/roboto-medium-webfont.woff2';
22
23
  import RobotoRegularWoff2 from '../fonts/roboto-regular-webfont.woff2';
23
24
 
25
+ import { GlobalStyles } from '@mui/system';
24
26
  import { ReactNode, useMemo } from 'react';
25
27
  import { getPalette } from './palettes';
26
28
 
@@ -146,46 +148,6 @@ export const getTheme = (mode: ThemeMode): ThemeOptions => ({
146
148
  },
147
149
  MuiCssBaseline: {
148
150
  styleOverrides: (theme) => `
149
- ::-webkit-scrollbar {
150
- height: ${theme.spacing(1)};
151
- width: ${theme.spacing(1)};
152
- background-color: transparent;
153
- }
154
- ::-webkit-scrollbar-thumb {
155
- background-color: ${
156
- equals(mode, 'dark')
157
- ? theme.palette.divider
158
- : theme.palette.text.disabled
159
- };
160
- border-radius: ${theme.spacing(0.5)};
161
- }
162
- ::-webkit-scrollbar-thumb:hover {
163
- background-color: ${theme.palette.primary.main};
164
- }
165
- * {
166
- scrollbar-color: ${
167
- equals(mode, 'dark')
168
- ? theme.palette.divider
169
- : theme.palette.text.disabled
170
- } ${theme.palette.background.default};
171
- scrollbar-width: thin;
172
- }
173
- html {
174
- margin: 0;
175
- padding: 0;
176
- width: 100%;
177
- height: 100%;
178
- text-rendering: optimizeLegibility;
179
- }
180
- body {
181
- background-color: ${theme.palette.background.paper};
182
- height: 100%;
183
- padding: 0;
184
- width: 100%;
185
- }
186
- #root {
187
- background-color: ${theme.palette.background.paper};
188
- }
189
151
  @font-face {
190
152
  font-family: 'Roboto';
191
153
  font-style: normal;
@@ -210,6 +172,9 @@ export const getTheme = (mode: ThemeMode): ThemeOptions => ({
210
172
  font-weight: 700;
211
173
  src: local('Roboto'), local('Roboto-Bold'), url(${RobotoBoldWoff2}) format('woff2');
212
174
  }
175
+ body {
176
+ background-color: ${theme.palette.background.paper};
177
+ }
213
178
  `
214
179
  },
215
180
  MuiInputBase: {
@@ -293,18 +258,27 @@ export const getTheme = (mode: ThemeMode): ThemeOptions => ({
293
258
 
294
259
  interface Props {
295
260
  children: ReactNode;
261
+ overrideTheme?: {
262
+ light: Partial<PaletteOptions>;
263
+ dark: Partial<PaletteOptions>;
264
+ };
296
265
  }
297
266
 
298
- const ThemeProvider = ({ children }: Props): JSX.Element => {
267
+ const ThemeProvider = ({ children, overrideTheme }: Props): JSX.Element => {
299
268
  const { themeMode } = useAtomValue(userAtom);
300
269
 
301
- const theme = useMemo(
302
- () => createTheme(getTheme(themeMode || ThemeMode.light)),
303
- [themeMode]
304
- );
270
+ const theme = useMemo(() => {
271
+ const overrideThemeByMode = overrideTheme?.[themeMode || 'light'];
272
+ return createTheme(
273
+ mergeDeepRight(getTheme(themeMode || ThemeMode.light), {
274
+ palette: overrideThemeByMode || {}
275
+ })
276
+ );
277
+ }, [themeMode, overrideTheme]);
305
278
 
306
279
  return (
307
- <StyledEngineProvider injectFirst>
280
+ <StyledEngineProvider injectFirst enableCssLayer>
281
+ <GlobalStyles styles="@layer theme,base,mui,components,utilities;" />
308
282
  <MuiThemeProvider theme={theme}>
309
283
  <CssBaseline />
310
284
  {children}
@@ -295,7 +295,9 @@ export const lightPalette: PaletteOptions = {
295
295
  },
296
296
  warning: {
297
297
  contrastText: '#000',
298
- main: '#FD9B27'
298
+ main: '#FD9B27',
299
+ light: '#FCC481',
300
+ dark: '#FC7E00'
299
301
  }
300
302
  };
301
303
 
@@ -0,0 +1,230 @@
1
+ @import "tailwindcss";
2
+ @import "./base.css"; /* Base styles: scrollbar, html, body, #root */
3
+
4
+ @custom-variant dark (&:where(.dark, .dark *));
5
+
6
+ @theme {
7
+ /* Typography */
8
+ --font-body: Roboto, Arial, serif;
9
+
10
+ /* Spacing system */
11
+ --spacing: 4px;
12
+
13
+ --spacing-0: calc(var(--spacing) * 0);
14
+ --spacing-1: calc(var(--spacing) * 1);
15
+ --spacing-2: calc(var(--spacing) * 2);
16
+ --spacing-3: calc(var(--spacing) * 3);
17
+ --spacing-4: calc(var(--spacing) * 4);
18
+ --spacing-5: calc(var(--spacing) * 5);
19
+ --spacing-6: calc(var(--spacing) * 6);
20
+ --spacing-7: calc(var(--spacing) * 7);
21
+ --spacing-8: calc(var(--spacing) * 8);
22
+ --spacing-9: calc(var(--spacing) * 9);
23
+ --spacing-10: calc(var(--spacing) * 10);
24
+
25
+ /* =============
26
+ COLOR SYSTEM
27
+ ============= */
28
+
29
+ /* Action colors */
30
+ --color-action-acknowledged: #745f35;
31
+ --color-action-acknowledged-background: #dfd2b9;
32
+ --color-action-in-flapping: #064a3f;
33
+ --color-action-in-flapping-background: #d8f3ef;
34
+ --color-action-activated-opacity: 0.12;
35
+ --color-action-active: #666666;
36
+ --color-action-disabled: #999999;
37
+ --color-action-disabled-background: rgba(0, 0, 0, 0.12);
38
+ --color-action-focus: #dadada;
39
+ --color-action-focus-opacity: 0.12;
40
+ --color-action-hover: rgba(0, 0, 0, 0.06);
41
+ --color-action-hover-opacity: 0.06;
42
+ --color-action-in-downtime: #512980;
43
+ --color-action-in-downtime-background: #e5d8f3;
44
+ --color-action-selected: rgba(102, 102, 102, 0.3);
45
+ --color-action-selected-opacity: 0.3;
46
+
47
+ /* Background colors */
48
+ --color-background-default: #f4f4f4;
49
+ --color-background-listing-header: #666666;
50
+ --color-background-panel: #ededed;
51
+ --color-background-panel-groups: #f5f5f5;
52
+ --color-background-paper: #ffffff;
53
+ --color-background-tooltip: #434e58;
54
+ --color-background-widget: #f8f8f8;
55
+
56
+ /* Chip colors */
57
+ --color-chip-error: #ff6666;
58
+ --color-chip-info: #1588d1;
59
+ --color-chip-neutral: #6da4e4;
60
+ --color-chip-success: #88b922;
61
+ --color-chip-warning: #fd9b27;
62
+
63
+ /* Utility colors */
64
+ --color-divider: #e3e3e3;
65
+ --color-error-main: #ff4a4a;
66
+
67
+ /* Header colors */
68
+ --color-header-page-action-background-active: #1975d10f;
69
+ --color-header-page-action-background-default: #ffffff00;
70
+ --color-header-page-action-color-active: #1976d2;
71
+ --color-header-page-action-color-default: #696969;
72
+ --color-header-page-border: #ededed;
73
+ --color-header-page-description: #4a4a4a;
74
+ --color-header-page-title: #000000;
75
+ --color-header-info-main: #1588d1;
76
+ --color-header-layout-body-background: #f6f6f6;
77
+ --color-header-layout-header-background: #ffffff;
78
+ --color-header-layout-header-border: #e3e3e3;
79
+ --color-header-menu-background: #ffffff;
80
+ --color-header-menu-button-background-active: #ecf4fd;
81
+ --color-header-menu-button-background-default: transparent;
82
+ --color-header-menu-button-background-hover: #d2e4f9;
83
+ --color-header-menu-button-color-active: #3e85d5;
84
+ --color-header-menu-button-color-default: #8c98a6;
85
+ --color-header-menu-button-color-hover: #6f7b8a;
86
+ --color-header-menu-divider-border: #cad0d8;
87
+ --color-header-menu-item-background-active: #ecf4fd;
88
+ --color-header-menu-item-background-default: transparent;
89
+ --color-header-menu-item-background-hover: #eaedf0;
90
+ --color-header-menu-item-color-active: #3e85d5;
91
+ --color-header-menu-item-color-default: #1b2127;
92
+ --color-header-menu-item-color-hover: #101418;
93
+
94
+ /* State colors */
95
+ --color-pending-main: #1ebeb3;
96
+
97
+ /* Primary & Secondary colors */
98
+ --color-primary-main: #2e68aa;
99
+ --color-primary-light: #cde7fc;
100
+ --color-primary-dark: #255891;
101
+ --color-secondary-main: #c772d6;
102
+ --color-secondary-light: #e5a5f0;
103
+ --color-secondary-dark: #ac28c1;
104
+
105
+ /* Status colors */
106
+ --color-status-background-error: #ff6666;
107
+ --color-status-background-none: --alpha(#2e68aa / 10%);
108
+ --color-status-background-pending: #1ebeb3;
109
+ --color-status-background-success: #88b922;
110
+ --color-stauts-background-unknown: #e3e3e3;
111
+ --color-status-background-warning: #fd9b27;
112
+ --color-success-main: #88b922;
113
+
114
+ /* Text colors */
115
+ --color-text-disabled: #999999;
116
+ --color-text-primary: #000000;
117
+ --color-text-secondary: #666666;
118
+ --color-warning-main: #fd9b27;
119
+ --color-warning-light: #fcc481;
120
+ --color-warning-dark: #fc7e00;
121
+
122
+ /* Base colors */
123
+ --color-white: #ffffff;
124
+ --color-black: #000000;
125
+ }
126
+
127
+ @layer base {
128
+ @variant dark {
129
+ --color-action-acknowledged: #dfd2b9;
130
+ --color-action-acknowledged-background: #745f35;
131
+ --color-action-in-flapping: #d8f3ef;
132
+ --color-action-in-flapping-background: #064a3f;
133
+ --color-action-activated-opacity: 0.3;
134
+ --color-action-active: #b5b5b5;
135
+ --color-action-disabled: #999999;
136
+ --color-action-disabled-background: rgba(0, 0, 0, 0.12);
137
+ --color-action-focus: #6d6d6d;
138
+ --color-action-focus-opacity: 0.3;
139
+ --color-action-hover: rgba(255, 255, 255, 0.16);
140
+ --color-action-hover-opacity: 0.16;
141
+ --color-action-in-downtime: #e5d8f3;
142
+ --color-action-in-downtime-background: #512980;
143
+ --color-action-selected: rgba(255, 255, 255, 0.5);
144
+ --color-action-selected-opacity: 0.5;
145
+ --color-background-default: #4a4a4a;
146
+ --color-background-listing-header: #666666;
147
+ --color-background-panel: #4a4a4a;
148
+ --color-background-panel-groups: #252525;
149
+ --color-background-paper: #212121;
150
+ --color-background-tooltip: #aab4c0;
151
+ --color-background-widget: #2e2e2e;
152
+ --color-chip-error: #d60101;
153
+ --color-chip-info: #1ca9f4;
154
+ --color-chip-neutral: #434e5b;
155
+ --color-chip-success: #5f8118;
156
+ --color-chip-warning: #c55400;
157
+ --color-divider: #666666;
158
+ --color-error-main: #d60101;
159
+ --color-header-page-action-background-active: #1975d10f;
160
+ --color-header-page-action-background-default: #ffffff00;
161
+ --color-header-page-action-color-active: #1976d2;
162
+ --color-header-page-action-color-default: #696969;
163
+ --color-header-page-border: #666666;
164
+ --color-header-page-description: #bdbdbd;
165
+ --color-header-page-title: #ffffff;
166
+ --color-header-info-main: #1ca9f4;
167
+ --color-header-layout-body-background: #f6f6f6;
168
+ --color-header-layout-header-background: #ffffff;
169
+ --color-header-layout-header-border: #e3e3e3;
170
+ --color-header-menu-background: #101418;
171
+ --color-header-menu-button-background-active: #071d37;
172
+ --color-header-menu-button-background-default: transparent;
173
+ --color-header-menu-button-background-hover: #1b2127;
174
+ --color-header-menu-button-color-active: #205593;
175
+ --color-header-menu-button-color-default: #596573;
176
+ --color-header-menu-button-color-hover: #6f7b8a;
177
+ --color-header-menu-divider-border: #2f3741;
178
+ --color-header-menu-item-background-active: #071d37;
179
+ --color-header-menu-item-background-default: transparent;
180
+ --color-header-menu-item-background-hover: #1b2127;
181
+ --color-header-menu-item-color-active: #3e85d5;
182
+ --color-header-menu-item-color-default: #f9fafb;
183
+ --color-header-menu-item-color-hover: #ffffff;
184
+ --color-pending-main: #118077;
185
+ --color-primary-main: #6eaff8;
186
+ --color-primary-light: #8bbff9;
187
+ --color-primary-dark: #4974a5;
188
+ --color-secondary-main: #7c1fa2;
189
+ --color-status-background-error: #d60101;
190
+ --color-status-background-none: --alpha(#2e68aa / 10%);
191
+ --color-status-background-pending: #118077;
192
+ --color-status-background-success: #5f8118;
193
+ --color-stauts-background-unknown: #666666;
194
+ --color-status-background-warning: #c55400;
195
+ --color-success-main: #5f8118;
196
+ --color-text-disabled: #666666;
197
+ --color-text-primary: #ffffff;
198
+ --color-text-secondary: #cccccc;
199
+ --color-warning-main: #c55400;
200
+ }
201
+ }
202
+
203
+ @layer components {
204
+ .flex-column {
205
+ @apply flex flex-col gap-1;
206
+ }
207
+
208
+ .flex-row {
209
+ @apply flex flex-row gap-1;
210
+ }
211
+
212
+ .flex-column-center {
213
+ @apply flex flex-col items-center;
214
+ }
215
+
216
+ .flex-column-start {
217
+ @apply flex flex-col items-start;
218
+ }
219
+
220
+ .flex-column-end {
221
+ @apply flex flex-col items-end;
222
+ }
223
+ }
224
+
225
+ #root {
226
+ transition-duration: var(--default-transition-duration);
227
+ transition-property:
228
+ color, background-color, border-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
229
+ transition-timing-function: var(--default-transition-timing-function);
230
+ }
@@ -10,8 +10,6 @@ import { Typography } from '@mui/material';
10
10
  import { LocalizationProvider } from '@mui/x-date-pickers';
11
11
  import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
12
12
 
13
- import { userAtom } from '@centreon/ui-context';
14
-
15
13
  import DateTimePickerInput from '../../DateTimePickerInput';
16
14
  import { isInvalidDate } from '../../helpers';
17
15
  import {
@@ -20,6 +18,7 @@ import {
20
18
  } from '../../models';
21
19
  import { errorTimePeriodAtom } from '../../timePeriodsAtoms';
22
20
 
21
+ import { useLocale } from '../../../utils';
23
22
  import ErrorText from './ErrorText';
24
23
  import {
25
24
  PickersStartEndDateDirection,
@@ -96,11 +95,10 @@ const PickersStartEndDate = ({
96
95
  changeDate,
97
96
  rangeStartDate,
98
97
  rangeEndDate,
99
- direction = PickersStartEndDateDirection.column
98
+ direction = PickersStartEndDateDirection.column,
99
+ className
100
100
  }: PickersStartEndDateProps): JSX.Element => {
101
- const { classes } = useStyles();
102
-
103
- const { locale } = useAtomValue(userAtom);
101
+ const locale = useLocale();
104
102
  const error = useAtomValue(errorTimePeriodAtom);
105
103
  const isError = error || isInvalidDate({ endDate, startDate });
106
104
 
@@ -109,16 +107,16 @@ const PickersStartEndDate = ({
109
107
  const maxEnd = rangeEndDate?.max;
110
108
  const minEnd = rangeEndDate?.min || startDate;
111
109
 
112
- const styleContainer = equals(direction, PickersStartEndDateDirection.column)
113
- ? classes.verticalDirection
114
- : classes.horizontalDirection;
110
+ const isColumn = equals(direction, PickersStartEndDateDirection.column);
115
111
 
116
112
  return (
117
113
  <LocalizationProvider
118
114
  adapterLocale={locale.substring(0, 2)}
119
115
  dateAdapter={AdapterDayjs}
120
116
  >
121
- <div className={styleContainer}>
117
+ <div
118
+ className={`flex ${isColumn ? 'flex-col justify-center' : 'flex-row items-center py-2 px-4'} gap-2 ${className}`}
119
+ >
122
120
  <PickerDateWithLabel
123
121
  changeDate={changeDate}
124
122
  date={startDate}
@@ -144,7 +142,7 @@ const PickersStartEndDate = ({
144
142
  {isError && (
145
143
  <ErrorText
146
144
  message="The end date must be greater than the start date"
147
- style={classes.error}
145
+ style="text-center"
148
146
  />
149
147
  )}
150
148
  </LocalizationProvider>
@@ -71,4 +71,5 @@ export interface PickersStartEndDateProps
71
71
  PickersStartEndDateModel {
72
72
  direction?: PickersStartEndDateDirection;
73
73
  disabled?: DisabledPicker;
74
+ className?: string;
74
75
  }
@@ -13,6 +13,7 @@ import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
13
13
 
14
14
  import { userAtom } from '@centreon/ui-context';
15
15
 
16
+ import { useLocale } from '../utils';
16
17
  import { CustomTimePeriodProperty } from './models';
17
18
 
18
19
  interface ChangeDateProps {
@@ -50,6 +51,7 @@ const DateTimePickerInput = ({
50
51
  '@media (min-width: 1024px) or (pointer: fine)';
51
52
 
52
53
  const user = useAtomValue(userAtom);
54
+ const localeToUse = useLocale();
53
55
 
54
56
  const isUTC = equals(timezone ?? user.timezone, 'UTC');
55
57
 
@@ -72,7 +74,7 @@ const DateTimePickerInput = ({
72
74
 
73
75
  return (
74
76
  <LocalizationProvider
75
- adapterLocale={(locale ?? user.locale).substring(0, 2)}
77
+ adapterLocale={(locale ?? localeToUse).substring(0, 2)}
76
78
  dateAdapter={AdapterDayjs}
77
79
  dateLibInstance={dayjs}
78
80
  >
package/src/api/models.ts CHANGED
@@ -8,3 +8,12 @@ export interface Listing<TEntity> {
8
8
  meta: ListingMeta;
9
9
  result: Array<TEntity>;
10
10
  }
11
+
12
+ export interface ListingMap<TEntity> {
13
+ content: Array<TEntity>;
14
+ totalPages: number;
15
+ totalElements: number;
16
+ size: number;
17
+ number: number;
18
+ numberOfElements: number;
19
+ }
@@ -36,6 +36,7 @@ interface UseMetricsQueryProps {
36
36
  start?: string | null;
37
37
  timePeriodType: number;
38
38
  };
39
+ isEnabled?: boolean;
39
40
  }
40
41
 
41
42
  interface UseMetricsQueryState {
@@ -46,6 +47,12 @@ interface UseMetricsQueryState {
46
47
  start: string;
47
48
  }
48
49
 
50
+ interface FormatLegend {
51
+ host?: string | null;
52
+ service?: string | null;
53
+ metric: string;
54
+ }
55
+
49
56
  const getStartEndFromTimePeriod = (
50
57
  timePeriod: number
51
58
  ): { end: string; start: string } => {
@@ -95,7 +102,8 @@ const useGraphQuery = ({
95
102
  refreshInterval = false,
96
103
  refreshCount,
97
104
  bypassQueryParams = false,
98
- prefix
105
+ prefix,
106
+ isEnabled = true
99
107
  }: UseMetricsQueryProps): UseMetricsQueryState => {
100
108
  const timePeriodToUse = equals(timePeriod?.timePeriodType, -1)
101
109
  ? {
@@ -152,7 +160,10 @@ const useGraphQuery = ({
152
160
  refreshCount || 0
153
161
  ],
154
162
  queryOptions: {
155
- enabled: areResourcesFullfilled(resources) && !isEmpty(definedMetrics),
163
+ enabled:
164
+ areResourcesFullfilled(resources) &&
165
+ !isEmpty(definedMetrics) &&
166
+ isEnabled,
156
167
  refetchInterval: refreshInterval,
157
168
  suspense: false
158
169
  },
@@ -164,22 +175,107 @@ const useGraphQuery = ({
164
175
  data.current = graphData;
165
176
  }
166
177
 
178
+ const getCurrentMetrics = () => {
179
+ if (!data.current) {
180
+ return undefined;
181
+ }
182
+
183
+ return bypassMetricsExclusion
184
+ ? data.current.metrics
185
+ : data.current.metrics.filter(({ metric_id }) => {
186
+ return pipe(
187
+ pluck('excludedMetrics'),
188
+ flatten,
189
+ includes(metric_id),
190
+ not
191
+ )(metrics);
192
+ });
193
+ };
194
+
195
+ const formatLegend = ({
196
+ host = null,
197
+ service = null,
198
+ metric
199
+ }: FormatLegend) => {
200
+ if (!host && !service) {
201
+ return metric;
202
+ }
203
+
204
+ if (!host) {
205
+ return `${service}: ${metric}`;
206
+ }
207
+
208
+ if (!service) {
209
+ return `${host}: ${metric}`;
210
+ }
211
+
212
+ return `${host} ${service}: ${metric}`;
213
+ };
214
+
215
+ const getFormattedMetrics = () => {
216
+ const metrics = getCurrentMetrics();
217
+
218
+ if (equals(metrics?.length, 1)) {
219
+ return metrics?.map((line) => {
220
+ const formattedLegend = formatLegend({
221
+ host: line?.host_name,
222
+ service: line?.service_name,
223
+ metric: line?.metric
224
+ });
225
+
226
+ return { ...line, legend: formattedLegend };
227
+ });
228
+ }
229
+
230
+ return metrics?.map((line) => {
231
+ const areHostNameRedundant = metrics.every(({ host_name }) =>
232
+ equals(host_name, line.host_name)
233
+ );
234
+ const areServiceNameRedundant = metrics.every(({ service_name }) =>
235
+ equals(service_name, line.service_name)
236
+ );
237
+
238
+ if (areHostNameRedundant && areServiceNameRedundant) {
239
+ const formattedLegend = formatLegend({ metric: line.metric });
240
+
241
+ return { ...line, legend: formattedLegend };
242
+ }
243
+
244
+ if (areHostNameRedundant) {
245
+ const formattedLegend = formatLegend({
246
+ service: line.service_name,
247
+ metric: line.metric
248
+ });
249
+
250
+ return { ...line, legend: formattedLegend };
251
+ }
252
+
253
+ if (areServiceNameRedundant) {
254
+ const formattedLegend = formatLegend({
255
+ host: line.host_name,
256
+ metric: line.metric
257
+ });
258
+
259
+ return { ...line, legend: formattedLegend };
260
+ }
261
+
262
+ const formattedLegend = formatLegend({
263
+ host: line.host_name,
264
+ service: line.service_name,
265
+ metric: line.metric
266
+ });
267
+
268
+ return { ...line, legend: formattedLegend };
269
+ });
270
+ };
271
+
167
272
  const formattedGraphData = data.current
168
273
  ? {
169
274
  global: {
170
275
  base: data.current.base,
171
276
  title: ''
172
277
  },
173
- metrics: bypassMetricsExclusion
174
- ? data.current.metrics
175
- : data.current.metrics.filter(({ metric_id }) => {
176
- return pipe(
177
- pluck('excludedMetrics'),
178
- flatten,
179
- includes(metric_id),
180
- not
181
- )(metrics);
182
- }),
278
+ metrics: getFormattedMetrics(),
183
279
  times: data.current.times
184
280
  }
185
281
  : undefined;
@@ -1,6 +1,7 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
2
 
3
3
  import Avatar from './Avatar';
4
+ import '../../ThemeProvider/tailwindcss.css';
4
5
 
5
6
  const meta: Meta<typeof Avatar> = {
6
7
  component: Avatar
@@ -0,0 +1,38 @@
1
+ .button {
2
+ &[data-size="medium"] {
3
+ font-size: 16px;
4
+ height: unset;
5
+ line-height: 24px;
6
+ }
7
+
8
+ &[data-size="small"] {
9
+ &[data-variant="primary"] {
10
+ padding-left: var(--spacing-4);
11
+ padding-right: var(--spacing-4);
12
+ }
13
+
14
+ font-size: 14px;
15
+ height: unset;
16
+ line-height: 22px;
17
+ }
18
+
19
+ &[data-variant="primary"]:not(:disabled) {
20
+ &[data-is-danger="true"] {
21
+ background-color: var(--color-error-main);
22
+ }
23
+
24
+ background-color: var(--color-primary-main);
25
+ }
26
+
27
+ &[data-variant="secondary"]:not(:disabled) {
28
+ &[data-is-danger="true"] {
29
+ border-color: var(--color-error-main);
30
+ color: var(--color-error-main);
31
+ }
32
+
33
+ border-color: var(--color-primary-main);
34
+ color: var(--color-primary-main);
35
+ }
36
+
37
+ text-wrap: nowrap;
38
+ }
@@ -1,3 +1,4 @@
1
+ import '../../ThemeProvider/tailwindcss.css';
1
2
  import { Meta, StoryObj } from '@storybook/react';
2
3
 
3
4
  import { Add as AddIcon } from '@mui/icons-material';
@@ -32,3 +33,27 @@ export const AsDanger: Story = {
32
33
  isDanger: true
33
34
  }
34
35
  };
36
+
37
+ export const small: Story = {
38
+ args: {
39
+ ...Default.args,
40
+ size: 'small'
41
+ }
42
+ };
43
+
44
+ export const smallWithIcon: Story = {
45
+ args: {
46
+ ...Default.args,
47
+ size: 'small',
48
+ icon: <AddIcon />,
49
+ iconVariant: 'start'
50
+ }
51
+ };
52
+
53
+ export const smallDanger: Story = {
54
+ args: {
55
+ ...Default.args,
56
+ size: 'small',
57
+ isDanger: true
58
+ }
59
+ };