From f13e8711a7ad455a29eaabfe52657e54971fab5e Mon Sep 17 00:00:00 2001 From: Marcel Gansfusz Date: Thu, 17 Jul 2025 00:28:48 +0200 Subject: [PATCH] improved visuals --- app/__pycache__/main.cpython-313.pyc | Bin 24947 -> 26193 bytes app/main.py | 57 +++++++++--- index.html | 35 +++++--- static/autocomplete.js | 7 +- static/dynhide.js | 42 +++++++++ static/filedrop.js | 10 +++ static/style.css | 128 +++++++++++++++++++++++---- 7 files changed, 235 insertions(+), 44 deletions(-) create mode 100644 static/dynhide.js create mode 100644 static/filedrop.js diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc index 61eadd45dd6bc02b623328481a0757bf5468fc81..e678e6ca06d94b98ee0e3ea4c086f999f3986f96 100644 GIT binary patch delta 4447 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 cUt+W1(G&A@^8yFWMQT3J zk}_nyTEMHMLT6zmMRP)Oh}tD=ionKDY9M6M`jBL!F8-QSxUu+&Z4TJupW6KepOPi- zl}nPC^^Dv`do;KFZA$a`1Emn~kd(nob;Z{F-hztd>efuMUttyMTF5h>@7LLMm`OfA zrn7fpRH5}My+vRx=^*0@llq+SS+BN$Pb>O8Gp<+L#CVnPg%}lz>K073+TL5E=AY50 zHRI%p>Jjt?b*I_^VbrD6aa6B%;^=GX}_;tR+nw0slkQkl+2q!{% zhw~Z<{Q=!vr(D>a-bl2=*56Xv%==PCX$zlCVM>HdmGIqLllhlZ%W~VmgSi1*`e;o$ zkif#Qc7TX9b%6gcHBYw#lp*a-s!Zk4p#klqG?Qd#2F^WI3$a#kcV>oxsX$D%Eb7Jj z7F0`xI-Qy1>;%3|_;tq00Y% zsA$ZP;#E|m*l1SBNAIz6=Q_I;mgA*Gi_`jR2=OKG_#7Ke;l(*?DcV?*jIk6Qr0pzN z;MgidzZu>UA10R`=Sz(x?n&ok&B=T|C(Uk)aZm1FuuI{!b_dPo&f-iyX-`;dk6C)9 z*pwm3=Xk>6n-enmR>T-jKKdF%<{aWRdkXnjytUNSo#%7K41C2g$+INI7(zUyV(JP< z1{J>6c&}7JD;K+h17lW#g^izd#M2D^y2D1-Lq&4<9Y>P+NfOlfD&Y7HP!>y#E+ezhfnpCh}I@qSC@2;RNRCzbIp%|1a7TTiduf#Vv zK)G5*TMYWEt4ctAKa;kY^zYj?+d%nXeRYe4Tw7yprR2J@0+{Os%Udhu>s1XVP;Mv` z(IC(y(30FzC*N?Uw^YkFs&y#W$zW4ELz7#}<(ZW9)>3(au~&d%M-h(jf0YzS z>@>Hp?A5&vj8QwZvQ3vdhJy?MtJy!!zK8l7{L?k=?l7{(EhGIC!-3FvL<##R1Fl2{ zFEnA_K{$mljc^zsq92(UADsZhQUBh+Vj$${P((Q}=Y{7}Zwh-4ZV`ECARKLQaG-@Jg5%FNf6);I z?9nc)v&*oFKB&G_@->W*{8V8?^Ev@6JC5)zgd+$i`CB!c=yiU-rr2~234~G2UfZtF z%Y3B1s8m!JkDZ7ToE#bu$$TM+8|a8|TDw|btU$QGG-_3%W7ngjJ~$NmO6zupX|a0% zE<^Nri5`xzMO1bWr6WADCCfB}BEp+LYPu~sg_E9%6^ONT;rLVT{Owe$nav`La79bq zR-x!WMg1<{-nxZ;!q2v@)??#m*ZGasD*Ah_wC&pUITD`%xZ)YKM#5?lE+hN_;XJ}0 z0U|Q&NwxviDTGbP>4wGw!(s8jBD(R3(O`hx2OeVm6>S#yFWS=M|AdzM;AF@@9ALlU z_u8Dx@Wcwo18`cKY{JEfvdn5_?w?3y7~dsFS0~nq6$;A$u`{1NKo^9El&5x7&=<6p zjyh_63m7*PSL}BUZHD=4p31@(P{i%aHUm5xYFL;7Jf_-X&u&^Sp3)GqUj=YUi*0Do z&sbOjX7Rg&h0p}Sp&je|Nb-p1E&N0Td{IRNHUW}LC&I906xb(E+z4tIPfb`^EH0W0 zpAzkzt}aR?Zt2OeFCC)MQ#M55qe_W=RH+hg>iIrc-tVcj=t?1gS3!i2w$h!Al<={g zX*#09A3w3Pajn74a3O3r!T^HU7kEapegKy_nygrdNarRm@!8B`N!Ui%^Sr~Ck{}j? zwT(!FA@&X2gK2CO#}OJ}j_}7I;CC1w&3Ew2zCV}1`)z?m!}G;C-BCpsRosgz?Q~JM ztDYzJebX);B^=3%oAM?~8xaN(4)CA$;}KyScHUvk$JOt?i!XCYAjP`Q=UB zeOrKgdf?aSJBLt>Ci33EIKz4|vBE7VeTc9fVF!W_0D9g?7&_mck&z(76Nq7pjp&{m z437B6MW2gyG&hckZX!B^c$a696FVKZZA7={`EmH19Y$7cBvIy3eqndE$qDs=e-iH0 zKHMEgQwoY6${EytC($}D?v7lz^MCp?5`bNhiIhGsfiz#G List[Dict[str, int | str]]: """returns the LVA for a search in the database""" res = [] + zw = [] cur = db.cursor(dictionary=True) if await is_LVID(searchterm): cur.execute( - "SELECT lvid,lvname FROM LVAs WHERE lvid LIKE ?", (searchterm + "%",) + "SELECT id,lvid,lvname FROM LVAs WHERE lvid LIKE ?", (searchterm + "%",) ) res = cur.fetchall() else: - cur.execute( - "SELECT id,lvid,lvname FROM LVAs WHERE lvname LIKE ?", - (searchterm + "%",), - ) - res = cur.fetchall() - cur.execute( - "SELECT id,lvid,lvname FROM LVAs WHERE lvname LIKE ?", - ("%" + searchterm + "%",), - ) - res = remove_duplicates(res + cur.fetchall()) + if pid is not None: + cur.execute( + "SELECT LVAs.id,LVAs.lvid,LVAs.lvname FROM LVAs LEFT JOIN LPLink ON LVAs.id=LPLink.lid WHERE lvname like ? AND pid=?", + (searchterm + "%", pid), + ) + res += cur.fetchall() + cur.execute( + "SELECT LVAs.id,LVAs.lvid,LVAs.lvname FROM LVAs LEFT JOIN LPLink ON LVAs.id=LPLink.lid WHERE lvname like ? AND pid=?", + ("%" + searchterm + "%", pid), + ) + res += cur.fetchall() + cur.execute( + "SELECT LVAs.id,LVAs.lvid,LVAs.lvname FROM LVAs LEFT JOIN LPLink ON LVAs.id=LPLink.lid WHERE pid=?", + (pid,), + ) + zw = cur.fetchall() + if searchterm != "": + cur.execute( + "SELECT id,lvid,lvname FROM LVAs WHERE lvname LIKE ?", + (searchterm + "%",), + ) + res += cur.fetchall() + cur.execute( + "SELECT id,lvid,lvname FROM LVAs WHERE lvname LIKE ?", + ("%" + searchterm + "%",), + ) + res += cur.fetchall() + res = remove_duplicates(res + zw) if searchlim == 0: return res else: @@ -188,7 +207,7 @@ async def create_upload_file(files: List[UploadFile], c2pdf: bool = True): filename = files[0].filename if files[0].filename is not None else "None" if len(files) == 1: content = await files[0].read() - ft = filetype.guess(content).extension + ft: str = guess_filetype(content, filename) if c2pdf and ft != "pdf": ret = convert_to_pdf(content) if ret is not None: @@ -199,7 +218,7 @@ async def create_upload_file(files: List[UploadFile], c2pdf: bool = True): filecontents = [] for file in files: content = await file.read() - ft = filetype.guess(content).extension + ft = guess_filetype(content, filename) if ft == "pdf": filecontents.append(content) continue @@ -575,6 +594,7 @@ def make_filename_unique(filename: str, idx: int | None = None) -> str: async def save_files_to_folder(files: List[UploadFile]) -> str: + """saves file to files in prograss folder""" filename = files[0].filename if files[0].filename is not None else "None" filename = filename.split(".")[0] if filename == "": @@ -592,3 +612,12 @@ async def save_files_to_folder(files: List[UploadFile]) -> str: # reqJson = await request.form() # print(reqJson) # return {"done": "ok"} +def guess_filetype(content: str, filename: str) -> str: + """Guesses the filetype of a file based on first the sontent, If that fails the extension in teh filename. If no conclusion can be reached it reutrns an empty string""" + ftyp = filetype.guess(content) + if ftyp is not None: + return ftyp.extension + farr = filename.split(".") + if len(farr) > 1: + return filename.split(".")[-1] + return "" diff --git a/index.html b/index.html index a7a0e93..07dc5a0 100644 --- a/index.html +++ b/index.html @@ -7,6 +7,8 @@ + + @@ -20,23 +22,29 @@
- - - +
+ + +
+
-
+

