@@ -21,7 +21,8 @@ import {IFileInfo} from "components/Files/IFileInfo";
2121import { FC , useEffect , useState } from "react"
2222import Utils from "services/Utils" ;
2323import {
24- HomeworkViewModel , ActionOptions , HomeworkTaskViewModel , PostTaskViewModel , AccountDataDto , GroupViewModel
24+ HomeworkViewModel , ActionOptions , HomeworkTaskViewModel , PostTaskViewModel , AccountDataDto , GroupViewModel ,
25+ WorkspaceViewModel , CourseViewModel
2526} from "@/api" ;
2627import ApiSingleton from "../../api/ApiSingleton" ;
2728import Tags from "../Common/Tags" ;
@@ -43,6 +44,7 @@ import {FilesHandler} from "@/components/Files/FilesHandler";
4344import GroupSelector from "../Common/GroupSelector" ;
4445import GroupIcon from '@mui/icons-material/Group' ;
4546import AssignmentIcon from '@mui/icons-material/Assignment' ;
47+ import { getSelectedCourseView } from "../Courses/MentorWorkspaceUtils" ;
4648
4749export interface HomeworkAndFilesInfo {
4850 homework : HomeworkViewModel & { isModified ?: boolean } ,
@@ -59,6 +61,7 @@ interface IEditHomeworkState {
5961
6062const CourseHomeworkEditor : FC < {
6163 homeworkAndFilesInfo : HomeworkAndFilesInfo ,
64+ mentorId : string ,
6265 getAllHomeworks : ( ) => HomeworkViewModel [ ] ,
6366 onUpdate : ( update : { homework : HomeworkViewModel } & {
6467 isDeleted ?: boolean ,
@@ -69,7 +72,7 @@ const CourseHomeworkEditor: FC<{
6972 previouslyExistingFilesCount : number ,
7073 waitingNewFilesCount : number ,
7174 deletingFilesIds : number [ ] ) => void ;
72- onGroupsUpdate : ( ) => void ;
75+ onGroupsUpdate : ( ) => Promise < void > ;
7376 groups : GroupViewModel [ ] ;
7477} > = ( props ) => {
7578 const homework = props . homeworkAndFilesInfo . homework
@@ -124,19 +127,29 @@ const CourseHomeworkEditor: FC<{
124127 const [ description , setDescription ] = useState < string > ( loadedHomework . description ! )
125128 const [ selectedGroupId , setSelectedGroupId ] = useState ( loadedHomework . groupId )
126129 const [ courseStudents , setCourseStudents ] = useState < AccountDataDto [ ] > ( [ ] )
130+ const [ course , setCourse ] = useState < CourseViewModel | undefined > ( undefined )
131+ const [ mentorWorkspace , setMentorWorkspace ] = useState < WorkspaceViewModel | undefined > ( undefined )
127132 const [ page , setPage ] = useState < "homework" | "group" > ( "homework" )
128133
129134 useEffect ( ( ) => {
130- const loadCourseStudents = async ( ) => {
135+ const loadMentorWorkspace = async ( ) => {
131136 try {
132- const courseData = await ApiSingleton . coursesApi . coursesGetAllCourseData ( courseId )
137+ const [ courseData , mentorWorkspace ] = await Promise . all ( [
138+ ApiSingleton . coursesApi . coursesGetAllCourseData ( courseId ) ,
139+ isNewHomework
140+ ? ApiSingleton . coursesApi . coursesGetMentorWorkspace ( courseId , props . mentorId )
141+ . catch ( ( ) => undefined )
142+ : Promise . resolve ( undefined )
143+ ] ) ;
133144 setCourseStudents ( courseData . course ?. acceptedStudents || [ ] )
145+ setCourse ( courseData . course )
146+ setMentorWorkspace ( mentorWorkspace )
134147 } catch ( error ) {
135- console . error ( 'Failed to load course students :' , error )
148+ console . error ( 'Failed to load course data :' , error )
136149 }
137150 }
138- loadCourseStudents ( )
139- } , [ courseId ] )
151+ loadMentorWorkspace ( )
152+ } , [ courseId , props . mentorId , isNewHomework ] )
140153
141154 const [ hasErrors , setHasErrors ] = useState < boolean > ( false )
142155
@@ -227,6 +240,62 @@ const CourseHomeworkEditor: FC<{
227240 props . onUpdate ( { homework : loadedHomework , isDeleted : true } )
228241 }
229242
243+ const updateMentorFilter = async ( update : {
244+ newGroup ?: GroupViewModel ,
245+ newHomework ?: HomeworkViewModel
246+ } ) => {
247+ if ( ! course || ! mentorWorkspace ) return ;
248+
249+ const { newGroup, newHomework} = update ;
250+ const selectedCourseView = getSelectedCourseView ( course , mentorWorkspace ) ;
251+ let updatedGroups = selectedCourseView . selectedGroups ;
252+ let updatedHomeworks = selectedCourseView . selectedHomeworks ;
253+ let hasChanges = false ;
254+
255+ if ( newGroup ?. id !== undefined &&
256+ selectedCourseView . selectedGroups . length > 0 &&
257+ ! selectedCourseView . selectedGroups . some ( g => g . id === newGroup . id ) ) {
258+ updatedGroups = [ ...selectedCourseView . selectedGroups , newGroup ] ;
259+ hasChanges = true ;
260+ }
261+
262+ if ( newHomework ?. id !== undefined &&
263+ selectedCourseView . selectedHomeworks . length > 0 &&
264+ ! selectedCourseView . selectedHomeworks . some ( h => h . id === newHomework . id ) ) {
265+ updatedHomeworks = [ ...selectedCourseView . selectedHomeworks , newHomework ] ;
266+ hasChanges = true ;
267+ }
268+
269+ setCourse ( prev => prev ? ( {
270+ ...prev ,
271+ groups : newGroup ?. id !== undefined && ! prev . groups ?. some ( g => g . id === newGroup . id )
272+ ? [ ...( prev . groups ?? [ ] ) , newGroup ]
273+ : prev . groups ,
274+ homeworks : newHomework ?. id !== undefined && ! prev . homeworks ?. some ( h => h . id === newHomework . id )
275+ ? [ ...( prev . homeworks ?? [ ] ) , newHomework ]
276+ : prev . homeworks ,
277+ } ) : prev ) ;
278+
279+ if ( ! hasChanges ) return ;
280+
281+ await ApiSingleton . coursesApi . coursesEditMentorWorkspace (
282+ courseId ,
283+ props . mentorId ,
284+ {
285+ homeworkIds : updatedHomeworks . map ( h => h . id ) . filter ( ( id ) : id is number => id !== undefined ) ,
286+ studentIds : selectedCourseView . selectedStudents . map ( s => s . userId ) . filter ( ( id ) : id is string => id !== undefined ) ,
287+ groupIds : updatedGroups . map ( g => g . id ) . filter ( ( id ) : id is number => id !== undefined ) ,
288+ }
289+ ) ;
290+
291+ setMentorWorkspace ( prev => prev ? ( {
292+ ...prev ,
293+ homeworks : updatedHomeworks ,
294+ students : selectedCourseView . selectedStudents ,
295+ groups : updatedGroups
296+ } ) : prev ) ;
297+ }
298+
230299 const getDeleteMessage = ( homeworkName : string , filesInfo : IFileInfo [ ] ) => {
231300 let message = `Вы точно хотите удалить задание "${ homeworkName } "?` ;
232301 if ( filesInfo . length > 0 ) {
@@ -268,6 +337,10 @@ const CourseHomeworkEditor: FC<{
268337 ? await ApiSingleton . homeworksApi . homeworksAddHomework ( courseId ! , update )
269338 : await ApiSingleton . homeworksApi . homeworksUpdateHomework ( + homeworkId ! , update )
270339
340+ if ( isNewHomework && updatedHomework . value ) {
341+ await updateMentorFilter ( { newHomework : updatedHomework . value } ) ;
342+ }
343+
271344 const updatedHomeworkId = updatedHomework . value ! . id !
272345 await handleFilesChange (
273346 courseId , CourseUnitType . Homework , updatedHomeworkId ,
@@ -430,7 +503,8 @@ const CourseHomeworkEditor: FC<{
430503 selectedGroupId = { selectedGroupId }
431504 choiceDisabled = { ! isNewHomework }
432505 onGroupsUpdate = { props . onGroupsUpdate }
433- groups = { props . groups }
506+ onCreateNewGroup = { ( newGroup : GroupViewModel ) => updateMentorFilter ( { newGroup} ) }
507+ groups = { mentorWorkspace ?. groups ?? props . groups }
434508 />
435509 </ CardContent >
436510 { ! isNewHomework && ! isPublished &&
@@ -458,6 +532,7 @@ const CourseHomeworkExperimental: FC<{
458532 homeworkAndFilesInfo : HomeworkAndFilesInfo ,
459533 getAllHomeworks : ( ) => HomeworkViewModel [ ] ,
460534 isMentor : boolean ,
535+ userId : string ,
461536 initialEditMode : boolean ,
462537 onMount : ( ) => void ,
463538 onUpdate : ( x : { homework : HomeworkViewModel } & {
@@ -470,7 +545,7 @@ const CourseHomeworkExperimental: FC<{
470545 previouslyExistingFilesCount : number ,
471546 waitingNewFilesCount : number ,
472547 deletingFilesIds : number [ ] ) => void ;
473- onGroupsUpdate : ( ) => void ;
548+ onGroupsUpdate : ( ) => Promise < void > ;
474549 groups : GroupViewModel [ ] ;
475550} > = ( props ) => {
476551 const { homework, filesInfo} = props . homeworkAndFilesInfo
@@ -488,6 +563,7 @@ const CourseHomeworkExperimental: FC<{
488563 if ( editMode ) return < CourseHomeworkEditor
489564 getAllHomeworks = { props . getAllHomeworks }
490565 homeworkAndFilesInfo = { { homework, filesInfo} }
566+ mentorId = { props . userId }
491567 onUpdate = { update => {
492568 if ( update . isSaved ) setEditMode ( false )
493569 props . onUpdate ( update )
@@ -569,4 +645,4 @@ const CourseHomeworkExperimental: FC<{
569645 }
570646 </ CardContent >
571647}
572- export default CourseHomeworkExperimental ;
648+ export default CourseHomeworkExperimental ;
0 commit comments