Skip to content

Commit b85c806

Browse files
committed
Homework: улучшение валидации группировки 2
1 parent d5f3111 commit b85c806

1 file changed

Lines changed: 36 additions & 23 deletions

File tree

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

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,14 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
170170
.forEach(x => taskSolutionsMap.set(x.id!, x.solution!))
171171
}
172172

173-
const showWarningsForEntity = (entity: HomeworkViewModel | HomeworkTaskViewModel) =>
174-
isMentor && (entity.publicationDateNotSet || entity.hasDeadline && entity.deadlineDateNotSet)
173+
const showWarningsForEntity = (entity: HomeworkViewModel | HomeworkTaskViewModel, isHomework: boolean) => {
174+
if (!isMentor) return false
175+
if (entity.publicationDateNotSet || entity.hasDeadline && entity.deadlineDateNotSet) return true
176+
177+
if (!isHomework) return false
178+
const result = validateTestGrouping(entity)
179+
return result !== true && result.hasErrors
180+
}
175181

176182
const renderHomeworkStatus = (homework: HomeworkViewModel & { isModified?: boolean, hasErrors?: boolean }) => {
177183
const hasErrors = homework.id! < 0 && (homework.hasErrors || homework.tasks!.some((t: HomeworkTaskViewModel & {
@@ -181,7 +187,7 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
181187
return <div style={{fontSize: 16}}><ErrorIcon fontSize="small" color={"error"}/><br/></div>
182188
if (homework.isModified)
183189
return <div style={{fontSize: 16}}><EditIcon fontSize="small" color={"primary"}/><br/></div>
184-
return showWarningsForEntity(homework) && <div style={{fontSize: 16}}>⚠️<br/></div>
190+
return showWarningsForEntity(homework, true) && <div style={{fontSize: 16}}>⚠️<br/></div>
185191
}
186192

187193
const renderTaskStatus = (task: HomeworkTaskViewModel & { isModified?: boolean, hasErrors?: boolean }) => {
@@ -204,7 +210,7 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
204210
}
205211
if (task.hasErrors) return <ErrorIcon fontSize="small" color={"error"}/>
206212
if (task.isModified) return <EditIcon fontSize="small" color={"primary"}/>
207-
return showWarningsForEntity(task) ? (
213+
return showWarningsForEntity(task, false) ? (
208214
<Typography color={task.isDeferred ? "textSecondary" : "textPrimary"}>
209215
<TimelineDot variant="outlined" style={warningTimelineDotStyle}>⚠️</TimelineDot>
210216
</Typography>
@@ -223,6 +229,19 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
223229
selectedItem: {id: homework.id!, isHomework: true},
224230
})
225231

232+
const validateTestGrouping = (homework: HomeworkViewModel) => {
233+
if (!homework.tags!.includes(TestTag)) return true
234+
235+
const groupingTag = homework.tags!.find(x => !DefaultTags.includes(x))
236+
if (groupingTag === undefined) return true
237+
238+
const groupedHomeworks = homeworks.filter(x => x.tags!.includes(TestTag) && x.tags!.includes(groupingTag))
239+
if (groupedHomeworks.length === 1) return true
240+
241+
const keys = new Set(groupedHomeworks.map(h => h.tasks!.map(t => t.maxRating).join(";")))
242+
return {groupingTag: groupingTag, hasErrors: keys.size === 1}
243+
}
244+
226245
const getDatesAlert = (entity: HomeworkViewModel | HomeworkTaskViewModel, isHomework: boolean) => {
227246
if (entity.publicationDateNotSet) {
228247
return (
@@ -276,25 +295,19 @@ export const CourseExperimental: FC<ICourseExperimentalProps> = (props) => {
276295
)
277296
}
278297
const getGroupingAlert = (homework: HomeworkViewModel) => {
279-
if (!homework.tags!.includes(TestTag)) return null
280-
281-
const groupingTag = homework.tags!.find(x => !DefaultTags.includes(x))
282-
if (groupingTag === undefined) return null
283-
284-
const groupedHomeworks = homeworks.filter(x => x.tags!.includes(TestTag) && x.tags!.includes(groupingTag))
285-
if (groupedHomeworks.length === 1) return null
286-
287-
const keys = new Set(groupedHomeworks.map(h => h.tasks!.map(t => t.maxRating).join(";")))
288-
if (keys.size === 1) return <Alert severity="success"
289-
action={
290-
<Button
291-
fullWidth
292-
color="inherit"
293-
size="small"
294-
onClick={() => setShowOnlyGroupedTest(groupingTag)}
295-
>
296-
Задания
297-
</Button>}>
298+
const result = validateTestGrouping(homework)
299+
if (result === true) return null
300+
const {hasErrors, groupingTag} = result
301+
if (!hasErrors) return <Alert severity="success"
302+
action={
303+
<Button
304+
fullWidth
305+
color="inherit"
306+
size="small"
307+
onClick={() => setShowOnlyGroupedTest(groupingTag)}
308+
>
309+
Задания
310+
</Button>}>
298311
Работа сгруппирована по ключу '<b>{groupingTag}</b>'.
299312
</Alert>
300313

0 commit comments

Comments
 (0)