@centreon/ui 24.5.0 → 24.5.2

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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/Dashboard/Item.tsx +2 -11
  3. package/src/Dashboard/Layout.tsx +2 -4
  4. package/src/Graph/Tree/DescendantNodes.tsx +0 -1
  5. package/src/Graph/Tree/Links.tsx +2 -15
  6. package/src/Graph/Tree/Tree.cypress.spec.tsx +0 -24
  7. package/src/Graph/Tree/Tree.stories.tsx +1 -17
  8. package/src/Graph/Tree/models.ts +0 -3
  9. package/src/TopCounterElements/TopCounterLayout.tsx +4 -3
  10. package/src/TopCounterElements/useCloseOnLegacyPage.tsx +6 -9
  11. package/src/api/useGraphQuery/index.ts +1 -7
  12. package/src/components/Form/AccessRights/AccessRights.cypress.spec.tsx +13 -27
  13. package/src/components/Form/AccessRights/AccessRights.stories.tsx +19 -0
  14. package/src/components/Form/AccessRights/AccessRights.styles.ts +1 -1
  15. package/src/components/Form/AccessRights/AccessRights.tsx +5 -6
  16. package/src/components/Form/AccessRights/Actions/Actions.styles.ts +7 -3
  17. package/src/components/Form/AccessRights/Actions/Actions.tsx +32 -15
  18. package/src/components/Form/AccessRights/Actions/useActions.ts +37 -4
  19. package/src/components/Form/AccessRights/models.ts +3 -0
  20. package/src/components/Form/AccessRights/storiesData.ts +3 -0
  21. package/src/components/List/Item/ListItem.styles.ts +2 -2
  22. package/src/components/Zoom/Minimap.tsx +2 -4
  23. package/src/components/Zoom/Zoom.cypress.spec.tsx +13 -13
  24. package/src/components/Zoom/Zoom.tsx +1 -4
  25. package/src/components/Zoom/ZoomContent.tsx +2 -5
  26. package/src/components/index.ts +0 -1
  27. package/src/utils/index.ts +0 -1
  28. package/src/utils/usePluralizedTranslation.ts +3 -20
  29. package/src/components/Form/AccessRights/useAccessRightsChange.ts +0 -30
  30. package/src/components/Form/AccessRights/utils.ts +0 -18
  31. package/src/components/Tabs/Tab.styles.ts +0 -25
  32. package/src/components/Tabs/TabPanel.tsx +0 -22
  33. package/src/components/Tabs/Tabs.cypress.spec.tsx +0 -70
  34. package/src/components/Tabs/Tabs.stories.tsx +0 -55
  35. package/src/components/Tabs/Tabs.tsx +0 -55
  36. package/src/components/Tabs/index.ts +0 -6
  37. package/src/utils/resourcesStatusURL.ts +0 -166
  38. package/src/utils/usePluralizedTranslation.test.ts +0 -159
