From c979c3a80118e828ad4c45251344706ff29684ad Mon Sep 17 00:00:00 2001 From: brausjonas Date: Wed, 21 Jun 2023 17:04:26 +0200 Subject: [PATCH] Multiselect Fixed by Changing Columns --- anwendung/src/components/InputForm.jsx | 459 ++++++++---------- backend/.idea/misc.xml | 2 +- .../anwprj/Database/DataBaseHandler.java | 12 +- .../anwprj/controller/ModuleController.java | 12 + .../anwprj/Database/DataBaseHandler.class | Bin 17272 -> 17496 bytes .../anwprj/controller/ModuleController.class | Bin 5654 -> 5903 bytes 6 files changed, 230 insertions(+), 255 deletions(-) diff --git a/anwendung/src/components/InputForm.jsx b/anwendung/src/components/InputForm.jsx index 4b71c56..58009aa 100644 --- a/anwendung/src/components/InputForm.jsx +++ b/anwendung/src/components/InputForm.jsx @@ -14,267 +14,194 @@ let modulesDummy = [ ["Studienarbeit", "Bachelor"] ] -let tempSemesterNumber = 0 -let update = false - -let baseMapping = [] +let hasSemesterNumberChanged = false export default function InputForm(p) { - - const [startDate, setStartDate] = useState("0000-00-00") - const [endDate, setEndDate] = useState("0000-00-00") const [courseName, setCourseName] = useState("") + const [startDate, setStartDate] = useState("") + const [endDate, setEndDate] = useState("") const [semesterNumber, setSemesterNumber] = useState(0) const [users, setUsers] = useState([]) - const [modulesSelectorValues, setModulesSelectorValues] = useState(["nothing", "nothing"]) - const [userModulesMapping, setUserModulesMapping] = useState({}) - const [isChecked, setIsChecked] = useState([]) - const [isActivated, setIsActivated] = useState([]) + const [moduleUserMapping, setModuleUserMapping] = useState([]) + const router = useRouter() + useEffect(() => { - setTimeout(() => { - update = false; - baseMapping = [] + hasSemesterNumberChanged = false - let base = baseURL + "/semester/id?sessionid=" + localStorage.getItem("sessionid") + "&id=" + localStorage.getItem("currentsid") - fetch(base).then(r => r.json()).then(j => { + let arr = [] + modulesDummy[0].map(e => { + arr.push({"moduleid": -1, "userid": -1, "activated": 0}) + }) + setModuleUserMapping(arr) - tempSemesterNumber = j.number - setSemesterNumber(j.number) + let url = baseURL + "/users/all?sessionid=" + localStorage.getItem("sessionid") + fetch(url).then(r => r.json()).then(u => { + setUsers(u) + }) - setCourseName(j.name) + let tempSemesterNumber = 0 + if(localStorage.getItem("currentsid") != 0) + { + fetch(baseURL + "/semester/id?sessionid=" + localStorage.getItem("sessionid") + "&id=" + localStorage.getItem("currentsid")).then(r => r.json()).then(semester => { + setCourseName(semester.name) + let startYear = semester.startyear + let endYear = semester.endyear + let start = new Date(startYear, 0, semester.startday) + let end = new Date(endYear, 0, semester.endday) - let tempStartDate = new Date(parseInt(j.startyear), 0, parseInt(j.startday)) - let tempEndDate = new Date(parseInt(j.endyear), 0, parseInt(j.endday)) + setStartDate(startYear + "-" + ((start.getMonth() + 1) < 10 ? "0" + (start.getMonth() + 1) : (start.getMonth() + 1)) + "-" + (start.getDate() < 10 ? "0" + start.getDate() : start.getDate())) + setEndDate(endYear + "-" + ((end.getMonth() + 1) < 10 ? "0" + (end.getMonth() + 1) : (end.getMonth() + 1)) + "-" + (end.getDate() < 10 ? "0" + end.getDate() : end.getDate())) + + tempSemesterNumber = semester.number + setSemesterNumber(semester.number) + + arr = [] + modulesDummy[semester.number].map(e => { + arr.push({"moduleid": -1, "userid": -1, "activated": 0}) + }) - setStartDate(tempStartDate.getFullYear() + "-" + ((tempStartDate.getMonth() + 1).toString().padStart(2, "0")) + "-" + tempStartDate.getDate().toString().padStart(2, "0")) - setEndDate(tempEndDate.getFullYear() + "-" + ((tempEndDate.getMonth() + 1).toString().padStart(2, "0")) + "-" + tempEndDate.getDate().toString().padStart(2, "0")) }).then(() => { - readModules() - update = true - }).catch(() => readModules()) - }, 100) - - - }, []) - - function readModules() { - let usersTemp = [] - - let userURL = baseURL + "/users/all?sessionid=" + localStorage.getItem("sessionid") - fetch(userURL).then(r => r.json()).then(j => { - setUsers(j) - usersTemp = j - let temp = [false, false, false] - let temp2 = [] - for (let i = 0; i < j.length; i++) { - temp.push(false) - temp2.push(false) - } - setIsChecked(temp) - setIsActivated(temp2) - }).then(() => { - let modulesURL = baseURL + "/module/bysemesterid?sessionid=" + localStorage.getItem("sessionid") + "&semesterid=" + localStorage.getItem("currentsid"); - fetch(modulesURL).then(r => r.json()).then(j => { - - setUserModulesMapping(j) - baseMapping = j - - let temp = isChecked.slice() - let temp2 = isActivated.slice() - - for (let i = 0; i < usersTemp.length; i++) { - let currentUser = usersTemp[i] - - let found = false - let foundModuleLast = null - for (let f = 0; f < j.length; f++) { - let currentModule = j[f] - - if (currentModule.userid === currentUser.id) { - found = true - foundModuleLast = currentModule + fetch(baseURL + "/module/bysemesterid?sessionid=" + localStorage.getItem("sessionid") + "&semesterid=" + localStorage.getItem("currentsid")).then(r => r.json()).then(modules => { + console.log(modules) + for(let i = 0; i < modules.length; i++) + { + for(let j = 0; j < modulesDummy[tempSemesterNumber].length; j++) + { + if(modulesDummy[tempSemesterNumber][j] == modules[i].name) + { + arr[j].userid = modules[i].userid + arr[j].moduleid = modules[i].id + arr[j].activated = modules[i].activated + break + } } } - if (found) { - temp[i] = true - - temp2[i] = foundModuleLast.activated === 1 - } - } - - setIsChecked(temp) - setIsActivated(temp2) - }).then(() => { - setModulesSelectorValues(modulesDummy[tempSemesterNumber]) - }) - }) - } - - function onCourseNameChange(e) { - setCourseName(e.target.value) - } - - function onStartDateChange(e) { - setStartDate(e.target.value) - } - - function onEndDateChange(e) { - setEndDate(e.target.value) - } - - function onSemesterNumberChange(e) { - setSemesterNumber(e.target.value) - setModulesSelectorValues(modulesDummy[e.target.value]) - } - - function isOptionSelected(e, userid) { - let found = false; - - for (let i = 0; i < userModulesMapping.length; i++) { - let current = userModulesMapping[i] - if (current.name === e && current.userid === userid) { - found = true; - } - } - - - return found; - } - - function onCheckedChange(e, index) { - let temp = isChecked.slice() - temp[index] = e.target.checked - setIsChecked(temp) - - if (!e.target.checked) { - let temp = [] - let currentUser = users[index] - for (let j = 0; j < userModulesMapping.length; j++) { - if (userModulesMapping[j].userid !== currentUser.id) { - temp.push(userModulesMapping[j]) - } - } - - setUserModulesMapping(temp) - } - } - - function onActivatedChange(e, index) { - - let temp = isActivated.slice() - temp[index] = e.target.checked - setIsActivated(temp) - - let userid = users[index].id - - for (let j = 0; j < userModulesMapping.length; j++) { - if (userModulesMapping[j].userid === userid) { - userModulesMapping[j].activated = e.target.checked ? 1 : 0 - } - } - } - - function onModuleSelectionChange(e, index) { - let userid = users[index].id - - let newMapping = [] - let oldNamesIds = new Map() - - for (let j = 0; j < userModulesMapping.length; j++) { - let currentModuleMapping = userModulesMapping[j] - if (currentModuleMapping.userid != userid) { - newMapping.push(currentModuleMapping) - } else { - oldNamesIds.set(currentModuleMapping.name, currentModuleMapping.id) - } - } - - let found = false - for (let i = 0; i < e.target.options.length; i++) { - - let currentOption = e.target.options[i] - if (currentOption.selected) { - found = true - - newMapping.push({ - "id": oldNamesIds.has(currentOption.value) ? oldNamesIds.get(currentOption.value) : -1, - "userid": userid, - "semesterid": -1, - "name": currentOption.value, - "activated": isActivated[index] ? 1 : 0 + setModuleUserMapping(arr) }) - } + }) } + }, []) - let temp = isChecked.slice() - temp[index] = found - setIsChecked(temp) - - setUserModulesMapping(newMapping) - } - - function onButtonAbort() { + function onButtonAbort(e) { router.back() } - function onButtonSave() { - let tempDateStart = new Date(parseInt(startDate.split("-")[0]), parseInt(startDate.split("-")[1]) - 1, parseInt(startDate.split("-")[2])) - let tempDateEnd = new Date(parseInt(endDate.split("-")[0]), parseInt(endDate.split("-")[1]) - 1, parseInt(endDate.split("-")[2])) + function onButtonSave(e) { - let startDayInYear = Math.round((tempDateStart - new Date(tempDateStart.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24)) - let endDayInYear = Math.round((tempDateEnd - new Date(tempDateEnd.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24)) + let semesterid = localStorage.getItem("currentsid") + let startYear = parseInt(startDate.split("-")[0]) + let endYear = parseInt(endDate.split("-")[0]) - let semesterJson = { - "id": update ? localStorage.getItem("currentsid") : 0, - "startday": startDayInYear, - "endday": endDayInYear, - "name": courseName, - "startyear": tempDateStart.getFullYear(), - "endyear": tempDateEnd.getFullYear(), - "number": semesterNumber + let start = new Date(startYear, parseInt(startDate.split("-")[1]) - 1, parseInt(startDate.split("-")[2])) + let end = new Date(endYear, parseInt(endDate.split("-")[1]) - 1, parseInt(endDate.split("-")[2])) + + let startDayInYear = Math.round((start - new Date(startYear, 0, 0)) / (1000 * 60 * 60 * 24)) + let endDayInYear = Math.round((end - new Date(endYear, 0, 0)) / (1000 * 60 * 60 * 24)) + + if(semesterid == 0) + { + fetch(baseURL + "/semester?sessionid=" + localStorage.getItem("sessionid"), { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify({ + "id": 0, + "startday": startDayInYear, + "endday": endDayInYear, + "name": courseName, + "startyear": startYear, + "endyear": endYear, + "number": semesterNumber + }) + }).then(r => r.json()).then(semester => {semesterid = semester.id}).then(() => modulesInBackend(semesterid)) } + else + { + fetch(baseURL + "/semester?sessionid=" + localStorage.getItem("sessionid"), { + method: "PUT", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify({ + "id": semesterid, + "startday": startDayInYear, + "endday": endDayInYear, + "name": courseName, + "startyear": startYear, + "endyear": endYear, + "number": semesterNumber + }) + }).then(() => modulesInBackend(semesterid)) + } + } - fetch(baseURL + "/semester?sessionid=" + localStorage.getItem("sessionid"), { - method: update ? "PUT" : "POST", - headers: {"Content-Type": "application/json"}, - body: JSON.stringify(semesterJson) - }).then(r => r.json()).then(async sem => { - let semesterID = sem.id - - for (let i = 0; i < baseMapping.length; i++) { - let found = false - for (let j = 0; j < userModulesMapping.length; j++) { - if (baseMapping[i].name === userModulesMapping[j].name) { - found = true + function modulesInBackend(semesterid) + { + if (hasSemesterNumberChanged) { + fetch(baseURL + "/module/bysemesterid?sessionid=" + localStorage.getItem("sessionid") + "&id=" + localStorage.getItem("currentsid"), { + method: "DELETE" + }).then(() => { + for (let i = 0; i < moduleUserMapping.length; i++) { + let current = moduleUserMapping[i] + if (current.userid != -1) { + if (current.moduleid == -1) { + fetch(baseURL + "/module?sessionid=" + localStorage.getItem("sessionid"), { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify({ + "id": 0, + "userid": current.userid, + "semesterid": semesterid, + "name": modulesDummy[semesterNumber][i], + "activated": current.activated + }) + }) + } } } + }) + } else { - if (!found) { - fetch(baseURL + "/module?sessionid=" + localStorage.getItem("sessionid") + "&id=" + baseMapping[i].id, { - method: "DELETE" - }) + for (let i = 0; i < moduleUserMapping.length; i++) { + let current = moduleUserMapping[i] + if (current.userid != -1) { + if (current.moduleid == -1) { + fetch(baseURL + "/module?sessionid=" + localStorage.getItem("sessionid"), { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify({ + "id": 0, + "userid": current.userid, + "semesterid": semesterid, + "name": modulesDummy[semesterNumber][i], + "activated": current.activated + }) + }) + } else { + fetch(baseURL + "/module?sessionid=" + localStorage.getItem("sessionid"), { + method: "PUT", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify({ + "id": current.moduleid, + "userid": current.userid, + "semesterid": 0, + "name": "", + "activated": current.activated + }) + }) + } + } else { + if (current.moduleid != -1) { + fetch(baseURL + "/module?sessionid=" + localStorage.getItem("sessionid") + "&id=" + current.moduleid, { + method: "DELETE" + }) + } } } - - for (let i = 0; i < userModulesMapping.length; i++) { - - userModulesMapping[i].semesterid = semesterID - setTimeout(() => { - fetch(baseURL + "/module?sessionid=" + localStorage.getItem("sessionid"), { - method: userModulesMapping[i].id === -1 ? "POST" : "PUT", - headers: {"Content-Type": "application/json"}, - body: JSON.stringify(userModulesMapping[i]) - }) - }, i * 200) - - } - }) + } router.back() } @@ -285,25 +212,40 @@ export default function InputForm(p) {

Kursname

- onCourseNameChange(e)} value={courseName}/> + { + setCourseName(e.target.value) + }} value={courseName}/>

Theorie Anfang

Theorie Ende

- = endDate) ? "#E44747" : "white" - }} - onChange={e => onStartDateChange(e)} value={startDate}/> - = endDate) ? "#E44747" : "white" - }} - onChange={e => onEndDateChange(e)} value={endDate}/> + = endDate) ? "#E44747" : "white" + }} value={startDate} onChange={e => { + setStartDate(e.target.value) + }}/> + = endDate) ? "#E44747" : "white" + }} value={endDate} onChange={e => { + setEndDate(e.target.value) + }}/>

