Coach lineup polish, referee level/position delete, feature-flag nav gating, per-job pause

- Coach line-up screen: more breathing room above the sheet, brighter event
  subtitle, and the "Schedule" button now matches the date input's height.
- Positions and referee levels can now be deleted from Settings (blocked with
  a friendly message if still in use on a roster/referee profile/inheritance
  chain).
- The Evaluations nav placeholder is now gated on the formbuilder flag, same
  as Forms itself, since the design reuses formbuilder underneath.
- Control panel: each scheduled platform job can now be paused/resumed
  individually (features.models.JobToggle), independent of the platform-wide
  Maintenance lock.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-23 11:17:46 +02:00
parent e621086f37
commit 1365dcf18e
23 changed files with 422 additions and 3029 deletions

View File

@@ -34,12 +34,13 @@
<a class="nav-subitem {% if nav == 'group_list' %}active{% endif %}" href="{% url 'management:group_list' %}">{% trans "Groups" %}</a>
{% comment %}
Placeholder -- nothing else is built yet (see ARCHITECTURE.md §5.8 and
management.views.EvaluationsComingSoonView). Deliberately not behind a
waffle flag like Forms below -- this is a standing "not built yet"
reminder, so it stays visible rather than disappearing until someone
remembers to flip a flag on.
management.views.EvaluationsComingSoonView). Gated on forms_enabled,
same as Forms below: the design (ARCHITECTURE.md §5.8) reuses formbuilder
underneath, so a club without that flag shouldn't see it either.
{% endcomment %}
<a class="nav-subitem flex items-center gap-1.5 {% if nav == 'evaluations' %}active{% endif %}" href="{% url 'management:evaluations' %}">{% trans "Evaluations" %} <span class="badge badge-neutral badge-xs">{% trans "Soon" %}</span></a>
{% if forms_enabled %}
<a class="nav-subitem flex items-center gap-1.5 {% if nav == 'evaluations' %}active{% endif %}" href="{% url 'management:evaluations' %}">{% trans "Evaluations" %} <span class="badge badge-neutral badge-xs">{% trans "Soon" %}</span></a>
{% endif %}
{% endif %}
</div>
{% endif %}

View File

@@ -1,5 +1,5 @@
{% extends "management/base.html" %}
{% load i18n lucide %}
{% load i18n lucide ui %}
{% block heading %}{% trans "Positions" %}{% endblock heading %}
@@ -40,7 +40,10 @@
</td>
<td class="text-right">
{% if is_club_admin %}
<a class="btn btn-outline btn-sm gap-2" href="{% url 'management:position_update' position.pk %}">{% lucide "pencil" size=14 %} {% trans "Edit" %}</a>
<div class="flex justify-end gap-1">
<a class="btn btn-outline btn-sm gap-2" href="{% url 'management:position_update' position.pk %}">{% lucide "pencil" size=14 %} {% trans "Edit" %}</a>
<button class="btn btn-sm btn-outline btn-error" type="button" onclick="document.getElementById('{{ position.pk|dom_id:"position_delete_modal" }}').showModal()" aria-label="{% trans 'Delete' %}">{% lucide "trash-2" size=14 %}</button>
</div>
{% endif %}
</td>
</tr>
@@ -52,4 +55,14 @@
</tbody>
</table>
</div>
{% if is_club_admin %}
{% trans "Delete position" as delete_position_title %}
{% trans "Delete" as delete_label %}
{% for position in positions %}
{% url 'management:position_delete' position.pk as position_delete_url %}
{% blocktrans with name=position.name asvar delete_position_body %}Delete “{{ name }}”? Positions still assigned on a team roster can't be deleted. This cannot be undone.{% endblocktrans %}
{% include "controlpanel/_confirm_modal.html" with modal_id=position.pk|dom_id:"position_delete_modal" title=delete_position_title body=delete_position_body action_url=position_delete_url submit_label=delete_label %}
{% endfor %}
{% endif %}
{% endblock panel %}

View File

@@ -1,5 +1,5 @@
{% extends "management/base.html" %}
{% load i18n lucide %}
{% load i18n lucide ui %}
{% block heading %}{% trans "Referee levels" %}{% endblock heading %}
{% block topbar_context %}<span class="text-sm text-muted">{% trans "Which teams' home games each level qualifies a referee for." %}</span>{% endblock topbar_context %}
@@ -44,7 +44,10 @@
</td>
<td class="text-right">
{% if is_club_admin %}
<a class="btn btn-outline btn-sm gap-2" href="{% url 'management:referee_level_update' level.pk %}">{% lucide "pencil" size=14 %} {% trans "Edit" %}</a>
<div class="flex justify-end gap-1">
<a class="btn btn-outline btn-sm gap-2" href="{% url 'management:referee_level_update' level.pk %}">{% lucide "pencil" size=14 %} {% trans "Edit" %}</a>
<button class="btn btn-sm btn-outline btn-error" type="button" onclick="document.getElementById('{{ level.pk|dom_id:"referee_level_delete_modal" }}').showModal()" aria-label="{% trans 'Delete' %}">{% lucide "trash-2" size=14 %}</button>
</div>
{% endif %}
</td>
</tr>
@@ -56,4 +59,14 @@
</tbody>
</table>
</div>
{% if is_club_admin %}
{% trans "Delete referee level" as delete_level_title %}
{% trans "Delete" as delete_label %}
{% for level in levels %}
{% url 'management:referee_level_delete' level.pk as level_delete_url %}
{% blocktrans with name=level.name asvar delete_level_body %}Delete “{{ name }}”? Levels still held by a referee or inherited by another level can't be deleted. This cannot be undone.{% endblocktrans %}
{% include "controlpanel/_confirm_modal.html" with modal_id=level.pk|dom_id:"referee_level_delete_modal" title=delete_level_title body=delete_level_body action_url=level_delete_url submit_label=delete_label %}
{% endfor %}
{% endif %}
{% endblock panel %}