+
-
+

+
@@ -55,14 +63,17 @@

- -
- +
+
+ +
+ +
+
+
+ +
-
-
- -
diff --git a/static/autocomplete.js b/static/autocomplete.js index 41ff5c7..74d6fbd 100644 --- a/static/autocomplete.js +++ b/static/autocomplete.js @@ -20,10 +20,13 @@ function autocomplete(inp, type) { val = this.value; /*close any already open lists of autocompleted values*/ closeAllLists(); - if (!val && type === "lva") { + if (!val && type === "lva" && pid === null) { return false; } - if (type === "prof" && lid !== null) { + if (type === "lva" && pid !== null) { + apirq = + url + type + "?searchterm=" + val + "&pid=" + pid + "&searchlim=10"; + } else if (type === "prof" && lid !== null) { apirq = url + type + "?searchterm=" + val + "&lid=" + lid + "&searchlim=10"; } else if (type === "subcat" && lid !== null && pid !== null) { diff --git a/static/dynhide.js b/static/dynhide.js new file mode 100644 index 0000000..c3a5020 --- /dev/null +++ b/static/dynhide.js @@ -0,0 +1,42 @@ +var radiobuttons; +var datediv; +var subcatdiv; +var rdbarr; +var subcatcategories = [1, 2, 3]; +var datecategorires = [0, 1]; +function changevis() { + for (let i = 0; i < rdbarr.length; i++) { + if (rdbarr[i].checked) { + if (subcatcategories.includes(i)) { + subcatdiv.style.display = "block"; + } else { + subcatdiv.style.display = "none"; + } + if (datecategorires.includes(i)) { + datediv.style.display = "block"; + } else { + datediv.style.display = "none"; + } + return; + } + } +} +function starthide() { + radiobuttons = document.getElementsByName("stype"); + datediv = document.getElementById("datediv"); + subcatdiv = document.getElementById("subcatdiv"); + rdbarr = [ + document.getElementById("pruefung"), + document.getElementById("klausur"), + document.getElementById("uebung"), + document.getElementById("labor"), + document.getElementById("unterlagen"), + document.getElementById("zusammenfassungen"), + document.getElementById("multimedia"), + ]; + changevis(); + radiobuttons.forEach((rdb) => { + rdb.addEventListener("change", changevis); + }); +} +window.addEventListener("load", starthide); diff --git a/static/filedrop.js b/static/filedrop.js new file mode 100644 index 0000000..0061a47 --- /dev/null +++ b/static/filedrop.js @@ -0,0 +1,10 @@ +var fileinput; +function dropHandler(eve) { + eve.preventDefault(); + fileinput.files = eve.dataTransfer.files; +} +function init() { + fileinput = document.getElementById("filepicker"); + document.getElementById("filepicker").addEventListener("drop", dropHandler); +} +window.addEventListener("load", init); diff --git a/static/style.css b/static/style.css index 78d3e0b..03f4764 100644 --- a/static/style.css +++ b/static/style.css @@ -6,7 +6,7 @@ body { body { overflow: hidden; - background-color: slategrey; + background-color: #2f3957; font-family: Arial, Helvetica, sans-serif; } @@ -15,11 +15,11 @@ body { margin: 0; width: 75vw; float: right; - background-color: navy; + /* background-color: navy; */ } .left { - background-color: blueviolet; + /* background-color: blueviolet; */ height: 100%; float: left; } @@ -77,6 +77,16 @@ span { #submitdiv { /*position: relative;*/ width: 500px; + padding: 10px; +} + +label { + /* color: white; */ + background-color: grey; + border-radius: 5px; + padding: 5px; + /* margin: 10px; */ + margin-top: 10px; } /*Things I've stolen from https://www.w3schools.com/howto/howto_js_autocomplete.asp*/ @@ -84,29 +94,59 @@ span { /*the container must be positioned relative:*/ position: relative; display: inline-block; - width: 300px; + /* width: 400px; */ + width: 100%; + padding: none; + margin-bottom: 10px; +} + +#name { + margin-bottom: 10px; } input { - border: 1px solid transparent; - background-color: #f1f1f1; + border: 1px solid #818181; + background-color: #a1a1a1; padding: 10px; - font-size: 16px; + /* height: 50px; */ + font-size: 12pt; + border-radius: 20px; + margin-top: 10px; + /* margin-bottom: 10px; */ } input[type="text"] { - background-color: #f1f1f1; - width: 100%; + background-color: #b1b1b1; + /* width: 100%; */ + width: 478px; + border-radius: 20px; } -input[type="submit"] { - background-color: DodgerBlue; - color: #fff; +/* input[type="text"]:focus { */ +/* border-bottom-right-radius: 0px; */ +/* border-bottom-left-radius: 0px; */ +/* outline: none; */ +/* } */ + +div>input[type="text"]:focus { + border-bottom-right-radius: 0px; + border-bottom-left-radius: 0px; + outline: none; +} + +button[type="submit"] { + background-color: #0872a9; + /* color: #fff; */ + border-radius: 20px; + padding: 5px; } .autocomplete-items { position: absolute; - border: 1px solid #d4d4d4; + /* border: 1px solid #d4d4d4; */ + border: 1px solid #818181; + background-color: #b1b1b1; + /* background-color: #b1b1b1; */ border-bottom: none; border-top: none; z-index: 99; @@ -114,22 +154,78 @@ input[type="submit"] { top: 100%; left: 0; right: 0; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; + /* padding: 20px; */ + /* padding-top: 10px; */ + padding-bottom: 20px; } .autocomplete-items div { padding: 10px; cursor: pointer; - background-color: #fff; + /* border-radius: 20px; */ + background-color: #b1b1b1; border-bottom: 1px solid #d4d4d4; } .autocomplete-items div:hover { /*when hovering an item:*/ - background-color: #e9e9e9; + background-color: #0872a9; } .autocomplete-active { /*when navigating through the items using the arrow keys:*/ - background-color: DodgerBlue !important; + background-color: #0872a9 !important; color: #ffffff; } + +/* filedrop */ +input[type="file"] { + /* flex: 1; */ + display: flex; + background-color: #b1b1b1; + border-radius: 20px; + padding: 10px; + width: 100%; + margin-right: 10px; + margin-top: 10px; + margin-left: 10px; + /* margin-bottom: auto; */ +} + +input[type="file"]::file-selector-button { + background-color: #d1d1d1; + border-radius: 20px; + border-color: #a1a1a1; +} + +#fileupload { + /* display: inline-flex; */ + width: 500px; + border-radius: 20px; + background-color: #4f5977; + margin: 10px; +} + +.fileupload { + margin-left: auto; + margin-right: 10px; + margin-top: 10px; + margin-bottom: 10px; + width: 25%; + /* align-self: right; */ + /* float: right; */ +} + +#uploadform { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + +.filetop { + display: flex; + width: 100%; + /* background-color: purple; */ +}