From 7983e23815a18e73cf9ae3e2ba228e20048d9a7f Mon Sep 17 00:00:00 2001 From: brausjonas Date: Fri, 16 Jun 2023 11:59:06 +0200 Subject: [PATCH] Calender View Module and Semester names and Numbers are shown Also in the Dashboard for Lecturers --- anwendung/src/components/CalenderView.jsx | 658 +- anwendung/src/pages/planning.js | 2 +- .../src/pages/semesteroverviewLecturer.js | 9 +- backend/database.mv.db | Bin 32768 -> 49152 bytes backend/database.trace.db | 66457 ++++++++++++++++ 5 files changed, 66803 insertions(+), 323 deletions(-) diff --git a/anwendung/src/components/CalenderView.jsx b/anwendung/src/components/CalenderView.jsx index 12a34d5..27f5ba5 100644 --- a/anwendung/src/components/CalenderView.jsx +++ b/anwendung/src/components/CalenderView.jsx @@ -66,12 +66,10 @@ export default function CalenderView(p) { errorState[i] = ErrorType.TooLate isDayOkay[i] = false break - } - else if(new Date(currentYear, 0, elem.daynumber).getUTCDay() === 5) { + } else if (new Date(currentYear, 0, elem.daynumber).getUTCDay() === 5) { errorState[i] = ErrorType.Saturday isDayOkay[i] = false - } - else { + } else { if ((elem.timestart - 1) / 4 <= 11 && (elem.timeend - 1) / 4 >= 14) { errorState[i] = ErrorType.NotEnoughLunchTime isDayOkay[i] = false @@ -109,10 +107,9 @@ export default function CalenderView(p) { for (let i = 0; i < 6; i++) { for (let k = 0; k < 20; k++) { - if (en[i][k] != null){ + if (en[i][k] != null) { - if (en[i][k].semesterid != currentsid) - { + if (en[i][k].semesterid != currentsid) { for (let l = 0; l < 20; l++) { if (en[i][l] != null && en[i][l].usercreatedbyid != userid) { if (en[i][l].timestart <= en[i][k].timestart && en[i][l].timeend >= en[i][k].timeend) { @@ -144,13 +141,12 @@ export default function CalenderView(p) { } let j = 0; - for(let i = Math.round(((new Date(currentYear, 0, currentWeekStartDay) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))); i <= Math.round(((new Date(currentYear, 0, currentWeekStartDay + 5) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))); i++) - { - grayedOut[j] = i % Math.round(((new Date(currentYear, 11, 31) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))) < semesterStart && semesterEnd && new Date(currentYear, 0, currentWeekStartDay + j).getFullYear() == semesterStartYear || i % Math.round(((new Date(currentYear, 11, 31) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))) > semesterEnd && new Date(currentYear, 0, currentWeekStartDay + j).getFullYear() == semesterEndYear + for (let i = Math.round(((new Date(currentYear, 0, currentWeekStartDay) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))); i <= Math.round(((new Date(currentYear, 0, currentWeekStartDay + 5) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))); i++) { + grayedOut[j] = i % Math.round(((new Date(currentYear, 11, 31) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))) < semesterStart && semesterEnd && new Date(currentYear, 0, currentWeekStartDay + j).getFullYear() == semesterStartYear || i % Math.round(((new Date(currentYear, 11, 31) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))) > semesterEnd && new Date(currentYear, 0, currentWeekStartDay + j).getFullYear() == semesterEndYear j++ } for (let i = 0; i < 6; i++) { - let date = new Date(currentYear, 0, currentWeekStartDay+i) + let date = new Date(currentYear, 0, currentWeekStartDay + i) grayedOut[i] = holiday(currentYear, date.getMonth(), date.getDate()) ? holiday(currentYear, date.getMonth(), date.getDate()) : grayedOut[i] } @@ -190,7 +186,7 @@ export default function CalenderView(p) { }).then(r => readEntries()) } - function holiday(year, month, day){ + function holiday(year, month, day) { var feiertagejs = require('feiertagejs'); let today = new Date(year, month, day) return feiertagejs.isHoliday(today, 'BW') @@ -316,9 +312,9 @@ export default function CalenderView(p) { if (e.button === 0) { if (!currentId.includes("e")) { if (!currentId.includes("grab")) { - if (!checkForElementAtRow(row + 2, currentColumnID) && !checkForElementAtRow(row+1, currentColumnID)) { + if (!checkForElementAtRow(row + 2, currentColumnID) && !checkForElementAtRow(row + 1, currentColumnID)) { if ((row - 1) / 4 >= 7 && (row + 2) / 4 <= 18) { - if(!grayedOut[currentColumnID]) { + if (!grayedOut[currentColumnID]) { pushEntry(currentColumnID, row) } } @@ -347,8 +343,7 @@ export default function CalenderView(p) { setHighlightMonth(date.getMonth()) setHighlightYear(date.getFullYear()) - for(let i = 0; i < errorState.length; i++) - { + for (let i = 0; i < errorState.length; i++) { errorState[i] = ErrorType.Okay } @@ -361,8 +356,7 @@ export default function CalenderView(p) { setHighlightMonth(date.getMonth()) setHighlightYear(date.getFullYear()) - for(let i = 0; i < errorState.length; i++) - { + for (let i = 0; i < errorState.length; i++) { errorState[i] = ErrorType.Okay } @@ -376,9 +370,9 @@ export default function CalenderView(p) { if (id == userCreatedByID) { if (isDayOkay[columnID] && moduleid == localStorage.getItem("moduleid")) { return "#77932b"; - }else if(moduleid != localStorage.getItem("moduleid")){ + } else if (moduleid != localStorage.getItem("moduleid")) { return "#346991"; - }else { + } else { return "#e5a10e"; } @@ -393,11 +387,9 @@ export default function CalenderView(p) { if (id == userCreatedByID) { if (isDayOkay[columnID] && moduleid == localStorage.getItem("moduleid")) { return "#5a6c20"; - } else if(moduleid != localStorage.getItem("moduleid")) - { + } else if (moduleid != localStorage.getItem("moduleid")) { return "#346991" - } - else { + } else { return "#c08809"; } } else { @@ -434,6 +426,7 @@ export default function CalenderView(p) { semesterEndYear = s.endyear; setStartDayCalenderSideBar(semesterStart) setEndDayCalenderSideBar(s.endday) + }).then(readEntries) scrollRef.current.scrollTop = 600; @@ -488,8 +481,7 @@ export default function CalenderView(p) { setHighlightMonth(date.getMonth()) setHighlightYear(currentYear) - for(let i = 0; i < errorState.length; i++) - { + for (let i = 0; i < errorState.length; i++) { errorState[i] = ErrorType.Okay } @@ -498,320 +490,350 @@ export default function CalenderView(p) { return ( -
-
- -
-
- onWeekLeft()} - onFunctionRight={() => onWeekRight()}/> +
+

{p.semesterName}

+
+
+ +
-
-
-
-
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()}. + }} id={update}> + 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)}> +
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}

-
-
-
))} + {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}

+
+
+
))} +
-
onMouseDown(e)} - onMouseMove={e => onMouseMove(e)} - onMouseUp={e => onMouseUp(e)}> - - {entries[1].map(d => (d != null &&
+ {/*maps a list of internal time stamps to lines and time stamps*/} + {temp.map(i => (
+ height: cellHeight * 2, + display: "flex", + flexDirection: "row", + justifyContent: "space-around", + alignItems: "center", + }} className={"no-pointer-events"}> +

{internal_to_time(i + 1)}

-
-
-

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

-

{d.info}

-
-
+

{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)}

))}
- - -
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)}

-
))}
-
-
- {errorState.map((e, index) => ( -
-

+ {errorState.map((e, index) => ( +

{new Date(currentYear, 0, currentWeekStartDay + index).toLocaleDateString()}

-

{e}

-
))} + backgroundColor: e === ErrorType.Okay ? "white" : "#e5a10e", + borderRadius: 15, + flexDirection: "column", + justifyContent: "center", + gap: 10, + alignItems: "center", + minHeight: 120, + maxHeight: 120, + padding: 10 + }} className={"box-shadow"}> +

{new Date(currentYear, 0, currentWeekStartDay + index).toLocaleDateString()}

+

{e}

+
))} +
) diff --git a/anwendung/src/pages/planning.js b/anwendung/src/pages/planning.js index acd4ac9..9be5638 100644 --- a/anwendung/src/pages/planning.js +++ b/anwendung/src/pages/planning.js @@ -18,7 +18,7 @@ export default function planning(p) router.back()}/> - +
) diff --git a/anwendung/src/pages/semesteroverviewLecturer.js b/anwendung/src/pages/semesteroverviewLecturer.js index 1a532a2..740850c 100644 --- a/anwendung/src/pages/semesteroverviewLecturer.js +++ b/anwendung/src/pages/semesteroverviewLecturer.js @@ -26,19 +26,20 @@ export default function SemesteroverviewLecturer(p) { let semesterURL = baseURL + "/semester/id/all?ids=" + args + "&sessionid=" + localStorage.getItem("sessionid"); fetch(semesterURL).then(r => r.json()).then(sem => { sem.map(e => { - temp.push(e.name) + temp.push(e.name + " Sem. " + (e.number + 1)) }) }).then(() => setSemesterNames(temp)) }) } - function onClickSemester(e, m) { + function onClickSemester(e, m, name) { if (e.activated == 1) { if (m.target === m.currentTarget) { localStorage.setItem("currentsid", e.semesterid) localStorage.setItem("currentmodulename", e.name) localStorage.setItem("moduleid", e.id) + localStorage.setItem("semestername", name) router.push("/planning") } } @@ -62,10 +63,10 @@ export default function SemesteroverviewLecturer(p) { {entries.map((e, index) => (
onClickSemester(e, f)}> + }} onClick={(f) => onClickSemester(e, f, semesterNames[index])}> onClickSemester(e, f)} + onClick={(f) => onClickSemester(e, f, semesterNames[index])} />
diff --git a/backend/database.mv.db b/backend/database.mv.db index 47550d464d3c90a8a08106c3be732d97697565fb..ac59567bec3231ff7639cb7f4abc3a74852e9fe5 100644 GIT binary patch literal 49152 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 R7Xs1-5Xk3-qLUjf{vR*+VqpLP literal 32768 zcmeHP%Woq|8Si#HNhdqQO0a{(o_aiQ9M5d*%?C&N zII}aHR=knmf;b?7R+Z*EIVUtO|V-Pb=^jm ztcrqC_D179YXY@A#p8pW5oCh`-Y%XvkMX#wA_2>qrmivcM>Rk-Ks7)$Ks7)$Ks7)$ zKs7)$Ks7)$Ks7)$@VRMVgW~_sP51P{R0C84R0C84R0C84R0C84R0C84R0C84R0IDh z4a7lyBVqwagq^e>BGyy?!ks*~Q zJA1f_HH=hMC#V2Mc`|aUSkU=%`vH|;WxV{1DU=vaR9wXpM7$!}$WUCwNsg{tGS=b3 z#i}COoaD+nc0HGquqL|-hC80?iJI$hvSh1Rk!4P{ZC!I^m6Kf+If^cF$WgJRshCp) z+4Uq>;1n4_F-7t(u%g>4r|5!g%bv(7hNW791{aPlTUdY#EV?d6h*K3`K3C^dRYbOn zY)&;?q&SYnsg|ol!r@e`x=7Q76-~sl;vf#>R0XW5oaV`zt-1zW*hm*O|H9KPzmP79 zj-Vrf(>+U4Bmu2BlHp-!gQEg7!_gEDTQ(LX4RIbqnt%+wJQ_c$JeDeZPY))eF|JIW zRUU+-4eUO!b`Np?`98kZvK;vL`Sna@*RE`hK4@AKi_EpcB?I+pzCibIcQ>dwF7_(s zS%B7-S7NQbiVB%W<^?FNcp+3;c3@6m&{pctC%85qThHl8n|ePlEJq`4o=$re^DJPX zt&(IlJ~OKYqpdRkFT6?%MxEP#3PG7ID#R(8TxrPQ@4(^Zk@vuL(h6k`v0pai?x-_*R1v3>lIH(g4IigPl*niqts=er1V69F zYjXLiwOfsCl%S#2LC}V3whcFkN`-tKv8i!A$Oc*hDf7AFbzUbbGcpp2mXt3T8xyy~ zf{7yXIb&0Y4{|0d%09%_r!z?T3`tX`C_r@ zMHW*s#ngPU*j{8M)?iguXJuAl9o8*~RzX!*t)K}7O=OtD@40UjnAe!qz__l6wwhdN z$(6pc2d`IU$6fY~>58}#o~$q_g(oGvt14mA2~Y0N+1PAXBePwO%=X=#r|`xXz(kIV5=aE{N~e=o59CFHManC( z;>8$p35J3$s&Tg=U5fwlpRC9K_z5dcNV4NVwx|qJowNc))*V<)K4h5kKj3_qDXjK` z)ur&ap9E)mSeORl7dge>DUaSrdGxv{Ye={4b3@TlMQic%vl9s{@YOR+7^(2dGO}cwu>k1B>knf8)KL+2f7y3lb1wP;!Bsl%Z7LP?Vh>C zw_AMoUY|GLYxnv+zEo>&miS(+)8}tuSF?~SiK2(WJz&^3`Hfm{gTJY3u+u@ts-xS2 z<6&L3BpKV9Z0U+6=|~qOT@^G>0Dp+1SdL<-s%2}20UiZQGaTV24-aW~uk!q*pA{le z8nwoT+2s4RddK8T_qXevcB51&ZQg5ccg$Yt)|#)jQoC8=+ugpo4sx%XU2_ZC*5vCC z`KH;bZG+6U9^Y=7-G00OknfrAY@6K%SzYg8uWxP+;(rEu!)(=+hCFD9NE#s1GzN7| zZVn8iX{bn%o2^!>6sV`W-RYD=A$+Y7f<$+F=B5di&-kZX+cZmjW23fJYd{A6L2c_{ zySsi%5pG9i;ePvp-;|_vYqziQS1N`Qd@(j*=P<>L#Yo84LYrX3>og| zb?`prx~kRQ>h(|7f2TH2uFYDzb9_JEul0KG-rIt1Jg&Fzn_HXhUax(xOLX@Q=jhP$pa&(@1a@Sno;4b+uiNWx|wEPyL}6~^#`Zu*7;gJSGP)1 zu3v9MzkYk^_!$=_&#m_2X55xxN=->p2D)i92B=kU4(bh29H^>hsx6_3^d_uP{(?lz zxW1}0swL*)uszNC!~CS&Z~K!nOl;Zy^Z$TBk-Z%c>U>S@ZtLFhuQd#?*)oP}7*XZg z?XRBlZJ$qT^9_sKr~q5;*6JRMS%zh<6#w~psd%GUDPHdOAL9|<9(uf7{D>|7xd8cO z?xVuR0`sLe7)Y0<@?0r?>fgEF8+nrttTE=z;iD^1C%PJG-0l^-yaRFgSI`k z4i9?4@$RENYiGCOjP}+=Nxo9rz~h}K9UDIe=Zp(^q6^6Otm0xn4}Z12k0*G%`Dk~9 z4-STS{BCkJT^oO`^JKhpFxeSe8}`n4_>OF7g!`w}^$R4zl@nZxk}KsU5N?Xi6sK$Hlj*vwW{PniLF5dnJT5KGz$iOsa%C0G*8k0nESMG^3L5MPVI zWCF`WED5kY0h6|(X|aR=evd-w3L!9*g%F%;Awpo;`#2F;Il_ei+9F&C5{c7;?ZHzb z$00#C3<&~WPendLsicfbAR{)W06OvkZ&)E%^VE^?-*a?3Ly%Is)Rrn%H8QwVS?b7aP7{s)N0b2?|EKZ)44Hw(|A8+`Gmsun(m)=6li)eU{~n-hYk~ORj_`lX)$!y1F*pIV8aVsZ3^@mf4poHRn4Dt> zo+b(e2(<(JZ@ccf;(xBT+NSY;8vj3;$}m@mh{peCvNUM?e~L;I@m*;A-)AF5;pj{N zn8yE0S(?&(k?jA6`2T5WA@gZ%zR4ZUA^@zfax5-Dl>S%-Kq+7c+%A?gaekj4@M!_U zf*-Gyjv#s)NhrZuXedFH$xuQjO8YXQ1dFiZW&%C!74UffGI7dh<6E&)9%5T5Pkw6K z>*>Q@d7nI~#3U3(`s5`)j5?=JJ~X$ZFluCb%dVh81xNbi$r$(7!o6UH?q6Rb!bJK1 z{+4LU|33-W(*NhvK#c!W{GH-|o8bRTfdAbE;(sSYTO#nkqGjU$D2o5Xb{+qx$q7FR z@V|jXV&!lG{IAIBx#E9_|KB-f{GWNje#E}=ygUXKj^*Voy}$J4(rlIkVUQ%IiTx6$ z$#0USHM?~rURueOb!wZ}>35)2aWt~>ORP zOm+aWAY+7NLFWCCEXW+ZaR%4id`$QZP^A3-bQcfh|MR8)X8u3L|BKk@P4Ryii=NGR zqxc_|rYGk^@b z|DW#vhtEpT{r}S+d!YOOqj)~u|4(dNKbJ4A%ooYdxOM3M|GB=JFkk$CM)<$@{^Xn`lk;O9xq}NHY8p8dX6h`v`arkCbPH_N4xZ6t^}aE!kxeS nUr{96I~BpA@&9vxzO)L^K#c!W{GH-|H^u*!4)}i&`~Uw9J-