Skip to content

Commit 098e9f4

Browse files
author
Alexandra Zwinger
committed
Adjust endpoints to backend
1 parent 0f589c8 commit 098e9f4

19 files changed

+228
-98
lines changed

src/App.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@ import {ThemeProvider} from "@mui/material/styles";
33
import {Routes, Route} from "react-router-dom";
44
import {customTheme} from "./customTheme";
55
import React from "react";
6-
import Navbar from "./components/Navbar";
7-
//import {ReactKeycloakProvider} from '@react-keycloak/web'
6+
import Navbar from "./components/navbar/Navbar";
7+
import {ReactKeycloakProvider} from '@react-keycloak/web'
88

99
import CalenderPage from './pages/CalendarPage';
1010
import Homepage from './pages/Homepage';
1111
import Settings from './pages/YourStudies';
1212
import Page404 from './pages/Page404';
1313
import Score from './pages/Score';
14-
/*import keycloak from "./Keycloak";*/
14+
import keycloak from "./Keycloak";
1515

1616
function App() {
1717
return (
18-
/*<ReactKeycloakProvider
18+
<ReactKeycloakProvider
1919
authClient={keycloak}
20-
initOptions={{ onLoad: 'login-required', checkLoginIframe: false }}
20+
initOptions={{onLoad: 'login-required', checkLoginIframe: false}}
2121
onEvent={(event, error) => {
2222
console.log(`Keycloak Event: ${event}`, error);
2323
if (event === 'onAuthError') {
2424
console.error('Authentication Error:', error);
2525
}
2626
}}
27-
>*/
27+
>
2828
<ThemeProvider theme={customTheme}>
2929
<CssBaseline/>
3030
<GlobalStyles styles={{html: {WebkitFontSmoothing: "auto"}}}/>
@@ -39,7 +39,7 @@ function App() {
3939
</Routes>
4040
</div>
4141
</ThemeProvider>
42-
/*</ReactKeycloakProvider>*/
42+
</ReactKeycloakProvider>
4343
);
4444
}
4545

src/AxiosConfig.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import axios from 'axios';
2-
/*import keycloak from "./Keycloak";*/
2+
import keycloak from "./Keycloak";
33

44
const axiosInstance = axios.create({
55
baseURL: 'http://localhost:8080',
@@ -10,7 +10,7 @@ const axiosInstance = axios.create({
1010
});
1111

1212
axiosInstance.interceptors.request.use(
13-
/* async (config) => {
13+
async (config) => {
1414
const token = keycloak.token;
1515
if (token) {
1616
config.headers['Authorization'] = `Bearer ${token}`;
@@ -19,7 +19,7 @@ axiosInstance.interceptors.request.use(
1919
},
2020
(error) => {
2121
return Promise.reject(error);
22-
}*/
22+
}
2323
);
2424

2525
export default axiosInstance;

src/api/UserApi.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import {AxiosInstance} from "axios";
22
import {Resources} from "../App";
33
import {handleErrorResponse, handleSuccessResponse} from "./ErrorHandling";
4+
import {UserDto} from "../dtos/UserDto";
45

5-
export function getUser(axios: AxiosInstance) {
6-
return axios.get(`${Resources.USER}`)
6+
export function getUser(axios: AxiosInstance): Promise<UserDto> {
7+
return axios.get(Resources.USER)
8+
.then(res => res.data[0], handleErrorResponse);
9+
}
10+
11+
export function updateUsername(axios: AxiosInstance, name: string) {
12+
return axios.post(Resources.USER, {username: name})
713
.then(handleSuccessResponse, handleErrorResponse);
814
}

src/components/CalendarComponent.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, {useEffect, useState} from 'react';
22
import FullCalendar from '@fullcalendar/react';
33
import timeGridPlugin from '@fullcalendar/timegrid';
4-
import Modal from './Modal';
4+
import MeetingDetails from './meeting/MeetingDetails';
55
import {MeetingDto} from '../dtos/MeetingDto';
66
import '../styles/Calendar.css';
77
import {useTheme} from '@mui/material/styles';
@@ -10,11 +10,14 @@ import {getMeetings} from "../api/MeetingApi";
1010
import axiosInstance from "../AxiosConfig";
1111
import {CreateOrUpdateMeetingForm} from "../form/CreateOrUpdateMeetingForm";
1212
import {EventSourceInput} from '@fullcalendar/core';
13+
import {ChooseMeetingForm} from "../form/ChooseMeetingForm";
1314

1415
export default function CalendarComponent(props: { isDialogOpen: boolean }) {
1516
const [selectedMeeting, setSelectedMeeting] = useState<MeetingDto | null>(null);
1617
const [isModalOpen, setIsModalOpen] = useState(false);
1718
const [isMeetingFormOpen, setIsMeetingFormOpen] = useState(false);
19+
const [isChooseMeetingOpen, setChooseMeetingOpen] = useState(false);
20+
const [onlyThisMeeting, setOnlyThisMeeting] = useState(true);
1821
const [events, setEvents] = useState<MeetingDto[]>([]);
1922
const mdAndUp = useMediaQuery(useTheme().breakpoints.up('md'));
2023

@@ -30,9 +33,10 @@ export default function CalendarComponent(props: { isDialogOpen: boolean }) {
3033
function mapMeetingsToEvents(meetings: MeetingDto[]): EventSourceInput {
3134
return meetings.map(meeting => ({
3235
id: meeting.id.toString(),
36+
superId: meeting.superId.toString(),
3337
title: meeting.title,
34-
start: new Date(meeting.date_from).toISOString(),
35-
end: new Date(meeting.date_until).toISOString(),
38+
start: new Date(meeting.dateFrom).toISOString(),
39+
end: new Date(meeting.dateUntil).toISOString(),
3640
description: meeting.description,
3741
room: meeting.place,
3842
repeatable: meeting.repeatable,
@@ -41,7 +45,6 @@ export default function CalendarComponent(props: { isDialogOpen: boolean }) {
4145
}))
4246
}
4347

44-
4548
useEffect(() => {
4649
fetchMeetings();
4750
}, [props.isDialogOpen, isMeetingFormOpen]);
@@ -52,16 +55,19 @@ export default function CalendarComponent(props: { isDialogOpen: boolean }) {
5255
const title = event.title;
5356
const date_from = new Date(event.start).toLocaleString();
5457
const date_until = new Date(event.end).toLocaleString();
58+
const superId = event.extendedProps?.superId || '';
5559
const description = event.extendedProps?.description || '';
5660
const place = event.extendedProps?.room || '';
5761
const repeatable = event.extendedProps?.repeatable || 'never';
5862
const creator = event.extendedProps?.creator || '';
5963
const member = event.extendedProps?.member || [];
64+
console.log(event);
6065
setSelectedMeeting({
6166
id: id,
67+
superId: superId,
6268
title,
63-
date_from,
64-
date_until,
69+
dateFrom: date_from,
70+
dateUntil: date_until,
6571
description,
6672
place,
6773
repeatable: repeatable,
@@ -106,18 +112,22 @@ export default function CalendarComponent(props: { isDialogOpen: boolean }) {
106112
eventClick={Eventhandler}
107113
/>
108114
{selectedMeeting && (
109-
<Modal
115+
<MeetingDetails
110116
isOpen={isModalOpen}
111117
meeting={selectedMeeting}
112118
onClose={closeModal}
113-
setIsMeetingFormOpen={setIsMeetingFormOpen}
119+
openMeetingForm={() => setIsMeetingFormOpen(true)}
120+
openChooseMeetingModal={() => setChooseMeetingOpen(true)}
114121
/>
115122
)}
116123
{selectedMeeting && isMeetingFormOpen &&
117124
<CreateOrUpdateMeetingForm open={true} onClose={() => setIsMeetingFormOpen(false)}
118-
meeting={selectedMeeting}/>
125+
meeting={selectedMeeting} onlyThisMeeting={onlyThisMeeting}/>
126+
}
127+
{isChooseMeetingOpen &&
128+
<ChooseMeetingForm onClose={() => setChooseMeetingOpen(false)} setOnlyThisMeeting={setOnlyThisMeeting}
129+
openMeetingForm={() => setIsMeetingFormOpen(true)}/>
119130
}
120-
121131
</div>
122132
);
123133
}

src/components/CuteButton.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ export function CuteButton(props: {
1010
}) {
1111
const className = `px-5 py-2 h-fit rounded-full transform transition-all duration-300` +
1212
`hover:scale-x-105 hover:scale-y-105 ${props.classname}`;
13-
console.log(props.type);
1413
return (
1514
<button
1615
className={className}
Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ interface Chapter {
1919
checkboxes: Checkbox[];
2020
}
2121

22-
const Modal: React.FC<ModalProps> = ({isOpen, onClose}) => {
22+
const ModuleProgressSettings: React.FC<ModalProps> = ({isOpen, onClose}) => {
2323
const [chapters, setChapters] = useState<Chapter[]>([
2424
{
2525
id: 1,
@@ -171,14 +171,12 @@ const Modal: React.FC<ModalProps> = ({isOpen, onClose}) => {
171171
<CuteButton
172172
onClick={onClose}
173173
text={'Abbrechen'}
174-
textColor={'#CAE8FF'}
175-
bgColor={'#425E74'}
174+
bgColor={"#598BB1"} textColor={"#ffffff"}
176175
classname={'text-base'}
177176
/>
178177
<CuteButton
179178
text={'Speichern'}
180-
textColor={'#e3f1ef'}
181-
bgColor={'#506D69'}
179+
bgColor={"#56A095"} textColor={"#e8fcf6"}
182180
classname={'text-2xl'}
183181
/>
184182
</div>
@@ -188,5 +186,4 @@ const Modal: React.FC<ModalProps> = ({isOpen, onClose}) => {
188186
);
189187
};
190188

191-
export default Modal;
192-
189+
export default ModuleProgressSettings;
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
import React from 'react';
2-
import '../styles/Modal.css';
3-
import {CuteButton} from "./CuteButton";
4-
import {CreateMeetingDto} from "../dtos/MeetingDto";
2+
import '../../styles/Modal.css';
3+
import {CuteButton} from "../CuteButton";
4+
import {CreateMeetingDto} from "../../dtos/MeetingDto";
55

66
interface ModalProps {
77
isOpen: boolean;
88
meeting: CreateMeetingDto | null;
99
onClose: () => void;
10-
setIsMeetingFormOpen: React.Dispatch<React.SetStateAction<boolean>>;
10+
openMeetingForm: () => void;
11+
openChooseMeetingModal: () => void;
1112
}
1213

13-
const Modal: React.FC<ModalProps> = ({isOpen, meeting, onClose, setIsMeetingFormOpen}) => {
14+
const MeetingDetails: React.FC<ModalProps> = ({isOpen, meeting, onClose, openMeetingForm, openChooseMeetingModal}) => {
1415
if (!isOpen || !meeting) return null;
16+
17+
const updateMeeting = () => {
18+
onClose();
19+
if (meeting.repeatable !== "NEVER")
20+
openChooseMeetingModal();
21+
else
22+
openMeetingForm();
23+
}
1524
return (
1625
<div className="modal-overlay" onClick={onClose}>
1726
<div className="modal-content max-w-[90%] w-[450px]" onClick={(e) => e.stopPropagation()}>
@@ -20,10 +29,10 @@ const Modal: React.FC<ModalProps> = ({isOpen, meeting, onClose, setIsMeetingForm
2029

2130
<div className="flex flex-col gap-4 mb-4">
2231
<p className="text-bs font-medium text-white">
23-
<strong className="text-[#CAE8FF] font-semibold">Start:</strong> {meeting.date_from}
32+
<strong className="text-[#CAE8FF] font-semibold">Start:</strong> {meeting.dateFrom}
2433
</p>
2534
<p className="text-bs font-medium text-white">
26-
<strong className="text-[#CAE8FF] font-semibold">Ende:</strong> {meeting.date_until}
35+
<strong className="text-[#CAE8FF] font-semibold">Ende:</strong> {meeting.dateUntil}
2736
</p>
2837
<p className="text-bs font-medium text-white">
2938
<strong className="text-[#CAE8FF] font-semibold">Beschreibung:</strong> {meeting.description}
@@ -33,20 +42,16 @@ const Modal: React.FC<ModalProps> = ({isOpen, meeting, onClose, setIsMeetingForm
3342
</p>
3443
</div>
3544

36-
<div className="flex flex-row gap-4 mb-4 justify-end mt-auto">
45+
<div className="flex flex-row gap-4 mb-4 justify-end mt-auto items-center">
3746
<div>
38-
<CuteButton onClick={onClose} text={"Abbrechen"} textColor={"#CAE8FF"} bgColor={"#425E74"}
39-
classname={"text-base"}/>
47+
<CuteButton onClick={onClose} text={"Abbrechen"} bgColor={"#598BB1"} textColor={"#e6ebfc"}
48+
classname={"md:text-base text-sm"}/>
4049
</div>
4150
<div>
4251
<CuteButton
43-
onClick={() => {
44-
onClose();
45-
setIsMeetingFormOpen(true)
46-
}}
47-
text={"Meeting Bearbeiten"} textColor={"#e3f1ef"}
48-
bgColor={"#506D69"}
49-
classname={"text-base"}/>
52+
onClick={updateMeeting}
53+
text={"Meeting Bearbeiten"} bgColor={"#56A095"} textColor={"#e8fcf6"}
54+
classname={"md:text-lg text-base"}/>
5055
</div>
5156
</div>
5257

@@ -55,4 +60,4 @@ const Modal: React.FC<ModalProps> = ({isOpen, meeting, onClose, setIsMeetingForm
5560
);
5661
};
5762

58-
export default Modal;
63+
export default MeetingDetails;

src/components/MeetingSearchResult.tsx renamed to src/components/meeting/MeetingSearchResult.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
import {MeetingDto} from "../dtos/MeetingDto";
2-
import {CuteButton} from "./CuteButton";
1+
import {MeetingDto} from "../../dtos/MeetingDto";
2+
import {CuteButton} from "../CuteButton";
33
import React from "react";
44

55
export default function MeetingSearchResult(props: { meeting: MeetingDto }) {
66
return (
77
<div className="bg-[#333C4F] p-4 flex flex-col gap-4">
88
<div>
99
<div className="text-white">
10-
{new Date(props.meeting.date_from).toLocaleString('de-DE', {
10+
{new Date(props.meeting.dateFrom).toLocaleString('de-DE', {
1111
day: '2-digit',
1212
month: '2-digit',
1313
year: 'numeric',
1414
hour: '2-digit',
1515
minute: '2-digit',
1616
})}
1717
{" - "}
18-
{new Date(props.meeting.date_until).toLocaleString('de-DE', {
18+
{new Date(props.meeting.dateUntil).toLocaleString('de-DE', {
1919
day: '2-digit',
2020
month: '2-digit',
2121
year: 'numeric',
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from "react";
2-
import "../styles/navbar.css";
3-
import pinguin from "../data/penguin-48226_1280.svg";
2+
import "../../styles/navbar.css";
3+
import pinguin from "../../data/penguin-48226_1280.svg";
44
import {Link} from "react-router-dom";
55
import {NavbarButtons} from "./NavbarButtons";
66

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from "react";
2-
import "../styles/navbar.css";
2+
import "../../styles/navbar.css";
33
import {NavbarComponent} from "./NavbarComponent";
44
import {useLocation} from "react-router-dom";
55

0 commit comments

Comments
 (0)