diff --git a/auth.js b/auth.js index 3b022be..706829c 100644 --- a/auth.js +++ b/auth.js @@ -3,4 +3,6 @@ const couchdb_password = "admin"; const couchdb_name = "sassy"; +const debug_username = "dumble-door"; //set a default user when not logged in + //http://127.0.0.1:5984/_utils/#_config/couchdb@127.0.0.1 diff --git a/help/Example.html b/help/Example.html index e63eba3..f926d9c 100644 --- a/help/Example.html +++ b/help/Example.html @@ -39,10 +39,9 @@ test
test
test
test
test
test
test
test
test
test
showOverlay("overlay1"); -//setTimeout(() => hideOverlay("overlay1"), 3000); +const couchDB = new CouchDB(); async function main() { - const couchDB = new CouchDB(); await couchDB.set("xample", { "my_data": 1, "more_data": "bla" @@ -54,7 +53,9 @@ async function main() { } main(); -createTemp(); +createTemp().then((v) => { + setUserData(couchDB); +}); diff --git a/help/data_xample.js b/help/data_xample.js index 9affdee..a93be73 100644 --- a/help/data_xample.js +++ b/help/data_xample.js @@ -55,19 +55,23 @@ async function createTemp() { "type": "emoji" } ], + "result": [ + ["YES", "YES", 5, 2], + ["YES", "YES", 1, 3] + ], "result_history": [ { "date": "2025-12-27", "questions": [ + { "title": "1", "type": "text" }, + { "title": "2", "type": "scala" } + ], + "result": [ ["Gut, aber ...", 5], ["Schlecht", 1] ] } ], - "result": [ - ["YES", "YES", 5, 2], - ["YES", "YES", 1, 3] - ], "start_date": "2025-12-23", "expire_date": "2025-12-27" }); @@ -85,19 +89,23 @@ async function createTemp() { "type": "scala" } ], + "result": [ + ["Gut, aber ...", 5], + ["Schlecht", 1] + ], "result_history": [ { "date": "2025-12-27", "questions": [ + { "title": "1", "type": "text" }, + { "title": "2", "type": "scala" } + ], + "result": [ ["Gut, aber ...", 5], ["Schlecht", 1] ] } ], - "result": [ - ["Gut, aber ...", 5], - ["Schlecht", 1] - ], "start_date": "2025-12-23", "expire_date": "2025-12-27" }); diff --git a/lib/basic.css b/lib/basic.css index 21653b3..ad237af 100644 --- a/lib/basic.css +++ b/lib/basic.css @@ -1,11 +1,14 @@ :root { - --accent_color_fg: #007bff; + --accent_color_fg: rgba(0, 123, 255, 1); + --accent_color_fg_o: rgba(0, 123, 255, 0.5); --accent_color_bg: rgba(137, 197, 221, 1); --accent_color_bg_o: rgba(137, 197, 221, 0.5); + --accent_color_bg_o2: rgba(137, 197, 221, 0.25); --main_color_fg: white; --main_color_bg: black; --border-radius: 10px; --def-shadow: 10px 20px 20px rgb(128, 128, 128, 0.5); + --reversed_def_shadow: inset 1px 2.5px 2.5px rgb(128, 128, 128, 0.5); } * { box-sizing: border-box; @@ -24,10 +27,10 @@ body, html { font-size: 20px; } ::selection { - background-color: var(--accent_color_fg); + background-color: var(--accent_color_fg_o); color: black; } -selectable { +.selectable { -webkit-user-select: text; -moz-user-select: text; -ms-user-select: text; @@ -42,6 +45,14 @@ selectable { border-radius: 50%; background: var(--accent_color_bg); border: none; + background-size: 58px 58px; +} +input { + font-size: 18px; + background: none; + border: 1px solid black; + border-radius: var(--border-radius); + padding: 4px; } /* ----------- overlay ----------- */ @@ -188,4 +199,64 @@ content { .add_button:hover { border: 2px solid grey; background-color: lightgray; +} + + + +dropdown { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: none; + z-index: 300; +} +dropdown > div:first-child { + width: 100%; + height: 100%; + background: none; +} +dropdown > div:last-child { + position: absolute; + background: var(--accent_color_bg_o); + backdrop-filter: blur(10px); + border-radius: var(--border-radius); + transform: translate(calc(-100% + 50px), 5px); + width: 200px; + display: flex; + flex-direction:column; + box-shadow: var(--def-shadow); +} +dropdown > div:last-child label { + background: none; + font-size: 20px; + border: none; + border-bottom: 1px solid black; + padding-top: 8px; + padding-bottom: 8px; + font-weight: normal; + text-align: center; +} +dropdown > div:last-child button { + background: none; + font-size: 20px; + border: none; + border-bottom: 1px solid black; + padding-top: 8px; + padding-bottom: 8px; + font-weight: normal; + text-align: center; +} +dropdown > div:last-child button:hover { + background: var(--accent_color_fg_o); +} +dropdown > div:last-child button:first-child { + border-top-left-radius: var(--border-radius); + border-top-right-radius: var(--border-radius); +} +dropdown > div:last-child button:last-child { + border-bottom: none; + border-bottom-left-radius: var(--border-radius); + border-bottom-right-radius: var(--border-radius); } \ No newline at end of file diff --git a/lib/basic.js b/lib/basic.js index 363623e..020a4e4 100644 --- a/lib/basic.js +++ b/lib/basic.js @@ -331,9 +331,22 @@ function getURLArgsMap() { return res; } + +function form1(string) { + if (!string) return string; + return string.charAt(0).toUpperCase() + string.slice(1); +} + + async function getUserData(couchDB) { - const username = getURLArgsMap()["user"]; - if (!username) return null; + let username = getURLArgsMap()["user"]; + if (!username) { + if (typeof (debug_username) == "string") { + username = debug_username; + } else { + return null; + } + } const res = await couchDB.get("users"); if (!res) return null; const data = res[username]; @@ -351,5 +364,92 @@ async function setUserData(couchDB) { return false; } userData = res; + updateAllProfiles(res); return true; +} + +function updateAllProfiles(user) { + const profiles = document.getElementsByClassName("profile"); + for (var i of profiles) { + i.style.backgroundImage = `url("${user.avatar}")`; + i.onclick = _onProfileClick; + } +} +function _onProfileClick(event) { + var buttonRect = this.getBoundingClientRect(); + + var dropdown = document.createElement("dropdown"); + dropdown.addEventListener("click", dropdown.remove); + + var bg = document.createElement("div"); + dropdown.appendChild(bg); + + var div = document.createElement("div"); + + const _1 = window.innerHeight - buttonRect.y - 200; + if (_1 < 0) { + div.style.transform = "translate(calc(-100% + 58px), calc(-100% - 30px))"; + } + + div.style.top = (buttonRect.bottom) + 'px'; + div.style.left = (buttonRect.left) + 'px'; + div.innerHTML = ` + + + + `; + dropdown.appendChild(div); + + document.body.appendChild(dropdown); +} +function _onProfilClickOnProfil() { + if (typeof(showProfile) == "function") { + showProfile(userData); + } else { + _showProfile(userData); + } +} +function _showProfile(user) { + let elm = getId("profile_overlay"); + if (!elm) { + elm = document.createElement("overlay"); + elm.setAttribute("id", "profile_overlay"); + document.body.appendChild(elm); + } + elm.innerHTML = ` +
Profil-Übersicht
+ +
+
+${!user.title ? "": user.title+" "}${form1(user.name)} +

