import {useEffect, useRef, useState} from "react"; import Button from "@/components/Button"; import {list} from "postcss"; import Background from "@/components/Background"; import WeekSelector from "@/components/WeekSelector"; import {baseURL} from "@/components/Constants"; import {ErrorType} from "@/components/ErrorType"; import BasicDateCalendar from "@/components/CalendarSideBar"; let cellHeight = 20; let colors = ["#f80000", "#414141"] let semesterStart; let currentWeekStartDay; let currentYear; let selectedElement; let grabbedDown; let isDayOkay = [true, true, true, true, true, true] let errorState = ErrorType.Okay export default function CalenderView(p) { const [entries, setEntries] = useState([[], [], [], [], [], []]) const [update, setUpdate] = useState(false) const scrollRef = useRef(null); const[startDayCalenderSideBar, setStartDayCalenderSideBar] = useState(0) const[startYearCalenderSideBar, setStartYearCalenderSideBar] = useState(2000) const[endDayCalenderSideBar, setEndDayCalenderSideBar] = useState(0) const[endYearCalenderSideBar, setEndYearCalenderSideBar] = useState(2000) const [highlightMonth, setHighlightMonth] = useState(0) const [highlightYear, setHighlightYear] = useState(2000) function readEntries() { let url = baseURL + "/entries?semesterid=" + localStorage.getItem("currentsid") + "&daynumber=" + currentWeekStartDay + "&yearnumber=" + currentYear + "&sessionid=" + localStorage.getItem("sessionid"); try { fetch(url).then(r => r.json()).then(en => { for (let i = 0; i < en.length; i++) { isDayOkay[i] = true let maxLunchBreak = 0 let daySum = 0 for (let j = 0; j < en[i].length; j++) { if (en[i][j] != null) { let elem = en[i][j] if ((elem.timestart - 1) / 4 < 8) { errorState = ErrorType.TooEarly isDayOkay[i] = false break } else if ((elem.timeend - 1) / 4 > 17) { errorState = ErrorType.TooLate isDayOkay[i] = false break } else { if ((elem.timestart - 1) / 4 <= 11 && (elem.timeend - 1) / 4 >= 14) { errorState = ErrorType.NotEnoughLunchTime isDayOkay[i] = false break } else if ((elem.timeend - 1) / 4 >= 11 && (elem.timeend - 1) / 4 <= 14) { let min = 24 * 3 for (let j2 = 0; j2 < en[i].length; j2++) { if (en[i][j2] != null && (en[i][j2].timestart - 1) / 4 >= 11 && (en[i][j2].timestart - 1) / 4 <= 14) { if (en[i][j2].timestart < min && en[i][j2].timestart >= elem.timeend) { min = en[i][j2].timestart } } } if (min - elem.timeend < 3) { errorState = ErrorType.NotEnoughLunchTime isDayOkay[i] = false break } } } daySum += elem.timeend - elem.timestart } } if (daySum / 4 > 8) { errorState = ErrorType.TooLong isDayOkay[i] = false } } setEntries(en) }) } catch (e) { } } function pushEntry(currentColumnID, row) { let url = baseURL + "/entries" + "?sessionid=" + localStorage.getItem("sessionid") let json = { "id": 0, "daynumber": currentWeekStartDay + currentColumnID, "yearnumber": currentYear, "semesterid": localStorage.getItem("currentsid"), "usercreatedbyid": localStorage.getItem("userid"), "timestart": row, "timeend": row + 3, "info": localStorage.getItem("currentmodulename") } fetch(url, { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify(json) }).then(r => { readEntries() }) } function deleteEntry(id) { let url = baseURL + "/entries?id=" + id + "&sessionid=" + localStorage.getItem("sessionid"); fetch(url, { method: "DELETE" }).then(r => readEntries()) } function checkForElementAtRow(row, column) { let currentList = entries[column]; for (let i = 0; i < currentList.length; i++) { if (currentList[i] != null) { if (row >= currentList[i].timestart && row <= currentList[i].timeend) { return true; } } } return false; } function getElementInColumn(id, column) { let currentList = entries[column]; for (let i = 0; i < currentList.length; i++) { if (currentList[i] != null) { if (currentList[i].id === id) { return currentList[i]; } } } return null; } function onMouseUp(e) { if (selectedElement != null) { let id = selectedElement.id; if ((selectedElement.timestart - 1) / 4 >= 7 && (selectedElement.timeend - 1) / 4 <= 18) { let url = baseURL + "/entries?sessionid=" + localStorage.getItem("sessionid"); let json = { "id": id, "daynumber": 0, "yearnumber": 0, "semesterid": 0, "usercreatedbyid": 0, "timestart": selectedElement.timestart, "timeend": selectedElement.timeend, "info": "" } fetch(url, { method: "PUT", headers: {"Content-Type": "application/json"}, body: JSON.stringify(json) }).then(r => { readEntries() }) } selectedElement = null; } } function onMouseMove(e) { if (selectedElement != null) { let y_window = e.clientY; let y_target_offset = e.currentTarget.getBoundingClientRect().top; let row = Math.floor((y_window - y_target_offset) / cellHeight) + 1; let currentColumnID = parseInt(e.currentTarget.id) if (grabbedDown) { if (row - 1 > selectedElement.timestart) { let free = true; for (let i = 0; i < entries[currentColumnID].length; i++) { if (entries[currentColumnID][i] != null && selectedElement !== entries[currentColumnID][i]) { if (row <= entries[currentColumnID][i].timeend && row >= entries[currentColumnID][i].timestart || row > entries[currentColumnID][i].timeend && selectedElement.timestart < entries[currentColumnID][i].timestart) { free = false; break; } } } if (free) { selectedElement.timeend = row + 1; } } } else if (row + 2 < selectedElement.timeend) { let free = true; for (let i = 0; i < entries[currentColumnID].length; i++) { if (entries[currentColumnID][i] != null && selectedElement !== entries[currentColumnID][i]) { if (row < entries[currentColumnID][i].timeend && row >= entries[currentColumnID][i].timestart || row < entries[currentColumnID][i].timestart && selectedElement.timeend > entries[currentColumnID][i].timestart) { free = false; break; } } } if (free) { selectedElement.timestart = row; } } setUpdate(!update); } } function onMouseDown(e) { let y_window = e.clientY; let y_target_offset = e.currentTarget.getBoundingClientRect().top; let row = Math.floor((y_window - y_target_offset) / cellHeight) + 1; let currentColumnID = parseInt(e.currentTarget.id) let currentId = e.target.id; let currentUserID = localStorage.getItem("userid"); if (e.button === 0) { if (!currentId.includes("e")) { if (!currentId.includes("grab")) { if (!checkForElementAtRow(row + 2, currentColumnID)) { if ((row - 1) / 4 >= 7 && (row + 2) / 4 <= 18) { pushEntry(currentColumnID, row) } } } else { let parentID = parseInt(e.target.parentElement.id.replace("e", "")); if (currentUserID == getElementInColumn(parentID, currentColumnID).usercreatedbyid) { grabbedDown = currentId.includes("down") selectedElement = getElementInColumn(parentID, currentColumnID); } } } } else if (e.button === 2) { let parentID = parseInt(e.target.id.replace("e", "")); if (currentUserID == getElementInColumn(parentID, currentColumnID).usercreatedbyid && currentId.includes("e")) { let id = parseInt(currentId.replace("e", "")) deleteEntry(id) } } } function onWeekLeft() { currentWeekStartDay -= 7; let date = new Date(currentYear, 0, currentWeekStartDay + 5) setHighlightMonth(date.getMonth()) setHighlightYear(date.getFullYear()) readEntries() } function onWeekRight() { currentWeekStartDay += 7; let date = new Date(currentYear, 0, currentWeekStartDay + 5) setHighlightMonth(date.getMonth()) setHighlightYear(date.getFullYear()) readEntries() } function getEntryColor(userCreatedByID, columnID) { let id = localStorage.getItem("userid"); if (id == userCreatedByID) { if (isDayOkay[columnID]) { return "#77932b"; } else { return "#e5a10e"; } } else { return "#a2a2a2"; } } function getResizeBarColor(userCreatedByID, columnID) { let id = localStorage.getItem("userid"); if (id == userCreatedByID) { if (isDayOkay[columnID]) { return "#5a6c20"; } else { return "#c08809"; } } else { return "#a2a2a2"; } } useEffect(() => { semesterStart = 0; currentWeekStartDay = 0; currentYear = 2000; selectedElement = null; grabbedDown = false; let url = baseURL + "/semester/id?sessionid=" + localStorage.getItem("sessionid") + "&id=" + localStorage.getItem("currentsid"); console.log(localStorage.getItem("currentsid")) fetch(url).then(r => r.json()).then(s => { currentWeekStartDay = s.startday - new Date(s.startyear, 0, s.startday).getUTCDay(); currentYear = s.startyear; setStartYearCalenderSideBar(currentYear) setEndYearCalenderSideBar(s.endyear) //console.log(new Date(s.startyear, 0, s.startday).getMonth()) setHighlightMonth(new Date(s.startyear, 0, s.startday).getMonth()) setHighlightYear(currentYear) semesterStart = s.startday; setStartDayCalenderSideBar(semesterStart) setEndDayCalenderSideBar(s.endday) }).then(readEntries) scrollRef.current.scrollTop = 600; window.addEventListener("contextmenu", (e) => (e.preventDefault())) window.addEventListener("keypress", (e) => { try { if (e.key === "+") { cellHeight += 2 } else if (e.key === "-") { if (cellHeight - 2 >= 8) { cellHeight -= 2 } } } catch (e) { } }) setInterval(function () { if (selectedElement == null) { readEntries() } }, 500); }, []) //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); } function onMonthClick(monthIndex, startParts) { monthIndex-- let date = new Date(parseInt(startParts[2]), monthIndex, 1) let start = new Date(date.getFullYear(), 0, 0) currentWeekStartDay = Math.round((date - start) / (1000 * 60 * 60 * 24)) currentWeekStartDay = currentWeekStartDay - new Date(date.getFullYear(), 0, currentWeekStartDay).getUTCDay() currentYear = date.getFullYear() setHighlightMonth(date.getMonth()) setHighlightYear(currentYear) readEntries() } return (
onWeekLeft()} onFunctionRight={() => onWeekRight()}/>
Montag {new Date(currentYear, 0, currentWeekStartDay).getDate()}.
Dienstag {new Date(currentYear, 0, currentWeekStartDay + 1).getDate()}.
Mittwoch {new Date(currentYear, 0, currentWeekStartDay + 2).getDate()}.
Donnerstag {new Date(currentYear, 0, currentWeekStartDay + 3).getDate()}.
Freitag {new Date(currentYear, 0, currentWeekStartDay + 4).getDate()}.
Samstag {new Date(currentYear, 0, currentWeekStartDay + 5).getDate()}.
onMouseDown(e)} onMouseMove={e => onMouseMove(e)} onMouseUp={e => onMouseUp(e)}> {entries[0].map(d => (d != null &&

{internal_to_time(d.timestart) + " - " + internal_to_time(d.timeend)}

{d.info}

))}
onMouseDown(e)} onMouseMove={e => onMouseMove(e)} onMouseUp={e => onMouseUp(e)}> {entries[1].map(d => (d != null &&

{internal_to_time(d.timestart) + " - " + internal_to_time(d.timeend)}

{d.info}

))}
onMouseDown(e)} onMouseMove={e => onMouseMove(e)} onMouseUp={e => onMouseUp(e)}> {entries[2].map(d => (d != null &&

{internal_to_time(d.timestart) + " - " + internal_to_time(d.timeend)}

{d.info}

))}
onMouseDown(e)} onMouseMove={e => onMouseMove(e)} onMouseUp={e => onMouseUp(e)}> {entries[3].map(d => (d != null &&

{internal_to_time(d.timestart) + " - " + internal_to_time(d.timeend)}

{d.info}

))}
onMouseDown(e)} onMouseMove={e => onMouseMove(e)} onMouseUp={e => onMouseUp(e)}> {entries[4].map(d => (d != null &&

{internal_to_time(d.timestart) + " - " + internal_to_time(d.timeend)}

{d.info}

))}
onMouseDown(e)} onMouseMove={e => onMouseMove(e)} onMouseUp={e => onMouseUp(e)}> {entries[5].map(d => (d != null &&

{internal_to_time(d.timestart) + " - " + internal_to_time(d.timeend)}

{d.info}

))}
{/*maps a list of internal time stamps to lines and time stamps*/} {temp.map(i => (

{internal_to_time(i + 1)}

{internal_to_time(i + 1)}

{internal_to_time(i + 1)}

{internal_to_time(i + 1)}

{internal_to_time(i + 1)}

{internal_to_time(i + 1)}

))}
) }