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 17, 2024
1 parent 9a0a137 commit 9d759a2
Show file tree
Hide file tree
Showing 4 changed files with 165 additions and 181 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ 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 { usersLinesSearchQuery } from '@components/settings/users/UsersLines';
import { UsersLinesSearchQuery } from '@components/settings/users/__generated__/UsersLinesSearchQuery.graphql';
import { GroupUsersLinesQuery$variables } from '@components/settings/users/__generated__/GroupUsersLinesQuery.graphql';
import { initialStaticPaginationForGroupUsers } from '@components/settings/users/GroupUsers';
import GroupEditionOverview from './GroupEditionOverview';
import Loader, { LoaderVariant } from '../../../../components/Loader';
import GroupEditionRoles, { groupEditionRolesLinesSearchQuery } from './GroupEditionRoles';
Expand All @@ -15,8 +18,8 @@ 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';
import { usePaginationLocalStorage } from '../../../../utils/hooks/useLocalStorage';

export const groupEditionContainerQuery = graphql`
query GroupEditionContainerQuery($id: String!) {
Expand Down Expand Up @@ -71,17 +74,26 @@ 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 />;
}

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

const { editContext } = group;
return (
<Drawer
Expand Down Expand Up @@ -111,7 +123,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} paginationOptionsForUpdater={paginationOptionsForUserEdition} />
</React.Suspense>
)}
</>
</Drawer>
);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
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 ListItemIcon from '@mui/material/ListItemIcon';
import ListItemText from '@mui/material/ListItemText';
import Checkbox from '@mui/material/Checkbox';
import { PersonOutlined } from '@mui/icons-material';
import { UsersLinesSearchQuery } from '@components/settings/users/__generated__/UsersLinesSearchQuery.graphql';
import { GroupEditionContainer_group$data } from '@components/settings/groups/__generated__/GroupEditionContainer_group.graphql';
import { GroupUsersLinesQuery$variables } from '@components/settings/users/__generated__/GroupUsersLinesQuery.graphql';
import { usersLinesSearchQuery } from '../users/UsersLines';
import { deleteNodeFromId, insertNode } from '../../../../utils/store';

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>,
paginationOptionsForUpdater: GroupUsersLinesQuery$variables,
}

const GroupEditionUsers: FunctionComponent<GroupEditionUsersProps> = ({ group, queryRef, paginationOptionsForUpdater }) => {
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>) => {
const input = {
fromId: userId,
relationship_type: 'member-of',
};
if (event.target.checked) {
commitAddUser({
variables: {
id: groupId,
input,
},
updater: (store) => {
insertNode(
store,
'Pagination_group_members',
paginationOptionsForUpdater,
'groupEdit',
groupId,
'relationAdd',
{ input },
'from',
);
},
});
} else if (groupUser !== undefined) {
commitRemoveUser({
variables: {
id: groupId,
fromId: groupUser.id,
relationship_type: 'member-of',
},
updater: (store) => {
deleteNodeFromId(store, groupId, 'Pagination_group_members', paginationOptionsForUpdater, groupUser.id);
},
});
}
};

return (
<List dense={true}>
{users.map((user) => {
const groupUser = groupUsers.find((g) => g.id === user.id);
return (
<ListItem key={user.id} 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 9d759a2

Please sign in to comment.