Skip to content

Commit

Permalink
Grading table improvements (filter by name, username, group) (#3023)
Browse files Browse the repository at this point in the history
* Make columns resizable

* Add floating filter row

* Simplify height logic

* Add filtering by name, username, and group

* Remove log statement
  • Loading branch information
RichDom2185 committed Aug 19, 2024
1 parent cfc32e9 commit 7b76ac1
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 19 deletions.
6 changes: 1 addition & 5 deletions src/features/grading/GradingTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,7 @@ export type AllColsSortStates = {

export type ColumnFiltersState = ColumnFilter[];

export type ColumnFilter = {
id: string;
value: unknown;
};
export type ColumnFilter = { id: string; value: unknown };

export type GradingColumnVisibility = ColumnFieldsKeys[];

Expand Down Expand Up @@ -163,7 +160,6 @@ export type IGradingTableProperties = {
suppressMenuHide: boolean;
suppressPaginationPanel: boolean;
suppressRowClickSelection: boolean;
tableHeight: string;
tableMargins: string;
};

Expand Down
4 changes: 2 additions & 2 deletions src/pages/academy/grading/Grading.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ const Grading: React.FC = () => {
gradingOverviews?.data === undefined ? (
loadingDisplay
) : (
<GradingFlex flexDirection="column" className="grading-table-wrapper">
<div className="grading-table-wrapper">
<GradingFlex justifyContent="space-between">
<GradingFlex justifyContent="flex-start" style={{ columnGap: '1.5rem' }}>
<GradingText style={{ fontSize: '1.125rem', opacity: 0.9 }}>
Expand Down Expand Up @@ -218,7 +218,7 @@ const Grading: React.FC = () => {
submissions={submissions}
updateEntries={updateGradingOverviewsCallback}
/>
</GradingFlex>
</div>
)
}
fullWidth
Expand Down
40 changes: 28 additions & 12 deletions src/pages/academy/grading/subcomponents/GradingSubmissionsTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([
...tableFilters.columnFilters
]);
const [cellFilters, setCellFilters] = useState<{ id: ColumnFields; value: string }[]>([]);
const [hiddenColumns, setHiddenColumns] = useState<GradingColumnVisibility>(
columnVisibility ? columnVisibility : []
);
Expand All @@ -103,7 +104,8 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({

const defaultColumnDefs: ColDef = {
filter: false,
resizable: false,
floatingFilter: true,
resizable: true,
sortable: true,
headerComponentParams: {
hideColumn: (id: ColumnNameKeys) => handleColumnFilterAdd(id),
Expand Down Expand Up @@ -142,8 +144,6 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
suppressMenuHide: true,
suppressPaginationPanel: true,
suppressRowClickSelection: true,
tableHeight:
String(ROW_HEIGHT * (rowData.length > 0 ? rowData.length : 2) + HEADER_HEIGHT + 4) + 'px',
tableMargins: '1rem 0 0 0'
};

Expand All @@ -162,11 +162,14 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
debouncedUpdateSearchValue(e.target.value);
};

const debouncedUpdateCellFilters = useMemo(() => debounce(setCellFilters, 300), []);

// Converts the columnFilters array into backend query parameters.
const backendFilterParams = useMemo(() => {
const filters: Array<{ [key: string]: any }> = [
{ id: ColumnFields.assessmentName, value: searchValue },
...columnFilters
...columnFilters,
...cellFilters
].map(convertFilterToBackendParams);

const params: Record<string, any> = {};
Expand All @@ -176,7 +179,7 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
});
});
return params;
}, [columnFilters, searchValue]);
}, [cellFilters, columnFilters, searchValue]);

const cellClickedEvent = (event: CellClickedEvent) => {
const colClicked: string = event.colDef.field ? event.colDef.field : '';
Expand Down Expand Up @@ -392,13 +395,7 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
></InputGroup>
</GradingFlex>

<div
className="ag-theme-quartz"
style={{
height: tableProperties.tableHeight,
margin: tableProperties.tableMargins
}}
>
<div className="ag-theme-quartz" style={{ margin: tableProperties.tableMargins }}>
<AgGridReact
columnDefs={colDefs}
onCellClicked={cellClickedEvent}
Expand All @@ -416,6 +413,25 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
suppressMenuHide={tableProperties.suppressMenuHide}
suppressPaginationPanel={tableProperties.suppressPaginationPanel}
suppressRowClickSelection={tableProperties.suppressRowClickSelection}
domLayout="autoHeight"
onFilterChanged={e => {
if (!e.afterFloatingFilter) {
return;
}
const filters = e.api.getFilterModel();
const cellFilters = [];
for (const [key, { filter: query }] of Object.entries(filters)) {
switch (key) {
// Fields that BE supports filtering on
case ColumnFields.studentName:
case ColumnFields.studentUsername:
case ColumnFields.groupName:
cellFilters.push({ id: key, value: query });
break;
}
}
debouncedUpdateCellFilters(cellFilters);
}}
/>
</div>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export const generateCols = (filterMode: boolean) => {
...generalColProperties,
headerName: ColumnName.studentName,
field: ColumnFields.studentName,
filter: true,
flex: 1.5,
cellClass: classNames(generalColProperties.cellClass, classes['grading-cell-align-left']),
headerClass: classNames(generalColProperties.headerClass, classes['grading-left-align']),
Expand All @@ -82,6 +83,7 @@ export const generateCols = (filterMode: boolean) => {
...generalColProperties,
headerName: ColumnName.studentUsername,
field: ColumnFields.studentUsername,
filter: true,
cellRendererSelector: (params: ICellRendererParams<IGradingTableRow>) => {
return params.data !== undefined
? {
Expand All @@ -99,6 +101,7 @@ export const generateCols = (filterMode: boolean) => {
...generalColProperties,
headerName: ColumnName.groupName,
field: ColumnFields.groupName,
filter: true,
flex: 0.75,
cellRendererSelector: (params: ICellRendererParams<IGradingTableRow>) => {
return params.data !== undefined
Expand Down

0 comments on commit 7b76ac1

Please sign in to comment.