Skip to content

Commit 34f8d9a

Browse files
authored
Merge pull request #4 from InfinityTwo/grading-filterable-columns
Switch branch names as changes are more than just filterable columns
2 parents ac5474f + c4f0ddf commit 34f8d9a

File tree

11 files changed

+555
-61
lines changed

11 files changed

+555
-61
lines changed

src/commons/application/ApplicationTypes.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,9 @@ export const defaultWorkspaceManager: WorkspaceManagerState = {
410410
submissionsTableFilters: {
411411
columnFilters: []
412412
},
413+
columnVisiblity: {
414+
columns: []
415+
},
413416
currentSubmission: undefined,
414417
currentQuestion: undefined,
415418
hasUnsavedChanges: false
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
declare const twJustifyContentValues: readonly ["justify-start", "justify-end", "justify-center", "justify-between", "justify-around", "justify-evenly"];
2+
declare type JustifyContent = typeof twJustifyContentValues[number];
3+
declare const twAlignItemsValues: readonly ["items-start", "items-end", "items-center", "items-baseline", "items-stretch"];
4+
declare type AlignItems = typeof twAlignItemsValues[number];
5+
declare const twFlexDirectionValues: readonly ["row", "column"];
6+
declare type FlexDirection = typeof twFlexDirectionValues[number];
7+
8+
type GradingFlexProps = {
9+
justifyContent?: JustifyContent;
10+
alignItems?: AlignItems;
11+
flexDirection?: FlexDirection;
12+
children?: React.ReactNode;
13+
style?: React.CSSProperties;
14+
className?: string;
15+
} & React.RefAttributes<HTMLDivElement>;
16+
17+
const GradingFlex: React.FC<GradingFlexProps> = ({ justifyContent, alignItems, flexDirection, children, style, className, }: GradingFlexProps) => {
18+
const defaultStyle: React.CSSProperties = {
19+
display: "flex",
20+
justifyContent:
21+
(justifyContent === "justify-start"
22+
? "flex-start"
23+
: justifyContent === "justify-end"
24+
? "flex-end"
25+
: justifyContent === "justify-center"
26+
? "center"
27+
: justifyContent === "justify-between"
28+
? "space-between"
29+
: justifyContent === "justify-around"
30+
? "space-around"
31+
: justifyContent === "justify-evenly"
32+
? "space-evenly"
33+
: ""
34+
),
35+
alignItems:
36+
(alignItems === "items-start"
37+
? "start"
38+
: alignItems === "items-end"
39+
? "end"
40+
: alignItems === "items-center"
41+
? "center"
42+
: alignItems === "items-baseline"
43+
? "baseline"
44+
: ""
45+
),
46+
flexDirection: flexDirection,
47+
};
48+
49+
return (
50+
<div className={className} style={{...defaultStyle, ...style}}>
51+
{children}
52+
</div>
53+
);
54+
}
55+
56+
export default GradingFlex;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Text } from "@blueprintjs/core";
2+
3+
type GradingTextProps = {
4+
children?: React.ReactNode;
5+
style?: React.CSSProperties;
6+
secondaryText?: boolean;
7+
className?: string;
8+
} & React.RefAttributes<HTMLDivElement>;
9+
10+
const GradingText: React.FC<GradingTextProps> = ({ children, style, secondaryText, className = "", }: GradingTextProps) => {
11+
const defaultStyle: React.CSSProperties = {
12+
width: "max-content",
13+
margin: "auto 0"
14+
};
15+
16+
return (
17+
<Text
18+
className={"bp5-ui-text " + className + (secondaryText ? " bp5-text-muted" : "")}
19+
style={{...defaultStyle, ...style}}
20+
>
21+
{children}
22+
</Text>
23+
);
24+
}
25+
26+
export default GradingText;

