| ... | ... |
@@ -4,28 +4,47 @@ |
| 4 | 4 |
<div class="frame__header"> |
| 5 | 5 |
<h3>Reservierung</h3> |
| 6 | 6 |
<div class="row"> |
| 7 |
- <div class="col"> |
|
| 8 |
- <i class="icon-uhr-outline u-justify-center"></i> |
|
| 9 |
- <div class="t-label">Tag/Urzeit</div> |
|
| 7 |
+ <div class="col-md-6"> |
|
| 8 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 9 |
+ <i class="icon-uhr-outline"></i> |
|
| 10 |
+ <div class="t-label">Tag/Urzeit</div> |
|
| 11 |
+ </div> |
|
| 10 | 12 |
<div class="">{{ slot.time|date('d.m.Y H:i') }}</div>
|
| 11 | 13 |
</div> |
| 12 | 14 |
|
| 13 |
- <div class="col"> |
|
| 14 |
- <i class="icon-behaelter-outline u-justify-center"></i> |
|
| 15 |
- <div class="t-label">Verfügbare Behälterkapazität</div> |
|
| 16 |
- <div class="">{{ buchung.behaelter }}</div>
|
|
| 15 |
+ <div class="col-md-6"> |
|
| 16 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 17 |
+ <i class="icon-uhr-standort"></i> |
|
| 18 |
+ <div class="t-label">Standort</div> |
|
| 19 |
+ </div> |
|
| 20 |
+ <div class="">{{ standort.title }}</div>
|
|
| 21 |
+ </div> |
|
| 22 |
+ </div> |
|
| 23 |
+ |
|
| 24 |
+ <div class="row"> |
|
| 25 |
+ <div class="col-md-6"> |
|
| 26 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 27 |
+ <i class="icon-behaelter-outline"></i> |
|
| 28 |
+ <div class="t-label">Verfügbare Behälterkapazität</div> |
|
| 29 |
+ </div> |
|
| 30 |
+ <div class="">{{ slot.behaelterAvailable }}</div>
|
|
| 17 | 31 |
</div> |
| 18 | 32 |
|
| 19 |
- <div class="col"> |
|
| 20 |
- <i class="icon-reben-outline u-justify-center"></i> |
|
| 21 |
- <div class="t-label">Verarbeitete Sorten</div> |
|
| 22 |
- <div class="">{{ buchung.sorten|join(', ') }}</div>
|
|
| 33 |
+ <div class="col-md-6"> |
|
| 34 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 35 |
+ <i class="icon-reben-outline"></i> |
|
| 36 |
+ <div class="t-label">Verarbeitete Sorten</div> |
|
| 37 |
+ </div> |
|
| 38 |
+ <div class="">{{ slot.sorte|join(', ') }}</div>
|
|
| 23 | 39 |
</div> |
| 24 | 40 |
</div> |
| 25 | 41 |
|
| 26 | 42 |
{% if slot.anmerkungen %}
|
| 27 | 43 |
<div> |
| 28 |
- <div class="t-label">Anmerkungen</div> |
|
| 44 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 45 |
+ <i class="icon-info-outline"></i> |
|
| 46 |
+ <div class="t-label">Anmerkungen</div> |
|
| 47 |
+ </div> |
|
| 29 | 48 |
{{ slot.anmerkungen|raw }}
|
| 30 | 49 |
</div> |
| 31 | 50 |
{% endif %}
|
| 32 | 51 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,86 @@ |
| 1 |
+{% block content %}
|
|
| 2 |
+ {% if modal %}<div class="modal-content">{% endif %}
|
|
| 3 |
+ <div id="wa-slot-annotation-{{ id }}" class="frame">
|
|
| 4 |
+ <div class="frame__header"> |
|
| 5 |
+ <h3>Info</h3> |
|
| 6 |
+ <div class="row"> |
|
| 7 |
+ <div class="col-md-6"> |
|
| 8 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 9 |
+ <i class="icon-uhr-outline"></i> |
|
| 10 |
+ <div class="t-label">Tag/Urzeit</div> |
|
| 11 |
+ </div> |
|
| 12 |
+ <div class="">{{ slot.time|date('d.m.Y H:i') }}</div>
|
|
| 13 |
+ </div> |
|
| 14 |
+ |
|
| 15 |
+ <div class="col-md-6"> |
|
| 16 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 17 |
+ <i class="icon-uhr-standort"></i> |
|
| 18 |
+ <div class="t-label">Standort</div> |
|
| 19 |
+ </div> |
|
| 20 |
+ <div class="">{{ standort.title }}</div>
|
|
| 21 |
+ </div> |
|
| 22 |
+ </div> |
|
| 23 |
+ |
|
| 24 |
+ <div class="row"> |
|
| 25 |
+ <div class="col-md-6"> |
|
| 26 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 27 |
+ <i class="icon-behaelter-outline"></i> |
|
| 28 |
+ <div class="t-label">Verfügbare Behälterkapazität</div> |
|
| 29 |
+ </div> |
|
| 30 |
+ <div class="">{{ slot.behaelterAvailable }}</div>
|
|
| 31 |
+ </div> |
|
| 32 |
+ |
|
| 33 |
+ <div class="col-md-6"> |
|
| 34 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 35 |
+ <i class="icon-reben-outline"></i> |
|
| 36 |
+ <div class="t-label">Verarbeitete Sorten</div> |
|
| 37 |
+ </div> |
|
| 38 |
+ <div class="">{{ slot.sorte|join(', ') }}</div>
|
|
| 39 |
+ </div> |
|
| 40 |
+ </div> |
|
| 41 |
+ |
|
| 42 |
+ {% if slot.anmerkungen %}
|
|
| 43 |
+ <div> |
|
| 44 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 45 |
+ <i class="icon-info-outline"></i> |
|
| 46 |
+ <div class="t-label">Anmerkungen</div> |
|
| 47 |
+ </div> |
|
| 48 |
+ {{ slot.anmerkungen|raw }}
|
|
| 49 |
+ </div> |
|
| 50 |
+ {% endif %}
|
|
| 51 |
+ </div> |
|
| 52 |
+ </div> |
|
| 53 |
+ {% if modal %}</div>{% endif %}
|
|
| 54 |
+{% endblock %}
|
|
| 55 |
+ |
|
| 56 |
+{% block modal %}
|
|
| 57 |
+ {% if modal %}
|
|
| 58 |
+ <script> |
|
| 59 |
+ (function ($) {
|
|
| 60 |
+ |
|
| 61 |
+ window.modals = window.modals || [] |
|
| 62 |
+ window.modals.wa_slots = window.modals.wa_slots || [] |
|
| 63 |
+ |
|
| 64 |
+ if (window.modals.wa_slots.annotation{{ id }} === undefined)
|
|
| 65 |
+ {
|
|
| 66 |
+ window.modals.wa_slots.annotation{{ id }} = new jBox('Modal', {
|
|
| 67 |
+ closeButton: 'box', |
|
| 68 |
+ content: $('#wa-slot-annotation-{{ id }}'),
|
|
| 69 |
+ maxWidth: 650, |
|
| 70 |
+ minWidth: 100, |
|
| 71 |
+ minHeight: 100, |
|
| 72 |
+ width: 650, |
|
| 73 |
+ overlay: true, |
|
| 74 |
+ closeOnClick: false, |
|
| 75 |
+ zIndex: 'auto', |
|
| 76 |
+ addClass: '' |
|
| 77 |
+ }).open(); |
|
| 78 |
+ } else {
|
|
| 79 |
+ window.modals.wa_slots.annotation{{ id }}.content.empty();
|
|
| 80 |
+ window.modals.wa_slots.annotation{{ id }}.setContent($('#wa-slot-annotation-{{ id }}')).open();
|
|
| 81 |
+ } |
|
| 82 |
+ |
|
| 83 |
+ })(jQuery); |
|
| 84 |
+ </script> |
|
| 85 |
+ {% endif %}
|
|
| 86 |
+{% endblock %}
|
| ... | ... |
@@ -4,28 +4,47 @@ |
| 4 | 4 |
<div class="frame__header"> |
| 5 | 5 |
<h3>Zeitslot</h3> |
| 6 | 6 |
<div class="row"> |
| 7 |
- <div class="col"> |
|
| 8 |
- <i class="icon-uhr-outline u-justify-center"></i> |
|
| 9 |
- <div class="t-label">Tag/Urzeit</div> |
|
| 7 |
+ <div class="col-md-6"> |
|
| 8 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 9 |
+ <i class="icon-uhr-outline"></i> |
|
| 10 |
+ <div class="t-label">Tag/Urzeit</div> |
|
| 11 |
+ </div> |
|
| 10 | 12 |
<div class="">{{ slot.time|date('d.m.Y H:i') }}</div>
|
| 11 | 13 |
</div> |
| 12 | 14 |
|
| 13 |
- <div class="col"> |
|
| 14 |
- <i class="icon-behaelter-outline u-justify-center"></i> |
|
| 15 |
- <div class="t-label">Verfügbare Behälterkapazität</div> |
|
| 15 |
+ <div class="col-md-6"> |
|
| 16 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 17 |
+ <i class="icon-uhr-standort"></i> |
|
| 18 |
+ <div class="t-label">Standort</div> |
|
| 19 |
+ </div> |
|
| 20 |
+ <div class="">{{ standort.title }}</div>
|
|
| 21 |
+ </div> |
|
| 22 |
+ </div> |
|
| 23 |
+ |
|
| 24 |
+ <div class="row"> |
|
| 25 |
+ <div class="col-md-6"> |
|
| 26 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 27 |
+ <i class="icon-behaelter-outline"></i> |
|
| 28 |
+ <div class="t-label">Verfügbare Behälterkapazität</div> |
|
| 29 |
+ </div> |
|
| 16 | 30 |
<div class="">{{ slot.behaelterAvailable }}</div>
|
| 17 | 31 |
</div> |
| 18 | 32 |
|
| 19 |
- <div class="col"> |
|
| 20 |
- <i class="icon-reben-outline u-justify-center"></i> |
|
| 21 |
- <div class="t-label">Verarbeitete Sorten</div> |
|
| 33 |
+ <div class="col-md-6"> |
|
| 34 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 35 |
+ <i class="icon-reben-outline"></i> |
|
| 36 |
+ <div class="t-label">Verarbeitete Sorten</div> |
|
| 37 |
+ </div> |
|
| 22 | 38 |
<div class="">{{ slot.sorte|join(', ') }}</div>
|
| 23 | 39 |
</div> |
| 24 | 40 |
</div> |
| 25 | 41 |
|
| 26 | 42 |
{% if slot.anmerkungen %}
|
| 27 | 43 |
<div> |
| 28 |
- <div class="t-label">Anmerkungen</div> |
|
| 44 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 45 |
+ <i class="icon-info-outline"></i> |
|
| 46 |
+ <div class="t-label">Anmerkungen</div> |
|
| 47 |
+ </div> |
|
| 29 | 48 |
{{ slot.anmerkungen|raw }}
|
| 30 | 49 |
</div> |
| 31 | 50 |
{% endif %}
|
| ... | ... |
@@ -41,10 +60,16 @@ |
| 41 | 60 |
{% for reservation in reservations %}
|
| 42 | 61 |
<li class="row u-items-center p-0"> |
| 43 | 62 |
<div class="col-2"> |
| 44 |
- <div class="icon-behaelter-outline">{{ reservation.behaelter }}</div>
|
|
| 63 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 64 |
+ <i class="icon-behaelter-outline"></i> |
|
| 65 |
+ {{ reservation.behaelter }}
|
|
| 66 |
+ </div> |
|
| 45 | 67 |
</div> |
| 46 | 68 |
<div class="col-6"> |
| 47 |
- <div class="icon-reben-outline">{{ reservation.sorten|join(', ') }}</div>
|
|
| 69 |
+ <div class="u-flex u-items-center u-gap-1"> |
|
| 70 |
+ <i class="icon-reben-outline"></i> |
|
| 71 |
+ {{ reservation.sorten|join(', ') }}
|
|
| 72 |
+ </div> |
|
| 48 | 73 |
</div> |
| 49 | 74 |
<div class="col u-text-right"> |
| 50 | 75 |
<div><a hx-get="/_ajax/vr_wa/v1/slot?do=booking&id={{ reservation.id }}" hx-target="body" hx-swap="beforeend" href="javascript:;" class="btn btn--xs m-0">Bearbeiten</a></div>
|
| ... | ... |
@@ -48,6 +48,8 @@ |
| 48 | 48 |
{% if booking.member is not null %}
|
| 49 | 49 |
{% if booking.member.memberno is defined %}<div>{{booking.member.memberno }}</div>{% endif %}
|
| 50 | 50 |
<div>{{ booking.member.firstname }} {{ booking.member.lastname }}</div>
|
| 51 |
+ {% if booking.member.phone is defined %}<div>{{booking.member.phone }}</div>{% endif %}
|
|
| 52 |
+ {% if booking.member.email is defined %}<div><a href="mailto:{{ booking.member.email }}">{{ booking.member.email }}</a></div>{% endif %}
|
|
| 51 | 53 |
{% endif %}
|
| 52 | 54 |
</div> |
| 53 | 55 |
<div class="col u-text-right action"> |
| ... | ... |
@@ -9,20 +9,44 @@ |
| 9 | 9 |
<div class="bookings"> |
| 10 | 10 |
{% for booking in bookings %}
|
| 11 | 11 |
<div class="row u-items-center"> |
| 12 |
- <div class="col-2 time icon-uhr-outline"> |
|
| 13 |
- <span class="t-label">Uhrzeit</span> |
|
| 14 |
- {{ booking.slot.time|date('H:i') }}
|
|
| 15 |
- </div> |
|
| 16 |
- <div class="col-3 behaelter icon-behaelter-outline"> |
|
| 17 |
- <span class="t-label">Gebuchte Behälterkapazität</span> |
|
| 18 |
- {{ booking.behaelter }}
|
|
| 19 |
- </div> |
|
| 20 |
- <div class="col-5 rebsorten icon-reben-outline"> |
|
| 21 |
- <span class="t-label">Anliefernde Sorten</span> |
|
| 22 |
- {{ booking.sorte|join(', ') }}
|
|
| 12 |
+ <div class="col-10"> |
|
| 13 |
+ <div class="row"> |
|
| 14 |
+ <div class="col-3 time pl-0"> |
|
| 15 |
+ <div class="icon-uhr-outline u-flex u-items-center u-gap-1"> |
|
| 16 |
+ <span class="t-label">Uhrzeit</span> |
|
| 17 |
+ {{ booking.slot.time|date('H:i') }}
|
|
| 18 |
+ </div> |
|
| 19 |
+ <div class="icon-uhr-standort u-flex u-items-center u-gap-1"> |
|
| 20 |
+ <span class="t-label">Standort</span> |
|
| 21 |
+ {{ booking.standort }}
|
|
| 22 |
+ </div> |
|
| 23 |
+ </div> |
|
| 24 |
+ <div class="col-3 behaelter"> |
|
| 25 |
+ <div class="icon-behaelter-outline u-flex u-items-center u-gap-1"> |
|
| 26 |
+ <span class="t-label">Gebuchte Behälterkapazität</span> |
|
| 27 |
+ {{ booking.behaelter }}
|
|
| 28 |
+ </div> |
|
| 29 |
+ </div> |
|
| 30 |
+ <div class="col-6 rebsorten pr-0"> |
|
| 31 |
+ <div class="icon-reben-outline u-flex u-items-center u-gap-1"> |
|
| 32 |
+ <div class="t-label">Anliefernde Sorten</div> |
|
| 33 |
+ </div> |
|
| 34 |
+ {{ booking.sorte|join(', ') }}
|
|
| 35 |
+ </div> |
|
| 36 |
+ {% if booking.slot.anmerkungen is defined and booking.slot.anmerkungen %}
|
|
| 37 |
+ <div class="col-12 px-0"> |
|
| 38 |
+ <div class="icon-info-outline u-flex u-items-center u-gap-1"> |
|
| 39 |
+ <span class="t-label">Anmerkungen</span> |
|
| 40 |
+ </div> |
|
| 41 |
+ {{ booking.slot.anmerkungen|raw }}
|
|
| 42 |
+ <a hx-get="/_ajax/vr_wa/v1/slot?do=annotation&id={{ booking.slot.id }}" hx-target="body" hx-swap="beforeend" href="javascript:;">mehr lesen</a>
|
|
| 43 |
+ </div> |
|
| 44 |
+ {% endif %}
|
|
| 45 |
+ </div> |
|
| 23 | 46 |
</div> |
| 47 |
+ |
|
| 24 | 48 |
<div class="col u-text-right action"> |
| 25 |
- <a hx-get="/_ajax/vr_wa/v1/slot?do=booking&id={{ booking.id }}" hx-target="body" hx-swap="beforeend" href="javascript:;" class="btn btn--xs m-0">Anzeigen</a>
|
|
| 49 |
+ <a hx-get="/_ajax/vr_wa/v1/slot?do=booking&id={{ booking.id }}" hx-target="body" hx-swap="beforeend" href="javascript:;" class="btn btn--xs m-0">Ändern</a>
|
|
| 26 | 50 |
<a hx-get="/_ajax/vr_wa/v1/slot?do=delete&id={{ booking.id }}" hx-target="body" hx-swap="beforeend" hx-confirm="Sind Sie sicher, dass Sie diese Reservierung löschen möchten?" href="javascript:;" class="btn btn--xs btn-danger m-0">Löschen</a>
|
| 27 | 51 |
</div> |
| 28 | 52 |
</div> |
| ... | ... |
@@ -5,15 +5,23 @@ |
| 5 | 5 |
<div class="row"> |
| 6 | 6 |
<div class="col-md-3 kapazitaet"> |
| 7 | 7 |
<select name="filter_kapazitaet"> |
| 8 |
- <option value="">-</option> |
|
| 8 |
+ <option value="">-- Behälterkapazität --</option> |
|
| 9 | 9 |
{% for option in filter.kapazitaet.options %}
|
| 10 | 10 |
<option value="{{ option }}"{% if filter.kapazitaet.selected is defined and filter.kapazitaet.selected == option %} selected{% endif %}>{{ option }}</option>
|
| 11 | 11 |
{% endfor %}
|
| 12 | 12 |
</select> |
| 13 | 13 |
</div> |
| 14 |
+ <div class="col-md-3 standort"> |
|
| 15 |
+ <select name="filter_standort"> |
|
| 16 |
+ <option value="">-- Standort --</option> |
|
| 17 |
+ {% for key, option in filter.standort.options %}
|
|
| 18 |
+ <option value="{{ key }}"{% if filter.standort.selected is defined and filter.standort.selected == key %} selected{% endif %}>{{ option }}</option>
|
|
| 19 |
+ {% endfor %}
|
|
| 20 |
+ </select> |
|
| 21 |
+ </div> |
|
| 14 | 22 |
<div class="col-md-3 sorte"> |
| 15 | 23 |
<select name="filter_sorte"> |
| 16 |
- <option value="">-</option> |
|
| 24 |
+ <option value="">-- Sorte --</option> |
|
| 17 | 25 |
{% for key, option in filter.sorte.options %}
|
| 18 | 26 |
<option value="{{ key }}"{% if filter.sorte.selected is defined and filter.sorte.selected == key %} selected{% endif %}>{{ option }}</option>
|
| 19 | 27 |
{% endfor %}
|
| ... | ... |
@@ -21,13 +29,13 @@ |
| 21 | 29 |
</div> |
| 22 | 30 |
<div class="col-md-3 leseart"> |
| 23 | 31 |
<select name="filter_leseart"> |
| 24 |
- <option value="">-</option> |
|
| 32 |
+ <option value="">-- Leseart --</option> |
|
| 25 | 33 |
{% for key, option in filter.leseart.options %}
|
| 26 | 34 |
<option value="{{ key }}"{% if filter.leseart.selected is defined and filter.leseart.selected == key %} selected{% endif %}>{{ option }}</option>
|
| 27 | 35 |
{% endfor %}
|
| 28 | 36 |
</select> |
| 29 | 37 |
</div> |
| 30 |
- <div class="col submit"><button class="u-block w-100p">Filter übernehmen</button></div> |
|
| 38 |
+{# <div class="col submit"><button class="u-block w-100p">Filter übernehmen</button></div>#}
|
|
| 31 | 39 |
</div> |
| 32 | 40 |
</form> |
| 33 | 41 |
{% endblock %}
|
| ... | ... |
@@ -41,20 +49,43 @@ |
| 41 | 49 |
<div class="slots"> |
| 42 | 50 |
{% for slot in slots %}
|
| 43 | 51 |
<div class="row u-items-center{{ not slot.buchbar ? ' error' : '' }}{{ slot.gebucht ? ' booked' : '' }}">
|
| 44 |
- <div class="col-2 time icon-uhr-outline"> |
|
| 45 |
- <span class="t-label">Uhrzeit</span> |
|
| 46 |
- {{ slot.time|date('H:i') }}
|
|
| 47 |
- </div> |
|
| 48 |
- <div class="col-3 behaelter icon-behaelter-outline"> |
|
| 49 |
- <span class="t-label">Verfügbare Behälterkapazität</span> |
|
| 50 |
- {{ slot.behaelterAvailable }}
|
|
| 51 |
- </div> |
|
| 52 |
- <div class="col-5 rebsorten icon-reben-outline"> |
|
| 53 |
- <span class="t-label">Verarbeitete Sorten</span> |
|
| 54 |
- {{ slot.sorte|join(', ') }}
|
|
| 52 |
+ <div class="col-10"> |
|
| 53 |
+ <div class="row"> |
|
| 54 |
+ <div class="col-3 time pl-0"> |
|
| 55 |
+ <div class="icon-uhr-outline u-flex u-items-center u-gap-1"> |
|
| 56 |
+ <span class="t-label">Uhrzeit</span> |
|
| 57 |
+ {{ slot.time|date('H:i') }}
|
|
| 58 |
+ </div> |
|
| 59 |
+ <div class="icon-uhr-standort u-flex u-items-center u-gap-1"> |
|
| 60 |
+ <span class="t-label">Standort</span> |
|
| 61 |
+ {{ slot.standort }}
|
|
| 62 |
+ </div> |
|
| 63 |
+ </div> |
|
| 64 |
+ <div class="col-3 behaelter"> |
|
| 65 |
+ <div class="icon-behaelter-outline u-flex u-items-center u-gap-1"> |
|
| 66 |
+ <span class="t-label">Verfügbare Behälterkapazität</span> |
|
| 67 |
+ {{ slot.behaelterAvailable }}
|
|
| 68 |
+ </div> |
|
| 69 |
+ </div> |
|
| 70 |
+ <div class="col-6 rebsorten pr-0"> |
|
| 71 |
+ <div class="icon-reben-outline u-flex u-items-center u-gap-1"> |
|
| 72 |
+ <div class="t-label">Verarbeitete Sorten</div> |
|
| 73 |
+ </div> |
|
| 74 |
+ {{ slot.sorte|join(', ') }}
|
|
| 75 |
+ </div> |
|
| 76 |
+ {% if slot.anmerkungen is defined and slot.anmerkungen %}
|
|
| 77 |
+ <div class="col-12 px-0"> |
|
| 78 |
+ <div class="icon-info-outline u-flex u-items-center u-gap-1"> |
|
| 79 |
+ <span class="t-label">Anmerkungen</span> |
|
| 80 |
+ </div> |
|
| 81 |
+ {{ slot.anmerkungen|raw }}
|
|
| 82 |
+ <a hx-get="/_ajax/vr_wa/v1/slot?do=annotation&id={{ slot.id }}" hx-target="body" hx-swap="beforeend" href="javascript:;">mehr lesen</a>
|
|
| 83 |
+ </div> |
|
| 84 |
+ {% endif %}
|
|
| 85 |
+ </div> |
|
| 55 | 86 |
</div> |
| 56 | 87 |
<div class="col u-text-right action"> |
| 57 |
- <a hx-get="/_ajax/vr_wa/v1/slot?do=details&id={{ slot.id }}" hx-target="body" hx-swap="beforeend" href="javascript:;" class="btn btn--xs m-0">Anzeigen & Buchen</a>
|
|
| 88 |
+ <a hx-get="/_ajax/vr_wa/v1/slot?do=details&id={{ slot.id }}" hx-target="body" hx-swap="beforeend" href="javascript:;" class="btn btn--xs m-0">Buchen</a>
|
|
| 58 | 89 |
</div> |
| 59 | 90 |
</div> |
| 60 | 91 |
{% endfor %}
|
| 61 | 92 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 413 413" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect id="Artboard1" x="0" y="0" width="412.5" height="412.5" style="fill:none;"/><g id="Artboard11" serif:id="Artboard1"><g id="Info"><path d="M198.75,135l15,-0c9.946,-0 19.484,3.951 26.517,10.984c7.032,7.032 10.983,16.57 10.983,26.516l-0,107.758c-0,15.046 12.196,27.242 27.242,27.242l0.001,0c13.949,0 25.257,11.308 25.257,25.257l-0,19.743c-0,20.711 -16.789,37.5 -37.5,37.5l-39.407,-0c-36.226,-0 -65.593,-29.367 -65.593,-65.593l-0,-151.907c0,-9.946 3.951,-19.484 10.983,-26.517c7.033,-7.032 16.571,-10.983 26.517,-10.983Zm0,15c-5.967,-0 -11.69,2.371 -15.91,6.59c-4.219,4.22 -6.59,9.943 -6.59,15.91l-0,151.907c-0,27.942 22.651,50.593 50.593,50.593l39.407,0c12.426,0 22.5,-10.074 22.5,-22.5l-0,-19.743c-0,-5.665 -4.592,-10.257 -10.257,-10.257l-0.002,0c-23.329,-0 -42.241,-18.912 -42.241,-42.242l-0,-107.758c0,-5.967 -2.371,-11.69 -6.59,-15.91c-4.22,-4.219 -9.943,-6.59 -15.91,-6.59l-15,0Z"/><path d="M161.25,67.5l0,-15c-0,-9.946 3.951,-19.484 10.983,-26.517c7.033,-7.032 16.571,-10.983 26.517,-10.983l15,-0c9.946,-0 19.484,3.951 26.517,10.983c7.032,7.033 10.983,16.571 10.983,26.517l-0,15c0,9.946 -3.951,19.484 -10.983,26.517c-7.033,7.032 -16.571,10.983 -26.517,10.983l-15,-0c-9.946,0 -19.484,-3.951 -26.517,-10.983c-7.032,-7.033 -10.983,-16.571 -10.983,-26.517Zm15,-0c-0,5.967 2.371,11.69 6.59,15.91c4.22,4.219 9.943,6.59 15.91,6.59l15,-0c5.967,0 11.69,-2.371 15.91,-6.59c4.219,-4.22 6.59,-9.943 6.59,-15.91l-0,-15c0,-5.967 -2.371,-11.69 -6.59,-15.91c-4.22,-4.219 -9.943,-6.59 -15.91,-6.59l-15,-0c-5.967,-0 -11.69,2.371 -15.91,6.59c-4.219,4.22 -6.59,9.943 -6.59,15.91l-0,15Z"/></g></g></svg> |
|
| 0 | 2 |
\ No newline at end of file |
| 1 | 3 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 413 413" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect id="Artboard1" x="0" y="0" width="412.5" height="412.5" style="fill:none;"/><clipPath id="_clip1"><rect id="Artboard11" serif:id="Artboard1" x="0" y="0" width="412.5" height="412.5"/></clipPath><g clip-path="url(#_clip1)"><g id="Standort"><path d="M193.047,404.619l-108.361,-200.961c-23.078,-42.799 -21.949,-94.582 2.973,-136.335c24.922,-41.752 69.965,-67.323 118.59,-67.323l0.002,-0c48.625,-0 93.668,25.571 118.59,67.323c24.922,41.753 26.051,93.536 2.973,136.335l-108.361,200.961c-2.618,4.855 -7.688,7.881 -13.203,7.881c-5.515,-0 -10.585,-3.026 -13.203,-7.881Zm13.203,-7.119l108.361,-200.961c20.572,-38.151 19.565,-84.309 -2.65,-121.528c-22.215,-37.218 -62.366,-60.011 -105.71,-60.011l-0.002,0c-43.344,-0 -83.495,22.793 -105.71,60.011c-22.215,37.219 -23.222,83.377 -2.65,121.528l108.361,200.961Z"/><path d="M206.25,93.75c22.766,0 41.25,18.484 41.25,41.25c-0,22.766 -18.484,41.25 -41.25,41.25c-22.766,0 -41.25,-18.484 -41.25,-41.25c-0,-22.766 18.484,-41.25 41.25,-41.25Zm-0,15c-14.488,0 -26.25,11.762 -26.25,26.25c-0,14.488 11.762,26.25 26.25,26.25c14.488,0 26.25,-11.762 26.25,-26.25c-0,-14.488 -11.762,-26.25 -26.25,-26.25Z"/></g></g></svg> |
|
| 0 | 2 |
\ No newline at end of file |
| ... | ... |
@@ -78,6 +78,9 @@ class SlotAjaxController extends AbstractController |
| 78 | 78 |
case 'details': |
| 79 | 79 |
return $this->renderDetails($blnModal); |
| 80 | 80 |
|
| 81 |
+ case 'annotation': |
|
| 82 |
+ return $this->renderAnnotation($blnModal); |
|
| 83 |
+ |
|
| 81 | 84 |
case 'booking': |
| 82 | 85 |
return $this->renderBooking($blnModal); |
| 83 | 86 |
|
| ... | ... |
@@ -172,6 +175,48 @@ class SlotAjaxController extends AbstractController |
| 172 | 175 |
return $this->render('@Contao/modal_slot_details.html.twig',$arrData);
|
| 173 | 176 |
} |
| 174 | 177 |
|
| 178 |
+ protected function renderAnnotation(bool $blnModal=true,string $error=null) |
|
| 179 |
+ {
|
|
| 180 |
+ if (empty($_REQUEST['id'])) |
|
| 181 |
+ {
|
|
| 182 |
+ return new Response('Required parameter missing',412);
|
|
| 183 |
+ } |
|
| 184 |
+ |
|
| 185 |
+ if (($Slot = WeinanlieferungSlotsModel::findPublishedById($_REQUEST['id'])) === null) |
|
| 186 |
+ {
|
|
| 187 |
+ return new Response('Could not load slot data',500);
|
|
| 188 |
+ } |
|
| 189 |
+ |
|
| 190 |
+ // Build data |
|
| 191 |
+ $arrSorten = []; |
|
| 192 |
+ $Sorten = StringUtil::deserialize($Slot->sorten,true); |
|
| 193 |
+ foreach($Sorten as $sorte) |
|
| 194 |
+ {
|
|
| 195 |
+ $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']); |
|
| 196 |
+ $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']); |
|
| 197 |
+ $arrSorten[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null ? $objSorte->title : '') . ' ' . ($objLeseart !== null ? $objLeseart->title : ''); |
|
| 198 |
+ } |
|
| 199 |
+ |
|
| 200 |
+ $intAvailableBehaelter = $Slot->getAvailableBehaelter(); |
|
| 201 |
+ |
|
| 202 |
+ $arrData = [ |
|
| 203 |
+ 'modal' => $blnModal, |
|
| 204 |
+ 'id' => $Slot->id, |
|
| 205 |
+ 'slot' => array_merge($Slot->row(),[ |
|
| 206 |
+ 'sorte' => $arrSorten, |
|
| 207 |
+ 'behaelterAvailable' => $intAvailableBehaelter |
|
| 208 |
+ ]), |
|
| 209 |
+ 'standort' => $Slot->getRelated('pid'),
|
|
| 210 |
+ 'buchen' => [ |
|
| 211 |
+ 'buchbar' => (boolean) $intAvailableBehaelter, |
|
| 212 |
+ 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter), |
|
| 213 |
+ 'sorten' => $arrSorten |
|
| 214 |
+ ], |
|
| 215 |
+ ]; |
|
| 216 |
+ |
|
| 217 |
+ return $this->render('@Contao/modal_slot_annotation.html.twig',$arrData);
|
|
| 218 |
+ } |
|
| 219 |
+ |
|
| 175 | 220 |
protected function renderBooking(bool $blnModal=true) |
| 176 | 221 |
{
|
| 177 | 222 |
$arrData = []; |
| ... | ... |
@@ -69,9 +69,18 @@ class WeinanlieferungBookedListModuleController extends AbstractFrontendModuleCo |
| 69 | 69 |
$arrSorten[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null ? $objSorte->title : '') . ' ' . ($objLeseart !== null ? $objLeseart->title : ''); |
| 70 | 70 |
} |
| 71 | 71 |
|
| 72 |
+ $strStandort = ''; |
|
| 73 |
+ if (($Standort = $Slot->getRelated('pid')) !== null)
|
|
| 74 |
+ {
|
|
| 75 |
+ $strStandort = $Standort->title; |
|
| 76 |
+ } |
|
| 77 |
+ |
|
| 72 | 78 |
$arrData['days'][$day->dayBegin][] = array_merge($booking->row(), [ |
| 73 | 79 |
'sorte' => $arrSorten, |
| 74 |
- 'slot' => $Slot->row() |
|
| 80 |
+ 'slot' => array_merge($Slot->row(),[ |
|
| 81 |
+ 'anmerkungen' => $Slot->anmerkungen ? StringUtil::substr(strip_tags($Slot->anmerkungen),110) : '', |
|
| 82 |
+ ]), |
|
| 83 |
+ 'standort' => $strStandort, |
|
| 75 | 84 |
]); |
| 76 | 85 |
} |
| 77 | 86 |
} |
| ... | ... |
@@ -30,6 +30,7 @@ use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLeseartModel; |
| 30 | 30 |
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel; |
| 31 | 31 |
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel; |
| 32 | 32 |
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel; |
| 33 |
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungStandortModel; |
|
| 33 | 34 |
|
| 34 | 35 |
/** |
| 35 | 36 |
* @FrontendModule(WeinanlieferungSlotsListModuleController::TYPE, category="miscellaneous") |
| ... | ... |
@@ -60,6 +61,12 @@ class WeinanlieferungSlotsListModuleController extends AbstractFrontendModuleCon |
| 60 | 61 |
$arrOptions['column'][] = '(SELECT tl_vr_wa_slot.behaelter - IFNULL(SUM(tl_vr_wa_reservation.behaelter),0) FROM tl_vr_wa_reservation WHERE tl_vr_wa_reservation.pid = tl_vr_wa_slot.id) >= ?'; |
| 61 | 62 |
$arrOptions['value'][] = $_GET['filter_kapazitaet']; |
| 62 | 63 |
} |
| 64 |
+ if (!empty($_GET['filter_standort'])) |
|
| 65 |
+ {
|
|
| 66 |
+ $arrData['filter']['standort']['selected'] = $_GET['filter_standort']; |
|
| 67 |
+ $arrOptions['column'][] = 'pid = ?'; |
|
| 68 |
+ $arrOptions['value'][] = $_GET['filter_standort']; |
|
| 69 |
+ } |
|
| 63 | 70 |
if (!empty($_GET['filter_sorte']) && !empty($_GET['filter_leseart'])) |
| 64 | 71 |
{
|
| 65 | 72 |
$arrData['filter']['sorte']['selected'] = $_GET['filter_sorte']; |
| ... | ... |
@@ -80,6 +87,11 @@ class WeinanlieferungSlotsListModuleController extends AbstractFrontendModuleCon |
| 80 | 87 |
|
| 81 | 88 |
$arrData['filter']['kapazitaet']['options'] = range(1,30); |
| 82 | 89 |
|
| 90 |
+ if (($Standorte = WeinanlieferungStandortModel::findBy(["id IN (".implode(',',$standortIds).")"],null,['order'=>'title ASC'])) !== null)
|
|
| 91 |
+ {
|
|
| 92 |
+ $arrData['filter']['standort']['options'] = array_combine($Standorte->fetchEach('id'),$Standorte->fetchEach('title'));
|
|
| 93 |
+ } |
|
| 94 |
+ |
|
| 83 | 95 |
if (($Sorten = WeinanlieferungRebsorteModel::findAll(['order'=>'title ASC'])) !== null) |
| 84 | 96 |
{
|
| 85 | 97 |
$arrData['filter']['sorte']['options'] = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
|
| ... | ... |
@@ -107,12 +119,16 @@ class WeinanlieferungSlotsListModuleController extends AbstractFrontendModuleCon |
| 107 | 119 |
$objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']); |
| 108 | 120 |
$arrSorten[] = ($objSorte !== null ? $objSorte->title : '') . ' ' . ($objLeseart !== null ? $objLeseart->title : ''); |
| 109 | 121 |
} |
| 110 |
- /*if (($Sorten = $slot->getRelated('sorte')) !== null)
|
|
| 122 |
+ |
|
| 123 |
+ $strStandort = ''; |
|
| 124 |
+ if (($Standort = $slot->getRelated('pid')) !== null)
|
|
| 111 | 125 |
{
|
| 112 |
- $arrSorten = $Sorten->fetchEach('title');
|
|
| 113 |
- }*/ |
|
| 126 |
+ $strStandort = $Standort->title; |
|
| 127 |
+ } |
|
| 114 | 128 |
|
| 115 | 129 |
$arrData['days'][$day->dayBegin][] = array_merge($slot->row(),[ |
| 130 |
+ 'anmerkungen' => $slot->anmerkungen ? StringUtil::substr(strip_tags($slot->anmerkungen),110) : '', |
|
| 131 |
+ 'standort' => $strStandort, |
|
| 116 | 132 |
'sorte' => $arrSorten, |
| 117 | 133 |
'behaelterAvailable' => $intAvailableBehaelter, |
| 118 | 134 |
'buchbar' => (boolean) $intAvailableBehaelter, |