From 7fa00d731c2b780a14e7c5d0ff4c726c77db18ea Mon Sep 17 00:00:00 2001 From: serversdwn Date: Thu, 19 Feb 2026 22:53:31 +0000 Subject: [PATCH] Add sorting and filtering options to key ratings in index view --- app.py | 102 ++++++++++++++++++++++++++++++++++++++++--- tarkov.db | Bin 122880 -> 131072 bytes templates/index.html | 80 ++++++++++++++++++++++++++------- 3 files changed, 159 insertions(+), 23 deletions(-) diff --git a/app.py b/app.py index e13115b..261fba9 100644 --- a/app.py +++ b/app.py @@ -20,6 +20,8 @@ def index(): ORDER BY name """).fetchall() map_filter = request.args.get("map_id", type=int) + sort = request.args.get("sort", "priority_desc") + show = request.args.get("show", "all") key_map_rows = conn.execute(""" SELECT key_id, map_id FROM key_maps @@ -50,11 +52,24 @@ def index(): params.append(map_filter) key_query += """ LEFT JOIN key_ratings r ON k.id = r.key_id - ORDER BY - CASE WHEN r.priority IS NULL THEN 1 ELSE 0 END, - r.priority DESC, - k.name """ + if show == "rated": + key_query += " WHERE r.priority IS NOT NULL " + elif show == "unrated": + key_query += " WHERE r.priority IS NULL " + elif show == "quest": + key_query += " WHERE COALESCE(r.used_in_quest, 0) = 1 " + + if sort == "name_asc": + order_by = "k.name ASC" + elif sort == "name_desc": + order_by = "k.name DESC" + elif sort == "priority_asc": + order_by = "CASE WHEN r.priority IS NULL THEN 1 ELSE 0 END, r.priority ASC, k.name" + else: + order_by = "CASE WHEN r.priority IS NULL THEN 1 ELSE 0 END, r.priority DESC, k.name" + + key_query += f" ORDER BY {order_by} " keys = conn.execute(key_query, params).fetchall() conn.close() @@ -65,16 +80,22 @@ def index(): maps=maps, key_maps=key_maps, map_filter=map_filter, + sort=sort, + show=show, ) @app.route("/rate", methods=["POST"]) def rate_key(): key_id = request.form["key_id"] - priority = request.form["priority"] + priority = request.form.get("priority") + if priority == "": + priority = None reason = request.form.get("reason", "") used_in_quest = 1 if request.form.get("used_in_quest") == "on" else 0 map_filter = request.form.get("map_id") + sort = request.form.get("sort") + show = request.form.get("show") map_ids = [] for value in request.form.getlist("map_ids"): try: @@ -101,9 +122,76 @@ def rate_key(): conn.commit() conn.close() + redirect_args = {} if map_filter: - return redirect(url_for("index", map_id=map_filter)) - return redirect(url_for("index")) + redirect_args["map_id"] = map_filter + if sort: + redirect_args["sort"] = sort + if show: + redirect_args["show"] = show + base_url = url_for("index", **redirect_args) + return redirect(f"{base_url}#key-{key_id}") + + +def _update_key(conn, key_id, priority, reason, used_in_quest, map_ids): + conn.execute(""" + INSERT INTO key_ratings (key_id, priority, reason, used_in_quest) + VALUES (?, ?, ?, ?) + ON CONFLICT(key_id) DO UPDATE SET + priority = excluded.priority, + reason = excluded.reason, + used_in_quest = excluded.used_in_quest, + updated_at = CURRENT_TIMESTAMP + """, (key_id, priority, reason, used_in_quest)) + conn.execute("DELETE FROM key_maps WHERE key_id = ?", (key_id,)) + if map_ids: + conn.executemany( + "INSERT OR IGNORE INTO key_maps (key_id, map_id) VALUES (?, ?)", + [(key_id, map_id) for map_id in map_ids], + ) + + +@app.route("/rate_all", methods=["POST"]) +def rate_all(): + key_ids = request.form.getlist("key_ids") + save_one = request.form.get("save_one") + map_filter = request.form.get("map_id") + sort = request.form.get("sort") + show = request.form.get("show") + + if save_one: + key_ids = [save_one] + + conn = get_db() + for key_id in key_ids: + priority = request.form.get(f"priority_{key_id}") + if priority is None: + continue + if priority == "": + priority = None + reason = request.form.get(f"reason_{key_id}", "") + used_in_quest = 1 if request.form.get(f"used_in_quest_{key_id}") == "on" else 0 + map_ids = [] + for value in request.form.getlist(f"map_ids_{key_id}"): + try: + map_ids.append(int(value)) + except ValueError: + continue + _update_key(conn, key_id, priority, reason, used_in_quest, map_ids) + conn.commit() + conn.close() + + redirect_args = {} + if map_filter: + redirect_args["map_id"] = map_filter + if sort: + redirect_args["sort"] = sort + if show: + redirect_args["show"] = show + base_url = url_for("index", **redirect_args) + if save_one: + return redirect(f"{base_url}#key-{save_one}") + return redirect(base_url) if __name__ == "__main__": diff --git a/tarkov.db b/tarkov.db index 145d92837b6593d29362a8bdb2dd3cd1cceb40a6..9f5c8ce13961513f20116f0ed6378d7f8bf9b359 100644 GIT binary patch delta 7708 zcmaLceQXrh5diRe`}y|s84T2m?QjrW6JmpXXFJXT1qTR*lCu-OoDV1@keC3$I3~nE zvL1vGQAmaB5JZb8rKlw|RoVoiwsI@dpf*jTQY5NUi8QF9D5Z^pDwIN$NZsS?^X=`; z@CSE$zkR!Vw{PdojQh^$eSLg?xmp#A#p3<(*{tg4tB=lh)nJo}FM|JLaq-35qvBUY zf4e150BKkIJMB#Anp`6G#KcW;U0fCy#d-08I4cIlC*qViEDnfQ#2)d6IR18h$tuyL zj*=OhBWoqH#A5GqRRo)rn&xIUPjam^^LmSGqcg9sbIr=U9^(fG&#_u&9=vvrjSo(? zEhc^~_68@}7M$WI;+WVkJ`$e=7jQxN;;Q&i912d>CT8gh%baW!S0t7>TgmMYDm9V) z;3RjmZ*K9@?3>s5=b-`j84 z{q}RL#(vbEV^`Ux^_g|S`lWTm+F`A>=37%OVcszPznQ-=e`xMCH<=Ha_m~wXGp-tc zG=63rFrGC!~x$aaC2WDd&_^$|2=N0(Q1Ih~{&|zN7L^1NS&+y~LEK6%}T8-1Ua9Wj5 zemIt_%(pN-hSQ@sJ%ZE28S;zAv<`gO3Y?bXvKD^QRSC6=p|A4==&rz-bmvGXwIGMSTW7EQQm(I5ih1Ka)Y+Q`|Dtgi|9<4LBvk z6k7iiVas3t>v5{XX*y2RvQ%2+P7fSO-|2fb_}IH~nu^n1I8BMr$huq|vD~`+b)2ej zx)Y~KIf|~!6LS^`7;&5?;B*I0mBhMSfe$OkX*^C|F&bKz%ZgccUH%$QV{j@(Y079V z#_mdTsb$lq&GCU<=?dQ)h3@T@;3RNzadILwG6(I5<>sJ;lZlgo6VFj}4(d6J%s~w& z6(zejY)W5i4m7Yg6)e&T-Uen+ctx3bIb!_rN;&Yk5>V&$&pTyy@QUDnPzKXv-G zFP$EzLn?FXrAyLrX|FR@YnIxjGt$POSpJ=T(*CyHZ7;V|tjoT`maMDV3F`yvfYr+v zTPv*=tI9I8rRJx+PQ7BD_s!GhA#T0f)T)XVe+y!9Xl?K*TyIT5x59HxLmGhC^Dh+!%ftf?`PYPi<}qT2#k{gs(*+t91=d?3;eATnVf$}=EVK?tv_eyGz13-K$3p@cI0 z%M8u7T4EfL*}_Vqkp`hUK3uB1 zm*S(5hA7(M0pg%UZU&W+aq~vL;m!z-*bdZ!XQ`sUr7UQ(K9BC>0p1_C z7r}%1$1J=b?fF>nEVmJsCTuZk2^e@UeYc-Tr0N?}4M7B6gzoA=D`5)=yPvSz?Hi=^ z2Xl#m_Yu}YSkT>xM3PBEe?I}du`|%omaOmqZ>tP^o~{mdC}?Wr&82}i+bWwqs4H^* z;nPn?ZQ$d!iNRo^-2hYZ!7sO!FY}-p-NA#&sEvo96%ZuphMd2iB~rDAa+d)L|TPF=Gj9!V7s1f=WIz+p>52|A^vX-T(jq delta 298 zcmZo@;Al9&K0%sQfq{WRZlZ!cqr%371@Ds zz2+CA?DR)}7>z?D8Z}rMICzbX42;Zl4GeXSOcacatqhH<3{CmZFmM8$z`!8YXvD_A z$ZO2W0#{|K05#YEC@&0Fg&?M%{L84=6tFFTk)=S4lYb8b{}28T{4e+)@ZaFS$bX9e z2>+hVf(ncHr|&t>sLRMa{ndF!DWJM74E%e6a$ETC^1lb_xWfO8{|r#wEdJ?R?lW2m WF>|mmF)}i2;$UJ2GB_EwasU8*tWKf; diff --git a/templates/index.html b/templates/index.html index bb30b50..88ec41b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -89,7 +89,7 @@ padding: 8px 12px; border-radius: 6px; } - form { + .filters { display: flex; align-items: center; gap: 8px; @@ -98,8 +98,10 @@ flex: 1; flex-wrap: wrap; align-items: flex-start; + display: flex; + gap: 8px; } - input[name="reason"] { + input[name^="reason_"] { min-width: 180px; } .map-list { @@ -122,6 +124,12 @@ .quest-flag input { margin: 0; } + .save-all { + display: inline-flex; + align-items: center; + gap: 8px; + margin: 4px 0 16px; + } @media (max-width: 720px) { body { padding: 12px; @@ -130,7 +138,8 @@ align-items: flex-start; gap: 12px; } - form { + .filters, + .key-form { flex-wrap: wrap; justify-content: flex-start; gap: 8px; @@ -139,7 +148,7 @@ min-height: 40px; font-size: 1rem; } - input[name="reason"] { + input[name^="reason_"] { flex: 1 1 100%; min-width: 0; } @@ -171,11 +180,47 @@ {% endfor %} + + + + +
+ {% if map_filter %} + + {% endif %} + {% if sort %} + + {% endif %} + {% if show %} + + {% endif %} +
+ +
+ {% for key in keys %} -
+
- - - {% if map_filter %} - - {% endif %} - + - +
{% for map in maps %} {% endfor %}
- - + +
{% endfor %} +
+ +
+ +