@@ -25,7 +25,7 @@ import TimelineOppositeContent from '@mui/lab/TimelineOppositeContent';
2525import { Alert , Card , CardActions , Chip , Paper , Stack , Tooltip } from "@mui/material" ;
2626import { Link } from "react-router-dom" ;
2727import 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" ;
2929import FileInfoConverter from "components/Utils/FileInfoConverter" ;
3030import CourseHomeworkExperimental from "components/Homeworks/CourseHomeworkExperimental" ;
3131import CourseTaskExperimental from "../Tasks/CourseTaskExperimental" ;
@@ -67,6 +67,7 @@ interface ICourseExperimentalState {
6767
6868export 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