102 Commits

Author SHA1 Message Date
d8369bad3d Edit web/layout/vehicles/search.html - Add Documents demandés 2024-10-28 14:38:00 +01:00
1903cd27db edit web/layouts/agenda/create-event.html 2024-10-22 12:10:49 +02:00
5eccdcf89b edit web/layouts/agenda/_partials/event-files.html & web/layouts/agenda/display-event.html 2024-10-15 10:52:23 +02:00
56f0700999 edit web/layouts/agenda/_partials/event-files.html 2024-10-14 09:59:33 +02:00
c8ab3f22ef edit display-event.html & add event-files.html 2024-10-07 17:57:51 +02:00
10c4fb22d1 edit display-event.html 2024-10-02 14:41:37 +02:00
698ccfc9d6 edit display-event.html 2024-10-02 14:36:23 +02:00
8cf9fcdb0a [+] add modification theme 2023-11-27 10:39:53 +01:00
d6b8a48d1c [+] theme 2023-11-27 10:30:47 +01:00
soukainna
cbc77f1615 Merge branch 'fixMultipleReservationV' into dev 2023-06-22 14:24:17 +02:00
soukainna
fc8b325865 merge branch FixAddressBeneficiary into dev 2023-06-22 12:29:54 +02:00
89adcc69a2 Merge branch 'dev' of https://git.coopgo.io/coopgo-apps/parcoursmob-default-theme into dev 2023-06-02 14:59:24 +02:00
da3c37699e edit template vehicle_stats and booking-list to add export button 2023-06-02 14:57:18 +02:00
019569155a add export agenda by Salim 2023-06-01 14:11:30 +02:00
soukainna
bd71a36cd3 fix duplicate group 2023-05-19 11:23:18 +02:00
soukainna
8778f88fbd fix the type of vehicle 2023-05-19 11:16:00 +02:00
soukainna
3aba9e0071 fix the group settings 2023-05-19 11:16:00 +02:00
soukainna
560af60f32 allow modification for owners 2023-05-19 11:16:00 +02:00
soukainna
4789c5a49e allow modify option just for owners 2023-05-19 11:16:00 +02:00
soukainna
b480747b86 add the update file 2023-05-19 11:16:00 +02:00
soukainna
5617646bdb add the update file 2023-05-19 11:16:00 +02:00
soukainna
4c05d570f7 add modify button 2023-05-19 11:16:00 +02:00
soukainna
11e377ddb3 fix config file 2023-05-19 11:16:00 +02:00
18e2517805 edit template fleet-display and delete-booking template 2023-05-17 12:50:59 +02:00
bad991c3bc edit bookings-list, booking-display and delete-booking template 2023-05-12 11:06:55 +02:00
cf7b78e64e add icone 'Annulé' and update 'Réservations à venir' on fleet-display template 2023-05-10 12:04:17 +02:00
soukainna
eec5afdf39 fix the modify address 2023-05-09 12:13:14 +02:00
soukainna
83ae4665f0 fix the group settings 2023-05-05 10:42:55 +02:00
soukainna
5950599bdb allow modification for owners 2023-05-05 10:22:42 +02:00
soukainna
e5dae2d18f allow modify option just for owners 2023-05-05 10:22:08 +02:00
soukainna
e5fc2bcfb5 add the update file 2023-05-05 09:18:57 +02:00
soukainna
6c5c25a992 add the update file 2023-05-05 09:18:28 +02:00
soukainna
89af48389a add modify button 2023-05-05 09:15:32 +02:00
soukainna
669d7e4e7b fix config file 2023-05-05 09:13:04 +02:00
soukainna
0bf315596b add hidden button to block multiple reservation 2023-05-03 16:51:01 +02:00
61e9285a2b edit config.yaml to add delete_booking route 2023-05-03 14:30:15 +02:00
eb8859ca67 add button Annuler in booking-display and create delete-booking 2023-05-03 14:15:44 +02:00
b89b8064c5 edit vehicles-list to fix viewing status problems 2023-03-08 10:09:49 +01:00
soukainna
0f4d0e1e5b fix the break err 2023-03-06 10:49:24 +01:00
soukainna
583027422c Merge branch 'addStatistiques' into dev 2023-03-06 10:39:38 +01:00
soukainna
a36827a6ff add vehicles status in stat 2023-03-06 10:22:25 +01:00
ad7f5b642e Sow status of vehicle in vehicles list 2023-03-03 16:58:47 +01:00
193bd8ef3a add 'Retiré' in 'Statut Réservation' for some case 2023-03-03 13:16:26 +01:00
332d9dd509 add 'Disponible' for 'Statut Réservation' for some case 2023-03-03 11:39:37 +01:00
soukainna
511baa6a8e modify config 2023-02-27 15:10:49 +01:00
soukainna
031ef7b924 put organisation info 2023-02-27 14:55:23 +01:00
soukainna
fc60854e21 add members stats 2023-02-27 14:16:01 +01:00
soukainna
afc403bded add vehicles stats 2023-02-27 14:15:02 +01:00
soukainna
e0fd3aa510 fix events stats 2023-02-27 14:14:08 +01:00
soukainna
33c182574c add events stats 2023-02-27 14:10:26 +01:00
soukainna
274f6c1616 add beneficaires stats 2023-02-27 14:09:57 +01:00
soukainna
675974a9e7 add config stats 2023-02-27 14:09:30 +01:00
soukainna
612f74202d remove sup button 2023-02-24 18:50:26 +01:00
soukainna
6ccb72e566 drop my comment 2023-02-24 18:49:13 +01:00
soukainna
ea4eea03da delete some logs 2023-02-24 18:47:58 +01:00
bb70ed9136 edit design in template vehicles-list 2023-02-24 17:23:27 +01:00
c450eecc37 display all status for vehicles list - statut 'Disponible' for a new vehicle 2023-02-24 16:04:01 +01:00
59950586ec showing 1 statut for vehicles-list 2023-02-24 13:51:25 +01:00
c16e27fb25 showing all statuts for vehicle 2023-02-24 10:53:27 +01:00
361447f188 add 'statut' on vehicles-list template 2023-02-23 16:46:56 +01:00
70ad96a4e8 add 'statut' on vehicles-list template 2023-02-23 16:46:38 +01:00
e43e23353a edit mail for the prescipteur when a beneficiary is delete 2023-02-23 12:37:11 +01:00
soukainna
a2f9184e22 fix profile err 2023-02-23 09:52:02 +01:00
soukainna
3a58b63edd Merge branch 'addInfoInCovoiturage' into dev 2023-02-22 12:38:20 +01:00
soukainna
0867a13df7 Merge branch 'modifyAnEvent' into dev 2023-02-22 12:33:44 +01:00
soukainna
5ffb2bcf85 add file unbloking 2023-02-22 12:23:10 +01:00
bee362342c sending mail to the prescripteur 2023-02-22 11:57:21 +01:00
soukainna
18f126e4eb create members list 2023-02-22 11:06:21 +01:00
soukainna
1c29f00720 add organisations 2023-02-22 11:05:54 +01:00
soukainna
70186d1357 add url to redirect sataistique page 2023-02-22 11:05:36 +01:00
soukainna
9ba3480507 fix config yaml 2023-02-22 11:04:49 +01:00
soukainna
1a67ee50bb modify text 2023-02-17 17:24:45 +01:00
494f1124fa edit template history-event 2023-02-17 15:28:07 +01:00
77445af5fb edit delete button for different organization 2023-02-17 11:47:26 +01:00
1189fef6c0 edit delete button for different organization 2023-02-17 11:45:58 +01:00
soukainna
b7eb73a4bd fix some err 2023-02-17 10:53:57 +01:00
46f1d44b11 add delete button for different organization 2023-02-17 10:24:30 +01:00
09b0458f62 edit display-event and history-event template 2023-02-16 09:05:36 +01:00
41c1e10924 edit template 'history-event' 2023-02-15 14:26:56 +01:00
soukainna
39d4713ebf add the member page and not the beneficaire page 2023-02-15 11:32:27 +01:00
soukainna
b004cf847a make the subscriber_by clickable 2023-02-13 10:29:50 +01:00
3dce51620f add 'History' page 2023-02-08 09:36:48 +01:00
soukainna
759e8f810a add condition to display modify button 2023-02-03 16:12:47 +01:00
f74c0eaf06 modification about delete-subscriber template 2023-02-03 10:06:11 +01:00
811e040cd8 add 'motif' text-area in delete-subscriber 2023-02-01 18:16:24 +01:00
soukainna
6ac44006d3 add delete file 2023-02-01 16:03:04 +01:00
soukainna
6c4a99c1a7 add modale 2023-02-01 11:51:00 +01:00
soukainna
2ddf2e6673 add url to redirect form action 2023-02-01 10:47:48 +01:00
soukainna
79aff42228 add template to update and delete event 2023-02-01 09:55:18 +01:00
7959a34b26 change color of the 'Supprimer le bénéficiaire' in blue 2023-01-27 15:53:10 +01:00
5dde4beee7 add button 'supprimer le bénéficiaire' on agenda subscribers-table 2023-01-26 15:24:16 +01:00
soukainna
3345eb1560 fix url page profileMember 2023-01-18 14:17:28 +01:00
soukainna
e5382917cd modify some style and add the update file to delete passenger 2023-01-17 15:09:41 +01:00
608d5c3ad5 avoir issue in template 2023-01-17 08:57:32 +01:00
7220c4e350 Add Vehicles states in admin 2023-01-17 08:26:46 +01:00
e0a98a0126 Merge branch 'themeCovoiturage' of https://git.coopgo.io/coopgo-apps/parcoursmob-default-theme 2023-01-16 19:41:33 +01:00
soukainna
ac413680e0 fix config.yaml to stock address 2023-01-04 16:08:08 +01:00
soukainna
405038be3a add depart and destination for members in the groupscovoiturage 2023-01-04 12:09:51 +01:00
d24560f87a Fix profile picture issue 2022-12-05 20:27:02 +01:00
ce9772370d Fix profile picture issue 2022-12-05 20:04:55 +01:00
5d5e17112c Tweak administration 2022-12-05 19:16:24 +01:00
0f35c8950f Improve bookings and agenda 2022-12-05 17:24:24 +01:00
46 changed files with 2471 additions and 434 deletions

