11import React , { FC , useEffect , useState } from 'react' ;
2- import { HomeworkViewModel , AccountDataDto } from '../../api' ;
2+ import { HomeworkViewModel , AccountDataDto , MentorToAssignedStudentsDTO } from '../../api' ;
33import Grid from "@material-ui/core/Grid" ;
4- import { Autocomplete } from "@mui/material" ;
4+ import { Autocomplete , Chip } from "@mui/material" ;
55import TextField from "@material-ui/core/TextField" ;
66import ApiSingleton from "../../api/ApiSingleton" ;
77import ErrorsHandler from "../Utils/ErrorsHandler" ;
@@ -22,6 +22,8 @@ interface ICourseFilterState {
2222 courseStudents : AccountDataDto [ ] ;
2323 selectedHomeworks : HomeworkViewModel [ ] ;
2424 selectedStudents : AccountDataDto [ ] ;
25+ mentors : AccountDataDto [ ] ;
26+ assignedStudents : MentorToAssignedStudentsDTO [ ]
2527}
2628
2729// Если преподаватель не выбрал ни одного студента, по умолчанию регистрируем всех. Аналогично с выбором домашних работ
@@ -30,7 +32,9 @@ const CourseFilter: FC<ICourseFilterProps> = (props) => {
3032 courseHomeworks : [ ] ,
3133 courseStudents : [ ] ,
3234 selectedHomeworks : [ ] ,
33- selectedStudents : [ ]
35+ selectedStudents : [ ] ,
36+ assignedStudents : [ ] ,
37+ mentors : [ ]
3438 } ) ;
3539
3640 // Состояние для отображения элемента загрузки
@@ -39,35 +43,36 @@ const CourseFilter: FC<ICourseFilterProps> = (props) => {
3943 // Состояние для отображения поля выбора студентов
4044 const [ isStudentsSelectionHidden , setIsStudentsSelectionHidden ] = useState < boolean > ( props . isStudentsSelectionHidden ) ;
4145
42- // Если у преподавателя в workspace все студенты, отображаем "Все" в компоненте, значений при этом не выбрано.
43- // Функция, необходимые для корректного отображения выбранных элементов.
44- function getItemsView < T > ( selected : T [ ] , all : T [ ] ) : T [ ] {
45- return selected . length === all . length ? [ ] : selected ;
46- }
47-
4846 useEffect ( ( ) => {
4947 const fetchCourseDataForMentor = async ( ) => {
5048 try {
51- const courseViewModel = await ApiSingleton . coursesApi . coursesGetAllCourseData ( props . courseId ) ;
49+ const {
50+ course,
51+ assignedStudents
52+ } = await ApiSingleton . coursesApi . coursesGetAllCourseData ( props . courseId ) ;
53+ if ( course === undefined || assignedStudents === undefined ) return
54+
5255 const mentorWorkspace =
5356 await ApiSingleton . coursesApi . coursesGetMentorWorkspace ( props . courseId , props . mentorId ) ;
5457
5558 props . onSelectedStudentsChange ( mentorWorkspace . students ?? [ ] )
5659 props . onSelectedHomeworksChange ( mentorWorkspace . homeworks ?? [ ] )
5760
5861 // Для корректного отображения "Все" при инцициализации (получении данных с бэкенда)
59- const allCourseStudentsCount = ( courseViewModel . acceptedStudents ?. length ?? 0 ) + ( courseViewModel . newStudents ?. length ?? 0 ) ;
62+ const allCourseStudentsCount = ( course . acceptedStudents ?. length ?? 0 ) + ( course . newStudents ?. length ?? 0 ) ;
6063 const initSelectedStudentsView = mentorWorkspace . students ?. length === allCourseStudentsCount ?
6164 [ ] : ( mentorWorkspace . students ) ?? [ ] ;
62- const initSelectedHomeworksView = mentorWorkspace . homeworks ?. length === courseViewModel . homeworks ?. length ?
65+ const initSelectedHomeworksView = mentorWorkspace . homeworks ?. length === course . homeworks ?. length ?
6366 [ ] : ( mentorWorkspace . homeworks ?? [ ] ) ;
6467
6568 setState ( prevState => ( {
6669 ...prevState ,
67- courseHomeworks : courseViewModel . homeworks ?? [ ] ,
68- courseStudents : courseViewModel . acceptedStudents ?? [ ] ,
70+ courseHomeworks : course . homeworks ?? [ ] ,
71+ courseStudents : course . acceptedStudents ?? [ ] ,
6972 selectedStudents : initSelectedStudentsView ,
7073 selectedHomeworks : initSelectedHomeworksView ,
74+ mentors : course . mentors ! ,
75+ assignedStudents : assignedStudents . filter ( x => x . mentorId !== props . mentorId )
7176 } ) )
7277
7378 setIsLoading ( false ) ;
@@ -94,6 +99,14 @@ const CourseFilter: FC<ICourseFilterProps> = (props) => {
9499 props . onSelectedHomeworksChange ( state . selectedHomeworks )
95100 } , [ state . selectedHomeworks ] ) ;
96101
102+ //TODO: memoize?
103+ const getAssignedMentors = ( studentId : string ) =>
104+ state . assignedStudents
105+ . filter ( x => x . selectedStudentsIds ! . includes ( studentId ) )
106+ . map ( x => state . mentors . find ( m => m . userId === x . mentorId ) )
107+ . filter ( x => x !== undefined )
108+ . map ( x => x . name + ' ' + x . surname )
109+
97110 return (
98111 < div >
99112 { isLoading ? (
@@ -150,7 +163,11 @@ const CourseFilter: FC<ICourseFilterProps> = (props) => {
150163 multiple
151164 fullWidth
152165 options = { state . courseStudents }
153- getOptionLabel = { ( option : AccountDataDto ) => option . surname + ' ' + option . name }
166+ getOptionLabel = { ( option : AccountDataDto ) => {
167+ const assignedMentors = getAssignedMentors ( option . userId ! )
168+ const suffix = assignedMentors . length > 0 ? " (преподаватель " + assignedMentors [ 0 ] + ")" : ""
169+ return option . surname + ' ' + option . name + suffix ;
170+ } }
154171 getOptionKey = { ( option : AccountDataDto ) => option . userId ?? "" }
155172 filterSelectedOptions
156173 isOptionEqualToValue = { ( option , value ) => option . userId === value . userId }
@@ -161,7 +178,19 @@ const CourseFilter: FC<ICourseFilterProps> = (props) => {
161178 label = { state . selectedStudents . length === 0 ? "" : `Студенты (${ state . selectedStudents . length } )` }
162179 placeholder = { state . selectedStudents . length === 0 ? "Все студенты" : "" }
163180 /> ) }
164- noOptionsText = { 'На курсе больше нет студентов' }
181+ renderTags = { ( value , getTagProps ) =>
182+ value . map ( ( option , index ) => {
183+ const hasAssignedStudents = getAssignedMentors ( option . userId ! ) . length > 0
184+ return (
185+ < Chip
186+ label = { option . surname + ' ' + option . name }
187+ { ...getTagProps ( { index} ) }
188+ color = { hasAssignedStudents ? "info" : "default" }
189+ />
190+ ) ;
191+ } )
192+ }
193+ noOptionsText = { 'На курсе нет студентов' }
165194 value = { state . selectedStudents }
166195 onChange = { ( _ , values ) => {
167196 setState ( ( prevState ) => ( {
0 commit comments