mirror of
https://github.com/zvx-echo6/central.git
synced 2026-06-11 12:24:37 +02:00
Hide tombstones from default events view + show-removed toggle (v0.9.11)
The /events feed was dominated by *.removed tombstone events (audit records for features dropped from upstream feeds), burying geometry-bearing events like fire perimeters (wfigs_perimeters: 54 real perimeters vs 1015 tombstones). The GUI now default-hides any event whose category ends in .removed, with a "Show removed" checkbox to restore them; URL state is preserved (HX-Push-Url) so a shared link shows what the sharer saw. events.json is unchanged (still returns tombstones) so API consumers are unaffected. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
92a1b3f2c6
commit
85d0e8f1cc
4 changed files with 116 additions and 2 deletions
|
|
@ -2896,7 +2896,8 @@ def _build_pagination(total: int | None, offset: int, limit: int) -> dict:
|
|||
|
||||
|
||||
def _parse_events_params(params, default_time: str | None = None,
|
||||
default_offset: int | None = None) -> tuple[dict | None, str | None]:
|
||||
default_offset: int | None = None,
|
||||
default_show_removed: bool = True) -> tuple[dict | None, str | None]:
|
||||
"""
|
||||
Parse and validate events query parameters.
|
||||
|
||||
|
|
@ -3040,8 +3041,17 @@ def _parse_events_params(params, default_time: str | None = None,
|
|||
except Exception:
|
||||
return None, "Invalid cursor"
|
||||
|
||||
# Tombstone visibility: the GUI default-hides `*.removed` events; the JSON
|
||||
# API default-includes them. An explicit ?show_removed= overrides the default.
|
||||
sr = params.get("show_removed")
|
||||
if sr is not None and sr != "":
|
||||
show_removed = sr.lower() in ("1", "true", "on")
|
||||
else:
|
||||
show_removed = default_show_removed
|
||||
|
||||
return {
|
||||
"limit": limit,
|
||||
"show_removed": show_removed,
|
||||
"offset": offset,
|
||||
"q": q,
|
||||
"adapters": adapters,
|
||||
|
|
@ -3172,6 +3182,11 @@ async def _fetch_events(parsed_params: dict) -> EventsQueryResult:
|
|||
query_params.append(cursor_id)
|
||||
param_idx += 2
|
||||
|
||||
# GUI hides tombstones by default (events.json includes them). Static
|
||||
# literal pattern, no bound param; NULL-category rows are kept.
|
||||
if not parsed_params.get("show_removed", True):
|
||||
conditions.append("(category IS NULL OR category NOT LIKE '%.removed')")
|
||||
|
||||
where_clause = ""
|
||||
if conditions:
|
||||
where_clause = "WHERE " + " AND ".join(conditions)
|
||||
|
|
@ -3361,7 +3376,8 @@ async def _events_query(request: Request, data_class: str):
|
|||
which _fetch_events applies as an `adapter = ANY(...)` condition.
|
||||
"""
|
||||
params = request.query_params
|
||||
parsed, error = _parse_events_params(params, default_time=DEFAULT_TIME, default_offset=0)
|
||||
parsed, error = _parse_events_params(params, default_time=DEFAULT_TIME, default_offset=0,
|
||||
default_show_removed=False)
|
||||
class_adapters = _class_adapter_names(data_class)
|
||||
if parsed is not None:
|
||||
parsed["class_adapters"] = class_adapters
|
||||
|
|
@ -3392,6 +3408,7 @@ def _events_filter_state(parsed: dict | None, params) -> dict:
|
|||
"region_west": params.get("region_west", ""),
|
||||
"map_filter": pstate.get("map_filter", False),
|
||||
"limit": str(pstate.get("limit", 50)),
|
||||
"show_removed": pstate.get("show_removed", False),
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue