diff --git a/client/src/components/admin/group/GroupMembers.tsx b/client/src/components/admin/group/GroupMembers.tsx index 22e1cbcff602157fbba9fbf696978226192edb10..a0bd86ad2d2eedc9381298cb2769baf2bf14d6f1 100644 --- a/client/src/components/admin/group/GroupMembers.tsx +++ b/client/src/components/admin/group/GroupMembers.tsx @@ -1,5 +1,26 @@ -import { Group } from '../../../types/graphqlSchema'; +import { Box, IconButton, Tooltip, Typography } from '@material-ui/core'; +import { Group, Member } from '../../../types/graphqlSchema'; +import { IListGroupMembers, listGroupMembers } from '../../../graphql/queries/group/listGroupMembers'; + +import { CardTable } from '../../utils/CardTable'; +import CreateIcon from '@material-ui/icons/Create'; +import PeopleIcon from '@material-ui/icons/People'; import React from 'react'; +import { getMemberStateString } from '../../../utils/getMemberStateString'; +import { useQuery } from '@apollo/client'; + +interface IGroupMembersTable extends Partial<Member> { + name: string; + membership: Partial<Member>; +} + +const convertResponseToTable = (rows: Partial<Member>[] | undefined): Partial<IGroupMembersTable>[] => { + if (!rows) return []; + return rows.map((o) => ({ + name: `${o.user?.familyName} ${o.user?.givenName}`, + membership: { groupRole: o.groupRole, memberState: o.memberState }, + })); +}; interface TParams { group: Partial<Group> | undefined; @@ -7,6 +28,76 @@ interface TParams { } export const GroupMembers: React.FC<TParams> = ({ group, filterBy }) => { - console.log(group?.id); - return <>filtered role = {filterBy || 'none'}</>; + console.log(filterBy); + + const { loading: membersIsLoading, data: members } = useQuery<IListGroupMembers>( + listGroupMembers(`user { familyName, givenName }, memberState, groupRole`), + { + variables: { groupId: Number(group?.id) }, + }, + ); + + return ( + <CardTable<Partial<IGroupMembersTable>> + columns={[ + { + title: 'Név', + field: 'name', + }, + { + title: 'Tagság', + field: 'membership', + align: 'right', + render: function renderMembership(rowData) { + if (!rowData.membership) { + return ''; + } + return getMemberStateString(rowData.membership); + }, + customSort: (rowData1, rowData2) => { + if (!rowData1.membership || !rowData2.membership) { + return 0; + } + const str1 = getMemberStateString(rowData1.membership); + const str2 = getMemberStateString(rowData2.membership); + if (str1 < str2) return -1; + if (str1 > str2) return 1; + return 0; + }, + }, + { + align: 'left', + render: function renderEditIcon(rowData) { + return ( + <Tooltip title="Szerkesztés" aria-label="group-administration"> + <IconButton + onClick={() => alert('Not implemented ' + rowData.name)} + color="secondary" + style={{ padding: '8px' }} + > + <CreateIcon /> + </IconButton> + </Tooltip> + ); + }, + width: '8px', + }, + ]} + data={convertResponseToTable(members?.group.members)} + isLoading={membersIsLoading} + title={ + <Box display="flex" alignItems="center"> + <PeopleIcon /> + <Typography variant="h5" style={{ marginLeft: '0.8rem' }}> + Tagok + </Typography> + </Box> + } + options={{ + search: true, + rowStyle: { fontFamily: 'Roboto' }, + emptyRowsWhenPaging: false, + }} + /> + ); };