@@ -4,13 +4,14 @@ import {getMeetingsOfWeek} from "../../api/MeetingApi";
44import axiosInstance from "../../AxiosConfig" ;
55import { MeetingDto } from "../../dtos/MeetingDto" ;
66import ModuleProgressSettings from "../ModuleProgressSettings" ;
7- import { ModuleDto } from "../../dtos/ModuleDto" ;
7+ import { Chapter , Checkbox , UserModule } from "../../dtos/ModuleDto" ;
88import { getUser } from "../../api/UserApi" ;
99
1010export default function UserInfo ( ) {
1111 const [ weeklyMeetings , setWeeklyMeetings ] = useState < MeetingDto [ ] > ( [ ] ) ;
1212 const [ isModalOpen , setIsModalOpen ] = useState < boolean > ( false ) ;
13- const [ modules , setModules ] = useState < ModuleDto [ ] > ( [ ] ) ;
13+ const [ modules , setModules ] = useState < UserModule [ ] > ( [ ] ) ;
14+ const [ activeModule , setActiveModule ] = useState < UserModule | undefined > ( ) ;
1415
1516 const filterMeetingsForCurrentWeek = ( meetings : MeetingDto [ ] ) => {
1617 const currentDate = new Date ( ) ;
@@ -45,22 +46,37 @@ export default function UserInfo() {
4546 fetchUserInfo ( ) ;
4647 } , [ ] ) ;
4748
48- const openModal = ( ) => {
49+ const openModal = ( moduleName : string ) => {
50+ setActiveModule ( modules . find ( ( m ) => m . name === moduleName ) ) ;
4951 setIsModalOpen ( true ) ;
5052 } ;
5153
5254 const closeModal = ( ) => {
5355 setIsModalOpen ( false ) ;
5456 } ;
5557
58+ const calculateProgress = ( module : UserModule ) : number => {
59+ if ( ! module . chapter ?. length ) return 0 ;
60+
61+ let checked = 0 ;
62+ let total = 0 ;
63+
64+ module . chapter . forEach ( ( chapter : Chapter ) => {
65+ total += chapter . checkboxes . length ;
66+ checked += chapter . checkboxes . filter ( ( box : Checkbox ) => box . checked ) . length ;
67+ } ) ;
68+
69+ return total === 0 ? 0 : checked / total ;
70+ }
71+
5672 return (
5773 < div className = "lg:w-[60%] w-[80%] sm:px-8 mb-16 justify-center mt-8" >
5874 < div className = "w-full md:px-16" >
5975 < p className = "text-2xl font-bold text-white text-left lg:mt-4 mt-16 mb-7" > Prüfungstermine</ p >
6076
6177 < table className = "w-full border-collapse hidden md:table" >
6278 < tbody >
63- { modules . map ( ( subject , index ) => (
79+ { modules && modules . map ( ( subject , index ) => (
6480 < tr key = { index } >
6581 < td className = "px-1 py-1 text-[#9B9B9B]" > { subject . name } </ td >
6682 < td className = "px-1 py-1 text-[#2AB19D]" > DATE</ td >
@@ -71,7 +87,7 @@ export default function UserInfo() {
7187 </ tbody >
7288 </ table >
7389 < div className = "md:hidden space-y-4" >
74- { modules . map ( ( subject , index ) => (
90+ { modules && modules . map ( ( subject , index ) => (
7591 < div key = { index } className = "p-3 shadow-sm" >
7692 < p className = "text-[#9B9B9B]" >
7793 { subject . name }
@@ -128,17 +144,20 @@ export default function UserInfo() {
128144 </ div >
129145
130146 < p className = "text-2xl font-bold text-white text-left mt-9 mb-6" > Lernfortschritt</ p >
131- { modules . map ( ( subject , index ) => (
147+ { modules && modules . map ( ( subject , index ) => (
132148 < div key = { index } className = "mb-6" >
133149 < p className = "text-m text-[#9B9B9B]" > { subject . name } </ p >
134- < div onClick = { openModal } >
135- < ProgressBar progress = { 0.5 } />
150+ < div onClick = { ( ) => {
151+ openModal ( subject . name )
152+ } } >
153+ < ProgressBar progress = { calculateProgress ( subject ) } />
136154 </ div >
137155 </ div >
138156 ) ) }
139157 </ div >
140158 {
141- isModalOpen && < ModuleProgressSettings isOpen = { isModalOpen } onClose = { closeModal } />
159+ isModalOpen && activeModule &&
160+ < ModuleProgressSettings isOpen = { isModalOpen } onClose = { closeModal } module = { activeModule } />
142161 }
143162 </ div >
144163 ) ;
0 commit comments