Skip to content

Commit c463908

Browse files
committed
Create User Projects grid with gql
1 parent 088c72b commit c463908

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

src/api/schema/typePolicies/typePolicies.base.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ export const typePolicies: TypePolicies = {
8585
engagements: {},
8686
},
8787
},
88+
User: {
89+
fields: {
90+
projects: {}, // no page merging (infinite scroll)
91+
},
92+
},
8893
Query: {
8994
fields: {
9095
projects: {},
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { TabPanelContent } from '~/components/Tabs';
2+
import { UserProjectsPanel } from './UserProjectPanel/UserProjectsPanel';
3+
4+
export const UserDetailProjects = () => {
5+
return (
6+
<TabPanelContent>
7+
<UserProjectsPanel />
8+
</TabPanelContent>
9+
);
10+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
query UserProjectList($userId: ID!, $input: ProjectListInput) {
2+
user(id: $userId) {
3+
id
4+
projects(input: $input) {
5+
canRead
6+
hasMore
7+
total
8+
items {
9+
...userProjectDataGridRow
10+
}
11+
}
12+
}
13+
}
14+
15+
fragment userProjectDataGridRow on Project {
16+
...projectDataGridRow
17+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import {
2+
DataGridPro as DataGrid,
3+
DataGridProProps as DataGridProps,
4+
} from '@mui/x-data-grid-pro';
5+
import { merge } from 'lodash';
6+
import { useMemo } from 'react';
7+
import { useParams } from 'react-router-dom';
8+
import {
9+
DefaultDataGridStyles,
10+
flexLayout,
11+
noFooter,
12+
noHeaderFilterButtons,
13+
useDataGridSource,
14+
} from '~/components/Grid';
15+
import {
16+
ProjectDataGridRowFragment as Project,
17+
ProjectColumns,
18+
ProjectInitialState,
19+
ProjectToolbar,
20+
} from '~/components/ProjectDataGrid';
21+
import { UserProjectListDocument } from './UserProjectList.graphql';
22+
23+
export const UserProjectsPanel = () => {
24+
const { userId = '' } = useParams();
25+
26+
const [dataGridProps] = useDataGridSource({
27+
query: UserProjectListDocument,
28+
variables: { userId },
29+
listAt: 'user.projects',
30+
initialInput: {
31+
sort: 'name',
32+
},
33+
});
34+
35+
const slots = useMemo(
36+
() =>
37+
merge({}, DefaultDataGridStyles.slots, dataGridProps.slots, {
38+
toolbar: ProjectToolbar,
39+
} satisfies DataGridProps['slots']),
40+
[dataGridProps.slots]
41+
);
42+
43+
const slotProps = useMemo(
44+
() => merge({}, DefaultDataGridStyles.slotProps, dataGridProps.slotProps),
45+
[dataGridProps.slotProps]
46+
);
47+
48+
return (
49+
<DataGrid<Project>
50+
{...DefaultDataGridStyles}
51+
{...dataGridProps}
52+
slots={slots}
53+
slotProps={slotProps}
54+
columns={ProjectColumns}
55+
initialState={ProjectInitialState}
56+
headerFilters
57+
hideFooter
58+
sx={[flexLayout, noHeaderFilterButtons, noFooter]}
59+
/>
60+
);
61+
};

0 commit comments

Comments
 (0)