@@ -18,10 +18,10 @@ export const useStyles = makeStyles()((theme) => ({
18
18
  display: 'flex',
19
19
  flexGrow: 1,
20
20
  gap: theme.spacing(2),
21
+ maxWidth: '520px',
21
22
  overflow: 'hidden',
22
23
  paddingBottom: theme.spacing(1),
23
- paddingTop: theme.spacing(1),
24
- width: '100%'
24
+ paddingTop: theme.spacing(1)
25
25
  },
26
26
  secondary: {
27
27
  alignItems: 'center',
@@ -16,7 +16,6 @@ interface Props extends Omit<UseMinimapProps, 'minimapScale' | 'scale'> {
16
16
  left: number;
17
17
  top: number;
18
18
  };
19
- id?: number | string;
20
19
  isDraggingFromContainer: boolean;
21
20
  }
22
21
 
@@ -27,8 +26,7 @@ const Minimap = ({
27
26
  width,
28
27
  contentClientRect,
29
28
  isDraggingFromContainer,
30
- diffBetweenContentAndSvg,
31
- id
29
+ diffBetweenContentAndSvg
32
30
  }: Props): JSX.Element => {
33
31
  const { classes } = useZoomStyles();
34
32
 
@@ -84,7 +82,7 @@ const Minimap = ({
84
82
  );
85
83
 
86
84
  return (
87
- <g className={classes.minimap} clipPath={`url(#zoom-clip-${id})`}>
85
+ <g className={classes.minimap} clipPath="url(#zoom-clip)">
88
86
  <rect
89
87
  className={classes.minimapBackground}
90
88
  height={finalHeight}
@@ -63,7 +63,7 @@ describe('Zoom', () => {
63
63
  it('displays the minimap when the prop is set', () => {
64
64
  initialize({ showMinimap: true });
65
65
 
66
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
66
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
67
67
 
68
68
  cy.makeSnapshot();
69
69
  });
@@ -72,7 +72,7 @@ describe('Zoom', () => {
72
72
  initialize({ showMinimap: true });
73
73
 
74
74
  cy.get('g[transform="matrix(1, 0, 0, 1, 0, 0)"]');
75
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
75
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
76
76
 
77
77
  cy.findByTestId('zoom in').click();
78
78
  cy.findByTestId('zoom-content')
@@ -86,7 +86,7 @@ describe('Zoom', () => {
86
86
  initialize({ showMinimap: true });
87
87
 
88
88
  cy.get('g[transform="matrix(1, 0, 0, 1, 0, 0)"]');
89
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
89
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
90
90
 
91
91
  cy.findByTestId('zoom out').click();
92
92
 
@@ -101,7 +101,7 @@ describe('Zoom', () => {
101
101
  initialize({ showMinimap: true });
102
102
 
103
103
  cy.get('g[transform="matrix(1, 0, 0, 1, 0, 0)"]');
104
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
104
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
105
105
 
106
106
  cy.findByTestId('zoom-content').realMouseWheel({ deltaY: 20 });
107
107
 
@@ -116,7 +116,7 @@ describe('Zoom', () => {
116
116
  initialize({ showMinimap: true });
117
117
 
118
118
  cy.get('g[transform="matrix(1, 0, 0, 1, 0, 0)"]');
119
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
119
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
120
120
 
121
121
  cy.findByTestId('zoom-content').realMouseWheel({ deltaY: -20 });
122
122
 
@@ -131,7 +131,7 @@ describe('Zoom', () => {
131
131
  initialize({ showMinimap: true });
132
132
 
133
133
  cy.get('g[transform="matrix(1, 0, 0, 1, 0, 0)"]');
134
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
134
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
135
135
 
136
136
  cy.findByTestId('zoom-content').realMouseWheel({ deltaY: -20 });
137
137
 
@@ -150,7 +150,7 @@ describe('Zoom', () => {
150
150
  initialize({ showMinimap: false });
151
151
 
152
152
  cy.get('g[transform="matrix(1, 0, 0, 1, 0, 0)"]');
153
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('not.exist');
153
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('not.exist');
154
154
 
155
155
  cy.makeSnapshot();
156
156
  });
@@ -158,7 +158,7 @@ describe('Zoom', () => {
158
158
  it('zooms in when the minimap is scrolled up', () => {
159
159
  initialize({ showMinimap: true });
160
160
 
161
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
161
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
162
162
 
163
163
  cy.findByTestId('minimap-interaction').realMouseWheel({ deltaY: -20 });
164
164
 
@@ -172,7 +172,7 @@ describe('Zoom', () => {
172
172
  it('zooms out when the minimap is scrolled down', () => {
173
173
  initialize({ showMinimap: true });
174
174
 
175
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
175
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
176
176
 
177
177
  cy.findByTestId('minimap-interaction').realMouseWheel({ deltaY: 20 });
178
178
 
@@ -186,7 +186,7 @@ describe('Zoom', () => {
186
186
  it('moves the view when the mouse is hover the content with the corresponding button pressed down', () => {
187
187
  initialize({ showMinimap: true });
188
188
 
189
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
189
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
190
190
  cy.get('svg').should('have.attr', 'height', '400');
191
191
 
192
192
  cy.findByTestId('zoom-container')
@@ -205,7 +205,7 @@ describe('Zoom', () => {
205
205
  it('displays the minimap in the bottom right when the prop to the corresponding value', () => {
206
206
  initialize({ minimapPosition: 'bottom-right', showMinimap: true });
207
207
 
208
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
208
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
209
209
  cy.get('svg').should('have.attr', 'height', '400');
210
210
 
211
211
  cy.makeSnapshot();
@@ -214,7 +214,7 @@ describe('Zoom', () => {
214
214
  it('applies a scale down on the minimap when the content is higher than the original height', () => {
215
215
  initialize({ showMinimap: true, template: ContentWithMultipleShapes });
216
216
 
217
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
217
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
218
218
  cy.get('svg').should('have.attr', 'height', '400');
219
219
 
220
220
  cy.findByTestId('minimap-interaction')
@@ -232,7 +232,7 @@ describe('Zoom', () => {
232
232
  template: ContentWithMultipleShapesWithNegativeTranslations
233
233
  });
234
234
 
235
- cy.get('g[clip-path="url(#zoom-clip-0)"]').should('be.visible');
235
+ cy.get('g[clip-path="url(#zoom-clip)"]').should('be.visible');
236
236
  cy.get('svg').should('have.attr', 'height', '400');
237
237
 
238
238
  cy.findByTestId('minimap-interaction')
@@ -7,7 +7,6 @@ import { MinimapPosition } from './models';
7
7
 
8
8
  export interface ZoomProps {
9
9
  children: JSX.Element | (({ width, height }) => JSX.Element);
10
- id?: number | string;
11
10
  minimapPosition?: MinimapPosition;
12
11
  scaleMax?: number;
13
12
  scaleMin?: number;
@@ -28,8 +27,7 @@ const Zoom = ({
28
27
  scaleMin = 0.5,
29
28
  scaleMax = 4,
30
29
  showMinimap = false,
31
- minimapPosition = 'top-left',
32
- id = 0
30
+ minimapPosition = 'top-left'
33
31
  }: ZoomProps): JSX.Element => {
34
32
  return (
35
33
  <ParentSize>
@@ -46,7 +44,6 @@ const Zoom = ({
46
44
  {(zoom) => (
47
45
  <ZoomContent
48
46
  height={height}
49
- id={id}
50
47
  minimapPosition={minimapPosition}
51
48
  showMinimap={showMinimap}
52
49
  width={width}
@@ -18,7 +18,6 @@ import { ChildrenProps, MinimapPosition, ZoomState } from './models';
18
18
  export interface Props {
19
19
  children: ({ width, height, transformMatrix }: ChildrenProps) => JSX.Element;
20
20
  height: number;
21
- id?: number | string;
22
21
  minimapPosition: MinimapPosition;
23
22
  showMinimap?: boolean;
24
23
  width: number;
@@ -31,8 +30,7 @@ const ZoomContent = ({
31
30
  height,
32
31
  children,
33
32
  showMinimap,
34
- minimapPosition,
35
- id
33
+ minimapPosition
36
34
  }: Props): JSX.Element => {
37
35
  const { classes } = useZoomStyles();
38
36
  const contentRef = useRef<SVGGElement | null>(null);
@@ -94,7 +92,7 @@ const ZoomContent = ({
94
92
  >
95
93
  <RectClipPath
96
94
  height={Math.max(contentClientRect?.height || 0, height)}
97
- id={`zoom-clip-${id}`}
95
+ id="zoom-clip"
98
96
  rx={radius}
99
97
  width={Math.max(contentClientRect?.width || 0, width)}
100
98
  />
@@ -126,7 +124,6 @@ const ZoomContent = ({
126
124
  diffBetweenContentAndSvg || { left: 0, top: 0 }
127
125
  }
128
126
  height={height}
129
- id={id}
130
127
  isDraggingFromContainer={isDragging}
131
128
  width={width}
132
129
  zoom={zoom}
@@ -12,4 +12,3 @@ export * from './Avatar';
12
12
  export * from './CollapsibleItem';
13
13
  export * from './Inputs';
14
14
  export { default as Zoom } from './Zoom/Zoom';
15
- export * from './Tabs';
@@ -22,4 +22,3 @@ export * from './centreonBaseURL';
22
22
  export * from './usePluralizedTranslation';
23
23
  export * from './useResizeObserver';
24
24
  export * from './useFullscreen';
25
- export * from './resourcesStatusURL';
@@ -1,11 +1,5 @@
1
- import { useCallback } from 'react';
2
-
3
1
  import { useTranslation } from 'react-i18next';
4
2
  import pluralize from 'pluralize';
5
- import { useAtomValue } from 'jotai';
6
- import { equals, includes } from 'ramda';
7
-
8
- import { userAtom } from '@centreon/ui-context';
9
3
 
10
4
  interface TProps {
11
5
  count: number;
@@ -16,21 +10,10 @@ export const usePluralizedTranslation = (): {
16
10
  pluralizedT: (props: TProps) => string;
17
11
  } => {
18
12
  const translation = useTranslation();
19
- const { locale } = useAtomValue(userAtom);
20
-
21
- const isNotPartitiveLocale = includes('fr', locale);
22
13
 
23
- const pluralizedT = useCallback(
24
- ({ label, count }: TProps): string => {
25
- const isZero = equals(count, 0);
26
-
27
- return pluralize(
28
- translation.t(label),
29
- isZero && isNotPartitiveLocale ? 1 : count
30
- );
31
- },
32
- [isNotPartitiveLocale]
33
- );
14
+ const pluralizedT = ({ label, count }: TProps): string => {
15
+ return pluralize(translation.t(label), count);
16
+ };
34
17
 
35
18
  return {
36
19
  pluralizedT
@@ -1,30 +0,0 @@
1
- import { useEffect } from 'react';
2
-
3
- import { useAtomValue } from 'jotai';
4
-
5
- import { useDeepCompare } from '../../../utils';
6
-
7
- import { valuesAtom } from './atoms';
8
- import { formatValueForSubmition } from './utils';
9
- import { AccessRightInitialValues } from './models';
10
-
11
- export const useAccessRightsChange = (
12
- onChange?: (values: Array<AccessRightInitialValues>) => void
13
- ): void => {
14
- const values = useAtomValue(valuesAtom);
15
-
16
- useEffect(
17
- () => {
18
- if (!onChange) {
19
- return;
20
- }
21
-
22
- onChange(
23
- values
24
- .filter(({ isRemoved }) => !isRemoved)
25
- .map(formatValueForSubmition)
26
- );
27
- },
28
- useDeepCompare([values])
29
- );
30
- };
@@ -1,18 +0,0 @@
1
- import { omit } from 'ramda';
2
-
3
- import { AccessRight, AccessRightInitialValues } from './models';
4
-
5
- export const formatValue = (
6
- accessRight: AccessRight
7
- ): AccessRightInitialValues => {
8
- return omit(['isAdded', 'isUpdated', 'isRemoved'], accessRight);
9
- };
10
-
11
- export const formatValueForSubmition = (
12
- accessRight: AccessRight
13
- ): AccessRightInitialValues => {
14
- return {
15
- ...formatValue(accessRight),
16
- id: Number((accessRight.id as string).split('_')[1])
17
- };
18
- };
@@ -1,25 +0,0 @@
1
- import { makeStyles } from 'tss-react/mui';
2
-
3
- export const useTabsStyles = makeStyles()((theme) => ({
4
- indicator: {
5
- bottom: 'unset'
6
- },
7
- tab: {
8
- '&[aria-selected="true"]': {
9
- color: theme.palette.text.primary,
10
- fontWeight: theme.typography.fontWeightBold
11
- },
12
- color: theme.palette.text.primary,
13
- fontWeight: theme.typography.fontWeightRegular,
14
- marginRight: theme.spacing(2),
15
- minHeight: 0,
16
- minWidth: 0,
17
- padding: theme.spacing(0.5, 0)
18
- },
19
- tabPanel: {
20
- padding: theme.spacing(1, 0, 0)
21
- },
22
- tabs: {
23
- minHeight: theme.spacing(4.5)
24
- }
25
- }));
@@ -1,22 +0,0 @@
1
- import { TabPanel as MuiTabPanel } from '@mui/lab';
2
-
3
- import { useTabsStyles } from './Tab.styles';
4
-
5
- type Props = {
6
- children: JSX.Element;
7
- value: string;
8
- };
9
-
10
- export const TabPanel = ({ children, value }: Props): JSX.Element => {
11
- const { classes } = useTabsStyles();
12
-
13
- return (
14
- <MuiTabPanel
15
- className={classes.tabPanel}
16
- data-tabPanel={value}
17
- value={value}
18
- >
19
- {children}
20
- </MuiTabPanel>
21
- );
22
- };
@@ -1,70 +0,0 @@
1
- import { Typography } from '@mui/material';
2
-
3
- import { TabPanel } from './TabPanel';
4
-
5
- import { Tabs } from '.';
6
-
7
- const initialize = (withTabListProps = false): void => {
8
- cy.mount({
9
- Component: (
10
- <Tabs
11
- defaultTab="tab 0"
12
- tabList={
13
- withTabListProps
14
- ? {
15
- variant: 'fullWidth'
16
- }
17
- : undefined
18
- }
19
- tabs={[
20
- { label: 'Tab 0', value: 'tab 0' },
21
- { label: 'Tab 1', value: 'tab 1' }
22
- ]}
23
- >
24
- <TabPanel value="tab 0">
25
- <Typography>Tab 0</Typography>
26
- </TabPanel>
27
- <TabPanel value="tab 1">
28
- <Typography>Tab 1</Typography>
29
- </TabPanel>
30
- </Tabs>
31
- )
32
- });
33
- };
34
-
35
- describe('Tabs', () => {
36
- it('displays tabs and their content when a tab is selected', () => {
37
- initialize();
38
-
39
- cy.get('[data-TabPanel="tab 0"]').should('not.have.attr', 'hidden');
40
- cy.get('[data-TabPanel="tab 1"]').should('have.attr', 'hidden');
41
- cy.findByLabelText('Tab 0')
42
- .should('have.attr', 'aria-selected')
43
- .and('equals', 'true');
44
- cy.findByLabelText('Tab 1')
45
- .should('have.attr', 'aria-selected')
46
- .and('equals', 'false');
47
-
48
- cy.contains('Tab 1').click();
49
-
50
- cy.get('[data-TabPanel="tab 0"]').should('have.attr', 'hidden');
51
- cy.get('[data-TabPanel="tab 1"]').should('not.have.attr', 'hidden');
52
- cy.findByLabelText('Tab 0')
53
- .should('have.attr', 'aria-selected')
54
- .and('equals', 'false');
55
- cy.findByLabelText('Tab 1')
56
- .should('have.attr', 'aria-selected')
57
- .and('equals', 'true');
58
-
59
- cy.makeSnapshot();
60
- });
61
-
62
- it('displays tabs when tabList props are set', () => {
63
- initialize(true);
64
-
65
- cy.get('[data-TabPanel="tab 0"]').should('not.have.attr', 'hidden');
66
- cy.get('[data-TabPanel="tab 1"]').should('have.attr', 'hidden');
67
-
68
- cy.makeSnapshot();
69
- });
70
- });
@@ -1,55 +0,0 @@
1
- import { Meta, StoryObj } from '@storybook/react';
2
-
3
- import { Typography } from '@mui/material';
4
-
5
- import { TabPanel } from './TabPanel';
6
-
7
- import { Tabs } from '.';
8
-
9
- const meta: Meta<typeof Tabs> = {
10
- component: Tabs
11
- };
12
-
13
- export default meta;
14
- type Story = StoryObj<typeof Tabs>;
15
-
16
- const generateTabs = (size: number): Array<{ label: string; value: string }> =>
17
- Array(size)
18
- .fill(0)
19
- .map((_, index) => ({ label: `Tab ${index}`, value: `tab ${index}` }));
20
-
21
- export const Default: Story = {
22
- args: {
23
- defaultTab: 'tab 0',
24
- tabs: generateTabs(2)
25
- },
26
- render: (args) => (
27
- <Tabs {...args}>
28
- {generateTabs(2).map(({ value, label }) => (
29
- <TabPanel key={value} value={value}>
30
- <Typography>{label}</Typography>
31
- </TabPanel>
32
- ))}
33
- </Tabs>
34
- )
35
- };
36
-
37
- export const WithTabListProps: Story = {
38
- args: {
39
- defaultTab: 'tab 0',
40
- tabList: {
41
- textColor: 'inherit',
42
- variant: 'fullWidth'
43
- },
44
- tabs: generateTabs(2)
45
- },
46
- render: (args) => (
47
- <Tabs {...args}>
48
- {generateTabs(2).map(({ value, label }) => (
49
- <TabPanel key={value} value={value}>
50
- <Typography>{label}</Typography>
51
- </TabPanel>
52
- ))}
53
- </Tabs>
54
- )
55
- };
@@ -1,55 +0,0 @@
1
- import { useCallback, useState } from 'react';
2
-
3
- import { TabContext, TabList, TabListProps } from '@mui/lab';
4
- import { Tab } from '@mui/material';
5
-
6
- import { useTabsStyles } from './Tab.styles';
7
-
8
- type Props = {
9
- children: Array<JSX.Element>;
10
- defaultTab: string;
11
- tabList?: TabListProps;
12
- tabs: Array<{
13
- label: string;
14
- value: string;
15
- }>;
16
- };
17
-
18
- export const Tabs = ({
19
- children,
20
- defaultTab,
21
- tabs,
22
- tabList
23
- }: Props): JSX.Element => {
24
- const { classes } = useTabsStyles();
25
-
26
- const [selectedTab, setSelectedTab] = useState(defaultTab);
27
-
28
- const changeTab = useCallback((_, newValue: string): void => {
29
- setSelectedTab(newValue);
30
- }, []);
31
-
32
- return (
33
- <TabContext value={selectedTab}>
34
- <TabList
35
- classes={{
36
- indicator: classes.indicator,
37
- root: classes.tabs
38
- }}
39
- onChange={changeTab}
40
- {...tabList}
41
- >
42
- {tabs.map(({ value, label }) => (
43
- <Tab
44
- aria-label={label}
45
- className={classes.tab}
46
- key={value}
47
- label={label}
48
- value={value}
49
- />
50
- ))}
51
- </TabList>
52
- {children}
53
- </TabContext>
54
- );
55
- };
@@ -1,6 +0,0 @@
1
- import { TabPanel } from './TabPanel';
2
- import { Tabs as TabsRoot } from './Tabs';
3
-
4
- export const Tabs = Object.assign(TabsRoot, {
5
- TabPanel
6
- });