From 49a53f3d052716e0ecfb38472ff07e1eb3e37c7f Mon Sep 17 00:00:00 2001 From: brausjonas Date: Sat, 6 May 2023 15:15:18 +0200 Subject: [PATCH] Calender View documentation --- .../.idea/codeStyles/codeStyleConfig.xml | 5 + anwendung/src/components/Button.jsx | 3 +- anwendung/src/components/CalenderView.jsx | 379 +++++++++++------- anwendung/src/pages/index.js | 40 -- anwendung/src/styles/globals.css | 1 + 5 files changed, 251 insertions(+), 177 deletions(-) create mode 100644 anwendung/.idea/codeStyles/codeStyleConfig.xml diff --git a/anwendung/.idea/codeStyles/codeStyleConfig.xml b/anwendung/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/anwendung/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/anwendung/src/components/Button.jsx b/anwendung/src/components/Button.jsx index 81fd7a1..af7e377 100644 --- a/anwendung/src/components/Button.jsx +++ b/anwendung/src/components/Button.jsx @@ -53,7 +53,8 @@ export default function Button(p) { color: fontColor, fontSize: font_size, minWidth: width, - minHeight: height + minHeight: height, + textAlign: "center", }} onClick={onClick}> {text} diff --git a/anwendung/src/components/CalenderView.jsx b/anwendung/src/components/CalenderView.jsx index 8a502dd..0641daf 100644 --- a/anwendung/src/components/CalenderView.jsx +++ b/anwendung/src/components/CalenderView.jsx @@ -2,178 +2,257 @@ import {useEffect, useState} from "react"; import {CalenderEntry} from "@/components/CalenderEntry"; import Button from "@/components/Button"; +//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; + +//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; -export default function CalenderView(p) { +export default function CalenderView(p) +{ + //state to update the calender view const [t, setT] = useState(false) - useEffect(() => { + //a blocker for the right click context menu + useEffect(() => + { window.addEventListener("contextmenu", (e) => (e.preventDefault())) }) - function mouse_move(e) { - if (mouseDown) { - let y_window = e.clientY; - let y_target_offset = e.currentTarget.getBoundingClientRect().top; - let id = e.currentTarget.id; - let row = Math.floor((y_window - y_target_offset) / cellHeight) + 1 + //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; + } - if (grabbed != null) { + //resize a grabbed element to the row paramter + function size_grabbed(row) + { + if (row >= 0 && row <= 96) + { + if (grabbedUp) + { - if (row >= 0 && row <= 96) { - if (grabbedUp) { - - if (row < grabbed.end_point - 1) { - grabbed.start_point = row; - } - } else { - if (row > grabbed.start_point) { - grabbed.end_point = row + 1; - } - } + if (row < grabbed.end_point - 1) + { + grabbed.start_point = row; } - } else if (selectedElement != null) { - if (selectedListID !== id) { - let index = -1; - let currentList = entries[selectedListID]; - let temp = []; - for (let i = 0; i < currentList.length; i++) { - if (selectedElement !== currentList[i]) { - temp.push(currentList[i]); - } - } - entries[selectedListID] = temp; - entries[id].push(selectedElement); - selectedListID = id; - } - - if (row - selectedOffsetTop > 0 && row + selectedOffsetBottom <= 97) { - selectedElement.start_point = row - selectedOffsetTop; - selectedElement.end_point = row + selectedOffsetBottom; + } else + { + if (row > grabbed.start_point) + { + grabbed.end_point = row + 1; } } } + } + + //moves the selected element to row and list with id + function move_selected(row, id) + { + if (selectedListID !== id) + { + delete_element(selectedListID, selectedElement); + entries[id].push(selectedElement); + selectedListID = id; + } + + if (row - selectedOffsetTop > 0 && row + selectedOffsetBottom <= 97) + { + 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 + + //if a edge of an element was grabbed, resize it + if (grabbed != null) + { + size_grabbed(row); + //if a whole element was grabbed, move it + } else if (selectedElement != null) + { + move_selected(row, id); + } + } + + //update the calender view setT(!t); } - function mouse_up(e) { + //routine when mouse was released + function mouse_up(e) + { mouseDown = false; - 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 current_list = entries[e.currentTarget.id]; - if (grabbed != null) { + //remove all selected elements + if (grabbed != null) + { grabbed = null; } - if (selectedElement != null) { + if (selectedElement != null) + { selectedElement = null; } setT(!t); } - function mouse_down(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 current_list = entries[e.currentTarget.id]; - - if (e.button === 2) { - - let current = null; - for (let i = 0; i < current_list.length; i++) { - current = current_list[i]; - if (current.start_point <= row && current.end_point >= row) { - break; - } - current = null; + //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; + } - if (current != null) { - let temp = [] - for (let i = 0; i < current_list.length; i++) { - if (current_list[i] !== current) { - temp.push(current_list[i]); - } - } + return current; + } - entries[e.currentTarget.id] = temp; - } + //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]; - } else { - - - mouseDown = true; - - if (e.target.id === "grab") { - let entry = e.target.parentElement; - let rowStart = parseInt(window.getComputedStyle(entry).gridRowStart); - - for (let i = 0; i < current_list.length; i++) { - let current = current_list[i]; - if (current.start_point === row || current.end_point === row + 1) { - grabbed = current; - break; - } - } - - if (row === rowStart) { - grabbedUp = true; - } else { - grabbedUp = false; - } - } else if (e.target.id === "entry") { - for (let i = 0; i < current_list.length; i++) { - let current = current_list[i]; - if (current.start_point <= row && current.end_point >= row) { - selectedElement = current; - selectedListID = e.currentTarget.id; - break; - } - } - - - selectedOffsetTop = row - parseInt(window.getComputedStyle(e.target).gridRowStart); - selectedOffsetBottom = parseInt(window.getComputedStyle(e.target).gridRowEnd) - row; - } else { - if (row < 96) { - let free = true; - for (let i = 0; i < current_list.length; i++) { - let current = current_list[i]; - - for (let r = row; r < row + 2; r++) { - for (let s = current.start_point; s < current.end_point; s++) { - if (s === r) { - free = false; - break; - } - } + for (let r = row; r < row + 2; r++) + { + for (let s = current.start_point; s < current.end_point; s++) + { + if (s === r) + { + free = false; + break; } } - - if (free) { - current_list.push(new CalenderEntry(row, row + 3)); - setT(!t); - } } } + + if (free) + { + list.push(new CalenderEntry(row, row + 3)); + setT(!t); + } } } - function internal_to_time(internal) { + //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 = find_current(row, current_list); + + //check if the upper or lower resize bar was grabbed + if (row === rowStart) + { + grabbedUp = true; + } else + { + grabbedUp = false; + } + } + //if a whole element was clicked to move + else if (e.target.id === "entry") + { + selectedListID = e.currentTarget.id; + selectedElement = find_current(row, current_list); + + 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) @@ -184,13 +263,22 @@ export default function CalenderView(p) { } let temp = [] - for (let i = 2; i <= 96; i += 2) { + for (let i = 2; i <= 96; i += 2) + { temp.push(i); } + //html of the calender view return ( -
-
+ {/*overlay with timeline*/}
+ {/*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)}

-
) } \ No newline at end of file diff --git a/anwendung/src/pages/index.js b/anwendung/src/pages/index.js index 3f1274f..934cbc5 100644 --- a/anwendung/src/pages/index.js +++ b/anwendung/src/pages/index.js @@ -19,46 +19,6 @@ export default function Home(p) { <>
-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

-

fdsfsdf

diff --git a/anwendung/src/styles/globals.css b/anwendung/src/styles/globals.css index dc9e7de..627e681 100644 --- a/anwendung/src/styles/globals.css +++ b/anwendung/src/styles/globals.css @@ -224,6 +224,7 @@ Calender View height: 60px; width: 1000px; gap: 5px; + padding: 0 0 5px 0; background-color: #363636; }