... | ... |
@@ -42,12 +42,12 @@ |
42 | 42 |
<form hx-post="/_ajax/vr_wa/v1/slot?do=updateReservation" enctype="multipart/form-data"> |
43 | 43 |
<input type="hidden" name="id" value="{{ id }}"> |
44 | 44 |
<fieldset> |
45 |
- <label for="res-behaelter"><strong>Liefernde Behältermenge</strong><sup class="text-danger">*</sup></label> |
|
46 |
- <select id="res-behaelter" name="behaelter" required> |
|
45 |
+ <label for="bok-behaelter"><strong>Liefernde Behältermenge</strong><sup class="text-danger">*</sup></label> |
|
46 |
+ <select id="bok-behaelter" name="behaelter" required> |
|
47 | 47 |
<option value="">-</option> |
48 | 48 |
{% for option in buchen.behaelter %} |
49 |
- {% if option > slot.behaelterAvailable %} |
|
50 |
- <option value="{{ option }}"{{ buchung.behaelter == option ? ' selected' : '' }}>{{ option }} ({{ 'MSC.wa_approval_needed'|trans([], 'contao_default') }})</option> |
|
49 |
+ {% if option > slot.behaelterOcThreshold %} |
|
50 |
+ <option value="{{ option }}"{{ buchung.behaelter == option ? ' selected' : '' }} data-oc>{{ option }} ({{ 'MSC.wa_approval_needed'|trans([], 'contao_default') }})</option> |
|
51 | 51 |
{% else %} |
52 | 52 |
<option value="{{ option }}"{{ buchung.behaelter == option ? ' selected' : '' }}>{{ option }}</option> |
53 | 53 |
{% endif %} |
... | ... |
@@ -81,15 +81,15 @@ |
81 | 81 |
<div class="u-flex u-items-center u-gap-1"><a href="{{ file.link }}">{{ file.name }}</a> <a href="javascript:;" hx-get="/_ajax/vr_wa/v1/slot?do=booking&id={{ id }}&modal=false&deleteFile=true" hx-target="closest .frame" hx-swap="outerHTML" class="tag tag__close-btn tag--danger tag--xs"></a></div> |
82 | 82 |
</fieldset> |
83 | 83 |
<fieldset> |
84 |
- <label for="res-upload"><strong>Datei überschreiben</strong></label> |
|
84 |
+ <label for="bok-upload"><strong>Datei überschreiben</strong></label> |
|
85 | 85 |
{% else %} |
86 | 86 |
<fieldset> |
87 |
- <label for="res-upload"><strong>Datei hochladen</strong></label> |
|
87 |
+ <label for="bok-upload"><strong>Datei hochladen</strong></label> |
|
88 | 88 |
{% endif %} |
89 |
- <input type="file" id="res-upload" name="upload"> |
|
89 |
+ <input type="file" id="bok-upload" name="upload"> |
|
90 | 90 |
</fieldset> |
91 | 91 |
<fieldset> |
92 |
- <button type="submit">Speichern</button> |
|
92 |
+ <button id="bok-submit" type="submit" data-label-oc="Anfragen" data-label-default="Speichern">Speichern</button> |
|
93 | 93 |
</fieldset> |
94 | 94 |
</form> |
95 | 95 |
</div> |
... | ... |
@@ -115,7 +115,7 @@ |
115 | 115 |
<option value="">-</option> |
116 | 116 |
{% for option in buchen.behaelter %} |
117 | 117 |
{% if option > slot.behaelterAvailable %} |
118 |
- <option value="{{ option }}">{{ option }} ({{ 'MSC.wa_approval_needed'|trans([], 'contao_default') }})</option> |
|
118 |
+ <option value="{{ option }}" data-oc>{{ option }} ({{ 'MSC.wa_approval_needed'|trans([], 'contao_default') }})</option> |
|
119 | 119 |
{% else %} |
120 | 120 |
<option value="{{ option }}">{{ option }}</option> |
121 | 121 |
{% endif %} |
... | ... |
@@ -148,7 +148,7 @@ |
148 | 148 |
<input type="file" id="res-upload" name="upload"> |
149 | 149 |
</fieldset> |
150 | 150 |
<fieldset> |
151 |
- <button type="submit">Reservieren</button> |
|
151 |
+ <button id="res-submit" type="submit" data-label-oc="Anfragen" data-label-default="Reservieren">Reservieren</button> |
|
152 | 152 |
</fieldset> |
153 | 153 |
</form> |
154 | 154 |
{% else %} |
... | ... |
@@ -132,6 +132,49 @@ |
132 | 132 |
{% endblock %} |
133 | 133 |
|
134 | 134 |
{% block script %} |
135 |
+ <script> |
|
136 |
+ document.addEventListener("DOMContentLoaded", () => { |
|
137 |
+ htmx.onLoad((elements) => { |
|
138 |
+ if (htmx.find(document, '#bok-behaelter') !== null) |
|
139 |
+ { |
|
140 |
+ htmx.find(document, '#bok-behaelter').addEventListener("change", (e) => { |
|
141 |
+ var selectedOption = e.target.options[e.target.selectedIndex]; |
|
142 |
+ var dataInfo = selectedOption.hasAttribute("data-oc"); |
|
143 |
+ var button = htmx.find(document, '#bok-submit'); |
|
144 |
+ |
|
145 |
+ if (dataInfo) |
|
146 |
+ { |
|
147 |
+ button.innerHTML = button.getAttribute("data-label-oc"); |
|
148 |
+ button.classList.add('btn-info'); |
|
149 |
+ } else |
|
150 |
+ { |
|
151 |
+ button.innerHTML = button.getAttribute("data-label-default"); |
|
152 |
+ button.classList.remove('btn-info'); |
|
153 |
+ } |
|
154 |
+ }); |
|
155 |
+ } |
|
156 |
+ |
|
157 |
+ if (htmx.find(elements, '#res-behaelter') !== null) |
|
158 |
+ { |
|
159 |
+ htmx.find(elements, '#res-behaelter').addEventListener("change", (e) => { |
|
160 |
+ var selectedOption = e.target.options[e.target.selectedIndex]; |
|
161 |
+ var dataInfo = selectedOption.hasAttribute("data-oc"); |
|
162 |
+ var button = htmx.find(document, '#res-submit'); |
|
163 |
+ |
|
164 |
+ if (dataInfo) |
|
165 |
+ { |
|
166 |
+ button.innerHTML = button.getAttribute("data-label-oc"); |
|
167 |
+ button.classList.add('btn-info'); |
|
168 |
+ } else |
|
169 |
+ { |
|
170 |
+ button.innerHTML = button.getAttribute("data-label-default"); |
|
171 |
+ button.classList.remove('btn-info'); |
|
172 |
+ } |
|
173 |
+ }); |
|
174 |
+ } |
|
175 |
+ }); |
|
176 |
+ }); |
|
177 |
+ </script> |
|
135 | 178 |
{#<script> |
136 | 179 |
jQuery(function($) { |
137 | 180 |
$(".mod_wa_slots_list").accordion({ |
... | ... |
@@ -184,7 +184,7 @@ class SlotAjaxController extends AbstractController |
184 | 184 |
'ernteart' => $arrErnteart, |
185 | 185 |
'buchen' => [ |
186 | 186 |
'buchbar' => (boolean) ($Slot->behaelter*3 > $intReservedBehaelter), |
187 |
- 'behaelter' => range(max($intAvailableBehaelter,1),$Slot->behaelter*3-$intReservedBehaelter), |
|
187 |
+ 'behaelter' => range(min($intAvailableBehaelter,1),$Slot->behaelter*3-$intReservedBehaelter), |
|
188 | 188 |
'sorten' => $arrSorten, |
189 | 189 |
'lage' => $arrLage, |
190 | 190 |
'ernteart' => $arrErnteart, |
... | ... |
@@ -370,6 +370,7 @@ class SlotAjaxController extends AbstractController |
370 | 370 |
|
371 | 371 |
$intReservedBehaelter = $Slot->getReservedBehaelter(); |
372 | 372 |
$intAvailableBehaelter = max($Booking->behaelter,$Slot->getAvailableBehaelter()); |
373 |
+ $intOcTreshold = $intAvailableBehaelter - $intReservedBehaelter + $Slot->behaelter; |
|
373 | 374 |
|
374 | 375 |
$arrData = array_merge($arrData,[ |
375 | 376 |
'modal' => $blnModal, |
... | ... |
@@ -378,6 +379,7 @@ class SlotAjaxController extends AbstractController |
378 | 379 |
'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''), |
379 | 380 |
'sorte' => $arrSortenAvailable, |
380 | 381 |
'behaelterAvailable' => $intAvailableBehaelter, |
382 |
+ 'behaelterOcThreshold' => $intOcTreshold, |
|
381 | 383 |
'behaelterBooked' => $Slot->getReservedBehaelter(), |
382 | 384 |
]), |
383 | 385 |
'buchung' => array_merge($Booking->row(),[ |
... | ... |
@@ -482,9 +484,21 @@ class SlotAjaxController extends AbstractController |
482 | 484 |
} |
483 | 485 |
|
484 | 486 |
$Reservation = new WeinanlieferungReservationModel(); |
487 |
+ |
|
488 |
+ $time = time(); |
|
489 |
+ |
|
490 |
+ if (Input::post('behaelter') > $Slot->behaelter - $Slot->getReservedBehaelter()) |
|
491 |
+ { |
|
492 |
+ $arrData['approved'] = ''; |
|
493 |
+ $arrData['approved_on'] = 0; |
|
494 |
+ } else { |
|
495 |
+ $arrData['approved'] = '1'; |
|
496 |
+ $arrData['approved_on'] = $time; |
|
497 |
+ } |
|
498 |
+ |
|
485 | 499 |
$arrData = array_merge($arrData,[ |
486 | 500 |
'pid' => $_REQUEST['id'], |
487 |
- 'tstamp' => time(), |
|
501 |
+ 'tstamp' => $time, |
|
488 | 502 |
'uid' => FrontendUser::getInstance()->id, |
489 | 503 |
'behaelter' => Input::post('behaelter'), |
490 | 504 |
'sorten' => $arrSorten, |
... | ... |
@@ -493,9 +507,13 @@ class SlotAjaxController extends AbstractController |
493 | 507 |
]); |
494 | 508 |
$Reservation->setRow($arrData); |
495 | 509 |
|
496 |
- |
|
497 | 510 |
$Reservation->save(); |
498 | 511 |
|
512 |
+ if (empty($Reservation->approved)) |
|
513 |
+ { |
|
514 |
+ return new Response('<div class="toast toast--warning mx-0"><p>Wir haben Ihre Anfrage erhalten. Bitte warten Sie auf eine Freigabe durch uns.</p></div>',200,['HX-Trigger'=> 'updateWaBooking']); |
|
515 |
+ } |
|
516 |
+ |
|
499 | 517 |
return new Response('<div class="toast toast--success mx-0"><p>Reservierung erfolgreich</p></div>',200,['HX-Trigger'=> 'updateWaList']); |
500 | 518 |
} |
501 | 519 |
|
... | ... |
@@ -513,6 +531,11 @@ class SlotAjaxController extends AbstractController |
513 | 531 |
return new Response('Could not load booking data',500); |
514 | 532 |
} |
515 | 533 |
|
534 |
+ if (FrontendUser::getInstance()->id != $Reservation->uid) |
|
535 |
+ { |
|
536 |
+ return new Response('Member not authorized tu update this reservation',500); |
|
537 |
+ } |
|
538 |
+ |
|
516 | 539 |
if (($rootPage = Frontend::getRootPageFromUrl()) !== null && !empty($rootPage->vr_wa_uploadFolderSRC)) |
517 | 540 |
{ |
518 | 541 |
$File = new FormFileUpload(\Contao\Widget::getAttributesFromDca($GLOBALS['TL_DCA']['tl_vr_wa_reservation']['fields']['upload'], 'upload')); |
... | ... |
@@ -535,10 +558,11 @@ class SlotAjaxController extends AbstractController |
535 | 558 |
} |
536 | 559 |
|
537 | 560 |
// Form validation |
561 |
+ /** @var WeinanlieferungSlotsModel $Slot */ |
|
538 | 562 |
if (($Slot = $Reservation->getRelated('pid')) !== null) |
539 | 563 |
{ |
540 | 564 |
// if (Input::post('behaelter') > $Slot->getAvailableBehaelter()+$Reservation->behaelter) |
541 |
- if (Input::post('behaelter') > $Slot->behaelter*3) |
|
565 |
+ if (Input::post('behaelter') > $Slot->behaelter*3-$Slot->getReservedBehaelter()+$Reservation->behaelter) |
|
542 | 566 |
{ |
543 | 567 |
return $this->renderBooking(false,sprintf('<div class="toast toast--danger mx-0">Fehler: Es sind mittlerweile nur noch %s Behälter verfügbar.</div>',$Slot->getAvailableBehaelter()+$Reservation->behaelter)); |
544 | 568 |
} |
... | ... |
@@ -581,7 +605,18 @@ class SlotAjaxController extends AbstractController |
581 | 605 |
$arrLage = implode(',', Input::post('lage')); |
582 | 606 |
} |
583 | 607 |
|
584 |
- $Reservation->tstamp = time(); |
|
608 |
+ $time = time(); |
|
609 |
+ |
|
610 |
+ if (Input::post('behaelter') > $Slot->behaelter - $Slot->getReservedBehaelter() + $Reservation->behaelter) |
|
611 |
+ { |
|
612 |
+ $Reservation->approved = ''; |
|
613 |
+ $Reservation->approved_on = 0; |
|
614 |
+ } else { |
|
615 |
+ $Reservation->approved = '1'; |
|
616 |
+ $Reservation->approved_on = $time; |
|
617 |
+ } |
|
618 |
+ |
|
619 |
+ $Reservation->tstamp = $time; |
|
585 | 620 |
$Reservation->behaelter = Input::post('behaelter'); |
586 | 621 |
$Reservation->sorten = $arrSorten; |
587 | 622 |
$Reservation->ernteart = $arrErnteart; |
... | ... |
@@ -589,6 +624,11 @@ class SlotAjaxController extends AbstractController |
589 | 624 |
|
590 | 625 |
$Reservation->save(); |
591 | 626 |
|
627 |
+ if (empty($Reservation->approved)) |
|
628 |
+ { |
|
629 |
+ return new Response('<div class="toast toast--warning mx-0"><p>Wir haben Ihre Anfrage erhalten. Bitte warten Sie auf eine Freigabe durch uns.</p></div>',200,['HX-Trigger'=> 'updateWaBooking']); |
|
630 |
+ } |
|
631 |
+ |
|
592 | 632 |
return new Response('<div class="toast toast--success mx-0"><p>Reservierung erfolgreich geändert</p></div>',200,['HX-Trigger'=> 'updateWaBooking']); |
593 | 633 |
} |
594 | 634 |
|