Semester Wählen

onCheckedChange(e, index)}/> + { + let arr = moduleUserMapping.slice() + arr[index].activated = e.target.checked ? 1 : 0 + setModuleUserMapping(arr) + } + }> - onActivatedChange(e, index)}/> +

{module}

+ - {user.firstName + " " + user.lastName} - - - { + + let arr = moduleUserMapping.slice() + arr[index].userid = e.target.value + setModuleUserMapping(arr) + console.log(moduleUserMapping) + }} + value={index < moduleUserMapping.length && moduleUserMapping[index].userid}> + + {users.map(user => ( + ))} @@ -360,7 +310,10 @@ export default function InputForm(p) { gap: 10 }}>
diff --git a/backend/.idea/misc.xml b/backend/.idea/misc.xml index e1c7304..f89b933 100644 --- a/backend/.idea/misc.xml +++ b/backend/.idea/misc.xml @@ -8,5 +8,5 @@ - + \ No newline at end of file diff --git a/backend/src/main/java/com/example/backend/anwprj/Database/DataBaseHandler.java b/backend/src/main/java/com/example/backend/anwprj/Database/DataBaseHandler.java index 140d75d..67a4b01 100644 --- a/backend/src/main/java/com/example/backend/anwprj/Database/DataBaseHandler.java +++ b/backend/src/main/java/com/example/backend/anwprj/Database/DataBaseHandler.java @@ -360,7 +360,7 @@ public class DataBaseHandler { try { - st.executeUpdate("update modules set activated=" + m.getActivated() + ", semesterid=" + m.getsemesterid() + ", name='" + m.getName() + "' where id=" + m.getid()); + st.executeUpdate("update modules set activated=" + m.getActivated() + ", userid=" + m.getUserid() + " where id=" + m.getid()); return getModule(m.getid()); @@ -382,6 +382,16 @@ public class DataBaseHandler { } } + public boolean deleteModuleBySemesterID(int id) { + try { + st.executeUpdate("delete from modules where semesterid=" + id); + st.executeUpdate("delete from entries where semesterid=" + id); + return true; + } catch (Exception ex) { + return false; + } + } + public boolean deleteModule(int id) { try { st.executeUpdate("delete from modules where id=" + id); diff --git a/backend/src/main/java/com/example/backend/anwprj/controller/ModuleController.java b/backend/src/main/java/com/example/backend/anwprj/controller/ModuleController.java index 277dcc7..61e41c4 100644 --- a/backend/src/main/java/com/example/backend/anwprj/controller/ModuleController.java +++ b/backend/src/main/java/com/example/backend/anwprj/controller/ModuleController.java @@ -169,6 +169,18 @@ public class ModuleController DELETE Delete A Module */ + @CrossOrigin + @DeleteMapping("/module/bysemesterid") + public void deleteModuleBySemesterID(@RequestParam(name = "sessionid") String sessionid, @RequestParam(name="id") int id) + { + User u = UserSessionIDHandler.getUserBySessionID(sessionid); + if (u != null && u.getPermissions() == UserPermissions.admin.getValue()) + { + db.deleteModuleBySemesterID(id); + } + + } + @CrossOrigin @DeleteMapping("/module") public void deleteModule(@RequestParam(name = "sessionid") String sessionid, @RequestParam(name="id") int id) diff --git a/backend/target/classes/com/example/backend/anwprj/Database/DataBaseHandler.class b/backend/target/classes/com/example/backend/anwprj/Database/DataBaseHandler.class index d98ab5c4d489638e681e2a592a6c7f44b200d562..360eca7848df772a36cd64ba90e4d8f94dab4576 100644 GIT binary patch delta 6048 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 Kl9sG_DegangDYGB delta 5920 zcmb7Id3;k<7Cz@CO+rXZ=|ZOL1W-Afkm9s4S(lsE80$1ZKts zxH^p6Ac!IgV-YD(1_V?T71Wtg5m(f4U(peC96H~<@8vbZ_?w@9|?SmY_4C>Q0L%0rY^P9TNCq7trCjaeF*KUVKC`~18s_8=E_U%H@?KZmyVx-7aJh@8@)g3`J-dG?*SdI`G~|MzVKR_02t<0Qb8&sh z!)Syg@5fLg&y+OGVwxfbb;}0IfH-DxIh~~ORW6>*bHoeXr#O;$p4`?b3S*|_lyZ}c z7f>IjD2dh#yg7!Fxkc_<$TZb3m$f!F$##vjbgf8_E$o^?`(r3o@}0J0QtSn`I9FZ$ zocfmf>c+Z-bLv5G?#R5!;<==+_^{ZOyoX;DO(`Emz2W2&{HC4XlGfiA^{G$uyTYF) z_@vmMcDeNfrbclvEk_J>U&#LyYuo|;SnP9q`BQPyUCy72l=OV-mrNO=$(a!4xn@@V zf_hIwT_rpCYtfi~6@M#Eq}TCxVxT9${}Qu3S$tZo_5`dyGI@k2Bh{{N{ziAob}KpGBjr=+V_�&BBz2y=mffMifVg;!LmA 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 C(*{le diff --git a/backend/target/classes/com/example/backend/anwprj/controller/ModuleController.class b/backend/target/classes/com/example/backend/anwprj/controller/ModuleController.class index 312e1619ce6e99beb4557387e2ad6bc7e616032d..a7553679b4a4d85b15c70aa9d876e2102cc6415c 100644 GIT binary patch delta 1557 zcmcJP>q`_-7{;HOU3YYqHCHXs#1)fP3oQsKB#PP(Ng6>!sYpc5r!+6CmEE@cmStOQ z+0A?RAV`Ehbfus#^)K`n^dBVMp7+e`I0}ki`Y>nCoH_3~zxREfa|Tx@s{CL7y!ilN zBVJ7U-}=G@t!A6qV>WcO_O_W@`gWP^X0*rbu8U~!hU+St{7A>4EOaD4`SPZ|`(Apq zwdVu1ID(^UuNw5>7<3%x`~dXdC^t}Opm7?0oZwiR#;L$b zJ~~bz#&?jt(|n)d0%x0{MR5-2`JJV4-~ykEQDnyXzJ$w)>PvQ~77I-EEcKGJPgHNzP6*!S0}4{k=K0F;Q%( z%At{MGcwS^?|o!Epp*+KB`Tf#DiODpD90T~iF9bc5GHy`gSbOEp9Xg=O1B7t*@AoI z=uB1wcT#c`rHZ;eWR#30G?0{Xj1f*1g>=77x;a-oJdis>n(HEUdpJdExmieSR1H0I-Mm=R z@x_t0+P>bAx51_NF!vv!-ebtY1c@Ijz2yvo>Zkl1cKjUXEX&VjE^4KGaY}jHqZ3@h z^60}^l^w^LRB0bAWYP)db&x<_8lfhCt%43Juvdhhq(P^s%WD^K$N>)71_eS6aM4`g z5*M&oRe;@B#S^Ena+p>C^PDCD?QlRVV(oh-xsrz`UalRf*aD2 U(=Gt4<0*gZc%~ATtNS_d4+=%-*Z=?k delta 1315 zcmb7^%TE(Q9LK-AeXP{l3T=f@2_+4&R0Aq37-!wE}kn8oC-+dig+HCVjw~ASD zYC=?G&@IQ>3#~Yg6WnRUoc0HHpQOsAaS%AgOUG%P;j@aZQ9jR7GIj`B z2Ip{|?_P}^7kFLFV4ROjxGXW2{1e0&T;DP#F!sQ}W^BR)uCU~Kbl@t1oQPo;uHiZr zAcQJKv=o|XWvS3PJ|H0-m=t?*AEms(krDPZ!1rZfY!1`ZnNq@_KPWw?Hz z2BNSET^5#QQx!M8N^!Sjan<5bii)$ES@xQi-J_KW*7>nAEbEL&ljC+JaeAUmZp3Y6 zGPmZ@|3r+Cl8I)I+dQk8eW$G1J(v+@Q~ed@fvQfD%vD7t$u=zp9(@MdZKih2 zvQLDqUHUBC-D$Ziy!1i;g=T5tzGZmwzRhx|5Q_UHzCGY_DijaNSa%LsP|(F7cmm zAZ<>Ds^!ru%!rK{u|fz$Y|QZAnDs@NB8~#H_`82zVjNKZ)2N|N#~igf=A~Zz;9dZK E0JclTk^lez