+
+ +Level: ${user.level ?? 0}
+Rolle: ${form1(user.role ?? "Student")} +

+Avatar:

+ + `; + showOverlay("profile_overlay"); +} +async function _showProfileSave(elm) { + if (!userData) return; + + let couchDB = new CouchDB(); + const res = await couchDB.get("users"); + + const avatar = elm.parentElement.querySelector("input"); + + userData.avatar = avatar.value; + + const user = {...userData}; + delete user["name"]; + res[userData.name] = user; + + await couchDB.set("users", res); + + updateAllProfiles(userData); + + hideOverlay("profile_overlay"); } \ No newline at end of file diff --git a/prof/auswertung.html b/prof/auswertung.html index a7d91bf..3a3508f 100644 --- a/prof/auswertung.html +++ b/prof/auswertung.html @@ -6,19 +6,75 @@ -
-
-
⇦
-   Meine Kurse +
+
+
⇦
+   Meine Kurse +
Auswertungen
@@ -27,7 +83,143 @@ setUserData(couchDB);
+ + + +
+
+
+
+
+ \ No newline at end of file diff --git a/prof/uebersicht.html b/prof/uebersicht.html index 547e65a..833caa6 100644 --- a/prof/uebersicht.html +++ b/prof/uebersicht.html @@ -106,10 +106,10 @@ Abgabe-Termin:

async function showEditCourse(name) { const data = await couchDB.get("course:" + name); - if (data.owner != userData.name) { + /*if (data.owner != userData.name) { console.error("User is not author"); return; - } + }*/ showOverlay("edit_course");