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
103 lines
5.0 KiB
HTML
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 %}
|