View File

@@ -27,18 +27,28 @@ views:
- web/layouts/beneficiaries/_partials/beneficiary-journeys.html
- web/layouts/beneficiaries/_partials/beneficiary-events.html
- web/layouts/beneficiaries/_partials/beneficiary-files.html
- web/layouts/beneficiaries/_partials/beneficiary-organizations.html
- web/layouts/beneficiaries/display.html
update:
files:
- web/layouts/_partials/address_autocomplete.html
- web/layouts/beneficiaries/update.html
conseillers:
members:
display:
files:
- web/layouts/conseillers/display.html
- web/layouts/members/display.html
update:
files:
- web/layouts/conseillers/update.html
- web/layouts/members/update.html
list:
files:
- web/layouts/members/membersList.html
group:
settings:
files:
- web/layouts/administration/_partials/groups_admins.html
- web/layouts/administration/_partials/group_members.html
- web/layouts/group/settings.html
vehicles:
search:
files:
@@ -83,13 +93,33 @@ views:
list:
files:
- web/layouts/agenda/home.html
history:
files:
- web/layouts/agenda/history.html
display_event:
files:
- web/layouts/agenda/_partials/subscribers-table.html
- web/layouts/agenda/display-event.html
- web/layouts/agenda/_partials/event-files.html
create_event:
files:
- web/layouts/_partials/address_autocomplete.html
- web/layouts/agenda/create-event.html
- web/layouts/agenda/_partials/event-files.html
delete_subscriber:
files:
- web/layouts/agenda/delete-subscriber.html
history_event:
files:
- web/layouts/agenda/history-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:
@@ -112,8 +142,12 @@ views:
- web/layouts/_partials/address_autocomplete.html
display:
files:
- web/layouts/_partials/address_autocomplete.html
- web/layouts/journeys/display_groups.html
- web/layouts/journeys/_partials/map.html
update:
files:
- web/layouts/journeys/update_groups.html
support:
request:
files:
@@ -143,7 +177,19 @@ 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
bookings_list:
files:
- web/layouts/administration/_partials/bookings_list.html
- web/layouts/administration/bookings_stats.html
settings:
files:
- web/layouts/administration/_partials/groups_admins.html
@@ -244,4 +290,9 @@ emails:
files:
- emails/layout.html
- emails/onboarding/support_emailing.html
delete_subscriber:
request:
subject: PARCOURSMOB - Un bénéficiaire a été retiré d'un dispositif
files:
- emails/layout.html
- emails/onboarding/delete-subscriber.html

0
emails/layout.html Normal file → Executable file
View File

View File

@@ -0,0 +1,7 @@
{{define "content"}}
<p></p>
<p>Un bénéficiaire a été retiré d'un événement sur PARCOURSMOB par <b>{{.user}}</b></p>
<p>Pour le motif suivant : <b>{{.motif}}</b></p>
<p>Pour voir le bénéficiaire, cliquez sur : <a href={{.subscriber}}>{{.subscriber}}</a></p>
<p>Pour voir l'événement, cliquez sur : <a href={{.link}}>{{.link}}</a></p>
{{end}}

View File

@@ -0,0 +1,115 @@
{{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 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 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
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Gestionnaire véhicule
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Prescripteur
</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 eq .Status 1 }}
<span class="p-1 bg-co-blue text-white text-xs font-bold rounded-xl" >
A&nbsp;venir
</span>
{{end}}
{{if eq .Status 0 }}
<span class="p-1 bg-co-green text-white text-xs font-bold rounded-xl" >
En&nbsp;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">
<div class="text-gray-900" >{{ (index $.ViewState.admingroups (index (index $.ViewState.vehicles_map .Vehicleid).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.booked_by.group.name }}<br />({{ .Data.booked_by.user.display_name }})</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=""> -->
{{$b := (index $.ViewState.beneficiaries_map .Driver)}}
{{$b.Data.first_name}} {{$b.Data.last_name}} <br />
{{$b.Data.file_number}}
</div>
{{end}}
</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" >Retiré du {{(timeFrom .Unavailablefrom).Format "02/01/2006"}} <br />
au {{(timeFrom .Unavailableto).Format "02/01/2006"}}</div>
{{else}}
<div class="text-gray-900" >Du {{(timeFrom .Startdate).Format "02/01/2006"}} <br />
au {{(timeFrom .Enddate).Format "02/01/2006"}}</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>
{{end}}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{{end}}

View File

@@ -11,7 +11,7 @@
<img class="h-10 w-10 rounded-co" src="/app/beneficiaries/{{.ID}}/picture" alt="">
</div>
<div class="flex-1 min-w-0">
<a href="/app/profile/{{.ID}}" class="focus:outline-none">
<a href="/app/members/{{.ID}}" class="focus:outline-none">
<span class="absolute inset-0" aria-hidden="true"></span>
<p class="text-sm font-medium text-gray-900">{{.Data.first_name}} {{.Data.last_name}}</p>
<p class="text-sm text-gray-500 truncate">{{.Data.email}}</p>

View 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}}

View File

