@centreon/ui 24.4.1-MON-30966.1 → 24.4.1-MON-33898.9

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/Listing/index.tsx +131 -117
  7. package/src/Panel/index.tsx +1 -1
  8. package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.cypress.spec.tsx +23 -0
  9. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ContactSwitch.tsx +9 -1
  10. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ShareInput.styles.ts +8 -0
  11. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/useShareInput.tsx +4 -0
  12. package/src/components/Form/{AccessRightsV2 → AccessRights}/models.ts +1 -0
  13. package/src/components/Form/{AccessRightsV2 → AccessRights}/storiesData.ts +1 -0
  14. package/src/components/Form/index.ts +2 -2
  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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@centreon/ui",
3
- "version": "24.4.1-MON-30966.1",
3
+ "version": "24.4.1-MON-33898.9",
4
4
  "description": "Centreon UI Components",
5
5
  "scripts": {
6
6
  "eslint": "eslint ./src --ext .js,.jsx,.ts,.tsx --max-warnings 0",
@@ -4,7 +4,7 @@ import { makeStyles } from 'tss-react/mui';
4
4
  import AccessibilityIcon from '@mui/icons-material/Accessibility';
5
5
  import { Theme } from '@mui/material';
6
6
 
7
- import IconButton from '.';
7
+ import { IconButton } from '.';
8
8
 
9
9
  const useStyles = makeStyles()((theme: Theme) => ({
10
10
  root: {
@@ -38,7 +38,7 @@ type Props = {
38
38
  | 'top-start';
39
39
  } & IconButtonProps;
40
40
 
41
- const IconButton = ({
41
+ export const IconButton = ({
42
42
  title = '',
43
43
  ariaLabel,
44
44
  className,
@@ -15,7 +15,7 @@ import {
15
15
  } from '@mui/material';
16
16
  import IconReset from '@mui/icons-material/RotateLeft';
17
17
 
18
- import IconButton from '../../../Button/Icon';
18
+ import { IconButton } from '../../..';
19
19
  import Option from '../Option';
20
20
  import { SelectEntry } from '..';
21
21
 
@@ -9,10 +9,9 @@ import Divider from '@mui/material/Divider';
9
9
 
10
10
  import { userAtom, ListingVariant } from '@centreon/ui-context';
11
11
 
12
- import { ListingProps } from '../..';
12
+ import { ListingProps, IconButton } from '../..';
13
13
  import { labelOf, labelRowsPerPage } from '../translatedLabels';
14
14
  import { useMemoComponent } from '../../utils';
15
- import IconButton from '../../Button/Icon/index';
16
15
 
17
16
  import StyledPagination from './Pagination';
18
17
  import PaginationActions from './PaginationActions';
@@ -93,9 +93,11 @@ export interface Props<TRow> {
93
93
  columnConfiguration?: ColumnConfiguration;
94
94
  columns: Array<Column>;
95
95
  currentPage?: number;
96
+ customListingComponent?: JSX.Element;
96
97
  customPaginationClassName?: string;
97
98
  disableRowCheckCondition?: (row) => boolean;
98
99
  disableRowCondition?: (row) => boolean;
100
+ displayCustomListing?: boolean;
99
101
  getHighlightRowCondition?: (row: TRow) => boolean;
100
102
  getId?: (row: TRow) => RowId;
101
103
  headerMemoProps?: Array<unknown>;
@@ -138,6 +140,8 @@ const defaultColumnConfiguration = {
138
140
  export const performanceRowsLimit = 60;
139
141
 
140
142
  const Listing = <TRow extends { id: RowId }>({
143
+ customListingComponent,
144
+ displayCustomListing,
141
145
  limit = 10,
142
146
  visualizationActions,
143
147
  columns,
@@ -494,6 +498,7 @@ const Listing = <TRow extends { id: RowId }>({
494
498
  onSelectColumns={onSelectColumns}
495
499
  />
496
500
  </div>
501
+
497
502
  <ParentSize
498
503
  parentSizeStyles={{
499
504
  height: '100%',
@@ -509,132 +514,141 @@ const Listing = <TRow extends { id: RowId }>({
509
514
  height: innerScrollDisabled ? '100%' : `calc(${height}px - 4px)`
510
515
  }}
511
516
  >
512
- <Table
513
- stickyHeader
514
- className={classes.table}
515
- component="div"
516
- role={undefined}
517
- size="small"
518
- >
519
- <ListingHeader
520
- areColumnsEditable={areColumnsEditable}
521
- checkable={checkable}
522
- columnConfiguration={columnConfiguration}
523
- columns={columns}
524
- listingVariant={listingVariant}
525
- memoProps={headerMemoProps}
526
- predefinedRowsSelection={predefinedRowsSelection}
527
- rowCount={limit - emptyRows}
528
- selectedRowCount={selectedRows.length}
529
- sortField={sortField}
530
- sortOrder={sortOrder}
531
- onSelectAllClick={selectAllRows}
532
- onSelectColumns={onSelectColumns}
533
- onSelectRowsWithCondition={onSelectRowsWithCondition}
534
- onSort={onSort}
535
- />
536
-
537
- <TableBody
538
- className={classes.tableBody}
517
+ {displayCustomListing ? (
518
+ customListingComponent
519
+ ) : (
520
+ <Table
521
+ stickyHeader
522
+ className={classes.table}
539
523
  component="div"
540
- onMouseLeave={clearHoveredRow}
524
+ role={undefined}
525
+ size="small"
541
526
  >
542
- {rowsToDisplay.map((row, index) => {
543
- const isRowSelected = isSelected(row);
544
- const isRowHovered = equals(hoveredRowId, getId(row));
545
- const isSubItem = allSubItemIds.includes(row.id);
546
-
547
- return (
548
- <ListingRow
549
- checkable={
550
- checkable && (!isSubItem || subItems.canCheckSubItems)
551
- }
552
- columnConfiguration={columnConfiguration}
553
- columnIds={columns.map(prop('id'))}
554
- disableRowCondition={disableRowCondition}
555
- isHovered={isRowHovered}
556
- isSelected={isRowSelected}
557
- isShiftKeyDown={isShiftKeyDown}
558
- key={
559
- gte(limit, performanceRowsLimit)
560
- ? `row_${index}`
561
- : getId(row)
562
- }
563
- lastSelectionIndex={lastSelectionIndex}
564
- limit={limit}
565
- listingVariant={listingVariant}
566
- row={row}
567
- rowColorConditions={rowColorConditions}
568
- shiftKeyDownRowPivot={shiftKeyDownRowPivot}
569
- subItemsPivots={subItemsPivots}
570
- tabIndex={-1}
571
- visibleColumns={visibleColumns}
572
- onClick={(): void => {
573
- onRowClick(row);
574
- }}
575
- onFocus={(): void => hoverRow(row)}
576
- onMouseOver={(): void => hoverRow(row)}
577
- >
578
- {checkable &&
579
- (!isSubItem || subItems.canCheckSubItems ? (
580
- <Cell
581
- align="left"
582
- className={classes.checkbox}
583
- disableRowCondition={disableRowCondition}
584
- isRowHovered={isRowHovered}
585
- row={row}
586
- rowColorConditions={rowColorConditions}
587
- onClick={(event): void => selectRow(event, row)}
588
- >
589
- <Checkbox
590
- checked={isRowSelected}
591
- disabled={
592
- disableRowCheckCondition(row) ||
593
- disableRowCondition(row)
594
- }
595
- inputProps={{
596
- 'aria-label': `Select row ${getId(row)}`
597
- }}
527
+ <ListingHeader
528
+ areColumnsEditable={areColumnsEditable}
529
+ checkable={checkable}
530
+ columnConfiguration={columnConfiguration}
531
+ columns={columns}
532
+ listingVariant={listingVariant}
533
+ memoProps={headerMemoProps}
534
+ predefinedRowsSelection={predefinedRowsSelection}
535
+ rowCount={limit - emptyRows}
536
+ selectedRowCount={selectedRows.length}
537
+ sortField={sortField}
538
+ sortOrder={sortOrder}
539
+ onSelectAllClick={selectAllRows}
540
+ onSelectColumns={onSelectColumns}
541
+ onSelectRowsWithCondition={onSelectRowsWithCondition}
542
+ onSort={onSort}
543
+ />
544
+
545
+ <TableBody
546
+ className={classes.tableBody}
547
+ component="div"
548
+ onMouseLeave={clearHoveredRow}
549
+ >
550
+ {rowsToDisplay.map((row, index) => {
551
+ const isRowSelected = isSelected(row);
552
+ const isRowHovered = equals(hoveredRowId, getId(row));
553
+ const isSubItem = allSubItemIds.includes(row.id);
554
+
555
+ return (
556
+ <ListingRow
557
+ checkable={
558
+ checkable &&
559
+ (!isSubItem || subItems.canCheckSubItems)
560
+ }
561
+ columnConfiguration={columnConfiguration}
562
+ columnIds={columns.map(prop('id'))}
563
+ disableRowCondition={disableRowCondition}
564
+ isHovered={isRowHovered}
565
+ isSelected={isRowSelected}
566
+ isShiftKeyDown={isShiftKeyDown}
567
+ key={
568
+ gte(limit, performanceRowsLimit)
569
+ ? `row_${index}`
570
+ : getId(row)
571
+ }
572
+ lastSelectionIndex={lastSelectionIndex}
573
+ limit={limit}
574
+ listingVariant={listingVariant}
575
+ row={row}
576
+ rowColorConditions={rowColorConditions}
577
+ shiftKeyDownRowPivot={shiftKeyDownRowPivot}
578
+ subItemsPivots={subItemsPivots}
579
+ tabIndex={-1}
580
+ visibleColumns={visibleColumns}
581
+ onClick={(): void => {
582
+ onRowClick(row);
583
+ }}
584
+ onFocus={(): void => hoverRow(row)}
585
+ onMouseOver={(): void => hoverRow(row)}
586
+ >
587
+ {checkable &&
588
+ (!isSubItem || subItems.canCheckSubItems ? (
589
+ <Cell
590
+ align="left"
591
+ className={classes.checkbox}
592
+ disableRowCondition={disableRowCondition}
593
+ isRowHovered={isRowHovered}
594
+ row={row}
595
+ rowColorConditions={rowColorConditions}
596
+ onClick={(event): void => selectRow(event, row)}
597
+ >
598
+ <Checkbox
599
+ checked={isRowSelected}
600
+ disabled={
601
+ disableRowCheckCondition(row) ||
602
+ disableRowCondition(row)
603
+ }
604
+ inputProps={{
605
+ 'aria-label': `Select row ${getId(row)}`
606
+ }}
607
+ />
608
+ </Cell>
609
+ ) : (
610
+ <Cell
611
+ align="left"
612
+ disableRowCondition={disableRowCondition}
613
+ isRowHovered={isRowHovered}
614
+ row={row}
615
+ rowColorConditions={rowColorConditions}
598
616
  />
599
- </Cell>
600
- ) : (
601
- <Cell
602
- align="left"
617
+ ))}
618
+
619
+ {visibleColumns.map((column) => (
620
+ <DataCell
621
+ column={column}
603
622
  disableRowCondition={disableRowCondition}
623
+ getHighlightRowCondition={
624
+ getHighlightRowCondition
625
+ }
604
626
  isRowHovered={isRowHovered}
627
+ isRowSelected={isRowSelected}
628
+ key={`${getId(row)}-${column.id}`}
629
+ labelCollapse={subItems.labelCollapse}
630
+ labelExpand={subItems.labelExpand}
631
+ listingVariant={listingVariant}
605
632
  row={row}
606
633
  rowColorConditions={rowColorConditions}
634
+ subItemsRowProperty={subItems?.getRowProperty(
635
+ row
636
+ )}
607
637
  />
608
638
  ))}
609
-
610
- {visibleColumns.map((column) => (
611
- <DataCell
612
- column={column}
613
- disableRowCondition={disableRowCondition}
614
- getHighlightRowCondition={getHighlightRowCondition}
615
- isRowHovered={isRowHovered}
616
- isRowSelected={isRowSelected}
617
- key={`${getId(row)}-${column.id}`}
618
- labelCollapse={subItems.labelCollapse}
619
- labelExpand={subItems.labelExpand}
620
- listingVariant={listingVariant}
621
- row={row}
622
- rowColorConditions={rowColorConditions}
623
- subItemsRowProperty={subItems?.getRowProperty(row)}
624
- />
625
- ))}
626
- </ListingRow>
627
- );
628
- })}
629
-
630
- {rows.length < 1 &&
631
- (loading ? (
632
- <SkeletonLoader rows={limit} />
633
- ) : (
634
- <EmptyResult label={t(labelNoResultFound)} />
635
- ))}
636
- </TableBody>
637
- </Table>
639
+ </ListingRow>
640
+ );
641
+ })}
642
+
643
+ {rows.length < 1 &&
644
+ (loading ? (
645
+ <SkeletonLoader rows={limit} />
646
+ ) : (
647
+ <EmptyResult label={t(labelNoResultFound)} />
648
+ ))}
649
+ </TableBody>
650
+ </Table>
651
+ )}
638
652
  </Box>
639
653
  )}
640
654
  </ParentSize>
@@ -9,7 +9,7 @@ import { makeStyles } from 'tss-react/mui';
9
9
  import { Paper, Slide, Divider, AppBar, Tabs } from '@mui/material';
10
10
  import IconClose from '@mui/icons-material/Clear';
11
11
 
12
- import IconButton from '../Button/Icon';
12
+ import { IconButton } from '..';
13
13
 
14
14
  import { minTabHeight } from './Tab';
15
15
 
@@ -347,4 +347,27 @@ describe('Access rights', () => {
347
347
 
348
348
  cy.makeSnapshot();
349
349
  });
350
+
351
+ it('resets the role to "viewer" when the "editor" role is selected and a contact with "viewer" right is selected', () => {
352
+ initialize({});
353
+
354
+ cy.findByLabelText(labels.add.autocompleteContact).click();
355
+
356
+ cy.waitForRequest('@getContacts');
357
+
358
+ cy.contains('Entity 10').click();
359
+
360
+ cy.findByTestId('add_role').parent().click();
361
+ cy.get('li[data-value="editor"]').click();
362
+
363
+ cy.findByLabelText(labels.add.autocompleteContact).click();
364
+
365
+ cy.waitForRequest('@getContacts');
366
+
367
+ cy.contains('Entity 11').click();
368
+
369
+ cy.findByTestId('add_role').should('have.value', 'viewer');
370
+
371
+ cy.makeSnapshot();
372
+ });
350
373
  });
@@ -7,11 +7,14 @@ import { ContactType, Labels } from '../models';
7
7
  import { contactTypeAtom } from '../atoms';
8
8
  import { Subtitle } from '../../../..';
9
9
 
10
+ import { useContactSwitchStyles } from './ShareInput.styles';
11
+
10
12
  interface Props {
11
13
  labels: Labels['add'];
12
14
  }
13
15
 
14
16
  const ContactSwitch = ({ labels }: Props): JSX.Element => {
17
+ const { classes } = useContactSwitchStyles();
15
18
  const { t } = useTranslation();
16
19
 
17
20
  const setContactType = useSetAtom(contactTypeAtom);
@@ -23,7 +26,12 @@ const ContactSwitch = ({ labels }: Props): JSX.Element => {
23
26
  return (
24
27
  <>
25
28
  <Subtitle>{t(labels.title)}</Subtitle>
26
- <RadioGroup row defaultValue={ContactType.Contact} onChange={change}>
29
+ <RadioGroup
30
+ row
31
+ className={classes.inputs}
32
+ defaultValue={ContactType.Contact}
33
+ onChange={change}
34
+ >
27
35
  <FormControlLabel
28
36
  control={<Radio />}
29
37
  label={labels.contact}
@@ -7,3 +7,11 @@ export const useShareInputStyles = makeStyles()((theme) => ({
7
7
  gridTemplateColumns: `1fr min-content min-content`
8
8
  }
9
9
  }));
10
+
11
+ export const useContactSwitchStyles = makeStyles()((theme) => ({
12
+ inputs: {
13
+ display: 'flex',
14
+ flexDirection: 'row',
15
+ gap: theme.spacing(2)
16
+ }
17
+ }));
@@ -40,6 +40,10 @@ const useShareInput = (endpoints: Endpoints): UseShareInputState => {
40
40
 
41
41
  const selectContact = (_, entry): void => {
42
42
  setSelectedContact(entry);
43
+ if (equals('editor', entry.most_permissive_role)) {
44
+ return;
45
+ }
46
+ setSelectedRole('viewer');
43
47
  };
44
48
 
45
49
  const add = (): void => {
@@ -2,6 +2,7 @@ export interface AccessRightInitialValues {
2
2
  email?: string;
3
3
  id: number | string;
4
4
  isContactGroup: boolean;
5
+ most_permissive_role?: 'editor' | 'viewer';
5
6
  name: string;
6
7
  role: string;
7
8
  }
@@ -88,6 +88,7 @@ const buildEntities = (from, isGroup): Array<SelectEntry> => {
88
88
  .map((_, index) => ({
89
89
  email: isGroup ? undefined : faker.internet.email(),
90
90
  id: 1000 + index,
91
+ most_permissive_role: index % 3 === 0 ? 'editor' : 'viewer',
91
92
  name: `Entity ${isGroup ? 'Group' : ''} ${from + index}`
92
93
  }));
93
94
  };
@@ -1,4 +1,4 @@
1
1
  export * from './Form.models';
2
2
  export * from './Dashboard';
3
- export * from './AccessRights';
4
- export { default as AccessRightsV2 } from './AccessRightsV2/AccessRights';
3
+ export { default as AccessRights } from './AccessRights/AccessRights';
4
+ export { default as AccessRightsV2 } from './AccessRights/AccessRights';
@@ -1,45 +0,0 @@
1
- export type ContactAccessRightState =
2
- | 'added'
3
- | 'updated'
4
- | 'removed'
5
- | 'unchanged';
6
-
7
- export type ContactAccessRightStateResource = {
8
- contactAccessRight: ContactAccessRightResource;
9
- state: ContactAccessRightState;
10
- stateHistory: Array<ContactAccessRightState>;
11
- };
12
-
13
- export type ContactAccessRightResource = {
14
- contact: ContactResource | ContactGroupResource | null;
15
- role: RoleResource['role'];
16
- };
17
-
18
- export type ContactResource = {
19
- email?: string;
20
- id?: number | string;
21
- name: string;
22
- type: 'contact';
23
- };
24
-
25
- export const isContactResource = (
26
- resource: ContactResource | ContactGroupResource | null
27
- ): resource is ContactResource => {
28
- return resource?.type === 'contact';
29
- };
30
-
31
- export type ContactGroupResource = {
32
- id?: number | string;
33
- name: string;
34
- type: 'contact_group';
35
- };
36
-
37
- export const isContactGroupResource = (
38
- resource: ContactResource | ContactGroupResource | null
39
- ): resource is ContactResource => {
40
- return resource?.type === 'contact_group';
41
- };
42
-
43
- export type RoleResource = {
44
- role: 'viewer' | 'editor' | string;
45
- };
@@ -1,59 +0,0 @@
1
- import { Meta, StoryObj } from '@storybook/react';
2
-
3
- import { AccessRightsForm } from './AccessRightsForm';
4
- import { Default as DefaultContactAccessRightsListStory } from './List/ContactAccessRightsList.stories';
5
- import { Default as DefaultContactAccessRightInputStory } from './Input/ContactAccessRightInput.stories';
6
- import { ContactAccessRightsListProps } from './List/ContactAccessRightsList';
7
- import { ContactAccessRightInputProps } from './Input/ContactAccessRightInput';
8
- import {
9
- contactAccessRightsMock,
10
- contactsAndGroupsMock
11
- } from './__fixtures__/contactAccessRight.mock';
12
-
13
- const meta: Meta<typeof AccessRightsForm> = {
14
- component: AccessRightsForm
15
- };
16
-
17
- export default meta;
18
- type Story = StoryObj<typeof AccessRightsForm>;
19
-
20
- export const Default: Story = {
21
- args: {
22
- initialValues: contactAccessRightsMock(12),
23
- labels: {
24
- actions: {
25
- cancel: 'Cancel',
26
- copyLink: 'Copy link',
27
- copyLinkMessages: {
28
- error: 'Unable to copy link',
29
- success: 'Link copied'
30
- },
31
- submit: 'Update'
32
- },
33
- input: {
34
- ...DefaultContactAccessRightInputStory.args?.labels
35
- } as ContactAccessRightInputProps['labels'],
36
- list: {
37
- ...DefaultContactAccessRightsListStory.args?.labels
38
- } as ContactAccessRightsListProps['labels'],
39
- stats: {
40
- added: 'added',
41
- removed: 'removed',
42
- updated: 'updated'
43
- }
44
- },
45
- options: {
46
- contacts: contactsAndGroupsMock(25),
47
- roles: [{ role: 'viewer' }, { role: 'editor' }]
48
- },
49
- resourceLink: 'https://app.centreon.com/resource/1'
50
- }
51
- };
52
-
53
- export const AsEmptyState: Story = {
54
- args: {
55
- labels: Default.args?.labels,
56
- options: Default.args?.options,
57
- resourceLink: Default.args?.resourceLink
58
- }
59
- };
@@ -1,21 +0,0 @@
1
- import { makeStyles } from 'tss-react/mui';
2
-
3
- const useStyles = makeStyles()((theme) => ({
4
- accessRightsForm: {
5
- display: 'flex',
6
- flexDirection: 'column',
7
- gap: theme.spacing(6),
8
-
9
- maxWidth: '520px',
10
- paddingTop: theme.spacing(3),
11
-
12
- width: '100%'
13
- },
14
- accessRightsFormList: {
15
- display: 'flex',
16
- flexDirection: 'column',
17
- gap: theme.spacing(1)
18
- }
19
- }));
20
-
21
- export { useStyles };
@@ -1,67 +0,0 @@
1
- import { ReactElement } from 'react';
2
-
3
- import { useStyles } from './AccessRightsForm.styles';
4
- import {
5
- AccessRightsFormProvider,
6
- AccessRightsFormProviderProps
7
- } from './useAccessRightsForm';
8
- import {
9
- ContactAccessRightInput,
10
- ContactAccessRightInputProps
11
- } from './Input/ContactAccessRightInput';
12
- import {
13
- ContactAccessRightsList,
14
- ContactAccessRightsListProps
15
- } from './List/ContactAccessRightsList';
16
- import {
17
- AccessRightsFormActions,
18
- AccessRightsFormActionsProps
19
- } from './AccessRightsFormActions';
20
- import {
21
- AccessRightsStats,
22
- AccessRightsStatsProps
23
- } from './Stats/AccessRightsStats';
24
-
25
- export type AccessRightsFormProps = {
26
- labels: AccessRightsFormLabels;
27
- onCancel?: AccessRightsFormActionsProps['onCancel'];
28
- resourceLink: string;
29
- } & Pick<
30
- AccessRightsFormProviderProps,
31
- 'initialValues' | 'onSubmit' | 'options' | 'loadingStatus'
32
- >;
33
-
34
- export type AccessRightsFormLabels = {
35
- actions: AccessRightsFormActionsProps['labels'];
36
- input: ContactAccessRightInputProps['labels'];
37
- list: ContactAccessRightsListProps['labels'];
38
- stats: AccessRightsStatsProps['labels'];
39
- };
40
-
41
- const AccessRightsForm = ({
42
- labels,
43
- onCancel,
44
- resourceLink,
45
- ...providerProps
46
- }: AccessRightsFormProps): ReactElement => {
47
- const { classes } = useStyles();
48
-
49
- return (
50
- <AccessRightsFormProvider {...providerProps}>
51
- <div className={classes.accessRightsForm}>
52
- <ContactAccessRightInput labels={labels.input} />
53
- <span className={classes.accessRightsFormList}>
54
- <ContactAccessRightsList labels={labels.list} />
55
- <AccessRightsStats labels={labels.stats} />
56
- </span>
57
- <AccessRightsFormActions
58
- labels={labels.actions}
59
- resourceLink={resourceLink}
60
- onCancel={onCancel}
61
- />
62
- </div>
63
- </AccessRightsFormProvider>
64
- );
65
- };
66
-
67
- export { AccessRightsForm };