Replace pages' use of the options call with directly building the HTML components using templates, as the syntax is much nicer. Use a common set of data provided to all modules via pagetemplate.py instead of passing things like web_ui_options around. Closes #153

This commit is contained in:
Ian Renton
2026-09-25 21:22:31 +01:00
parent 4df00c321c
commit 8de163469b
27 changed files with 493 additions and 534 deletions
+54 -2
View File
@@ -1,6 +1,58 @@
<div class="card">
<div class="card-body">
<h5 class="card-title">Activities</h5>
<div id="activity-options" class="card-text spothole-card-text"></div>
<div class="card-text spothole-card-text">
<ul class="list-unstyled filter-section-list ps-0">
{% for section_type, heading, expanded in [("TRADITIONAL", "Traditional", True), ("ADVENTURE",
"Adventure", True), ("REGIONAL", "Regional", False), ("EVENT", "Event", False)] %}
{% set show_general_dx = include_general_dx and section_type == "TRADITIONAL" %}
{% set section_activities = [a for a in activities if a.activity_type == section_type] %}
{% if section_activities or show_general_dx %}
{% set collapse_id = "activity-options-" + section_type.lower() + "-collapse" %}
<li class="mb-1">
<button class="btn-toggle{% if not expanded %} collapsed{% end %}" data-bs-toggle="collapse"
data-bs-target="#{{ collapse_id }}" aria-expanded="{{ 'true' if expanded else 'false' }}"
aria-controls="{{ collapse_id }}">{{ heading }}
</button>
<div class="collapse filter-section-body{% if expanded %} show{% end %}" id="{{ collapse_id }}">
{% if show_general_dx %}
<div class="w-100 mb-1">
<div class="form-check">
<input type="checkbox"
class="form-check-input filter-button-activity storeable-checkbox"
id="filter-button-activity-NO_ACTIVITY" value="NO_ACTIVITY"
autocomplete="off" onClick="filtersUpdated()" checked>
<label class="form-check-label" for="filter-button-activity-NO_ACTIVITY"><i
class="fa-solid fa-tower-cell"></i> General DX</label>
</div>
</div>
{% end %}
<div class="row row-cols-2 g-1 mb-1">
{% for a in section_activities %}
<div class="col">
<div class="form-check">
<input type="checkbox"
class="form-check-input filter-button-activity storeable-checkbox"
id="filter-button-activity-{{ dom_safe_name(a.name) }}" value="{{ a.name }}"
autocomplete="off" onClick="filtersUpdated()" checked>
<label class="form-check-label"
for="filter-button-activity-{{ dom_safe_name(a.name) }}"
title="{{ a.description }}"><i class="fa-solid {{ a.icon }}"></i> {{ a.name
}}
{{ a.region_flag or "" }}</label>
</div>
</div>
{% end %}
</div>
</div>
</li>
{% end %}
{% end %}
</ul>
<div class="mt-1">
<a href="#" onclick="toggleFilterButtons('activity', true); return false;">All</a> &nbsp;
<a href="#" onclick="toggleFilterButtons('activity', false); return false;">None</a>
</div>
</div>
</div>
</div>
</div>
+22 -2
View File
@@ -1,6 +1,26 @@
<div class="card">
<div class="card-body">
<h5 class="card-title">Bands</h5>
<div id="band-options" class="card-text spothole-card-text"></div>
<div class="card-text spothole-card-text">
<div class="row row-cols-3 row-cols-md-2 row-cols-lg-3 row-cols-xxl-4 g-1 mb-1">
{% for b in options["bands"] %}
<div class="col">
<div class="form-check">
<input type="checkbox" class="form-check-input filter-button-band storeable-checkbox"
id="filter-button-band-{{ dom_safe_name(b.name) }}" value="{{ b.name }}"
data-ham-hf="{{ 'true' if b.is_ham_hf else 'false' }}"
autocomplete="off" onClick="filtersUpdated()" checked>
<label class="form-check-label" for="filter-button-band-{{ dom_safe_name(b.name) }}">{{ b.name
}}</label>
</div>
</div>
{% end %}
</div>
<div class="mt-1">
<a href="#" onclick="toggleFilterButtons('band', true); return false;">All</a> &nbsp;
<a href="#" onclick="toggleFilterButtons('band', false); return false;">None</a> &nbsp;
<a href="#" onclick="setHamHFBandToggles(); return false;">Ham HF only</a>
</div>
</div>
</div>
</div>
</div>
+1 -1
View File
@@ -2,7 +2,7 @@
<div class="card-body">
<h5 class="card-title">Theme</h5>
<p class="card-text spothole-card-text">
{% module Template("widgets/color_scheme.html", web_ui_options=web_ui_options) %}
{% module Template("widgets/color_scheme.html") %}
</p>
</div>
</div>
@@ -2,10 +2,10 @@
<div class="card-body">
<h5 class="card-title">Theme</h5>
<p class="card-text spothole-card-text">
{% module Template("widgets/color_scheme.html", web_ui_options=web_ui_options) %}
{% module Template("widgets/color_scheme.html") %}
</p>
<p class="card-text spothole-card-text">
{% module Template("widgets/band_color_scheme.html", web_ui_options=web_ui_options) %}
{% module Template("widgets/band_color_scheme.html") %}
</p>
</div>
</div>
+17 -2
View File
@@ -1,6 +1,21 @@
<div class="card">
<div class="card-body">
<h5 class="card-title">DE Continent</h5>
<div id="de_continent_options" class="card-text spothole-card-text"></div>
<div class="card-text spothole-card-text">
<div>
{% for c in options["continents"] %}
<div class="form-check form-check-inline">
<input type="checkbox" class="form-check-input filter-button-de_continent storeable-checkbox"
id="filter-button-de_continent-{{ c }}" value="{{ c }}"
autocomplete="off" onClick="filtersUpdated()" checked>
<label class="form-check-label" for="filter-button-de_continent-{{ c }}">{{ c }}</label>
</div>
{% end %}
</div>
<div class="mt-1">
<a href="#" onclick="toggleFilterButtons('de_continent', true); return false;">All</a> &nbsp;
<a href="#" onclick="toggleFilterButtons('de_continent', false); return false;">None</a>
</div>
</div>
</div>
</div>
</div>
+17 -2
View File
@@ -1,6 +1,21 @@
<div class="card">
<div class="card-body">
<h5 class="card-title">DX Continent</h5>
<div id="dx_continent_options" class="card-text spothole-card-text"></div>
<div class="card-text spothole-card-text">
<div>
{% for c in options["continents"] %}
<div class="form-check form-check-inline">
<input type="checkbox" class="form-check-input filter-button-dx_continent storeable-checkbox"
id="filter-button-dx_continent-{{ c }}" value="{{ c }}"
autocomplete="off" onClick="filtersUpdated()" checked>
<label class="form-check-label" for="filter-button-dx_continent-{{ c }}">{{ c }}</label>
</div>
{% end %}
</div>
<div class="mt-1">
<a href="#" onclick="toggleFilterButtons('dx_continent', true); return false;">All</a> &nbsp;
<a href="#" onclick="toggleFilterButtons('dx_continent', false); return false;">None</a>
</div>
</div>
</div>
</div>
</div>
+22 -2
View File
@@ -1,6 +1,26 @@
<div class="card">
<div class="card-body">
<h5 class="card-title">Modes</h5>
<div id="mode-options" class="card-text spothole-card-text"></div>
<div class="card-text spothole-card-text">
<div class="row row-cols-3 row-cols-md-2 row-cols-lg-3 g-1 mb-1">
{% for m in options["modes"] %}
<div class="col">
<div class="form-check">
<input type="checkbox" class="form-check-input filter-button-mode storeable-checkbox"
id="filter-button-mode-{{ dom_safe_name(m) }}" value="{{ m }}"
data-mode-type="{{ infer_mode_type_from_mode(m).value }}"
autocomplete="off" onClick="filtersUpdated()" checked>
<label class="form-check-label" for="filter-button-mode-{{ dom_safe_name(m) }}">{{ m }}</label>
</div>
</div>
{% end %}
</div>
<div class="mt-1">
<a href="#" onclick="toggleFilterButtons('mode', true); return false;">All</a> &nbsp;
<a href="#" onclick="toggleFilterButtons('mode', false); return false;">None</a> &nbsp;
<a href="#" onclick="setVoiceModeToggles(); return false;">Voice only</a> &nbsp;
<a href="#" onclick="setDigiModeToggles(); return false;">Digimodes only</a>
</div>
</div>
</div>
</div>
</div>
+21 -2
View File
@@ -1,6 +1,25 @@
<div class="card">
<div class="card-body">
<h5 class="card-title">Sources</h5>
<div id="source-options" class="card-text spothole-card-text"></div>
<div class="card-text spothole-card-text">
<div class="row row-cols-2 row-cols-xxl-3 g-1 mb-1">
{% for s in sources %}
<div class="col">
<div class="form-check">
<input type="checkbox" class="form-check-input filter-button-source storeable-checkbox"
id="filter-button-source-{{ dom_safe_name(s) }}" value="{{ s }}"
autocomplete="off" onClick="filtersUpdated()" {% if s in sources_enabled_by_default
%}checked{% end %}>
<label class="form-check-label" for="filter-button-source-{{ dom_safe_name(s) }}">{{ s
}}</label>
</div>
</div>
{% end %}
</div>
<div class="mt-1">
<a href="#" onclick="toggleFilterButtons('source', true); return false;">All</a> &nbsp;
<a href="#" onclick="toggleFilterButtons('source', false); return false;">None</a>
</div>
</div>
</div>
</div>
</div>