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 145d928..9f5c8ce 100644 Binary files a/tarkov.db and b/tarkov.db differ 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 %} +
+ +
+ +