Skip to content

Commit 8dd1c21

Browse files
committed
added show more buttons for repeatable meetings
1 parent d6441fd commit 8dd1c21

File tree

2 files changed

+99
-91
lines changed

2 files changed

+99
-91
lines changed
Lines changed: 52 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,60 @@
1-
import React, { useState } from 'react';
2-
import { MeetingDto } from '../../dtos/MeetingDto';
3-
import MeetingSearchResult from './MeetingSearchResult';
4-
import { Grid2 } from '@mui/material';
1+
import React, { useState } from 'react'
2+
import { MeetingDto } from '../../dtos/MeetingDto'
3+
import MeetingSearchResult from './MeetingSearchResult'
4+
import { Grid2 } from '@mui/material'
55

6-
interface Props {
7-
meetings: MeetingDto[];
8-
}
9-
10-
export default function GroupedMeeting({ meetings }: Props) {
11-
const [expandedIds, setExpandedIds] = useState<Set<number>>(new Set());
6+
export default function GroupedMeeting({ meetings }: { meetings: MeetingDto[] }) {
7+
const [expandedIds, setExpandedIds] = useState<Set<number>>(new Set())
128

13-
const grouped = meetings.reduce<Record<number, MeetingDto[]>>((acc, m) => {
14-
(acc[m.superId] = acc[m.superId] || []).push(m);
15-
return acc;
16-
}, {});
9+
const grouped = meetings.reduce((acc, m) => {
10+
acc[m.superId] = acc[m.superId] || []
11+
acc[m.superId].push(m)
12+
return acc
13+
}, {} as Record<number, MeetingDto[]>)
1714

1815
Object.values(grouped).forEach(group =>
1916
group.sort((a, b) => new Date(a.dateFrom).getTime() - new Date(b.dateFrom).getTime())
20-
);
21-
22-
const toggle = (sid: number) => {
23-
setExpandedIds(prev => {
24-
const newExpandedIds = new Set(prev);
25-
if (newExpandedIds.has(sid)) {
26-
newExpandedIds.delete(sid);
27-
} else {
28-
newExpandedIds.add(sid);
29-
}
30-
return newExpandedIds;
31-
});
32-
};
33-
34-
return (
35-
<Grid2 container spacing={3} className="my-5 overflow-y-scroll">
36-
{Object.entries(grouped).map(([sidStr, group]) => {
37-
const sid = Number(sidStr);
38-
const [first, ...rest] = group;
39-
const isExp = expandedIds.has(sid);
40-
const isRepeatable = rest.length > 0;
41-
42-
return (
43-
<React.Fragment key={sid}>
44-
<Grid2 size={{ xs: 12, md: 6, lg: 4 }}>
45-
<div className="relative">
46-
<MeetingSearchResult
47-
meeting={first}
48-
isRepeatable={isRepeatable}
49-
isExpanded={isExp}
50-
onToggle={isRepeatable ? () => toggle(sid) : undefined}
51-
/>
52-
</div>
53-
</Grid2>
54-
55-
{isExp && rest.map(m => (
56-
<Grid2 key={m.id} size={{ xs: 12, md: 6, lg: 4 }}>
57-
<MeetingSearchResult
58-
meeting={m}
59-
isRepeatable={false}
60-
isExpanded={true}
61-
/>
17+
)
18+
19+
const toggle = (sid: number) => {
20+
setExpandedIds(prev => {
21+
const next = new Set(prev)
22+
next.has(sid) ? next.delete(sid) : next.add(sid)
23+
return next
24+
})
25+
}
26+
27+
return (
28+
<Grid2 container spacing={3} className="my-5 overflow-y-scroll">
29+
{Object.entries(grouped).map(([sidStr, group]) => {
30+
const sid = +sidStr
31+
const [first, ...rest] = group
32+
const isExp = expandedIds.has(sid)
33+
const isRepeat = rest.length > 0
34+
35+
return (
36+
<React.Fragment key={sid}>
37+
<Grid2 size={{ xs: 12, md: 6, lg: 4 }}> <div className="relative">
38+
<MeetingSearchResult
39+
meeting={first}
40+
isRepeatable={isRepeat}
41+
isExpanded={isExp}
42+
onToggle={isRepeat ? () => toggle(sid) : undefined}
43+
/>
44+
</div>
6245
</Grid2>
63-
))}
64-
</React.Fragment>
65-
);
66-
})}
67-
</Grid2>
68-
);
6946

47+
{isExp && rest.map(m => (
48+
<Grid2 size={{ xs: 12, md: 6, lg: 4 }}> <MeetingSearchResult
49+
meeting={m}
50+
isRepeatable={false}
51+
isExpanded={true}
52+
/>
53+
</Grid2>
54+
))}
55+
</React.Fragment>
56+
)
57+
})}
58+
</Grid2>
59+
)
7060
}