src/commons/workspace/WorkspaceActions.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
EVAL_EDITOR_AND_TESTCASES,
3535
EVAL_REPL,
3636
EVAL_TESTCASE,
37+
GradingColumnVisibility,
3738
MOVE_CURSOR,
3839
NAV_DECLARATION,
3940
PLAYGROUND_EXTERNAL_SELECT,
@@ -63,6 +64,7 @@ import {
6364
UPDATE_CURRENTSTEP,
6465
UPDATE_EDITOR_BREAKPOINTS,
6566
UPDATE_EDITOR_VALUE,
67+
UPDATE_GRADING_COLUMN_VISIBILITY,
6668
UPDATE_HAS_UNSAVED_CHANGES,
6769
UPDATE_REPL_VALUE,
6870
UPDATE_STEPSTOTAL,
@@ -398,6 +400,11 @@ export const updateSubmissionsTableFilters = createAction(
398400
(filters: SubmissionsTableFilters) => ({ payload: { filters } })
399401
);
400402

403+
export const updateGradingColumnVisibility = createAction(
404+
UPDATE_GRADING_COLUMN_VISIBILITY,
405+
(filters: GradingColumnVisibility) => ({ payload: { filters } })
406+
);
407+
401408
export const updateCurrentAssessmentId = createAction(
402409
UPDATE_CURRENT_ASSESSMENT_ID,
403410
(assessmentId: number, questionId: number) => ({ payload: { assessmentId, questionId } })

src/commons/workspace/WorkspaceReducer.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import {
7676
UPDATE_CURRENTSTEP,
7777
UPDATE_EDITOR_BREAKPOINTS,
7878
UPDATE_EDITOR_VALUE,
79+
UPDATE_GRADING_COLUMN_VISIBILITY,
7980
UPDATE_HAS_UNSAVED_CHANGES,
8081
UPDATE_REPL_VALUE,
8182
UPDATE_STEPSTOTAL,
@@ -631,6 +632,14 @@ const oldWorkspaceReducer: Reducer<WorkspaceManagerState> = (
631632
submissionsTableFilters: action.payload.filters
632633
}
633634
};
635+
case UPDATE_GRADING_COLUMN_VISIBILITY:
636+
return {
637+
...state,
638+
grading: {
639+
...state.grading,
640+
columnVisiblity: action.payload.filters
641+
}
642+
};
634643
case UPDATE_CURRENT_ASSESSMENT_ID:
635644
return {
636645
...state,

src/commons/workspace/WorkspaceTypes.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const TOGGLE_USING_SUBST = 'TOGGLE_USING_SUBST';
4141
export const TOGGLE_USING_CSE = 'TOGGLE_USING_CSE';
4242
export const TOGGLE_UPDATE_CSE = 'TOGGLE_UPDATE_CSE';
4343
export const UPDATE_SUBMISSIONS_TABLE_FILTERS = 'UPDATE_SUBMISSIONS_TABLE_FILTERS';
44+
export const UPDATE_GRADING_COLUMN_VISIBILITY = 'UPDATE_GRADING_COLUMN_VISIBILITY';
4445
export const UPDATE_CURRENT_ASSESSMENT_ID = 'UPDATE_CURRENT_ASSESSMENT_ID';
4546
export const UPDATE_CURRENT_SUBMISSION_ID = 'UPDATE_CURRENT_SUBMISSION_ID';
4647
export const TOGGLE_FOLDER_MODE = 'TOGGLE_FOLDER_MODE';
@@ -77,6 +78,7 @@ type AssessmentWorkspaceState = AssessmentWorkspaceAttr & WorkspaceState;
7778

7879
type GradingWorkspaceAttr = {
7980
readonly submissionsTableFilters: SubmissionsTableFilters;
81+
readonly columnVisiblity: GradingColumnVisibility;
8082
readonly currentSubmission?: number;
8183
readonly currentQuestion?: number;
8284
readonly hasUnsavedChanges: boolean;
@@ -166,3 +168,7 @@ export type DebuggerContext = {
166168
export type SubmissionsTableFilters = {
167169
columnFilters: { id: string; value: unknown }[];
168170
};
171+
172+
export type GradingColumnVisibility = {
173+
columns: string[];
174+
};

src/pages/academy/grading/subcomponents/GradingActions.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
import { Icon as BpIcon } from '@blueprintjs/core';
22
import { IconNames } from '@blueprintjs/icons';
3-
import { Flex, Icon } from '@tremor/react';
3+
import { Icon } from '@tremor/react';
4+
import React from 'react';
45
import { useDispatch } from 'react-redux';
56
import { Link } from 'react-router-dom';
67
import {
78
reautogradeSubmission,
89
unsubmitSubmission
910
} from 'src/commons/application/actions/SessionActions';
11+
import GradingFlex from 'src/commons/grading/GradingFlex';
1012
import { showSimpleConfirmDialog } from 'src/commons/utils/DialogHelper';
1113
import { useTypedSelector } from 'src/commons/utils/Hooks';
1214

1315
type GradingActionsProps = {
1416
submissionId: number;
17+
style?: React.CSSProperties;
1518
};
1619

17-
const GradingActions: React.FC<GradingActionsProps> = ({ submissionId }) => {
20+
const GradingActions: React.FC<GradingActionsProps> = ({ submissionId, style }) => {
1821
const dispatch = useDispatch();
1922
const courseId = useTypedSelector(store => store.session.courseId);
2023

@@ -46,7 +49,7 @@ const GradingActions: React.FC<GradingActionsProps> = ({ submissionId }) => {
4649
};
4750

4851
return (
49-
<Flex justifyContent="justify-start" spaceX="space-x-2">
52+
<GradingFlex justifyContent="justify-start" style={{columnGap: "5px", ...style}}>
5053
<Link to={`/courses/${courseId}/grading/${submissionId}`}>
5154
<Icon tooltip="Grade" icon={() => <BpIcon icon={IconNames.EDIT} />} variant="light" />
5255
</Link>
@@ -62,7 +65,7 @@ const GradingActions: React.FC<GradingActionsProps> = ({ submissionId }) => {
6265
<button type="button" style={{ padding: 0 }} onClick={handleUnsubmitClick}>
6366
<Icon tooltip="Unsubmit" icon={() => <BpIcon icon={IconNames.UNDO} />} variant="simple" />
6467
</button>
65-
</Flex>
68+
</GradingFlex>
6669
);
6770
};
6871

src/pages/academy/grading/subcomponents/GradingBadges.tsx

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,32 @@ const FilterBadge: React.FC<FilterBadgeProps> = ({ filter, onRemove }) => {
9595
);
9696
};
9797

98-
export { AssessmentTypeBadge, FilterBadge, GradingStatusBadge, SubmissionStatusBadge };
98+
type ColumnFilterBadgeProps = {
99+
filter: string;
100+
onRemove: (toRemove: string) => void;
101+
filtersName: string;
102+
};
103+
104+
const ColumnFilterBadge: React.FC<ColumnFilterBadgeProps> = ({ filter, onRemove, filtersName }) => {
105+
return (
106+
<button
107+
type="button"
108+
className="grading-overview-filterable-btns"
109+
onClick={() => onRemove(filter)}
110+
>
111+
<Badge
112+
text={filtersName}
113+
icon={() => <Icon icon={IconNames.CROSS} style={{ marginRight: '0.25rem' }} />}
114+
color={getBadgeColorFromLabel(filter)}
115+
/>
116+
</button>
117+
);
118+
};
119+
120+
export {
121+
AssessmentTypeBadge,
122+
ColumnFilterBadge,
123+
FilterBadge,
124+
GradingStatusBadge,
125+
SubmissionStatusBadge
126+
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { ColumnFilterBadge } from './GradingBadges';
2+
3+
type GradingSubmissionFiltersProps = {
4+
filters: string[];
5+
onFilterRemove: (toRemove: string) => void;
6+
filtersName: string[];
7+
};
8+
9+
const GradingColumnFilters: React.FC<GradingSubmissionFiltersProps> = ({
10+
filters,
11+
onFilterRemove,
12+
filtersName
13+
}) => {
14+
return (
15+
<div>
16+
{filters.map((filter, index) => (
17+
<ColumnFilterBadge
18+
filter={filter}
19+
filtersName={filtersName[index]}
20+
onRemove={onFilterRemove}
21+
key={filter}
22+
/>
23+
))}
24+
</div>
25+
);
26+
};
27+
28+
export default GradingColumnFilters;

0 commit comments

Comments
 (0)