{% import "includes/macros" as macros %} {% import "includes/forms/log" as log %} {% extends "base" %} {% block content %} <div class="max-w-screen-lg w-full"> <h1 class="h1">Ruder­assistent</h1> <div class="grid gap-3 my-5"> <div class="m-auto"> <a href="/planned" style="display:inline-flex" class="btn btn-primary flex items-center justify-between w-80 max-w-full"> <span class="text-2xl">🚣♀️</span> <span class="text-xl px-3">Geplante Ausfahrten</span> <span class="text-2xl">🚣♂️</span> </a> </div> {% if show_quick_ergo_button %} <div class="m-auto"> <a href="/ergo" style="display:inline-flex" class="btn btn-primary flex items-center justify-between w-80 max-w-full"> <span class="text-2xl">💪</span> <span class="text-xl px-3">Ergo Challenge</span> <span class="text-2xl">💪🏿</span> </a> </div> {% endif %} {% if notifications %} <div id="notification" class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2">Nachrichten</h2> {% if loggedin_user.amount_unread_notifications > 10 %} <div class="text-primary-950 dark:text-white bg-gray-200 dark:bg-primary-950 bg-opacity-80 text-center pb-3 px-3"> Du hast viele ungelesene Benachrichtigungen. Um deine Oberfläche übersichtlich zu halten und wichtige Updates nicht zu verpassen, nimm dir bitte einen Moment Zeit sie zu überprüfen und als gelesen zu markieren (✓). </div> {% endif %} <div class="divide-y"> {% for notification in notifications %} {% if not notification.read_at %} <div class="relative flex justify-between items-center p-3"> <div class="grow me-4"> <small class="uppercase text-gray-600 dark:text-gray-100"> <strong>{{ notification.category }}</strong> • {{ notification.created_at | date(format="%d.%m.%Y %H:%M",) }} </small> <div class="mt-1">{{ notification.message | safe }}</div> </div> <div> {% if notification.link %} <a href="{{ notification.link }}" class="inline-block"> <button class="btn btn-primary" type="button">🔗</button> </a> {% endif %} {% if not notification.read_at %} <a href="/notification/{{ notification.id }}/read" class="inline-block"> <button class="btn btn-primary" type="button"> ✓ <span class="sr-only">Notification gelesen</span> </button> </a> {% endif %} </div> </div> {% endif %} {% endfor %} </div> <details class="py-3 border-t rounded-b-md"> <summary class="px-3 cursor-pointer">Vergangene Nachrichten (14 Tage)</summary> <div class="divide-y text-sm"> {% for notification in notifications %} {% if notification.read_at %} <div class="p-3 relative"> <small class="uppercase text-gray-600 dark:text-gray-100"> <strong>{{ notification.category }}</strong> • {{ notification.created_at | date(format="%d.%m.%Y %H:%M") }} </small> <div class="mt-1">{{ notification.message | safe }}</div> {% if notification.link %} <a href="{{ notification.link }}" class="inline-block"> <button class="btn btn-primary" type="button">🔗</button> </a> {% endif %} </div> {% endif %} {% endfor %} </div> </details> </div> {% endif %} {% if "Donau Linz" in loggedin_user.roles and "Unterstützend" not in loggedin_user.roles and "Förderndes Mitglied" not in loggedin_user.roles %} <dialog id="call-for-action" class="max-w-screen-sm dark:bg-primary-600 dark:text-white rounded-md" onclick="document.getElementById('call-for-action').close()"> <div onclick="event.stopPropagation();" class="p-3"> <button type="button" onclick="document.getElementById('call-for-action').close()" title="Schließen" class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3"> <svg class="inline h-5 w-5" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"></path> </svg> </button> <div class="mt-8"> <p> Du hast Ideen für sinnvolle neue Funktionen für diese Ruderapp? Melde dich bei Philipp, Marie oder <a href="mailto:it@rudernlinz.at" class="underline">it@rudernlinz.at</a>. </p> <p class="mt-3"> Wenn du darüber hinaus Lust hast, deine Skills in ein Projekt zu stecken, das Wellen schlagen wird (😀), dann komm an Bord! Wir sind offen für frische Ideen, haben jedoch auch selber noch genügend; langweilig wird uns bestimmt nicht. </p> </div> </div> </dialog> <div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2"> Deine Ruderkarriere <span class="text-xl" onclick="document.getElementById('call-for-action').showModal()">💡</span> </h2> <div class="mx-2 divide-y divide-gray-200 dark:divide-primary-600"> <div class="py-3"> <details> <summary> <h3 class="inline"> <span class="text-xl"> {% if achievements.rowingbadge and achievements.rowingbadge.achieved %} 🎉 {% else %} 📋 {% endif %} </span> Fahrtenabzeichen {% if achievements.rowingbadge %}{{ achievements.rowingbadge.year }}{% endif %} <span><a href="http://www.rudern.at/OFFICE/Downloads/Ausschreibungen/2022/Wanderfahrten//Fahrtenabzeichen%20%C3%84quatorpreis%20und%20Danubius%202022.pdf" target="_blank" class="w-6 h-6 inline-flex align-center justify-center rounded-full bg-primary-500 ml-2 text-white">?</a></span> </h3> </summary> {% if achievements.rowingbadge %} {% set badge = achievements.rowingbadge %} <div class="mb-3">{{ badge.category }}</div> <label for="rowingbadge" class="label">Kilometer ({{ badge.rowed_km }} / {{ badge.required_km }} km)</label> <progress id="rowingbadge" class="w-full block my-3" value="{{ badge.rowed_km }}" max="{{ badge.required_km }}"></progress> <h4 class="font-bold mt-4">Wanderfahrten</h4> <div>Nur eine der folgenden Optionen muss erreicht werden:</div> <ol class="list-decimal ml-4 my-3"> <li> {% if badge.multi_day_trips_over_required_distance | length >= 1 %} ✅ {% else %} ❌ {% endif %} 1 mehrtägige Wanderfahrt > {{ badge.multi_day_trips_required_distance }} km </li> <li> {% if badge.single_day_trips_over_required_distance | length >= 2 %} ✅ {% else %} ❌ {% endif %} 2 eintägige Wanderfahrten > {{ badge.single_day_trips_required_distance }} km </li> </ol> <details> <summary>Details zu den Wanderfahrten</summary> <div class="mt-3"> {% for log in badge.single_day_trips_over_required_distance %} {{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index) }} {% endfor %} {% for log in badge.multi_day_trips_over_required_distance %} {{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index) }} {% endfor %} </div> </details> {% else %} <div class="mt-3"> Wir haben leider kein Geburtsdatum von dir und können dir leider deinen heurigen Status für das Fahrtenabzeichen nicht anzeigen. Wenn du dein Geburtsdatum an <a href="mailto:it@rudernlinz.at" class="underline">it@rudernlinz.at</a> schreibst, lässt sich das ändern :-) </div> {% endif %} </details> </div> <div class="py-3"> <details> <summary> <h3 class="mb-3 inline"> {% set price = achievements.equatorprice %} <span class="text-xl"> {% if achievements.curr_equatorprice_name == "-" %} 📋 {% elif achievements.curr_equatorprice_name == "Bronze" %} 🥉 {% elif achievements.curr_equatorprice_name == "Silber" %} 🥈 {% elif achievements.curr_equatorprice_name == "Gold" %} 🥇 {% elif achievements.curr_equatorprice_name == "Diamant" %} 💍 {% endif %} </span> Äquatorpreis <span><a href="http://www.rudern.at/OFFICE/Downloads/Ausschreibungen/2022/Wanderfahrten//Fahrtenabzeichen%20%C3%84quatorpreis%20und%20Danubius%202022.pdf" target="_blank" class="w-6 h-6 inline-flex align-center justify-center rounded-full bg-primary-500 ml-2 text-white">?</a></span> </h3> </summary> <div class="mt-3"> {% if price.level == "DONE" %} Gratuliere, du hast alles in deinem Rudererleben erreicht, was es (beim Äquatorpreis) zu erreichen gibt. {% else %} <label for="equatorprice" class="label">{{ price.desc }} ({{ price.rowed_km }} / {{ price.required_km }} km)</label> <progress id="equatorprice" class="w-full block my-3" value="{{ price.rowed_km }}" max="{{ price.required_km }}"></progress> <details> <summary>Details</summary> Du bist insgesamt {{ price.rowed_km }} km gerudert. Um den Äquatorpreis in {{ price.desc }} zu erhalten, benötigst du noch {{ price.missing_km }} km um die notwendigen {{ price.required_km }} km zu erreichen. </details> {% endif %} </div> </details> </div> <div class="py-3"> <p> <details> <summary> <span class="text-xl"> 📅 </span> Kalender </summary> <p class="mt-3"> Du möchtest immer up-to-date mit den Events und Ausfahrten bleiben? Wir bieten 3 verschiedene Arten von Kalender an: </p> <ol class="list-decimal ml-5 my-3"> <li> <strong>Alle Events und Ausfahrten</strong>, zu denen du dich angemeldet hast: <a class="underline break-all" href="https://app.rudernlinz.at/cal/personal/{{ loggedin_user.id }}/{{ loggedin_user.user_token }}">https://app.rudernlinz.at/cal/personal/{{ loggedin_user.id }}/{{ loggedin_user.user_token }}</a> <br /> <small>Dieser Link enthält einen zufällig generierten Teil, damit nur du (und jene, denen du diesen Link weitergibst) Zugang zu diesen Daten hast.</small> </li> <li> <strong>Allgemeiner Kalender</strong>, zB save-the-dates (Wanderfahrten, ...): <a href="https://rudernlinz.at/cal" class="break-all underline">https://rudernlinz.at/cal</a> </li> <li> <strong>Alle Events</strong>: <a class="break-all underline" href="https://app.rudernlinz.at/cal">https://app.rudernlinz.at/cal</a> <br /> <small>Beachte, dass dieser Kalender keine Ausfahrten enthält, die von einzelnen Steuerpersonen augeschrieben werden. Dieser Kalender wird zB auf <a href="https://rudernlinz.at/termine" class="underline">https://rudernlinz.at/termine</a> verwendet und wir möchten keine persönlichen Daten (Namen etc.) leaken.</small> </li> </ol> Du kannst die Kalender einfach in deinen Kalender als "externen Kalender" synchronisieren. Die genauen Schritte hängen von deiner verwendeten Software ab. </details> </p> </div> </div> </div> <div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2">Aktives Vereinsmitglied</h2> <ul class="list-none ms-2 divide-y divide-gray-200 dark:divide-primary-600"> <li class="py-1"> <a href="/planned" class="block w-100 py-2 hover:text-primary-600">Geplante Ausfahrten</a> </li> <li class="py-1"> <a href="/log" class="block w-100 py-2 hover:text-primary-600">Ausfahrt eintragen</a> </li> <li class="py-1"> <a href="/log/show" class="block w-100 py-2 hover:text-primary-600">Logbuch</a> </li> <li class="py-1"> <a href="/stat" class="block w-100 py-2 hover:text-primary-600">Statistik</a> </li> <li class="py-1"> <a href="/stat/boats" class="block w-100 py-2 hover:text-primary-600">Bootsauswertung</a> </li> <li class="py-1"> <a href="/boatdamage" class="block w-100 py-2 hover:text-primary-600">Bootsschaden</a> </li> <li class="py-1"> <a href="/boatreservation" class="block w-100 py-2 hover:text-primary-600">Bootsreservierung</a> </li> <li class="py-1"> <a href="/trailerreservation" class="block w-100 py-2 hover:text-primary-600">Hängerreservierung</a> </li> <li class="py-1"> <a href="/steering" class="block w-100 py-2 hover:text-primary-600">Steuerleute & Co</a> </li> </ul> </div> {% endif %} {% if "scheckbuch" in loggedin_user.roles %} <div class="grid gap-3 mb-4"> <div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2">Scheckbuch</h2> {% if "paid" not in loggedin_user.roles %} <div class="p-3 dark:text-white bg-white dark:bg-primary-900"> Bitte nimm zur nächsten Ausfahrt die {{ costs_scheckbuch / 100 }} € für das Scheckbuch mit. Falls du das bereits gemacht hast, gibt uns bitte kurz Bescheid, dass dies noch nicht eingetragen wurde. </div> {% endif %} <div class="text-sm p-3 bg-gray-200 bg-opacity-80 dark:bg-primary-950 dark:text-white text-primary-950"> <h3>Du hast bisher an {{ last_trips | length }} deiner 5 Scheckbuch-Ausfahrten teilgenommen.</h3> {% if last_trips %} <ol class="mt-3"> {% for last_trip in last_trips %} <li>{{ log::show_old(log=last_trip, state="completed", only_ones=false, index=loop.index) }}</li> {% endfor %} </ol> {% endif %} </div> </div> </div> {% endif %} <div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2">Ergo</h2> <div class="p-3"> <ul class="list-none ms-2"> <li class="py-1"> <a href="/ergo" class="block w-100 py-2 hover:text-primary-600">Ergo</a> </li> </ul> </div> </div> {% if "schnupper-betreuer" in loggedin_user.roles %} <div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2">Schnupper-Betreuer</h2> <ul class="list-none ms-2 divide-y divide-gray-200 dark:divide-primary-600"> <li class="py-1"> <a href="/admin/schnupper" class="block w-100 py-2 hover:text-primary-600">Schnuppern</a> </li> </ul> </div> {% endif %} {% if "Vorstand" in loggedin_user.roles %} <div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2">Vorstand</h2> <ul class="list-none ms-2 divide-y divide-gray-200 dark:divide-primary-600"> <li class="py-1"> <a href="/admin/user/fees" class="block w-100 py-2 hover:text-primary-600">Übersicht User Gebühren</a> </li> <li class="py-1"> <a href="/admin/user/scheckbuch" class="block w-100 py-2 hover:text-primary-600">Scheckbuch</a> </li> <li class="py-1"> <a href="/admin/user" class="block w-100 py-2 hover:text-primary-600">User</a> </li> <li class="py-1"> <a href="/board/boathouse" class="block w-100 py-2 hover:text-primary-600">Bootshaus</a> </li> <li class="py-1"> <a href="/admin/mail" class="block w-100 py-2 hover:text-primary-600">Mail ausschicken</a> </li> <li class="py-1"> <a href="/admin/notification" class="block w-100 py-2 hover:text-primary-600">Nachricht ausschreiben</a> </li> <li class="py-1"> <a href="/board/achievement" class="block w-100 py-2 hover:text-primary-600">Abzeichen</a> </li> </ul> </div> {% endif %} {% if "admin" in loggedin_user.roles %} <div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2">Admin</h2> <ul class="list-none ms-2 divide-y divide-gray-200 dark:divide-primary-600"> <li class="py-1"> <a href="/admin/boat" class="block w-100 py-2 hover:text-primary-600">Boote</a> </li> <li class="py-1"> <a href="/admin/user" class="block w-100 py-2 hover:text-primary-600">User</a> </li> <li class="py-1"> <a href="/admin/rss" class="block w-100 py-2 hover:text-primary-600">Logs</a> </li> <li class="py-1"> <a href="/admin/list" class="block w-100 py-2 hover:text-primary-600">Fingerabdruck-Liste überprüfen</a> </li> </ul> </div> {% endif %} <div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert"> <h2 class="h2">Allgemein</h2> <div class="p-3"> <ul class="list-none ms-2"> <li class="py-1"> <a href="https://wiki.rudernlinz.at/ruderassistent#faq" target="_blank" class="block w-100 py-2 hover:text-primary-600">FAQ (extern)</a> </li> </ul> </div> </div> </div> </div> {% endblock content %}