src/form/SearchMeetingForm.tsx

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import axiosInstance from '../AxiosConfig';
1616
import { ModuleDto } from '../dtos/ModuleDto';
1717
import { MeetingDto } from '../dtos/MeetingDto';
1818
import GroupedMeeting from '../components/meeting/GroupedMeeting';
19-
2019
interface Props {
2120
open: boolean;
2221
onClose: () => void;
@@ -28,67 +27,86 @@ export function SearchMeetingForm({ open, onClose }: Props) {
2827
const [selectedModule, setSelectedModule] = useState<string>('');
2928

3029
useEffect(() => {
31-
async function fetchModules() {
30+
// Lade die verfügbaren Module beim Öffnen des Dialogs
31+
const loadModules = async () => {
3232
try {
3333
const res = await getModules(axiosInstance);
3434
setModules(res);
35-
} catch (e) {
36-
console.error(e);
35+
} catch (err) {
36+
console.error('Fehler beim Laden der Module:', err);
3737
}
38-
}
39-
fetchModules();
38+
};
39+
loadModules();
4040
}, []);
4141

4242
useEffect(() => {
43-
async function fetchMeetings() {
43+
// Wenn ein Modul ausgewählt wurde, lade passende Meetings
44+
const loadMeetings = async () => {
4445
if (!selectedModule) return;
4546
try {
4647
const res = await getMeetingsForModule(axiosInstance, selectedModule);
4748
setMeetings(res);
48-
} catch (e) {
49-
console.error(e);
49+
} catch (err) {
50+
console.error('Fehler beim Laden der Meetings:', err);
5051
}
51-
}
52-
fetchMeetings();
52+
};
53+
loadMeetings();
5354
}, [selectedModule]);
5455

55-
const handleSelectChange = (event: SelectChangeEvent) => {
56-
setSelectedModule(event.target.value as string);
56+
const handleModuleChange = (event: SelectChangeEvent) => {
57+
setSelectedModule(event.target.value);
5758
};
5859

5960
return (
60-
<Dialog open={open} onClose={onClose} sx={{
61-
'& .MuiDialog-container': {
62-
'& .MuiPaper-root': {
61+
<Dialog
62+
open={open}
63+
onClose={onClose}
64+
sx={{
65+
'& .MuiDialog-container .MuiPaper-root': {
6366
width: '70%',
6467
maxWidth: '90%',
6568
minWidth: '350px',
6669
bgcolor: '#1C212C',
6770
padding: '8px',
68-
height: '80%'
69-
}
70-
}
71-
}}>
72-
<DialogTitle sx={{ color: '#FFFFFF', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
71+
height: '80%',
72+
},
73+
}}
74+
>
75+
<DialogTitle
76+
sx={{
77+
color: '#FFFFFF',
78+
display: 'flex',
79+
justifyContent: 'space-between',
80+
alignItems: 'center',
81+
}}
82+
>
7383
<span className="font-bold text-2xl">Lernsession finden</span>
74-
<IconButton aria-label="close" onClick={onClose} size="large" sx={{ color: '#FFFFFF' }}>
75-
<img src={CloseIconPath} alt="close" style={{ width: 16, height: 16 }} />
84+
<IconButton onClick={onClose} size="large" sx={{ color: '#FFFFFF' }}>
85+
<img src={CloseIconPath} alt="Schließen" style={{ width: 16, height: 16 }} />
7686
</IconButton>
7787
</DialogTitle>
88+
7889
<DialogContent>
7990
<form className="overflow-y-visible">
8091
<Select
81-
variant="outlined"
8292
value={selectedModule}
83-
onChange={handleSelectChange}
84-
sx={{ width: '50%', minWidth: 240, color: '#ffffff', bgcolor: '#333C4F', borderColor: '#333C4F' }}
93+
onChange={handleModuleChange}
94+
variant="outlined"
95+
sx={{
96+
width: '50%',
97+
minWidth: 240,
98+
color: '#ffffff',
99+
bgcolor: '#333C4F',
100+
borderColor: '#333C4F',
101+
}}
85102
>
86-
{modules.map((m, i) => (
87-
<MenuItem key={i} value={m.name}>
88-
{m.name}
103+
{modules.map((mod, i) => (
104+
<MenuItem key={i} value={mod.name}>
105+
{mod.name}
89106
</MenuItem>
90107
))}
91108
</Select>
109+
92110
<Grid2 container spacing={3} className="my-5 overflow-y-scroll">
93111
<GroupedMeeting meetings={meetings} />
94112
</Grid2>

0 commit comments

Comments
 (0)