feat: extra properties dynamiques, filtrage meta_status et alertes retard
This commit is contained in:
@@ -1,9 +1,14 @@
|
||||
{{ define "vehicle_booking_filters" }}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<div class="px-4 sm:px-6 md:px-8">
|
||||
<form>
|
||||
|
||||
<input type="hidden" name="tab" value="bookings" />
|
||||
{{if .ViewState.filters.v_type}}<input type="hidden" name="v_type" value="{{.ViewState.filters.v_type}}" />{{end}}
|
||||
{{if .ViewState.filters.v_status}}<input type="hidden" name="v_status" value="{{.ViewState.filters.v_status}}" />{{end}}
|
||||
|
||||
<div class="flex flex-row justify-end flex-wrap">
|
||||
|
||||
{{if not .ViewState.hide_date_filters}}
|
||||
<div class="m-4">
|
||||
<div>
|
||||
<label for="vehicles_date_start" class="block text-sm/6 font-medium text-gray-900 dark:text-white">Dates (début / fin)</label>
|
||||
@@ -13,16 +18,40 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
{{if .ViewState.vehicle_types}}
|
||||
<div class="m-4">
|
||||
<label for="vehicles_vehicle_type" class="block text-sm/6 font-medium text-gray-900 dark:text-white">Type de véhicule</label>
|
||||
<div class="mt-2 grid grid-cols-1">
|
||||
<select id="vehicles_vehicle_type" name="vehicle_type" class="col-start-1 row-start-1 w-full appearance-none rounded-md bg-white py-1.5 pr-8 pl-3 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-indigo-600 sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:*:bg-gray-800 dark:focus-visible:outline-co-blue" onchange="this.form.submit()">
|
||||
<option></option>
|
||||
{{range .ViewState.vehicle_types}}
|
||||
<option value="{{.}}"{{if eq $.ViewState.filters.vehicle_type .}} selected{{end}}>{{.}}</option>
|
||||
{{end}}
|
||||
</select>
|
||||
<svg viewBox="0 0 16 16" fill="currentColor" data-slot="icon" aria-hidden="true" class="pointer-events-none col-start-1 row-start-1 mr-2 size-5 self-center justify-self-end text-gray-500 sm:size-4 dark:text-gray-400">
|
||||
<path d="M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd" fill-rule="evenodd" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<div class="m-4">
|
||||
<label for="vehicles_status" class="block text-sm/6 font-medium text-gray-900 dark:text-white">Statut</label>
|
||||
<div class="mt-2 grid grid-cols-1">
|
||||
<select id="vehicles_status" name="status" class="col-start-1 row-start-1 w-full appearance-none rounded-md bg-white py-1.5 pr-8 pl-3 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-indigo-600 sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:*:bg-gray-800 dark:focus-visible:outline-co-blue" onchange="this.form.submit()">
|
||||
<option></option>
|
||||
<option value="">Tous</option>
|
||||
{{if eq .ViewState.status_management "manual"}}
|
||||
<optgroup label="Par catégorie">
|
||||
<option value="meta:open,active"{{if eq $.ViewState.filters.status "meta:open,active"}} selected{{end}}>Actifs ({{$first := true}}{{range $.ViewState.status_options}}{{$ms := index . "meta_status"}}{{if or (eq $ms "open") (eq $ms "active")}}{{if not $first}}, {{end}}{{$first = false}}{{index . "label"}}{{end}}{{end}})</option>
|
||||
<option value="meta:closed"{{if eq $.ViewState.filters.status "meta:closed"}} selected{{end}}>Clôturés ({{$first := true}}{{range $.ViewState.status_options}}{{$ms := index . "meta_status"}}{{if eq $ms "closed"}}{{if not $first}}, {{end}}{{$first = false}}{{index . "label"}}{{end}}{{end}})</option>
|
||||
</optgroup>
|
||||
<optgroup label="Par statut">
|
||||
{{range .ViewState.status_options}}
|
||||
<option value="{{index . "name"}}"{{if eq $.ViewState.filters.status (index . "name")}} selected{{end}}>{{index . "label"}}</option>
|
||||
<option value="{{index . "name"}}"{{if eq $.ViewState.filters.status (index . "name")}} selected{{end}}>{{index . "label"}}</option>
|
||||
{{end}}
|
||||
</optgroup>
|
||||
{{else}}
|
||||
<option value="FORTHCOMING"{{if eq .ViewState.filters.status "FORTHCOMING"}} selected{{end}}>A venir</option>
|
||||
<option value="ONGOING"{{if eq .ViewState.filters.status "ONGOING"}} selected{{end}}>En cours</option>
|
||||
@@ -36,10 +65,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="m-4">
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
@@ -1,120 +1,125 @@
|
||||
{{define "bookings_list"}}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<div class="mt-8 flex flex-col">
|
||||
<div class="-my-2 -mx-4 overflow-x-auto sm:-mx-6 lg:-mx-8">
|
||||
<div class="inline-block min-w-full py-2 align-middle md:px-6 lg:px-8">
|
||||
<div class="overflow-hidden shadow md:rounded-lg">
|
||||
<table class="min-w-full divide-y divide-gray-300">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th scope="col"
|
||||
class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6 text-center">
|
||||
Statut
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Type
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Numéro (Immat / Bicycode)
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Beneficiaire
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Dates
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Commentaire
|
||||
</th>
|
||||
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6">
|
||||
<span class="sr-only">Actions</span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
{{range .ViewState.bookings}}
|
||||
<tr>
|
||||
<td class="flex-col py-4 pl-4 pr-3 text-sm sm:pl-6 text-center">
|
||||
{{if .Data.administrator_unavailability}}
|
||||
<span class="p-1 bg-black text-white text-xs font-bold rounded-xl" >
|
||||
Retiré
|
||||
</span>
|
||||
{{else if and (eq $.ViewState.status_management "manual") (not .Deleted)}}
|
||||
{{$manualStatus := .ManualStatus}}
|
||||
{{range $.ViewState.status_options}}
|
||||
{{if eq (index . "name") $manualStatus}}
|
||||
{{if eq (index . "meta_status") "open"}}
|
||||
<span class="p-1 px-2 text-xs bg-co-blue text-white font-bold rounded-xl">{{index . "label"}}</span>
|
||||
{{else if eq (index . "meta_status") "active"}}
|
||||
<span class="p-1 px-2 text-xs bg-co-green text-white font-bold rounded-xl">{{index . "label"}}</span>
|
||||
{{else if eq (index . "meta_status") "closed"}}
|
||||
<span class="p-1 px-2 text-xs bg-co-red text-white font-bold rounded-xl">{{index . "label"}}</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{else if .Deleted}}
|
||||
<span class="p-1 bg-black text-white text-xs font-bold rounded-xl" >
|
||||
Annulé
|
||||
</span>
|
||||
{{else}}
|
||||
{{if eq .Status 1 }}
|
||||
<span class="p-1 bg-co-blue text-white text-xs font-bold rounded-xl" >
|
||||
A venir
|
||||
</span>
|
||||
{{end}}
|
||||
{{if eq .Status 0 }}
|
||||
<span class="p-1 bg-co-green text-white text-xs font-bold rounded-xl" >
|
||||
En cours
|
||||
</span>
|
||||
{{end}}
|
||||
{{if eq .Status -1 }}
|
||||
<span class="p-1 bg-co-red text-white text-xs font-bold rounded-xl" >
|
||||
Terminé
|
||||
</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{ (index $.ViewState.vehicles_map .Vehicleid).Type }}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{ (index $.ViewState.vehicles_map .Vehicleid).Data.licence_plate }}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
{{if .Data.administrator_unavailability}}
|
||||
<div class="text-gray-900" ></div>
|
||||
{{else}}
|
||||
<div class="text-gray-900" >
|
||||
<!--<img class="h-6 w-6 rounded-co" src="/app/beneficiaries/{{.Driver}}/picture" alt="">-->
|
||||
{{ (index $.ViewState.drivers_map .Driver).Data.first_name }}
|
||||
{{ (index $.ViewState.drivers_map .Driver).Data.last_name }}
|
||||
</div>
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
{{if .Data.administrator_unavailability}}
|
||||
<div class="text-gray-900" >Retiré du {{(timeFrom .Unavailablefrom).Format "02/01/2006"}} au {{(timeFrom .Unavailableto).Format "02/01/2006"}}</div>
|
||||
{{else}}
|
||||
<div class="text-gray-900" >
|
||||
<div>Du {{(timeFrom .Startdate).Format "02/01/2006 à 15:04"}}</div>
|
||||
<div>au {{(timeFrom .Enddate).Format "02/01/2006 à 15:04"}}</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{ .Data.comment }}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<a href="/app/vehicles-management/bookings/{{.ID}}"
|
||||
class="text-co-blue hover:text-co-blue">Voir</a>
|
||||
</td>
|
||||
</tr>
|
||||
<table class="min-w-full divide-y divide-gray-300 border-gray-300 border-t-1">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th scope="col"
|
||||
class="py-3.5 pl-4 pr-3 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Statut
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Type
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Numéro (Immat / Bicycode)
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Beneficiaire
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Dates
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
</th>
|
||||
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6">
|
||||
<span class="sr-only">Actions</span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
{{range .ViewState.bookings}}
|
||||
<tr>
|
||||
<td class="flex-col py-4 pl-4 pr-3 text-sm sm:pl-6 text-center">
|
||||
{{if .Data.administrator_unavailability}}
|
||||
<span class="p-1 bg-black text-white text-xs font-bold rounded-xl" >
|
||||
Retiré
|
||||
</span>
|
||||
{{else if and (eq $.ViewState.status_management "manual") (not .Deleted)}}
|
||||
{{$manualStatus := .ManualStatus}}
|
||||
{{range $.ViewState.status_options}}
|
||||
{{if eq (index . "name") $manualStatus}}
|
||||
{{if eq (index . "meta_status") "open"}}
|
||||
<span class="p-1 px-2 text-xs bg-co-blue text-white font-bold rounded-xl">{{index . "label"}}</span>
|
||||
{{else if eq (index . "meta_status") "active"}}
|
||||
<span class="p-1 px-2 text-xs bg-co-green text-white font-bold rounded-xl">{{index . "label"}}</span>
|
||||
{{else if eq (index . "meta_status") "closed"}}
|
||||
<span class="p-1 px-2 text-xs bg-co-red text-white font-bold rounded-xl">{{index . "label"}}</span>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{else if .Deleted}}
|
||||
<span class="p-1 bg-black text-white text-xs font-bold rounded-xl" >
|
||||
Annulé
|
||||
</span>
|
||||
{{else}}
|
||||
{{if eq .Status 1 }}
|
||||
<span class="p-1 bg-co-blue text-white text-xs font-bold rounded-xl" >
|
||||
A venir
|
||||
</span>
|
||||
{{end}}
|
||||
{{if eq .Status 0 }}
|
||||
<span class="p-1 bg-co-green text-white text-xs font-bold rounded-xl" >
|
||||
En cours
|
||||
</span>
|
||||
{{end}}
|
||||
{{if eq .Status -1 }}
|
||||
<span class="p-1 bg-co-red text-white text-xs font-bold rounded-xl" >
|
||||
Terminé
|
||||
</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{ (index $.ViewState.vehicles_map .Vehicleid).Type }}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{ (index $.ViewState.vehicles_map .Vehicleid).Data.licence_plate }}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
{{if .Data.administrator_unavailability}}
|
||||
<div class="text-gray-900" ></div>
|
||||
{{else}}
|
||||
<div class="text-gray-900" >
|
||||
{{ (index $.ViewState.drivers_map .Driver).Data.first_name }}
|
||||
{{ (index $.ViewState.drivers_map .Driver).Data.last_name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
{{if .Data.administrator_unavailability}}
|
||||
<div class="text-gray-900" >Retiré du {{(timeFrom .Unavailablefrom).Format "02/01/2006"}} au {{(timeFrom .Unavailableto).Format "02/01/2006"}}</div>
|
||||
{{else}}
|
||||
<div class="text-gray-900" >
|
||||
<div>Du {{(timeFrom .Startdate).Format "02/01/2006 à 15:04"}}</div>
|
||||
<div>au {{(timeFrom .Enddate).Format "02/01/2006 à 15:04"}}</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="py-4 pl-4 pr-3 text-sm sm:pl-6 text-center">
|
||||
{{if and (eq $.ViewState.status_management "manual") (not .Data.administrator_unavailability) (not .Deleted)}}
|
||||
{{$manualStatus := .ManualStatus}}
|
||||
{{$startdate := .Startdate}}
|
||||
{{$enddate := .Enddate}}
|
||||
{{range $.ViewState.status_options}}
|
||||
{{if eq (index . "name") $manualStatus}}
|
||||
{{if and (eq (index . "meta_status") "open") (isPast $startdate)}}
|
||||
<span class="text-red-600" title="Retard : la date de début de réservation est dépassée">
|
||||
{{$.IconSet.Icon "hero:outline/exclamation-triangle" "h-6 w-6 inline-block"}}
|
||||
</span>
|
||||
{{else if and (eq (index . "meta_status") "active") (isPast $enddate)}}
|
||||
<span class="text-red-600" title="Retard : la date de fin de réservation est dépassée">
|
||||
{{$.IconSet.Icon "hero:outline/exclamation-triangle" "h-6 w-6 inline-block"}}
|
||||
</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<a href="/app/vehicles-management/bookings/{{.ID}}"
|
||||
class="text-co-blue hover:text-co-blue">Voir</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{end}}
|
||||
|
||||
@@ -1,124 +1,95 @@
|
||||
{{define "vehicles_list"}}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<div class="mt-8 flex flex-col">
|
||||
<div class="-my-2 -mx-4 overflow-x-auto sm:-mx-6 lg:-mx-8">
|
||||
<div class="inline-block min-w-full py-2 align-middle md:px-6 lg:px-8">
|
||||
<div class="overflow-hidden shadow md:rounded-lg">
|
||||
<table class="min-w-full divide-y divide-gray-300">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th scope="col"
|
||||
class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Statut Réservation
|
||||
</th>
|
||||
<th scope="col"
|
||||
class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Numéro (Immat / Bicycode)
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Type
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Modèle
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Lieu
|
||||
</th>
|
||||
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6">
|
||||
<span class="sr-only">Actions</span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
{{range .ViewState.vehicles}}
|
||||
<tr>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6 text-center">
|
||||
<div class="flex flex-col px-6">
|
||||
{{if not .Bookings}}
|
||||
<span class="mt-1 p-1 bg-gray-500 text-white text-xs font-bold rounded-xl" >
|
||||
Disponible
|
||||
</span>
|
||||
{{else if len .Bookings | eq 1}}
|
||||
{{range .Bookings}}
|
||||
{{if .Data.administrator_unavailability}}
|
||||
<span class="mt-1 p-1 bg-black text-white text-xs font-bold rounded-xl" >
|
||||
Retiré
|
||||
</span>
|
||||
{{else if eq .Status -1 }}
|
||||
<span class="mt-1 p-1 bg-gray-500 text-white text-xs font-bold rounded-xl" >
|
||||
Disponible
|
||||
</span>
|
||||
{{else if eq .Status 1 }}
|
||||
<span class="mt-1 p-1 bg-co-blue text-white text-xs font-bold rounded-xl" >
|
||||
A venir
|
||||
</span>
|
||||
{{else if eq .Status 0 }}
|
||||
<span class="mt-1 p-1 bg-co-green text-white text-xs font-bold rounded-xl" >
|
||||
En cours
|
||||
</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{else if gt (len .Bookings) 1}}
|
||||
{{range .Bookings}}
|
||||
{{if .Data.administrator_unavailability}}
|
||||
<span class="mt-1 p-1 bg-black text-white text-xs font-bold rounded-xl" >
|
||||
Retiré
|
||||
</span>
|
||||
{{else}}
|
||||
{{if eq .Status 1 }}
|
||||
<span class="mt-1 p-1 bg-co-blue text-white text-xs font-bold rounded-xl" >
|
||||
A venir
|
||||
</span>
|
||||
{{else if eq .Status 0 }}
|
||||
<span class="mt-1 p-1 bg-co-green text-white text-xs font-bold rounded-xl" >
|
||||
En cours
|
||||
</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{$allAvailable := true}}
|
||||
{{range .Bookings}}
|
||||
{{if ne .Status -1}}
|
||||
{{ $allAvailable = false }}
|
||||
{{break}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{if $allAvailable}}
|
||||
<span class="mt-1 p-1 bg-gray-500 text-white text-xs font-bold rounded-xl" >
|
||||
Disponible
|
||||
</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{.Data.licence_plate}}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >
|
||||
{{.Type}}
|
||||
{{if eq .Type "Voiture"}}
|
||||
{{ if .Data.automatic}} (boite auto){{ end }}
|
||||
{{end}}
|
||||
</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{.Data.name}}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{if .Data.address}}{{.Data.address.properties.label}}{{end}}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<a href="/app/vehicles-management/fleet/{{.ID}}"
|
||||
class="text-co-blue hover:text-co-blue">Voir</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="min-w-full divide-y divide-gray-300 border-gray-300 border-t-1">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th scope="col"
|
||||
class="py-3.5 pl-4 pr-3 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Disponibilité
|
||||
</th>
|
||||
<th scope="col"
|
||||
class="py-3.5 pl-4 pr-3 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Numéro (Immat / Bicycode)
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Type
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Modèle
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-center text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Lieu
|
||||
</th>
|
||||
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6">
|
||||
<span class="sr-only">Actions</span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
{{range .ViewState.vehicles}}
|
||||
<tr>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6 text-center">
|
||||
<div class="flex flex-col px-6">
|
||||
{{if not .Bookings}}
|
||||
<span class="mt-1 p-1 bg-co-green text-white text-xs font-bold rounded-xl">
|
||||
Disponible
|
||||
</span>
|
||||
{{else}}
|
||||
{{$hasActive := false}}
|
||||
{{$hasUpcoming := false}}
|
||||
{{$hasRetired := false}}
|
||||
{{range .Bookings}}
|
||||
{{if .Data.administrator_unavailability}}
|
||||
{{$hasRetired = true}}
|
||||
{{else if eq .Status 0}}
|
||||
{{$hasActive = true}}
|
||||
{{else if eq .Status 1}}
|
||||
{{$hasUpcoming = true}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{if $hasRetired}}
|
||||
<span class="mt-1 p-1 bg-black text-white text-xs font-bold rounded-xl">
|
||||
Retiré
|
||||
</span>
|
||||
{{end}}
|
||||
{{if $hasActive}}
|
||||
<span class="mt-1 p-1 bg-co-red text-white text-xs font-bold rounded-xl">
|
||||
En prêt
|
||||
</span>
|
||||
{{else if $hasUpcoming}}
|
||||
<span class="mt-1 p-1 bg-co-blue text-white text-xs font-bold rounded-xl">
|
||||
Réservé
|
||||
</span>
|
||||
{{else if not $hasRetired}}
|
||||
<span class="mt-1 p-1 bg-co-green text-white text-xs font-bold rounded-xl">
|
||||
Disponible
|
||||
</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{.Data.licence_plate}}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >
|
||||
{{.Type}}
|
||||
{{if eq .Type "Voiture"}}
|
||||
{{ if .Data.automatic}} (boite auto){{ end }}
|
||||
{{end}}
|
||||
</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{.Data.name}}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="text-gray-900" >{{if .Data.address}}{{.Data.address.properties.label}}{{end}}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<a href="/app/vehicles-management/fleet/{{.ID}}"
|
||||
class="text-co-blue hover:text-co-blue">Voir</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{end}}
|
||||
|
||||
@@ -11,6 +11,28 @@
|
||||
changeVehicle: false,
|
||||
changeStatus: false,
|
||||
selectedvehicle: '',
|
||||
selectedStatus: '{{.ViewState.booking.ManualStatus}}',
|
||||
statusOptions: {{json .ViewState.status_options}},
|
||||
extraPropertiesDefs: {{json .ViewState.booking_extra_properties}},
|
||||
bookingExtraProperties: {{if .ViewState.booking.Data.extra_properties}}{{json .ViewState.booking.Data.extra_properties}}{{else}}{}{{end}},
|
||||
getRequestedProperties() {
|
||||
if (!this.statusOptions || !this.extraPropertiesDefs) return [];
|
||||
let current = this.statusOptions.find(s => s.name === this.selectedStatus);
|
||||
if (!current || !current.requested_properties) return [];
|
||||
return current.requested_properties.map(rp => {
|
||||
let ref = (typeof rp === 'string') ? { name: rp } : rp;
|
||||
let def = this.extraPropertiesDefs.find(d => d.name === ref.name);
|
||||
if (!def) return null;
|
||||
return { ...def, required: !!ref.required };
|
||||
}).filter(d => d);
|
||||
},
|
||||
getDefaultValue(prop) {
|
||||
if (prop.target === 'enddate') return '{{(timeFrom .ViewState.booking.Enddate).Format "2006-01-02T15:04"}}';
|
||||
if (prop.target === 'startdate') return '{{(timeFrom .ViewState.booking.Startdate).Format "2006-01-02T15:04"}}';
|
||||
if (prop.target === 'unavailableto') return '{{(timeFrom .ViewState.booking.Unavailableto).Format "2006-01-02"}}';
|
||||
if (prop.target === 'unavailablefrom') return '{{(timeFrom .ViewState.booking.Unavailablefrom).Format "2006-01-02"}}';
|
||||
return this.bookingExtraProperties[prop.name] || '';
|
||||
},
|
||||
submitSelectedvehicle(event) {
|
||||
if(this.selectedvehicle == '') {
|
||||
event.preventDefault()
|
||||
@@ -19,23 +41,24 @@
|
||||
}
|
||||
}">
|
||||
{{if and (ne .ViewState.booking.Status -1) (not .ViewState.booking.Deleted)}}
|
||||
{{if eq .ViewState.status_management "manual"}}
|
||||
<button type="button" @click="changeStatus = ! changeStatus"
|
||||
class="inline-flex items-center justify-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-2xl text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-co-blue">
|
||||
Changer le statut
|
||||
</button>
|
||||
{{end}}
|
||||
<button type="button" @click="changeVehicle = ! changeVehicle"
|
||||
class="inline-flex items-center justify-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-2xl text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-co-blue">
|
||||
Changer de véhicule
|
||||
</button>
|
||||
<a href="/app/vehicles-management/bookings/{{.ViewState.booking.ID}}/delete">
|
||||
{{if eq .ViewState.status_management "manual"}}
|
||||
<button type="button" @click="changeStatus = ! changeStatus"
|
||||
class="inline-flex items-center justify-center rounded-2xl border border-transparent bg-co-blue px-4 py-2 text-sm font-medium text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:w-auto">
|
||||
Changer de statut
|
||||
</button>
|
||||
{{else}}
|
||||
<a href="/app/vehicles-management/bookings/{{.ViewState.booking.ID}}/delete">
|
||||
<button type="button"
|
||||
class="inline-flex items-center justify-center rounded-2xl border border-transparent bg-co-red px-4 py-2 text-sm font-medium text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-co-red focus:ring-offset-2 sm:w-auto">
|
||||
Annuler
|
||||
</button>
|
||||
</a>
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
||||
<div class="relative z-10" aria-labelledby="modal-title" role="dialog" aria-modal="true" x-show="changeVehicle">
|
||||
<div class="fixed inset-0 bg-gray-900 bg-opacity-30 transition-opacity"></div>
|
||||
@@ -83,7 +106,8 @@
|
||||
</div>
|
||||
<form method="POST" action="/app/vehicles-management/bookings/{{.ViewState.booking.ID}}/status" class="mt-4 space-y-4">
|
||||
<div>
|
||||
<select name="new_status" class="block w-full rounded-2xl border-gray-300 py-2 pl-3 pr-10 text-sm focus:border-co-blue focus:outline-none focus:ring-co-blue">
|
||||
<label for="new_status" class="block text-sm font-medium text-gray-700 mb-1">Nouveau statut</label>
|
||||
<select id="new_status" name="new_status" x-model="selectedStatus" class="block w-full rounded-2xl border-gray-300 bg-gray-50 py-2 pl-3 pr-10 text-sm shadow-sm focus:border-co-blue focus:bg-white focus:outline-none focus:ring-co-blue">
|
||||
{{$currentStatus := .ViewState.booking.ManualStatus}}
|
||||
{{range .ViewState.status_options}}
|
||||
<option value="{{index . "name"}}" {{if eq (index . "name") $currentStatus}}selected{{end}}>{{index . "label"}}</option>
|
||||
@@ -91,9 +115,43 @@
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<textarea name="comment" rows="3" placeholder="Commentaire (optionnel)"
|
||||
class="block w-full rounded-2xl border-gray-300 text-sm focus:border-co-blue focus:outline-none focus:ring-co-blue"></textarea>
|
||||
<label for="status_comment" class="block text-sm font-medium text-gray-700 mb-1">Commentaire</label>
|
||||
<textarea id="status_comment" name="comment" rows="3" placeholder="Optionnel"
|
||||
class="block w-full rounded-2xl border-gray-300 bg-gray-50 text-sm shadow-sm focus:border-co-blue focus:bg-white focus:outline-none focus:ring-co-blue"></textarea>
|
||||
</div>
|
||||
<div x-show="getRequestedProperties().length > 0" class="border-t border-gray-200"></div>
|
||||
<template x-for="prop in getRequestedProperties()" :key="prop.name">
|
||||
<div>
|
||||
<label :for="'prop_' + prop.name" class="block text-sm font-medium text-gray-700 mb-1">
|
||||
<span x-text="prop.label"></span>
|
||||
<span x-show="prop.required" class="text-red-500"> *</span>
|
||||
</label>
|
||||
<template x-if="prop.type === 'text'">
|
||||
<input type="text" :id="'prop_' + prop.name" :name="'prop_' + prop.name" :value="getDefaultValue(prop)" :required="prop.required"
|
||||
class="block w-full rounded-2xl border-gray-300 bg-gray-50 py-2 pl-3 pr-3 text-sm shadow-sm focus:border-co-blue focus:bg-white focus:outline-none focus:ring-co-blue">
|
||||
</template>
|
||||
<template x-if="prop.type === 'number'">
|
||||
<input type="number" :id="'prop_' + prop.name" :name="'prop_' + prop.name" :value="getDefaultValue(prop)" :required="prop.required"
|
||||
class="block w-full rounded-2xl border-gray-300 bg-gray-50 py-2 pl-3 pr-3 text-sm shadow-sm focus:border-co-blue focus:bg-white focus:outline-none focus:ring-co-blue">
|
||||
</template>
|
||||
<template x-if="prop.type === 'date'">
|
||||
<input type="date" :id="'prop_' + prop.name" :name="'prop_' + prop.name" :value="getDefaultValue(prop)" :required="prop.required"
|
||||
class="block w-full rounded-2xl border-gray-300 bg-gray-50 py-2 pl-3 pr-3 text-sm shadow-sm focus:border-co-blue focus:bg-white focus:outline-none focus:ring-co-blue">
|
||||
</template>
|
||||
<template x-if="prop.type === 'datetime-local'">
|
||||
<input type="datetime-local" :id="'prop_' + prop.name" :name="'prop_' + prop.name" :value="getDefaultValue(prop)" :required="prop.required"
|
||||
class="block w-full rounded-2xl border-gray-300 bg-gray-50 py-2 pl-3 pr-3 text-sm shadow-sm focus:border-co-blue focus:bg-white focus:outline-none focus:ring-co-blue">
|
||||
</template>
|
||||
<template x-if="prop.type === 'select' && prop.options">
|
||||
<select :id="'prop_' + prop.name" :name="'prop_' + prop.name" :required="prop.required"
|
||||
class="block w-full rounded-2xl border-gray-300 bg-gray-50 py-2 pl-3 pr-10 text-sm shadow-sm focus:border-co-blue focus:bg-white focus:outline-none focus:ring-co-blue">
|
||||
<template x-for="opt in prop.options" :key="opt.value">
|
||||
<option :value="opt.value" :selected="opt.value === getDefaultValue(prop)" x-text="opt.label"></option>
|
||||
</template>
|
||||
</select>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
<div class="mt-5 sm:mt-6">
|
||||
<button type="submit" class="inline-flex w-full justify-center rounded-2xl border border-transparent bg-co-blue px-4 py-2 text-base font-medium text-white shadow-sm hover:bg-co-blue focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:text-sm">Valider</button>
|
||||
</div>
|
||||
@@ -175,6 +233,42 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{if .ViewState.booking_extra_properties}}
|
||||
<div class="bg-white shadow sm:rounded-2xl"
|
||||
x-data="{
|
||||
extraPropertiesDefs: {{json .ViewState.booking_extra_properties}},
|
||||
storedProps: {{if .ViewState.booking.Data.extra_properties}}{{json .ViewState.booking.Data.extra_properties}}{{else}}{}{{end}},
|
||||
computedProps: {{if .ViewState.computed_extra_properties}}{{json .ViewState.computed_extra_properties}}{{else}}{}{{end}},
|
||||
displayProps() {
|
||||
return this.extraPropertiesDefs.filter(prop => !prop.target);
|
||||
},
|
||||
getValue(prop) {
|
||||
if (prop.type === 'computed') return this.computedProps[prop.name] || '';
|
||||
let v = this.storedProps[prop.name];
|
||||
if (prop.type === 'date' && v) {
|
||||
let d = new Date(v);
|
||||
if (!isNaN(d)) return d.toLocaleDateString('fr-FR');
|
||||
}
|
||||
return v || '';
|
||||
},
|
||||
hasAnyValue() {
|
||||
return this.displayProps().some(prop => this.getValue(prop) !== '');
|
||||
}
|
||||
}"
|
||||
x-show="hasAnyValue()">
|
||||
<h2 class="text-lg font-medium text-gray-900 p-4 sm:px-6">Informations complémentaires</h2>
|
||||
<div class="border-t border-gray-200 px-4 py-5 sm:px-6">
|
||||
<dl class="sm:divide-y sm:divide-gray-200">
|
||||
<template x-for="prop in displayProps()" :key="prop.name">
|
||||
<div x-show="getValue(prop) !== ''" class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4">
|
||||
<dt class="text-sm font-medium text-gray-500" x-text="prop.label"></dt>
|
||||
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2" x-text="getValue(prop)"></dd>
|
||||
</div>
|
||||
</template>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="lg:col-start-2 lg:col-span-2">
|
||||
<div class="bg-white shadow sm:rounded-2xl sm:px-6">
|
||||
@@ -199,6 +293,23 @@
|
||||
{{template "booking_status_badge" .}}
|
||||
</h3>
|
||||
<p class="mt-1 text-sm text-gray-500">Informations utiles sur la réservation.</p>
|
||||
{{if eq .ViewState.status_management "manual"}}
|
||||
{{range .ViewState.status_options}}
|
||||
{{if eq (index . "name") $.ViewState.booking.ManualStatus}}
|
||||
{{if and (eq (index . "meta_status") "open") (isPast $.ViewState.booking.Startdate)}}
|
||||
<div class="mt-3 flex items-center gap-2 rounded-lg bg-red-50 px-3 py-2 text-red-700 border border-red-200">
|
||||
{{$.IconSet.Icon "hero:outline/exclamation-triangle" "h-6 w-6 flex-shrink-0"}}
|
||||
<span class="text-sm font-medium">Retard : la date de début de réservation est dépassée</span>
|
||||
</div>
|
||||
{{else if and (eq (index . "meta_status") "active") (isPast $.ViewState.booking.Enddate)}}
|
||||
<div class="mt-3 flex items-center gap-2 rounded-lg bg-red-50 px-3 py-2 text-red-700 border border-red-200">
|
||||
{{$.IconSet.Icon "hero:outline/exclamation-triangle" "h-6 w-6 flex-shrink-0"}}
|
||||
<span class="text-sm font-medium">Retard : la date de fin de réservation est dépassée</span>
|
||||
</div>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="ml-4 mt-4 flex-shrink-0">
|
||||
|
||||
@@ -18,10 +18,11 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-white shadow sm:rounded-lg sm:overflow-hidden my-4">
|
||||
{{template "vehicle_booking_filters" .}}
|
||||
{{template "bookings_list" .}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{template "vehicle_booking_filters" .}}
|
||||
|
||||
{{template "bookings_list" .}}
|
||||
|
||||
{{end}}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
informations: '{{ .ViewState.vehicle.Data.informations}}',
|
||||
},
|
||||
rules: {
|
||||
licence_plate: ['required', 'regexMatch:^[A-Z]{1,2}-[0-9]{1,3}-[A-Z]{1,2}$'],
|
||||
licence_plate: ['required'],
|
||||
name: ['required'],
|
||||
},
|
||||
formValidation: {
|
||||
|
||||
@@ -1,45 +1,74 @@
|
||||
{{define "content"}}
|
||||
{{$defaultTab := "bookings"}}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">Gestion des véhicules et réservations</h1>
|
||||
|
||||
<div class="bg-white shadow sm:rounded-lg sm:overflow-hidden my-4" x-data="{
|
||||
tab: '{{or .ViewState.tab $defaultTab}}',
|
||||
to(event) {
|
||||
this.tab = event.target.value
|
||||
}
|
||||
}">
|
||||
<div class="divide-y divide-gray-200">
|
||||
<div>
|
||||
<div class="hidden sm:block">
|
||||
<div class="border-b border-gray-200 pl-4 flex justify-between items-center">
|
||||
<nav class="-mb-px flex space-x-8" aria-label="Tabs">
|
||||
<a href="#" @click="tab = 'bookings'"
|
||||
class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm"
|
||||
:class="tab == 'bookings' ? 'border-co-blue text-co-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'">
|
||||
Réservations </a>
|
||||
|
||||
<a href="#" @click="tab = 'vehicles'"
|
||||
class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm"
|
||||
:class="tab == 'vehicles' ? 'border-co-blue text-co-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'">
|
||||
Véhicules </a>
|
||||
</nav>
|
||||
|
||||
<div class="pr-4 flex space-x-2">
|
||||
<div x-show="tab == 'bookings'" class="flex space-x-2">
|
||||
<a href="/exports/fleets/bookings/group_bookings.xlsx?status={{.ViewState.filters.status}}&date_start={{.ViewState.filters.date_start}}&date_end={{.ViewState.filters.date_end}}&vehicle_type={{.ViewState.filters.vehicle_type}}">
|
||||
<button type="button"
|
||||
class="inline-flex items-center justify-center bg-white hover:bg-gray-50 border-gray-300 border px-4 py-2 text-gray-700 text-sm rounded-2xl focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">
|
||||
{{$.IconSet.Icon "hero:outline/document-arrow-down" "h-5 w-5 mr-3"}}
|
||||
Export
|
||||
</button>
|
||||
</a>
|
||||
<a href="/app/vehicles-management/bookings/">
|
||||
<button type="button"
|
||||
class="inline-flex items-center justify-center rounded-2xl border border-transparent bg-co-blue px-4 py-2 text-sm font-medium text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:w-auto">
|
||||
{{$.IconSet.Icon "hero:outline/table-cells" "h-5 w-5 mr-3"}}
|
||||
Historique
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
<div x-show="tab == 'vehicles'">
|
||||
<a href="/app/vehicles-management/fleet/add">
|
||||
<button type="button"
|
||||
class="inline-flex items-center justify-center rounded-2xl border border-transparent bg-co-blue px-4 py-2 text-sm font-medium text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:w-auto">
|
||||
{{$.IconSet.Icon "hero:outline/plus-circle" "h-5 w-5 mr-3"}}
|
||||
Ajouter un véhicule
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div x-show="tab == 'bookings'">
|
||||
{{template "vehicle_booking_filters" .}}
|
||||
{{template "bookings_list" .}}
|
||||
</div>
|
||||
|
||||
<div x-show="tab == 'vehicles'">
|
||||
{{template "vehicle_filters" .}}
|
||||
{{template "vehicles_list" .}}
|
||||
</div>
|
||||
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="sm:flex-auto">
|
||||
<h2 class="text-xl font-semibold text-gray-600 pt-8">Réservations en cours et à venir</h2>
|
||||
</div>
|
||||
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
|
||||
<a href="/app/vehicles-management/bookings/">
|
||||
<button type="button"
|
||||
class="inline-flex items-center justify-center rounded-2xl border border-transparent bg-co-blue px-4 py-2 text-sm font-medium text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:w-auto">
|
||||
{{$.IconSet.Icon "hero:outline/table-cells" "h-5 w-5 mr-3"}}
|
||||
Historique
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{{template "bookings_list" .}}
|
||||
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8 mt-8">
|
||||
|
||||
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="sm:flex-auto">
|
||||
<h2 class="text-xl font-semibold text-gray-600 pt-8">Véhicules</h2>
|
||||
</div>
|
||||
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
|
||||
<a href="/app/vehicles-management/fleet/add">
|
||||
<button type="button"
|
||||
class="inline-flex items-center justify-center rounded-2xl border border-transparent bg-co-blue px-4 py-2 text-sm font-medium text-white shadow-sm focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:w-auto">
|
||||
{{$.IconSet.Icon "hero:outline/plus-circle" "h-5 w-5 mr-3"}}
|
||||
Ajouter un véhicule
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{template "vehicles_list" .}}
|
||||
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
||||
Reference in New Issue
Block a user