{param.type === 'number' && (
diff --git a/frontend/frontend/src/pages/addChangeAssignmentPage/RestrictionsDialog.tsx b/frontend/frontend/src/pages/addChangeAssignmentPage/RestrictionsDialog.tsx
index 7a719850..67a5d2ff 100644
--- a/frontend/frontend/src/pages/addChangeAssignmentPage/RestrictionsDialog.tsx
+++ b/frontend/frontend/src/pages/addChangeAssignmentPage/RestrictionsDialog.tsx
@@ -11,20 +11,24 @@ import Toolbar from '@mui/material/Toolbar'
import IconButton from '@mui/material/IconButton'
import Typography from '@mui/material/Typography'
import CloseIcon from '@mui/icons-material/Close'
+import CodeIcon from '@mui/icons-material/Code'
import {
+ Alert,
Box,
- ButtonGroup,
+ Collapse,
FormControl,
MenuItem,
Select,
+ Stack,
TextField,
+ Tooltip,
} from '@mui/material'
import { t } from 'i18next'
import { restriction } from './AddChangeAssignmentPage.tsx'
-import Switch from '@mui/material/Switch'
import WarningPopup from '../../components/WarningPopup.tsx'
import RestrictionsTemplateUI from './RestrictionTemplateUI.tsx'
import instance from '../../axiosConfig.ts'
+import BorderColorIcon from '@mui/icons-material/BorderColor'
interface RestrictionsDialogProps {
userid: number
@@ -44,7 +48,7 @@ export interface Template {
bestand: string
}
-const code = `
+/*const code = `
#@param
# Schrijf in dit veld je voornaam.
@@ -65,7 +69,7 @@ bestanden=["main.py", "test.py"]
# de constante pi, nodig voor wanneer we de omtrek berekenen van het object dat de student indient.
pi=3.14159
-#code...`
+#code...`*/
/**
* Dialog component for managing restrictions related to file uploads.
@@ -81,7 +85,7 @@ export default function RestrictionsDialog({
}: RestrictionsDialogProps) {
const [openTextEditor, setOpenTextEditor] = useState(false)
const [openTemplateInterface, setOpenTemplateInterface] = useState(false)
- const [openTemplateInUI, setOpenTemplateInUI] = useState(false)
+ const [code, setCode] = useState('' /*code*/) // code is currently not used
const [textFieldContent, setTextFieldContent] = useState('')
const [restrictionName, setRestrictionName] = useState('')
const [restrictionType, setRestrictionType] =
@@ -90,6 +94,8 @@ export default function RestrictionsDialog({
const [popupOpen, setPopupOpen] = useState(false)
const [myTemplates, setMyTemplates] = useState
([])
+ const [saveAlert, setSaveAlert] = useState(false)
+ const [saveErrorAlert, setSaveErrorAlert] = useState(false)
// function to handle the uploaded files and send them to the parent component
const handleUploadedFiles = (e: ChangeEvent) => {
const files = e.target.files
@@ -161,8 +167,18 @@ export default function RestrictionsDialog({
formdata.append('user', userid.toString())
formdata.append('bestand', file)
- await instance.post(`/templates/`, formdata, config)
+ const result = await instance.post(`/templates/`, formdata, config)
+ if (result.status === 201) {
+ setSaveAlert(true) // Show the alert
+ setTimeout(() => {
+ setSaveAlert(false) // Hide the alert after 5 seconds
+ }, 4000)
+ }
} catch (error) {
+ setSaveErrorAlert(true)
+ setTimeout(() => {
+ setSaveErrorAlert(false)
+ }, 4000)
console.error('Error updating data:', error)
}
}
@@ -256,43 +272,131 @@ export default function RestrictionsDialog({
}}
>
{/* This button groups shows the templates the teacher has made */}
-
+
{myTemplates.map((template) => (
-
+
+
+
+
+
+ {
+ const response = await instance.get(
+ `/templates/${template.template_id}/template/?content=true`
+ )
+ // This textFieldContent will be used when a template is opened in textmode
+ setTextFieldContent(
+ response.data.content
+ )
+
+ // The code will be used when a template is opened in the UI
+ setCode(response.data.content)
+
+ const templatename =
+ template.bestand
+ .replace(/^.*[\\/]/, '')
+ .split('.')[0]
+ const templateextension =
+ '.' +
+ template.bestand.split('.')[1]
+ setRestrictionName(templatename)
+ setRestrictionType(
+ templateextension as restrictionExtension
+ )
+ handleClickOpenTemplateInterface()
+ }}
+ >
+
+
+
+
+ {
+ const response = await instance.get(
+ `/templates/${template.template_id}/template/?content=true`
+ )
+ // This textFieldContent will be used when a template is opened in textmode
+ setTextFieldContent(
+ response.data.content
+ )
+
+ // The code will be used when a template is opened in the UI
+ setCode(response.data.content)
+
+ const templatename =
+ template.bestand
+ .replace(/^.*[\\/]/, '')
+ .split('.')[0]
+ const templateextension =
+ '.' +
+ template.bestand.split('.')[1]
+ setRestrictionName(templatename)
+ setRestrictionType(
+ templateextension as restrictionExtension
+ )
+ handleClickOpenTextEditor()
+ }}
+ >
+
+
+
+
))}
-
+
-
- {/* This box will contain the templates */}
-
- {t('open_with_ui') + ':'}
-
- setOpenTemplateInUI(!openTemplateInUI)}
- />
-
{/* This is the template interface. */}
@@ -473,6 +577,43 @@ export default function RestrictionsDialog({
+
+ {saveAlert && (
+
+
+ {t('template_saved_successfully')}
+
+
+ )}
+
+ {saveErrorAlert && (
+
+
+ {t('error') + ' ' + t('try_again')}
+
+
+ )}
+
()
const [submit, setSubmit] = useState(false)
const [students, setStudents] = useState([])
+ const [lastSubmission, setLastSubmission] = useState()
+ const [score, setScore] = useState()
//state for loading the page
const [loading, setLoading] = useState(true)
@@ -210,6 +220,25 @@ export function AssignmentPage() {
}
}, [user, assignment, groups, assignmentId])
+ useEffect(() => {
+ async function fetchScore() {
+ if (submissions) {
+ setLastSubmission(submissions[submissions.length - 1])
+ if (lastSubmission) {
+ const scoreResponse = await instance.get(
+ `/scores/?indiening=${lastSubmission.indiening_id}`
+ )
+ setScore(scoreResponse.data[scoreResponse.data.length - 1])
+ console.log('scoreresponse', scoreResponse.data)
+ console.log('score', score?.score)
+ }
+ }
+ }
+ fetchScore().catch((error) =>
+ console.error('Error fetching score', error)
+ )
+ }, [submissions])
+
// Function to download all submissions as a zip file
const downloadAllSubmissions = () => {
const zip = new JSZip()
@@ -372,7 +401,7 @@ export function AssignmentPage() {
- {assignment && assignment.deadline
+ {assignment &&
+ assignment.deadline
? dayjs(
- assignment.deadline
- ).format(
- 'DD/MM/YYYY HH:mm'
- )
+ assignment.deadline
+ ).format(
+ 'DD/MM/YYYY HH:mm'
+ )
: t('no_deadline')}
)}
@@ -478,7 +517,23 @@ export function AssignmentPage() {
) : (
{assignment
? dayjs(
@@ -493,7 +548,7 @@ export function AssignmentPage() {
)}
{/* Assignment description */}
-
+
+
@@ -758,15 +813,25 @@ export function AssignmentPage() {
- {assignment && assignment.deadline
+ {assignment &&
+ assignment.deadline
? dayjs(
- assignment.deadline
- ).format(
- 'DD/MM/YYYY HH:mm'
- )
+ assignment.deadline
+ ).format(
+ 'DD/MM/YYYY HH:mm'
+ )
: t('no_deadline')}
)}
@@ -828,7 +893,10 @@ export function AssignmentPage() {
: students
}
text="group_members"
- noGroup={students.length == 0}
+ noGroup={
+ students.length ==
+ 0
+ }
/>
>
)}
@@ -863,7 +931,23 @@ export function AssignmentPage() {
) : (
{assignment
? dayjs(
@@ -928,9 +1012,48 @@ export function AssignmentPage() {
)}
+
+
+ Score:
+
+ {submissions.length > 0 ? (
+
+ {score
+ ? `${score.score}/${assignment?.max_score} (${(100 * score.score) / Number(assignment?.max_score)}%)`
+ : t('no_score_yet')}
+
+ ) : (
+
+ {t('no_score_yet')}
+
+ )}
+
{/* Assignment */}
-
+
{/* Submissions */}
-
+
-
-
-
-
-
-
-
+
+
+
+
+
-
- {t('submit')}
-
-
-
-
-
+
+
+
+ {t('submit')}
+
+
+
+
+
+ >
+ ) : null}
- setOpenNoGroup(false)}
- doAction={handleNoGroupError}
- />
+ {assignment?.student_groep ? (
+ setOpenNoGroup(false)}
+ doAction={handleNoGroupError}
+ />
+ ) : (
+
+ )}
>
)}
>
diff --git a/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx b/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx
index 9281189b..84711667 100644
--- a/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx
+++ b/frontend/frontend/src/pages/groupsPage/ChooseGroup.tsx
@@ -44,6 +44,7 @@ export interface Assignment {
function joinLeaveButton(
isin: boolean,
+ disabled: boolean,
handleJoin: () => void,
handleLeave: () => void
) {
@@ -56,6 +57,13 @@ function joinLeaveButton(
>
)
}
+ if (disabled){
+ return (
+ <>
+ {t('group_full')}
+ >
+ )
+ }
return (
<>
@@ -948,29 +948,38 @@ export function GroupsPage() {
/>
) : (
<>
-
-
-
+ type={'submit'}
+ sx={{
+ backgroundColor:
+ 'primary.main',
+ borderRadius: 2,
+ color: 'background.default',
+ '&:hover': {
+ backgroundColor:
+ 'secondary.main',
+ color: 'text.primary',
+ },
+ }}
+ >
+
+
+
>
)}
diff --git a/frontend/frontend/src/pages/mainPage/CoursesView.tsx b/frontend/frontend/src/pages/mainPage/CoursesView.tsx
index cbf24c91..dcf17360 100644
--- a/frontend/frontend/src/pages/mainPage/CoursesView.tsx
+++ b/frontend/frontend/src/pages/mainPage/CoursesView.tsx
@@ -1,4 +1,4 @@
-import { IconButton, Stack } from '@mui/material'
+import { IconButton, Stack, Tooltip } from '@mui/material'
import { CourseCard } from '../../components/CourseCard.tsx'
import AddIcon from '@mui/icons-material/Add'
import { useNavigate } from 'react-router-dom'
@@ -27,7 +27,7 @@ export function CoursesView({
<>
{/* Teachers get an extra button to add courses. */}
- navigate('/course/new')}
- >
-
-
+
+ navigate('/course/new')}
+ >
+
+
+
)}
diff --git a/frontend/frontend/src/pages/mainPage/MainPage.tsx b/frontend/frontend/src/pages/mainPage/MainPage.tsx
index b71a6a90..cb8ef679 100644
--- a/frontend/frontend/src/pages/mainPage/MainPage.tsx
+++ b/frontend/frontend/src/pages/mainPage/MainPage.tsx
@@ -137,6 +137,12 @@ export default function MainPage() {
}
const doArchive = async () => {
console.log('Archive clicked')
+ const newCourses = courses.map((course) =>
+ course.vak_id == archiveCourseId
+ ? archiveSingleCourse(course)
+ : course
+ )
+ setCourses(newCourses)
try {
await instance.patch(`/vakken/${archiveCourseId}/`, {
gearchiveerd: true,
@@ -191,139 +197,151 @@ export default function MainPage() {
{/* Two tabs to select either the current or archived courses,
CoursesView is a scroll-box with the current courses,
ArchivedView is the same but for the archived courses. */}
-
- {[...Array(3)].map((_, index) => (
-
- ))}
- ,
-
- {[...Array(3)].map((_, index) => (
-
- ))}
- ,
- ]
- : [
-
- !course.gearchiveerd &&
- course.jaartal ===
- selectedYear
- )
- .sort((a: Course, b: Course) => {
- if (
- courseOrder.includes(
- a.vak_id
- )
- ) {
- if (
- courseOrder.includes(
- b.vak_id
- )
- ) {
- return (
- courseOrder.indexOf(
+
+
+ {[...Array(3)].map((_, index) => (
+
+ ))}
+ ,
+
+ {[...Array(3)].map((_, index) => (
+
+ ))}
+ ,
+ ]
+ : [
+
+ !course.gearchiveerd &&
+ course.jaartal ===
+ selectedYear
+ )
+ .sort(
+ (
+ a: Course,
+ b: Course
+ ) => {
+ if (
+ courseOrder.includes(
a.vak_id
- ) -
- courseOrder.indexOf(
- b.vak_id
)
- )
- } else {
- return -1
+ ) {
+ if (
+ courseOrder.includes(
+ b.vak_id
+ )
+ ) {
+ return (
+ courseOrder.indexOf(
+ a.vak_id
+ ) -
+ courseOrder.indexOf(
+ b.vak_id
+ )
+ )
+ } else {
+ return -1
+ }
+ } else {
+ if (
+ courseOrder.includes(
+ b.vak_id
+ )
+ ) {
+ return 1
+ } else {
+ return 0
+ }
+ }
}
- } else {
- if (
- courseOrder.includes(
- b.vak_id
- )
- ) {
- return 1
- } else {
- return 0
- }
- }
- })}
- pinnedCourses={pinnedCourses}
- archiveCourse={archiveCourse}
- pinCourse={pinCourse}
- />,
-
- course.gearchiveerd
- )
- .sort((a: Course, b: Course) => {
- if (
- courseOrder.includes(
- a.vak_id
- )
- ) {
- if (
- courseOrder.includes(
- b.vak_id
- )
- ) {
- return (
- courseOrder.indexOf(
+ )}
+ pinnedCourses={pinnedCourses}
+ archiveCourse={archiveCourse}
+ pinCourse={pinCourse}
+ />,
+
+ course.gearchiveerd &&
+ course.jaartal ===
+ selectedYear
+ )
+ .sort(
+ (
+ a: Course,
+ b: Course
+ ) => {
+ if (
+ courseOrder.includes(
a.vak_id
- ) -
- courseOrder.indexOf(
- b.vak_id
)
- )
- } else {
- return -1
- }
- } else {
- if (
- courseOrder.includes(
- b.vak_id
- )
- ) {
- return 1
- } else {
- return 0
+ ) {
+ if (
+ courseOrder.includes(
+ b.vak_id
+ )
+ ) {
+ return (
+ courseOrder.indexOf(
+ a.vak_id
+ ) -
+ courseOrder.indexOf(
+ b.vak_id
+ )
+ )
+ } else {
+ return -1
+ }
+ } else {
+ if (
+ courseOrder.includes(
+ b.vak_id
+ )
+ ) {
+ return 1
+ } else {
+ return 0
+ }
+ }
}
- }
- })}
- pinnedCourses={pinnedCourses}
- pinCourse={pinCourse}
- />,
- ]
- }
- />
+ )}
+ pinnedCourses={pinnedCourses}
+ pinCourse={pinCourse}
+ />,
+ ]
+ }
+ />
+
{/* Add a calendar to the right of the mainpage. */}
)
}
+
+function archiveSingleCourse(course: Course): Course {
+ return {
+ ...course,
+ gearchiveerd: true,
+ }
+}
diff --git a/frontend/frontend/src/pages/scoresPage/ProjectScoresPage.tsx b/frontend/frontend/src/pages/scoresPage/ProjectScoresPage.tsx
index 40266ac2..5a626735 100644
--- a/frontend/frontend/src/pages/scoresPage/ProjectScoresPage.tsx
+++ b/frontend/frontend/src/pages/scoresPage/ProjectScoresPage.tsx
@@ -7,6 +7,7 @@ import {
Skeleton,
Stack,
styled,
+ Tooltip,
} from '@mui/material'
import { useNavigate, useParams } from 'react-router-dom'
import { StudentsView } from './StudentsView.tsx'
@@ -412,39 +413,47 @@ export function ProjectScoresPage() {
/>
) : (
<>
-
- setOpenSaveScoresPopup(
- true
- )
- }
- sx={{
- color: 'background.default',
- '&:hover': {
- color: 'text.primary',
- },
- backgroundColor:
- 'primary.main',
- borderRadius: 2,
- }}
+
-
-
+
+ setOpenSaveScoresPopup(
+ true
+ )
+ }
+ sx={{
+ color: 'background.default',
+ '&:hover': {
+ color: 'text.primary',
+ },
+ backgroundColor:
+ 'primary.main',
+ borderRadius: 2,
+ }}
+ >
+
+
+
>
)}
-
- setOpenDeleteScoresPopup(true)
- }
- sx={{
- backgroundColor:
- 'secondary.main',
- borderRadius: 2,
- }}
- >
-
-
+
+
+ setOpenDeleteScoresPopup(
+ true
+ )
+ }
+ sx={{
+ backgroundColor:
+ 'secondary.main',
+ borderRadius: 2,
+ }}
+ >
+
+
+
{/* Popup for confirming saving scores */}
diff --git a/frontend/frontend/src/pages/subjectsPage/AddChangeSubjectPage.tsx b/frontend/frontend/src/pages/subjectsPage/AddChangeSubjectPage.tsx
index 52ae6366..6707b6c8 100644
--- a/frontend/frontend/src/pages/subjectsPage/AddChangeSubjectPage.tsx
+++ b/frontend/frontend/src/pages/subjectsPage/AddChangeSubjectPage.tsx
@@ -15,6 +15,7 @@ import {
Skeleton,
Stack,
TextField,
+ Tooltip,
Typography,
} from '@mui/material'
import { Header } from '../../components/Header'
@@ -28,6 +29,7 @@ import ClearIcon from '@mui/icons-material/Clear'
import Dialog from '@mui/material/Dialog'
import instance from '../../axiosConfig.ts'
import Papa, { ParseResult } from 'papaparse'
+import WarningPopup from '../../components/WarningPopup.tsx'
export interface User {
user: number
@@ -37,6 +39,10 @@ export interface User {
email: string
}
+interface errorChecks {
+ title: boolean
+}
+
// This function takes a list of users and will render it.
// It can be used for both the teachers and the students.
function UserList(
@@ -248,6 +254,31 @@ export function AddChangeSubjectPage() {
const [loading, setLoading] = useState(false)
const [userLoading, setUserLoading] = useState(true)
+ const [saveConfirmation, setSaveConfirmation] = useState(false)
+ const [cancelConfirmation, setCancelConfirmation] = useState(false)
+
+ const [assignmentErrors, setAssignmentErrors] = useState({
+ title: false,
+ })
+
+ const handleSubmit = () => {
+ setAssignmentErrors({
+ title: title === '',
+ })
+ if (title === '') {
+ return
+ }
+ setSaveConfirmation(true)
+ }
+
+ const closeSaveConfirmation = () => {
+ setSaveConfirmation(false)
+ }
+
+ const closeCancel = () => {
+ setCancelConfirmation(false)
+ }
+
const handleCloseStudent = (): void => {
setOpenStudent(false)
}
@@ -281,7 +312,7 @@ export function AddChangeSubjectPage() {
handleUploadStudent()
if (studentRef.current) {
- studentRef.current.value = '';
+ studentRef.current.value = ''
setEmailStudent('')
}
}
@@ -373,7 +404,7 @@ export function AddChangeSubjectPage() {
handleUploadTeacher()
if (teacherRef.current) {
- teacherRef.current.value = '';
+ teacherRef.current.value = ''
setEmailTeacher('')
}
}
@@ -440,7 +471,7 @@ export function AddChangeSubjectPage() {
let found = false
const id = userData.user
if (userData.is_lesgever != isLesgever) {
- if (userData.is_lesgever){
+ if (userData.is_lesgever) {
alert(t('cant_add_teachers_to_student_list'))
} else {
alert(t('cant_add_students_to_teacher_list'))
@@ -472,6 +503,7 @@ export function AddChangeSubjectPage() {
})
.then((res) => {
setVakID(res.data.vak_id)
+ navigate(`/course/${res.data.vak_id}`)
})
.catch((err) => {
console.log(err)
@@ -487,9 +519,14 @@ export function AddChangeSubjectPage() {
console.log(err)
alert(err.response.data)
})
+ navigate(`/course/${vakID}`)
}
}
+ const handleCancel = (): void => {
+ navigate('/')
+ }
+
useEffect(() => {
async function fetchUser() {
setUserLoading(true)
@@ -640,7 +677,17 @@ export function AddChangeSubjectPage() {
setTitle(
event.target.value
@@ -656,21 +703,27 @@ export function AddChangeSubjectPage() {
flexDirection={'row'}
gap={2}
>
-
- navigate(`/course/${vakID}`)
- }
- >
- {t('cancel')}
-
-
-
+
+
+ setCancelConfirmation(
+ true
+ )
+ }
+ >
+ {t('cancel')}
+
+
+
+
+
+
@@ -714,14 +767,14 @@ export function AddChangeSubjectPage() {
setEmailStudent,
handleAddStudent,
t('upload_students'),
- studentRef,
+ studentRef
)}
{DialogWindow(
handleCloseStudent,
openStudent,
handleRemoveStudent,
- t('delete_student'),
+ t('delete_student')
)}
@@ -765,7 +818,7 @@ export function AddChangeSubjectPage() {
setEmailTeacher,
handleAddTeacher,
t('upload_teachers'),
- teacherRef,
+ teacherRef
)}
{DialogWindow(
@@ -778,6 +831,24 @@ export function AddChangeSubjectPage() {
+ {/* Confirmation popup for saving course */}
+
+ {/* Confirmation popup for canceling changes*/}
+
>
) : (
diff --git a/frontend/frontend/src/pages/subjectsPage/AssignmentListItemSubjectsPage.tsx b/frontend/frontend/src/pages/subjectsPage/AssignmentListItemSubjectsPage.tsx
index 11fd7e66..e39e2785 100644
--- a/frontend/frontend/src/pages/subjectsPage/AssignmentListItemSubjectsPage.tsx
+++ b/frontend/frontend/src/pages/subjectsPage/AssignmentListItemSubjectsPage.tsx
@@ -3,6 +3,7 @@ import {
ListItem,
ListItemButton,
ListItemText,
+ Tooltip,
} from '@mui/material'
import { useNavigate } from 'react-router-dom'
import { t } from 'i18next'
@@ -198,43 +199,50 @@ function ButtonActions({
return (
- {visible ? (
- handleIconClick(e, 'visible')}
- edge="end"
- aria-label="visible"
- >
-
-
- ) : (
- handleIconClick(e, 'visible')}
- edge="end"
- aria-label="not-visible"
- >
-
-
- )}
+
+ {visible ? (
+ handleIconClick(e, 'visible')}
+ edge="end"
+ aria-label="visible"
+ >
+
+
+ ) : (
+ handleIconClick(e, 'visible')}
+ edge="end"
+ aria-label="not-visible"
+ >
+
+
+ )}
+
+
{!archived && (
+
+ handleIconClick(e, 'archive')}
+ edge="end"
+ aria-label="archive"
+ >
+
+
+
+ )}
+
handleIconClick(e, 'archive')}
+ id="delete"
+ onClick={(e) => handleIconClick(e, 'delete')}
edge="end"
- aria-label="archive"
+ aria-label="delete"
>
-
+
- )}
- handleIconClick(e, 'delete')}
- edge="end"
- aria-label="delete"
- >
-
-
+
)
}
diff --git a/frontend/frontend/src/pages/subjectsPage/SubjectsPage.tsx b/frontend/frontend/src/pages/subjectsPage/SubjectsPage.tsx
index 91a52e1d..1949639e 100644
--- a/frontend/frontend/src/pages/subjectsPage/SubjectsPage.tsx
+++ b/frontend/frontend/src/pages/subjectsPage/SubjectsPage.tsx
@@ -1,5 +1,12 @@
import { Header } from '../../components/Header'
-import { Box, CircularProgress, Grid, IconButton, Stack } from '@mui/material'
+import {
+ Box,
+ CircularProgress,
+ Grid,
+ IconButton,
+ Stack,
+ Tooltip,
+} from '@mui/material'
import TabSwitcher from '../../components/TabSwitcher.tsx'
import { ProjectsView } from './ProjectsView.tsx'
import { useNavigate, useParams } from 'react-router-dom'
@@ -327,19 +334,24 @@ export function SubjectsPage() {
'/accept_invitation'
}
/>
-
-
-
+
+
+
+
{
@@ -359,7 +359,7 @@ export function SubmissionPage() {
{t('filename')}
}
onClick={downloadSubmission}
>
diff --git a/frontend/frontend/vite.config.ts b/frontend/frontend/vite.config.ts
index b9fdf55d..1a26ac5a 100644
--- a/frontend/frontend/vite.config.ts
+++ b/frontend/frontend/vite.config.ts
@@ -14,6 +14,7 @@ export default defineConfig({
'chunk-OLZKTZWI.js?v=fff2b904',
'chunk-6ZDRAOHK.js?v=fff2b904',
'chunk-BWG3R63Q.js?v=fff2b904',
+ 'chunk-DVKQGDAD.js?v=99d84b8c',
'@mui/material/Grid', // Exclude other MUI components as needed
],
},