Skip to content

Commit 95ab89d

Browse files
author
Alexandra Zwinger
committed
Fix many small issues
1 parent 8dd1c21 commit 95ab89d

File tree

9 files changed

+377
-330
lines changed

9 files changed

+377
-330
lines changed

src/api/MeetingApi.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export function deleteMeeting(axios: AxiosInstance, meetingId: string): Promise<
1818
.then(handleSuccessResponse, handleErrorResponse);
1919
}
2020

21-
export function getMeetings(axios: AxiosInstance): Promise<MeetingDto[]> {
21+
export function getAttendedMeetings(axios: AxiosInstance): Promise<MeetingDto[]> {
2222
const url = `/${Resources.MEETING}`;
2323
return axios.get(url)
2424
.then(handleSuccessResponse, handleErrorResponse)
@@ -46,7 +46,7 @@ export function getMeetingsForModule(axios: AxiosInstance, module: string): Prom
4646
}
4747

4848
export function updateCreator(axios: AxiosInstance, meetingId: string, newCreatorId: string): Promise<CreateMeetingDto> {
49-
const meetingUpdate = { creator: newCreatorId };
49+
const meetingUpdate = {creator: newCreatorId};
5050

5151
return axios.put(`/${Resources.MEETING}?id=${meetingId}`, meetingUpdate)
5252
.then(handleSuccessResponse, handleErrorResponse);

src/components/CalendarComponent.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {MeetingDto} from '../dtos/MeetingDto';
66
import '../styles/Calendar.css';
77
import {useTheme} from '@mui/material/styles';
88
import useMediaQuery from '@mui/material/useMediaQuery';
9-
import {getMeetings} from "../api/MeetingApi";
9+
import {getAttendedMeetings} from "../api/MeetingApi";
1010
import axiosInstance from "../AxiosConfig";
1111
import {CreateOrUpdateMeetingForm} from "../form/CreateOrUpdateMeetingForm";
1212
import {EventSourceInput} from '@fullcalendar/core';
@@ -23,7 +23,7 @@ export default function CalendarComponent(props: { isDialogOpen: boolean }) {
2323

2424
const fetchMeetings = async () => {
2525
try {
26-
const response = await getMeetings(axiosInstance);
26+
const response = await getAttendedMeetings(axiosInstance);
2727
setEvents(response);
2828
} catch (error) {
2929
console.error(error);
@@ -78,6 +78,7 @@ export default function CalendarComponent(props: { isDialogOpen: boolean }) {
7878

7979
const closeModal = () => {
8080
setIsModalOpen(false);
81+
fetchMeetings();
8182
};
8283

8384
return (

src/components/CuteButton.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ export function CuteButton(props: {
1515
className={className}
1616
type={props.type}
1717
style={{background: props.bgColor, color: props.textColor}}
18-
onClick={props.onClick}
18+
onClick={(e) => {
19+
e.preventDefault();
20+
props.onClick?.();
21+
}}
1922
>
2023
{props.text}
2124
</button>
Lines changed: 52 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,61 @@
1-
import React, { useState } from 'react'
2-
import { MeetingDto } from '../../dtos/MeetingDto'
1+
import React, {useState} from 'react'
2+
import {MeetingDto} from '../../dtos/MeetingDto'
33
import MeetingSearchResult from './MeetingSearchResult'
4-
import { Grid2 } from '@mui/material'
4+
import {Grid2} from '@mui/material'
55

6-
export default function GroupedMeeting({ meetings }: { meetings: MeetingDto[] }) {
7-
const [expandedIds, setExpandedIds] = useState<Set<number>>(new Set())
6+
export default function GroupedMeeting({meetings}: { meetings: MeetingDto[] }) {
7+
const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set())
88

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[]>)
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[]>)
1414

15-
Object.values(grouped).forEach(group =>
16-
group.sort((a, b) => new Date(a.dateFrom).getTime() - new Date(b.dateFrom).getTime())
17-
)
15+
Object.values(grouped).forEach(group =>
16+
group.sort((a, b) => new Date(a.dateFrom).getTime() - new Date(b.dateFrom).getTime())
17+
)
1818

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-
}
19+
const toggle = (sid: string) => {
20+
setExpandedIds(prev => {
21+
const next = new Set(prev);
22+
next.has(sid) ? next.delete(sid) : next.add(sid);
23+
return next;
24+
})
25+
}
2626

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
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;
3434

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>
45-
</Grid2>
35+
return (
36+
<React.Fragment key={sid}>
37+
<Grid2 size={{xs: 12, md: 6, lg: 4}}>
38+
<div className="relative">
39+
<MeetingSearchResult
40+
meeting={first}
41+
isRepeatable={isRepeat}
42+
isExpanded={isExp}
43+
onToggle={isRepeat ? () => toggle(sid) : undefined}
44+
/>
45+
</div>
46+
</Grid2>
4647

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-
)
48+
{isExp && rest.map(m => (
49+
<Grid2 size={{xs: 12, md: 6, lg: 4}} key={m.id}> <MeetingSearchResult
50+
meeting={m}
51+
isRepeatable={false}
52+
isExpanded={true}
53+
/>
54+
</Grid2>
55+
))}
56+
</React.Fragment>
57+
)
58+
})}
59+
</Grid2>
60+
)
6061
}

src/components/meeting/MeetingDetails.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, {useEffect, useState} from 'react';
22
import '../../styles/Modal.css';
33
import {CuteButton} from "../CuteButton";
44
import {MeetingDto} from "../../dtos/MeetingDto";
5-
import {getUserIdsForMeeting} from "../../api/UserGroupApi";
5+
import {getUserIdsForMeeting, leaveStudyGroup} from "../../api/UserGroupApi";
66
import axiosInstance from "../../AxiosConfig";
77
import {getUser} from "../../api/UserApi";
88
import {UserDto} from "../../dtos/UserDto";
@@ -39,6 +39,11 @@ const MeetingDetails: React.FC<ModalProps> = ({isOpen, meeting, onClose, openMee
3939
}
4040
}, [isOpen, meeting]);
4141