@@ -0,0 +1,37 @@
{{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">Historique des réservations de véhicules</h1>
<div class="sm:flex sm:items-center">
<div class="sm:flex-auto">
</div>
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
<a href="/exports/fleets/bookings">
<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 flex items-center text-sm rounded-2xl focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">
Export
</button>
</a>
<a href="/app/administration/stats/vehicles">
<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 flex items-center text-sm rounded-2xl focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">
{{$.IconSet.Icon "hero:outline/document-arrow-left" "h-5 w-5 mr-3"}}
Liste des véhicules
</button>
</a>
<!-- <a href="/api/cache/{{.ViewState.cacheid}}/export">
<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 flex items-center 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"}}
Exporter
</button>
</a> -->
</div>
</div>
</div>
{{template "bookings_list" .}}
{{end}}

View File

@@ -0,0 +1,111 @@
{{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="/exports/agenda/subscriptions">
<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 flex items-center text-sm rounded-2xl focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">
Export
</button>
</a>
<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}}

View File

@@ -14,8 +14,8 @@
<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>
<p class="text-gray-500">{{len (index .ViewState.groups 0).Members}} bénéficiaires</p>
<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>
</li>
@@ -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,8 +42,8 @@
<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>
<p class="text-gray-500">1 membres</p>
<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>
</li>
@@ -51,13 +51,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-yellow text-white text-sm font-medium rounded-l-3xl">
{{.IconSet.Icon "hero:outline/shield-check" "h-6 w-6"}}
{{.IconSet.Icon "tabler-icons:car" "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">Accompagnement</a>
<p class="text-gray-500">0 actions réalisées</p>
<a href="/app/administration/stats/vehicles" class="text-gray-900 font-medium hover:text-gray-600">Véhicules</a>
<p class="text-gray-500">{{len .ViewState.bookings}} réservations de véhicules</p>
</div>
</div>
</li>
@@ -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> -->
<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>

View File

@@ -0,0 +1,155 @@
{{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">Liste des véhicules</h1>
</div>
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
<a href="/app/administration/">
<a href="/app/administration/stats/bookings">
<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 flex items-center text-sm rounded-2xl focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">
{{$.IconSet.Icon "hero:outline/document-arrow-left" "h-5 w-5 mr-3"}}
Liste des réservations
</button>
</a>
</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}}

View File

@@ -0,0 +1,67 @@
{{ 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 }}

View File

@@ -0,0 +1,134 @@
{{define "event_files"}}
<div class="px-4 py-6 sm:px-6"
x-data="{
fields: {
name: null,
type: null,
file: null,
},
rules: {
name: ['required'],
type: ['required'],
file: ['required'],
},
formValidation: {
valid: false,
fields: {
name: {valid: null},
type: {valid: null},
file: {valid: null},
}
},
isFormValid: true,
validate() {
this.formValidation = Iodine.assert(this.fields, this.rules)
},
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
}
}">
{{if eq (len .ViewState.documents) 0}}
<p class="p-12 text-gray-500 text-center text-md">Aucun document</p>
{{end}}
{{if gt (len .ViewState.documents) 0}}
<div class="-mx-4 mb-10 ring-1 ring-gray-300 sm:-mx-6 md:mx-0 md:rounded-lg">
<table class="min-w-full divide-y divide-gray-300">
<thead>
<tr>
<th scope="col" class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6">Type</th>
<th scope="col" class="hidden px-3 py-3.5 text-left text-sm font-semibold text-gray-900 lg:table-cell">Nom du document</th>
<th scope="col" class="hidden px-3 py-3.5 text-left text-sm font-semibold text-gray-900 lg:table-cell">Ajouté le</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>
{{range .ViewState.documents}}
<tr>
<td class="relative py-4 pl-4 sm:pl-6 pr-3 text-sm">
<div class="font-medium text-gray-900">
<span class="bg-co-blue text-xs text-white rounded-xl p-1 mr-2">{{index $.ViewState.file_types_map .Metadata.Type}}</span>
</div>
</td>
<td class="px-3 py-3.5 text-sm text-gray-900 lg:table-cell">{{.Metadata.Name}}</td>
<td class="px-3 py-3.5 text-sm text-gray-500 lg:table-cell">{{.LastModified.Format "02/01/2006"}}</td>
<td class="relative py-3.5 pl-3 pr-4 sm:pr-6 text-right text-sm font-medium">
<a href="/app/agenda/{{$.ViewState.event.ID}}/documents/{{.FileName}}" target="_blank">
<button type="button" class="inline-flex items-center rounded-md border border-gray-300 bg-white px-3 py-2 text-sm font-medium leading-4 text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-co-blue focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-30">Voir<span class="sr-only"> le document</span></button>
</a>
</td>
</tr>
{{end}}
<!-- More plans... -->
</tbody>
</table>
</div>
{{end}}
{{ if eq (index .ViewState.event.Owners 0) .Group.ID }}
<h3 class="text-lg">Ajouter un document</h3>
<form method="POST" action="/app/agenda/{{.ViewState.event.ID}}/documents" @submit="submit" enctype="multipart/form-data">
<div class="md:grid md:grid-cols-6 p-2">
<div class="sm:col-span-2">
<label for="type" class="block text-sm font-medium text-gray-700">Type</label>
<select id="type" name="type" class="mt-1 block w-full rounded-l-2xl border-gray-300 py-2 pl-3 pr-10 text-base focus:border-indigo-500 focus:outline-none focus:ring-indigo-500 sm:text-sm"
x-model="fields.type" @blur="validateField('type')"
:class="formValidation.fields.type.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
<option value="" selected>Sélectionner un type</option>
{{range .ViewState.events_file_types}}
<option value="{{.}}">{{index $.ViewState.file_types_map .}}</option>
{{end}}
</select>
</div>
<div class="sm:col-span-4">
<label for="name" class="block text-sm font-medium text-gray-700">Nom</label>
<input type="text" name="name" id="name"
placeholder="Nom du fichier"
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.name" @blur="validateField('name')"
:class="formValidation.fields.name.valid == false ? 'border-co-red border-2' : 'border-gray-300'" />
</div>
<div class="sm:col-span-6 mt-4">
<label for="cover-photo" class="block text-sm font-medium text-gray-700">Téléchargement</label>
<div class="mt-1 flex justify-center rounded-md border-2 border-dashed px-6 pt-5 pb-6"
x-on:drop="console.log('toto')"
:class="formValidation.fields.file.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
<div class="space-y-1 text-center">
{{.IconSet.Icon "hero:outline/folder-plus" "mx-auto h-12 w-12 text-gray-400"}}
<div class="flex text-sm text-gray-600">
<label for="file-upload" class="relative cursor-pointer rounded-md bg-white font-medium text-co-blue focus-within:outline-none focus-within:ring-2 focus-within:ring-co-blue focus-within:ring-offset-2 hover:text-co-blue">
<span>Sélectionnez un fichier </span>
<input id="file-upload" name="file-upload" type="file" class="sr-only"
x-model="fields.file" @blur="validateField('file')">
</label>
<!-- <p class="pl-1">ou glissez-déposez</p> -->
</div>
<p class="text-xs text-gray-500">Jusqu'à 10MB</p>
<p class="text-co-blue p-2" x-text="fields.file" x-if="fields.file"></p>
</div>
</div>
</div>
</div>
<button type="submit"
class="rounded-2xl border border-transparent bg-co-blue px-4 py-2 my-4 mt-8 w-full 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">
Ajouter le document
</button>
</form>
{{end}}
</div>
{{end}}

View File

@@ -0,0 +1,53 @@
{{define "subscribers_table"}}
<table class="min-w-full divide-y divide-gray-300 border-t border-gray-200">
<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 ">
Bénéficiaire
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Prescripteur
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Date d'inscription
</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>
{{$evid := .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">
<img class="h-6 w-6 rounded-co mr-2" src="/app/beneficiaries/{{.Subscriber}}/picture" alt=" "> {{ (index $.ViewState.subscribers .Subscriber).Data.first_name }} {{ (index $.ViewState.subscribers .Subscriber).Data.last_name }}
</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>
{{.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>
<!-- ajout du bouton supprimer -->
<td>
<a href="/app/agenda/{{$evid}}/{{.Subscriber}}/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-red">Retirer</button></a>
</td>
<!-- fin -->
</tr>
{{end}}
</tbody>
</table>
{{end}}

View File

@@ -4,8 +4,7 @@
<h1 class="text-2xl font-semibold text-gray-900">Ajouter à l'agenda</h1>
</div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8 mt-8"
x-data="{
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8 mt-8" x-data="{
fields: {
name: null,
type: null,
@@ -16,6 +15,9 @@
starttime: null,
endtime: null,
max_subscribers: 0,
file_name: null,
file_type: null,
file: null,
},
rules: {
name: ['required'],
@@ -25,7 +27,10 @@
starttime: ['optional'],
endtime: ['optional'],
description: ['optional'],
max_subscribers: ['required', 'min:0']
max_subscribers: ['required', 'min:0'],
file_name: ['optional'],
file_type: ['optional'],
file: ['optional'],
},
formValidation: {
valid: false,
@@ -39,6 +44,9 @@
endtime: {valid: null},
allday: {valid: null},
max_subscribers: {valid: null},
file_name: {valid: null},
file_type: {valid: null},
file: {valid: null},
}
},
isFormValid: true,
@@ -62,12 +70,14 @@
return this.formValidation.valid
}
}">
<form class="space-y-6" method="POST" @submit="submit">
<form id="eventForm" 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>
<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">
@@ -80,8 +90,7 @@
</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"
x-model="fields.type" @blur="validateField('type')"
<select id="type" name="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>
@@ -94,8 +103,8 @@
<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"
x-model="fields.description" @blur="validateField('description')"
<textarea rows="4" name="description" id="descrpition" 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>
@@ -119,12 +128,14 @@
<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'"
<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"
<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">
@@ -134,14 +145,16 @@
<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>
<label for="startdate" class="block text-sm font-medium text-gray-700">Date de
début</label>
<input type="date" name="startdate" id="startdate" placeholder="JJ/MM/AAAA"
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>
<label for="enddate" class="block text-sm font-medium text-gray-700">Date de
fin</label>
<input type="date" name="enddate" id="enddate" placeholder="JJ/MM/AAAA"
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')"
@@ -155,14 +168,16 @@
<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>
<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>
<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')"
@@ -184,12 +199,14 @@
<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>
<p class="mt-1 text-sm text-gray-500">Paramètres du dispositif (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>
<label for="max_subscribers" class="block text-sm font-medium text-gray-700">Places
disponibles (0 = illimité)</label>
<input type="number" 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')"
@@ -199,8 +216,54 @@
</div>
</div>
</div>
<!-- <div class="bg-white shadow px-4 py-5 sm:rounded-lg sm:p-6 mt-8">
<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">Ajouter un document</h3>
<p class="mt-1 text-sm text-gray-500">Téléchargez un document lié à cet événement</p>
</div>
<div class="md:grid md:grid-cols-6 p-2">
<div class="sm:col-span-2">
<label for="file_type" class="block text-sm font-medium text-gray-700">Type</label>
<select id="file_type" name="file_type" class="mt-1 block w-full rounded-l-2xl border-gray-300 py-2 pl-3 pr-10 text-base focus:border-indigo-500 focus:outline-none focus:ring-indigo-500 sm:text-sm"
x-model="fields.file_type" @blur="validateField('file_type')"
:class="formValidation.fields.file_type.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
<option value="" selected>Sélectionner un type</option>
{{range .ViewState.events_file_types}}
<option value="{{.}}">{{index $.ViewState.file_types_map .}}</option>
{{end}}
</select>
</div>
<div class="sm:col-span-4">
<label for="file_name" class="block text-sm font-medium text-gray-700">Nom</label>
<input type="text" name="file_name" id="file_name"
placeholder="Nom du fichier"
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.file_name" @blur="validateField('file_name')"
:class="formValidation.fields.file_name.valid == false ? 'border-co-red border-2' : 'border-gray-300'" />
</div>
<div class="sm:col-span-6 mt-4">
<label for="cover-photo" class="block text-sm font-medium text-gray-700">Téléchargement</label>
<div class="mt-1 flex justify-center rounded-md border-2 border-dashed px-6 pt-5 pb-6"
x-on:drop="console.log('toto')"
:class="formValidation.fields.file.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
<div class="space-y-1 text-center">
{{.IconSet.Icon "hero:outline/folder-plus" "mx-auto h-12 w-12 text-gray-400"}}
<div class="flex text-sm text-gray-600">
<label for="file-upload" class="relative cursor-pointer rounded-md bg-white font-medium text-co-blue focus-within:outline-none focus-within:ring-2 focus-within:ring-co-blue focus-within:ring-offset-2 hover:text-co-blue">
<span>Sélectionnez un fichier </span>
<input id="file-upload" name="file-upload" type="file" class="sr-only"
x-model="fields.file" @blur="validateField('file')">
</label>
</div>
<p class="text-xs text-gray-500">Jusqu'à 10MB</p>
<p class="text-co-blue p-2" x-text="fields.file" x-if="fields.file"></p>
</div>
</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>

View File

@@ -0,0 +1,58 @@
{{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}}

View File

@@ -0,0 +1,39 @@
{{define "content"}}
<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">Voulez-vous vraiment retirer ce bénéficiaire ?</p>
</div>
<div class="col-span-6">
<label for="motif" class="block text-sm font-medium text-gray-700">Motif</label>
<div class="mt-1">
<textarea rows="4" name="motif" id="motif"
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>
</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.eventid}}" 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>
{{end}}

View File

@@ -12,7 +12,27 @@
{{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">
@@ -65,14 +85,37 @@
</div>
</div>
</section>
{{ if eq (index .ViewState.event.Owners 0) .Group.ID }}
<section aria-labelledby="subscribers-table"></section>
<div class="bg-white shadow sm:rounded-lg">
<div class="flex justify-between px-4 py-5 sm:px-6">
<h2 id="event-information-title" class="text-lg leading-6 font-medium text-gray-900">Tous les inscrits</h2>
<a href="/exports/agenda/{{$event}}">
<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 flex items-center 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"}}
Exporter
</button>
</a>
<a href="/app/agenda/{{.ViewState.event.ID}}/history">
<button type="submit"class="rounded-2xl border border-transparent bg-co-blue px-4 py-2 w-full 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">
Bénéficiaires désinscrits
</button>
</a>
</div>
{{template "subscribers_table" .}}
</div>
</section>
{{end}}
</div>
<section aria-labelledby="subscribers-title" class="lg:col-start-3 lg:col-span-1">
<div class="bg-white px-4 py-5 shadow sm:rounded-lg sm:px-6">
<h2 id="subscribers-title" class="text-lg font-medium text-gray-900">Inscrire un bénéficiaire</h2>
{{if gt .ViewState.event.RemainingSubscriptions 0}}
<form class="mt-4" action="/app/agenda/{{.ViewState.event.ID}}/subscribe" method="POST">
<div class="relative mt-1 mb-4" x-data="{
<div class="bg-white px-4 py-5 shadow sm:rounded-lg sm:px-6" x-data="{
text: '',
error: false,
beneficiariesListOpen: false,
beneficiaries: {{json .ViewState.beneficiaries}},
filteredBeneficiaries: (text) => {
@@ -87,8 +130,19 @@
this.fields.beneficiaryid = beneficiary.id
this.text = beneficiary.data.first_name + ' ' + beneficiary.data.last_name
this.beneficiariesListOpen = false
},
submit(event) {
if(!this.fields.beneficiaryid) {
this.error = true
event.preventDefault()
}
return this.formValidation.valid
}
}">
<h2 id="subscribers-title" class="text-lg font-medium text-gray-900">Inscrire un bénéficiaire</h2>
{{if gt .ViewState.event.RemainingSubscriptions 0}}
<form class="mt-4" action="/app/agenda/{{.ViewState.event.ID}}/subscribe" method="POST" @submit="submit">
<div class="relative mt-1 mb-4">
<input @focus="beneficiariesListOpen = true" x-model="text" id="combobox" type="text" class="w-full rounded-2xl border border-gray-300 bg-white py-2 pl-3 pr-12 shadow-sm focus:border-co-blue focus:outline-none focus:ring-1 focus:ring-co-blue sm:text-sm" role="combobox" aria-controls="options" aria-expanded="false">
<button @click="beneficiariesListOpen = ! beneficiariesListOpen" type="button" class="absolute inset-y-0 right-0 flex items-center rounded-r-2xl px-2 focus:outline-none">
@@ -113,6 +167,7 @@
</ul>
<input type="hidden" name="subscriber" x-model="fields.beneficiaryid">
</div>
<p class="text-co-red text-xs mb-4" x-show="error">Vous devez sélectionner un bénéficiaire</p>
<button type="submit"
class="rounded-2xl border border-transparent bg-co-blue px-4 py-2 w-full 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">
Inscrire le bénéficiaire
@@ -122,19 +177,46 @@
<p class="p-12 text-gray-500 text-center text-md">Il n'y a plus de place disponible</p>
{{end}}
{{if .ViewState.subscribers}}
<h2 id="subscribers-title" class="text-lg font-medium text-gray-900 mt-10">Inscrits</h2>
{{if ne (index .ViewState.event.Owners 0) .Group.ID}}
<h2 id="subscribers-title" class="text-lg font-medium text-gray-900 mt-10">Bénéficiaires {{.Group.Data.name}} inscrits</h2>
<div class="mt-2">
{{range .ViewState.subscribers}}
<ul class="p-1">
<a href="/app/beneficiaries/{{.ID}}">
<li class="inline-flex text-sm p-2"><img class="h-6 w-6 rounded-co mr-2" src="/app/beneficiaries/{{.ID}}/picture"> {{.Data.first_name}} {{.Data.last_name}}</li>
{{$evid := .ViewState.event.ID}}
{{range .ViewState.event.Subscriptions}}
{{if eq $.Group.ID .Data.subscribed_by.group.id}}
<div class="flex justify-between border">
<div>
<a href="/app/beneficiaries/{{.Subscriber}}">
<li class="inline-flex text-sm p-2"><img class="h-6 w-6 rounded-co mr-2" src="/app/beneficiaries/{{.Subscriber}}/picture"> {{ (index $.ViewState.subscribers .Subscriber).Data.first_name }} {{ (index $.ViewState.subscribers .Subscriber).Data.last_name }}
</a>
</ul>
{{end}}
</div>
<div class="flex items-center">
<a href="/app/agenda/{{$evid}}/{{.Subscriber}}/delete" class="inline-flex">
<button type="button" class="w-full mr-2 py-1 px-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-red">Retirer</button></a>
<!-- <a href="/app/agenda/{{$evid}}/{{.Subscriber}}/delete" class="inline-flex font-bold text-co-red">x</a> -->
</li>
</div>
</div>
{{end}}
{{end}}
</ul>
</div>
{{end}}
{{end}}
</div>
</section>
</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">
<div class="space-y-6 lg:col-start-1 lg:col-span-2">
<section aria-labelledby="event-documents">
<div class="bg-white mt-4 px-4 py-5 shadow sm:rounded-lg sm:px-6">
<h2 id="documents-title" class="text-lg font-medium text-gray-900">Documents</h2>
<div class="flex justify-between items-center">
<div>{{template "event_files" .}}</div>
</div>
</div>
</section>
</div>
</div>
</main>
{{ end }}

View File

@@ -0,0 +1,102 @@
{{define "content"}}
{{ if eq (index .ViewState.event.Owners 0) .Group.ID }}
<main class="py-10">
<div class="max-w-3xl mx-auto px-4 sm:px-6 md:flex md:items-center md:justify-between md:space-x-5 lg:max-w-7xl lg:px-8">
<div class="flex items-center space-x-5">
<div>
<h1 class="text-2xl font-bold text-gray-900">Bénéficiaires désinscrits de l'évènement {{.ViewState.event.Name}}</h1>
<p class="text-m font-medium text-gray-500">
{{if eq .ViewState.event.Startdate .ViewState.event.Enddate}}
Le {{(timeFrom .ViewState.event.Startdate).Format "02/01/2006"}}
{{else}}
Du {{(timeFrom .ViewState.event.Startdate).Format "02/01/2006"}} au {{(timeFrom
.ViewState.event.Enddate).Format "02/01/2006"}}
{{end}}
</p>
</div>
</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">
<a href="/app/agenda/{{.ViewState.event.ID}}" 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">Retour</button></a>
</div>
</div>
<table class="mt-4 min-w-full divide-y divide-gray-300 border-t border-gray-200">
<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 ">
Bénéficiaire
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Prescripteur
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Désinscrit par
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Date de suppression
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Motif
</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200 bg-white">
{{range .ViewState.event.DeletedSubscription}}
<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">
<img class="h-6 w-6 rounded-co mr-2" src="/app/beneficiaries/{{.Subscriber}}/picture" alt=" ">
{{ (index $.ViewState.subscribers .Subscriber).Data.first_name }} {{ (index
$.ViewState.subscribers .Subscriber).Data.last_name }}
</a>
</td>
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
<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">
<div class="flex"><img class="h-6 w-6 rounded-co mr-2"
src="/app/beneficiaries/{{.Data.unsubscribed_by.user.id}}/picture" alt=" ">
{{.Data.unsubscribed_by.user.display_name}}</div>
{{.Data.unsubscribed_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">
<div class="flex">{{.Data.motif}}</div>
</td>
</tr>
{{end}}
</tbody>
</table>
</main>
{{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 accès à
cette page</h3>
</div>
</div>
<div class="mt-5 sm:mt-6 sm:grid sm:grid-flow-row-dense sm:grid-cols-1">
<a href="/app/agenda/{{.ViewState.event.ID}}"
class="mt-3 inline-flex w-full justify-center rounded-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}}

View File

@@ -0,0 +1,105 @@
{{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">Anciens dispositifs</h1>
<div class="sm:flex sm:items-center">
<div class="sm:flex-auto">
<p class="mt-2 text-sm text-gray-700"></p>
</div>
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
</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}}
{{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">
<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}}
{{end}}
</tbody>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
{{end}}

View File

@@ -7,6 +7,13 @@
<p class="mt-2 text-sm text-gray-700"></p>
</div>
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
<a href="/app/agenda/history">
<button type="button"
class="inline-flex items-center justify-center mr-3 bg-white hover:bg-gray-50 border-gray-300 border px-4 py-2 text-gray-700 flex items-center text-sm rounded-2xl focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">
{{$.IconSet.Icon "hero:outline/calendar" "h-5 w-5 mr-3"}}
Historique
</button>
</a>
<a href="/app/agenda/create-event">
<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-ci-blue focus:ring-offset-2 sm:w-auto">
@@ -50,6 +57,7 @@
</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">
@@ -99,6 +107,7 @@
</tr>
</a>
{{end}}
{{end}}
</tbody>
</thead>
</table>

View File

@@ -0,0 +1,255 @@
{{ 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}}

View File

@@ -1,4 +1,63 @@
{{define "beneficiary_events"}}
<div class="px-4 py-6 sm:px-6">
{{ $calendarIcon := .IconSet.Icon "hero:outline/calendar" "h-6 w-6" }}
{{ $carIcon := .IconSet.Icon "tabler-icons:car" "h-6 w-6"}}
<div class="bg-white shadow sm:rounded-lg">
<div class="px-4 py-5 sm:px-6">
<h2 id="timeline-title" class="text-lg font-medium text-gray-900">Actions réalisées</h2>
</div>
<div class="border-t border-gray-200">
{{ $eventCount := len .ViewState.event }}
<ul role="list" class="divide-y divide-gray-200 flex-1">
{{if eq $eventCount 0}}
<li class="py-2 px-4">
<p class="py-5 mt-1 max-w-2xl text-sm text-gray-500">Aucun dispositif n'est prévu pour le moment.</p>
</li>
{{else}}
{{range .ViewState.event}}
{{if eq .Deleted false}}
<li class="py-5 px-4 flex">
<a href="{{.Db}}{{.ID}}" class="flex w-full">
<div class="flex-1 ml-3">
<div class="flex items-center">
{{if eq .Status 2}}
{{if eq .Icons "vehicle"}}
<span class="bg-co-green text-white rounded-full h-8 w-10 flex items-center justify-center">{{$carIcon}}</span>
{{else}}
<span class="bg-co-green text-white rounded-full h-8 w-10 flex items-center justify-center">{{$calendarIcon}}</span>
{{end}}
{{end}}
{{if eq .Status 1}}
{{if eq .Icons "vehicle"}}
<span class="bg-co-blue text-white rounded-full h-8 w-10 flex items-center justify-center">{{$carIcon}}</span>
{{else}}
<span class="bg-co-blue text-white rounded-full h-8 w-10 flex items-center justify-center">{{$calendarIcon}}</span>
{{end}}
{{end}}
{{if eq .Status 3}}
{{if eq .Icons "vehicle"}}
<span class="bg-gray-500 text-white rounded-full h-8 w-10 flex items-center justify-center">{{$carIcon}}</span>
{{else}}
<span class="bg-gray-500 text-white rounded-full h-8 w-10 flex items-center justify-center">{{$calendarIcon}}</span>
{{end}}
{{end}}
{{if eq .Date .DateEnd}}
<p class="text-sm font-medium text-gray-500"> &ensp;le {{(timeFrom .Date).Format "02/01/2006"}}</p>
{{else}}
<p class="text-sm font-medium text-gray-500">&ensp;du {{(timeFrom .Date).Format "02/01/2006"}} au {{(timeFrom .DateEnd).Format "02/01/2006"}}</p>
{{end}}
</div>
<p class="mt-1 text-sm text-gray-900">{{.Type}} - {{.Name}}</p>
</div>
</a>
</li>
{{end}}
{{end}}
{{end}}
</ul>
</div>
</div>
{{end}}

View File

@@ -81,7 +81,7 @@ x-data="{
{{end}}
<h3 class="text-lg">Ajouter un document</h3>
<form method="POST" action="/app/beneficiaries/e7616eac-4a87-4396-a505-23e0421b9c4c/documents" @submit="submit" enctype="multipart/form-data">
<form method="POST" action="/app/beneficiaries/{{.ViewState.beneficiary.ID}}/documents" @submit="submit" enctype="multipart/form-data">
<div class="md:grid md:grid-cols-6 p-2">
<div class="sm:col-span-2">
<label for="type" class="block text-sm font-medium text-gray-700">Type</label>

View File

@@ -0,0 +1,10 @@
{{define "beneficiary_organizations"}}
<div class="px-4 py-6 sm:px-6">
<h3 class="text-lg">Organisations gestionnaires du bénéficiaire</h3>
<ul class="my-8">
{{range .ViewState.organizations}}
<li class="text-sm ml-8">{{.Data.name}}</li>
{{end}}
</ul>
</div>
{{end}}

View File

@@ -20,7 +20,7 @@
email: ['required', 'email'],
phone_number: ['required', 'regexMatch:^((\\+)33|0)[1-9](\\d{2}){4}$'],
birthdate: ['required'],
file_number: ['optional'],
file_number: ['required'],
},
formValidation: {
valid: false,
@@ -100,6 +100,13 @@
x-model="fields.birthdate" @blur="validateField('birthdate')"
:class="formValidation.fields.birthdate.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
<div class="col-span-6 sm:col-span-3">
<label for="file_number" class="block text-sm font-medium text-gray-700">Numéro de dossier (CAF / Pole Emploi ...)</label>
<input type="text" name="file_number" id="file_number" placeholder=""
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.file_number" @blur="validateField('file_number')"
:class="formValidation.fields.file_number.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
</div>
</div>
</div>
@@ -114,14 +121,6 @@
<div class="mt-5 space-y-6 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="file_number" class="block text-sm font-medium text-gray-700">Numéro de dossier (allocataire, ...)</label>
<input type="text" name="file_number" id="file_number" placeholder=""
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.file_number" @blur="validateField('file_number')"
:class="formValidation.fields.file_number.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
<div class="col-span-6 sm:col-span-3">
<label for="gender" class="block text-sm font-medium text-gray-700">Genre</label>
<div class="sm:mt-0 sm:col-span-2">

View File

@@ -69,6 +69,12 @@
<dd class="mt-1 text-sm text-gray-900">{{.ViewState.beneficiary.Data.address.properties.label}}</dd>
</div>
{{end}}
{{if .ViewState.beneficiary.Data.file_number}}
<div class="sm:col-span-1">
<dt class="text-sm font-medium text-gray-500">Numéro de dossier (CAF / Pole emploi)</dt>
<dd class="mt-1 text-sm text-gray-900">{{.ViewState.beneficiary.Data.file_number}}</dd>
</div>
{{end}}
</dl>
</div>
</div>
@@ -89,11 +95,11 @@
class="block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md">
<!-- <option value="notes">Notes</option> -->
<option value="journeys">Déplacements</option>
<!-- <option value="journeys">Déplacements</option>
<option value="vehicles">Véhicules</option>
<option value="events">Dispositifs</option>
<option value="events">Dispositifs</option> -->
<option value="documents">Documents</option>
</select>
@@ -107,7 +113,7 @@
:class="tab == 'notes' ? 'border-co-blue text-co-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'">
Notes </a> -->
<a href="#" @click="tab = 'journeys'"
<!-- <a href="#" @click="tab = 'journeys'"
class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm"
:class="tab == 'journeys' ? 'border-co-blue text-co-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'">
Déplacements </a>
@@ -120,32 +126,32 @@
<a href="#" @click="tab = 'events'"
class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm"
:class="tab == 'events' ? 'border-co-blue text-co-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'">
Dispositifs </a>
Dispositifs </a> -->
<a href="#" @click="tab = 'documents'"
class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm"
:class="tab == 'documents' ? 'border-co-blue text-co-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'">
Documents </a>
<a href="#" @click="tab = 'organizations'"
class="whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm"
:class="tab == 'organizations' ? 'border-co-blue text-co-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'">
Gestionnaires </a>
</nav>
</div>
</div>
</div>
<div x-show="tab == 'journeys'">{{template "beneficiary_journeys" .}}</div>
<div x-show="tab == 'vehicles'">{{template "beneficiary_vehicles" .}}</div>
<div x-show="tab == 'events'">{{template "beneficiary_events" .}}</div>
<div x-show="tab == 'documents'">{{template "beneficiary_files" .}}</div>
<div x-show="tab == 'notes'">{{template "beneficiary_notes" .}}</div>
<div x-show="tab == 'organizations'">{{template "beneficiary_organizations" .}}</div>
</div>
</div>
</section>
</div>
<section aria-labelledby="timeline-title" class="lg:col-start-3 lg:col-span-1">
<div class="bg-white px-4 py-5 shadow sm:rounded-lg sm:px-6">
<h2 id="timeline-title" class="text-lg font-medium text-gray-900">Actions réalisées</h2>
<p class="p-12 text-gray-500 text-center text-md">Aucune action réalisée pour le moment</p>
</div>
{{template "beneficiary_events" .}}
</section>
</div>
</main>

View File

@@ -21,7 +21,7 @@
email: ['required', 'email'],
phone_number: ['required', 'regexMatch:^((\\+)33|0)[1-9](\\d{2}){4}$'],
birthdate: ['required'],
file_number: ['optional'],
file_number: ['required'],
},
formValidation: {
valid: false,
@@ -101,6 +101,15 @@
x-model="fields.birthdate" @blur="validateField('birthdate')"
:class="formValidation.fields.birthdate.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
<div class="col-span-6 sm:col-span-3">
<label for="file_number" class="block text-sm font-medium text-gray-700">Numéro de dossier (CAF / Pole Emploi ...)</label>
<input type="text" name="file_number" id="file_number"
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.file_number" @blur="validateField('file_number')"
:class="formValidation.fields.file_number.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
</div>
</div>
</div>
@@ -114,15 +123,6 @@
</div>
<div class="mt-5 space-y-6 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="file_number" class="block text-sm font-medium text-gray-700">Numéro de dossier (allocataire, ...)</label>
<input type="text" name="file_number" id="file_number"
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.file_number" @blur="validateField('file_number')"
:class="formValidation.fields.file_number.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
<div class="col-span-6 sm:col-span-3">
<label for="gender" class="block text-sm font-medium text-gray-700">Genre</label>
<div class="sm:mt-0 sm:col-span-2">

View File

@@ -10,6 +10,7 @@
</div>
<ul role="list" class="divide-y divide-gray-200 flex-1">
{{range .}}
{{if eq .Deleted false}}
<li class="py-2 px-4 flex">
<a href="/app/agenda/{{.ID}}" class="flex w-full">
<div class="ml-3">
@@ -18,6 +19,7 @@
</a>
</li>
{{end}}
{{end}}
</ul>
<a href="/app/agenda/">

View File

@@ -1,5 +1,5 @@
{{define "beneficiaries_widget"}}
<div class="col-span-1 bg-white rounded-2xl shadow divide-y divide-gray-200">
<div class="col-span-1 bg-white rounded-2xl shadow divide-y divide-gray-200 flex flex-col">
<div class="-ml-4 -mt-2 px-4 py-2 flex items-center justify-between flex-wrap sm:flex-nowrap">
<div class="ml-4 mt-2">
<h3 class="text-lg leading-6 font-medium text-gray-900">Bénéficiaires</h3>
@@ -9,7 +9,7 @@
<button type="button" class="relative inline-flex items-center px-4 py-2 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-co-blue hover:bg-co-blue focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">Voir</button>
</div> -->
</div>
<ul role="list" class="divide-y divide-gray-200">
<ul role="list" class="divide-y divide-gray-200 flex-1">
{{range .latest}}
<li class="py-2 px-4 flex">
<a href="/app/beneficiaries/{{.ID}}" class="flex w-full">

View File

@@ -25,6 +25,11 @@
<input id="ar" type="hidden" value="{{.ViewState.group.Data.arrive.geometry.coordinates}}">
<input id="des" type="hidden" value="{{.ViewState.group.Data.depart.geometry.coordinates}}">
<input id="arri" type="hidden" value="{{.ViewState.group.Data.arrive.geometry.coordinates}}">
{{range .ViewState.beneficiaries}}
{{if (index $.ViewState.groups .ID) }}
<input id="passager" type="hidden"value="{{(index $.ViewState.groups .ID).Data.depart.geometry.coordinates}}">
{{end}}
{{end}}
<div>
<span id="polyline-info-content"></span>
@@ -100,7 +105,7 @@ function errorRoute() {
var br = (wwr[0])
destCoord = [r, br]
map.setZoom(9);
//console.log("Ici : " [depCoord[0],depCoord[1]],[destCoord[0],destCoord[1]])
map.fitBounds([[depCoord[0],depCoord[1]],[destCoord[0],destCoord[1]]],{padding: 40});
}
@@ -115,10 +120,8 @@ function errorRoute() {
if (rideDuration != null && rideDistance != null) {
document.getElementById("polyline-info-content").innerHTML = "Durée : " + (Math.round(((rideDuration / 60) + Number.EPSILON) * 100) / 100) + " min<br/>Distance : " + rideDistance + " km";
}
// $("#polyline-str").val(polylineString);
// $("#ride-duration").val(rideDuration);
// $("#ride-distance").val(rideDistance);
console.log("rideDuration :", rideDuration, ", rideDistance ",rideDistance)
// console.log("rideDuration :", rideDuration, ", rideDistance ",rideDistance)
if(polylineCoord != null && polylineCoord.length > 0 ){
drawPolylineOnMap(polylineCoord)
@@ -130,10 +133,9 @@ function createPolyline() {
destination = [r, br]
console.log("origin : ", origin)
if(origin != null && destination != null && origin != "" && destination != ""){
console.log("Get polyline infos")
var hash_locs = [];
hash_locs.push({
'lat' : (origin[1]),
@@ -156,17 +158,15 @@ function createPolyline() {
success : retrievePolylineInfo,
error: routeNotOptimized(body),
});
console.log("JSON.stringify(body)",JSON.stringify(body))
}
}
var depCoord = []
var destCoord = []
var other = []
var a, b
depCoord = [a, b]
console.log("yeeesss: ", a)
//////////////////////////////
//mapboxgl.accessToken = 'pk.eyJ1Ijoic291a2FpbmFsYWZkaWxpIiwiYSI6ImNsYjB1djUxNjAwaWQzdm82dnJ5OXJrZzcifQ.0i8xkskwRps3W1PFwApL_Q';
const map = new maplibregl.Map({
container: 'map',
style: 'https://api.maptiler.com/maps/streets/style.json?key=get_your_own_OpIi9ZULNHzrESv6T2vL',
@@ -175,9 +175,24 @@ function createPolyline() {
});
map.addControl(new maplibregl.NavigationControl(), 'bottom-right');
var markers = []
var pass = []
//////////////////Code to add position in the map///////////////
var ii = document.querySelectorAll("#passager")
for (var i = 0; i < ii.length; i++){
var v = ii[i].value
var val = ii[i].value.split(' ')
const wl = val[0].split('[')
const wwl = val[1].split(']')
al = (wl[1]);
bl = (wwl[0])
other = [al, bl]
{var marker = new maplibregl.Marker()
.setLngLat([al, bl])//position of passager
.addTo(map);
pass.push(marker)}
}
//destination
var i = document.getElementById('de').value
var words = i.split(' ');
const w = words[0].split('[')
@@ -185,8 +200,6 @@ function createPolyline() {
a = (w[1]);
b = (ww[0])
depCoord = [a, b]
console.log("yeeesss: ", depCoord[0])
console.log(b)
//arrive
var ar = document.getElementById('ar').value
var wordsr = ar.split(' ');
@@ -195,7 +208,7 @@ function createPolyline() {
var r = (wr[1]);
var br = (wwr[0])
destCoord = [r, br]
console.log(br)
/////
{var marker = new maplibregl.Marker();
marker.setLngLat([a, b])//starting position
@@ -205,7 +218,7 @@ function createPolyline() {
center: [a, b]
});
console.log("again: ", a , b)
markers.push(marker)
createPolyline()
}

View File

@@ -63,7 +63,7 @@
</div>
<div class="col-span-5">
<label for="name" class="block text-sm font-medium text-gray-700">Nombre maximum de personne</label>
<input type="text" name="number" id="number"
<input type="number" name="number" id="number"
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.number" @blur="validateField('number')"
:class="formValidation.fields.number.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
@@ -158,34 +158,12 @@
</div>
<div class="mt-5 md:mt-0 md:col-span-2">
<!-- <div class="flex items-start">
<div class="flex items-center h-5">
<input id="ponctuelleuelle" name="ponctuelleuelle" type="checkbox"
class="focus:ring-co-blue h-4 w-4 text-co-blue border-gray-300 rounded">
</div>
<div class="ml-3 text-sm">
<label for="ponctuelleuelle" class=" text-lg font-medium leading-6 text-gray-900">ponctuelleuelle</label>
</div>
</div> -->
<!-- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ -->
<div x-data="{selectedListID: ''}" x-init="$watch('selectedListID', value => console.log(value))">
<input type="radio" value="recurrent" x-model="selectedListID">&nbsp Recurrent &nbsp&nbsp
<input type="radio" value="ponctuelle" x-model="selectedListID">&nbsp Ponctuelle
<!-- <p>value: <span x-text="selectedListID" name="selectedListID"></span></p> -->
<!-- <div x-data="{lists: [{id: 'ponctuelle', name: 'ponctuelle'}, {id: 'recurrent', name: 'recurrent'}], selectedListID: ''}">
<template x-for="list in lists" :key="list.id">
<div>
<input x-model="selectedListID" type="radio" :value="list.id.toString()" :id="list.name" >
<label :for="list.name" x-text="list.name"></label>
</div>
</template> -->
<input id="t" :name="selectedListID" type="hidden" :value="selectedListID">
<!-- <p name="selectedListID">Selected value: <code x-text="selectedListID" ></code></p> -->
<!-- ******************************* -->
<div class="sm:col-span-6" x-show="selectedListID == 'ponctuelle'" >
<div class="py-4 grid grid-cols-2">
<div class="lg:col-span-1">

View File

@@ -1,4 +1,5 @@
{{define "content"}}
<div x-data="{dialog: false, 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">Gestion du groupe</h1>
<div class="sm:flex sm:items-center">
@@ -122,162 +123,17 @@
</div>
</div>
</div>
</div>
<!-- *********************************** -->
<div class="lg:col-start-2 lg:col-span-2" 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.beneficiaries = data
this.current=page-1
this.state.group = data
}
}">
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8 mt-2 mb-4">
<div class="sm:flex sm:items-center">
<div class="sm:flex-auto">
{{template "map" .}}
</div>
</div>
</div>
<!-- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ -->
<div class="-my-2 -mx-4 overflow-x-auto sm:-mx-6 lg:-mx-8 mt-2">
<!-- -->
<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 du bénéficiaire
</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>
</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="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>
</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.email">
</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>
</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>
</div>
<div class="mt-8 max-w-3xl mx-auto grid grid-cols-1 gap-6 lg:max-w-7xl lg:grid-flow-col-dense lg:grid-cols-3">
<div class="mt-8 max-w-3xl mx-auto grid grid-cols-1 gap-6 lg:max-w-7xl lg:grid-flow-col-dense lg:grid-cols-1">
<div class="space-y-6 lg:col-start-1 lg:col-span-1">
<div class="bg-white shadow sm:rounded-2xl">
<h2 id="timeline-title" class="text-lg font-medium text-gray-900 p-4 sm:px-6">Ajouter un passager</h2>
<div class="border-t border-gray-200 px-4 py-5 sm:px-6">
{{if gt .ViewState.group.Data.number .ViewState.number}}
<form method="GET" >
<div x-data="{
text: '{{if .ViewState.search}}{{.ViewState.search.beneficiary.Data.first_name}} {{.ViewState.search.beneficiary.Data.last_name}}{{end}}',
@@ -325,18 +181,142 @@
</ul>
</div>
<div class="space-y-6 lg:col-start-1 lg:col-span-1 ">
{{ $departureField := "departure" }}
{{ $departureLabel := "Départ" }}
{{ $departure := .ViewState.departure }}
{{ template "address_autocomplete" dict "FieldName" $departureField "FieldLabel" $departureLabel "Address" $departure }}
{{ $destinationField := "destination" }}
{{ $destinationLabel := "Destination" }}
{{ $destination := .ViewState.destination }}
{{ template "address_autocomplete" dict "FieldName" $destinationField "FieldLabel" $destinationLabel "Address" $destination }}
</div>
</div>
<button type="submit"
class="rounded-2xl border border-transparent bg-co-blue px-4 py-2 my-4 mt-8 w-full 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">
Ajouter
</button>
{{else}}
<p>Vous avez atteint le nombre maximum de passagers</p>
{{end}}
</form>
</div>
</div>
</div>
</div>
</div>
<!-- *********************************** -->
<div class="lg:col-start-2 lg:col-span-2">
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8 mt-2 mb-4">
<div class="sm:flex sm:items-center">
<div class="sm:flex-auto">
{{template "map" .}}
</div>
</div>
</div>
<div class="-my-2 -mx-4 overflow-x-auto sm:-mx-6 lg:-mx-8 mt-2">
<!-- -->
<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 du bénéficiaire
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
Départ
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
Déstination
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200 bg-white">
{{range .ViewState.beneficiaries}}
{{if (index $.ViewState.groups .ID) }}
<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/' + `{{.ID}}`+ '/picture'" alt="">
</div>
<a :href="'/app/beneficiaries/' + `{{.ID}}`">
<div class="flex items-center">
<div class="ml-4">
<div class="text-co-blue hover:text-co-blue"><span
>{{.Data.first_name}}</span> <span
>{{.Data.last_name}}</span></div>
</div>
</div></a>
</td>
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
{{if (index $.ViewState.groups .ID).Data.depart}}
<div class="text-gray-900" >{{(index $.ViewState.groups .ID).Data.depart.properties.label}}</div>
{{else}}
<div class="text-gray-900" >...</div>
{{end}}
</td>
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
{{if (index $.ViewState.groups .ID).Data.arrive}}
<div class="text-gray-900" >{{(index $.ViewState.groups .ID).Data.arrive.properties.label}}</div>
{{else}}
<div class="text-gray-900" >...</div>
{{end}}
</td>
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
<a :href="'/app/journeys/groups_covoiturage/create/{{(index $.ViewState.groups .ID).ID}}/{{(index $.ViewState.groups .ID).Groupid}}/{{(index $.ViewState.groups .ID).Memberid}}'">
<div class="flex items-center">
<div class="ml-4">
<div class="text-co-blue hover:text-co-blue"><span
>retirer</span> </div>
</div>
</a>
</td>
</tr>
{{end}}
{{end}}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -63,15 +63,6 @@
</div>
<div class="ml-4">
<!-- <div class="font-medium text-gray-900"> <span
x-text="beneficiary.data.name"></span> </div> -->
<!-- <div class="flex items-center font-medium text-gray-700 text-xl">
{{$.IconSet.Icon "hero:outline/user-group" "flex-shrink-0 mr-1.5 h-5 w-5"}}
<p>
<span
x-text="beneficiary.data.name"></span>
</p>
</div> -->
<div class="truncate">
<div class="flex text-sm">
<p class="font-medium text-lg text-co-blue truncate" x-text="beneficiary.data.name"></p>
@@ -99,7 +90,6 @@
</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">

View File

@@ -0,0 +1,32 @@
{{define "content"}}
<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 ce passager </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/journeys/groups_covoiturage/create/{{.ViewState.groupid}}" 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>
{{end}}

View File

@@ -151,14 +151,14 @@
x-transition:leave-start="transform opacity-100 scale-100"
x-transition:leave-end="transform opacity-0 scale-95">
<!-- Active: "bg-gray-100", Not Active: "" -->
<a href="/app/profile/{{.UserID}}" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
<a href="/app/members/{{.UserID}}" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
id="user-menu-item-0">Votre profil</a>
<a href="/app/profile/{{.UserID}}/update" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
<a href="/app/members/{{.UserID}}/update" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
id="user-menu-item-1">Paramètres</a>
<!-- <a href="/app/disconnect" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
id="user-menu-item-2">Se déconnecter</a> -->
<a href="/auth/disconnect" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
id="user-menu-item-2">Se déconnecter</a>
</div>
</div>
</div>

View File

@@ -16,10 +16,10 @@
</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> -->
<a href="/app/profile/{{.ViewState.admins.ID}}/update" class="inline-flex"><button type="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>
{{end}}
</div>
</div>
@@ -58,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>

View 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}}

View File

@@ -1,4 +1,5 @@
{{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>
@@ -17,8 +18,9 @@
first_name: ['required'],
last_name: ['required'],
email: ['required', 'email'],
phone_number: ['required', 'regexMatch:^((\\+)33|0)[1-9](\\d{2}){4}$'],
phone_number: ['regexMatch:^((\\+)33|0)[1-9](\\d{2}){4}$'],
},
formValidation: {
valid: false,
fields: {
@@ -119,7 +121,7 @@
<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/profile/{{.ViewState.ID}}">
<a href="/app/members/{{.ViewState.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>
@@ -128,4 +130,26 @@
</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}}

View File

@@ -1,7 +1,19 @@
{{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">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">
<div class="mt-8 flex flex-col">
@@ -11,13 +23,22 @@
<table class="min-w-full divide-y divide-gray-300">
<thead class="bg-gray-50">
<tr>
<!-- <th scope="col"
<th scope="col"
class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Statut
</th> -->
</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">
Véhicule
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Prescripteur
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Gestionnaire
</th>
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900 sm:pl-6">
Beneficiaire
</th>
@@ -33,21 +54,74 @@
{{range .ViewState.bookings}}
<tr>
<!-- <td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
<div class="text-gray-900" >aa</div>
</td> -->
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
<div class="text-gray-900" >Voiture</div>
<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 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.booked_by}}
{{if .Data.booked_by.user}}
<a href="/app/members/{{.Data.booked_by.user.id}}" class="flex inline">
<img class="h-5 w-5 rounded-co mr-1"
src="/app/members/{{.Data.booked_by.user.id}}/picture" alt="">
{{.Data.booked_by.user.display_name}}
</a>
{{end}}
{{if .Data.booked_by.group}}
({{.Data.booked_by.group.name}})
{{end}}
{{end}}
</td>
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
{{if gt (len (index $.ViewState.vehicles_map .Vehicleid).Administrators) 0}}
{{ (index $.ViewState.groups_map (index (index $.ViewState.vehicles_map .Vehicleid).Administrators 0)).Data.name }}
{{end}}
</td>
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
{{if not .Data.administrator_unavailability}}
<div class="text-gray-900" ><img class="h-6 w-6 rounded-co"
src="/app/beneficiaries/{{.Driver}}/picture" alt=""></div>
{{end}}
</td>
<!-- <td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
<div class="text-gray-900" >aa</div>
</td> -->
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
{{if not .Data.administrator_unavailability}}
<div class="text-gray-900" >Du {{(timeFrom .Startdate).Format "02/01/2006"}} au {{(timeFrom .Enddate).Format "02/01/2006"}}</div>
{{else}}
<div class="text-gray-900" >Du {{(timeFrom .Unavailablefrom).Format "02/01/2006"}} au {{(timeFrom .Unavailableto).Format "02/01/2006"}}</div>
{{end}}
</td>
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6">
<a href="/app/vehicles/bookings/{{.ID}}"

View File

@@ -147,6 +147,20 @@
<div class="lg:col-start-2 lg:col-span-2">
{{if .ViewState.searched}}
<div class="bg-white px-4 py-5 shadow sm:rounded-2xl sm:px-6">
<h2 id="timeline-title" class="text-lg font-medium text-gray-900">Documents demandés</h2>
<table>
<tbody>
{{range .ViewState.search.mandatory_documents}}
<tr>
<td class="whitespace-nowrap py-4 px-3 text-sm text-gray-500">
{{index $.ViewState.search.file_types_map .}}
</td>
</tr>
{{end}}
</tbody>
</table>
</div>
<div class="bg-white mt-8 px-4 py-5 shadow sm:rounded-2xl sm:px-6">
<h2 id="timeline-title" class="text-lg font-medium text-gray-900">Véhicules disponibles</h2>
<div class="mt-8 flex flex-col">
<div class="-my-2 -mx-4 overflow-x-auto sm:-mx-6 lg:-mx-8">

View File

@@ -34,7 +34,7 @@
<tbody class="divide-y divide-gray-200 bg-white">
{{range .ViewState.bookings}}
<tr>
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm sm:pl-6 text-center">
<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é

View File

@@ -7,6 +7,10 @@
<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)
@@ -28,6 +32,65 @@
<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>

View File

@@ -6,18 +6,50 @@
<div class="sm:flex-auto">
<p class="mt-2 text-sm text-gray-700"></p>
</div>
<!-- <div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none">
<button type="button"
<div class="mt-4 sm:mt-0 sm:ml-16 sm:flex-none"
x-data="{
changeVehicle: false,
selectedvehicle: ''
}">
<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">
<!-- <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>
</div> -->
</a> -->
<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>
<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-3xl bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-sm sm:p-6">
<div class="text-center">
<h3 class="text-lg font-medium leading-6 text-gray-900" id="modal-title">Changer de véhicule</h3>
</div>
<form method="POST" action="/app/vehicles-management/bookings/{{.ViewState.booking.ID}}/change-vehicle" class="mt-4">
<select x-model="selectedvehicle" id="vehicle" name="vehicle" class="mt-1 block w-full rounded-2xl border-gray-300 py-2 pl-3 pr-10 text-base focus:border-co-blue focus:outline-none focus:ring-co-blue sm:text-sm">
<option value=""></option>
{{range .ViewState.alternative_vehicles }}
<option value="{{.ID}}">{{.Data.licence_plate}} - {{.Data.name}} ({{.Type}})</option>
{{end}}
</select>
<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">Changer de véhicule</button>
</div>
</form>
<div class="mt-5 sm:mt-6">
<button @click="changeVehicle=false" type="button" class="inline-flex w-full justify-center max-w-xs bg-white hover:bg-gray-50 border-gray-300 border px-4 py-2 text-gray-700 items-center text-sm rounded-2xl focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">Annuler</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mt-8 max-w-3xl mx-auto grid grid-cols-1 gap-6 lg:max-w-7xl lg:grid-flow-col-dense lg:grid-cols-3">
<div class="space-y-6 lg:col-start-1 lg:col-span-1">
@@ -129,7 +161,7 @@
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4">
<dt class="text-sm font-medium text-gray-500">Type</dt>
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
Voiture</dd>
{{.ViewState.vehicle.Type}}</dd>
</div>
{{if .ViewState.vehicle.Data.address}}
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4">

View File

@@ -0,0 +1,39 @@
{{define "content"}}
<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 d'annulation</h3>
<div class="mt-2">
<p class="text-sm text-gray-500">Souhaitez-vous vraiment annuler cette réservaton ?</p>
</div>
<div class="col-span-6">
<label for="motif" class="block text-sm font-medium text-gray-700">Motif</label>
<div class="mt-1">
<textarea rows="4" name="motif" id="motif"
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>
</div>
</div>
<div class="mt-5 sm:mt-6 sm:grid sm:grid-flow-row-dense sm:grid-cols-2">
<a href="/app/vehicles-management/bookings/{{.ViewState.booking.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>
{{end}}

View File

@@ -834,14 +834,14 @@ html {
grid-column: span 5 / span 5;
}
.m-2 {
margin: 0.5rem;
}
.m-4 {
margin: 1rem;
}
.m-2 {
margin: 0.5rem;
}
.-mx-4 {
margin-left: -1rem;
margin-right: -1rem;
@@ -977,6 +977,10 @@ html {
margin-bottom: 2.5rem;
}
.ml-8 {
margin-left: 2rem;
}
.-mt-2 {
margin-top: -0.5rem;
}
@@ -1224,16 +1228,6 @@ html {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-y-4 {
--tw-translate-y: 1rem;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-y-0 {
--tw-translate-y: 0px;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.scale-95 {
--tw-scale-x: .95;
--tw-scale-y: .95;
@@ -1665,6 +1659,11 @@ html {
background-color: rgb(238 242 255 / var(--tw-bg-opacity));
}
.bg-black {
--tw-bg-opacity: 1;
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
}
.bg-indigo-600 {
--tw-bg-opacity: 1;
background-color: rgb(79 70 229 / var(--tw-bg-opacity));
@@ -1680,11 +1679,6 @@ html {
background-color: rgb(107 114 128 / var(--tw-bg-opacity));
}
.bg-black {
--tw-bg-opacity: 1;
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
}
.bg-opacity-75 {
--tw-bg-opacity: 0.75;
}
@@ -2047,11 +2041,6 @@ html {
color: rgb(0 0 0 / var(--tw-text-opacity));
}
.text-green-600 {
--tw-text-opacity: 1;
color: rgb(22 163 74 / var(--tw-text-opacity));
}
.placeholder-gray-500::-moz-placeholder {
--tw-placeholder-opacity: 1;
color: rgb(107 114 128 / var(--tw-placeholder-opacity));
@@ -2306,11 +2295,6 @@ html {
background-color: rgb(29 78 216 / var(--tw-bg-opacity));
}
.hover\:bg-indigo-700:hover {
--tw-bg-opacity: 1;
background-color: rgb(67 56 202 / var(--tw-bg-opacity));
}
.hover\:bg-opacity-5:hover {
--tw-bg-opacity: 0.05;
}
@@ -2494,14 +2478,14 @@ html {
grid-column: span 4 / span 4;
}
.sm\:col-start-2 {
grid-column-start: 2;
}
.sm\:col-start-1 {
grid-column-start: 1;
}
.sm\:col-start-2 {
grid-column-start: 2;
}
.sm\:-mx-6 {
margin-left: -1.5rem;
margin-right: -1.5rem;
@@ -2573,10 +2557,6 @@ html {
max-width: 24rem;
}
.sm\:max-w-lg {
max-width: 32rem;
}
.sm\:flex-auto {
flex: 1 1 auto;
}
@@ -2589,23 +2569,6 @@ html {
flex: 1 1 0%;
}
.sm\:translate-y-0 {
--tw-translate-y: 0px;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.sm\:scale-95 {
--tw-scale-x: .95;
--tw-scale-y: .95;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.sm\:scale-100 {
--tw-scale-x: 1;
--tw-scale-y: 1;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.sm\:grid-flow-row-dense {
grid-auto-flow: row dense;
}
@@ -2646,10 +2609,6 @@ html {
gap: 1rem;
}
.sm\:gap-3 {
gap: 0.75rem;
}
.sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));

0
web/tailwind.config.js Normal file → Executable file
View File