{% extends "management/base.html" %} {% load lucide ui i18n %} {% block heading %}{% trans "Members" %}{% endblock heading %} {% block topbar_context %} {% blocktrans count counter=paginator.count %}{{ counter }} member{% plural %}{{ counter }} members{% endblocktrans %} {% endblock topbar_context %} {% block actions %} {% lucide "download" size=16 %} {% trans "Download upload template" %} {% if is_club_admin %} {% lucide "upload" size=16 %} {% trans "Mass upload" %} {% lucide "users" size=16 %} {% trans "Add family" %} {% lucide "user-plus" size=16 %} {% trans "Add member" %} {% endif %} {% endblock actions %} {% block filter_strip %}
{% if selected_kind != "member" %}{% endif %}
{% lucide "search" size=14 %} {# No submit button -- data-autosubmit (base.html-loaded script) submits the form itself, debounced, as soon as typing pauses. #}
{# Boolean toggles rather than another dropdown -- both are reached most often from the dashboard's own "Needs attention" links (home.html), this just makes them equally reachable/visible from here. #} {% if selected_unrostered %} {% trans "Unrostered" %} {% else %} {% trans "Unrostered" %} {% endif %} {% if requirements_configured %} {% if selected_docs %} {% trans "Docs open" %} {% else %} {% trans "Docs open" %} {% endif %} {% endif %} {% if search or selected_status or selected_fee_status or selected_team or selected_unrostered or selected_docs %} {# No btn-sm: the filter fields (.input/.select) are all height:2.25rem, matching plain .btn -- btn-sm would sit 6px shorter and misalign in the row. #} {% lucide "x" size=14 %} {% trans "Clear filters" %} {% endif %}
{% comment %} Guardians -- parents attached to the club only through a child -- have no fee and aren't counted as members, so members_visible_to() leaves them out of the default list entirely. Without this filter that's silent: a parent just registered via "Add family"/"Add parent" simply doesn't appear here, with nothing on the page explaining why. This segmented control makes the exclusion an explicit, reversible choice instead. {% endcomment %}
{% trans "Guardians have no fee and aren't counted as members." %}
{% endblock filter_strip %} {% block panel %}
{% if requirements_configured %}{% endif %} {% if is_club_admin %}{% endif %} {% for member in members %} {# text-xs, not text-sm: IBM Plex Mono reads noticeably larger than Barlow at the same declared size. #} {% if requirements_configured %} {% endif %} {% if is_club_admin %} {% endif %} {% empty %} {% endfor %}
{% trans "Member" %} {% trans "Email" %} {% trans "Licence" %} {% trans "Family" %} {% trans "Status" %}{% trans "Documents" %}{% trans "Dues" %}
{{ member.first_name|slice:":1" }}{{ member.last_name|slice:":1" }}
{{ member.last_name }}, {{ member.first_name }} {% if selected_kind == "both" and member.current_membership.kind == "guardian" %} {% trans "Guardian" %} {% endif %}
{% if member.date_of_birth %}
{{ member.date_of_birth|date:"Y" }}
{% endif %}
{{ member.contact_email|default:"—" }}{{ member.current_membership.license|default:"—" }} {% if member.family_memberships_display %}
{% for fm in member.family_memberships_display %} {% lucide "users" size=12 %} {{ fm.family }} {% endfor %}
{% else %} {% endif %}
{% if member.current_membership %} {{ member.current_membership.get_status_display }} {% else %} {% trans "unknown" %} {% endif %} {% if member.current_membership and not member.current_membership.is_guardian %} {{ member.current_membership.completed_requirements }}/{{ total_requirements }} {% else %} {% endif %} {% if member.current_membership and not member.current_membership.is_guardian %} {{ member.current_membership.get_fee_status_display }} {% else %} {% endif %} {% if can_manage_members %}
{% lucide "pencil" size=13 %} {% trans "Edit" %}
{% endif %}
{% trans "No members yet." %}
{% include "management/_pagination.html" %} {% if can_manage_members %} {% trans "Delete member" as delete_member_title %} {% trans "Delete" as delete_label %} {% for member in members %} {% url 'management:member_delete' member.pk as member_delete_url %} {% blocktrans with full_name=member.get_full_name asvar delete_member_body %}Delete {{ full_name }}? This also removes their club membership, roster spots, staff assignments, and family links. This cannot be undone.{% endblocktrans %} {% include "controlpanel/_confirm_modal.html" with modal_id=member.pk|dom_id:"member_delete_modal" title=delete_member_title body=delete_member_body action_url=member_delete_url submit_label=delete_label %} {% endfor %} {% endif %} {% endblock panel %}