Files
RosterChief/management/templates/management/event_form.html
Bernard Siebens adf1120358 Checkpoint: management app redesign, onboarding/signup workflow, and events calendar backend
Large uncommitted body of work accumulated across sessions on this branch --
committing as a checkpoint so it's tracked and future worktree-isolated agents
see the real codebase instead of a stale ancestor commit. Covers the
management app's dedicated Tailwind theme and templates, the club onboarding
requirement/signup workflow (club/services/onboarding.py, requirement/status
models, sign-up dashboard), fee/status auto-activation decoupling, referee
management, and the new events calendar grid service layer.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ECGMEwrc2k4D8VQuwjstj9
2026-08-19 23:34:43 +02:00

103 lines
5.0 KiB
HTML

{% extends "management/base.html" %}
{% load i18n lucide static ui %}
{% block heading %}{% if update_view %}{% blocktrans %}Edit {{ object }}{% endblocktrans %}{% else %}{% trans "New event" %}{% endif %}{% endblock heading %}
{% block panel %}
<div class="card w-full">
<div class="card-body">
<form method="post">
{% csrf_token %}
{% for error in form.non_field_errors %}
<div class="alert alert-error">
<span>{{ error }}</span>
</div>
{% endfor %}
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
{% form_field form.title %}
{% form_field form.kind %}
</div>
<div class="my-5 border-t border-line"></div>
<h3 class="mb-3 font-display text-xs font-extrabold tracking-[.12em] text-muted uppercase">{% trans "Audience" %}</h3>
<div class="grid grid-cols-1 gap-4 md:grid-cols-3">
{% form_field form.teams %}
{% form_field form.groups %}
{% if "club_wide" in form.fields %}
{% form_field form.club_wide %}
{% endif %}
</div>
<div class="mt-4 grid grid-cols-1 gap-4 md:grid-cols-2">
{% form_field form.invited_members %}
{% form_field form.excluded_members %}
</div>
<div class="my-5 border-t border-line"></div>
<h3 class="mb-3 font-display text-xs font-extrabold tracking-[.12em] text-muted uppercase">{% trans "Where" %}</h3>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
{% form_field form.location %}
<div class="game-only">
{% form_field form.opponent %}
</div>
</div>
<div class="my-5 border-t border-line"></div>
<h3 class="mb-3 font-display text-xs font-extrabold tracking-[.12em] text-muted uppercase">{% trans "When" %}</h3>
<div class="grid grid-cols-1 gap-4 md:grid-cols-4">
{% form_field form.start %}
{% form_field form.end %}
{% form_field form.gathering %}
{% form_field form.deadline %}
</div>
<div id="game-details-section" class="game-only">
<div class="my-5 border-t border-line"></div>
<h3 class="mb-3 font-display text-xs font-extrabold tracking-[.12em] text-muted uppercase">{% trans "Game" %}</h3>
<div class="grid grid-cols-1 gap-4 md:grid-cols-3">
{% form_field form.competition %}
{% form_field form.external_game_id %}
{% form_field form.max_referees %}
{% if update_view %}
{% comment %}
Score/live status only exist to record once a game has
actually been created -- the add form leaves them out
entirely (see EventForm's editing=False path).
{% endcomment %}
{% form_field form.score_for %}
{% form_field form.score_against %}
{% form_field form.is_live %}
{% endif %}
</div>
</div>
<div class="card-actions justify-start pt-4">
<a class="btn btn-outline gap-2" href="{% if update_view %}{% url "management:event_detail" object.pk %}{% else %}{% url "management:event_list" %}{% endif %}">{% lucide "arrow-left" size=16 %} {% trans "Cancel" %}</a>
<button class="btn btn-primary gap-2" type="submit">{% lucide "save" size=16 %} {% trans "Save" %}</button>
</div>
</form>
</div>
</div>
{% endblock panel %}
{% block extra_body %}
<script src="{% static 'js/searchable-select.js' %}"></script>
<script>
(() => {
// Progressive enhancement only -- the fields stay in the form and post
// normally either way, this just hides them when they don't apply so a
// training/social/etc. event isn't cluttered with opponent/score/competition
// inputs. Anything gated on "only makes sense for a game" carries this class.
const kindField = document.getElementById("id_kind");
const gameOnlyElements = document.querySelectorAll(".game-only");
if (!kindField || !gameOnlyElements.length) return;
const sync = () => gameOnlyElements.forEach((element) => element.classList.toggle("hidden", kindField.value !== "game"));
kindField.addEventListener("change", sync);
sync();
})();
</script>
{% endblock extra_body %}