1
1
import { Edit , OpenInNew } from '@mui/icons-material'
2
- import { Alert , Box , Button , Checkbox , Container , FormControlLabel , Input , Modal , Paper , Skeleton , Tab , Tooltip , Typography } from '@mui/material'
2
+ import { Alert , Box , Button , Checkbox , Container , FormControlLabel , Input , Modal , Paper , Skeleton , Stack , Tab , TextField , Tooltip , Typography } from '@mui/material'
3
3
import { enqueueSnackbar } from 'notistack'
4
- import { useState } from 'react'
4
+ import { useEffect , useState } from 'react'
5
5
import { useTranslation } from 'react-i18next'
6
- import { Link , Route , Routes , useParams } from 'react-router-dom'
6
+ import { Form , Link , Route , Routes , useParams } from 'react-router-dom'
7
7
8
8
import { PUBLIC_URL } from '../../../../config'
9
9
import useCourse from '../../../hooks/useCourse'
10
10
import useCurrentUser from '../../../hooks/useCurrentUser'
11
11
import { useCreatePromptMutation , useDeletePromptMutation } from '../../../hooks/usePromptMutation'
12
12
import usePrompts from '../../../hooks/usePrompts'
13
- import type { Message as MessageType } from '../../../types'
13
+ import type { Message as MessageType , Responsebility } from '../../../types'
14
14
import Conversation from '../../Chat/Conversation'
15
15
import SystemMessage from '../../Chat/SystemMessage'
16
16
import Rag from '../../Rag/Rag'
@@ -21,23 +21,30 @@ import Stats from './Stats'
21
21
import { RouterTabs } from '../../common/RouterTabs'
22
22
import Discussion from './Discussions'
23
23
import { ApiErrorView } from '../../common/ApiErrorView'
24
+ import apiClient from '../../../util/apiClient'
25
+ import { t } from 'i18next'
24
26
25
27
const Course = ( ) => {
26
28
const [ showTeachers , setShowTeachers ] = useState ( false )
27
29
28
30
const [ activityPeriodFormOpen , setActivityPeriodFormOpen ] = useState ( false )
29
-
31
+ const [ responsibilities , setResponsibilities ] = useState < Responsebility [ ] > ( [ ] )
30
32
const { id } = useParams ( ) as { id : string }
31
33
const { t, i18n } = useTranslation ( )
32
34
33
35
const { language } = i18n
34
36
35
37
const { user, isLoading : userLoading } = useCurrentUser ( )
36
-
37
- const { data : course , isSuccess : isCourseSuccess , error } = useCourse ( id )
38
+ const { data : course , isSuccess : isCourseSuccess , error , refetch : refetchCourse } = useCourse ( id )
39
+ console . log ( course )
38
40
if ( error ) {
39
41
return < ApiErrorView error = { error } />
40
42
}
43
+ useEffect ( ( ) => {
44
+ if ( isCourseSuccess ) {
45
+ setResponsibilities ( course ?. responsibilities )
46
+ }
47
+ } , [ isCourseSuccess ] )
41
48
42
49
if ( userLoading || ! user || ! isCourseSuccess ) return null
43
50
@@ -97,7 +104,24 @@ const Course = () => {
97
104
boxSizing : 'borderBox' ,
98
105
height : '40px' ,
99
106
}
107
+ const handleAddResponsible = async ( e ) => {
108
+ e . preventDefault ( )
109
+ const username = e . target . username . value
110
+ const result = await apiClient . post ( `/courses/${ course . id } /responsibilities/assign` , { username : username } )
111
+ if ( result . status === 200 ) {
112
+ const responsibility = result . data
113
+ setResponsibilities ( [ ...responsibilities , responsibility ] )
114
+ refetchCourse ( )
115
+ }
100
116
117
+ }
118
+ const handleRemoveResponsibility = async ( responsibility ) => {
119
+ const result = await apiClient . post ( `/courses/${ course . id } /responsibilities/remove` , { username : responsibility . user ?. username } )
120
+ if ( result . status === 200 ) {
121
+ const filteredResponsibilities = responsibilities . filter ( ( r ) => r . id !== responsibility . id )
122
+ setResponsibilities ( filteredResponsibilities )
123
+ }
124
+ }
101
125
return (
102
126
< Container sx = { { mt : '4rem' , mb : '10rem' } } maxWidth = "xl" >
103
127
< Alert severity = { getInfoSeverity ( ) } >
@@ -182,13 +206,20 @@ const Course = () => {
182
206
{ showTeachers ? t ( 'admin:hideTeachers' ) : t ( 'admin:showTeachers' ) }
183
207
</ Button >
184
208
{ showTeachers && (
185
- < ul >
186
- { course . responsibilities . map ( ( responsibility ) => (
187
- < li key = { responsibility . id } >
188
- { responsibility . user . last_name } { responsibility . user . first_names }
189
- </ li >
190
- ) ) }
191
- </ ul >
209
+ < Box >
210
+ < Form onSubmit = { handleAddResponsible } >
211
+ < TextField name = "username" placeholder = { 'käyttäjänimi: ' } > </ TextField >
212
+ < Button type = { 'submit' } > Lisää</ Button >
213
+ </ Form >
214
+ < Stack sx = { { margin : 1 , padding : 1 , borderColor : 'gray' , borderWidth : 1 , borderStyle : 'solid' } } >
215
+ { responsibilities . map ( ( responsibility ) => (
216
+ < Box key = { responsibility . id } sx = { { display : 'flex' , alignItems : 'center' , padding : 1 } } >
217
+ < Typography > { responsibility . user . last_name } { responsibility . user . first_names } </ Typography >
218
+ < AssignedResponsibilityManagement handleRemove = { ( ) => { handleRemoveResponsibility ( responsibility ) } } responsibility = { responsibility } />
219
+ </ Box >
220
+ ) ) }
221
+ </ Stack >
222
+ </ Box >
192
223
) }
193
224
</ >
194
225
) }
@@ -218,6 +249,21 @@ const Course = () => {
218
249
)
219
250
}
220
251
252
+ const AssignedResponsibilityManagement = ( { responsibility, handleRemove} ) => {
253
+ const { t, i18n } = useTranslation ( )
254
+ if ( ! responsibility . createdByUserId ) {
255
+ return (
256
+ < Stack direction = { 'row' } sx = { { marginLeft : 'auto' , alignItems : 'center' , height : '1rem' } } >
257
+ </ Stack >
258
+ ) }
259
+ return (
260
+ < Stack direction = { 'row' } sx = { { marginLeft : 'auto' , alignItems : 'center' , height : '1rem' } } >
261
+ < Typography > { t ( 'course:customResponsibility' ) } </ Typography >
262
+ < Button onClick = { handleRemove } > { t ( 'course:remove' ) } </ Button >
263
+ </ Stack >
264
+ )
265
+ }
266
+
221
267
const Prompts = ( { courseId } : { courseId : string } ) => {
222
268
const { t } = useTranslation ( )
223
269
const [ name , setName ] = useState ( '' )
0 commit comments