Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55dcd50659 | ||
|
|
7867cf2a65 |
@@ -1,16 +0,0 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="CssUnknownProperty" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="myCustomPropertiesEnabled" value="true" />
|
||||
<option name="myIgnoreVendorSpecificProperties" value="false" />
|
||||
<option name="myCustomPropertiesList">
|
||||
<value>
|
||||
<list size="1">
|
||||
<item index="0" class="java.lang.String" itemvalue="font-color" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaScriptLibraryMappings">
|
||||
<includedPredefinedLibrary name="Node.js Core" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/anwendungsprojekt.iml" filepath="$PROJECT_DIR$/.idea/anwendungsprojekt.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,5 +0,0 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -1,5 +0,0 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
||||
</state>
|
||||
</component>
|
||||
@@ -1,38 +0,0 @@
|
||||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
||||
|
||||
## Getting Started
|
||||
|
||||
First, run the development server:
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
# or
|
||||
yarn dev
|
||||
# or
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||
|
||||
You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
|
||||
|
||||
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
|
||||
|
||||
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
|
||||
|
||||
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Next.js, take a look at the following resources:
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||
|
||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
||||
|
||||
## Deploy on Vercel
|
||||
|
||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
||||
|
||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
}
|
||||
|
||||
module.exports = nextConfig
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"name": "anwendung",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"autoprefixer": "10.4.14",
|
||||
"next": "13.3.4",
|
||||
"postcss": "8.4.23",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0",
|
||||
"tailwindcss": "3.3.2"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
|
Before Width: | Height: | Size: 25 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 283 64"><path fill="black" d="M141 16c-11 0-19 7-19 18s9 18 20 18c7 0 13-3 16-7l-7-5c-2 3-6 4-9 4-5 0-9-3-10-7h28v-3c0-11-8-18-19-18zm-9 15c1-4 4-7 9-7s8 3 9 7h-18zm117-15c-11 0-19 7-19 18s9 18 20 18c6 0 12-3 16-7l-8-5c-2 3-5 4-8 4-5 0-9-3-11-7h28l1-3c0-11-8-18-19-18zm-10 15c2-4 5-7 10-7s8 3 9 7h-19zm-39 3c0 6 4 10 10 10 4 0 7-2 9-5l8 5c-3 5-9 8-17 8-11 0-19-7-19-18s8-18 19-18c8 0 14 3 17 8l-8 5c-2-3-5-5-9-5-6 0-10 4-10 10zm83-29v46h-9V5h9zM37 0l37 64H0L37 0zm92 5-27 48L74 5h10l18 30 17-30h10zm59 12v10l-3-1c-6 0-10 4-10 10v15h-9V17h9v9c0-5 6-9 13-9z"/></svg>
|
||||
|
Before Width: | Height: | Size: 629 B |
@@ -1,33 +0,0 @@
|
||||
import React from "react";
|
||||
|
||||
export default function Background()
|
||||
{
|
||||
return (
|
||||
<div style={{
|
||||
position: "absolute",
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
overflow: "clip",
|
||||
pointerEvents: "none"
|
||||
}}>
|
||||
<div style={{
|
||||
position: "absolute",
|
||||
transform: "skew(20deg)",
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
zIndex: -10,
|
||||
backgroundColor: "#f2f2f2",
|
||||
borderTopLeftRadius: 400,
|
||||
borderBottomRightRadius: 800,
|
||||
|
||||
}}></div>
|
||||
<div style={{
|
||||
position: "absolute",
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
zIndex: -11,
|
||||
backgroundColor: "#346991",
|
||||
}}></div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
/**
|
||||
* Function Takes in Paramter for:
|
||||
* text: text to be shown on the button
|
||||
* width, height: width and height of the button
|
||||
* icon: an icon that should be shown on the button (HTML <svg> tag) (see Icons.js for example)
|
||||
* iconWidth, iconHeight: width and height of the icon
|
||||
* onClick: a function that should be run if the button is clicked
|
||||
* Example for onClick:
|
||||
* <Button onClick={onClick={() => {console.log("do something")}}
|
||||
* Example for icon:
|
||||
*/
|
||||
export default function Button(p) {
|
||||
|
||||
//default parameters for the button
|
||||
let text = p.text;
|
||||
let width = p.width, height = p.height;
|
||||
let iconHTML = p.icon;
|
||||
let iconWidth = p.iconWidth, iconHeight = p.iconHeight;
|
||||
let onClick = p.onClick;
|
||||
let color = p.color;
|
||||
let fontColor = p.fontColor;
|
||||
let font_size = p.fontSize;
|
||||
|
||||
//if parameters are not set, they are set to default values
|
||||
if (height == null) height = 0;
|
||||
if (width == null) width = 0;
|
||||
if (iconWidth == null) iconWidth = width-10;
|
||||
if (iconHeight == null) iconHeight = height-10;
|
||||
if (onClick == null) onClick = () => {};
|
||||
if (color == null) color = "#363636";
|
||||
if (fontColor == null) fontColor = "white";
|
||||
if (font_size == null) font_size = 16;
|
||||
|
||||
//build in the icon width and height to the svg tag (svg tag should not contain any size information by default)
|
||||
if (iconHTML != null) {
|
||||
let split = iconHTML.split("fill=");
|
||||
split[1] = "fill=" + split[1];
|
||||
split[0] += " width=" + iconWidth + " height=" + iconHeight + " ";
|
||||
iconHTML = split[0] + split[1]
|
||||
} else {
|
||||
iconHTML = "";
|
||||
}
|
||||
|
||||
//return the button
|
||||
return (
|
||||
<>
|
||||
<button className={"round-border button font font-small"}
|
||||
style={{
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
backgroundColor: color,
|
||||
color: fontColor,
|
||||
fontSize: font_size,
|
||||
minWidth: width,
|
||||
minHeight: height,
|
||||
textAlign: "center",
|
||||
}}
|
||||
onClick={onClick}>
|
||||
{text}
|
||||
<div dangerouslySetInnerHTML={{__html: iconHTML}}/>
|
||||
</button>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
let startParts = []
|
||||
let endParts = []
|
||||
const months = [["Januar", 31], ["Februar", 28], ["März", 31], ["April", 30], ["Mai", 31], ["Juni", 30], ["Juli", 31], ["August", 31], ["September", 30], ["Oktober", 31], ["November", 30], ["Dezember", 31]]
|
||||
const days = months.map((month => month[1]))
|
||||
let result = []
|
||||
let check = true
|
||||
const weekdays = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
|
||||
export default function BasicDateCalendar(p) {
|
||||
if (check) {
|
||||
generateCalendar("01.12.2024", "15.09.2025")
|
||||
check = false
|
||||
}
|
||||
return (
|
||||
<div className={"Down"}>
|
||||
{result.map((monthResult, index = 0) => (
|
||||
<div key={months} className={"A"}>
|
||||
<p>{getMonthName(index)}</p>
|
||||
<div className={"Days"}>
|
||||
{weekdays.map((weekday) => (
|
||||
<p key={weekday}>{weekday}</p>
|
||||
))}
|
||||
{monthResult.map((date) => (
|
||||
<p key={date}>{date}</p>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function getMonthName(monthIndex) {
|
||||
if (startParts[1] - 1 + monthIndex < 12) {
|
||||
return months[startParts[1] - 1 + monthIndex][0];
|
||||
} else {
|
||||
return months[startParts[1] - 1 + monthIndex - 12][0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function generateCalendar(start, ende)
|
||||
{
|
||||
splitter(start, ende)
|
||||
if (startParts[2] < endParts[2])
|
||||
{
|
||||
for (let i = startParts[1] - 1; i <= 11; i++)
|
||||
{
|
||||
let monthResult = [];
|
||||
for (let j = 1; j <= days[i]; j++)
|
||||
{
|
||||
if (
|
||||
new Date(startParts[2], i, j) >= new Date(startParts[2], startParts[1] - 1, startParts[0]) &&
|
||||
new Date(startParts[2], i, j) <= new Date(startParts[2], 11, 31)
|
||||
)
|
||||
{
|
||||
monthResult.push(j);
|
||||
}
|
||||
}
|
||||
result.push(monthResult);
|
||||
if (i == 11)
|
||||
{
|
||||
for (let h = 0; h <= endParts[1] - 1; h++)
|
||||
{
|
||||
let monthResultNewYear = [];
|
||||
for (let g = 1; g <= days[h]; g++)
|
||||
{
|
||||
if (new Date(endParts[2], h, g) <= new Date(endParts[2], endParts[1] - 1, endParts[0]))
|
||||
{
|
||||
monthResultNewYear.push(g);
|
||||
}
|
||||
}
|
||||
result.push(monthResultNewYear);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
{
|
||||
for (let i = startParts[1] - 1; i <= endParts[1] - 1; i++)
|
||||
{
|
||||
let monthResult = [];
|
||||
for (let j = 1; j <= days[i]; j++)
|
||||
{
|
||||
if (
|
||||
new Date(startParts[2], i, j) >= new Date(startParts[2], startParts[1] - 1, startParts[0]) &&
|
||||
new Date(startParts[2], i, j) <= new Date(startParts[2], endParts[1] - 1, endParts[0])
|
||||
)
|
||||
{
|
||||
monthResult.push(j);
|
||||
}
|
||||
}
|
||||
result.push(monthResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function splitter(startDate, endDate)
|
||||
{
|
||||
startParts = startDate.split(".")
|
||||
//Transformer()
|
||||
if (startParts[1][0] === 0) //prüft ob die erste Stelle des Monats eine 0 vorne stehen hat
|
||||
{
|
||||
startParts[1] = startParts[1][1] //überschreibt den Monat ohne die 0
|
||||
}
|
||||
endParts = endDate.split(".") //prüft ob die erste Stelle des Monats eine 0 vorne stehen hat
|
||||
if (endParts[1][0] === 0)
|
||||
{
|
||||
endParts[1] = endParts[1][1] //überschreibt den Monat ohne die 0
|
||||
}
|
||||
}
|
||||
|
||||
function Transformer()
|
||||
{
|
||||
let formattedDateStr = startParts[1] + "/" + startParts[0] + "/" + startParts[2];
|
||||
console.log(formattedDateStr)
|
||||
let weekday = new Date(formattedDateStr).getDay();
|
||||
console.log(weekday);
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
export class CalenderEntry
|
||||
{
|
||||
constructor(start_point, end_point)
|
||||
{
|
||||
this.start_point = start_point;
|
||||
this.end_point = end_point;
|
||||
this.colorID = 0;
|
||||
}
|
||||
}
|
||||
@@ -1,568 +0,0 @@
|
||||
import {useEffect, useState} from "react";
|
||||
import {CalenderEntry} from "@/components/CalenderEntry";
|
||||
import Button from "@/components/Button";
|
||||
import {list} from "postcss";
|
||||
|
||||
//all entries of the current week
|
||||
let entries = {mo: [], tu: [], we: [], th: [], fr: [], sa: []}
|
||||
//a variable that saves the currently grabbed resize bar
|
||||
let grabbed = null;
|
||||
let grabbedUp = false;
|
||||
let grabbed_in_list = null;
|
||||
|
||||
//a variable the saves if the mouse is pressed or not
|
||||
let mouseDown = false;
|
||||
|
||||
//a variable that stores the currently grabbed element to move
|
||||
let selectedElement = null;
|
||||
//move offset from top row to cursor
|
||||
let selectedOffsetTop = 0;
|
||||
//move offset from bottom row to cursor
|
||||
let selectedOffsetBottom = 0;
|
||||
//the list, the grabbed element to move is currently in
|
||||
let selectedListID = "";
|
||||
|
||||
//variable for the hight of one cell / row. Important for resizing the calender view
|
||||
let cellHeight = 25;
|
||||
|
||||
let colors = ["#f80000", "#414141"]
|
||||
|
||||
export default function CalenderView(p)
|
||||
{
|
||||
//state to update the calender view
|
||||
const [t, setT] = useState(false)
|
||||
|
||||
//a blocker for the right click context menu
|
||||
useEffect(() =>
|
||||
{
|
||||
window.addEventListener("contextmenu", (e) => (e.preventDefault()))
|
||||
})
|
||||
|
||||
function does_element_overlap(entry, start, end, search_list)
|
||||
{
|
||||
let current = null;
|
||||
for(let i = 0; i < search_list.length; i++)
|
||||
{
|
||||
current = search_list[i];
|
||||
if(current !== entry)
|
||||
{
|
||||
if (start > current.start_point && start < current.end_point)
|
||||
{
|
||||
return true;
|
||||
} else if (end > current.start_point && end < current.end_point)
|
||||
{
|
||||
return true;
|
||||
} else if (start <= current.start_point && end >= current.end_point)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//function to delete an elemente and resize the corresponding list in the entries dictionary
|
||||
function delete_element(index, element)
|
||||
{
|
||||
let currentList = entries[index];
|
||||
let temp = []
|
||||
for (let i = 0; i < currentList.length; i++)
|
||||
{
|
||||
if (element !== currentList[i])
|
||||
{
|
||||
temp.push(currentList[i]);
|
||||
}
|
||||
}
|
||||
entries[index] = temp;
|
||||
}
|
||||
|
||||
//resize a grabbed element to the row paramter
|
||||
function size_grabbed(row, current_list)
|
||||
{
|
||||
if (row >= 0 && row <= 96)
|
||||
{
|
||||
if (grabbedUp)
|
||||
{
|
||||
console.log(grabbed.start_point)
|
||||
|
||||
if (row < grabbed.end_point - 1)
|
||||
{
|
||||
if(!does_element_overlap(grabbed, row, grabbed.end_point, current_list))
|
||||
{
|
||||
grabbed.start_point = row;
|
||||
}
|
||||
}
|
||||
} else
|
||||
{
|
||||
if (row > grabbed.start_point)
|
||||
{
|
||||
if(!does_element_overlap(grabbed, grabbed.start_point, row + 1, current_list))
|
||||
{
|
||||
grabbed.end_point = row + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//moves the selected element to row and list with id
|
||||
function move_selected(row, id)
|
||||
{
|
||||
if (selectedListID !== id)
|
||||
{
|
||||
if(!does_element_overlap(selectedElement, row - selectedOffsetTop, row + selectedOffsetBottom, entries[id]))
|
||||
{
|
||||
delete_element(selectedListID, selectedElement);
|
||||
entries[id].push(selectedElement);
|
||||
selectedListID = id;
|
||||
}
|
||||
}
|
||||
|
||||
if (row - selectedOffsetTop > 0 && row + selectedOffsetBottom <= 97)
|
||||
{
|
||||
if(!does_element_overlap(selectedElement, row - selectedOffsetTop, row + selectedOffsetBottom, entries[id]))
|
||||
{
|
||||
selectedElement.start_point = row - selectedOffsetTop;
|
||||
selectedElement.end_point = row + selectedOffsetBottom;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//routine, when mouse is moved
|
||||
function mouse_move(e)
|
||||
{
|
||||
//checks if mouse is still down
|
||||
if (mouseDown)
|
||||
{
|
||||
//get the y coordinate of the cursor
|
||||
let y_window = e.clientY;
|
||||
//get the offset to the calender view
|
||||
let y_target_offset = e.currentTarget.getBoundingClientRect().top;
|
||||
//get the id of the current column
|
||||
let id = e.currentTarget.id;
|
||||
//calcultes the current row the cursor hovers
|
||||
let row = Math.floor((y_window - y_target_offset) / cellHeight) + 1
|
||||
let current_list = entries[e.currentTarget.id];
|
||||
|
||||
//if a edge of an element was grabbed, resize it
|
||||
if (grabbed != null)
|
||||
{
|
||||
size_grabbed(row, grabbed_in_list);
|
||||
//if a whole element was grabbed, move it
|
||||
} else if (selectedElement != null)
|
||||
{
|
||||
move_selected(row, id);
|
||||
}
|
||||
}
|
||||
|
||||
//update the calender view
|
||||
setT(!t);
|
||||
}
|
||||
|
||||
//routine when mouse was released
|
||||
function mouse_up(e)
|
||||
{
|
||||
mouseDown = false;
|
||||
|
||||
//remove all selected elements
|
||||
if (grabbed != null)
|
||||
{
|
||||
grabbed.colorID = 0;
|
||||
grabbed = null;
|
||||
}
|
||||
if (selectedElement != null)
|
||||
{
|
||||
selectedElement.colorID = 0;
|
||||
selectedElement = null;
|
||||
}
|
||||
|
||||
setT(!t);
|
||||
}
|
||||
|
||||
//find the current element on row in the selected list (search_list)
|
||||
function find_current(row, search_list)
|
||||
{
|
||||
let current = null;
|
||||
for (let i = 0; i < search_list.length; i++)
|
||||
{
|
||||
current = search_list[i];
|
||||
if (current.start_point <= row && current.end_point >= row)
|
||||
{
|
||||
break;
|
||||
}
|
||||
current = null;
|
||||
}
|
||||
|
||||
return current;
|
||||
}
|
||||
|
||||
//places a new entry to the calender
|
||||
function place_new_entry(row, list)
|
||||
{
|
||||
if (row < 96)
|
||||
{
|
||||
let free = true;
|
||||
for (let i = 0; i < list.length; i++)
|
||||
{
|
||||
let current = list[i];
|
||||
|
||||
for (let r = row; r < row + 3; r++)
|
||||
{
|
||||
for (let s = current.start_point; s < current.end_point; s++)
|
||||
{
|
||||
if (s === r)
|
||||
{
|
||||
free = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (free)
|
||||
{
|
||||
list.push(new CalenderEntry(row, row + 3));
|
||||
setT(!t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//routine when mouse was pressed
|
||||
function mouse_down(e)
|
||||
{
|
||||
|
||||
//get the cursors y coordinate in the window
|
||||
let y_window = e.clientY;
|
||||
//get the offset of the calender view
|
||||
let y_target_offset = e.currentTarget.getBoundingClientRect().top;
|
||||
//calculate the row clicked on
|
||||
let row = Math.floor((y_window - y_target_offset) / cellHeight) + 1;
|
||||
//get the list of entries clicked on
|
||||
let current_list = entries[e.currentTarget.id];
|
||||
|
||||
//if right clicked
|
||||
if (e.button === 2)
|
||||
{
|
||||
//if right clicked on an element / entry delete it
|
||||
let current = find_current(row, current_list);
|
||||
|
||||
if (current != null)
|
||||
{
|
||||
delete_element(e.currentTarget.id, current);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
mouseDown = true;
|
||||
|
||||
//if a resize bar was grabbed
|
||||
if (e.target.id === "grab")
|
||||
{
|
||||
//get the entry the resize bar is child of
|
||||
let entry = e.target.parentElement;
|
||||
//get the startRow of the entry
|
||||
let rowStart = parseInt(window.getComputedStyle(entry).gridRowStart);
|
||||
|
||||
grabbed_in_list = current_list;
|
||||
|
||||
//check if the upper or lower resize bar was grabbed
|
||||
if (row === rowStart)
|
||||
{
|
||||
//+ / - 1 to avoid select the wrong element when overlapping
|
||||
grabbed = find_current(row + 1, current_list);
|
||||
grabbedUp = true;
|
||||
} else
|
||||
{
|
||||
grabbed = find_current(row - 1, current_list);
|
||||
grabbedUp = false;
|
||||
}
|
||||
|
||||
grabbed.colorID = 1;
|
||||
|
||||
setT(!t);
|
||||
}
|
||||
//if a whole element was clicked to move
|
||||
else if (e.target.id === "entry")
|
||||
{
|
||||
let rowStart = parseInt(window.getComputedStyle(e.target).gridRowStart);
|
||||
|
||||
selectedListID = e.currentTarget.id;
|
||||
|
||||
if(rowStart === row)
|
||||
{
|
||||
selectedElement = find_current(row + 1, current_list);
|
||||
}
|
||||
else
|
||||
{
|
||||
selectedElement = find_current(row, current_list);
|
||||
}
|
||||
|
||||
selectedElement.colorID = 1;
|
||||
|
||||
setT(!t);
|
||||
|
||||
selectedOffsetTop = row - parseInt(window.getComputedStyle(e.target).gridRowStart);
|
||||
selectedOffsetBottom = parseInt(window.getComputedStyle(e.target).gridRowEnd) - row;
|
||||
}
|
||||
//single click places a new entry
|
||||
else
|
||||
{
|
||||
place_new_entry(row, current_list)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//returns internal format (0 - 96) to a string
|
||||
function internal_to_time(internal)
|
||||
{
|
||||
internal -= 1
|
||||
internal /= 4
|
||||
let integer = Math.floor(internal)
|
||||
let decimal = internal.toFixed(2);
|
||||
let minutes = Math.floor((decimal - integer) * 60);
|
||||
let minutes_string = minutes.toString().length === 1 ? "0" + minutes : minutes
|
||||
return integer + ":" + minutes_string;
|
||||
}
|
||||
|
||||
let temp = []
|
||||
for (let i = 2; i <= 96; i += 2)
|
||||
{
|
||||
temp.push(i);
|
||||
}
|
||||
|
||||
//html of the calender view
|
||||
return (
|
||||
// calender outer container, contains the calender view and resize buttons
|
||||
<div style={{display: "flex", flexDirection: "row", justifyContent: "center", alignItems: "center", gap: 5}}>
|
||||
{/* resize butto*/}
|
||||
<Button text={"-"} fontSize={25} onClick={() =>
|
||||
{
|
||||
if (cellHeight - 5 >= 10) cellHeight -= 5;
|
||||
setT(!t);
|
||||
}} width={50} height={50}/>
|
||||
{/*shows the day over the columns*/}
|
||||
<div id={t} style={{border: "5px solid #363636", borderRadius: 10}}>
|
||||
<div style={{backgroundColor: "#363636"}}>
|
||||
<div className={"wochen-tag-container"}>
|
||||
<div className={"wochen-tag font-big"}>Montag</div>
|
||||
<div className={"wochen-tag font-big"}>Dienstag</div>
|
||||
<div className={"wochen-tag font-big"}>Mittwoch</div>
|
||||
<div className={"wochen-tag font-big"}>Donnerstag</div>
|
||||
<div className={"wochen-tag font-big"}>Freitag</div>
|
||||
<div className={"wochen-tag font-big"}>Samstag</div>
|
||||
</div>
|
||||
</div>
|
||||
{/*the viewport of the actual calender*/}
|
||||
<div className={"calender-container"}>
|
||||
|
||||
{/*the content of the calender (rows and columns)*/}
|
||||
<div className={"calender-view content"} style={{height: cellHeight * 96 + 10}}>
|
||||
|
||||
{/*a row which contains all the entries of monday*/}
|
||||
<div className={"spalte"} onMouseDown={mouse_down} onMouseUp={mouse_up} onMouseMove={mouse_move}
|
||||
id={"mo"} style={{gridTemplateRows: `repeat(96, ${cellHeight}px)`}}>
|
||||
|
||||
{/*maps all monday entries to new visible div elements*/}
|
||||
{entries["mo"].map(d => (<div className={"entry"} style={{
|
||||
width: "100%",
|
||||
gridRowStart: d.start_point,
|
||||
gridRowEnd: d.end_point,
|
||||
gridColumnStart: 0,
|
||||
gridColumnEnd: 0,
|
||||
backgroundColor: colors[d.colorID],
|
||||
}} id={"entry"}>
|
||||
{/*content of the entry / element*/}
|
||||
{/*upper resize bar*/}
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
<div style={{maxHeight: "60%"}} className={"no-pointer-events"}>
|
||||
{/*shows the time span of the entry*/}
|
||||
<p>{internal_to_time(d.start_point) + " - " + internal_to_time(d.end_point)}</p>
|
||||
<p>Moduel etc.</p>
|
||||
<p>Mehr Infos</p>
|
||||
<p>Raum</p>
|
||||
</div>
|
||||
{/*lower resize bar*/}
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
</div>))}
|
||||
</div>
|
||||
{/*same as monday*/}
|
||||
<div className={"spalte"} onMouseDown={mouse_down} onMouseUp={mouse_up} onMouseMove={mouse_move}
|
||||
id={"tu"} style={{gridTemplateRows: `repeat(96, ${cellHeight}px)`}}>
|
||||
|
||||
{entries["tu"].map(d => (<div className={"entry"} style={{
|
||||
width: "100%",
|
||||
gridRowStart: d.start_point,
|
||||
gridRowEnd: d.end_point,
|
||||
backgroundColor: colors[d.colorID]
|
||||
}} id={"entry"}>
|
||||
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
<div style={{maxHeight: "60%"}} className={"no-pointer-events"}>
|
||||
<p>{internal_to_time(d.start_point) + " - " + internal_to_time(d.end_point)}</p>
|
||||
<p>Moduel etc.</p>
|
||||
<p>Mehr Infos</p>
|
||||
<p>Raum</p>
|
||||
</div>
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
</div>))}
|
||||
</div>
|
||||
{/*same as monday*/}
|
||||
<div className={"spalte"} onMouseDown={mouse_down} onMouseUp={mouse_up} onMouseMove={mouse_move}
|
||||
id={"we"} style={{gridTemplateRows: `repeat(96, ${cellHeight}px)`}}>
|
||||
|
||||
|
||||
{entries["we"].map(d => (<div className={"entry"} style={{
|
||||
width: "100%",
|
||||
gridRowStart: d.start_point,
|
||||
gridRowEnd: d.end_point,
|
||||
backgroundColor: colors[d.colorID]
|
||||
}} id={"entry"}>
|
||||
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
<div style={{maxHeight: "60%"}} className={"no-pointer-events"}>
|
||||
<p>{internal_to_time(d.start_point) + " - " + internal_to_time(d.end_point)}</p>
|
||||
<p>Moduel etc.</p>
|
||||
<p>Mehr Infos</p>
|
||||
<p>Raum</p>
|
||||
</div>
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
</div>))}
|
||||
</div>
|
||||
{/*same as monday*/}
|
||||
<div className={"spalte"} onMouseDown={mouse_down} onMouseUp={mouse_up} onMouseMove={mouse_move}
|
||||
id={"th"} style={{gridTemplateRows: `repeat(96, ${cellHeight}px)`}}>
|
||||
|
||||
{entries["th"].map(d => (<div className={"entry"} style={{
|
||||
width: "100%",
|
||||
gridRowStart: d.start_point,
|
||||
gridRowEnd: d.end_point,
|
||||
backgroundColor: colors[d.colorID]
|
||||
}} id={"entry"}>
|
||||
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
<div style={{maxHeight: "60%"}} className={"no-pointer-events"}>
|
||||
<p>{internal_to_time(d.start_point) + " - " + internal_to_time(d.end_point)}</p>
|
||||
<p>Moduel etc.</p>
|
||||
<p>Mehr Infos</p>
|
||||
<p>Raum</p>
|
||||
</div>
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
</div>))}
|
||||
</div>
|
||||
{/*same as monday*/}
|
||||
<div className={"spalte"} onMouseDown={mouse_down} onMouseUp={mouse_up} onMouseMove={mouse_move}
|
||||
id={"fr"} style={{gridTemplateRows: `repeat(96, ${cellHeight}px)`}}>
|
||||
|
||||
|
||||
{entries["fr"].map(d => (<div className={"entry"} style={{
|
||||
width: "100%",
|
||||
gridRowStart: d.start_point,
|
||||
gridRowEnd: d.end_point,
|
||||
backgroundColor: colors[d.colorID]
|
||||
}} id={"entry"}>
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
<div style={{maxHeight: "60%"}} className={"no-pointer-events"}>
|
||||
<p>{internal_to_time(d.start_point) + " - " + internal_to_time(d.end_point)}</p>
|
||||
<p>Moduel etc.</p>
|
||||
<p>Mehr Infos</p>
|
||||
<p>Raum</p>
|
||||
</div>
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
</div>))}
|
||||
</div>
|
||||
{/*same as monday*/}
|
||||
<div className={"spalte"} onMouseDown={mouse_down} onMouseUp={mouse_up} onMouseMove={mouse_move}
|
||||
id={"sa"} style={{gridTemplateRows: `repeat(96, ${cellHeight}px)`}}>
|
||||
|
||||
|
||||
{entries["sa"].map(d => (<div className={"entry"} style={{
|
||||
width: "100%",
|
||||
gridRowStart: d.start_point,
|
||||
gridRowEnd: d.end_point,
|
||||
backgroundColor: colors[d.colorID]
|
||||
}} id={"entry"}>
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
<div style={{maxHeight: "60%"}} className={"no-pointer-events"}>
|
||||
<p>{internal_to_time(d.start_point) + " - " + internal_to_time(d.end_point)}</p>
|
||||
<p>Moduel etc.</p>
|
||||
<p>Mehr Infos</p>
|
||||
<p>Raum</p>
|
||||
</div>
|
||||
<div className={"resize-grab"} id={"grab"}></div>
|
||||
</div>))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/*overlay with timeline*/}
|
||||
<div className={"overlay"} style={{backgroundColor: "rgba(0, 0, 0, 0)"}}>
|
||||
{/*maps a list of internal time stamps to lines and time stamps*/}
|
||||
{temp.map(i => (<div style={{
|
||||
width: "100%",
|
||||
height: cellHeight * 2,
|
||||
borderBottom: "1px solid #363636",
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
justifyContent: "space-around",
|
||||
alignItems: "center",
|
||||
}} className={"no-pointer-events"}>
|
||||
|
||||
<p style={{
|
||||
color: "gray",
|
||||
marginTop: cellHeight - 3,
|
||||
marginRight: 120,
|
||||
fontSize: 12,
|
||||
textAlign: "center"
|
||||
}}>{internal_to_time(i + 1)}</p>
|
||||
<p style={{
|
||||
color: "gray",
|
||||
marginTop: cellHeight - 3,
|
||||
marginRight: 120,
|
||||
fontSize: 12,
|
||||
textAlign: "center"
|
||||
}}>{internal_to_time(i + 1)}</p>
|
||||
<p style={{
|
||||
color: "gray",
|
||||
marginTop: cellHeight - 3,
|
||||
marginRight: 120,
|
||||
fontSize: 12,
|
||||
textAlign: "center"
|
||||
}}>{internal_to_time(i + 1)}</p>
|
||||
<p style={{
|
||||
color: "gray",
|
||||
marginTop: cellHeight - 3,
|
||||
marginRight: 120,
|
||||
fontSize: 12,
|
||||
textAlign: "center"
|
||||
}}>{internal_to_time(i + 1)}</p>
|
||||
<p style={{
|
||||
color: "gray",
|
||||
marginTop: cellHeight - 3,
|
||||
marginRight: 120,
|
||||
fontSize: 12,
|
||||
textAlign: "center"
|
||||
}}>{internal_to_time(i + 1)}</p>
|
||||
<p style={{
|
||||
color: "gray",
|
||||
marginTop: cellHeight - 3,
|
||||
marginRight: 120,
|
||||
fontSize: 12,
|
||||
textAlign: "center"
|
||||
}}>{internal_to_time(i + 1)}</p>
|
||||
</div>))}
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{/*the second resize button*/}
|
||||
<Button text={"+"} fontSize={25} onClick={() =>
|
||||
{
|
||||
cellHeight += 5;
|
||||
setT(!t)
|
||||
}} width={50} height={50}/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
export const arrowLeft = `<svg xmlns="http://www.w3.org/2000/svg" fill="white" class="bi bi-arrow-left" viewBox="0 0 16 16">
|
||||
<path fill-rule="evenodd" d="M15 8a.5.5 0 0 0-.5-.5H2.707l3.147-3.146a.5.5 0 1 0-.708-.708l-4 4a.5.5 0 0 0 0 .708l4 4a.5.5 0 0 0 .708-.708L2.707 8.5H14.5A.5.5 0 0 0 15 8z"/>
|
||||
</svg>`
|
||||
|
||||
export const arrowRight = `<svg xmlns="http://www.w3.org/2000/svg" fill="white" class="bi bi-arrow-right" viewBox="0 0 16 16">
|
||||
<path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h11.793l-3.147-3.146a.5.5 0 0 1 .708-.708l4 4a.5.5 0 0 1 0 .708l-4 4a.5.5 0 0 1-.708-.708L13.293 8.5H1.5A.5.5 0 0 1 1 8z"/>
|
||||
</svg>`
|
||||
|
||||
export const deleteItem = `<svg xmlns="http://www.w3.org/2000/svg" fill="black" class="bi bi-trash-fill" viewBox="0 0 16 16">
|
||||
<path d="M2.5 1a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1H3v9a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V4h.5a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H10a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1H2.5zm3 4a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 .5-.5zM8 5a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7A.5.5 0 0 1 8 5zm3 .5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 1 0z"/>
|
||||
</svg>`
|
||||
|
||||
export const editItem = `<svg xmlns="http://www.w3.org/2000/svg" fill="black" class="bi bi-pencil-fill" viewBox="0 0 16 16">
|
||||
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
||||
</svg>`
|
||||
@@ -1,405 +0,0 @@
|
||||
import Button from "@/components/Button";
|
||||
import {useRouter} from "next/router";
|
||||
import {useEffect, useState} from "react";
|
||||
import Background from "@/components/Background";
|
||||
|
||||
|
||||
let userModuleMapping = new Map()
|
||||
|
||||
export default function InputForm(p) {
|
||||
|
||||
let startDateParam = "";
|
||||
let endDateParam = "";
|
||||
let courseNameParam = "";
|
||||
|
||||
if (p.startDate != null) startDateParam = p.startDate;
|
||||
if (p.endDate != null) endDateParam = p.endDate;
|
||||
if (p.courseName != null) courseNameParam = p.courseName;
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
const [startDate, setStartDate] = useState(startDateParam);
|
||||
const [endDate, setEndDate] = useState(endDateParam);
|
||||
const [courseName, setCourseName] = useState(courseNameParam);
|
||||
const [users, setUsers] = useState([]);
|
||||
const [checkedSelected, setCheckedSelected] = useState(new Array(100).fill(false))
|
||||
const [activatedSelected, setActivatedSelected] = useState(new Array(100).fill(false))
|
||||
const [modulesNames, setModulesNames] = useState(new Array(100).fill("Please Select"))
|
||||
|
||||
async function getAllUsers() {
|
||||
console.log("update")
|
||||
let sessionid = localStorage.getItem("sessionid");
|
||||
let url = "http://localhost:8080/users/all?sessionid=" + sessionid;
|
||||
|
||||
|
||||
await fetch(url).then(response => response.json()).then(async user => {
|
||||
setUsers(user)
|
||||
let mURL = "http://localhost:8080/module/suid?sessionid=" + localStorage.getItem("sessionid") + "&semesterid=" + localStorage.getItem("currentsid") + "&userid=";
|
||||
for(let i = 0; i < user.length; i++)
|
||||
{
|
||||
mURL += user[i].id;
|
||||
if(i < user.length - 1)
|
||||
{
|
||||
mURL += "a";
|
||||
}
|
||||
}
|
||||
|
||||
fetch(mURL).then(result => result.json()).then(m => {
|
||||
let temp = []
|
||||
|
||||
for(let i = 0; i < user.length; i++)
|
||||
{
|
||||
temp.push(m[i] != null);
|
||||
}
|
||||
|
||||
setCheckedSelected(temp);
|
||||
|
||||
temp = []
|
||||
|
||||
for(let i = 0; i < user.length; i++)
|
||||
{
|
||||
temp.push(m[i] != null && m[i].activated === 1);
|
||||
|
||||
if(m[i] != null) {
|
||||
let tempModuleInfo = new UserModuleInfo();
|
||||
tempModuleInfo.setModuleName(m[i].name);
|
||||
tempModuleInfo.setActivated(m[i].activated);
|
||||
tempModuleInfo.setChecked(true);
|
||||
tempModuleInfo.setUserid(user[i].id)
|
||||
userModuleMapping.set(user[i].id, tempModuleInfo)
|
||||
}
|
||||
}
|
||||
|
||||
setActivatedSelected(temp);
|
||||
|
||||
temp = []
|
||||
|
||||
for(let i = 0; i < user.length; i++)
|
||||
{
|
||||
temp.push(m[i] == null ? "Please Select" : m[i].name);
|
||||
}
|
||||
|
||||
setModulesNames(temp);
|
||||
|
||||
});
|
||||
|
||||
for(let i = 0; i < user.length; i++)
|
||||
{
|
||||
if(!userModuleMapping.has(user[i].id)) {
|
||||
let tempModuleInfo = new UserModuleInfo();
|
||||
tempModuleInfo.setModuleName("Please Select");
|
||||
tempModuleInfo.setActivated(0);
|
||||
tempModuleInfo.setChecked(false);
|
||||
tempModuleInfo.setUserid(user[i].id)
|
||||
userModuleMapping.set(user[i].id, tempModuleInfo)
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
getAllUsers()
|
||||
userModuleMapping.clear();
|
||||
}, [])
|
||||
|
||||
|
||||
async function onCreateClicked() {
|
||||
let startSplit = startDate.split("-");
|
||||
let endSplit = endDate.split("-");
|
||||
let startYear = parseInt(startSplit[0]);
|
||||
let endYear = parseInt(endSplit[0]);
|
||||
|
||||
//month - 1 because jan = 0, day like month... but because of next lines 3 to 4 not - 1
|
||||
let startInternalDate = new Date(startYear, parseInt(startSplit[1]) - 1, parseInt(startSplit[2]))
|
||||
let endInternalDate = new Date(endYear, parseInt(endSplit[1]) - 1, parseInt(endSplit[2]))
|
||||
|
||||
let startDayInYear = Math.round((startInternalDate - new Date(startYear, 0, 0)) / (1000 * 60 * 60 * 24));
|
||||
let endDayInYear = Math.round((endInternalDate - new Date(endYear, 0, 0)) / (1000 * 60 * 60 * 24));
|
||||
|
||||
let id = p.courseName == null ? 0 : localStorage.getItem("currentsid");
|
||||
|
||||
let json = {
|
||||
"id": id,
|
||||
"startday": startDayInYear,
|
||||
"endday": endDayInYear,
|
||||
"name": courseName,
|
||||
"startyear": startYear,
|
||||
"endyear": endYear
|
||||
}
|
||||
|
||||
let url = "http://localhost:8080/semester?sessionid=" + localStorage.getItem("sessionid");
|
||||
let method = p.courseName == null ? "POST" : "PUT";
|
||||
|
||||
|
||||
let semesterid = localStorage.getItem("currentsid");
|
||||
let tempsid = 0;
|
||||
await fetch(url, {
|
||||
method: method,
|
||||
headers: {"Content-Type": "application/json"},
|
||||
body: JSON.stringify(json)
|
||||
}).then(response => response.json()).then(semester => {
|
||||
tempsid = semester.id
|
||||
});
|
||||
|
||||
|
||||
if (method === "POST") {
|
||||
semesterid = tempsid;
|
||||
}
|
||||
|
||||
for (let [key, value] of userModuleMapping) {
|
||||
|
||||
let json1 = {
|
||||
"id": 0,
|
||||
"userid": value.getUserid(),
|
||||
"semesterid": semesterid,
|
||||
"name": value.getModuleName(),
|
||||
"activated": value.getActivated()
|
||||
}
|
||||
if (value.getChecked()) {
|
||||
let updateURL = "http://localhost:8080/module?sessionid=" + localStorage.getItem("sessionid");
|
||||
await fetch(updateURL, {
|
||||
method: method,
|
||||
headers: {"Content-Type": "application/json"},
|
||||
body: JSON.stringify(json1)
|
||||
})
|
||||
}
|
||||
else
|
||||
{
|
||||
let deleteURL = "http://localhost:8080/module?sessionid=" + localStorage.getItem("sessionid") +
|
||||
"&semesterid=" + semesterid +
|
||||
"&userid=" + value.getUserid();
|
||||
await fetch(deleteURL, {
|
||||
method: "DELETE"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
router.back();
|
||||
}
|
||||
|
||||
class UserModuleInfo {
|
||||
constructor() {
|
||||
this.moduleName = "";
|
||||
this.userid = 0;
|
||||
this.activated = 0
|
||||
this.checked = false
|
||||
}
|
||||
|
||||
getModuleName() {
|
||||
return this.moduleName
|
||||
}
|
||||
|
||||
getUserid() {
|
||||
return this.userid
|
||||
}
|
||||
|
||||
getActivated() {
|
||||
return this.activated
|
||||
}
|
||||
|
||||
getChecked() {
|
||||
return this.checked
|
||||
}
|
||||
|
||||
setModuleName(name) {
|
||||
this.moduleName = name
|
||||
}
|
||||
|
||||
setUserid(id) {
|
||||
this.userid = id
|
||||
}
|
||||
|
||||
setActivated(a) {
|
||||
this.activated = a
|
||||
}
|
||||
|
||||
setChecked(b) {
|
||||
this.checked = b
|
||||
}
|
||||
}
|
||||
|
||||
function onModuleClicked(user, module, index) {
|
||||
|
||||
if (userModuleMapping.has(user.id)) {
|
||||
let temp = userModuleMapping.get(user.id)
|
||||
temp.setModuleName(module)
|
||||
temp.setUserid(user.id)
|
||||
}
|
||||
|
||||
let temp = [];
|
||||
|
||||
for(let i = 0; i < modulesNames.length; i++)
|
||||
{
|
||||
temp.push(modulesNames[i]);
|
||||
}
|
||||
|
||||
temp[index] = module;
|
||||
|
||||
setModulesNames(temp);
|
||||
}
|
||||
|
||||
function onSelectedCheckBox(user, state, index) {
|
||||
if (userModuleMapping.has(user.id)) {
|
||||
userModuleMapping.get(user.id).setChecked(state.target.checked);
|
||||
} else {
|
||||
let temp = new UserModuleInfo()
|
||||
temp.setChecked(state.target.checked)
|
||||
temp.setUserid(user.id)
|
||||
userModuleMapping.set(user.id, temp)
|
||||
}
|
||||
let temp = []
|
||||
|
||||
for(let i = 0; i < checkedSelected.length; i++)
|
||||
{
|
||||
temp.push(checkedSelected[i]);
|
||||
}
|
||||
|
||||
temp[index] = state.target.checked;
|
||||
|
||||
setCheckedSelected(temp);
|
||||
|
||||
}
|
||||
|
||||
function onActivatedCheckBox(user, state, index) {
|
||||
if (userModuleMapping.has(user.id)) {
|
||||
let t = state.target.checked ? 1 : 0;
|
||||
userModuleMapping.get(user.id).setActivated(t);
|
||||
console.log(userModuleMapping.get(user.id).getActivated())
|
||||
}
|
||||
|
||||
let temp = []
|
||||
|
||||
for(let i = 0; i < checkedSelected.length; i++)
|
||||
{
|
||||
temp.push(activatedSelected[i]);
|
||||
}
|
||||
|
||||
temp[index] = state.target.checked;
|
||||
|
||||
setActivatedSelected(temp);
|
||||
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Background/>
|
||||
<div className="inputForm box-shadow">
|
||||
<p style={{
|
||||
fontSize: "18px",
|
||||
color: "#777777",
|
||||
fontWeight: 500,
|
||||
width: 150
|
||||
}}>SemesterName</p>
|
||||
<input className="courseNameInput box-shadow" value={courseName}
|
||||
onChange={(e) => setCourseName(e.target.value)}/>
|
||||
<div className="semesterRangeInput">
|
||||
<div className="semesterDateLables">
|
||||
<p className="semesterDateLable" style={{
|
||||
fontSize: " 18px",
|
||||
color: "#777777",
|
||||
fontWeight: 500,
|
||||
width: 150
|
||||
}}>Semesterstart</p>
|
||||
<p className="semesterDateLable" style={{
|
||||
fontSize: " 18px",
|
||||
color: "#777777",
|
||||
fontWeight: 500,
|
||||
width: 150
|
||||
}}>Semesterende</p>
|
||||
</div>
|
||||
<div className="semesterDateInputPair">
|
||||
<input type="date" id="start" className={"box-shadow selector"} value={startDate}
|
||||
style={{padding: 5}}
|
||||
onChange={(e) => setStartDate(e.target.value)}/>
|
||||
<p className="inputFieldSeperator">-</p>
|
||||
<input type="date" id="start" className={"box-shadow selector"} value={endDate}
|
||||
style={{padding: 5}}
|
||||
onChange={(e) => setEndDate(e.target.value)}/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="round-border dozentSelector">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th style={{
|
||||
fontSize: " 18px",
|
||||
color: "#777777",
|
||||
fontWeight: 500,
|
||||
}}>Wählen
|
||||
</th>
|
||||
<th style={{
|
||||
fontSize: " 18px",
|
||||
color: "#777777",
|
||||
fontWeight: 500,
|
||||
}}>Freischalten
|
||||
</th>
|
||||
<th style={{
|
||||
fontSize: " 18px",
|
||||
color: "#777777",
|
||||
fontWeight: 500,
|
||||
textAlign: "center"
|
||||
}}>Dozent
|
||||
</th>
|
||||
<th style={{
|
||||
fontSize: " 18px",
|
||||
color: "#777777",
|
||||
fontWeight: 500,
|
||||
textAlign: "center",
|
||||
}}>Modul
|
||||
</th>
|
||||
</tr>
|
||||
{users.map((user, i) => (
|
||||
<tr>
|
||||
|
||||
<td>
|
||||
<div style={{
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
justifyContent: "center",
|
||||
}}><input type="checkbox" onChange={(e) => {
|
||||
onSelectedCheckBox(user, e, i)
|
||||
}} checked={checkedSelected[i]}/></div>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<div style={{
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
justifyContent: "center",
|
||||
}}><input type="checkbox" onChange={(e) => {
|
||||
onActivatedCheckBox(user, e, i);
|
||||
}} checked={activatedSelected[i]}/></div>
|
||||
</td>
|
||||
<td style={{textAlign: "center"}}>{user.firstName + " " + user.lastName}</td>
|
||||
<select id={"userSelect"} name={"userSelect"} className={"box-shadow selector"}
|
||||
multiple={false} style={{
|
||||
maxHeight: 80,
|
||||
marginTop: 10,
|
||||
padding: "5px 2px"
|
||||
}} onChange={(e) => {
|
||||
onModuleClicked(user, e.target.value, i)
|
||||
}} value={modulesNames[i]}>
|
||||
<option value={"Please Select"}>Please Select</option>
|
||||
<option value={"Programmieren"}>Programmieren</option>
|
||||
<option value={"BWL"}>BWL</option>
|
||||
<option value={"Lineare Algebra"}>Lineare Algebra</option>
|
||||
<option value={"Analysis"}>Analysis</option>
|
||||
<option value={"AnwendungsProjekt"}>AnwendungsProjekt</option>
|
||||
</select>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div id="buttons">
|
||||
<Button color="rgba(54,54,54,0.64)" width="100px" height="30px" text="Abbrechen" onClick={() => {
|
||||
router.back()
|
||||
}}/>
|
||||
<Button color="#77932b" width="100px" height="30px" text="Speichern" onClick={() => {
|
||||
onCreateClicked()
|
||||
}}/>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
import React, {useState} from "react";
|
||||
import Button from "@/components/Button";
|
||||
import {NextResponse} from "next/server";
|
||||
import Link from "next/link";
|
||||
import {useRouter} from "next/router";
|
||||
|
||||
export default function Login() {
|
||||
|
||||
let url = "http://localhost:8080/users"
|
||||
|
||||
async function on_login_click() {
|
||||
url += "?mail=" + inputUserName + "&password=" + inputPassword;
|
||||
|
||||
let response = await fetch(url, {
|
||||
method: "GET",
|
||||
});
|
||||
|
||||
let reader = response.body.getReader();
|
||||
let value = String.fromCharCode.apply(null, ((await reader.read()).value))
|
||||
if (value != "failed") {
|
||||
localStorage.setItem("sessionid", value);
|
||||
|
||||
await router.push("/semesteroverview")
|
||||
|
||||
} else {
|
||||
setInputPassword("");
|
||||
setInputUserName("");
|
||||
setHint("wrong login credentials")
|
||||
}
|
||||
}
|
||||
|
||||
const [inputUserName, setInputUserName] = useState("")
|
||||
const [inputPassword, setInputPassword] = useState("")
|
||||
const [hint, setHint] = useState("type here")
|
||||
const [backgroundColor, setBackgroundColor] = useState("rgb(255, 255, 255)")
|
||||
const router = useRouter()
|
||||
|
||||
return (
|
||||
// <div className="border">
|
||||
<login className={"login-container box-shadow"}>
|
||||
<p className={"font-big-fat placement"}>Login</p>
|
||||
<div className={"placement"}>
|
||||
<br/>
|
||||
<p className={"font-kinda-big"}>Username</p>
|
||||
<input type="text" value={inputUserName} onChange={e => setInputUserName(e.target.value)}
|
||||
placeholder={hint} className="input input-bordered input-sm w-full max-w-xs box-shadow"
|
||||
style={{
|
||||
backgroundColor: backgroundColor
|
||||
}}/>
|
||||
<br/>
|
||||
<p className={"font-kinda-big"}>Password</p>
|
||||
<input type="password" value={inputPassword} onChange={e => setInputPassword(e.target.value)}
|
||||
placeholder={hint} className="input input-bordered input-sm w-full max-w-xs box-shadow"
|
||||
style={{
|
||||
backgroundColor: backgroundColor
|
||||
}}/>
|
||||
</div>
|
||||
|
||||
<Button text={"Login"} color={"#77932b"} width={100} height={40} onClick={() => on_login_click()}/>
|
||||
|
||||
|
||||
</login>
|
||||
// </div>
|
||||
);
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
import Button from "@/components/Button";
|
||||
import {useRouter} from "next/router";
|
||||
|
||||
export default function Logout()
|
||||
{
|
||||
const router = useRouter()
|
||||
|
||||
async function logout()
|
||||
{
|
||||
let url = "http://localhost:8080/users/logout?sessionid=" + localStorage.getItem("sessionid");
|
||||
await fetch(url)
|
||||
await router.push("/")
|
||||
}
|
||||
|
||||
return (
|
||||
<div style={{
|
||||
position: "absolute",
|
||||
left: 20,
|
||||
top: 20,
|
||||
width: 130,
|
||||
height: 60,
|
||||
borderBottomRightRadius: 10,
|
||||
|
||||
}}>
|
||||
<Button onClick={() => logout()} text={"Logout"} color={"#77932b"} width={100} height={40}/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
import Button from "@/components/Button";
|
||||
import {useState} from "react";
|
||||
|
||||
let shown = false;
|
||||
|
||||
export default function PopUp(p) {
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<div style={{
|
||||
display: p.displayState
|
||||
}}>
|
||||
|
||||
<div className={"modal-container"}>
|
||||
<div className={"modal box-shadow"}>
|
||||
<p className={"font-middle"}>{p.hint}</p>
|
||||
<div>
|
||||
<Button text={p.text1} color={"rgba(54,54,54,0.64)"} onClick={p.function1}/>
|
||||
<Button text={p.text2} color={"#77932b"} onClick={p.function2}/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
import StatusBar from "@/components/StatusBar";
|
||||
import React, {useEffect} from "react";
|
||||
import Button from "@/components/Button";
|
||||
import {deleteItem, editItem} from "@/components/Icons";
|
||||
|
||||
export default function SemesterTile(p)
|
||||
{
|
||||
useEffect(() =>
|
||||
{
|
||||
window.addEventListener("contextmenu", (e) => (e.preventDefault()))
|
||||
})
|
||||
|
||||
return (
|
||||
<div onClick={(e) => p.onClick(e)} className={"semester-tile box-shadow"}>
|
||||
<p>{p.text}</p>
|
||||
<StatusBar progress={0}/>
|
||||
<div style={{
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
justifyContent: "center",
|
||||
alignItems: "center",
|
||||
gap: 5
|
||||
}}>
|
||||
<Button icon={deleteItem} width={30} height={30} color={"#ffffff"} onClick={p.onButtonDeleteClick}/>
|
||||
<Button icon={editItem} width={30} height={30} color={"#ffffff"} onClick={p.onButtonEditClick}/>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
import React from "react"
|
||||
|
||||
export default function StatusBar(p)
|
||||
{
|
||||
if(p.progress > 100) p.progress = 100;
|
||||
let classNames = ["not-started", "started", "finished"];
|
||||
let index = p.progress / 50;
|
||||
|
||||
let actives = ["", "", ""]
|
||||
actives[index] = "active";
|
||||
|
||||
return (
|
||||
<div className={"step-container"}>
|
||||
<div className={"steps"}>
|
||||
<span className={"step " + classNames[0] + " " + actives[0]}>1</span>
|
||||
<span className={"step " + classNames[1] + " " + actives[1]}>2</span>
|
||||
<span className={"step " + classNames[2] + " " + actives[2]}>3</span>
|
||||
<div className={"progress-bar " + classNames[index]}
|
||||
style={{
|
||||
width: p.progress + "%"
|
||||
}}
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
export default function Test(p)
|
||||
{
|
||||
|
||||
// let datum = new Date(2023, 1, 10);
|
||||
// let start = new Date(datum.getFullYear(), 0, 0);
|
||||
//
|
||||
// let difference = (datum - start) / (1000 * 60 * 60 * 24)
|
||||
|
||||
|
||||
let day = 41
|
||||
let datum = new Date(2023, 0, 30)
|
||||
|
||||
return (
|
||||
|
||||
<div>
|
||||
<p>{datum.getMonth()}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
import React from 'react';
|
||||
|
||||
const Tile = () => {
|
||||
const [isHovered, setIsHovered] = React.useState(false);
|
||||
const [cursorPosition, setCursorPosition] = React.useState({ x: 0, y: 0 });
|
||||
const tileRef = React.useRef(null);
|
||||
|
||||
const handleMouseEnter = () => {
|
||||
setIsHovered(true);
|
||||
};
|
||||
|
||||
const handleMouseLeave = () => {
|
||||
setIsHovered(false);
|
||||
};
|
||||
|
||||
const handleMouseMove = (event) => {
|
||||
if (tileRef.current) {
|
||||
const rect = tileRef.current.getBoundingClientRect();
|
||||
setCursorPosition({
|
||||
x: event.clientX - rect.left,
|
||||
y: event.clientY - rect.top,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={tileRef}
|
||||
onMouseEnter={handleMouseEnter}
|
||||
onMouseLeave={handleMouseLeave}
|
||||
onMouseMove={handleMouseMove}
|
||||
style={{
|
||||
backgroundColor: 'rgba(255,0,0,0.89)',
|
||||
width: '250px',
|
||||
height: '150px',
|
||||
margin: '10px',
|
||||
transition: 'transform 0.2s',
|
||||
transform: isHovered ? 'translateY(-5px)' : 'none',
|
||||
position: 'relative',
|
||||
borderRadius: '10px',
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<span style = {{ color: 'white', fontWeight: 'bold'}}>Kalender</span>
|
||||
|
||||
|
||||
{isHovered && (
|
||||
<div
|
||||
style={{
|
||||
position: 'absolute',
|
||||
top: cursorPosition.y - 10,
|
||||
left: cursorPosition.x - 10,
|
||||
width: '20px',
|
||||
height: '20px',
|
||||
borderRadius: '50%',
|
||||
background:
|
||||
'radial-gradient(circle at center, rgba(255, 255, 255) 0%, rgba(255,255,255,0) 70%)',
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Tile;
|
||||
@@ -1,20 +0,0 @@
|
||||
import Button from "@/components/Button";
|
||||
import DateElement from "@/components/DateElement";
|
||||
import { arrowLeft } from "./Icons"
|
||||
import { arrowRight } from "./Icons"
|
||||
import { useState } from 'react'
|
||||
|
||||
|
||||
|
||||
export default function WeekSelector(){
|
||||
const [weeks, setWeeks] = useState(0)
|
||||
return (
|
||||
<>
|
||||
<div className="weekSelector">
|
||||
<Button icon={arrowLeft} onClick={() => setWeeks(weeks-1)} />
|
||||
<DateElement week={weeks}/>
|
||||
<Button icon={arrowRight} onClick={() => setWeeks(weeks+1)}/>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
import '@/styles/globals.css'
|
||||
import '@/styles/calendarSideBar.css'
|
||||
|
||||
export default function App({ Component, pageProps }) {
|
||||
return <Component {...pageProps} />
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
|
||||
|
||||
export default function handler(req, res) {
|
||||
res.status(200).json({ name: 'John Doe' })
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
import InputForm from "@/components/InputForm";
|
||||
import {useRouter} from "next/router";
|
||||
import Logout from "@/components/Logout";
|
||||
import {useEffect} from "react";
|
||||
|
||||
export default function CreateSemester()
|
||||
{
|
||||
const router = useRouter();
|
||||
let {courseName, startDate, endDate} = router.query;
|
||||
|
||||
|
||||
return (
|
||||
<div className={"normal-centered"}>
|
||||
<Logout/>
|
||||
<InputForm startDate={startDate} endDate={endDate} courseName={courseName}/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import {Inter} from 'next/font/google'
|
||||
import React, {useState} from "react";
|
||||
import StatusBar from "@/components/StatusBar";
|
||||
import Button from "@/components/Button";
|
||||
import {arrowLeft, arrowRight} from "@/components/Icons";
|
||||
import WeekSelector from "@/components/WeekSelector";
|
||||
import PopUp from "@/components/PopUp";
|
||||
import CalenderView from "@/components/CalenderView";
|
||||
import DateElement from "@/components/DateElement";
|
||||
import InputForm from "@/components/InputForm";
|
||||
import Login from "@/components/Login";
|
||||
import Test from "@/components/Test";
|
||||
import BasicDateCalendar from "@/components/CalendarSideBar";
|
||||
import {randomInt} from "next/dist/shared/lib/bloom-filter/utils";
|
||||
import Background from "@/components/Background";
|
||||
|
||||
|
||||
const inter = Inter({subsets: ['latin']})
|
||||
|
||||
export default function Home(p) {
|
||||
|
||||
return (
|
||||
|
||||
|
||||
<div className={"normal-centered"}>
|
||||
<Background/>
|
||||
<h1 style={{
|
||||
fontSize: 40,
|
||||
fontWeight: "bold",
|
||||
color: "#77932b",
|
||||
marginBottom: "5%",
|
||||
textShadow: "2px 2px 2px rgba(0, 0, 0, 0.2)",
|
||||
textAlign: "center"
|
||||
}}>Willkommen in deinem Vorlesungsplaner</h1>
|
||||
<Login/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
import Button from "@/components/Button";
|
||||
import React, {useEffect, useState} from "react";
|
||||
import SemesterTile from "@/components/SemesterTile";
|
||||
import InputForm from "@/components/InputForm";
|
||||
import {useRouter} from "next/router";
|
||||
import PopUp from "@/components/PopUp";
|
||||
import Background from "@/components/Background";
|
||||
import Logout from "@/components/Logout";
|
||||
|
||||
export default function SemesterOverview(p)
|
||||
{
|
||||
async function getSemesters()
|
||||
{
|
||||
let urlTest = "http://localhost:8080/semester/all?sessionid=" + localStorage.getItem("sessionid");
|
||||
|
||||
|
||||
await fetch(urlTest).then(response => response.json()).then(s => {
|
||||
setEntries(s)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
function onClickSemester(e, m)
|
||||
{
|
||||
if(m.target === m.currentTarget)
|
||||
{
|
||||
localStorage.setItem("currentsid", e.id)
|
||||
}
|
||||
}
|
||||
|
||||
function onClickNewSemester()
|
||||
{
|
||||
localStorage.setItem("currentsid", 0);
|
||||
router.push("/createSemester");
|
||||
}
|
||||
|
||||
|
||||
function togglePopup()
|
||||
{
|
||||
if(modalDisplay === "block")
|
||||
{
|
||||
setModalDisplay("none");
|
||||
}
|
||||
else
|
||||
{
|
||||
setModalDisplay("block");
|
||||
}
|
||||
}
|
||||
|
||||
function funcButtonAbort()
|
||||
{
|
||||
togglePopup();
|
||||
}
|
||||
|
||||
async function funcButtonDelete()
|
||||
{
|
||||
let id = localStorage.getItem("currentsid");
|
||||
let url = "http://localhost:8080/semester?sessionid=" + localStorage.getItem("sessionid") + "&id=" + id;
|
||||
await fetch(url, {
|
||||
method: "DELETE"
|
||||
});
|
||||
|
||||
togglePopup();
|
||||
getSemesters();
|
||||
}
|
||||
|
||||
async function funcButtonEdit(e, m)
|
||||
{
|
||||
|
||||
localStorage.setItem("currentsid", e.id);
|
||||
let semester = e;
|
||||
|
||||
let startYear = semester.startyear;
|
||||
let endYear = semester.endyear;
|
||||
let startDay = semester.startday;
|
||||
let endDay = semester.endday;
|
||||
//+1 because input field shows date in another way then the date object does
|
||||
let startDate = new Date(startYear, 0, startDay + 1);
|
||||
let endDate = new Date(endYear, 0, endDay + 1);
|
||||
|
||||
await router.push({
|
||||
pathname: "/createSemester",
|
||||
query: {courseName: semester.name, startDate: startDate.toISOString().slice(0, 10), endDate: endDate.toISOString().slice(0, 10)},
|
||||
});
|
||||
getSemesters();
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
getSemesters();
|
||||
|
||||
}, [])
|
||||
|
||||
|
||||
const [entries, setEntries] = useState([])
|
||||
const [modalDisplay, setModalDisplay] = useState("none");
|
||||
const [modalHint, setModalHint] = useState("");
|
||||
const router = useRouter()
|
||||
|
||||
return (
|
||||
<div className={"semester-overview"}>
|
||||
<Logout/>
|
||||
<Background/>
|
||||
{
|
||||
entries.map(e => (<SemesterTile text={e.name} onClick={(f) => onClickSemester(e, f)} onButtonDeleteClick={() => {
|
||||
localStorage.setItem("currentsid", e.id)
|
||||
setModalHint(e.name + " Löschen?");
|
||||
togglePopup();
|
||||
}} onButtonEditClick={(m) => {
|
||||
localStorage.setItem("currentsid", e.id)
|
||||
funcButtonEdit(e, m);
|
||||
}}/>))
|
||||
}
|
||||
<Button color={"#dcdcdc"} text={"+"} width={240} height={160} fontColor={"black"} fontSize={50}
|
||||
onClick={() => onClickNewSemester()}/>
|
||||
<PopUp hint={modalHint} text1={"Abbrechen"} text2={"Löschen"} displayState={modalDisplay}
|
||||
function1={funcButtonAbort} function2={funcButtonDelete}/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
||||
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
||||
sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.A
|
||||
{
|
||||
border: 2px solid;
|
||||
border-color: black;
|
||||
border-radius: 20px;
|
||||
margin: 2px;
|
||||
background: linear-gradient(to bottom, #FFC1C1, #CD3333);
|
||||
}
|
||||
|
||||
.Days
|
||||
{
|
||||
display: inline-grid;
|
||||
grid-template-columns: repeat(7, 1fr);
|
||||
grid-template-rows: repeat(5, 1fr);
|
||||
height: 50%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.Down
|
||||
{
|
||||
border-radius: 20px;
|
||||
display: inline-grid;
|
||||
grid-column: auto;
|
||||
height: 200%;
|
||||
width: 20%;
|
||||
}
|
||||
@@ -1,531 +0,0 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
:root {
|
||||
--foreground-rgb: 0, 0, 0;
|
||||
--background-start-rgb: 255, 255, 255;
|
||||
--background-end-rgb: 255, 255, 255;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #f2f2f2;
|
||||
|
||||
}
|
||||
|
||||
.splash {
|
||||
position: absolute;
|
||||
border-radius: 70px;
|
||||
background-color: #c77c0c;
|
||||
|
||||
z-index: -5;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Page Layouts
|
||||
*/
|
||||
|
||||
.normal-centered {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.semester-overview {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
align-content: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
body {
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.box-shadow
|
||||
{
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.box-shadow-heavy
|
||||
{
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0,1);
|
||||
}
|
||||
|
||||
/*
|
||||
Button
|
||||
*/
|
||||
.round-border {
|
||||
border-radius: 10px;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
.font-small {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.font-middle {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.font-big {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.button {
|
||||
background-color: #363636;
|
||||
padding: 5px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.button:hover
|
||||
{
|
||||
filter: brightness(0.65);
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
background-color: #585858;
|
||||
}
|
||||
|
||||
/*
|
||||
Step Progress Bar
|
||||
*/
|
||||
|
||||
.step-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
max-width: 400px;
|
||||
}
|
||||
|
||||
.steps {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 20px;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.step {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.steps .not-started {
|
||||
/*background-image: linear-gradient(#b42121, #b44821);*/
|
||||
background-color: #77932b;
|
||||
|
||||
}
|
||||
|
||||
.steps .started {
|
||||
/*background-image: linear-gradient(#c75c0c, #c77c0c);*/
|
||||
background-color: #77932b;
|
||||
}
|
||||
|
||||
|
||||
.steps .finished {
|
||||
/*background-image: linear-gradient(#43C20BFF, #0bc27c);*/
|
||||
background-color: #77932b;
|
||||
}
|
||||
|
||||
|
||||
.steps .active {
|
||||
/*border-width: 2px;*/
|
||||
/*border-color: #1e2428;*/
|
||||
background-color: #346991;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
position: absolute;
|
||||
height: 8px;
|
||||
background-color: #5d606e;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
/*
|
||||
weekSelector
|
||||
*/
|
||||
|
||||
.dateElement {
|
||||
display: flex;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
height: 50px;
|
||||
width: 200px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: #0d52ce;
|
||||
}
|
||||
|
||||
.weekSelector {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/*
|
||||
Popup
|
||||
*/
|
||||
|
||||
.modal-container {
|
||||
z-index: 1;
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
.modal {
|
||||
height: 180px;
|
||||
width: 300px;
|
||||
border-radius: 10px;
|
||||
background-color: rgb(255, 255, 255);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 20px;
|
||||
animation-name: modalgrow;
|
||||
animation-duration: 0.2s;
|
||||
animation-play-state: running;
|
||||
}
|
||||
|
||||
@keyframes modalgrow {
|
||||
from
|
||||
{
|
||||
height: 90px;
|
||||
width: 150px;
|
||||
}
|
||||
to
|
||||
{
|
||||
height: 180px;
|
||||
width: 300px;
|
||||
}
|
||||
}
|
||||
|
||||
.modal p {
|
||||
text-align: center;
|
||||
pointer-events: none;
|
||||
font-weight: bold;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.modal div {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
justify-content: end;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
Calender View
|
||||
*/
|
||||
|
||||
|
||||
.calender-container {
|
||||
max-height: 600px;
|
||||
overflow-y: scroll;
|
||||
display: grid;
|
||||
}
|
||||
|
||||
.calender-container::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.content {
|
||||
grid-area: 1 / 1;
|
||||
}
|
||||
|
||||
.overlay {
|
||||
padding: 2px 0 0 0;
|
||||
grid-area: 1 / 1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.no-pointer-events {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.wochen-tag-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
height: 60px;
|
||||
width: 1000px;
|
||||
gap: 5px;
|
||||
padding: 0 0 5px 0;
|
||||
background-color: #363636;
|
||||
}
|
||||
|
||||
.calender-view {
|
||||
width: 1000px;
|
||||
height: 2400px;
|
||||
background-color: #363636;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: stretch;
|
||||
justify-content: stretch;
|
||||
gap: 5px;
|
||||
user-select: none;
|
||||
padding: 2px 0 0 0;
|
||||
}
|
||||
|
||||
.calender-view .spalte {
|
||||
border-radius: 10px;
|
||||
width: 400px;
|
||||
background-color: white;
|
||||
display: grid;
|
||||
padding: 0 3px;
|
||||
grid-template-columns: 100%;
|
||||
}
|
||||
|
||||
.wochen-tag-container .wochen-tag {
|
||||
text-align: center;
|
||||
background-color: #f80000;
|
||||
width: 400px;
|
||||
color: white;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
grid-row-start: 1;
|
||||
grid-row-end: 4;
|
||||
}
|
||||
|
||||
.entry {
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
padding: 0 2px;
|
||||
align-items: center;
|
||||
cursor: move;
|
||||
z-index: 10;
|
||||
overflow: hidden;
|
||||
margin-top: 1px;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.entry .resize-grab {
|
||||
height: 5px;
|
||||
cursor: ns-resize;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
.entry p {
|
||||
color: white;
|
||||
font-size: 16px;
|
||||
cursor: default;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/*
|
||||
inputForm
|
||||
*/
|
||||
|
||||
input {
|
||||
border-width: 2px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.courseNameInput {
|
||||
width: 300px;
|
||||
padding: 5px;
|
||||
border: none;
|
||||
background-color: white;
|
||||
border-radius: 5px;
|
||||
font-family: Arial, serif;
|
||||
}
|
||||
|
||||
.selector
|
||||
{
|
||||
border-width: 0;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.semesterDateInput {
|
||||
width: 150px;
|
||||
padding: 5px;
|
||||
border: none;
|
||||
background-color: white;
|
||||
border-radius: 5px;
|
||||
font-family: Arial, serif;
|
||||
}
|
||||
|
||||
.semesterDateLables, .semesterDateInputPair {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: left;
|
||||
padding: 0;
|
||||
border: none;
|
||||
background-color: white;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.inputFieldSeperator {
|
||||
width: 40px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.semesterDateLable {
|
||||
margin-right: 32px;
|
||||
}
|
||||
|
||||
.semesterRangeInput {
|
||||
margin-top: 50px;
|
||||
}
|
||||
|
||||
.inputForm {
|
||||
width: 600px;
|
||||
height: 600px;
|
||||
padding: 20px;
|
||||
/*border: solid;*/
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
#buttons {
|
||||
align-self: flex-end;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-end;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.dozentSelector {
|
||||
height: 350px;
|
||||
/*border: solid;*/
|
||||
margin-top: 20px;
|
||||
width: 500px;
|
||||
padding: 10px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
/*
|
||||
Login
|
||||
*/
|
||||
|
||||
.login-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
/*gap: 10px;*/
|
||||
border-radius: 10px;
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
width: 375px;
|
||||
height: 350px;
|
||||
}
|
||||
|
||||
|
||||
.input-bordered {
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.input {
|
||||
padding: 5px;
|
||||
border: none;
|
||||
background-color: white;
|
||||
border-radius: 5px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.input:focus
|
||||
{
|
||||
outline: none;
|
||||
}
|
||||
|
||||
|
||||
.placement {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: left;
|
||||
}
|
||||
|
||||
.font-kinda-big {
|
||||
font-size: 18px;
|
||||
color: #777777;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.font-big-fat {
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.input-sm {
|
||||
height: 2rem /* 32px */;
|
||||
padding-left: 0.75rem /* 12px */;
|
||||
padding-right: 0.75rem /* 12px */;
|
||||
font-size: 0.875rem /* 14px */;
|
||||
line-height: 2rem /* 32px */;
|
||||
}
|
||||
|
||||
/**
|
||||
SemesterTile
|
||||
*/
|
||||
|
||||
.semester-tile {
|
||||
background-color: #ffffff;
|
||||
width: 240px;
|
||||
height: 160px;
|
||||
color: black;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 20px;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.semester-tile:hover {
|
||||
background-color: #e1e1e1;
|
||||
}
|
||||
|
||||
.semester-tile p {
|
||||
pointer-events: none;
|
||||
font-weight: bold;
|
||||
font-size: 23px;
|
||||
}
|
||||
|
||||
.semester-tile .step-container {
|
||||
pointer-events: none;
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
|
||||
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
|
||||
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
|
||||
],
|
||||
theme: {
|
||||
extend: {
|
||||
backgroundImage: {
|
||||
'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
|
||||
'gradient-conic':
|
||||
'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
HELP.md
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
@@ -1,18 +0,0 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
|
||||
@@ -1,316 +0,0 @@
|
||||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Maven Start Up Batch script
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# M2_HOME - location of maven2's installed home dir
|
||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
# e.g. to debug Maven itself, use
|
||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||
|
||||
if [ -f /usr/local/etc/mavenrc ] ; then
|
||||
. /usr/local/etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f /etc/mavenrc ] ; then
|
||||
. /etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.mavenrc" ] ; then
|
||||
. "$HOME/.mavenrc"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# OS specific support. $var _must_ be set to either true or false.
|
||||
cygwin=false;
|
||||
darwin=false;
|
||||
mingw=false
|
||||
case "`uname`" in
|
||||
CYGWIN*) cygwin=true ;;
|
||||
MINGW*) mingw=true;;
|
||||
Darwin*) darwin=true
|
||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if [ -x "/usr/libexec/java_home" ]; then
|
||||
export JAVA_HOME="`/usr/libexec/java_home`"
|
||||
else
|
||||
export JAVA_HOME="/Library/Java/Home"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=`java-config --jre-home`
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$M2_HOME" ] ; then
|
||||
## resolve links - $0 may be a link to maven's home
|
||||
PRG="$0"
|
||||
|
||||
# need this for relative symlinks
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG="`dirname "$PRG"`/$link"
|
||||
fi
|
||||
done
|
||||
|
||||
saveddir=`pwd`
|
||||
|
||||
M2_HOME=`dirname "$PRG"`/..
|
||||
|
||||
# make it fully qualified
|
||||
M2_HOME=`cd "$M2_HOME" && pwd`
|
||||
|
||||
cd "$saveddir"
|
||||
# echo Using m2 at $M2_HOME
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --unix "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME="`(cd "$M2_HOME"; pwd)`"
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
javaExecutable="`which javac`"
|
||||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
|
||||
# readlink(1) is not available as standard on Solaris 10.
|
||||
readLink=`which readlink`
|
||||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
|
||||
if $darwin ; then
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
|
||||
else
|
||||
javaExecutable="`readlink -f \"$javaExecutable\"`"
|
||||
fi
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
|
||||
JAVA_HOME="$javaHome"
|
||||
export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$JAVACMD" ] ; then
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
else
|
||||
JAVACMD="`\\unset -f command; \\command -v java`"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||
echo " We cannot execute $JAVACMD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
echo "Warning: JAVA_HOME environment variable is not set."
|
||||
fi
|
||||
|
||||
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
|
||||
|
||||
# traverses directory structure from process work directory to filesystem root
|
||||
# first directory with .mvn subdirectory is considered project base directory
|
||||
find_maven_basedir() {
|
||||
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Path not specified to find_maven_basedir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
basedir="$1"
|
||||
wdir="$1"
|
||||
while [ "$wdir" != '/' ] ; do
|
||||
if [ -d "$wdir"/.mvn ] ; then
|
||||
basedir=$wdir
|
||||
break
|
||||
fi
|
||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||
if [ -d "${wdir}" ]; then
|
||||
wdir=`cd "$wdir/.."; pwd`
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
echo "${basedir}"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
echo "$(tr -s '\n' ' ' < "$1")"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=`find_maven_basedir "$(pwd)"`
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found .mvn/wrapper/maven-wrapper.jar"
|
||||
fi
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
|
||||
fi
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
else
|
||||
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
fi
|
||||
while IFS="=" read key value; do
|
||||
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
|
||||
esac
|
||||
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Downloading from: $jarUrl"
|
||||
fi
|
||||
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if $cygwin; then
|
||||
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found wget ... using wget"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
else
|
||||
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
elif command -v curl > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found curl ... using curl"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl -o "$wrapperJarPath" "$jarUrl" -f
|
||||
else
|
||||
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
|
||||
fi
|
||||
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Falling back to using Java to download"
|
||||
fi
|
||||
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaClass=`cygpath --path --windows "$javaClass"`
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Compiling MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
# Compiling the Java class
|
||||
("$JAVA_HOME/bin/javac" "$javaClass")
|
||||
fi
|
||||
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
# Running the downloader
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Running MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo $MAVEN_PROJECTBASEDIR
|
||||
fi
|
||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --path --windows "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
|
||||
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
|
||||
fi
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
$MAVEN_DEBUG_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.home=${M2_HOME}" \
|
||||
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
||||
@@ -1,188 +0,0 @@
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. You may obtain a copy of the License at
|
||||
@REM
|
||||
@REM https://www.apache.org/licenses/LICENSE-2.0
|
||||
@REM
|
||||
@REM Unless required by applicable law or agreed to in writing,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Maven Start Up Batch script
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM M2_HOME - location of maven2's installed home dir
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
|
||||
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
|
||||
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %DOWNLOAD_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% ^
|
||||
%JVM_CONFIG_MAVEN_PROPS% ^
|
||||
%MAVEN_OPTS% ^
|
||||
%MAVEN_DEBUG_OPTS% ^
|
||||
-classpath %WRAPPER_JAR% ^
|
||||
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
|
||||
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
|
||||
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%"=="on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
|
||||
|
||||
cmd /C exit /B %ERROR_CODE%
|
||||
@@ -1,68 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.0.6</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.example</groupId>
|
||||
<artifactId>backend</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>backend</name>
|
||||
<description>backend</description>
|
||||
<properties>
|
||||
<java.version>17</java.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
<version>2.1.214</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<version>2.5.2</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>validate</phase>
|
||||
<goals>
|
||||
<goal>install-file</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<groupId>com.example</groupId>
|
||||
<artifactId>example</artifactId>
|
||||
<version>1.0</version>
|
||||
<packaging>jar</packaging>
|
||||
<file>${basedir}/H2JDBCDriver/h2-2.1.214.jar</file>
|
||||
<generatePom>true</generatePom>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
@@ -1,15 +0,0 @@
|
||||
package com.example.backend;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class BackendApplication
|
||||
{
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
SpringApplication.run(BackendApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,675 +0,0 @@
|
||||
package com.example.backend.anwprj;
|
||||
|
||||
import com.example.backend.anwprj.Encryption.RSA;
|
||||
import com.example.backend.anwprj.Days.Day;
|
||||
import com.example.backend.anwprj.Entries.Entry;
|
||||
import com.example.backend.anwprj.Semesters.Semester;
|
||||
import com.example.backend.anwprj.Users.User;
|
||||
import com.example.backend.anwprj.Week.Week;
|
||||
import com.example.backend.anwprj.Module.Module;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class DataBaseHandler
|
||||
{
|
||||
//singleton instance of database handler
|
||||
private static DataBaseHandler instance = null;
|
||||
|
||||
public static DataBaseHandler getInstance()
|
||||
{
|
||||
if (instance == null)
|
||||
{
|
||||
instance = new DataBaseHandler();
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
//connection to the database
|
||||
private Connection connection;
|
||||
//sql statement
|
||||
private Statement st;
|
||||
private boolean encrypted = false;
|
||||
|
||||
public DataBaseHandler()
|
||||
{
|
||||
try
|
||||
{
|
||||
//connect to the local database
|
||||
connection = DriverManager.getConnection("jdbc:h2:./database", "adm", "73bgjfdsfJ!934");
|
||||
st = connection.createStatement();
|
||||
} catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* WEEKS
|
||||
*/
|
||||
|
||||
public Week addWeek(Week week)
|
||||
{
|
||||
try
|
||||
{
|
||||
st.executeUpdate("insert into weeks (semesterid, weeknumber) values (" + week.getSemesterid() + ", " + week.getWeeknumber() + ")");
|
||||
|
||||
return getWeek(week.getSemesterid(), week.getWeeknumber());
|
||||
|
||||
} catch (SQLException e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Week getWeek(int id)
|
||||
{
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{
|
||||
rs = st.executeQuery("select * from weeks where id=" + id);
|
||||
|
||||
return resultSetToWeek(rs);
|
||||
|
||||
} catch (SQLException e)
|
||||
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Week getWeek(int semesterid, int weeknumber)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from weeks where semesterid =" + semesterid + " and weeknumber=" + weeknumber);
|
||||
|
||||
return resultSetToWeek(rs);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private Week resultSetToWeek(ResultSet rs) {
|
||||
try {
|
||||
rs.next();
|
||||
|
||||
return new Week(
|
||||
rs.getInt("id"),
|
||||
rs.getInt("semesterid"),
|
||||
rs.getInt("weeknumber")
|
||||
);
|
||||
} catch (SQLException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
DAYS
|
||||
*/
|
||||
public Day addDay(Day day)
|
||||
{
|
||||
try
|
||||
{
|
||||
st.executeUpdate("insert into days (dayinyear, yearnumber, semesterid) values (" + day.getDayinyear() + ", " + day.getYearnumber() + ", " + day.getSemesterid() + ")");
|
||||
return getDay(day.getDayinyear(), day.getYearnumber(), day.getSemesterid());
|
||||
} catch (SQLException e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Day getDay(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from days where id=" + id);
|
||||
|
||||
return resultSetToDay(rs);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Day getDay(int dayinyear, int yearnumber, int semesterid)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from days where dayinyear =" + dayinyear + " and yearnumber =" + yearnumber + " and semesterid =" + semesterid);
|
||||
|
||||
return resultSetToDay(rs);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private Day resultSetToDay(ResultSet rs)
|
||||
{
|
||||
try
|
||||
{
|
||||
rs.next();
|
||||
|
||||
return new Day(
|
||||
rs.getInt("id"),
|
||||
rs.getInt("dayinyear"),
|
||||
rs.getInt("yearnumber"),
|
||||
rs.getInt("semesterid")
|
||||
);
|
||||
} catch (SQLException e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
ENTRIES
|
||||
*/
|
||||
//method that returns all entries of a day based on the given parameters
|
||||
public Entry[] getEntries(int dayinweek, int weeknumber, int semesterid, User user)
|
||||
{
|
||||
try
|
||||
{
|
||||
//search the correct data in the database
|
||||
ResultSet rs = st.executeQuery("select distinct e.id, e.dayid, e.usercreatedbyid, e.timestart, e.timeend, e.info " +
|
||||
"from entries e, days d, weeks w, semester s " +
|
||||
"where e.dayid = d.id and " +
|
||||
"d.weekid = w.id and " +
|
||||
"w.semesterid = s.id and " +
|
||||
"d.dayinweek = " + dayinweek + " and " +
|
||||
"w.weeknumber = " + weeknumber + " and " +
|
||||
"s.id = " + semesterid);
|
||||
|
||||
|
||||
int editable = 0;
|
||||
|
||||
//a temporary list to save entry objects in
|
||||
List<Entry> temp = new ArrayList<>();
|
||||
//while there a still entries for the day
|
||||
while(rs.next())
|
||||
{
|
||||
editable = 0;
|
||||
//if entry has been created by the requesting user set the entry to editable (or the user is admin)
|
||||
if(rs.getInt("usercreatedbyid") == user.getId() || user.getPermissions() == 1)
|
||||
{
|
||||
editable = 1;
|
||||
}
|
||||
|
||||
temp.add(
|
||||
new Entry(
|
||||
rs.getInt("id"),
|
||||
rs.getInt("dayid"),
|
||||
rs.getInt("usercreatedbyid"),
|
||||
rs.getInt("timestart"),
|
||||
rs.getInt("timeend"),
|
||||
rs.getString("info"),
|
||||
editable
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
//return the temporary list as an array
|
||||
return temp.toArray(new Entry[0]);
|
||||
|
||||
} catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
SEMESTER
|
||||
*/
|
||||
//get a semester object by its name
|
||||
public Semester getSemester(String name)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from SEMESTER where name = '" + name + "'");
|
||||
return resultSetToSemester(rs);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Semester getSemester(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from semester where id=" + id);
|
||||
return resultSetToSemester(rs);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
//write a new semester to the database returns if process was successful
|
||||
public Semester addSemester(Semester s)
|
||||
{
|
||||
try
|
||||
{
|
||||
st.executeUpdate("insert into SEMESTER (startday, endday, name, startyear, endyear) values (" + s.getStartday() + ", " + s.getEndday() + ", '" + s.getName() + "', " + s.getStartyear() + ", " + s.getEndyear() + ")");
|
||||
return getSemester(s.getName());
|
||||
|
||||
} catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Semester[] getAllSemesters()
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from semester");
|
||||
List<Semester> semestersList = new ArrayList<>();
|
||||
Semester s = null;
|
||||
while((s = resultSetToSemester(rs)) != null)
|
||||
{
|
||||
semestersList.add(s);
|
||||
}
|
||||
|
||||
return semestersList.toArray(new Semester[0]);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Semester updateSemester(Semester semester)
|
||||
{
|
||||
try
|
||||
{
|
||||
st.executeUpdate("update semester set startday=" + semester.getStartday() + ", " +
|
||||
"endday=" + semester.getEndday() + ", " +
|
||||
"name='" + semester.getName() + "', " +
|
||||
"startyear=" + semester.getStartyear() + ", " +
|
||||
"endyear=" + semester.getEndyear() + " where id=" + semester.getId());
|
||||
|
||||
return getSemester(semester.getId());
|
||||
} catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteSemester(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
st.executeUpdate("DELETE FROM modules WHERE semesterid=" + id);
|
||||
|
||||
st.executeUpdate("delete from semester where id=" + id);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public Semester resultSetToSemester(ResultSet rs)
|
||||
{
|
||||
try
|
||||
{
|
||||
rs.next();
|
||||
return new Semester(
|
||||
rs.getInt("id"),
|
||||
rs.getInt("startday"),
|
||||
rs.getInt("endday"),
|
||||
rs.getString("name"),
|
||||
rs.getInt("startyear"),
|
||||
rs.getInt("endyear")
|
||||
);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
MODULE
|
||||
*/
|
||||
|
||||
//get a module object by its id
|
||||
public Module getModule(int id) {
|
||||
try {
|
||||
ResultSet rs = st.executeQuery("SELECT * FROM modules WHERE id=" + id);
|
||||
return resultSetToModule(rs);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Module getModule(int userid, int semesterid)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from modules where userid=" + userid + " and semesterid=" + semesterid);
|
||||
|
||||
return resultSetToModule(rs);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
//get module objects by its semester and its lecturer
|
||||
public Module[] getModules(int userid) {
|
||||
try {
|
||||
ResultSet rs = st.executeQuery("SELECT * FROM modules WHERE userid = " + userid);
|
||||
List<Module> moduleList = new ArrayList<>();
|
||||
Module m = null;
|
||||
while((m = resultSetToModule(rs)) != null)
|
||||
{
|
||||
moduleList.add(m);
|
||||
}
|
||||
|
||||
return moduleList.toArray(new Module[0]);
|
||||
|
||||
}
|
||||
catch (Exception ex){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Module addModule(Module m)
|
||||
{
|
||||
try {
|
||||
st.executeUpdate("insert into modules (userid, semesterid, name, activated) " +
|
||||
"Values (" + m.getUserid() + ", " + m.getsemesterid() + ", '" + m.getName() + "', " + m.getActivated() + ")");
|
||||
return getModule(m.getUserid(), m.getsemesterid());
|
||||
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Module[] getAllModules() {
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("SELECT * FROM modules");
|
||||
List<Module> moduleList = new ArrayList<>();
|
||||
Module m = null;
|
||||
while((m = resultSetToModule(rs)) != null)
|
||||
{
|
||||
moduleList.add(m);
|
||||
}
|
||||
|
||||
return moduleList.toArray(new Module[0]);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Module getModulesBySemesterUserID(int userid, int semesterid)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from modules where userid=" + userid + " and semesterid=" + semesterid);
|
||||
return resultSetToModule(rs);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return new Module(-1, 0, 0, "", 0);
|
||||
}
|
||||
}
|
||||
|
||||
public Module updateModule(Module m)
|
||||
{
|
||||
|
||||
try {
|
||||
Module module = getModule(m.getUserid(), m.getsemesterid());
|
||||
if(module == null)
|
||||
{
|
||||
addModule(m);
|
||||
}
|
||||
else
|
||||
{
|
||||
st.executeUpdate("update modules set activated=" + m.getActivated() + ", semesterid=" + m.getsemesterid() + ", name='" + m.getName() + "' where id=" + module.getid());
|
||||
}
|
||||
|
||||
Module test = getModule(m.getUserid(), m.getsemesterid());
|
||||
System.out.println(test.getActivated());
|
||||
return test;
|
||||
}
|
||||
catch (SQLException ex) {
|
||||
ex.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean deleteModule(int semesterid, int userid)
|
||||
{
|
||||
try {
|
||||
st.executeUpdate("delete from modules where semesterid=" + semesterid + " and userid=" + userid);
|
||||
return true;
|
||||
}
|
||||
catch(Exception ex) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public Module resultSetToModule(ResultSet rs) {
|
||||
try {
|
||||
rs.next();
|
||||
return new Module(
|
||||
rs.getInt("id"),
|
||||
rs.getInt("userid"),
|
||||
rs.getInt("semesterid"),
|
||||
rs.getString("name"),
|
||||
rs.getInt("activated"));
|
||||
}
|
||||
catch (Exception ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
USER
|
||||
*/
|
||||
|
||||
|
||||
//TODO: Nur nicht admins werden aktuell ausgegeben
|
||||
public User[] getAllUsers()
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from users where permission=0");
|
||||
|
||||
User u = null;
|
||||
|
||||
List<User> output = new ArrayList<>();
|
||||
|
||||
while((u = resultSetToUser(rs)) != null)
|
||||
{
|
||||
u.clearOutPassword();
|
||||
output.add(u);
|
||||
}
|
||||
|
||||
return output.toArray(new User[0]);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
//get a user object by mail and password from the database
|
||||
public User getUser(String mail, String password)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from users where mail = '" + mail + "' and password = '" + password + "'");
|
||||
return resultSetToUser(rs);
|
||||
} catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public User getUser(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from users where id=" + id);
|
||||
return resultSetToUser(rs);
|
||||
} catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public User getUser(String mail)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("select * from users where mail='" + mail + "'");
|
||||
User u = resultSetToUser(rs);
|
||||
if(u != null) u.clearOutPassword();
|
||||
|
||||
return u;
|
||||
} catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public User resultSetToUser(ResultSet rs)
|
||||
{
|
||||
try
|
||||
{
|
||||
rs.next();
|
||||
return new User(
|
||||
rs.getInt("id"),
|
||||
rs.getString("firstname"),
|
||||
rs.getString("lastname"),
|
||||
rs.getString("mail"),
|
||||
rs.getString("password"),
|
||||
rs.getInt("permission")
|
||||
);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
//add a new user object to the database returns if process was successful
|
||||
public User addUser(User user)
|
||||
{
|
||||
//check if mail and passwort (key user information) is given
|
||||
if (user.getMail() == null || user.getPassword() == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
String password = user.getPassword();
|
||||
if(encrypted)
|
||||
{
|
||||
RSA rsa = RSA.getInstance();
|
||||
byte[] psw = rsa.loadByteArray(password);
|
||||
try {
|
||||
password = rsa.decrypt(psw);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
st.executeUpdate("insert into users (firstname, lastname, mail, password, permission) values (" + "'" + user.getFirstName() + "', '" + user.getLastName() + "', '" + user.getMail() + "', '" + password + "', " + 0 + ")");
|
||||
return getUser(user.getMail(), user.getPassword());
|
||||
} catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public User updateUser(User user, int id, boolean elevationRequestByAdmin)
|
||||
{
|
||||
try
|
||||
{
|
||||
String password = user.getPassword();
|
||||
if(encrypted)
|
||||
{
|
||||
RSA rsa = RSA.getInstance();
|
||||
byte[] psw = rsa.loadByteArray(password);
|
||||
try {
|
||||
password = rsa.decrypt(psw);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if(!elevationRequestByAdmin)
|
||||
{
|
||||
st.executeUpdate("update users set " +
|
||||
"firstname='" + user.getFirstName() + "', " +
|
||||
"lastname='" + user.getLastName() + "', " +
|
||||
"mail='" + user.getMail() + "', " +
|
||||
"password='" + password + "' " +
|
||||
"where id=" + id);
|
||||
}
|
||||
else
|
||||
{
|
||||
st.executeUpdate("update users set " +
|
||||
"firstname='" + user.getFirstName() + "', " +
|
||||
"lastname='" + user.getLastName() + "', " +
|
||||
"mail='" + user.getMail() + "', " +
|
||||
"password='" + password + "'," +
|
||||
"permission=" + user.getPermissions() +
|
||||
"where id=" + id);
|
||||
}
|
||||
|
||||
return getUser(id);
|
||||
} catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean deleteUser(String mail)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet rs = st.executeQuery("SELECT id FROM user WHERE mail='" + mail + "'");
|
||||
rs.next();
|
||||
int id = rs.getInt("id");
|
||||
st.executeUpdate("DELETE FROM modules WHERE lecturerId = " + id);
|
||||
|
||||
st.executeUpdate("delete from users where mail='" + mail + "'");
|
||||
return true;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
package com.example.backend.anwprj.Days;
|
||||
|
||||
public class Day
|
||||
{
|
||||
private int id;
|
||||
private int dayinyear;
|
||||
private int yearnumber;
|
||||
private int semesterid;
|
||||
|
||||
public Day(int id, int dayinyear, int yearnumber, int semesterid) {
|
||||
this.id = id;
|
||||
this.dayinyear = dayinyear;
|
||||
this.yearnumber = yearnumber;
|
||||
this.semesterid = semesterid;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getDayinyear() {
|
||||
return dayinyear;
|
||||
}
|
||||
|
||||
public int getYearnumber() {
|
||||
return yearnumber;
|
||||
}
|
||||
|
||||
public int getSemesterid() {
|
||||
return semesterid;
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
package com.example.backend.anwprj.Encryption;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import java.io.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.*;
|
||||
|
||||
public class RSA {
|
||||
|
||||
private PublicKey publicKey;
|
||||
private PrivateKey privateKey;
|
||||
|
||||
private static RSA instance = null;
|
||||
|
||||
public static RSA getInstance()
|
||||
{
|
||||
if(instance == null)
|
||||
{
|
||||
instance = new RSA();
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
private RSA(){}
|
||||
|
||||
public String decrypt(byte[] text) throws Exception
|
||||
{
|
||||
readKeyPairs();
|
||||
var cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||
cipher.init(Cipher.DECRYPT_MODE, privateKey);
|
||||
var plainText = cipher.doFinal(text);
|
||||
return new String(plainText, StandardCharsets.US_ASCII);
|
||||
}
|
||||
|
||||
private void readKeyPairs() throws Exception
|
||||
{
|
||||
var publicInput = new ObjectInputStream(new FileInputStream(new File("./public.kfs")));
|
||||
publicKey = (PublicKey) publicInput.readObject();
|
||||
publicInput.close();
|
||||
|
||||
var privateInput = new ObjectInputStream(new FileInputStream(new File("./private.kfs")));
|
||||
privateKey = (PrivateKey) privateInput.readObject();
|
||||
privateInput.close();
|
||||
}
|
||||
|
||||
public byte[] loadByteArray(String text)
|
||||
{
|
||||
String[] split = text.split(",");
|
||||
byte[] output = new byte[split.length];
|
||||
for(int i = 0; i < split.length; i++)
|
||||
{
|
||||
output[i] = Byte.parseByte(split[i]);
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
package com.example.backend.anwprj.Entries;
|
||||
|
||||
//entry data class
|
||||
public class Entry
|
||||
{
|
||||
private int id;
|
||||
private int dayid;
|
||||
private int usercreatedbyid;
|
||||
private int timestart;
|
||||
private int timeend;
|
||||
private String info;
|
||||
private int editable;
|
||||
|
||||
public Entry(int id, int dayid, int usercreatedbyid, int timestart, int timeend, String info, int editable)
|
||||
{
|
||||
this.id = id;
|
||||
this.dayid = dayid;
|
||||
this.usercreatedbyid = usercreatedbyid;
|
||||
this.timestart = timestart;
|
||||
this.timeend = timeend;
|
||||
this.info = info;
|
||||
this.editable = editable;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getDayid()
|
||||
{
|
||||
return dayid;
|
||||
}
|
||||
|
||||
public int getUsercreatedbyid()
|
||||
{
|
||||
return usercreatedbyid;
|
||||
}
|
||||
|
||||
public int getTimestart()
|
||||
{
|
||||
return timestart;
|
||||
}
|
||||
|
||||
public int getTimeend()
|
||||
{
|
||||
return timeend;
|
||||
}
|
||||
|
||||
public String getInfo()
|
||||
{
|
||||
return info;
|
||||
}
|
||||
|
||||
public void setDayid(int dayid)
|
||||
{
|
||||
this.dayid = dayid;
|
||||
}
|
||||
|
||||
public void setTimestart(int timestart)
|
||||
{
|
||||
this.timestart = timestart;
|
||||
}
|
||||
|
||||
public void setTimeend(int timeend)
|
||||
{
|
||||
this.timeend = timeend;
|
||||
}
|
||||
|
||||
public void setInfo(String info)
|
||||
{
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
public int getEditable()
|
||||
{
|
||||
return editable;
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
package com.example.backend.anwprj.Module;
|
||||
|
||||
//module data class
|
||||
public class Module {
|
||||
private int id;
|
||||
private int userid;
|
||||
private int semesterid;
|
||||
private String name;
|
||||
private int activated;
|
||||
|
||||
|
||||
public Module(int id, int userid, int semesterid, String name, int activated)
|
||||
{
|
||||
this.id = id;
|
||||
this.userid = userid;
|
||||
this.semesterid = semesterid;
|
||||
this.name = name;
|
||||
this.activated = activated;
|
||||
}
|
||||
|
||||
public int getid() { return id; }
|
||||
|
||||
public int getUserid() { return userid; }
|
||||
|
||||
public int getsemesterid() { return semesterid; }
|
||||
|
||||
public String getName() { return name; }
|
||||
|
||||
public int getActivated() { return activated; }
|
||||
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package com.example.backend.anwprj.Semesters;
|
||||
|
||||
//semester data class
|
||||
public class Semester
|
||||
{
|
||||
private int id;
|
||||
private int startday;
|
||||
private int endday;
|
||||
private String name;
|
||||
private int startyear;
|
||||
private int endyear;
|
||||
|
||||
public Semester(int id, int startday, int endday, String name, int startyear, int endyear) {
|
||||
this.id = id;
|
||||
this.startday = startday;
|
||||
this.endday = endday;
|
||||
this.name = name;
|
||||
this.startyear = startyear;
|
||||
this.endyear = endyear;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getStartday() {
|
||||
return startday;
|
||||
}
|
||||
|
||||
public int getEndday() {
|
||||
return endday;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public int getStartyear() {
|
||||
return startyear;
|
||||
}
|
||||
|
||||
public int getEndyear() {
|
||||
return endyear;
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
package com.example.backend.anwprj.Users;
|
||||
|
||||
//user data class
|
||||
public class User
|
||||
{
|
||||
private int id;
|
||||
private String firstName;
|
||||
private String lastName;
|
||||
private String mail;
|
||||
private String password;
|
||||
private int permissions;
|
||||
|
||||
public User(int id, String firstName, String lastName, String mail, String password, int permissions)
|
||||
{
|
||||
this.id = id;
|
||||
this.firstName = firstName;
|
||||
this.lastName = lastName;
|
||||
this.mail = mail;
|
||||
this.password = password;
|
||||
this.permissions = permissions;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getFirstName()
|
||||
{
|
||||
return firstName;
|
||||
}
|
||||
|
||||
public String getLastName()
|
||||
{
|
||||
return lastName;
|
||||
}
|
||||
|
||||
public String getMail()
|
||||
{
|
||||
return mail;
|
||||
}
|
||||
|
||||
public String getPassword()
|
||||
{
|
||||
return password;
|
||||
}
|
||||
|
||||
public int getPermissions()
|
||||
{
|
||||
return permissions;
|
||||
}
|
||||
|
||||
public void clearOutPassword()
|
||||
{
|
||||
password = "****";
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package com.example.backend.anwprj.Users;
|
||||
|
||||
//mapping of the integer rights to enum
|
||||
public enum UserPermissions
|
||||
{
|
||||
self(0),
|
||||
admin(1);
|
||||
|
||||
private final int value;
|
||||
|
||||
public int getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
private UserPermissions(int value)
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
package com.example.backend.anwprj.Users;
|
||||
|
||||
import com.example.backend.anwprj.DataBaseHandler;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class UserSessionIDHandler
|
||||
{
|
||||
//stores mapping of session ids to users
|
||||
public static HashMap<String, User> mapping = new HashMap<>();
|
||||
|
||||
//returns a user object by its session id (ONLY FOR SERVER INTERNAL USE!)
|
||||
public static User getUserBySessionID(String sessionID)
|
||||
{
|
||||
return mapping.get(sessionID);
|
||||
}
|
||||
|
||||
public static boolean removeUser(String sessionID)
|
||||
{
|
||||
try
|
||||
{
|
||||
mapping.remove(sessionID);
|
||||
return true;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static String addUser(String mail, String password)
|
||||
{
|
||||
//try to get user from database
|
||||
User user = DataBaseHandler.getInstance().getUser(mail, password);
|
||||
|
||||
//if user exists
|
||||
if(user != null)
|
||||
{
|
||||
//generate random session id based on ascii table
|
||||
byte[] id = new byte[100];
|
||||
|
||||
for(int i = 0; i < id.length; i++)
|
||||
{
|
||||
id[i] = (byte) (Math.random() * 26 + 64);
|
||||
}
|
||||
|
||||
String generatedString = new String(id, StandardCharsets.US_ASCII);
|
||||
|
||||
mapping.put(generatedString, user);
|
||||
|
||||
//makes user session expire after ca. 2h
|
||||
new java.util.Timer().schedule(new java.util.TimerTask(){
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
mapping.remove(generatedString);
|
||||
return;
|
||||
}
|
||||
}, 7500000);
|
||||
|
||||
return generatedString;
|
||||
}
|
||||
|
||||
return "failed";
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
package com.example.backend.anwprj.Week;
|
||||
|
||||
public class Week {
|
||||
|
||||
private int id;
|
||||
private int semesterid;
|
||||
private int weeknumber;
|
||||
|
||||
public Week(int id, int semesterid, int weeknumber) {
|
||||
this.id = id;
|
||||
this.semesterid = semesterid;
|
||||
this.weeknumber = weeknumber;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getSemesterid() {
|
||||
return semesterid;
|
||||
}
|
||||
|
||||
public int getWeeknumber() {
|
||||
return weeknumber;
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
package com.example.backend.anwprj.controller;
|
||||
|
||||
import com.example.backend.anwprj.DataBaseHandler;
|
||||
import com.example.backend.anwprj.Days.Day;
|
||||
import com.example.backend.anwprj.Users.User;
|
||||
import com.example.backend.anwprj.Users.UserPermissions;
|
||||
import com.example.backend.anwprj.Users.UserSessionIDHandler;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@RestController
|
||||
public class DayController
|
||||
{
|
||||
|
||||
private DataBaseHandler db;
|
||||
|
||||
{
|
||||
db = DataBaseHandler.getInstance();
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/days")
|
||||
public ResponseEntity<Day> getDay(
|
||||
@RequestParam(name="sessionid") String sessionID,
|
||||
@RequestParam(name="dayinyear") int dayinyear,
|
||||
@RequestParam(name="yearnumber") int yearnumber,
|
||||
@RequestParam(name="semesterid") int semesterID)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(u != null)
|
||||
{
|
||||
Day d = db.getDay(dayinyear, yearnumber, semesterID);
|
||||
|
||||
if (d != null)
|
||||
{
|
||||
return new ResponseEntity<>(d, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@PostMapping("/days")
|
||||
public ResponseEntity<Day> addDay(@RequestBody Day day, @RequestParam(name="sessionid") String sessionID)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(u != null && u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
return new ResponseEntity<>(db.addDay(day), HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(null, HttpStatus.FORBIDDEN);
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package com.example.backend.anwprj.controller;
|
||||
|
||||
import com.example.backend.anwprj.DataBaseHandler;
|
||||
import com.example.backend.anwprj.Entries.Entry;
|
||||
import com.example.backend.anwprj.Users.User;
|
||||
import com.example.backend.anwprj.Users.UserSessionIDHandler;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@RestController
|
||||
public class EntriesController
|
||||
{
|
||||
private DataBaseHandler db;
|
||||
|
||||
{
|
||||
db = DataBaseHandler.getInstance();
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/entries")
|
||||
public ResponseEntity<Entry[]> getEntries(
|
||||
@RequestParam(name = "sessionid") String sessionID,
|
||||
@RequestParam(name = "dayinweek") int dayinweek,
|
||||
@RequestParam(name = "weeknumber") int weeknumber,
|
||||
@RequestParam(name = "semesterid") int semesterid)
|
||||
{
|
||||
User user = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(user == null)
|
||||
{
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
Entry[] entries = db.getEntries(dayinweek, weeknumber, semesterid, user);
|
||||
return new ResponseEntity<>(entries, HttpStatus.OK);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@PostMapping("/entries")
|
||||
public ResponseEntity<Entry[]> postEntries(@RequestBody Entry[] entries, @RequestParam(name="sessionid") String sessionID)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,165 +0,0 @@
|
||||
package com.example.backend.anwprj.controller;
|
||||
|
||||
import com.example.backend.anwprj.DataBaseHandler;
|
||||
import com.example.backend.anwprj.Module.Module;
|
||||
import com.example.backend.anwprj.Users.User;
|
||||
import com.example.backend.anwprj.Users.UserPermissions;
|
||||
import com.example.backend.anwprj.Users.UserSessionIDHandler;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
public class ModuleController
|
||||
{
|
||||
private final DataBaseHandler db;
|
||||
|
||||
{
|
||||
db = DataBaseHandler.getInstance();
|
||||
}
|
||||
|
||||
// @CrossOrigin
|
||||
// @GetMapping("/module")
|
||||
// public ResponseEntity<Module> getModule(
|
||||
// @RequestParam(name="id") int id,
|
||||
// @RequestParam(name="sessionid") String sessionID) {
|
||||
//
|
||||
// User user = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
//
|
||||
// if (user != null){
|
||||
// Module module = db.getModule(id);
|
||||
// if(module != null) {
|
||||
// return new ResponseEntity<>(module, HttpStatus.OK);
|
||||
// }
|
||||
//
|
||||
// return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
// }
|
||||
//
|
||||
// return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
// }
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/module/id")
|
||||
public ResponseEntity<Module[]> getModules(
|
||||
@RequestParam(name = "sessionid") String sessionID)
|
||||
{
|
||||
|
||||
User user = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if (user != null)
|
||||
{
|
||||
Module[] modules = db.getModules(user.getId());
|
||||
if (modules != null)
|
||||
{
|
||||
return new ResponseEntity<>(modules, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/module/suid")
|
||||
public ResponseEntity<Module[]> getModulesBySemesterUserID(@RequestParam(name = "sessionid") String sessionid, @RequestParam(name = "userid") String userid, @RequestParam(name = "semesterid") int semesterid)
|
||||
{
|
||||
User user = UserSessionIDHandler.getUserBySessionID(sessionid);
|
||||
String[] userIDSSplit = userid.split("a");
|
||||
int[] userIDS = new int[userIDSSplit.length];
|
||||
for(int i = 0; i < userIDS.length; i++)
|
||||
{
|
||||
userIDS[i] = Integer.parseInt(userIDSSplit[i]);
|
||||
}
|
||||
|
||||
if(user != null && user.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
List<Module> result = new ArrayList<>();
|
||||
|
||||
for(int i = 0; i < userIDS.length; i++)
|
||||
{
|
||||
result.add(db.getModulesBySemesterUserID(userIDS[i], semesterid));
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(result.toArray(new Module[0]), HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/module/all")
|
||||
public ResponseEntity<Module[]> getModule(@RequestParam(name = "sessionid") String sessionid)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionid);
|
||||
|
||||
if (u != null)
|
||||
{
|
||||
if (u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
return new ResponseEntity<>(db.getAllModules(), HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@PostMapping("/module")
|
||||
public ResponseEntity<Module> addModule(@RequestBody Module module, @RequestParam(name = "sessionid") String sessionID)
|
||||
{
|
||||
|
||||
System.out.println("test1");
|
||||
User user = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if (user.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
Module m = db.addModule(module);
|
||||
if (m != null)
|
||||
{
|
||||
return new ResponseEntity<>(m, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@PutMapping("/module")
|
||||
public ResponseEntity<Module> updateModule(@RequestBody Module module, @RequestParam(name = "sessionid") String sessionID)
|
||||
{
|
||||
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
if (u != null && u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
Module m = db.updateModule(module);
|
||||
|
||||
if (m != null)
|
||||
{
|
||||
return new ResponseEntity<>(m, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@DeleteMapping("/module")
|
||||
public void deleteModule(@RequestParam(name = "sessionid") String sessionid, @RequestParam(name = "semesterid") int semesterid, @RequestParam(name = "userid") int userid)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionid);
|
||||
if (u != null && u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
db.deleteModule(semesterid, userid);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
package com.example.backend.anwprj.controller;
|
||||
|
||||
import com.example.backend.anwprj.DataBaseHandler;
|
||||
import com.example.backend.anwprj.Semesters.Semester;
|
||||
import com.example.backend.anwprj.Users.User;
|
||||
import com.example.backend.anwprj.Users.UserPermissions;
|
||||
import com.example.backend.anwprj.Users.UserSessionIDHandler;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@RestController
|
||||
public class SemesterController
|
||||
{
|
||||
//reference to the database handler
|
||||
private DataBaseHandler db;
|
||||
|
||||
{
|
||||
db = DataBaseHandler.getInstance();
|
||||
}
|
||||
|
||||
//a new semester add is requested (only allowed for admin users)
|
||||
@CrossOrigin
|
||||
@PostMapping("/semester")
|
||||
public ResponseEntity<Semester> addSemester(@RequestBody Semester semester, @RequestParam(name="sessionid") String sessionID)
|
||||
{
|
||||
User user = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(user.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
Semester s = db.addSemester(semester);
|
||||
if(s != null)
|
||||
{
|
||||
|
||||
return new ResponseEntity<>(s, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
//get a semester object by its name
|
||||
@CrossOrigin
|
||||
@GetMapping("/semester")
|
||||
public ResponseEntity<Semester> getSemester(@RequestParam(name="name") String name, @RequestParam(name="sessionid") String sessionID)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(u != null)
|
||||
{
|
||||
Semester s = db.getSemester(name);
|
||||
if (s != null)
|
||||
{
|
||||
return new ResponseEntity<>(s, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/semester/id")
|
||||
public ResponseEntity<Semester> getSemester(@RequestParam(name="id") int id, @RequestParam(name="sessionid") String sessionID)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(u != null)
|
||||
{
|
||||
Semester s = db.getSemester(id);
|
||||
if(s != null)
|
||||
{
|
||||
return new ResponseEntity<>(s, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/semester/all")
|
||||
public ResponseEntity<Semester[]> getSemester(@RequestParam(name="sessionid") String sessionid)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionid);
|
||||
|
||||
if(u != null)
|
||||
{
|
||||
if(u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
return new ResponseEntity<>(db.getAllSemesters(), HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@PutMapping("/semester")
|
||||
public ResponseEntity<Semester> updateSemester(@RequestBody Semester semester, @RequestParam(name="sessionid") String sessionID)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
if(u != null && u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
Semester s = db.updateSemester(semester);
|
||||
|
||||
if(s != null)
|
||||
{
|
||||
return new ResponseEntity<>(s, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@DeleteMapping("/semester")
|
||||
public void deleteSemester(@RequestParam(name="sessionid") String sessionid, @RequestParam(name="id") int id)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionid);
|
||||
if(u != null && u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
db.deleteSemester(id);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,183 +0,0 @@
|
||||
package com.example.backend.anwprj.controller;
|
||||
|
||||
import com.example.backend.anwprj.Encryption.RSA;
|
||||
import com.example.backend.anwprj.DataBaseHandler;
|
||||
import com.example.backend.anwprj.Users.User;
|
||||
import com.example.backend.anwprj.Users.UserPermissions;
|
||||
import com.example.backend.anwprj.Users.UserSessionIDHandler;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@RestController
|
||||
public class UserController {
|
||||
//reference to the database handler
|
||||
private DataBaseHandler db;
|
||||
|
||||
{
|
||||
db = DataBaseHandler.getInstance();
|
||||
}
|
||||
|
||||
|
||||
//adds a new user to the database (cannot create an admin user)
|
||||
@CrossOrigin
|
||||
@PostMapping("/users")
|
||||
public ResponseEntity<String> addUser(@RequestBody User user) {
|
||||
User checkUser = db.getUser(user.getMail());
|
||||
|
||||
if (checkUser != null) {
|
||||
return new ResponseEntity<>("mail", HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
//if user was successfully added to database
|
||||
User u = db.addUser(user);
|
||||
|
||||
if (u != null) {
|
||||
//generate a session id
|
||||
return new ResponseEntity<String>(UserSessionIDHandler.addUser(user.getMail(), user.getPassword()), HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<String>(HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
//a user wants to login
|
||||
@CrossOrigin
|
||||
@GetMapping("/users")
|
||||
public ResponseEntity<String> login(@RequestParam(name = "mail") String mail, @RequestParam(name = "password") String password) {
|
||||
//generate a session id for the user trying to login
|
||||
boolean isEncrypted = false;
|
||||
if(isEncrypted)
|
||||
{
|
||||
RSA rsa = RSA.getInstance();
|
||||
byte[] psw = rsa.loadByteArray(password);
|
||||
try {
|
||||
password = rsa.decrypt(psw);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
String sessionID = UserSessionIDHandler.addUser(mail, password);
|
||||
|
||||
return new ResponseEntity<>(sessionID, HttpStatus.OK);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/users/logout")
|
||||
public ResponseEntity<Boolean> logout(@RequestParam(name = "sessionid") String sessionID) {
|
||||
boolean success = UserSessionIDHandler.removeUser(sessionID);
|
||||
return new ResponseEntity<>(success, HttpStatus.OK);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@PutMapping("/users")
|
||||
public ResponseEntity<Boolean> updateUser(@RequestParam(name = "sessionid") String sessionID, @RequestBody User u, @RequestParam(name = "mail") String mail) {
|
||||
User sessionUser = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if (sessionUser != null) {
|
||||
if (sessionUser.getMail().equals(mail) || sessionUser.getPermissions() == UserPermissions.admin.getValue()) {
|
||||
System.out.println(sessionUser.getId());
|
||||
|
||||
User resultingUser = db.updateUser(u, sessionUser.getId(), false);
|
||||
|
||||
if (resultingUser != null) {
|
||||
UserSessionIDHandler.removeUser(sessionID);
|
||||
return new ResponseEntity<>(true, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(false, HttpStatus.NOT_FOUND);
|
||||
}
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(false, HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@PutMapping("/users/elevate")
|
||||
public ResponseEntity<Boolean> elevateUser(
|
||||
@RequestParam(name = "sessionid") String sessionID,
|
||||
@RequestParam(name = "mail") String mail,
|
||||
@RequestParam(name = "permission") int permission)
|
||||
{
|
||||
User sessionUser = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(sessionUser != null && sessionUser.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
System.out.println("test");
|
||||
User userToUpdateTemplate = db.getUser(mail);
|
||||
User userToUpdate = new User(userToUpdateTemplate.getId(), userToUpdateTemplate.getFirstName(), userToUpdateTemplate.getLastName(),
|
||||
userToUpdateTemplate.getMail(), userToUpdateTemplate.getPassword(), permission);
|
||||
|
||||
User resultingUser = db.updateUser(userToUpdate, userToUpdate.getId(), true);
|
||||
|
||||
if(resultingUser == null)
|
||||
{
|
||||
return new ResponseEntity<>(false, HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(true, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(false, HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/users/data")
|
||||
public ResponseEntity<User> getUserData(
|
||||
@RequestParam(name = "sessionid") String sessionID,
|
||||
@RequestParam(name = "mail") String mail) {
|
||||
User sessionUser = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if (sessionUser != null) {
|
||||
System.out.println(sessionUser.getMail() + " " + mail);
|
||||
|
||||
if (sessionUser.getMail().equals(mail) || sessionUser.getPermissions() == UserPermissions.admin.getValue()) {
|
||||
User searchedUser = db.getUser(mail);
|
||||
return new ResponseEntity<>(searchedUser, HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/users/check")
|
||||
public ResponseEntity<User> checkLogin(@RequestParam(name="sessionid") String sessionid)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionid);
|
||||
|
||||
if(u != null)
|
||||
{
|
||||
return new ResponseEntity<>(db.getUser(u.getId()), HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@DeleteMapping("/users")
|
||||
public ResponseEntity<Boolean> deleteUser(@RequestParam(name = "sessionid") String sessionID, @RequestParam(name = "mail") String mail) {
|
||||
User sessionUser = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if (sessionUser != null && sessionUser.getPermissions() == UserPermissions.admin.getValue()) {
|
||||
return new ResponseEntity<>(db.deleteUser(mail), HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/users/all")
|
||||
public ResponseEntity<User[]> getAllUsers(@RequestParam(name = "sessionid") String sessionid)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionid);
|
||||
|
||||
if(u != null && u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
User[] output = db.getAllUsers();
|
||||
return new ResponseEntity<>(output, HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
package com.example.backend.anwprj.controller;
|
||||
|
||||
import com.example.backend.anwprj.DataBaseHandler;
|
||||
import com.example.backend.anwprj.Days.Day;
|
||||
import com.example.backend.anwprj.Users.User;
|
||||
import com.example.backend.anwprj.Users.UserPermissions;
|
||||
import com.example.backend.anwprj.Users.UserSessionIDHandler;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import com.example.backend.anwprj.Week.Week;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
@RestController
|
||||
public class WeekController
|
||||
{
|
||||
|
||||
private DataBaseHandler db;
|
||||
|
||||
{
|
||||
db = DataBaseHandler.getInstance();
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@GetMapping("/weeks")
|
||||
public ResponseEntity<Week> getWeek(
|
||||
@RequestParam(name="sessionid") String sessionID,
|
||||
@RequestParam(name="semesterid") int semesterID,
|
||||
@RequestParam(name="weeknumber") int weekNumber) throws SQLException {
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(u != null)
|
||||
{
|
||||
Week w = db.getWeek(semesterID,weekNumber);
|
||||
|
||||
if(w != null)
|
||||
{
|
||||
return new ResponseEntity<>(w, HttpStatus.OK);
|
||||
}
|
||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@CrossOrigin
|
||||
@PostMapping("/weeks")
|
||||
public ResponseEntity<Week> addWeek(@RequestBody Week week, @RequestParam(name="sessionid") String sessionID)
|
||||
{
|
||||
User u = UserSessionIDHandler.getUserBySessionID(sessionID);
|
||||
|
||||
if(u !=null && u.getPermissions() == UserPermissions.admin.getValue())
|
||||
{
|
||||
return new ResponseEntity<>(db.addWeek(week), HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(null, HttpStatus.FORBIDDEN);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
package com.example.backend;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
class BackendApplicationTests
|
||||
{
|
||||
|
||||
@Test
|
||||
void contextLoads()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
@@ -8,28 +8,16 @@
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
@@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
</profile>
|
||||
</component>
|
||||
@@ -2,7 +2,7 @@
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/anwendung.iml" filepath="$PROJECT_DIR$/.idea/anwendung.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/projekt.iml" filepath="$PROJECT_DIR$/.idea/projekt.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
@@ -3,6 +3,7 @@
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||
</content>
|
||||
@@ -0,0 +1,70 @@
|
||||
# Getting Started with Create React App
|
||||
|
||||
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
|
||||
|
||||
## Available Scripts
|
||||
|
||||
In the project directory, you can run:
|
||||
|
||||
### `npm start`
|
||||
|
||||
Runs the app in the development mode.\
|
||||
Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
|
||||
|
||||
The page will reload when you make changes.\
|
||||
You may also see any lint errors in the console.
|
||||
|
||||
### `npm test`
|
||||
|
||||
Launches the test runner in the interactive watch mode.\
|
||||
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
|
||||
|
||||
### `npm run build`
|
||||
|
||||
Builds the app for production to the `build` folder.\
|
||||
It correctly bundles React in production mode and optimizes the build for the best performance.
|
||||
|
||||
The build is minified and the filenames include the hashes.\
|
||||
Your app is ready to be deployed!
|
||||
|
||||
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
|
||||
|
||||
### `npm run eject`
|
||||
|
||||
**Note: this is a one-way operation. Once you `eject`, you can't go back!**
|
||||
|
||||
If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
|
||||
|
||||
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
|
||||
|
||||
You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
|
||||
|
||||
## Learn More
|
||||
|
||||
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
|
||||
|
||||
To learn React, check out the [React documentation](https://reactjs.org/).
|
||||
|
||||
### Code Splitting
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
|
||||
|
||||
### Analyzing the Bundle Size
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
|
||||
|
||||
### Making a Progressive Web App
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
|
||||
|
||||
### Advanced Configuration
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
|
||||
|
||||
### Deployment
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
|
||||
|
||||
### `npm run build` fails to minify
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "projekt",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@testing-library/jest-dom": "^5.16.5",
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-scripts": "5.0.1",
|
||||
"web-vitals": "^2.1.4"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
@@ -0,0 +1,44 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<meta
|
||||
name="description"
|
||||
content="Web site created using create-react-app"
|
||||
/>
|
||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
||||
<!--
|
||||
manifest.json provides metadata used when your web app is installed on a
|
||||
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
|
||||
-->
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
||||
<!--
|
||||
Notice the use of %PUBLIC_URL% in the tags above.
|
||||
It will be replaced with the URL of the `public` folder during the build.
|
||||
Only files inside the `public` folder can be referenced from the HTML.
|
||||
|
||||
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
||||
work correctly both with client-side routing and a non-root public URL.
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<title>React App</title>
|
||||
<script src="../src/index.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<!--
|
||||
This HTML file is a template.
|
||||
If you open it directly in the browser, you will see an empty page.
|
||||
|
||||
You can add webfonts, meta tags, or analytics to this file.
|
||||
The build step will place the bundled scripts into the <body> tag.
|
||||
|
||||
To begin the development, run `npm start` or `yarn start`.
|
||||
To create a production bundle, use `npm run build` or `yarn build`.
|
||||
-->
|
||||
</body>
|
||||
</html>
|
||||
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"short_name": "React App",
|
||||
"name": "Create React App Sample",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "64x64 32x32 24x24 16x16",
|
||||
"type": "image/x-icon"
|
||||
},
|
||||
{
|
||||
"src": "logo192.png",
|
||||
"type": "image/png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "logo512.png",
|
||||
"type": "image/png",
|
||||
"sizes": "512x512"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Disallow:
|
||||
@@ -0,0 +1,57 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
.App {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.App-logo {
|
||||
height: 40vmin;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
.App-logo {
|
||||
animation: App-logo-spin infinite 20s linear;
|
||||
}
|
||||
}
|
||||
|
||||
.App-header {
|
||||
background-color: #282c34;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: calc(10px + 2vmin);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.App-link {
|
||||
color: #61dafb;
|
||||
}
|
||||
|
||||
@keyframes App-logo-spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.dateElement {
|
||||
background-color: chartreuse;
|
||||
border-radius: 5px;
|
||||
border-width: 0px;
|
||||
width: 200px;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import logo from './logo.svg';
|
||||
import './App.css';
|
||||
import DateElement from './DateElement'
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<div className="App">
|
||||
<DateElement count={0} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
@@ -0,0 +1,8 @@
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import App from './App';
|
||||
|
||||
test('renders learn react link', () => {
|
||||
render(<App />);
|
||||
const linkElement = screen.getByText(/learn react/i);
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
});
|
||||
@@ -10,15 +10,15 @@ export default function DateElement(props){
|
||||
const currDate = new Date();
|
||||
|
||||
startDate = addDays(currDate, (currDate.getDay()-1)*-1); //berechnet den Montag der aktuellen Woche
|
||||
startDate = addDays(startDate, props.week*7); //erhöht das Datum um 7 Tage für jede Woche, die weiter geklickt wurde.
|
||||
endDate = addDays(startDate, 6);
|
||||
startDate = addDays(startDate, props.count*7); //erhöht das Datum um 7 Tage für jede Woche, die weiter geklickt wurde.
|
||||
endDate = addDays(startDate, 7);
|
||||
|
||||
const startDateString = `${startDate.getDate()}.${startDate.getMonth()+1}.${startDate.getFullYear()}`;
|
||||
const endDateString = `${endDate.getDate()}.${endDate.getMonth()+1}.${endDate.getFullYear()}`;
|
||||
return (
|
||||
<>
|
||||
<div className="dateElement round-border">
|
||||
<p>{startDateString} - {endDateString}</p>
|
||||
<div className="container">
|
||||
<p className="dateElement">{startDateString} - {endDateString}</p>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
@@ -0,0 +1,13 @@
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
||||
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
||||
sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
|
||||
monospace;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import './index.css';
|
||||
import App from './App';
|
||||
import reportWebVitals from './reportWebVitals';
|
||||
|
||||
const root = ReactDOM.createRoot(document.getElementById('root'));
|
||||
root.render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>
|
||||
);
|
||||
|
||||
// If you want to start measuring performance in your app, pass a function
|
||||
// to log results (for example: reportWebVitals(console.log))
|
||||
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
|
||||
reportWebVitals();
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@@ -0,0 +1,13 @@
|
||||
const reportWebVitals = onPerfEntry => {
|
||||
if (onPerfEntry && onPerfEntry instanceof Function) {
|
||||
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
|
||||
getCLS(onPerfEntry);
|
||||
getFID(onPerfEntry);
|
||||
getFCP(onPerfEntry);
|
||||
getLCP(onPerfEntry);
|
||||
getTTFB(onPerfEntry);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export default reportWebVitals;
|
||||
@@ -0,0 +1,5 @@
|
||||
// jest-dom adds custom jest matchers for asserting on DOM nodes.
|
||||
// allows you to do things like:
|
||||
// expect(element).toHaveTextContent(/react/i)
|
||||
// learn more: https://github.com/testing-library/jest-dom
|
||||
import '@testing-library/jest-dom';
|
||||