Fix and style daytrip select widget

This commit is contained in:
Björn Fromme
2022-03-08 17:01:31 +01:00
parent c858957138
commit a285933f40
4 changed files with 68 additions and 33 deletions
@@ -36,6 +36,7 @@ use EP\EpProducts\Service\DateService;
use EP\EpProducts\Service\FilterService; use EP\EpProducts\Service\FilterService;
use EP\EpProducts\Service\ResellerDataService; use EP\EpProducts\Service\ResellerDataService;
use EP\EpProducts\Traits\RequestArgumentTypeConversionTrait; use EP\EpProducts\Traits\RequestArgumentTypeConversionTrait;
use League\Period\Period;
use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
@@ -313,11 +314,19 @@ class AjaxTableController extends ActionController
*/ */
public function daytripRoomsAction(Hotel $hotel, Product $product, $dateFrom, $dateTo) public function daytripRoomsAction(Hotel $hotel, Product $product, $dateFrom, $dateTo)
{ {
$template = $this->settings['bpnBookingUrlTemplateCode']; $period = new Period($dateFrom, $dateTo);
$rooms = $this $nights = $period->getDateInterval()->format('%a');
->contingentDataService
->getAvailableRooms($dateFrom, $dateTo, $hotel, $product, $template);
if (2 > $nights) {
$rooms = [];
} else {
$template = $this->settings['bpnBookingUrlTemplateCode'];
$rooms = $this
->contingentDataService
->getAvailableRooms($dateFrom, $dateTo, $hotel, $product, $template);
}
$this->view->assign('nights', $nights);
$this->view->assign('rooms', $rooms); $this->view->assign('rooms', $rooms);
} }
@@ -5,7 +5,6 @@ import { useFetch } from '../mixins/use_fetch'
export default class extends Controller { export default class extends Controller {
static targets = [ static targets = [
'headerLabel',
'container', 'container',
'loadingIndicator', 'loadingIndicator',
'message', 'message',
@@ -35,6 +34,7 @@ export default class extends Controller {
this.loadingValue = true this.loadingValue = true
this.dateFromValue = e.detail.from this.dateFromValue = e.detail.from
this.dateToValue = e.detail.to this.dateToValue = e.detail.to
this.containerTarget.innerHTML = ''
let data = new FormData() let data = new FormData()
data.set('tx_epproducts_ajax[hotel]', this.hotelUidValue) data.set('tx_epproducts_ajax[hotel]', this.hotelUidValue)
data.set('tx_epproducts_ajax[product]', this.productUidValue) data.set('tx_epproducts_ajax[product]', this.productUidValue)
@@ -5,46 +5,67 @@
<f:layout name="Default"/> <f:layout name="Default"/>
<f:section name="Main"> <f:section name="Main">
<table class="table table-striped pricetable"> <f:if condition="{nights} < 3">
<f:then>
<p class="font-bold">
Bitte mindestens 2 Nächte auswählen.
</p>
</f:then>
<f:else>
<f:render section="Table" arguments="{_all}"/>
</f:else>
</f:if>
</f:section>>
<f:section name="Table">
<table class="w-full mb-4 bg-gray-200 text-sm xl:text-base">
<thead> <thead>
<tr> <tr>
<th>Zimmerart</th> <th class="border-r border-overlay-white-50 px-2 py-1 md:p-2 text-left text-sm md:text-base">
<th>Preis</th> Zimmerart
<th>inkl.</th> </th>
<th></th> <th class="border-r border-overlay-white-50 px-2 py-1 md:p-2 text-left text-sm md:text-base">
Preis
</th>
<th class="border-r border-overlay-white-50 px-2 py-1 md:p-2 text-left text-sm md:text-base">
inkl.
</th>
<th class="border-r border-overlay-white-50 px-2 py-1 md:p-2 text-left text-sm md:text-base">
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<f:for each="{rooms}" as="row" iteration="iteration"> <f:for each="{rooms}" as="row" iteration="iteration">
<tr> <tr class="odd:bg-gray-50 hover:bg-gray-100 odd:hover:bg-gray-100">
<td> <td class="border-r border-gray-200 px-2 py-1 md:p-2">
{row.label} {row.label}
</td> </td>
<td class="whitespace-nowrap"> <td class="border-r border-gray-200 px-2 py-1 md:p-2 whitespace-nowrap">
ab {row.priceForSelection} € ab {row.priceForSelection} €
</td> </td>
<td> <td class="border-r border-gray-200 px-2 py-1 md:p-2">
<f:if condition="{row.skipassIncluded}"> <f:if condition="{row.skipassIncluded}">
<span data-cooltipz-dir="top" <span data-cooltipz-dir="top"
aria-label="{f:if(condition: row.summer, then: 'Bergbahnticket inklusive', else: 'Skipass inklusive')}" aria-label="{f:if(condition: row.summer, then: 'Bergbahnticket inklusive', else: 'Skipass inklusive')}"
role="tooltip"> role="tooltip">
<svg class="w-4 h-4"> <svg class="w-4 h-4">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-tag"></use> <use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-tag"></use>
</svg> </svg>
</span> </span>
</f:if> </f:if>
<button type="button" <button type="button"
class="button button--light button--small hidden md:block"
data-action="daytrip#openModal" data-action="daytrip#openModal"
data-type="services" data-type="services"
data-uid="{iteration.cycle}" data-uid="{iteration.cycle}"
data-cooltipz-dir="top" data-cooltipz-dir="top"
aria-label="Alle Inklusivleistungen anzeigen" aria-label="Alle Inklusivleistungen anzeigen"
role="tooltip"> role="tooltip">
Leistungen <svg class="w-4 h-4">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-info-circle"></use>
</svg>
</button> </button>
</td> </td>
<td> <td class="border-r border-gray-200 px-2 py-1 md:p-2">
<a class="button button--small bg-green-500 border-green-500" <a class="button button--small bg-green-500 border-green-500"
href="{row.bookingUrl}" target="_blank"> href="{row.bookingUrl}" target="_blank">
Buchen Buchen
@@ -10,12 +10,17 @@
<f:render partial="Product/HeaderDetail" arguments="{_all}"/> <f:render partial="Product/HeaderDetail" arguments="{_all}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/> <f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<div class="container" <div class="container"
<f:if condition="{product.daytrip}">
<f:else>
data-controller="product-details" data-controller="product-details"
data-action="tabs:selected->product-details#switchView" data-action="tabs:selected->product-details#switchView"
data-product-details-datestable-uri-value="{ep:uri.ajax(action: 'datestable', controller: 'AjaxTable', arguments: '{product: product, hotel: hotel}', format: 'html', pageUid: settings.defaultAjaxUid)}" data-product-details-datestable-uri-value="{ep:uri.ajax(action: 'datestable', controller: 'AjaxTable', arguments: '{product: product, hotel: hotel}', format: 'html', pageUid: settings.defaultAjaxUid)}"
data-product-details-pricetable-uri-value="{ep:uri.ajax(action: 'pricetable', controller: 'AjaxTable', arguments: '{product: product, hotel: hotel}', format: 'html', pageUid: settings.defaultAjaxUid)}" data-product-details-pricetable-uri-value="{ep:uri.ajax(action: 'pricetable', controller: 'AjaxTable', arguments: '{product: product, hotel: hotel}', format: 'html', pageUid: settings.defaultAjaxUid)}"
data-product-details-travel-alert-uri-value="{f:uri.typolink(parameter: settings.travelAlertPageUid)}" data-product-details-travel-alert-uri-value="{f:uri.typolink(parameter: settings.travelAlertPageUid)}"
data-product-details-disable-tables-value="{f:if(condition: hotel.groupsPriceConfigs, then: 'true', else: 'false')}"> data-product-details-disable-tables-value="{f:if(condition: hotel.groupsPriceConfigs, then: 'true', else: 'false')}"
</f:else>
</f:if>
>
<f:render partial="Header/Header" arguments="{layout: 8, subheader: '{product.region.name} / {product.name}', header: product.headline}"/> <f:render partial="Header/Header" arguments="{layout: 8, subheader: '{product.region.name} / {product.name}', header: product.headline}"/>
<div class="flex flex-col lg:flex-row-reverse lg:items-start" <div class="flex flex-col lg:flex-row-reverse lg:items-start"
data-controller="tabs" data-controller="tabs"
@@ -256,23 +261,23 @@
data-daytrip-product-uid-value="{product.uid}" data-daytrip-product-uid-value="{product.uid}"
data-daytrip-rooms-uri-value="{ep:uri.ajax(action: 'daytripRooms', controller: 'AjaxTable', format: 'html', pageUid: settings.defaultAjaxUid)}" data-daytrip-rooms-uri-value="{ep:uri.ajax(action: 'daytripRooms', controller: 'AjaxTable', format: 'html', pageUid: settings.defaultAjaxUid)}"
data-action="datepicker:range-select->daytrip#load"> data-action="datepicker:range-select->daytrip#load">
<div class="headerbar" <div class="headerbar">
data-daytrip-target="headerLabel"></div> Buchungsoptionen {product.name}
<div class="grid grid-cols-2 gap-8"> </div>
<div class="col-span-2 md:col-span-1"> <div class="flex flex-col space-y-4 md:flex-row md:space-y-0 md:items-start">
<div class="date-select"> <div class="date-select">
<div class="date-select__picker"> <div class="date-select__picker">
<div class="daterange__panel" <div class="daterange__panel"
data-controller="datepicker" data-controller="datepicker"
data-datepicker-min-date-value="{f:format.date(date: 'now', format: 'Y-m-d')}" data-datepicker-inline-value="true"
data-datepicker-enabled-dates-value='{enabledDates -> f:format.json()}'> data-datepicker-min-date-value="{f:format.date(date: 'now', format: 'Y-m-d')}"
<input type="hidden" data-datepicker-enabled-dates-value='{enabledDates -> f:format.json()}'>
data-datepicker-target="field"> <input type="hidden"
</div> data-datepicker-target="field">
</div> </div>
</div> </div>
</div> </div>
<div class="col-span-2 md:col-span-1"> <div class="flex-1 md:pl-4">
<div data-daytrip-target="container"></div> <div data-daytrip-target="container"></div>
<div class="hidden flex items-center space-x-2" <div class="hidden flex items-center space-x-2"
data-daytrip-target="loadingIndicator"> data-daytrip-target="loadingIndicator">