@centreon/ui 24.4.1-MON-32982-migrate-playlists-front-code.2 → 24.4.1-MON-21276-Create-a-basic-token.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@centreon/ui",
3
- "version": "24.4.1-MON-32982-migrate-playlists-front-code.2",
3
+ "version": "24.4.1-MON-21276-Create-a-basic-token.0",
4
4
  "description": "Centreon UI Components",
5
5
  "scripts": {
6
6
  "eslint": "eslint ./src --ext .js,.jsx,.ts,.tsx --max-warnings 0",
@@ -1,7 +1,6 @@
1
- import { useTranslation } from 'react-i18next';
2
-
3
1
  import CheckIcon from '@mui/icons-material/Check';
4
2
  import SaveIcon from '@mui/icons-material/Save';
3
+ import { Typography, TypographyProps } from '@mui/material';
5
4
 
6
5
  interface Props {
7
6
  labelLoading: string;
@@ -11,24 +10,42 @@ interface Props {
11
10
  succeeded: boolean;
12
11
  }
13
12
 
13
+ interface WrapperLabelProps {
14
+ label: string;
15
+ }
16
+
17
+ const WrapperLabel = ({
18
+ label,
19
+ ...rest
20
+ }: WrapperLabelProps & TypographyProps): JSX.Element => {
21
+ return <Typography {...rest}>{label}</Typography>;
22
+ };
23
+
14
24
  const Content = ({
15
25
  succeeded,
16
26
  labelSucceeded,
17
27
  labelSave,
18
28
  loading,
19
- labelLoading
20
- }: Props): JSX.Element | string | null => {
21
- const { t } = useTranslation();
22
-
29
+ labelLoading,
30
+ ...rest
31
+ }: Props & TypographyProps): JSX.Element | string | null => {
23
32
  if (loading) {
24
- return t(labelLoading);
33
+ return <WrapperLabel label={labelLoading} {...rest} />;
25
34
  }
26
35
 
27
36
  if (succeeded) {
28
- return labelSucceeded ? t(labelSucceeded) : <CheckIcon />;
37
+ return labelSucceeded ? (
38
+ <WrapperLabel label={labelSucceeded} {...rest} />
39
+ ) : (
40
+ <CheckIcon />
41
+ );
29
42
  }
30
43
 
31
- return labelSave ? t(labelSave) : <SaveIcon />;
44
+ return labelSave ? (
45
+ <WrapperLabel label={labelSave} {...rest} />
46
+ ) : (
47
+ <SaveIcon />
48
+ );
32
49
  };
33
50
 
34
51
  export default Content;
@@ -1,7 +1,7 @@
1
1
  import { any, isEmpty, isNil, not, or, pipe } from 'ramda';
2
2
  import { makeStyles } from 'tss-react/mui';
3
3
 
4
- import { Theme, Tooltip } from '@mui/material';
4
+ import { Theme, Tooltip, TypographyProps } from '@mui/material';
5
5
  import { LoadingButton } from '@mui/lab';
6
6
 
7
7
  import { getNormalizedId } from '../../utils';
@@ -18,10 +18,12 @@ const useStyles = makeStyles()((theme: Theme) => ({
18
18
  interface Props extends Record<string, unknown> {
19
19
  className?: string;
20
20
  labelLoading?: string;
21
+ labelProps?: TypographyProps;
21
22
  labelSave?: string;
22
23
  labelSucceeded?: string;
23
24
  loading?: boolean;
24
25
  size?: 'small' | 'medium' | 'large';
26
+ startIcon?: boolean;
25
27
  succeeded?: boolean;
26
28
  tooltip?: string;
27
29
  tooltipLabel?: string;
@@ -45,6 +47,8 @@ const SaveButton = ({
45
47
  labelSave = '',
46
48
  size = 'small',
47
49
  className,
50
+ startIcon = true,
51
+ labelProps,
48
52
  ...rest
49
53
  }: Props): JSX.Element => {
50
54
  const { classes, cx } = useStyles();
@@ -73,7 +77,9 @@ const SaveButton = ({
73
77
  loading={loading}
74
78
  loadingPosition={labelLoading ? 'start' : 'center'}
75
79
  size={size}
76
- startIcon={<StartIcon startIconConfig={startIconConfig} />}
80
+ startIcon={
81
+ startIcon && <StartIcon startIconConfig={startIconConfig} />
82
+ }
77
83
  variant="contained"
78
84
  {...rest}
79
85
  >
@@ -82,7 +88,8 @@ const SaveButton = ({
82
88
  labelSave,
83
89
  labelSucceeded,
84
90
  loading,
85
- succeeded
91
+ succeeded,
92
+ ...labelProps
86
93
  })}
87
94
  </LoadingButton>
88
95
  </div>
@@ -2,7 +2,7 @@ import { makeStyles } from 'tss-react/mui';
2
2
  import { T, always, cond, equals } from 'ramda';
3
3
 
4
4
  import { SvgIconComponent } from '@mui/icons-material';
5
- import Typography, { TypographyTypeMap } from '@mui/material/Typography';
5
+ import Typography, { TypographyProps } from '@mui/material/Typography';
6
6
  import { FormControlLabel, Checkbox as MuiCheckbox, Box } from '@mui/material';
7
7
 
8
8
  export type LabelPlacement = 'bottom' | 'top' | 'end' | 'start' | undefined;
@@ -56,7 +56,7 @@ interface Props {
56
56
  disabled?: boolean;
57
57
  label: string;
58
58
  labelPlacement?: LabelPlacement;
59
- labelProps?: TypographyTypeMap['props'];
59
+ labelProps?: TypographyProps;
60
60
  onChange?: (e) => void;
61
61
  }
62
62
 
@@ -2,7 +2,7 @@ import { equals, includes } from 'ramda';
2
2
  import { makeStyles } from 'tss-react/mui';
3
3
 
4
4
  import FormGroup, { FormGroupProps } from '@mui/material/FormGroup';
5
- import { TypographyTypeMap } from '@mui/material/Typography';
5
+ import { TypographyProps } from '@mui/material/Typography';
6
6
 
7
7
  import Checkbox, { LabelPlacement } from '../Checkbox';
8
8
 
@@ -13,7 +13,7 @@ interface Props {
13
13
  disabled?: boolean;
14
14
  formGroupProps?: FormGroupProps;
15
15
  labelPlacement?: LabelPlacement;
16
- labelProps?: TypographyTypeMap['props'];
16
+ labelProps?: TypographyProps;
17
17
  onChange?: (e) => void;
18
18
  options: Array<string>;
19
19
  values: Array<string>;
@@ -43,7 +43,7 @@ export type Props = {
43
43
  dialogTitleClassName?: string;
44
44
  labelCancel?: string | null;
45
45
  labelConfirm?: string | null;
46
- labelTitle?: string | null;
46
+ labelTitle?: ReactNode | null;
47
47
  onCancel?: () => void;
48
48
  onClose?: () => void;
49
49
  onConfirm: (event, value?) => void;
@@ -17,7 +17,7 @@ const useStyles = makeStyles()((theme) => ({
17
17
  logo: {
18
18
  alignSelf: 'flex-end',
19
19
  height: theme.spacing(11),
20
- width: '239px'
20
+ width: '22rem'
21
21
  },
22
22
  message: {
23
23
  color: theme.palette.text.primary
@@ -66,9 +66,9 @@ export const FallbackPage: FC<FallbackPageProps> = typedMemo(
66
66
 
67
67
  return (
68
68
  <div className={classes.notAuthorizedContainer}>
69
- <div className={classes.logo}>
69
+ <section className={classes.logo}>
70
70
  <CentreonLogo />
71
- </div>
71
+ </section>
72
72
  <section className={classes.messageBlock}>
73
73
  <header>
74
74
  <Typography color="primary" fontWeight="bold" variant="h3">
@@ -141,126 +141,132 @@ type Multiple = boolean;
141
141
  type DisableClearable = boolean;
142
142
  type FreeSolo = boolean;
143
143
 
144
- const AutocompleteField = ({
145
- options,
146
- label,
147
- placeholder,
148
- loading = false,
149
- onTextChange = (): void => undefined,
150
- endAdornment = undefined,
151
- inputValue,
152
- displayOptionThumbnail = false,
153
- required = false,
154
- error,
155
- displayPopupIcon = true,
156
- autoFocus = false,
157
- hideInput = false,
158
- dataTestId,
159
- autoSize = false,
160
- autoSizeDefaultWidth = 0,
161
- autoSizeCustomPadding,
162
- getOptionItemLabel = (option) => option.name,
163
- ...autocompleteProps
164
- }: Props): JSX.Element => {
165
- const { classes, cx } = useStyles({ hideInput });
166
- const { t } = useTranslation();
167
- const theme = useTheme();
144
+ const AutocompleteField = React.forwardRef(
145
+ (
146
+ {
147
+ options,
148
+ label,
149
+ placeholder,
150
+ loading = false,
151
+ onTextChange = (): void => undefined,
152
+ endAdornment = undefined,
153
+ inputValue,
154
+ displayOptionThumbnail = false,
155
+ required = false,
156
+ error,
157
+ displayPopupIcon = true,
158
+ autoFocus = false,
159
+ hideInput = false,
160
+ dataTestId,
161
+ autoSize = false,
162
+ autoSizeDefaultWidth = 0,
163
+ autoSizeCustomPadding,
164
+ getOptionItemLabel = (option) => option.name,
165
+ ...autocompleteProps
166
+ }: Props,
167
+ ref?: React.ForwardedRef<HTMLDivElement>
168
+ ): JSX.Element => {
169
+ const { classes, cx } = useStyles({ hideInput });
170
+ const { t } = useTranslation();
171
+ const theme = useTheme();
168
172
 
169
- const areSelectEntriesEqual = (option, value): boolean => {
170
- const identifyingProps = ['id', 'name'];
173
+ const areSelectEntriesEqual = (option, value): boolean => {
174
+ const identifyingProps = ['id', 'name'];
171
175
 
172
- return equals(
173
- pick(identifyingProps, option),
174
- pick(identifyingProps, value)
176
+ return equals(
177
+ pick(identifyingProps, option),
178
+ pick(identifyingProps, value)
179
+ );
180
+ };
181
+
182
+ const renderInput = (params): JSX.Element => (
183
+ <TextField
184
+ {...params}
185
+ InputLabelProps={{
186
+ classes: {
187
+ marginDense: classes.inputLabel,
188
+ shrink: classes.inputLabelShrink
189
+ }
190
+ }}
191
+ InputProps={{
192
+ ...params.InputProps,
193
+ endAdornment: (
194
+ <>
195
+ {endAdornment && (
196
+ <InputAdornment position="end">{endAdornment}</InputAdornment>
197
+ )}
198
+ {params.InputProps.endAdornment}
199
+ </>
200
+ ),
201
+ style: {
202
+ background: 'transparent',
203
+ paddingRight: theme.spacing(5)
204
+ }
205
+ }}
206
+ autoFocus={autoFocus}
207
+ autoSize={autoSize}
208
+ autoSizeCustomPadding={7 + (autoSizeCustomPadding || 0)}
209
+ autoSizeDefaultWidth={autoSizeDefaultWidth}
210
+ classes={{
211
+ root: classes.textfield
212
+ }}
213
+ error={error}
214
+ externalValueForAutoSize={autocompleteProps?.value?.name}
215
+ inputProps={{
216
+ ...params.inputProps,
217
+ 'aria-label': label,
218
+ 'data-testid': dataTestId || label,
219
+ id: getNormalizedId(label || '')
220
+ }}
221
+ label={label}
222
+ placeholder={isNil(placeholder) ? t(searchLabel) : placeholder}
223
+ required={required}
224
+ value={inputValue || undefined}
225
+ onChange={onTextChange}
226
+ />
175
227
  );
176
- };
177
228
 
178
- const renderInput = (params): JSX.Element => (
179
- <TextField
180
- {...params}
181
- InputLabelProps={{
182
- classes: {
183
- marginDense: classes.inputLabel,
184
- shrink: classes.inputLabelShrink
185
- }
186
- }}
187
- InputProps={{
188
- ...params.InputProps,
189
- endAdornment: (
190
- <>
191
- {endAdornment && (
192
- <InputAdornment position="end">{endAdornment}</InputAdornment>
193
- )}
194
- {params.InputProps.endAdornment}
195
- </>
196
- ),
197
- style: {
198
- background: 'transparent',
199
- paddingRight: theme.spacing(5)
229
+ return (
230
+ <Autocomplete
231
+ disableClearable
232
+ classes={{
233
+ groupLabel: classes.inputLabel,
234
+ inputRoot: cx([
235
+ classes.input,
236
+ label ? classes.inputWithLabel : classes.inputWithoutLabel
237
+ ]),
238
+ popper: classes.popper,
239
+ root: classes.textfield
240
+ }}
241
+ forcePopupIcon={displayPopupIcon}
242
+ getOptionLabel={(option): string =>
243
+ (option as SelectEntry)?.name?.toString() || ''
200
244
  }
201
- }}
202
- autoFocus={autoFocus}
203
- autoSize={autoSize}
204
- autoSizeCustomPadding={7 + (autoSizeCustomPadding || 0)}
205
- autoSizeDefaultWidth={autoSizeDefaultWidth}
206
- classes={{
207
- root: classes.textfield
208
- }}
209
- error={error}
210
- externalValueForAutoSize={autocompleteProps?.value?.name}
211
- inputProps={{
212
- ...params.inputProps,
213
- 'aria-label': label,
214
- 'data-testid': dataTestId || label,
215
- id: getNormalizedId(label || '')
216
- }}
217
- label={label}
218
- placeholder={isNil(placeholder) ? t(searchLabel) : placeholder}
219
- required={required}
220
- value={inputValue || undefined}
221
- onChange={onTextChange}
222
- />
223
- );
224
-
225
- return (
226
- <Autocomplete
227
- disableClearable
228
- classes={{
229
- groupLabel: classes.inputLabel,
230
- inputRoot: cx([
231
- classes.input,
232
- label ? classes.inputWithLabel : classes.inputWithoutLabel
233
- ]),
234
- popper: classes.popper,
235
- root: classes.textfield
236
- }}
237
- forcePopupIcon={displayPopupIcon}
238
- getOptionLabel={(option): string =>
239
- (option as SelectEntry)?.name?.toString() || ''
240
- }
241
- isOptionEqualToValue={areSelectEntriesEqual}
242
- loading={loading}
243
- loadingText={<LoadingIndicator />}
244
- options={options}
245
- renderInput={renderInput}
246
- renderOption={(props, option): JSX.Element => {
247
- return (
248
- <li
249
- className={classes.options}
250
- {...(props as React.HTMLAttributes<HTMLLIElement>)}
251
- >
252
- <Option
253
- thumbnailUrl={displayOptionThumbnail ? option.url : undefined}
245
+ isOptionEqualToValue={areSelectEntriesEqual}
246
+ loading={loading}
247
+ loadingText={<LoadingIndicator />}
248
+ options={options}
249
+ ref={ref}
250
+ renderInput={renderInput}
251
+ renderOption={(props, option): JSX.Element => {
252
+ return (
253
+ <li
254
+ className={classes.options}
255
+ {...(props as React.HTMLAttributes<HTMLLIElement>)}
254
256
  >
255
- {getOptionItemLabel(option)}
256
- </Option>
257
- </li>
258
- );
259
- }}
260
- size="small"
261
- {...autocompleteProps}
262
- />
263
- );
264
- };
257
+ <Option
258
+ thumbnailUrl={displayOptionThumbnail ? option.url : undefined}
259
+ >
260
+ {getOptionItemLabel(option)}
261
+ </Option>
262
+ </li>
263
+ );
264
+ }}
265
+ size="small"
266
+ {...autocompleteProps}
267
+ />
268
+ );
269
+ }
270
+ );
265
271
 
266
272
  export default AutocompleteField;
@@ -107,21 +107,7 @@ const DataCell = ({
107
107
  const isCellHidden = getHiddenCondition?.(isRowSelected);
108
108
 
109
109
  if (isCellHidden) {
110
- return (
111
- <Cell
112
- className={classes.cell}
113
- isRowHighlighted={isRowHighlighted}
114
- listingVariant={listingVariant}
115
- onClick={(e): void => {
116
- if (!clickable) {
117
- return;
118
- }
119
- e.preventDefault();
120
- e.stopPropagation();
121
- }}
122
- {...commonCellProps}
123
- />
124
- );
110
+ return null;
125
111
  }
126
112
 
127
113
  return (
@@ -1,7 +1,10 @@
1
+ import * as React from 'react';
2
+
3
+ import { isNil } from 'ramda';
1
4
  import { useTranslation } from 'react-i18next';
2
5
 
3
6
  import { FallbackPage } from '../../../FallbackPage/FallbackPage';
4
- import { MenuSkeleton, PageSkeleton, useFetchQuery } from '../../..';
7
+ import { PageSkeleton, useFetchQuery } from '../../..';
5
8
  import { getModuleLicenseCheckEndpoint } from '../api';
6
9
 
7
10
  import { licenseDecoder } from './decoder';
@@ -14,27 +17,17 @@ import {
14
17
 
15
18
  export interface LicenseCheckProps {
16
19
  children: React.ReactElement;
17
- isFederatedComponent?: boolean;
18
20
  moduleName: string;
19
21
  }
20
22
 
21
23
  interface ContentProps {
22
24
  children: React.ReactElement;
23
- isFederatedComponent?: boolean;
24
25
  isValid: boolean;
25
26
  }
26
27
 
27
- const Content = ({
28
- children,
29
- isValid,
30
- isFederatedComponent
31
- }: ContentProps): JSX.Element | null => {
28
+ const Content = ({ children, isValid }: ContentProps): JSX.Element => {
32
29
  const { t } = useTranslation();
33
30
 
34
- if (isFederatedComponent && !isValid) {
35
- return null;
36
- }
37
-
38
31
  return isValid ? (
39
32
  children
40
33
  ) : (
@@ -48,10 +41,9 @@ const Content = ({
48
41
 
49
42
  const LicenseCheck = ({
50
43
  children,
51
- moduleName,
52
- isFederatedComponent
44
+ moduleName
53
45
  }: LicenseCheckProps): JSX.Element | null => {
54
- const { isError, data, isLoading } = useFetchQuery<License>({
46
+ const { isError, data } = useFetchQuery<License>({
55
47
  decoder: licenseDecoder,
56
48
  getEndpoint: () => getModuleLicenseCheckEndpoint(moduleName),
57
49
  getQueryKey: () => ['license', moduleName]
@@ -63,17 +55,10 @@ const LicenseCheck = ({
63
55
 
64
56
  const isValid = data?.success;
65
57
 
66
- const skeleton = isFederatedComponent ? <MenuSkeleton /> : <PageSkeleton />;
67
-
68
- return isLoading ? (
69
- skeleton
58
+ return isNil(isValid) ? (
59
+ <PageSkeleton />
70
60
  ) : (
71
- <Content
72
- isFederatedComponent={isFederatedComponent}
73
- isValid={isValid as boolean}
74
- >
75
- {children}
76
- </Content>
61
+ <Content isValid={isValid as boolean}>{children}</Content>
77
62
  );
78
63
  };
79
64
 
@@ -7,17 +7,11 @@ type Props = ModuleProps & LicenseCheckProps;
7
7
  const LicensedModule = ({
8
8
  moduleName,
9
9
  children,
10
- isFederatedComponent,
11
10
  ...props
12
11
  }: Props): JSX.Element => {
13
12
  return (
14
13
  <Module {...props}>
15
- <LicenseCheck
16
- isFederatedComponent={isFederatedComponent}
17
- moduleName={moduleName}
18
- >
19
- {children}
20
- </LicenseCheck>
14
+ <LicenseCheck moduleName={moduleName}>{children}</LicenseCheck>
21
15
  </Module>
22
16
  );
23
17
  };
@@ -1,3 +1,5 @@
1
+ import * as React from 'react';
2
+
1
3
  import { Provider as JotaiProvider, createStore } from 'jotai';
2
4
 
3
5
  import { createGenerateClassName, StylesProvider } from '@mui/styles';
@@ -7,7 +9,7 @@ import SnackbarProvider from '../Snackbar/SnackbarProvider';
7
9
 
8
10
  export interface ModuleProps {
9
11
  children: React.ReactElement;
10
- maxSnackbars?: number;
12
+ maxSnackbars: number;
11
13
  seedName: string;
12
14
  store: ReturnType<typeof createStore>;
13
15
  }
@@ -15,7 +17,7 @@ export interface ModuleProps {
15
17
  const Module = ({
16
18
  children,
17
19
  seedName,
18
- maxSnackbars = 3,
20
+ maxSnackbars,
19
21
  store
20
22
  }: ModuleProps): JSX.Element => {
21
23
  const generateClassName = createGenerateClassName({
@@ -4,7 +4,11 @@ import dayjs, { Dayjs } from 'dayjs';
4
4
  import { useAtomValue } from 'jotai';
5
5
  import { equals } from 'ramda';
6
6
 
7
- import { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers';
7
+ import {
8
+ DateTimePicker,
9
+ DateTimePickerProps,
10
+ LocalizationProvider
11
+ } from '@mui/x-date-pickers';
8
12
  import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
9
13
 
10
14
  import { userAtom } from '@centreon/ui-context';
@@ -23,6 +27,7 @@ interface Props {
23
27
  disabled?: boolean;
24
28
  maxDate?: Date;
25
29
  minDate?: Date;
30
+ minDateTime?: Date;
26
31
  property: CustomTimePeriodProperty | string;
27
32
  }
28
33
 
@@ -30,11 +35,13 @@ const DateTimePickerInput = ({
30
35
  date,
31
36
  maxDate,
32
37
  minDate,
38
+ minDateTime,
33
39
  property,
34
40
  changeDate,
35
41
  disabled = false,
36
- desktopMediaQuery
37
- }: Props): JSX.Element => {
42
+ desktopMediaQuery,
43
+ ...rest
44
+ }: Props & DateTimePickerProps<dayjs.Dayjs>): JSX.Element => {
38
45
  const desktopPickerMediaQuery =
39
46
  '@media (min-width: 1024px) or (pointer: fine)';
40
47
 
@@ -67,8 +74,10 @@ const DateTimePickerInput = ({
67
74
  disabled={disabled}
68
75
  maxDate={maxDate && formatDate(maxDate)}
69
76
  minDate={minDate && formatDate(minDate)}
77
+ minDateTime={minDateTime && formatDate(minDateTime)}
70
78
  value={formatDate(date)}
71
79
  onChange={changeTime}
80
+ {...rest}
72
81
  />
73
82
  </LocalizationProvider>
74
83
  );
package/src/index.ts CHANGED
@@ -165,3 +165,5 @@ export { default as SimpleCustomTimePeriod } from './TimePeriods/CustomTimePerio
165
165
  export { default as DateTimePickerInput } from './TimePeriods/DateTimePickerInput';
166
166
  export * from './ParentSize';
167
167
  export { default as Subtitle } from './Typography/Subtitle';
168
+ export { default as TablePagination } from './Listing/ActionBar/Pagination';
169
+ export { default as PaginationActions } from './Listing/ActionBar/PaginationActions';
@@ -1,129 +0,0 @@
1
- import { createStore } from 'jotai';
2
-
3
- import { Method } from '..';
4
-
5
- import LicensedModule from './LicensedModule';
6
-
7
- import Module from '.';
8
-
9
- const initializeModule = (): void => {
10
- cy.mount({
11
- Component: (
12
- <Module seedName="seed" store={createStore()}>
13
- <p>Module</p>
14
- </Module>
15
- )
16
- });
17
- };
18
-
19
- const initializeModuleWithValidLicense = (
20
- isFederatedComponent = false
21
- ): void => {
22
- cy.interceptAPIRequest({
23
- alias: 'getValidLicense',
24
- method: Method.GET,
25
- path: './api/internal.php?object=centreon_license_manager&action=licenseValid&productName=valid',
26
- response: {
27
- success: true
28
- }
29
- });
30
-
31
- cy.mount({
32
- Component: (
33
- <div style={{ height: '100vh' }}>
34
- <LicensedModule
35
- isFederatedComponent={isFederatedComponent}
36
- moduleName="valid"
37
- seedName="seed"
38
- store={createStore()}
39
- >
40
- <p>Module</p>
41
- </LicensedModule>
42
- </div>
43
- )
44
- });
45
- };
46
-
47
- const initializeModuleWithInvalidLicense = (
48
- isFederatedComponent = false
49
- ): void => {
50
- cy.interceptAPIRequest({
51
- alias: 'getInvalidLicense',
52
- method: Method.GET,
53
- path: './api/internal.php?object=centreon_license_manager&action=licenseValid&productName=invalid',
54
- response: {
55
- success: false
56
- }
57
- });
58
-
59
- cy.mount({
60
- Component: (
61
- <div style={{ height: '100vh' }}>
62
- <LicensedModule
63
- isFederatedComponent={isFederatedComponent}
64
- moduleName="invalid"
65
- seedName="seed"
66
- store={createStore()}
67
- >
68
- <p>Module</p>
69
- </LicensedModule>
70
- </div>
71
- )
72
- });
73
- };
74
-
75
- describe('Module', () => {
76
- beforeEach(() => {
77
- initializeModule();
78
- });
79
-
80
- it('displays the content of the module', () => {
81
- cy.contains('Module').should('be.visible');
82
-
83
- cy.makeSnapshot();
84
- });
85
- });
86
-
87
- describe('Valid license module', () => {
88
- it('displays the content of the page when the license is valid license', () => {
89
- initializeModuleWithValidLicense();
90
- cy.waitForRequest('@getValidLicense');
91
-
92
- cy.contains('Module').should('be.visible');
93
-
94
- cy.makeSnapshot();
95
- });
96
-
97
- it('displays the content of the component when the license is valid license', () => {
98
- initializeModuleWithValidLicense(true);
99
-
100
- cy.contains('Module').should('be.visible');
101
-
102
- cy.makeSnapshot();
103
- });
104
- });
105
-
106
- describe('Invalid license module', () => {
107
- it('displays the content of the page when the license is invalid license', () => {
108
- initializeModuleWithInvalidLicense();
109
- cy.waitForRequest('@getInvalidLicense');
110
-
111
- cy.contains('Module').should('not.exist');
112
-
113
- cy.contains('Oops').should('be.visible');
114
- cy.contains('License invalid or expired').should('be.visible');
115
- cy.contains('Please contact your administrator.').should('be.visible');
116
- cy.get('img[alt="License invalid or expired !"]').should('be.visible');
117
- cy.get('img[alt="Centreon Logo"]').should('be.visible');
118
-
119
- cy.makeSnapshot();
120
- });
121
-
122
- it('displays the content of the module when the license is invalid license', () => {
123
- initializeModuleWithInvalidLicense(true);
124
-
125
- cy.contains('Module').should('not.exist');
126
-
127
- cy.makeSnapshot();
128
- });
129
- });