@centreon/ui 24.4.35 → 24.4.37

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 (65) hide show
  1. package/package.json +1 -1
  2. package/src/Button/Icon/index.stories.tsx +1 -1
  3. package/src/Button/Icon/index.tsx +1 -1
  4. package/src/InputField/Select/IconPopover/index.tsx +1 -1
  5. package/src/Listing/ActionBar/index.tsx +1 -2
  6. package/src/Panel/index.tsx +1 -1
  7. package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.cypress.spec.tsx +23 -0
  8. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ContactSwitch.tsx +9 -1
  9. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ShareInput.styles.ts +8 -0
  10. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/useShareInput.tsx +4 -0
  11. package/src/components/Form/{AccessRightsV2 → AccessRights}/models.ts +1 -0
  12. package/src/components/Form/{AccessRightsV2 → AccessRights}/storiesData.ts +1 -0
  13. package/src/components/Form/index.ts +2 -2
  14. package/src/utils/index.ts +1 -0
  15. package/src/components/Form/AccessRights/AccessRights.resource.ts +0 -45
  16. package/src/components/Form/AccessRights/AccessRightsForm.stories.tsx +0 -59
  17. package/src/components/Form/AccessRights/AccessRightsForm.styles.ts +0 -21
  18. package/src/components/Form/AccessRights/AccessRightsForm.tsx +0 -67
  19. package/src/components/Form/AccessRights/AccessRightsFormActions.tsx +0 -80
  20. package/src/components/Form/AccessRights/Input/AddAction.tsx +0 -31
  21. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.stories.tsx +0 -54
  22. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.tsx +0 -72
  23. package/src/components/Form/AccessRights/Input/ContactAccessRightsInput.styles.ts +0 -22
  24. package/src/components/Form/AccessRights/Input/ContactInputField.tsx +0 -105
  25. package/src/components/Form/AccessRights/Input/RoleInputField.tsx +0 -29
  26. package/src/components/Form/AccessRights/List/ContactAccessRightsList.stories.tsx +0 -97
  27. package/src/components/Form/AccessRights/List/ContactAccessRightsList.styles.ts +0 -71
  28. package/src/components/Form/AccessRights/List/ContactAccessRightsList.tsx +0 -51
  29. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.stories.tsx +0 -116
  30. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.tsx +0 -118
  31. package/src/components/Form/AccessRights/List/ContactAccessRightsListItemSkeleton.tsx +0 -26
  32. package/src/components/Form/AccessRights/List/ContactAccessRightsListSkeleton.tsx +0 -28
  33. package/src/components/Form/AccessRights/Stats/AccessRightsStats.styles.ts +0 -18
  34. package/src/components/Form/AccessRights/Stats/AccessRightsStats.tsx +0 -41
  35. package/src/components/Form/AccessRights/__fixtures__/contactAccessRight.mock.ts +0 -54
  36. package/src/components/Form/AccessRights/common/GroupLabel.styles.ts +0 -18
  37. package/src/components/Form/AccessRights/common/GroupLabel.tsx +0 -15
  38. package/src/components/Form/AccessRights/common/Input.styles.ts +0 -48
  39. package/src/components/Form/AccessRights/common/RoleInputSelect.styles.ts +0 -11
  40. package/src/components/Form/AccessRights/common/RoleInputSelect.tsx +0 -57
  41. package/src/components/Form/AccessRights/index.ts +0 -3
  42. package/src/components/Form/AccessRights/useAccessRightsForm.test.tsx +0 -531
  43. package/src/components/Form/AccessRights/useAccessRightsForm.tsx +0 -282
  44. package/src/components/Form/AccessRights/useAccessRightsForm.utils.ts +0 -41
  45. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.stories.tsx +0 -0
  46. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.styles.ts +0 -0
  47. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.tsx +0 -0
  48. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/Actions.styles.ts +0 -0
  49. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/Actions.tsx +0 -0
  50. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/useActions.ts +0 -0
  51. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/Item.tsx +0 -0
  52. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/List.styles.tsx +0 -0
  53. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/List.tsx +0 -0
  54. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/ListItemSkeleton.tsx +0 -0
  55. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/ListSkeleton.tsx +0 -0
  56. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/RemoveAccessRight.tsx +0 -0
  57. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/StateChip.tsx +0 -0
  58. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/useItem.ts +0 -0
  59. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Provider.tsx +0 -0
  60. /package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ShareInput.tsx +0 -0
  61. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Stats/Stats.tsx +0 -0
  62. /package/src/components/Form/{AccessRightsV2 → AccessRights}/atoms.ts +0 -0
  63. /package/src/components/Form/{AccessRightsV2 → AccessRights}/common/RoleSelectField.styles.tsx +0 -0
  64. /package/src/components/Form/{AccessRightsV2 → AccessRights}/common/RoleSelectField.tsx +0 -0
  65. /package/src/components/Form/{AccessRightsV2 → AccessRights}/useAccessRightsInitValues.ts +0 -0
