Skip to content

Commit 040dcbc

Browse files
committed
Контрольнные работы: валидация группировки
1 parent e34b84d commit 040dcbc

File tree

1 file changed

+43
-5
lines changed

1 file changed

+43
-5
lines changed

hwproj.front/src/components/Courses/CourseExperimental.tsx

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import TimelineOppositeContent from '@mui/lab/TimelineOppositeContent';
2525
import {Alert, Card, CardActions, Chip, Paper, Stack, Tooltip} from "@mui/material";
2626
import {Link} from "react-router-dom";
2727
import StudentStatsUtils from "../../services/StudentStatsUtils";
28-
import {BonusTag, getTip, isBonusWork, isTestWork, TestTag} from "../Common/HomeworkTags";
28+
import {BonusTag, DefaultTags, getTip, isBonusWork, isTestWork, TestTag} from "../Common/HomeworkTags";
2929
import FileInfoConverter from "components/Utils/FileInfoConverter";
3030
import CourseHomeworkExperimental from "components/Homeworks/CourseHomeworkExperimental";
3131
import CourseTaskExperimental from "../Tasks/CourseTaskExperimental";
@@ -67,6 +67,7 @@ interface ICourseExperimentalState {
6767

6868
export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
6969
const [hideDeferred, setHideDeferred] = useState<boolean>(false)
70+
const [showOnlyGroupedTest, setShowOnlyGroupedTest] = useState<string | undefined>(undefined)
7071

7172
// Определяем разрешение экрана пользователя
7273
const theme = useTheme();
@@ -75,7 +76,12 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
7576
// Состояние для кнопки "Наверх"
7677
const [showScrollButton, setShowScrollButton] = useState(false);
7778

78-
const homeworks = props.homeworks.slice().reverse().filter(x => !hideDeferred || !x.isDeferred)
79+
const homeworks = props.homeworks.slice().reverse().filter(x => {
80+
if (hideDeferred) return !x.isDeferred
81+
if (showOnlyGroupedTest !== undefined) return x.tags!.includes(TestTag) && x.tags!.includes(showOnlyGroupedTest)
82+
return true
83+
})
84+
7985
const {isMentor, studentSolutions, isStudentAccepted, userId, selectedHomeworkId, courseFilesInfo} = props
8086

8187
const [state, setState] = useState<ICourseExperimentalState>({
@@ -216,7 +222,7 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
216222
selectedItem: {id: homework.id!, isHomework: true},
217223
})
218224

219-
const getAlert = (entity: HomeworkViewModel | HomeworkTaskViewModel, isHomework: boolean) => {
225+
const getDatesAlert = (entity: HomeworkViewModel | HomeworkTaskViewModel, isHomework: boolean) => {
220226
if (entity.publicationDateNotSet) {
221227
return (
222228
<Alert severity="warning">
@@ -268,6 +274,35 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
268274
</Alert>
269275
)
270276
}
277+
const getGroupingAlert = (homework: HomeworkViewModel) => {
278+
if (!homework.tags!.includes(TestTag)) return null
279+
280+
const groupingTag = homework.tags!.find(x => !DefaultTags.includes(x))
281+
if (groupingTag === undefined) return null
282+
283+
const groupedHomeworks = homeworks.filter(x => x.tags!.includes(TestTag) && x.tags!.includes(groupingTag))
284+
285+
const keys = new Set(groupedHomeworks.map(h => h.tasks!.map(t => t.maxRating).join(";")))
286+
if (keys.size === 1) return null
287+
288+
return <Alert severity="warning"
289+
action={
290+
<Button
291+
fullWidth
292+
color="inherit"
293+
size="small"
294+
onClick={() => setShowOnlyGroupedTest(groupingTag)}
295+
>
296+
Задания с '{groupingTag}'
297+
</Button>}>
298+
<AlertTitle>Группировка контрольных работ</AlertTitle>
299+
Создано несколько контрольных работ, сгруппированных по ключу '<b>{groupingTag}</b>',
300+
однако работы отличаются между собой по количеству задач или их максимальным баллам.
301+
<br/>
302+
<br/>
303+
Количество задач должно быть <b>одинаковым</b>, а баллы между соответствующими задачами <b>равными</b>.
304+
</Alert>
305+
}
271306

272307
const selectedItemHomework = isHomework
273308
? homeworks.find(x => x.id === id)!
@@ -298,6 +333,8 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
298333
},
299334
fileInfos: []
300335
})
336+
setHideDeferred(false)
337+
setShowOnlyGroupedTest(undefined)
301338
setState((prevState) => ({
302339
...prevState,
303340
selectedItem: {
@@ -353,7 +390,8 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
353390
const homeworkEditMode = homework && (homework.id! < 0 || homework.isModified === true)
354391
return homework && <Stack direction={"column"} spacing={2}>
355392
<Card style={{backgroundColor: "ghostwhite"}} raised={homeworkEditMode}>
356-
{getAlert(homework, true)}
393+
{getGroupingAlert(homework)}
394+
{getDatesAlert(homework, true)}
357395
<CourseHomeworkExperimental
358396
key={homework.id}
359397
getAllHomeworks={() => homeworks}
@@ -383,7 +421,7 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
383421
const renderTask = (task: HomeworkTaskViewModel & { isModified?: boolean }, homework: HomeworkViewModel) => {
384422
const taskEditMode = task && (task.id! < 0 || task.isModified === true)
385423
return task && <Card style={{backgroundColor: "ghostwhite"}} raised={taskEditMode}>
386-
{getAlert(task, false)}
424+
{getDatesAlert(task, false)}
387425
<CourseTaskExperimental
388426
key={task.id}
389427
task={task}

0 commit comments

Comments
 (0)