42+
const leaveMeeting = async () => {
43+
if (meeting?.id)
44+
await leaveStudyGroup(axiosInstance, meeting?.id)
45+
onClose();
46+
};
4247

4348
const updateMeeting = () => {
4449
onClose();
@@ -76,17 +81,17 @@ const MeetingDetails: React.FC<ModalProps> = ({isOpen, meeting, onClose, openMee
7681
</p>
7782

7883
<p className="text-bs font-medium text-white">
79-
<strong className="text-[#CAE8FF] font-semibold">Teilnehmer:</strong>
84+
<strong className="text-[#CAE8FF] font-semibold">Teilnehmende:</strong>
8085
</p>
8186
<ul className="text-white text-sm list-disc list-inside">
8287
<li key={meeting?.creator}>{meeting?.creator}</li>
8388
{userIds.map(id => (
8489
<li key={id}>{id}</li>
8590
))}
86-
{userIds.length === 0 && <li>-</li>}
91+
{userIds.length === 0 && <></>}
8792
</ul>
8893
</div>
89-
{meeting.creator == myUser.uuid && (
94+
{meeting.creator == myUser.uuid ? (
9095
<div className="flex flex-row gap-4 mb-4 justify-end mt-auto items-center">
9196
<div>
9297
<CuteButton
@@ -98,6 +103,16 @@ const MeetingDetails: React.FC<ModalProps> = ({isOpen, meeting, onClose, openMee
98103
/>
99104
</div>
100105
</div>
106+
) : (
107+
<>
108+
<CuteButton
109+
onClick={leaveMeeting}
110+
text={'Meeting verlassen'}
111+
textColor="#e8fcf6"
112+
bgColor="#974242"
113+
classname="text-sm w-full"
114+
/>
115+
</>
101116
)}
102117
</div>
103118
</div>

0 commit comments

Comments
 (0)