Skip to content

Commit

Permalink
[frontend] update frontend when adding a user to a group (#6703)
Browse files Browse the repository at this point in the history
  • Loading branch information
Archidoit committed Apr 16, 2024
1 parent 9f8d905 commit c4eba0a
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 174 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import { graphql, PreloadedQuery, useFragment, usePreloadedQuery } from 'react-relay';
import Drawer, { DrawerVariant } from '@components/common/drawer/Drawer';
import { GroupUsersLinesQuery$variables } from '@components/settings/users/__generated__/GroupUsersLinesQuery.graphql';
import { usersLinesSearchQuery } from '@components/settings/users/UsersLines';
import { UsersLinesSearchQuery } from '@components/settings/users/__generated__/UsersLinesSearchQuery.graphql';
import GroupEditionOverview from './GroupEditionOverview';
import Loader, { LoaderVariant } from '../../../../components/Loader';
import GroupEditionRoles, { groupEditionRolesLinesSearchQuery } from './GroupEditionRoles';
Expand All @@ -15,7 +16,6 @@ import { GroupEditionRolesLinesSearchQuery } from './__generated__/GroupEditionR
import { GroupEditionContainerQuery } from './__generated__/GroupEditionContainerQuery.graphql';
import { GroupEditionContainer_group$key } from './__generated__/GroupEditionContainer_group.graphql';
import GroupEditionMarkings from './GroupEditionMarkings';
import { usePaginationLocalStorage } from '../../../../utils/hooks/useLocalStorage';
import ErrorNotFound from '../../../../components/ErrorNotFound';

export const groupEditionContainerQuery = graphql`
Expand Down Expand Up @@ -71,13 +71,13 @@ const GroupEditionContainer: FunctionComponent<GroupEditionContainerProps> = ({

const groupData = usePreloadedQuery<GroupEditionContainerQuery>(groupEditionContainerQuery, groupQueryRef);
const roleQueryRef = useQueryLoading<GroupEditionRolesLinesSearchQuery>(groupEditionRolesLinesSearchQuery);
const userQueryRef = useQueryLoading<UsersLinesSearchQuery>(usersLinesSearchQuery);

const group = useFragment<GroupEditionContainer_group$key>(
GroupEditionContainerFragment,
groupData.group,
);

const { paginationOptions } = usePaginationLocalStorage<GroupUsersLinesQuery$variables>(`group-${group?.id}-users`, {});

if (!group) {
return <ErrorNotFound />;
}
Expand Down Expand Up @@ -111,7 +111,13 @@ const GroupEditionContainer: FunctionComponent<GroupEditionContainerProps> = ({
</React.Suspense>
)}
{currentTab === 2 && <GroupEditionMarkings group={group} />}
{currentTab === 3 && <GroupEditionUsers group={group} paginationOptions={paginationOptions} />}
{currentTab === 3 && userQueryRef && (
<React.Suspense
fallback={<Loader variant={LoaderVariant.inElement} />}
>
<GroupEditionUsers group={group} queryRef={userQueryRef} />
</React.Suspense>
)}
</>
</Drawer>
);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import React, { FunctionComponent } from 'react';
import { graphql, PreloadedQuery, useMutation, usePreloadedQuery } from 'react-relay';
import List from '@mui/material/List';
import ListItem from '@mui/material/ListItem';
import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction';
import { Theme } from '@mui/material/styles/createTheme';
import ListItemIcon from '@mui/material/ListItemIcon';
import ListItemText from '@mui/material/ListItemText';
import Checkbox from '@mui/material/Checkbox';
import { PersonOutlined } from '@mui/icons-material';
import makeStyles from '@mui/styles/makeStyles';
import { UsersLinesSearchQuery } from '@components/settings/users/__generated__/UsersLinesSearchQuery.graphql';
import { GroupEditionContainer_group$data } from '@components/settings/groups/__generated__/GroupEditionContainer_group.graphql';
import { usersLinesSearchQuery } from '../users/UsersLines';

const useStyles = makeStyles<Theme>((theme) => ({
list: {
width: '100%',
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
avatar: {
backgroundColor: theme.palette.primary.main,
},
}));

const userMutationRelationAdd = graphql`
mutation GroupEditionUsersRelationAddMutation(
$id: ID!
$input: InternalRelationshipAddInput!
) {
groupEdit(id: $id) {
relationAdd(input: $input) {
to {
...GroupEditionContainer_group
}
from {
...UserLine_node
}
}
}
}
`;

const userMutationRelationDelete = graphql`
mutation GroupEditionUsersRelationDeleteMutation(
$id: ID!
$fromId: StixRef!
$relationship_type: String!
) {
groupEdit(id: $id) {
relationDelete(fromId: $fromId, relationship_type: $relationship_type) {
id
...GroupEditionContainer_group
}
}
}
`;

interface GroupEditionUsersProps {
group: GroupEditionContainer_group$data,
queryRef: PreloadedQuery<UsersLinesSearchQuery>,
}

const GroupEditionUsers: FunctionComponent<GroupEditionUsersProps> = ({ group, queryRef }) => {
const classes = useStyles();
const groupId = group.id;
const groupUsers = group?.members?.edges?.map((n) => ({ id: n.node.id })) ?? [];
const usersData = usePreloadedQuery<UsersLinesSearchQuery>(usersLinesSearchQuery, queryRef);
const users = usersData.users?.edges.map((n) => n.node) ?? [];

const [commitAddUser] = useMutation(userMutationRelationAdd);
const [commitRemoveUser] = useMutation(userMutationRelationDelete);
const handleToggle = (userId: string, groupUser: { id: string } | undefined, event: React.ChangeEvent<HTMLInputElement>) => {
if (event.target.checked) {
commitAddUser({
variables: {
id: groupId,
input: {
fromId: userId,
relationship_type: 'member-of',
},
},
});
} else if (groupUser !== undefined) {
commitRemoveUser({
variables: {
id: groupId,
fromId: groupUser.id,
relationship_type: 'member-of',
},
});
}
};

return (
<List dense={true} className={classes.root}>
{users.map((user) => {
const groupUser = groupUsers.find((g) => g.id === user.id);
return (
<ListItem key={groupId} divider={true}>
<ListItemIcon color="primary">
<PersonOutlined/>
</ListItemIcon>
<ListItemText
primary={user.name}
secondary={user.user_email}
/>
<ListItemSecondaryAction>
<Checkbox
onChange={(event) => handleToggle(
user.id,
groupUser,
event,
)}
checked={groupUser !== undefined}
/>
</ListItemSecondaryAction>
</ListItem>
);
})}
</List>
);
};

export default GroupEditionUsers;

0 comments on commit c4eba0a

Please sign in to comment.