@@ -1,105 +0,0 @@
1
- import { ReactElement, useCallback, useEffect, useState } from 'react';
2
-
3
- import { useField } from 'formik';
4
-
5
- import {
6
- Autocomplete as MuiAutocomplete,
7
- MenuItem as MuiMenuItem,
8
- TextField as MuiTextField
9
- } from '@mui/material';
10
-
11
- import { useAccessRightsForm } from '../useAccessRightsForm';
12
- import {
13
- ContactGroupResource,
14
- ContactResource,
15
- isContactGroupResource
16
- } from '../AccessRights.resource';
17
- import { useInputStyles } from '../common/Input.styles';
18
- import { GroupLabel } from '../common/GroupLabel';
19
-
20
- import { useStyles } from './ContactAccessRightsInput.styles';
21
-
22
- export type ContactInputFieldProps = {
23
- id: string;
24
- labels: ContactInputFieldLabels;
25
- name: string;
26
- };
27
-
28
- type ContactInputFieldLabels = {
29
- group: string;
30
- noOptionsText: string;
31
- placeholder: string;
32
- };
33
-
34
- const ContactInputField = ({
35
- labels,
36
- ...props
37
- }: ContactInputFieldProps): ReactElement => {
38
- const { classes } = useStyles();
39
- const { classes: inputClasses } = useInputStyles();
40
-
41
- const {
42
- options: { contacts }
43
- } = useAccessRightsForm();
44
-
45
- const [field, meta, helpers] = useField(props);
46
-
47
- const [value, setValue] = useState<
48
- ContactResource | ContactGroupResource | null
49
- >(meta.initialValue ?? null);
50
-
51
- const onInputChange = useCallback(
52
- (_, _value) => {
53
- helpers.setValue(_value);
54
- },
55
- [helpers]
56
- );
57
-
58
- const renderInput = useCallback(
59
- (params) => (
60
- <MuiTextField
61
- {...props}
62
- {...params}
63
- placeholder={labels.placeholder}
64
- size="small"
65
- />
66
- ),
67
- [labels, props]
68
- );
69
-
70
- useEffect(() => {
71
- setValue(field.value ?? null);
72
- }, [field.value]);
73
-
74
- return (
75
- <MuiAutocomplete<ContactResource | ContactGroupResource, false, false, true>
76
- autoComplete
77
- autoHighlight
78
- openOnFocus
79
- className={classes.contactInput}
80
- componentsProps={{
81
- popper: {
82
- className: inputClasses.inputDropdown
83
- }
84
- }}
85
- getOptionLabel={(option) =>
86
- typeof option === 'string' ? option : option.name
87
- }
88
- noOptionsText={labels.noOptionsText}
89
- options={contacts}
90
- renderInput={renderInput}
91
- renderOption={(attr, option) => (
92
- <MuiMenuItem {...attr} key={`${option.type}--${option.name}`}>
93
- {option.name}{' '}
94
- {isContactGroupResource(option) && (
95
- <GroupLabel label={labels.group} />
96
- )}
97
- </MuiMenuItem>
98
- )}
99
- value={value}
100
- onChange={onInputChange}
101
- />
102
- );
103
- };
104
-
105
- export { ContactInputField };
@@ -1,29 +0,0 @@
1
- import { ReactElement, useCallback } from 'react';
2
-
3
- import { useField } from 'formik';
4
-
5
- import { RoleInputSelect } from '../common/RoleInputSelect';
6
-
7
- type RoleFieldProps = {
8
- id: string;
9
- label?: string;
10
- name: string;
11
- };
12
-
13
- const RoleInputField = ({ label, ...props }: RoleFieldProps): ReactElement => {
14
- const [field, meta] = useField(props);
15
-
16
- const onInputChange = useCallback((e) => field.onChange(e), [field]);
17
-
18
- return (
19
- <RoleInputSelect
20
- defaultValue={meta.initialValue}
21
- {...field}
22
- {...props}
23
- {...(label && { label })}
24
- onChange={onInputChange}
25
- />
26
- );
27
- };
28
-
29
- export { RoleInputField };
@@ -1,97 +0,0 @@
1
- import { ReactElement, ReactNode } from 'react';
2
-
3
- import { Meta, StoryObj } from '@storybook/react';
4
-
5
- import {
6
- AccessRightsFormProvider,
7
- AccessRightsFormProviderProps
8
- } from '../useAccessRightsForm';
9
- import { contactAccessRightsMock } from '../__fixtures__/contactAccessRight.mock';
10
-
11
- import { ContactAccessRightsList } from './ContactAccessRightsList';
12
-
13
- const meta: Meta<typeof ContactAccessRightsList> = {
14
- component: ContactAccessRightsList,
15
- title: 'components/Form/AccessRights/ContactAccessRightsList'
16
- };
17
-
18
- export default meta;
19
- type Story = StoryObj<typeof ContactAccessRightsList>;
20
-
21
- const Wrapper = ({
22
- children,
23
- amountOfContacts = 12
24
- }: {
25
- amountOfContacts?: number;
26
- children: ReactNode;
27
- }): ReactElement => {
28
- const options: AccessRightsFormProviderProps['options'] = {
29
- contacts: [],
30
- roles: [{ role: 'viewer' }, { role: 'editor' }]
31
- };
32
-
33
- const initialValues: AccessRightsFormProviderProps['initialValues'] =
34
- contactAccessRightsMock(amountOfContacts);
35
-
36
- return (
37
- <AccessRightsFormProvider initialValues={initialValues} options={options}>
38
- {children}
39
- </AccessRightsFormProvider>
40
- );
41
- };
42
-
43
- export const Default: Story = {
44
- args: {
45
- labels: {
46
- emptyState: 'No Contacts with access rights',
47
- item: {
48
- group: 'Group',
49
- state: {
50
- added: 'Add',
51
- removed: 'Remove',
52
- updated: 'Update'
53
- }
54
- }
55
- }
56
- },
57
- render: (args) => (
58
- <Wrapper>
59
- <ContactAccessRightsList {...args} />
60
- </Wrapper>
61
- )
62
- };
63
-
64
- export const AsEmptyState: Story = {
65
- args: Default.args,
66
- render: (args) => (
67
- <Wrapper amountOfContacts={0}>
68
- <ContactAccessRightsList {...args} />
69
- </Wrapper>
70
- )
71
- };
72
-
73
- const LoadingWrapper = ({
74
- children
75
- }: {
76
- children: ReactNode;
77
- }): ReactElement => {
78
- const options: AccessRightsFormProviderProps['options'] = {
79
- contacts: [],
80
- roles: [{ role: 'viewer' }, { role: 'editor' }]
81
- };
82
-
83
- return (
84
- <AccessRightsFormProvider loadingStatus="loading" options={options}>
85
- {children}
86
- </AccessRightsFormProvider>
87
- );
88
- };
89
-
90
- export const AsLoadingState: Story = {
91
- args: Default.args,
92
- render: (args) => (
93
- <LoadingWrapper>
94
- <ContactAccessRightsList {...args} />
95
- </LoadingWrapper>
96
- )
97
- };
@@ -1,71 +0,0 @@
1
- import { makeStyles } from 'tss-react/mui';
2
-
3
- const useStyles = makeStyles()((theme) => ({
4
- contactAccessRightsList: {
5
- borderBottom: `1px solid ${theme.palette.divider}`,
6
- borderTop: `1px solid ${theme.palette.divider}`,
7
- maxHeight: '29.5rem',
8
- maxWidth: '520px',
9
- overflowY: 'auto'
10
- },
11
- contactAccessRightsListEmpty: {
12
- alignItems: 'center',
13
- color: theme.palette.text.secondary,
14
- fontSize: '0.75rem',
15
- padding: theme.spacing(2, 8),
16
- textAlign: 'center'
17
- },
18
- contactAccessRightsListItem: {
19
- '& .MuiChip-root': {
20
- '& .MuiChip-label': {
21
- lineHeight: 'unset',
22
- padding: theme.spacing(0, 0.75),
23
- textOverflow: 'unset'
24
- },
25
- '&[data-state="added"]': {
26
- borderColor: theme.palette.chip.color.success,
27
- color: theme.palette.chip.color.success
28
- },
29
- '&[data-state="removed"]': {
30
- borderColor: theme.palette.chip.color.error,
31
- color: theme.palette.chip.color.error
32
- },
33
- '&[data-state="updated"]': {
34
- borderColor: theme.palette.chip.color.info,
35
- color: theme.palette.chip.color.info
36
- },
37
- borderRadius: '0.625rem',
38
- flexBasis: '3.5rem',
39
- flexShrink: 0,
40
- fontSize: '0.6875rem',
41
-
42
- fontWeight: 500,
43
- height: 'auto',
44
- lineHeight: '1.125rem',
45
- minHeight: 'unset',
46
- textTransform: 'lowercase'
47
- },
48
- '& .MuiListItemSecondaryAction-root': {
49
- paddingRight: theme.spacing(0.625)
50
- },
51
- '& > span:first-of-type': {
52
- alignItems: 'center',
53
- display: 'flex',
54
- flexGrow: 1,
55
- gap: theme.spacing(2),
56
- overflow: 'hidden'
57
- },
58
- '&[data-is-removed="true"]': {
59
- '& > span:first-of-type': {
60
- opacity: 0.3
61
- }
62
- },
63
- gap: theme.spacing(3),
64
- justifyContent: 'space-between',
65
-
66
- maxWidth: '520px',
67
- paddingRight: theme.spacing(7)
68
- }
69
- }));
70
-
71
- export { useStyles };
@@ -1,51 +0,0 @@
1
- import { ReactElement } from 'react';
2
-
3
- import { List } from '../../../List';
4
- import { useAccessRightsForm } from '../useAccessRightsForm';
5
-
6
- import {
7
- ContactAccessRightsListItem,
8
- ContactAccessRightsListItemProps
9
- } from './ContactAccessRightsListItem';
10
- import { useStyles } from './ContactAccessRightsList.styles';
11
- import { ContactAccessRightsListSkeleton } from './ContactAccessRightsListSkeleton';
12
-
13
- export type ContactAccessRightsListProps = {
14
- labels: ContactAccessRightsListLabels;
15
- };
16
-
17
- type ContactAccessRightsListLabels = {
18
- emptyState: string;
19
- item: ContactAccessRightsListItemProps['labels'];
20
- };
21
-
22
- const ContactAccessRightsList = ({
23
- labels
24
- }: ContactAccessRightsListProps): ReactElement => {
25
- const { classes } = useStyles();
26
- const { contactAccessRights, isLoading } = useAccessRightsForm();
27
-
28
- return isLoading ? (
29
- <ContactAccessRightsListSkeleton length={3} />
30
- ) : (
31
- <div className={classes.contactAccessRightsList}>
32
- {contactAccessRights.length === 0 ? (
33
- <div className={classes.contactAccessRightsListEmpty}>
34
- {labels.emptyState}
35
- </div>
36
- ) : (
37
- <List>
38
- {contactAccessRights.map((resource) => (
39
- <ContactAccessRightsListItem
40
- key={resource.contactAccessRight.contact?.id}
41
- labels={labels.item}
42
- resource={resource}
43
- />
44
- ))}
45
- </List>
46
- )}
47
- </div>
48
- );
49
- };
50
-
51
- export { ContactAccessRightsList };
@@ -1,116 +0,0 @@
1
- import { ReactElement, ReactNode } from 'react';
2
-
3
- import { Meta, StoryObj } from '@storybook/react';
4
-
5
- import {
6
- AccessRightsFormProvider,
7
- AccessRightsFormProviderProps
8
- } from '../useAccessRightsForm';
9
- import { ContactAccessRightResource } from '../AccessRights.resource';
10
-
11
- import { ContactAccessRightsListItem } from './ContactAccessRightsListItem';
12
- import { ContactAccessRightsListItemSkeleton } from './ContactAccessRightsListItemSkeleton';
13
-
14
- const meta: Meta<typeof ContactAccessRightsListItem> = {
15
- component: ContactAccessRightsListItem,
16
- title: 'components/Form/AccessRights/ContactAccessRightsListItem'
17
- };
18
-
19
- export default meta;
20
- type Story = StoryObj<typeof ContactAccessRightsListItem>;
21
-
22
- const Wrapper = ({ children }: { children: ReactNode }): ReactElement => {
23
- const options: AccessRightsFormProviderProps['options'] = {
24
- contacts: [],
25
- roles: [{ role: 'viewer' }, { role: 'editor' }]
26
- };
27
-
28
- return (
29
- <AccessRightsFormProvider options={options}>
30
- {children}
31
- </AccessRightsFormProvider>
32
- );
33
- };
34
-
35
- export const Default: Story = {
36
- args: {
37
- labels: {
38
- group: 'Group',
39
- state: {
40
- added: 'Add',
41
- removed: 'Remove',
42
- updated: 'Update'
43
- }
44
- },
45
- resource: {
46
- contactAccessRight: {
47
- contact: {
48
- email: 'user@company.com',
49
- id: '1',
50
- name: 'User Name',
51
- type: 'contact'
52
- },
53
- role: 'viewer'
54
- },
55
- state: 'unchanged',
56
- stateHistory: []
57
- }
58
- },
59
- render: (args) => (
60
- <Wrapper>
61
- <ContactAccessRightsListItem {...args} />
62
- </Wrapper>
63
- )
64
- };
65
-
66
- export const AsContactGroup: Story = {
67
- args: {
68
- labels: Default.args?.labels,
69
- resource: {
70
- contactAccessRight: {
71
- contact: {
72
- id: '1',
73
- name: 'Team Name',
74
- type: 'contact_group'
75
- },
76
- role: 'editor'
77
- },
78
- state: 'unchanged',
79
- stateHistory: []
80
- }
81
- },
82
- render: Default.render
83
- };
84
-
85
- export const WithAddedState: Story = {
86
- args: {
87
- labels: Default.args?.labels,
88
- resource: {
89
- contactAccessRight: {
90
- ...Default.args?.resource?.contactAccessRight
91
- } as ContactAccessRightResource,
92
- state: 'added',
93
- stateHistory: []
94
- }
95
- },
96
- render: Default.render
97
- };
98
-
99
- export const WithRemovedState: Story = {
100
- args: {
101
- labels: Default.args?.labels,
102
- resource: {
103
- contactAccessRight: {
104
- ...Default.args?.resource?.contactAccessRight
105
- } as ContactAccessRightResource,
106
- state: 'removed',
107
- stateHistory: []
108
- }
109
- },
110
- render: Default.render
111
- };
112
-
113
- export const AsLoadingState: Story = {
114
- args: {},
115
- render: () => <ContactAccessRightsListItemSkeleton />
116
- };
@@ -1,118 +0,0 @@
1
- import { ReactElement, useMemo } from 'react';
2
-
3
- import RotateRightIcon from '@mui/icons-material/RotateRight';
4
- import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';
5
- import { Chip as MuiChip } from '@mui/material';
6
-
7
- import { IconButton } from '../../../Button';
8
- import { List } from '../../../List';
9
- import {
10
- ContactAccessRightState,
11
- ContactAccessRightStateResource,
12
- isContactResource
13
- } from '../AccessRights.resource';
14
- import { useAccessRightsForm } from '../useAccessRightsForm';
15
- import { RoleInputSelect } from '../common/RoleInputSelect';
16
- import { GroupLabel } from '../common/GroupLabel';
17
-
18
- import { useStyles } from './ContactAccessRightsList.styles';
19
-
20
- export type ContactAccessRightsListItemProps = {
21
- hasAvatar?: boolean;
22
- labels: {
23
- group: string;
24
- state: Record<Exclude<ContactAccessRightState, 'unchanged'>, string>;
25
- };
26
- resource: ContactAccessRightStateResource;
27
- };
28
-
29
- const ContactAccessRightsListItem = ({
30
- labels,
31
- resource: { contactAccessRight, state },
32
- hasAvatar = true
33
- }: ContactAccessRightsListItemProps): ReactElement => {
34
- const { classes } = useStyles();
35
- const { updateContactAccessRight, removeContactAccessRight } =
36
- useAccessRightsForm();
37
-
38
- const isRemoved = useMemo(() => state === 'removed', [state]);
39
-
40
- const updateRole = (e): void => {
41
- updateContactAccessRight({
42
- ...contactAccessRight,
43
- role: e.target.value
44
- });
45
- };
46
- const toggleRemoved = (): void => {
47
- removeContactAccessRight(contactAccessRight, isRemoved);
48
- };
49
-
50
- const getNameInitials = (name: string): string =>
51
- name
52
- .split(' ')
53
- .map((n) => n.charAt(0).toUpperCase())
54
- .slice(0, 2)
55
- .join('');
56
-
57
- return (
58
- <List.Item
59
- action={
60
- <IconButton
61
- data-testid={isRemoved ? 'restore_user' : 'remove_user'}
62
- icon={isRemoved ? <RotateRightIcon /> : <DeleteOutlineIcon />}
63
- size="small"
64
- variant="primary"
65
- onClick={toggleRemoved}
66
- />
67
- }
68
- className={classes.contactAccessRightsListItem}
69
- data-is-removed={isRemoved}
70
- data-state={state}
71
- key={contactAccessRight.contact?.id}
72
- >
73
- <span>
74
- {hasAvatar && (
75
- <List.Item.Avatar>
76
- {getNameInitials(contactAccessRight.contact?.name || '')}
77
- </List.Item.Avatar>
78
- )}
79
- <List.Item.Text
80
- primaryText={
81
- contactAccessRight.contact && (
82
- <>
83
- {contactAccessRight.contact.name}{' '}
84
- {!isContactResource(contactAccessRight.contact) && (
85
- <GroupLabel label={labels.group} />
86
- )}
87
- </>
88
- )
89
- }
90
- secondaryText={
91
- isContactResource(contactAccessRight.contact) &&
92
- contactAccessRight.contact?.email
93
- ? contactAccessRight.contact?.email
94
- : undefined
95
- }
96
- />
97
- </span>
98
-
99
- {state !== 'unchanged' && (
100
- <MuiChip
101
- data-state={state}
102
- label={labels.state[state]}
103
- size="small"
104
- variant="outlined"
105
- />
106
- )}
107
- <RoleInputSelect
108
- disabled={isRemoved}
109
- id={`role-${contactAccessRight.contact?.id}`}
110
- name={`role-${contactAccessRight.contact?.id}`}
111
- value={contactAccessRight.role}
112
- onChange={updateRole}
113
- />
114
- </List.Item>
115
- );
116
- };
117
-
118
- export { ContactAccessRightsListItem };
@@ -1,26 +0,0 @@
1
- import { ReactElement } from 'react';
2
-
3
- import { List } from '../../../List';
4
-
5
- import { useStyles } from './ContactAccessRightsList.styles';
6
-
7
- export type ContactAccessRightsListItemSkeletonProps = {
8
- hasAvatar?: boolean;
9
- };
10
-
11
- const ContactAccessRightsListItemSkeleton = ({
12
- hasAvatar = true
13
- }: ContactAccessRightsListItemSkeletonProps): ReactElement => {
14
- const { classes } = useStyles();
15
-
16
- return (
17
- <List.Item className={classes.contactAccessRightsListItem}>
18
- <span>
19
- {hasAvatar && <List.Item.Avatar.Skeleton />}
20
- <List.Item.Text.Skeleton secondaryText />
21
- </span>
22
- </List.Item>
23
- );
24
- };
25
-
26
- export { ContactAccessRightsListItemSkeleton };
@@ -1,28 +0,0 @@
1
- import { ReactElement } from 'react';
2
-
3
- import { List } from '../../../List';
4
-
5
- import { useStyles } from './ContactAccessRightsList.styles';
6
- import { ContactAccessRightsListItemSkeleton } from './ContactAccessRightsListItemSkeleton';
7
-
8
- export type ContactAccessRightsListSkeletonProps = {
9
- length?: number;
10
- };
11
-
12
- const ContactAccessRightsListSkeleton = ({
13
- length = 3
14
- }: ContactAccessRightsListSkeletonProps): ReactElement => {
15
- const { classes } = useStyles();
16
-
17
- return (
18
- <div className={classes.contactAccessRightsList}>
19
- <List>
20
- {[...Array(length).keys()].map((key) => (
21
- <ContactAccessRightsListItemSkeleton key={key} />
22
- ))}
23
- </List>
24
- </div>
25
- );
26
- };
27
-
28
- export { ContactAccessRightsListSkeleton };
@@ -1,18 +0,0 @@
1
- import { makeStyles } from 'tss-react/mui';
2
-
3
- const useStyles = makeStyles()((theme) => ({
4
- accessRightsStats: {
5
- '& > span:not(:last-child)::after': {
6
- content: '", "'
7
- },
8
- alignSelf: 'flex-end',
9
- color: theme.palette.text.secondary,
10
- fontSize: '0.75rem',
11
- height: '1.5rem',
12
- lineHeight: '1.5rem',
13
-
14
- padding: theme.spacing(1, 0)
15
- }
16
- }));
17
-
18
- export { useStyles };
@@ -1,41 +0,0 @@
1
- import { ReactElement, useMemo } from 'react';
2
-
3
- import { useAccessRightsForm } from '../useAccessRightsForm';
4
- import { ContactAccessRightState } from '../AccessRights.resource';
5
-
6
- import { useStyles } from './AccessRightsStats.styles';
7
-
8
- export type AccessRightsStatsProps = {
9
- labels: Record<Exclude<ContactAccessRightState, 'unchanged'>, string>;
10
- };
11
-
12
- const AccessRightsStats = ({
13
- labels
14
- }: AccessRightsStatsProps): ReactElement => {
15
- const { classes } = useStyles();
16
-
17
- const { stats } = useAccessRightsForm();
18
-
19
- const statsElements = useMemo(() => {
20
- const elements: Array<ReactElement> = [];
21
-
22
- ['added', 'updated', 'removed'].forEach((state) => {
23
- if (stats?.[state] > 0)
24
- elements.push(
25
- <span key={state}>
26
- <strong>{stats[state]}</strong> {labels[state]}
27
- </span>
28
- );
29
- });
30
-
31
- return elements;
32
- }, [stats]);
33
-
34
- return (
35
- <div className={classes.accessRightsStats}>
36
- {statsElements.length !== 0 && statsElements.map((el) => el)}
37
- </div>
38
- );
39
- };
40
-
41
- export { AccessRightsStats };