@centreon/ui 24.4.45 → 24.4.47

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@centreon/ui",
3
- "version": "24.4.45",
3
+ "version": "24.4.47",
4
4
  "description": "Centreon UI Components",
5
5
  "scripts": {
6
6
  "eslint": "eslint ./src --ext .js,.jsx,.ts,.tsx --max-warnings 0",
@@ -1,4 +1,4 @@
1
- import { DialogContentText, Typography } from '@mui/material';
1
+ import { ButtonProps, DialogContentText, Typography } from '@mui/material';
2
2
 
3
3
  import Dialog, { Props as DialogProps } from '..';
4
4
 
@@ -6,15 +6,23 @@ type Props = DialogProps & {
6
6
  children?: JSX.Element;
7
7
  labelMessage?: string | null;
8
8
  labelSecondMessage?: string | null;
9
+ restCancelButtonProps?: ButtonProps;
10
+ restConfirmButtonProps?: ButtonProps;
9
11
  };
10
12
 
11
13
  const Confirm = ({
12
14
  labelMessage,
13
15
  labelSecondMessage,
14
16
  children,
17
+ restCancelButtonProps,
18
+ restConfirmButtonProps,
15
19
  ...rest
16
20
  }: Props): JSX.Element => (
17
- <Dialog {...rest}>
21
+ <Dialog
22
+ restCancelButtonProps={restCancelButtonProps}
23
+ restConfirmButtonProps={restConfirmButtonProps}
24
+ {...rest}
25
+ >
18
26
  <DialogContentText>
19
27
  {labelMessage && <Typography>{labelMessage}</Typography>}
20
28
  {labelSecondMessage && <Typography>{labelSecondMessage}</Typography>}
@@ -9,7 +9,8 @@ import {
9
9
  DialogContent,
10
10
  DialogActions,
11
11
  DialogProps,
12
- CircularProgress
12
+ CircularProgress,
13
+ ButtonProps
13
14
  } from '@mui/material';
14
15
 
15
16
  import { DataTestAttributes } from '../@types/data-attributes';
@@ -48,6 +49,8 @@ export type Props = {
48
49
  onClose?: () => void;
49
50
  onConfirm: (event, value?) => void;
50
51
  open: boolean;
52
+ restCancelButtonProps?: ButtonProps;
53
+ restConfirmButtonProps?: ButtonProps;
51
54
  submitting?: boolean;
52
55
  } & DialogProps &
53
56
  DataTestAttributes;
@@ -70,6 +73,8 @@ const Dialog = ({
70
73
  dialogContentClassName,
71
74
  dialogActionsClassName,
72
75
  dialogConfirmButtonClassName,
76
+ restCancelButtonProps,
77
+ restConfirmButtonProps,
73
78
  ...rest
74
79
  }: Props): JSX.Element => {
75
80
  const { classes, cx } = useStyles({ contentWidth });
@@ -101,6 +106,7 @@ const Dialog = ({
101
106
  data-testid="Cancel"
102
107
  disabled={cancelDisabled}
103
108
  onClick={onCancel}
109
+ {...restCancelButtonProps}
104
110
  >
105
111
  {labelCancel}
106
112
  </Button>
@@ -113,6 +119,7 @@ const Dialog = ({
113
119
  disabled={confirmDisabled}
114
120
  endIcon={submitting && <CircularProgress size={15} />}
115
121
  onClick={onConfirm}
122
+ {...restConfirmButtonProps}
116
123
  >
117
124
  {labelConfirm}
118
125
  </Button>
@@ -21,3 +21,4 @@ export * from './useRefreshInterval';
21
21
  export * from './centreonBaseURL';
22
22
  export * from './usePluralizedTranslation';
23
23
  export * from './useResizeObserver';
24
+ export * from './useFullscreen';
@@ -0,0 +1,109 @@
1
+ import { Provider, createStore } from 'jotai';
2
+ import { BrowserRouter } from 'react-router-dom';
3
+
4
+ import { Button } from '@mui/material';
5
+
6
+ import { useFullscreen } from './useFullscreen';
7
+ import { router, useFullscreenListener } from './useFullscreenListener';
8
+
9
+ const labelEnterFullscreen = 'Enter fullscreen';
10
+ const labelExitFullscreen = 'Exit fullscreen';
11
+
12
+ const ChildComponent = (): JSX.Element => {
13
+ const { toggleFullscreen, fullscreenEnabled, isFullscreenActivated } =
14
+ useFullscreen();
15
+
16
+ return (
17
+ <div
18
+ data-fullscreenActivated={isFullscreenActivated}
19
+ data-fullscreenEnabled={fullscreenEnabled}
20
+ id="test"
21
+ >
22
+ <Button onClick={() => toggleFullscreen(document.body)}>
23
+ {isFullscreenActivated ? labelExitFullscreen : labelEnterFullscreen}
24
+ </Button>
25
+ </div>
26
+ );
27
+ };
28
+
29
+ const TestComponent = (): JSX.Element => {
30
+ useFullscreenListener();
31
+
32
+ return <ChildComponent />;
33
+ };
34
+
35
+ const initialize = (): void => {
36
+ const store = createStore();
37
+
38
+ const queryParameters = new Map();
39
+
40
+ cy.stub(router, 'useSearchParams', () => queryParameters);
41
+
42
+ cy.mount({
43
+ Component: (
44
+ <BrowserRouter>
45
+ <Provider store={store}>
46
+ <TestComponent />
47
+ </Provider>
48
+ </BrowserRouter>
49
+ )
50
+ });
51
+ };
52
+
53
+ describe('Fullscreen', () => {
54
+ it('enters fullscreen mode when the button is clicked', () => {
55
+ initialize();
56
+
57
+ cy.get('#test')
58
+ .should('have.attr', 'data-fullscreenActivated', 'false')
59
+ .should('have.attr', 'data-fullscreenEnabled', 'true');
60
+
61
+ cy.contains(labelEnterFullscreen).realClick();
62
+
63
+ cy.get('#test')
64
+ .should('have.attr', 'data-fullscreenActivated', 'true')
65
+ .should('have.attr', 'data-fullscreenEnabled', 'true');
66
+
67
+ cy.contains(labelExitFullscreen).realClick();
68
+ });
69
+
70
+ it('exits fullscreen mode when the button is clicked', () => {
71
+ initialize();
72
+
73
+ cy.get('#test')
74
+ .should('have.attr', 'data-fullscreenActivated', 'false')
75
+ .should('have.attr', 'data-fullscreenEnabled', 'true');
76
+
77
+ cy.contains(labelEnterFullscreen).realClick();
78
+
79
+ cy.get('#test')
80
+ .should('have.attr', 'data-fullscreenActivated', 'true')
81
+ .should('have.attr', 'data-fullscreenEnabled', 'true');
82
+
83
+ cy.contains(labelExitFullscreen).realClick();
84
+
85
+ cy.get('#test')
86
+ .should('have.attr', 'data-fullscreenActivated', 'false')
87
+ .should('have.attr', 'data-fullscreenEnabled', 'true');
88
+ });
89
+
90
+ it('toggles fullscreen mode when the corresponding shortcut is clicked', () => {
91
+ initialize();
92
+
93
+ cy.get('#test')
94
+ .should('have.attr', 'data-fullscreenActivated', 'false')
95
+ .should('have.attr', 'data-fullscreenEnabled', 'true');
96
+
97
+ cy.get('#test').realPress(['Alt', 'F']);
98
+
99
+ cy.get('#test')
100
+ .should('have.attr', 'data-fullscreenActivated', 'true')
101
+ .should('have.attr', 'data-fullscreenEnabled', 'true');
102
+
103
+ cy.get('#test').realPress(['Alt', 'F']);
104
+
105
+ cy.get('#test')
106
+ .should('have.attr', 'data-fullscreenActivated', 'false')
107
+ .should('have.attr', 'data-fullscreenEnabled', 'true');
108
+ });
109
+ });
@@ -0,0 +1,3 @@
1
+ import { atom } from 'jotai';
2
+
3
+ export const isFullscreenActivatedAtom = atom(false);
@@ -0,0 +1,2 @@
1
+ export * from './useFullscreen';
2
+ export * from './useFullscreenListener';
@@ -0,0 +1 @@
1
+ export const labelCannotEnterInFullscreen = 'Cannot enter fullscreen mode';
@@ -0,0 +1,73 @@
1
+ import { useTranslation } from 'react-i18next';
2
+ import { useAtom } from 'jotai';
3
+
4
+ import { useSnackbar } from '../..';
5
+
6
+ import { labelCannotEnterInFullscreen } from './translatedLabels';
7
+ import { isFullscreenActivatedAtom } from './atoms';
8
+
9
+ interface UseFullscreenState {
10
+ enterInFullscreen: (element: HTMLElement | null) => void;
11
+ exitFullscreen: () => void;
12
+ fullscreenEnabled: boolean;
13
+ isFullscreenActivated: boolean;
14
+ resetVariables: () => void;
15
+ toggleFullscreen: (element: HTMLElement | null) => void;
16
+ }
17
+
18
+ export const useFullscreen = (): UseFullscreenState => {
19
+ const { t } = useTranslation();
20
+
21
+ const { showErrorMessage } = useSnackbar();
22
+
23
+ const [isFullscreenActivated, setIsFullscreenActivated] = useAtom(
24
+ isFullscreenActivatedAtom
25
+ );
26
+
27
+ const resetVariables = (): void => {
28
+ setIsFullscreenActivated(false);
29
+ };
30
+
31
+ const enterInFullscreen = (element: HTMLElement | null): void => {
32
+ if (!document.fullscreenEnabled) {
33
+ return;
34
+ }
35
+
36
+ if (!element) {
37
+ showErrorMessage(t(labelCannotEnterInFullscreen));
38
+ }
39
+
40
+ element
41
+ ?.requestFullscreen({ navigationUI: 'show' })
42
+ .then(() => {
43
+ setIsFullscreenActivated(true);
44
+ })
45
+ .catch(() => {
46
+ showErrorMessage(t(labelCannotEnterInFullscreen));
47
+ setIsFullscreenActivated(false);
48
+ });
49
+ };
50
+
51
+ const exitFullscreen = (): void => {
52
+ document.exitFullscreen().then(resetVariables);
53
+ };
54
+
55
+ const toggleFullscreen = (element: HTMLElement | null): void => {
56
+ if (isFullscreenActivated) {
57
+ exitFullscreen();
58
+
59
+ return;
60
+ }
61
+
62
+ enterInFullscreen(element);
63
+ };
64
+
65
+ return {
66
+ enterInFullscreen,
67
+ exitFullscreen,
68
+ fullscreenEnabled: document.fullscreenEnabled,
69
+ isFullscreenActivated,
70
+ resetVariables,
71
+ toggleFullscreen
72
+ };
73
+ };
@@ -0,0 +1,54 @@
1
+ import { useEffect } from 'react';
2
+
3
+ import { equals } from 'ramda';
4
+ import { useSearchParams } from 'react-router-dom';
5
+
6
+ import { useDeepCompare } from '../useMemoComponent';
7
+
8
+ import { useFullscreen } from './useFullscreen';
9
+
10
+ export const router = {
11
+ useSearchParams
12
+ };
13
+
14
+ export const useFullscreenListener = (): boolean => {
15
+ const { toggleFullscreen, resetVariables, isFullscreenActivated } =
16
+ useFullscreen();
17
+
18
+ const toggle = (event: KeyboardEvent): void => {
19
+ if (!event.altKey || !equals(event.code, 'KeyF')) {
20
+ return;
21
+ }
22
+
23
+ toggleFullscreen(document.querySelector('body'));
24
+ };
25
+
26
+ const changeFullscreen = (): void => {
27
+ if (document.fullscreenElement) {
28
+ return;
29
+ }
30
+
31
+ resetVariables();
32
+ };
33
+
34
+ useEffect(
35
+ () => {
36
+ document.addEventListener('fullscreenchange', changeFullscreen);
37
+
38
+ return () => {
39
+ document.removeEventListener('fullscreenchange', changeFullscreen);
40
+ };
41
+ },
42
+ useDeepCompare([document.fullscreenElement])
43
+ );
44
+
45
+ useEffect(() => {
46
+ window.addEventListener('keypress', toggle);
47
+
48
+ return () => {
49
+ window.removeEventListener('keypress', toggle);
50
+ };
51
+ }, [isFullscreenActivated]);
52
+
53
+ return isFullscreenActivated;
54
+ };