Compare commits
17 Commits
modifyAnEv
...
addStatist
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a36827a6ff | ||
|
|
511baa6a8e | ||
|
|
031ef7b924 | ||
|
|
fc60854e21 | ||
|
|
afc403bded | ||
|
|
e0fd3aa510 | ||
|
|
33c182574c | ||
|
|
274f6c1616 | ||
|
|
675974a9e7 | ||
|
|
612f74202d | ||
|
|
6ccb72e566 | ||
|
|
ea4eea03da | ||
|
|
5ffb2bcf85 | ||
|
|
18f126e4eb | ||
|
|
1c29f00720 | ||
|
|
70186d1357 | ||
|
|
9ba3480507 |
21
config.yaml
21
config.yaml
@@ -40,6 +40,9 @@ views:
|
||||
update:
|
||||
files:
|
||||
- web/layouts/members/update.html
|
||||
list:
|
||||
files:
|
||||
- web/layouts/members/membersList.html
|
||||
vehicles:
|
||||
search:
|
||||
files:
|
||||
@@ -92,14 +95,6 @@ views:
|
||||
files:
|
||||
- web/layouts/_partials/address_autocomplete.html
|
||||
- web/layouts/agenda/create-event.html
|
||||
update:
|
||||
files:
|
||||
- web/layouts/agenda/_partials/address.html
|
||||
- web/layouts/_partials/address_autocomplete.html
|
||||
- web/layouts/agenda/updateEvent.html
|
||||
delete:
|
||||
files:
|
||||
- web/layouts/agenda/delete-event.html
|
||||
directory:
|
||||
home:
|
||||
files:
|
||||
@@ -153,7 +148,15 @@ views:
|
||||
- web/layouts/administration/_partials/groups_admins.html
|
||||
- web/layouts/administration/_partials/group_members.html
|
||||
- web/layouts/administration/display_group.html
|
||||
group:
|
||||
beneficaires_list:
|
||||
files:
|
||||
- web/layouts/administration/beneficaires_stats.html
|
||||
events_list:
|
||||
files:
|
||||
- web/layouts/administration/events_stats.html
|
||||
vehicles_list:
|
||||
files:
|
||||
- web/layouts/administration/vehicles_stats.html
|
||||
settings:
|
||||
files:
|
||||
- web/layouts/administration/_partials/groups_admins.html
|
||||
|
||||
156
web/layouts/administration/beneficaires_stats.html
Normal file
156
web/layouts/administration/beneficaires_stats.html
Normal file
@@ -0,0 +1,156 @@
|
||||
{{define "content"}}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="sm:flex-auto">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">La liste des bénéficaires</h1>
|
||||
</div>
|
||||
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
|
||||
<a href="/app/administration/">
|
||||
<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">
|
||||
Retour
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8" x-data="{
|
||||
state: {{.ViewState.JSONWithLimits 0 10}},
|
||||
current: 0,
|
||||
nb_pages() {
|
||||
let nbEl = this.state.count
|
||||
return Math.ceil(nbEl/10)
|
||||
},
|
||||
async paginate(page) {
|
||||
let start = (page-1)*10
|
||||
if(start < 0|| start > this.state.count) {
|
||||
return
|
||||
}
|
||||
let resp = await fetch('/api/cache/' + this.state.cache_id + '?limits.min=' + start + '&limits.max=' + (start+10))
|
||||
let data = await resp.json()
|
||||
this.state.beneficiaries = data
|
||||
this.current=page-1
|
||||
}
|
||||
}">
|
||||
<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 ring-1 ring-black ring-opacity-5 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">
|
||||
Nom
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
|
||||
Téléphone
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
|
||||
Adresse
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
|
||||
Labels
|
||||
</th>
|
||||
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6">
|
||||
<span class="sr-only">Modifier</span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
<template x-for="beneficiary in state.beneficiaries">
|
||||
<tr>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="flex items-center">
|
||||
<div class="h-10 w-10 flex-shrink-0">
|
||||
<img class="h-10 w-10 rounded-co"
|
||||
:src="'/app/beneficiaries/' + beneficiary.id + '/picture'" alt="">
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<div class="font-medium text-gray-900"><span
|
||||
x-text="beneficiary.data.first_name"></span> <span
|
||||
x-text="beneficiary.data.last_name"></span></div>
|
||||
<div class="text-gray-500" x-text="beneficiary.data.email"></div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||||
<div class="text-gray-900" x-text="beneficiary.data.phone_number"></div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500"
|
||||
x-text="beneficiary.data.address ? beneficiary.data.address.properties.label : ''">
|
||||
</td>
|
||||
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||||
<template x-for="tag in beneficiary.data.tags">
|
||||
<span
|
||||
class="inline-flex rounded-full bg-green-100 px-2 text-xs font-semibold leading-5 text-green-800"
|
||||
x-text="tag"></span>
|
||||
</template>
|
||||
</td>
|
||||
<td
|
||||
class="relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6">
|
||||
<a :href="'/app/beneficiaries/' + beneficiary.id"
|
||||
class="text-co-blue hover:text-co-blue">Voir<span class="sr-only">, <span
|
||||
x-text="beneficiary.data.first_name"></span> <span
|
||||
x-text="beneficiary.data.last_name"></span></a>
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
|
||||
<!-- More people... -->
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="bg-white px-4 py-3 flex items-center justify-between border-t border-gray-200 sm:px-6">
|
||||
<div class="flex-1 flex justify-between sm:hidden">
|
||||
<a href="#" class="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"
|
||||
@click="paginate(current)"> Previous </a>
|
||||
<a href="#" class="ml-3 relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"
|
||||
@click="paginate(current+2)"> Next </a>
|
||||
</div>
|
||||
<div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
|
||||
<div>
|
||||
<p class="text-sm text-gray-700">
|
||||
Résultats
|
||||
<span class="font-medium" x-text="Math.min((current * 10)+1, state.count)"></span>
|
||||
à
|
||||
<span class="font-medium" x-text="Math.min((current * 10)+10, state.count)"></span>
|
||||
sur
|
||||
<span class="font-medium" x-text="state.count"></span>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<nav class="relative z-0 inline-flex rounded-md shadow-sm -space-x-px" aria-label="Pagination">
|
||||
<a href="#" class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50"
|
||||
@click="paginate(current)">
|
||||
<span class="sr-only">Previous</span>
|
||||
<!-- Heroicon name: solid/chevron-left -->
|
||||
<svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</a>
|
||||
<template x-for="i in nb_pages">
|
||||
<a href="#" @click="paginate(i)"
|
||||
class="relative inline-flex items-center px-4 py-2 border text-sm font-medium"
|
||||
:class="i == current+1 ? 'z-10 bg-indigo-50 border-co-blue text-co-blue' : 'bg-white border-gray-300 text-gray-500 hover:bg-gray-50'"
|
||||
x-text="i"></a>
|
||||
</template>
|
||||
<!-- Current: "z-10 bg-indigo-50 border-indigo-500 text-indigo-600", Default: "bg-white border-gray-300 text-gray-500 hover:bg-gray-50" -->
|
||||
<a href="#" class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50"
|
||||
@click="paginate(current+2)">
|
||||
<span class="sr-only">Next</span>
|
||||
<!-- Heroicon name: solid/chevron-right -->
|
||||
<svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</a>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
105
web/layouts/administration/events_stats.html
Normal file
105
web/layouts/administration/events_stats.html
Normal file
@@ -0,0 +1,105 @@
|
||||
{{define "content"}}
|
||||
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="sm:flex-auto">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">La liste des événements</h1>
|
||||
</div>
|
||||
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
|
||||
<a href="/app/administration/">
|
||||
<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">
|
||||
Retour
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<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 ring-1 ring-black ring-opacity-5 md:rounded-lg">
|
||||
<table class="min-w-full divide-y divide-gray-300">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Dispositif
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Structure
|
||||
</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="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">
|
||||
Places disponibles
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Bénéficiaires positionnés
|
||||
</th>
|
||||
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6">
|
||||
<span class="sr-only">Actions</span>
|
||||
</th>
|
||||
</tr>
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
{{range .ViewState.events}}
|
||||
<a href="/app/agenda/{{.ID}}">
|
||||
<tr>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
|
||||
<div class="font-medium text-gray-900">{{.Name}}</div>
|
||||
<div class="text-gray-500">{{.Type}}</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
|
||||
<div class="text-gray-900" >
|
||||
{{range .Owners}}
|
||||
{{if (index $.ViewState.groups .)}}
|
||||
{{(index $.ViewState.groups .).Data.name}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</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">
|
||||
<div class="text-gray-900" >
|
||||
{{if eq .Startdate .Enddate}}
|
||||
Le {{(timeFrom .Startdate).Format "02/01/2006"}}
|
||||
{{else}}
|
||||
Du {{(timeFrom .Startdate).Format "02/01/2006"}} <br />Au {{(timeFrom .Enddate).Format "02/01/2006"}}
|
||||
{{end}}
|
||||
</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
{{if ne .RemainingSubscriptions 999}}
|
||||
<div class="text-gray-900" >{{.RemainingSubscriptions}}</div>
|
||||
{{end}}
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="flex -space-x-1 overflow-hidden" >
|
||||
{{range .Subscriptions}}
|
||||
<img class="inline-block h-6 w-6 rounded-co ring-2 ring-white" src="/app/beneficiaries/{{.Subscriber}}/picture" >
|
||||
{{end}}
|
||||
</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<a href="/app/agenda/{{.ID}}" class="text-co-blue hover:text-co-blue">Voir</a>
|
||||
</td>
|
||||
</tr>
|
||||
</a>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -14,7 +14,7 @@
|
||||
<div
|
||||
class="flex-1 flex items-center justify-between border-t border-r border-b border-gray-200 bg-white rounded-r-3xl truncate">
|
||||
<div class="flex-1 px-4 py-2 text-sm truncate">
|
||||
<a href="#" class="text-gray-900 font-medium hover:text-gray-600">Bénéficiaires</a>
|
||||
<a href="/app/administration/stats/beneficaires" class="text-gray-900 font-medium hover:text-gray-600">Bénéficiaires</a>
|
||||
<p class="text-gray-500">{{len .ViewState.beneficiaries }} bénéficiaires</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -23,13 +23,13 @@
|
||||
<li class="col-span-1 flex shadow-sm rounded-3xl">
|
||||
<div
|
||||
class="flex-shrink-0 flex items-center justify-center w-16 bg-co-green text-white text-sm font-medium rounded-l-3xl">
|
||||
{{.IconSet.Icon "hero:outline/office-building" "h-6 w-6"}}
|
||||
{{.IconSet.Icon "hero:outline/calendar" "h-6 w-6"}}
|
||||
</div>
|
||||
<div
|
||||
class="flex-1 flex items-center justify-between border-t border-r border-b border-gray-200 bg-white rounded-r-3xl truncate">
|
||||
<div class="flex-1 px-4 py-2 text-sm truncate">
|
||||
<a href="#" class="text-gray-900 font-medium hover:text-gray-600">Organisations</a>
|
||||
<p class="text-gray-500">{{len .ViewState.groups}} organisations</p>
|
||||
<a href="/app/administration/stats/events" class="text-gray-900 font-medium hover:text-gray-600">Évenements</a>
|
||||
<p class="text-gray-500">{{len .ViewState.events}} évenements</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@@ -42,7 +42,7 @@
|
||||
<div
|
||||
class="flex-1 flex items-center justify-between border-t border-r border-b border-gray-200 bg-white rounded-r-3xl truncate">
|
||||
<div class="flex-1 px-4 py-2 text-sm truncate">
|
||||
<a href="#" class="text-gray-900 font-medium hover:text-gray-600">Référents</a>
|
||||
<a href="/app/members/" class="text-gray-900 font-medium hover:text-gray-600">Référents</a>
|
||||
<p class="text-gray-500">{{len .ViewState.accounts}} membres</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -65,8 +65,11 @@
|
||||
</div>
|
||||
|
||||
<div class="max-w-7xl mt-10 mx-auto px-4 sm:px-6 md:px-8">
|
||||
<h2 class="text-xl font-semibold text-gray-500">Gestion des organisations</h2>
|
||||
|
||||
<!-- <h2 class="text-xl font-semibold text-gray-500">Gestion des organisations</h2> -->
|
||||
<div class="flex-1 px-4 py-2 text-sm truncate">
|
||||
<h2 class="text-xl font-semibold text-gray-500">Gestion des organisations</h2>
|
||||
<p class="text-gray-500">( {{len .ViewState.groups}} organisations )</p>
|
||||
</div>
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="sm:flex-auto">
|
||||
<p class="mt-2 text-sm text-gray-700"></p>
|
||||
|
||||
151
web/layouts/administration/vehicles_stats.html
Normal file
151
web/layouts/administration/vehicles_stats.html
Normal file
@@ -0,0 +1,151 @@
|
||||
{{define "content"}}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="sm:flex-auto">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">La liste des voitures</h1>
|
||||
</div>
|
||||
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
|
||||
<a href="/app/administration/">
|
||||
<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">
|
||||
Retour
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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 ring-1 ring-black ring-opacity-5 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="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
|
||||
Organisation
|
||||
</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" >{{(index $.ViewState.admingroups (index .Administrators 0)).Data.name}}</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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{{end}}
|
||||
@@ -1,67 +0,0 @@
|
||||
{{ define "address" }}
|
||||
|
||||
|
||||
<div class="col-span-6 relative" x-data="{
|
||||
input: {{if .Adress}}'{{.Address.Properties.label}}'{{else}}`{{ .Default.properties.label}}`{{end}},
|
||||
def: `{{ .Default}}`,
|
||||
address: {{if .Address}}JSON.stringify({{printf "%s" .Address.MarshalJSON}}){{else}}null{{end}},
|
||||
addressObject: {{if .Address}}{{printf "%s" .Address.MarshalJSON}}{{else}}null{{end}},
|
||||
responselength: 0,
|
||||
async autocomplete() {
|
||||
if(this.input == null || this.input == '') {
|
||||
this.responselength = 0
|
||||
return []
|
||||
}
|
||||
if(this.addressObject != null && this.input == this.addressObject.properties.label) {
|
||||
this.responselength = 0
|
||||
|
||||
return []
|
||||
}
|
||||
|
||||
if(this.input == `{{ .Default.properties.label}}`) {
|
||||
this.responselength = 0
|
||||
this.address = this.def
|
||||
this.input = `{{ .Default.properties.label}}`
|
||||
result = await fetch('https://geocode.ridygo.fr/v1/autocomplete/\?text=' + this.input)
|
||||
json = await result.json()
|
||||
|
||||
bb = json['features'][0]
|
||||
console.log(bb)
|
||||
this.address = JSON.stringify(bb)
|
||||
this.addressObject = bb
|
||||
this.input = bb.properties.label
|
||||
return [bb]
|
||||
}
|
||||
|
||||
result = await fetch('https://geocode.ridygo.fr/v1/autocomplete/\?text=' + this.input)
|
||||
json = await result.json()
|
||||
|
||||
this.responselength = json['features'].length
|
||||
return json['features']
|
||||
},
|
||||
select(a) {
|
||||
this.address = JSON.stringify(a)
|
||||
this.addressObject = a
|
||||
this.input = a.properties.label
|
||||
|
||||
}
|
||||
}">
|
||||
<input type="hidden" name="{{ .FieldName }}" x-model="address" >
|
||||
<label for="address" class="block text-sm font-medium text-gray-700">{{ if .FieldLabel }}{{.FieldLabel}}{{else}}Adresse{{end}}</label>
|
||||
<input type="text"
|
||||
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm border-gray-300 rounded-2xl"
|
||||
x-model="input">
|
||||
|
||||
<ul x-show="responselength > 0"
|
||||
class="absolute z-10 mt-1 w-full bg-white shadow-lg max-h-60 rounded-xl py-1 text-base ring-1 ring-black ring-opacity-5 overflow-auto focus:outline-none sm:text-sm" tabindex="-1" role="listbox" aria-labelledby="listbox-label" aria-activedescendant="listbox-option-3">
|
||||
<template x-for="item in autocomplete">
|
||||
<a href="#">
|
||||
<li class="text-gray-900 hover:bg-gray-200 cursor-default select-none relative py-2 pl-3 pr-9"
|
||||
@click="select(item)">
|
||||
<span class="font-normal block truncate" x-text="item.properties.label" ></span>
|
||||
</li>
|
||||
</a>
|
||||
</template>
|
||||
</ul>
|
||||
</div>
|
||||
{{ end }}
|
||||
@@ -17,10 +17,8 @@
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{{$groupId := .ViewState.event.ID}}
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
{{range .ViewState.event.Subscriptions}}
|
||||
|
||||
<tr>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6 text-center">
|
||||
<a href="/app/beneficiaries/{{.Subscriber}}" class="flex">
|
||||
@@ -28,13 +26,16 @@
|
||||
</a>
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<!-- add the member page and not the beneficiare page -->
|
||||
<a href="/app/members/{{.Data.subscribed_by.user.id}}" class="flex"><img class="h-6 w-6 rounded-co mr-2" src="/app/beneficiaries/{{.Data.subscribed_by.user.id}}/picture" alt=" "> {{.Data.subscribed_by.user.display_name}}</a>
|
||||
<div class="flex"><img class="h-6 w-6 rounded-co mr-2" src="/app/beneficiaries/{{.Data.subscribed_by.user.id}}/picture" alt=" "> {{.Data.subscribed_by.user.display_name}}</div>
|
||||
{{.Data.subscribed_by.group.name}}
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
{{(timeFormat .CreatedAt "02/01/2006")}}
|
||||
</td>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<!-- <a href=""
|
||||
class="text-co-blue hover:text-co-blue">Voir</a> -->
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
{{define "content"}}
|
||||
{{ if eq (index .ViewState.event.Owners 0) .Group.ID }}
|
||||
|
||||
<div>
|
||||
<form method="POST">
|
||||
|
||||
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
|
||||
|
||||
<div class="fixed inset-0 z-10 overflow-y-auto">
|
||||
<div class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
|
||||
|
||||
<div class="relative transform overflow-hidden rounded-lg bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all sm:my-8 sm:w-full max-w-lg sm:p-6">
|
||||
<div>
|
||||
<div class="mx-auto flex h-12 w-12 items-center justify-center rounded-co bg-co-blue text-white">
|
||||
{{.IconSet.Icon "hero:outline/information-circle" "h-6 w-6"}}
|
||||
</div>
|
||||
<div class="mt-3 text-center sm:mt-5">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-900" id="modal-title">Confirmation de retrait</h3>
|
||||
<div class="mt-2">
|
||||
<p class="text-sm text-gray-500">Vous etes sur de retirer cet événement</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5 sm:mt-6 sm:grid sm:grid-flow-row-dense sm:grid-cols-2">
|
||||
<a href="/app/agenda/{{.ViewState.event.ID}}" class="mt-3 inline-flex w-full justify-center rounded-l-2xl border border-gray-300 bg-white px-4 py-2 text-base font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:col-start-1 sm:mt-0 sm:text-sm">Annuler</a>
|
||||
<button type="submit" class="inline-flex w-full justify-center rounded-r-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:col-start-2 sm:text-sm">Confirmation</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
|
||||
|
||||
<div class="fixed inset-0 z-10 overflow-y-auto">
|
||||
<div class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
|
||||
|
||||
<div class="relative transform overflow-hidden rounded-lg bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all sm:my-8 sm:w-full max-w-lg sm:p-6">
|
||||
<div>
|
||||
<div class="mx-auto flex h-12 w-12 items-center justify-center rounded-co bg-co-blue text-white">
|
||||
{{.IconSet.Icon "hero:outline/information-circle" "h-6 w-6"}}
|
||||
</div>
|
||||
<div class="mt-3 text-center sm:mt-5">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-900" id="modal-title">Vous n'avez pas le droit de supprimer cet événement</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center items-center mt-5 sm:mt-6 sm:grid sm:grid-flow-row-dense ">
|
||||
<!-- class="flex justify-center items-center py-2 px-3 border-t dark:border-gray-600 -->
|
||||
<a href="/app/agenda/{{.ViewState.event.ID}}" class="rounded-2xl mt-3 inline-flex w-full justify-center rounded-l-2xl border border-gray-300 bg-white px-4 py-2 text-base font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:col-start-1 sm:mt-0 sm:text-sm">Annuler</a>
|
||||
<!-- <button type="submit" class="inline-flex w-full justify-center rounded-r-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:col-start-2 sm:text-sm">Confirmation</button> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -12,26 +12,7 @@
|
||||
{{end}}
|
||||
</p>
|
||||
</div>
|
||||
{{$gr := .Group.ID}}
|
||||
{{$event := .ViewState.event.ID}}
|
||||
</div>
|
||||
{{range .ViewState.event.Owners}}
|
||||
{{$id := .}}
|
||||
{{if eq $gr $id}}
|
||||
<div
|
||||
class="mt-6 flex flex-col-reverse justify-stretch space-y-4 space-y-reverse sm:flex-row-reverse sm:justify-end sm:space-x-reverse sm:space-y-0 sm:space-x-3 md:mt-0 md:flex-row md:space-x-3">
|
||||
|
||||
<a href="/app/agenda/{{$event}}/update" class="inline-flex"><button type="button"
|
||||
class="w-full px-4 py-2 border border-transparent text-sm font-medium rounded-2xl shadow-sm text-white bg-co-blue hover:bg-co-blue focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-co-blue">Modifier</button></a>
|
||||
|
||||
|
||||
<a href="/app/agenda/{{$event}}/delete" class="inline-flex"><button type="button"
|
||||
class="w-full px-4 py-2 border border-transparent text-sm font-medium rounded-2xl shadow-sm text-white bg-co-red hover:bg-co-red focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-co-blue">Retirer</button></a>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
||||
</div>
|
||||
|
||||
<div class="mt-8 max-w-3xl mx-auto grid grid-cols-1 gap-6 sm:px-6 lg:max-w-7xl lg:grid-flow-col-dense lg:grid-cols-3">
|
||||
|
||||
@@ -50,7 +50,6 @@
|
||||
</tr>
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
{{range .ViewState.events}}
|
||||
{{if eq .Deleted false}}
|
||||
<a href="/app/agenda/{{.ID}}">
|
||||
<tr>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
@@ -100,7 +99,6 @@
|
||||
</tr>
|
||||
</a>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</tbody>
|
||||
</thead>
|
||||
</table>
|
||||
|
||||
@@ -1,255 +0,0 @@
|
||||
{{ define "content" }}
|
||||
{{ if eq (index .ViewState.event.Owners 0) .Group.ID }}
|
||||
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">Modifier votre agenda</h1>
|
||||
</div>
|
||||
{{$sdate := (timeFrom .ViewState.event.Startdate).Format ("2006-01-02")}}
|
||||
{{$edate := (timeFrom .ViewState.event.Enddate).Format ("2006-01-02")}}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8 mt-8"
|
||||
x-data="{
|
||||
fields: {
|
||||
name: '{{.ViewState.event.Name}}',
|
||||
type:'{{.ViewState.event.Type}}',
|
||||
description: '{{.ViewState.event.Description}}',
|
||||
allday: {{.ViewState.event.Allday}},
|
||||
startdate:'{{$sdate}}',
|
||||
enddate: '{{$edate}}',
|
||||
starttime: '{{.ViewState.event.Starttime}}',
|
||||
endtime: '{{.ViewState.event.Endtime}}',
|
||||
max_subscribers: '{{.ViewState.event.MaxSubscribers}}',
|
||||
},
|
||||
rules: {
|
||||
name: ['required'],
|
||||
type: ['required'],
|
||||
startdate: ['required'],
|
||||
enddate: ['required'],
|
||||
starttime: ['optional'],
|
||||
endtime: ['optional'],
|
||||
description: ['optional'],
|
||||
max_subscribers: ['required', 'min:0']
|
||||
},
|
||||
formValidation: {
|
||||
valid: false,
|
||||
fields: {
|
||||
name: {valid: null},
|
||||
type: {valid: null},
|
||||
description: {valid: null},
|
||||
startdate: {valid: null},
|
||||
enddate: {valid: null},
|
||||
starttime: {valid: null},
|
||||
endtime: {valid: null},
|
||||
allday: {valid: null},
|
||||
max_subscribers: {valid: null},
|
||||
}
|
||||
},
|
||||
isFormValid: true,
|
||||
validate() {
|
||||
this.formValidation = Iodine.assert(this.fields, this.rules)
|
||||
|
||||
if(!Iodine.assertAfterOrEqual(new Date(this.fields.enddate), new Date(this.fields.startdate))) {
|
||||
this.formValidation.fields.enddate.valid = false
|
||||
this.formValidation.valid = false
|
||||
}
|
||||
},
|
||||
validateField(field) {
|
||||
this.formValidation.fields[field] = Iodine.assert(this.fields[field], this.rules[field])
|
||||
},
|
||||
submit(event) {
|
||||
this.validate()
|
||||
if(!this.formValidation.valid) {
|
||||
this.isFormValid = false
|
||||
event.preventDefault()
|
||||
}
|
||||
return this.formValidation.valid
|
||||
}
|
||||
}">
|
||||
<form class="space-y-6" method="POST" @submit="submit">
|
||||
<div class="bg-white shadow px-4 py-5 sm:rounded-lg sm:p-6">
|
||||
<div class="md:grid md:grid-cols-3 md:gap-6">
|
||||
<div class="md:col-span-1">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-900">Informations sur le dispositif</h3>
|
||||
<p class="mt-1 text-sm text-gray-500">Informations générales sur le dispositif d'accompagnement à ajouter à l'agenda</p>
|
||||
</div>
|
||||
<div class="mt-5 md:mt-0 md:col-span-2">
|
||||
<div class="grid grid-cols-6 gap-6">
|
||||
<div class="col-span-6 sm:col-span-3">
|
||||
<label for="name" class="block text-sm font-medium text-gray-700">Nom</label>
|
||||
<input type="text" name="name" id="name" value="{{.ViewState.event.Name}}"
|
||||
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
|
||||
x-model="fields.name" @blur="validateField('name')"
|
||||
:class="formValidation.fields.name.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
|
||||
</div>
|
||||
<div class="sm:col-span-3">
|
||||
<label for="type" class="block text-sm font-medium text-gray-700">Type de dispositif</label>
|
||||
|
||||
<select id="type" name="type" value="{{.ViewState.event.Type}}"
|
||||
x-model="fields.type" @blur="validateField('type')"
|
||||
class="max-w-lg mt-1 block focus:ring-co-blue focus:border-co-blue w-full shadow-sm sm:max-w-xs sm:text-sm rounded-2xl"
|
||||
:class="formValidation.fields.type.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
|
||||
<option></option>
|
||||
<option value="Permis accéléré">Permis accéléré</option>
|
||||
<option value="Auto-école sociale (classique)">Auto-école sociale (classique)</option>
|
||||
<option value="Information collective">Information collective</option>
|
||||
<option value="Autres">Autres</option>
|
||||
</select>
|
||||
|
||||
</div>
|
||||
<div class="col-span-6">
|
||||
<label for="description" class="block text-sm font-medium text-gray-700">Description</label>
|
||||
<div class="mt-1">
|
||||
|
||||
<textarea rows="4" name="description" id="descrpition" value="{{.ViewState.event.Description}}"
|
||||
x-model="fields.description" @blur="validateField('description')"
|
||||
:class="formValidation.fields.description.valid == false ? 'border-co-red border-2' : 'border-gray-300'"
|
||||
class="shadow-sm focus:ring-co-blue focus:border-co-blue block w-full sm:text-sm border-gray-300 rounded-2xl"></textarea>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ $fieldName := "address" }}
|
||||
{{if .ViewState.event.Data.address}}
|
||||
{{$default := .ViewState.event.Data.address}}
|
||||
{{ template "address" dict "FieldName" $fieldName "Default" $default}}
|
||||
{{else}}
|
||||
{{ template "address_autocomplete" dict "FieldName" $fieldName}}
|
||||
|
||||
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-white shadow px-4 py-5 sm:rounded-lg sm:p-6">
|
||||
<div class="md:grid md:grid-cols-3 md:gap-6">
|
||||
<div class="md:col-span-1">
|
||||
<h3 class="text-lg font-medium leading-6 text-
|
||||
ray-900">Planification</h3>
|
||||
<p class="mt-1 text-sm text-gray-500">Dates et horaires de l'événement</p>
|
||||
</div>
|
||||
<div class="mt-5 space-y-6 md:mt-0 md:col-span-2 align-middle">
|
||||
<div class="grid grid-cols-6 gap-6">
|
||||
|
||||
<div class="col-span-6">
|
||||
|
||||
<button type="button" class="relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2" role="switch" aria-checked="false"
|
||||
:class="fields.allday ? 'bg-co-blue' : 'bg-gray-200'"
|
||||
@click="fields.allday = ! fields.allday">
|
||||
<span class="sr-only">Use setting</span>
|
||||
<!-- Enabled: "translate-x-5", Not Enabled: "translate-x-0" -->
|
||||
<span aria-hidden="true" class="pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out"
|
||||
:class="fields.allday ? 'translate-x-5' : 'translate-x-0'"></span>
|
||||
</button> <span class="text-md font-medium text-gray-700 ml-2">Toute la journée</span>
|
||||
<input type="hidden" name="allday" x-model="fields.allday">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="sm:col-span-6">
|
||||
<div class="inline-flex w-full">
|
||||
<div class="flex-1">
|
||||
|
||||
<label for="startdate" class="block text-sm font-medium text-gray-700">Date de début</label>
|
||||
<input name="startdate" id="startdate" type="date" value="{{$sdate}}"
|
||||
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-l-2xl"
|
||||
x-model="fields.startdate" @blur="validateField('startdate')"
|
||||
:class="formValidation.fields.startdate.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<label for="enddate" class="block text-sm font-medium text-gray-700">Date de fin</label>
|
||||
<input name="enddate" id="enddate" type="date" value="{{$edate}}"
|
||||
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-r-2xl"
|
||||
x-model="fields.enddate" @blur="validateField('enddate')"
|
||||
:class="formValidation.fields.enddate.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sm:col-span-6" x-show="!fields.allday">
|
||||
<div class="inline-flex w-full">
|
||||
<div class="flex-1">
|
||||
<label for="startdate" class="block text-sm font-medium text-gray-700">Horaire de début</label>
|
||||
<input type="time" name="starttime" id="starttime" placeholder="00:00"
|
||||
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-l-2xl"
|
||||
x-model="fields.starttime" @blur="validateField('starttime')"
|
||||
:class="formValidation.fields.starttime.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<label for="endtime" class="block text-sm font-medium text-gray-700">Horaire de fin</label>
|
||||
<input type="time" name="endtime" id="endtime" placeholder="00:00"
|
||||
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-r-2xl"
|
||||
x-model="fields.endtime" @blur="validateField('endtime')"
|
||||
:class="formValidation.fields.endtime.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-white shadow px-4 py-5 sm:rounded-lg sm:p-6">
|
||||
<div class="md:grid md:grid-cols-3 md:gap-6">
|
||||
<div class="md:col-span-1">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-900">Paramètres</h3>
|
||||
<p class="mt-1 text-sm text-gray-500">Paramètres du dispositift (nombre de places disponibles, etc...)</p>
|
||||
</div>
|
||||
<div class="mt-5 space-y-6 md:mt-0 md:col-span-2 align-middle">
|
||||
<div class="grid grid-cols-6 gap-6">
|
||||
<div class="col-span-6 sm:col-span-3">
|
||||
<label for="max_subscribers" class="block text-sm font-medium text-gray-700">Places disponibles (0 = illimité)</label>
|
||||
<input type="number" value="{{.ViewState.event.MaxSubscribers}}" name="max_subscribers" id="max_subscribers"
|
||||
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
|
||||
x-model="fields.max_subscribers" @blur="validateField('max_subscribers')"
|
||||
:class="formValidation.fields.max_subscribers.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="flex justify-end">
|
||||
<p x-show="! isFormValid" class="px-4 py-2 text-sm text-co-red">Certains champs de sont pas valides.</p>
|
||||
<a href="/app/agenda/{{.ViewState.event.ID}}">
|
||||
<button type="button"
|
||||
class="bg-white py-2 px-4 border border-gray-300 rounded-2xl shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">Annuler</button>
|
||||
</a>
|
||||
<button type="submit"
|
||||
class="ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-2xl text-white bg-co-blue hover:bg-co-blue focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">Modifier</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
|
||||
|
||||
<div class="fixed inset-0 z-10 overflow-y-auto">
|
||||
<div class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
|
||||
|
||||
<div class="relative transform overflow-hidden rounded-lg bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all sm:my-8 sm:w-full max-w-lg sm:p-6">
|
||||
<div>
|
||||
<div class="mx-auto flex h-12 w-12 items-center justify-center rounded-co bg-co-blue text-white">
|
||||
{{.IconSet.Icon "hero:outline/information-circle" "h-6 w-6"}}
|
||||
</div>
|
||||
<div class="mt-3 text-center sm:mt-5">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-900" id="modal-title">Vous n'avez pas le droit de modifier cet événement</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center items-center mt-5 sm:mt-6 sm:grid sm:grid-flow-row-dense ">
|
||||
<!-- class="flex justify-center items-center py-2 px-3 border-t dark:border-gray-600 -->
|
||||
<a href="/app/agenda/{{.ViewState.event.ID}}" class="rounded-2xl mt-3 inline-flex w-full justify-center rounded-l-2xl border border-gray-300 bg-white px-4 py-2 text-base font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:col-start-1 sm:mt-0 sm:text-sm">Annuler</a>
|
||||
<!-- <button type="submit" class="inline-flex w-full justify-center rounded-r-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:col-start-2 sm:text-sm">Confirmation</button> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -16,8 +16,6 @@
|
||||
</div>
|
||||
<div
|
||||
class="mt-6 flex flex-col-reverse justify-stretch space-y-4 space-y-reverse sm:flex-row-reverse sm:justify-end sm:space-x-reverse sm:space-y-0 sm:space-x-3 md:mt-0 md:flex-row md:space-x-3">
|
||||
<!-- <button type="button"
|
||||
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">Supprimer</button> -->
|
||||
{{if eq .UserID .ViewState.admins.ID}}
|
||||
<a href="/app/members/{{.ViewState.admins.ID}}/update" class="inline-flex"><button type="button"
|
||||
class="w-full px-4 py-2 border border-transparent text-sm font-medium rounded-2xl shadow-sm text-white bg-co-blue hover:bg-co-blue focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-co-blue">Modifier</button></a>
|
||||
@@ -60,6 +58,13 @@
|
||||
<dd class="mt-1 text-sm text-gray-900">{{.ViewState.admins.Data.last_name}}
|
||||
</dd>
|
||||
</div>
|
||||
<div class="sm:col-span-1">
|
||||
<dt class="text-sm font-medium text-gray-500">Organisations</dt>
|
||||
{{range .ViewState.groups}}
|
||||
<dd class="mt-1 text-sm text-gray-900">{{.}}
|
||||
</dd>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
154
web/layouts/members/membersList.html
Normal file
154
web/layouts/members/membersList.html
Normal file
@@ -0,0 +1,154 @@
|
||||
{{define "content"}}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="sm:flex-auto">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">La listes des référents</h1>
|
||||
</div>
|
||||
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
|
||||
<a href="/app/administration/">
|
||||
<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">
|
||||
Retour
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8" x-data="{
|
||||
state: {{.ViewState.list.JSONWithLimits 0 10}},
|
||||
current: 0,
|
||||
nb_pages() {
|
||||
let nbEl = this.state.count
|
||||
return Math.ceil(nbEl/10)
|
||||
},
|
||||
async paginate(page) {
|
||||
let start = (page-1)*10
|
||||
if(start < 0|| start > this.state.count) {
|
||||
return
|
||||
}
|
||||
let resp = await fetch('/api/cache/' + this.state.cache_id + '?limits.min=' + start + '&limits.max=' + (start+10))
|
||||
let data = await resp.json()
|
||||
this.state.members = data
|
||||
this.current=page-1
|
||||
}
|
||||
}">
|
||||
<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 ring-1 ring-black ring-opacity-5 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">
|
||||
Nom
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
|
||||
Téléphone
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
|
||||
Email
|
||||
</th>
|
||||
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
|
||||
Organisations
|
||||
</th>
|
||||
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6">
|
||||
<span class="sr-only"></span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
<template x-for="(member, i) in state.members" >
|
||||
<tr>
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
|
||||
<div class="flex items-center">
|
||||
<div class="h-10 w-10 flex-shrink-0">
|
||||
<img class="h-10 w-10 rounded-co"
|
||||
:src="'/app/members/' + member.id + '/picture'" alt="">
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<div class="font-medium text-gray-900"><span
|
||||
x-text="member.data.first_name"></span> <span
|
||||
x-text="member.data.last_name"></span></div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||||
<div class="text-gray-900" x-text="member.data.phone_number"></div>
|
||||
</td>
|
||||
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500"
|
||||
x-text="member.data.email">
|
||||
</td>
|
||||
<template x-for="(group, index) in state.groups" >
|
||||
<template x-if="i === index">
|
||||
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500"
|
||||
x-text="group" >
|
||||
</td>
|
||||
</template></template>
|
||||
|
||||
<td
|
||||
class="relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6">
|
||||
<a :href="'/app/members/' + member.id"
|
||||
class="text-co-blue hover:text-co-blue">Voir<span class="sr-only">, <span
|
||||
x-text="member.data.first_name"></span> <span
|
||||
x-text="member.data.last_name"></span></a>
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
<div class="bg-white px-4 py-3 flex items-center justify-between border-t border-gray-200 sm:px-6">
|
||||
<div class="flex-1 flex justify-between sm:hidden">
|
||||
<a href="#" class="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"
|
||||
@click="paginate(current)"> Previous </a>
|
||||
<a href="#" class="ml-3 relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"
|
||||
@click="paginate(current+2)"> Next </a>
|
||||
</div>
|
||||
<div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
|
||||
<div>
|
||||
<p class="text-sm text-gray-700">
|
||||
Résultats
|
||||
<span class="font-medium" x-text="Math.min((current * 10)+1, state.count)"></span>
|
||||
à
|
||||
<span class="font-medium" x-text="Math.min((current * 10)+10, state.count)"></span>
|
||||
sur
|
||||
<span class="font-medium" x-text="state.count"></span>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<nav class="relative z-0 inline-flex rounded-md shadow-sm -space-x-px" aria-label="Pagination">
|
||||
<a href="#" class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50"
|
||||
@click="paginate(current)">
|
||||
<span class="sr-only">Previous</span>
|
||||
|
||||
<svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</a>
|
||||
<template x-for="i in nb_pages">
|
||||
<a href="#" @click="paginate(i)"
|
||||
class="relative inline-flex items-center px-4 py-2 border text-sm font-medium"
|
||||
:class="i == current+1 ? 'z-10 bg-indigo-50 border-co-blue text-co-blue' : 'bg-white border-gray-300 text-gray-500 hover:bg-gray-50'"
|
||||
x-text="i"></a>
|
||||
</template>
|
||||
<a href="#" class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50"
|
||||
@click="paginate(current+2)">
|
||||
<span class="sr-only">Next</span>
|
||||
<svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</a>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{end}}
|
||||
@@ -1,5 +1,4 @@
|
||||
{{define "content"}}
|
||||
{{if eq .UserID .ViewState.ID}}
|
||||
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">Modifier vos informations</h1>
|
||||
@@ -129,26 +128,4 @@
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
|
||||
|
||||
<div class="fixed inset-0 z-10 overflow-y-auto">
|
||||
<div class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
|
||||
|
||||
<div class="relative transform overflow-hidden rounded-lg bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all sm:my-8 sm:w-full max-w-lg sm:p-6">
|
||||
<div>
|
||||
<div class="mx-auto flex h-12 w-12 items-center justify-center rounded-co bg-co-blue text-white">
|
||||
{{.IconSet.Icon "hero:outline/information-circle" "h-6 w-6"}}
|
||||
</div>
|
||||
<div class="mt-3 text-center sm:mt-5">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-900" id="modal-title">Vous n'avez pas le droit de modifier ce profil</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center items-center mt-5 sm:mt-6 sm:grid sm:grid-flow-row-dense ">
|
||||
<a href="/app/members/{{.ViewState.ID}}"class="rounded-2xl mt-3 inline-flex w-full justify-center rounded-l-2xl border border-gray-300 bg-white px-4 py-2 text-base font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 sm:col-start-1 sm:mt-0 sm:text-sm">Annuler</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -1,6 +1,18 @@
|
||||
{{define "content"}}
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">Réservations</h1>
|
||||
<div class="sm:flex sm:items-center">
|
||||
<div class="sm:flex-auto">
|
||||
<h1 class="text-2xl font-semibold text-gray-900">Réservations</h1>
|
||||
</div>
|
||||
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
|
||||
<a href="/app/administration/stats/vehicles/available">
|
||||
<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">
|
||||
Voitures disponibles
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
|
||||
@@ -64,6 +76,11 @@
|
||||
</span>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{if not .bookings}}
|
||||
<span class="p-1 bg-black text-white text-xs font-bold rounded-xl" >
|
||||
Disponible
|
||||
</span>
|
||||
{{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>
|
||||
|
||||
Reference in New Issue
Block a user