Compare commits

...
4 Commits
17 changed files with 2111 additions and 1 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
# Sondages (vote) # Sondages (vote)
Sondages, façon Framadate ! Sondages, façon Framadate ! Pour le logiciel [Paheko](https://paheko.cloud/)
## Fonctionnalités ## Fonctionnalités
Sondage de disponibilités (grille de créneaux) ou sondage simple (question à choix), avec génération automatique de créneaux récurrents. Sondage de disponibilités (grille de créneaux) ou sondage simple (question à choix), avec génération automatique de créneaux récurrents.
+130
View File
@@ -0,0 +1,130 @@
{{* Modifier sondage *}}
{{if $subconf == "edit_son"}}
<div class="card" id="form-nouveau">
{{#load assign="s" id=$_GET.id|intval}}
{{if !$s.id}}
{{:error message="Ce sondage n'existe pas (ou plus)."}}
{{/if}}
<form method="post" action="">
<fieldset class="entree">
<legend>Modifier Sondage ({{$s.mode}})</legend>
<dl>
{{:input type="hidden" name="id" default=$s.id required=true}}
{{:input type="text" name="titre" label="Titre" default=$s.titre required=true}}
{{:input type="textarea" cols=40 rows=3 name="description" label="Description complète" default=$s.description required=false}}
{{:input type="select" name="style" label="Style de sondage" default=$s.style options=$module.config.sondage_styles required=true}}
{{:button type="submit" name="save_son" label="Enregistrer les modifications" class="main" value="%d"|args:$s.id}}
</dl>
</fieldset>
<div class="card">
<h2>Résultats</h2>
{{if $s.options|count}}
<table style="width:100%; border-collapse:collapse;">
{{#foreach from=$s.options item="o"}}
{{:assign var="n_o" from="tot_opt.%s"|args:$o.id}}
<tr>
<th style="text-align:left; padding:.4rem .3rem; border-bottom:1px solid #eceae8; font-weight:normal;">{{$o.texte}}</th>
<td style="padding:.4rem .3rem; border-bottom:1px solid #eceae8; text-align:right; white-space:nowrap;">
{{if $n_o > 0 && $n_o == $max_opt}}<span class="best">&#9733; {{$n_o}} voix</span>{{else}}{{$n_o}} voix{{/if}}
</td>
<td style="padding:.4rem .3rem; border-bottom:1px solid #eceae8; text-align:right;">
{{:button type="submit" name="del_opt_son" label="Supprimer cette option" class="mini" shape="minus" value="%d"|args:$s.id}}
</td>
</tr>
{{/foreach}}
</table>
<p class="aide">{{$nb_votants_simple}} votant(s) au total.</p>
{{else}}
<p class="vide">Rien à afficher pour l'instant.</p>
{{/if}}
</div>
{{if $s.mode == "simple"}}
<fieldset class="entree">
<legend>Ajouter une option.</legend>
<dl>
{{:input type="text" name="texte" label="Texte de l'option" placeholder="ex. Samedi matin" required=false}}
{{:button type="submit" name="add_opt_son" label="Ajouter" class="main" value="%d"|args:$s.id}}
</dl>
</fieldset>
{{else}}
{{:include file="_creneaux.html"}}
{{/if}}
<fieldset class="entree">
<legend>Je confirme vouloir supprimer définitivement ce sondage et toutes les réponses.</legend>
<dl>
{{:button type="submit" name="del_son" label="Supprimer le sondage" class="danger" value="%d"|args:$s.id}}
</dl>
</fieldset>
</form>
{{else}}
{{* Liste des sondages *}}
<div class="card">
<h2>Sondages en cours et archivés</h2>
<ul class="sondages">
{{:assign var="au_moins_un_ouvert" value=false}}
{{:assign var="au_moins_un_ferme" value=false}}
{{#load type="sondage" order="id DESC"}}
{{:assign var="nb_c" value=0}}{{if $creneaux|count}}{{:assign var="nb_c" value=$creneaux|count}}{{/if}}
{{:assign var="nb_v" value=0}}{{if $votes|count}}{{:assign var="nb_v" value=$votes|count}}{{/if}}
{{:assign var="nb_o" value=0}}{{if $options|count}}{{:assign var="nb_o" value=$options|count}}{{/if}}
{{:assign var="nb_vs" value=0}}{{if $votes_simple|count}}{{:assign var="nb_vs" value=$votes_simple|count}}{{/if}}
{{if !$ferme}}
{{:assign var="au_moins_un_ouvert" value=true}}
<li><a href="{{$_url}}?id={{$id}}&nav=conf&conf=edit_son">{{$titre}}<small>{{if $mode == "simple"}}{{$nb_o}} option(s) — {{$nb_vs}} votant(s){{else}}{{$nb_c}} créneau(x) — {{$nb_v}} participant(s){{/if}}</small></a></li>
{{else}}
{{:assign var="au_moins_un_ferme" value=true}}
{{/if}}
{{/load}}
{{if !$au_moins_un_ouvert}}
<li><p class="vide">Aucun sondage en cours.{{if $est_admin}} Créez-en un ci-dessous.{{/if}}</p></li>
{{/if}}
</ul>
</div>
{{/load}}
</div>
{{* Nouveau sondage *}}
{{elseif !$subconf || $subconf == "new_son"}}
<div class="card" id="form-nouveau">
<h2>Nouveau sondage</h2>
<form method="post" action="">
<fieldset class="entree">
<legend>Type de sondage</legend>
<dl>
{{:input type="text" name="titre" label="Titre" default=$s.titre required=true}}
{{:input type="textarea" cols=40 rows=3 name="description" label="Description complète" default=$s.description required=false}}
{{*#foreach from=$calendriers_liste item="cd_opt"}}
{{:assign var="calendriers_options.%s"|args:$cd_opt.id label=$cd_opt.nom}}
{{/foreach*}}
{{:assign var="sondage_modes.creneaux" label="Disponibilités (grille de créneaux)"}}
{{:assign var="sondage_modes.simple" label="Sondage simple (question à choix)"}}
{{if !$module.config.sondage_styles }}
{{:assign var="sondage_styles.prive" label="Sondage privé (Conseil Collégial/CA)" mcat="privat"}}
{{:assign var="sondage_styles.membre" label="Sondage membre (membres logués)" mcat="logged"}}
{{:assign var="sondage_styles.public" label="Sondage public (tous)" mcat="all"}}
{{:save key="config" purge=false sondage_styles=$sondage_styles}}
{{else}}
{{:assign var="sondage_styles" value=$module.config.sondage_styles}}
{{/if}}
{{*:debug cal=$sondage_types*}}
{{:input type="select" name="mode" label="Mode" options=$sondage_modes required=true}}
{{:input type="select" name="style" label="Style de sondage" options=$sondage_styles required=true}}
{{:button type="submit" name="create_son" label="Créer le sondage" class="main" value="1"}}
</dl>
</fieldset>
</form>
</div>
{{* Paramètres globaux *}}
{{elseif !$subconf || $subconf == "edit_con"}}
{{if $est_admin}}
{{:include file="manage/_config.html"}}
{{else}}
<p class="vide">Ces paramètres sont réservés à l'administrateur.</p>
{{/if}}
{{/if}}
+165
View File
@@ -0,0 +1,165 @@
{{* ---------- Ligne en cours de modification ---------- *}}
{{:assign var="edit_nom" value=$_POST.edit_nom|strval}}
{{#foreach from=$s.votes item="v"}}
{{if $v.nom == $edit_nom}}
{{:assign var="edit_choix" value=$v.choix}}
{{:assign var="edit_remarque" value=$v.remarque}}
{{/if}}
{{/foreach}}
{{* ---------- Créneau en cours de modification ---------- *}}
{{:assign var="edit_creneau" value=$_POST.edit_creneau|strval}}
{{#foreach from=$s.creneaux item="c"}}
{{if $c.id == $edit_creneau}}
{{:assign var="edit_c_titre" value=$c.titre}}
{{:assign var="edit_c_date" value=$c.date}}
{{:assign var="edit_c_debut" value=$c.debut}}
{{:assign var="edit_c_fin" value=$c.fin}}
{{:assign var="edit_c_ok" value=1}}
{{/if}}
{{/foreach}}
{{*:debug s=$s creneaux=$creneaux*}}
<div class="card">
<h2>Créneaux TODO</h2>
<form method="post" action="">
<div class="scroll">
<table class="grille">
<thead>
<tr>
{{#foreach from=$creneaux item="c"}}
{{:assign var="th_oui" from="tot_oui.%s"|args:$c.id}}{{:assign var="th_peut" from="tot_peut.%s"|args:$c.id}}
<th class="creneau">{{if $c.titre|trim}}<em class="titre">{{$c.titre}}</em>{{/if}}{{if $c.date}}<b>{{$c.date|date_long}}</b><small>{{$c.debut}} → {{$c.fin}}</small>{{else}}<b>{{$c.label}}</b>{{/if}}
{{if $est_admin}}
{{if $th_oui < 1 && $th_peut < 1}}
{{:button type="submit" class="mini" name="edit_creneau" shape="edit" title="Modifier ce créneau" value="%d"|args:$c.id}}
{{/if}}
{{:button type="submit" class="mini" name="suppr_creneau" shape="delete" title="Supprimer ce créneau" value="%d"|args:$c.id}}
{{/if}}
</th>
{{/foreach}}
</tr>
</thead>
</table>
</div>
</form>
</div>
<div class="card">
{{if $edit_c_ok}}
<h2>Modifier ce créneau</h2>
<form method="post" action="" class="ajout">
{{*
<label>Titre <input type="text" name="titre" value="{{$edit_c_titre}}" placeholder="ex. Permanence atelier" /></label>
<label>Date <input type="date" name="date" value="{{$edit_c_date}}" required="required" /></label>
<label>de <input type="time" name="debut" value="{{$edit_c_debut}}" required="required" /></label>
<label>à <input type="time" name="fin" value="{{$edit_c_fin}}" required="required" /></label>
<button type="submit" name="rename_creneau" value="{{$edit_creneau}}">Enregistrer</button>
*}}
{{:input type="text" name="titre" placeholder="Ex. Permanence Atelier" label="Titre" default=$edit_c_titre }}
{{:input type="date" name="date" default=$edit_c_date label="Date" required=true}}
{{:input type="time" name="debut" default=$edit_c_debut label="de" required=true}}
{{:input type="time" name="fin" default=$edit_c_fin label="à" required=true}}
{{:button type="submit" name="rename_creneau" label="Modifier" value="%d"|args:$_POST.edit_creneau }}
<a class="retour" href="{{$_url}}?id={{$s.id}}">Annuler</a>
</form>
{{else}}
<h2>Ajouter un créneau</h2>
<form method="post" action="" class="ajout">
{{*
<label>Titre <input type="text" name="titre" placeholder="ex. Permanence atelier" /></label>
<label>Date <input type="date" name="date" required="required" /></label>
<label>de <input type="time" name="debut" value="19:00" required="required" /></label>
<label>à <input type="time" name="fin" value="21:00" required="required" /></label>
<button type="submit" name="add_creneau" value="1">Ajouter la colonne</button>
*}}
{{:input type="text" name="titre" placeholder="Ex. Permanence Atelier" label="Titre"}}
{{:input type="date" name="date" label="Date" required=true}}
{{:input type="time" name="debut" default="19:00" label="de" required=true}}
{{:input type="time" name="fin" default="21:00" label="à" required=true}}
{{:button type="submit" name="add_creneau" label="Ajouter la colonne" value="%d"|args:$s.id }}
</form>
{{/if}}
</div>
<div class="card">
<h2>Ajouter plusieurs créneaux (saisie libre)</h2>
<form method="post" action="">
<table style="width:100%; border-collapse:collapse;">
<thead><tr><th style="text-align:left; font-size:.85rem; color:#666;">Titre</th><th style="text-align:left; font-size:.85rem; color:#666;">Date</th><th style="text-align:left; font-size:.85rem; color:#666;">De</th><th style="text-align:left; font-size:.85rem; color:#666;">À</th></tr></thead>
<tbody>
{{#foreach count=5 key="i"}}
<tr>
<td>{{:input type="text" name="titre_%d"|args:$i placeholder="Ex. Permanence Atelier" label="Titre"}}</td>
<td>{{:input type="date" name="date_%d"|args:$i label="Date" required=true}}</td>
<td>{{:input type="time" name="debut_%d"|args:$i default="19:00" label="de" required=true}}</td>
<td>{{:input type="time" name="fin_%d"|args:$i default="21:00" label="à" required=true}}</td>
</tr>
{{/foreach}}
{{*
<tr>
<td><input type="text" name="titre_1" placeholder="ex. Permanence" /></td>
<td><input type="date" name="date_1" /></td><td>
<input type="time" name="debut_1" value="19:00" /></td>
<td><input type="time" name="fin_1" value="21:00" /></td>
</tr>
<tr>
<td><input type="text" name="titre_2" placeholder="ex. Permanence" /></td>
<td><input type="date" name="date_2" /></td>
<td><input type="time" name="debut_2" value="19:00" /></td>
<td><input type="time" name="fin_2" value="21:00" /></td>
</tr>
<tr>
<td><input type="text" name="titre_3" placeholder="ex. Permanence" /></td>
<td><input type="date" name="date_3" /></td>
<td><input type="time" name="debut_3" value="19:00" /></td>
<td><input type="time" name="fin_3" value="21:00" /></td>
</tr>
<tr>
<td><input type="text" name="titre_4" placeholder="ex. Permanence" /></td>
<td><input type="date" name="date_4" /></td>
<td><input type="time" name="debut_4" value="19:00" /></td>
<td><input type="time" name="fin_4" value="21:00" /></td>
</tr>
<tr>
<td><input type="text" name="titre_5" placeholder="ex. Permanence" /></td>
<td><input type="date" name="date_5" /></td>
<td><input type="time" name="debut_5" value="19:00" /></td>
<td><input type="time" name="fin_5" value="21:00" /></td>
</tr>
*}}
</tbody>
</table>
<p class="aide">Laissez la date vide pour ignorer une ligne. Seules les lignes avec une date seront ajoutées.</p>
{{:button type="submit" name="ajout_multiple" label="Ajouter ces créneaux" value="%d"|args:$s.id }}
{{*<p><button type="submit" name="ajout_multiple" value="1">Ajouter ces créneaux</button></p>*}}
</form>
</div>
<div class="card">
<h2>Générer des créneaux automatiquement</h2>
<form method="post" action="" class="ajout">
{{*
<label>Titre <input type="text" name="g_titre" placeholder="ex. Permanence atelier" /></label>
<label>de <input type="time" name="g_heure_debut" value="19:00" required="required" /></label>
<label>à <input type="time" name="g_heure_fin" value="21:00" required="required" /></label>
<label>Du <input type="date" name="g_debut_periode" required="required" /></label>
<label>au <input type="date" name="g_fin_periode" required="required" /></label>
<button type="submit" name="generer_creneaux" value="1">Générer les créneaux</button>
*}}
{{:input type="text" name="g_titre" placeholder="Ex. Permanence Atelier" label="Titre"}}
{{:input type="time" name="g_heure_debut" default="19:00" label="de" required=true}}
{{:input type="time" name="g_heure_fin" default="21:00" label="à" required=true}}
{{:input type="date" name="g_debut_periode" label="Du" required=true}}
{{:input type="date" name="g_fin_periode" label="au" required=true}}
{{:button type="submit" name="generer_creneaux" label="Générer les créneaux" value="%d"|args:$s.id }}
<div style="width:100%; display:flex; gap:1rem; flex-wrap:wrap; margin-top:.5rem;">
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="1" /> Lundi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="2" /> Mardi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="3" /> Mercredi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="4" /> Jeudi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="5" /> Vendredi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="6" /> Samedi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="7" /> Dimanche</label>
</div>
</form>
<p class="aide">Crée un créneau pour chaque jour correspondant dans la période choisie (ex. "tous les mardis du 1er au 30 septembre"). Limité à un an à partir de la date de début.</p>
</div>
+69
View File
@@ -0,0 +1,69 @@
{{* Navigation
{{#restrict section="web" level="write"}}
{{:assign _url="%sindex.html"|args:$module.url}}
{{else}}
{{if $is_logged==true}}
{{:assign _url="%sindex.html"|args:$module.url}}
{{else}}
{{:assign _url="%ssondage.html"|args:$module.url}}
{{/if}}
{{/restrict}}
*}}
<nav class="tabs">
{{*if $current == 'sondage'}}
{{#restrict section="web" level="write"}}
<aside>
{{:linkbutton label="Tous les sondages" shape="calendar" href="%s"|args:$_url}}
{{#foreach from=$calendriers_liste item="cd_tab"}}
{{:linkbutton label="%s"|args:$cd_tab.nom shape="calendar" href="%s?vue=%s&an=%s&mois=%s&cal=%s"|args:$_url:$vue:$an:$mois:$cd_tab.id}}
{{/foreach}}
</aside>
{{/restrict}}
{{/if*}}
{{* menu principal : exclus pour le site anonyme *}}
{{if $is_logged==true}}
<ul>
<li {{if $current == "sondage"}} class="current"{{/if}}><a href="{{$_url}}">Sondage</a></li>
{{#restrict section="web" level="write"}}
<li {{if $current == 'config'}} class="current"{{/if}}><a href="{{$_url}}?nav=conf">Configuration</a></li>
{{/restrict}}
</ul>
{{/if}}
{{* menu secondaire *}}
{{if $current == 'sondage'}}
{{:assign _liclass="current" _ulclass="sub"}}
{{if $is_logged==false}}
{{:assign _liclass="nav-mois" _ulclass="modal-liens"}}
{{/if}}
<ul class="{{$_ulclass}}">
{{if $subcurrent == 'view'}}
<li class="title"><label>❓{{$s.titre}}</label> &nbsp;</li>
{{/if}}
<li {{if !$subcurrent || $subcurrent == 'encours'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}">En cours</a></li>
<li {{if $subcurrent == 'archive'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=archive">Archives (Fermés)</a></li>
{{* <li {{if $subcurrent == 'liste'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=liste&cal={{$cal}}">Liste</a></li>
*}}</ul>
{{/if}}
{{#restrict section="web" level="write"}}
{{if $current == 'config'}}
<ul class="sub">
<li {{if !$subcurrent || $subcurrent == 'new_son'}} class="current"{{/if}}><a href="{{$_url}}?nav={{$_GET.nav}}&conf=new_son">Nouveau</a></li>
<li {{if $subcurrent == 'edit_son'}} class="current"{{/if}}><a href="{{$_url}}?nav={{$_GET.nav}}&conf=edit_son">Modifier</a></li>
<li {{if $subcurrent == 'edit_con'}} class="current"{{/if}}><a href="{{$_url}}?nav={{$_GET.nav}}&conf=edit_con">Paramètres</a></li>
{{* <li {{if $subcurrent == 'manage_app'}} class="current"{{/if}}><a href="{{$_url}}?nav={{$_GET.nav}}&conf=manage_app">RDV réguliers</a></li>*}}
</ul>
{{/if}}
{{/restrict}}
</nav>
{{* Messages *}}
{{if $_GET.msg == "ajout" }}
<p class="block confirm">Ajout effectué</p>
{{elseif $_GET.msg == "vote" }}
<p class="block confirm">Merci de votre participation !</p>
{{elseif $_GET.msg == "modification" }}
<p class="block confirm">Modification effectuée</p>
{{elseif $_GET.msg == "suppression" }}
<p class="block confirm">Suppression effectuée</p>
{{/if}}
+65
View File
@@ -0,0 +1,65 @@
{{* Filtre en fonction du style de sondage et de la qualité de l'utilisateur *}}
{{if $son_style == "prive" || $son_style == "admin"}}
{{:assign _sqlin="($$.style IN ('prive', 'membre','public','') OR $$.style IS NULL)"}}
{{elseif $son_style == "membre"}}
{{:assign _sqlin="($$.style IN ('membre','public','') OR $$.style IS NULL)"}}
{{elseif $son_style == "public"}}
{{:assign _sqlin="($$.style IN ('public','') OR $$.style IS NULL)"}}
{{/if}}
<div class="wrap">
{{* Vue des sondages en cours *}}
{{if !$vue || $vue=="encours"}}
<div class="card">
<h2>Sondages en cours</h2>
<ul class="sondages">
{{:assign var="au_moins_un_ouvert" value=false}}
{{:assign var="au_moins_un_ferme" value=false}}
{{#load type="sondage" where="%s"|args:$_sqlin order="id DESC"}}
{{:assign var="nb_c" value=0}}{{if $creneaux|count}}{{:assign var="nb_c" value=$creneaux|count}}{{/if}}
{{:assign var="nb_v" value=0}}{{if $votes|count}}{{:assign var="nb_v" value=$votes|count}}{{/if}}
{{:assign var="nb_o" value=0}}{{if $options|count}}{{:assign var="nb_o" value=$options|count}}{{/if}}
{{:assign var="nb_vs" value=0}}{{if $votes_simple|count}}{{:assign var="nb_vs" value=$votes_simple|count}}{{/if}}
{{if !$ferme}}
{{:assign var="au_moins_un_ouvert" value=true}}
<li><a href="{{$_url}}?vue=view&id={{$id}}">{{$titre}}<span class="badge-admin">{{$style}}</span><small>
{{if $mode == "simple"}}{{$nb_o}} option(s) — {{$nb_vs}} votant(s)
{{else}}{{$nb_c}} créneau(x) — {{$nb_v}} participant(s){{/if}}
</small></a></li>
{{else}}
{{:assign var="au_moins_un_ferme" value=true}}
{{/if}}
{{/load}}
{{if !$au_moins_un_ouvert}}
<li><p class="vide">Aucun sondage en cours.{{if $est_admin}} Créez-en un ci-dessous.{{/if}}</p></li>
{{/if}}
</ul>
</div>
{{* Vue des sondages archivés *}}
{{elseif $vue=="archive"}}
<div class="card">
<h2>Sondages archivés (fermés)</h2>
{{if $au_moins_un_ferme}}
<ul class="sondages">
{{#load type="sondage" where="%s"|args:$_sqlin order="id DESC"}}
{{if $ferme}}
{{:assign var="nb_c2" value=0}}{{if $creneaux|count}}{{:assign var="nb_c2" value=$creneaux|count}}{{/if}}
{{:assign var="nb_v2" value=0}}{{if $votes|count}}{{:assign var="nb_v2" value=$votes|count}}{{/if}}
{{:assign var="nb_o2" value=0}}{{if $options|count}}{{:assign var="nb_o2" value=$options|count}}{{/if}}
{{:assign var="nb_vs2" value=0}}{{if $votes_simple|count}}{{:assign var="nb_vs2" value=$votes_simple|count}}{{/if}}
<li><a href="{{$_url}}?vue=view&id={{$id}}" style="color:#999;">{{$titre}}<small>{{if $mode == "simple"}}{{$nb_o2}} option(s) — {{$nb_vs2}} votant(s){{else}}{{$nb_c2}} créneau(x) — {{$nb_v2}} participant(s){{/if}}</small></a></li>
{{/if}}
{{/load}}
</ul>
{{else}}
<p class="vide">Aucun sondage archivé.</p>
{{/if}}
</div>
{{* Vue d'un sondage en particulier *}}
{{elseif $vue=="view"}}
{{if $s.mode=="simple"}}
{{:include file="_vote.html"}}
{{else}}
{{:include file="_vote_date.html"}}
{{/if}}
{{/if}}
</div>
+153
View File
@@ -0,0 +1,153 @@
{{* ---------- Totaux par option (sondage simple) ---------- *}}
{{:assign var="max_opt" value=0}}
{{#foreach from=$s.options item="o"}}
{{:assign var="l_opt" value=[]}}
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.choix == $o.id}}{{:assign var="l_opt." value=1}}{{/if}}
{{/foreach}}
{{:assign var="n_opt" value=0}}
{{if $l_opt|count}}{{:assign var="n_opt" value=$l_opt|count}}{{/if}}
{{:assign var="tot_opt.%s"|args:$o.id value=$n_opt}}
{{if $n_opt > $max_opt}}{{:assign var="max_opt" value=$n_opt}}{{/if}}
{{/foreach}}
{{:assign var="nb_votants_simple" value=0}}
{{if $s.votes_simple|count}}{{:assign var="nb_votants_simple" value=$s.votes_simple|count}}{{/if}}
{{* ---------- Choix en cours de modification (sondage simple) ---------- *}}
{{:assign var="edit_nom_vs" value=$_POST.edit_nom_vs|strval}}
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.nom == $edit_nom_vs}}
{{:assign var="edit_choix_vs" value=$v.choix}}
{{:assign var="edit_remarque_vs" value=$v.remarque}}
{{/if}}
{{/foreach}}
{{#foreach from=$s.votes item="v"}}
{{:assign var="l_votants." value=1}}
{{/foreach}}
{{if $l_votants|count}}{{:assign var="nb_votants" value=$l_votants|count}}{{/if}}
{{#foreach from=$s.creneaux item="c"}}
{{:assign var="l_oui" value=[]}}
{{:assign var="l_peut" value=[]}}
{{#foreach from=$s.votes item="v"}}
{{:assign var="val" from="v.choix.%s"|args:$c.id}}
{{if $val == 2}}{{:assign var="l_oui." value=1}}{{/if}}
{{if $val == 1}}{{:assign var="l_peut." value=1}}{{/if}}
{{/foreach}}
{{:assign var="n_oui" value=0}}
{{:assign var="n_peut" value=0}}
{{if $l_oui|count}}{{:assign var="n_oui" value=$l_oui|count}}{{/if}}
{{if $l_peut|count}}{{:assign var="n_peut" value=$l_peut|count}}{{/if}}
{{:assign var="tot_oui.%s"|args:$c.id value=$n_oui}}
{{:assign var="tot_peut.%s"|args:$c.id value=$n_peut}}
{{if $n_oui > $max_oui}}{{:assign var="max_oui" value=$n_oui}}{{/if}}
{{/foreach}}
<div class="card">
<h2>Sondage</h2>
<h4>{{$s.description}}</h4>
{{if $s.options|count}}
{{* Ne pas laisser l'admin voter *}}
{{if !$est_admin}}
<form method="post" action="">
<fieldset class="entree">
<legend>Voter</legend>
<dl>
{{if $is_logged}}
{{:input type="text" name="nom_vote" label="Votre nom" default=$logged_user.nom readonly="readonly"}}
{{else}}
{{:input type="text" name="nom_vote" label="Votre nom" placeholder="Votre nom" default=$edit_nom_vs required=true}}
{{/if}}
{{#foreach from=$s.options item="o"}}
{{*<input type="radio" name="choix_option" value="{{$o.id}}" {{if $edit_choix_vs == $o.id}}checked="checked"{{/if}} required="required" /> {{$o.texte*}}
{{:input type="radio" name="choix_option" value=$o.id label=$o.texte}}
{{/foreach}}
{{:input type="textarea" cols=40 rows=2 name="remarque" label="Une précision à ajouter ?" default=$edit_remarque_vs required=false}}
{{:button type="submit" name="voter_simple" label="Voter" help="Pour corriger votre vote, retapez le même nom et choisissez une autre option." class="main" value="%d"|args:$s.id}}
</dl>
</fieldset>
</form>
{{/if}}
{{else}}
<p class="vide">Aucune option pour l'instant.{{if $est_admin}} Ajoutez-en ci-dessous.{{/if}}</p>
{{/if}}
<div class="card">
<h2>Résultats</h2>
{{if $s.options|count}}
<table style="width:100%; border-collapse:collapse;">
{{#foreach from=$s.options item="o"}}
{{:assign var="n_o" from="tot_opt.%s"|args:$o.id}}
<tr>
<th style="text-align:left; padding:.4rem .3rem; border-bottom:1px solid #eceae8; font-weight:normal;">{{$o.texte}}</th>
<td style="padding:.4rem .3rem; border-bottom:1px solid #eceae8; text-align:right; white-space:nowrap;">
{{if $n_o > 0 && $n_o == $max_opt}}<span class="best">&#9733; {{$n_o}} voix</span>{{else}}{{$n_o}} voix{{/if}}
</td>
{{if $est_admin}}
<td style="padding:.4rem .3rem; border-bottom:1px solid #eceae8; text-align:right;">
<form method="post" action="" style="display:inline">
{{:input type="hidden" name="oid" default=$o.id required=true}}
{{:button type="submit" name="del_opt_son" value=$s.id class="mini" label="Supprimer cette option"}}
</form>
</td>
{{/if}}
</tr>
{{/foreach}}
</table>
<p class="aide">{{$nb_votants_simple}} votant(s) au total.</p>
{{else}}
<p class="vide">Rien à afficher pour l'instant.</p>
{{/if}}
</div>
{{:assign var="remarque_trouvee_vs" value=false}}
<div class="card">
<h2>Remarques</h2>
<ul style="list-style:none; margin:0; padding:0;">
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.remarque|trim}}
{{:assign var="remarque_trouvee_vs" value=true}}
<li style="padding:.5rem 0; border-bottom:1px solid #eceae8;"><b>{{$v.nom}}</b> — {{$v.remarque}}</li>
{{/if}}
{{/foreach}}
</ul>
{{if !$remarque_trouvee_vs}}<p class="vide">Aucune remarque pour l'instant.</p>{{/if}}
</div>
{{if $est_admin}}
<div class="card">
<h2>Qui a voté quoi</h2>
{{if $s.votes_simple|count}}
<ul style="list-style:none; margin:0; padding:0;">
{{#foreach from=$s.votes_simple item="v"}}
{{:assign var="txt_choix" value=""}}
{{#foreach from=$s.options item="o"}}
{{if $o.id == $v.choix}}{{:assign var="txt_choix" value=$o.texte}}{{/if}}
{{/foreach}}
<li style="padding:.4rem 0; border-bottom:1px solid #eceae8;">
{{$v.nom}} — {{$txt_choix}}
{{if $est_admin}}
<form method="post" action="" style="display:inline">
{{:input type="hidden" name="choix" default=$v.choix required=true}}
{{:button type="submit" name="del_vot_son" value=$s.id class="mini" label="Supprimer ce vote"}}
</form>
{{/if}}
</li>
{{/foreach}}
</ul>
{{else}}
<p class="vide">Personne n'a encore voté.</p>
{{/if}}
</div>
<div class="card">
<h2>Ajouter une option</h2>
<form method="post" action="" class="ajout">
<label style="flex:2; min-width:14rem;">{{:input type="text" name="texte" label="Texte de l'option" placeholder="ex. Samedi matin" required=true}}</label>
{{:button type="submit" name="add_opt_son" value=$s.id class="mini" label="Ajouter"}}
</form>
</div>
{{/if}}
</div>
{{:debug sondage=$s}}
+226
View File
@@ -0,0 +1,226 @@
{{* ---------- Purge automatique des créneaux dont la date est passée ----------
TODO : mettre un paramètre ou/non pour la purge.
Si non, bloquer l'inscription sur ce créneau
{{:assign var="aujourdhui_s" value=$now|date:"Y-m-d"}}
{{:assign var="suppression_faite" value=false}}
{{#foreach from=$s.creneaux item="c"}}
{{if !$c.date || $c.date >= $aujourdhui_s}}
{{:assign var="creneaux_actifs." value=$c}}
{{else}}
{{:assign var="suppression_faite" value=true}}
{{/if}}
{{/foreach}}
{{if $suppression_faite}}
{{:save id=$s.id creneaux=$creneaux_actifs}}
{{:redirect url="%s?id=%s"|args:$_url:$s.id}}
{{/if}}
*}}
{{* ---------- Créneaux triés par ordre chronologique ---------- *}}
{{#foreach from=$s.creneaux item="c"}}
{{:assign var="cle_date" value=$c.date|strval}}
{{if !$cle_date}}{{:assign var="cle_date" value="9999-99-99"}}{{/if}}
{{:assign var="cle_tri" value="%s_%s_%s"|args:$cle_date:$c.debut:$c.id}}
{{:assign var="tri.%s"|args:$cle_tri value=$c}}
{{/foreach}}
{{if $s.creneaux|count}}{{:assign var="creneaux" value=$tri|ksort|values}}{{/if}}
{{* ---------- Ligne en cours de modification ----------
{{:assign var="edit_nom" value=$_POST.edit_nom|strval}}
{{#foreach from=$s.votes item="v"}}
{{if $v.nom == $edit_nom}}
{{:assign var="edit_choix" value=$v.choix}}
{{:assign var="edit_remarque" value=$v.remarque}}
{{/if}}
{{/foreach}}
*}}
{{* ---------- Créneau en cours de modification ----------
{{:assign var="edit_creneau" value=$_POST.edit_creneau|strval}}
{{#foreach from=$s.creneaux item="c"}}
{{if $c.id == $edit_creneau}}
{{:assign var="edit_c_titre" value=$c.titre}}
{{:assign var="edit_c_date" value=$c.date}}
{{:assign var="edit_c_debut" value=$c.debut}}
{{:assign var="edit_c_fin" value=$c.fin}}
{{:assign var="edit_c_ok" value=1}}
{{/if}}
{{/foreach}}
*}}
{{* ---------- Totaux par créneau ---------- *}}
{{:assign var="max_oui" value=0}}
{{:assign var="nb_votants" value=0}}
<div class="card">
<h2>Créneaux</h2>
{{if $creneaux|count}}
<form method="post" action="">
<div class="scroll">
<table class="grille">
<thead>
<tr>
<th></th>
{{#foreach from=$creneaux item="c"}}
{{:assign var="th_oui" from="tot_oui.%s"|args:$c.id}}{{:assign var="th_peut" from="tot_peut.%s"|args:$c.id}}
<th class="creneau">{{if $c.titre|trim}}<em class="titre">{{$c.titre}}</em>{{/if}}{{if $c.date}}<b>{{$c.date|date_long}}</b><small>{{$c.debut}} → {{$c.fin}}</small>{{else}}<b>{{$c.label}}</b>{{/if}}
{{if $est_admin}}
{{if $th_oui < 1 && $th_peut < 1}}
{{*<button type="submit" name="edit_creneau" value="{{$c.id}}" class="mini" formnovalidate="formnovalidate" title="Modifier ce créneau">&#9998;</button>*}}
{{:button type="submit" class="mini" name="edit_creneau" shape="edit" title="Modifier ce créneau" value="%d"|args:$c.id}}
{{/if}}
{{*<button type="submit" name="suppr_creneau" value="{{$c.id}}" class="mini" formnovalidate="formnovalidate" title="Supprimer ce créneau">&#10005;</button>*}}
{{:button type="submit" class="mini" name="suppr_creneau" shape="delete" title="Supprimer ce créneau" value="%d"|args:$c.id}}
{{/if}}
</th>
{{/foreach}}
</tr>
</thead>
<tbody>
{{#foreach from=$s.votes item="v"}}
<tr>
<th>{{$v.nom}}
{{*<button type="submit" name="edit_nom" value="{{$v.nom}}" class="mini" formnovalidate="formnovalidate" title="Modifier cette ligne">&#9998;</button>*}}
{{:button type="submit" class="mini" name="edit_nom" label="Modifier cette ligne" default=$v.nom}}
{{if $est_admin}}
{{*<button type="submit" name="suppr_nom" value="{{$v.nom}}" class="mini" formnovalidate="formnovalidate" title="Supprimer cette ligne">&#10005;</button>*}}
{{:button type="submit" class="mini" name="suppr_nom" label="Supprimer cette ligne" default=$v.nom}}
{{/if}}
</th>
{{#foreach from=$creneaux item="c"}}
{{:assign var="val" from="v.choix.%s"|args:$c.id}}
{{if $val == 2}}<td class="oui">&#10004;</td>{{elseif $val == 1}}<td class="peut">(&#10004;)</td>{{else}}<td class="non"></td>{{/if}}
{{/foreach}}
</tr>
{{/foreach}}
<tr class="saisie">
<th>
{{if $is_logged}}
{{:input type="text" name="nom_vote" label="Votre nom" default=$logged_user.nom readonly="readonly" required=true}}
{{else}}
{{:input type="text" name="nom_vote" label="Votre nom" placeholder="Votre nom" default=$edit_nom required=true}}
{{/if}}
</th>
{{#foreach from=$creneaux item="c"}}
{{:assign var="pre" from="edit_choix.%s"|args:$c.id}}
<td>
{{*:debug c=$c pre=$pre*}}
{{:input type="radio" name="dispo[%s]"|args:$c.id label="oui" value="2"}}
{{:input type="radio" name="dispo[%s]"|args:$c.id label="si besoin" value="1"}}
{{:input type="radio" name="dispo[%s]"|args:$c.id label="non" value="0"}}
{{*
<label><input type="radio" class="normal" name="dispo[{{$c.id}}]" value="2" {{if $pre == 2}}checked="checked"{{/if}} /> oui</label>
<label><input type="radio" class="normal" name="dispo[{{$c.id}}]" value="1" {{if $pre == 1}}checked="checked"{{/if}} /> si besoin</label>
<label><input type="radio" class="normal" name="dispo[{{$c.id}}]" value="0" {{if $pre != 1 && $pre != 2}}checked="checked"{{/if}} /> non</label>
*}}
</td>
{{/foreach}}
</tr>
<tr class="somme">
<th>Somme<small>{{$nb_votants}} votant(s)</small></th>
{{#foreach from=$creneaux item="c"}}
{{:assign var="n_oui" from="tot_oui.%s"|args:$c.id}}
{{:assign var="n_peut" from="tot_peut.%s"|args:$c.id}}
<td>{{if $n_oui > 0 && $n_oui == $max_oui}}<span class="best">&#9733; {{$n_oui}}</span>{{elseif $n_oui > 0}}{{$n_oui}}{{else}}0{{/if}}{{if $n_peut > 0}}<small>(+{{$n_peut}})</small>{{/if}}</td>
{{/foreach}}
</tr>
</tbody>
</table>
</div>
<p class="champ" style="margin-top:.8rem;">
{{:input type="textarea" cols=40 rows=2 name="remarque" label="Une précision à ajouter ?" default=$edit_remarque required=false}}
{{*
<label style="display:block; font-size:.9rem; color:#666; margin-bottom:.3rem;">Remarque (facultatif)</label>
<textarea name="remarque"
rows="2" placeholder="Une précision à ajouter ?"
style="width:100%; font-family:inherit; font-size:1rem; padding:.45rem .7rem; border:1px solid #bbb; border-radius:.4rem;">{{$edit_remarque}}</textarea>
*}}
</p>
<p>
{{* <button type="submit" name="enregistrer" value="1">Enregistrer mes disponibilités</button>*}}
{{:button type="submit" name="voter_creneau" label="Enregistrer mes disponibilités" help="Pour corriger votre vote, retapez le même nom et choisissez une autre option." class="main" value="%d"|args:$s.id}}
</p>
<p class="aide">Tapez votre nom, cochez vos disponibilités puis enregistrez. Pour corriger une ligne existante, cliquez sur le crayon à côté du nom.</p>
</form>
{{else}}
<p class="vide">Aucun créneau pour l'instant.{{if $est_admin}} Ajoutez-en un ci-dessous pour commencer.{{/if}}</p>
{{/if}}
</div>
{{:assign var="remarque_trouvee" value=false}}
<div class="card">
<h2>Remarques</h2>
<ul style="list-style:none; margin:0; padding:0;">
{{#foreach from=$s.votes item="v"}}
{{if $v.remarque|trim}}
{{:assign var="remarque_trouvee" value=true}}
<li style="padding:.5rem 0; border-bottom:1px solid #eceae8;"><b>{{$v.nom}}</b> — {{$v.remarque}}</li>
{{/if}}
{{/foreach}}
</ul>
{{if !$remarque_trouvee}}<p class="vide">Aucune remarque pour l'instant.</p>{{/if}}
</div>
{{*if $est_admin}}
<div class="card">
{{if $edit_c_ok}}
<h2>Modifier ce créneau</h2>
<form method="post" action="" class="ajout">
<label>Titre <input type="text" name="titre" value="{{$edit_c_titre}}" placeholder="ex. Permanence atelier" /></label>
<label>Date <input type="date" name="date" value="{{$edit_c_date}}" required="required" /></label>
<label>de <input type="time" name="debut" value="{{$edit_c_debut}}" required="required" /></label>
<label>à <input type="time" name="fin" value="{{$edit_c_fin}}" required="required" /></label>
<button type="submit" name="rename_creneau" value="{{$edit_creneau}}">Enregistrer</button>
<a class="retour" href="{{$_url}}?id={{$s.id}}">Annuler</a>
</form>
{{else}}
<h2>Ajouter un créneau</h2>
<form method="post" action="" class="ajout">
<label>Titre <input type="text" name="titre" placeholder="ex. Permanence atelier" /></label>
<label>Date <input type="date" name="date" required="required" /></label>
<label>de <input type="time" name="debut" value="19:00" required="required" /></label>
<label>à <input type="time" name="fin" value="21:00" required="required" /></label>
<button type="submit" name="add_creneau" value="1">Ajouter la colonne</button>
</form>
{{/if}}
</div>
<div class="card">
<h2>Ajouter plusieurs créneaux (saisie libre)</h2>
<form method="post" action="">
<table style="width:100%; border-collapse:collapse;">
<thead><tr><th style="text-align:left; font-size:.85rem; color:#666;">Titre</th><th style="text-align:left; font-size:.85rem; color:#666;">Date</th><th style="text-align:left; font-size:.85rem; color:#666;">De</th><th style="text-align:left; font-size:.85rem; color:#666;">À</th></tr></thead>
<tbody>
<tr><td><input type="text" name="titre_1" placeholder="ex. Permanence" /></td><td><input type="date" name="date_1" /></td><td><input type="time" name="debut_1" value="19:00" /></td><td><input type="time" name="fin_1" value="21:00" /></td></tr>
<tr><td><input type="text" name="titre_2" placeholder="ex. Permanence" /></td><td><input type="date" name="date_2" /></td><td><input type="time" name="debut_2" value="19:00" /></td><td><input type="time" name="fin_2" value="21:00" /></td></tr>
<tr><td><input type="text" name="titre_3" placeholder="ex. Permanence" /></td><td><input type="date" name="date_3" /></td><td><input type="time" name="debut_3" value="19:00" /></td><td><input type="time" name="fin_3" value="21:00" /></td></tr>
<tr><td><input type="text" name="titre_4" placeholder="ex. Permanence" /></td><td><input type="date" name="date_4" /></td><td><input type="time" name="debut_4" value="19:00" /></td><td><input type="time" name="fin_4" value="21:00" /></td></tr>
<tr><td><input type="text" name="titre_5" placeholder="ex. Permanence" /></td><td><input type="date" name="date_5" /></td><td><input type="time" name="debut_5" value="19:00" /></td><td><input type="time" name="fin_5" value="21:00" /></td></tr>
</tbody>
</table>
<p class="aide">Laissez la date vide pour ignorer une ligne. Seules les lignes avec une date seront ajoutées.</p>
<p><button type="submit" name="ajout_multiple" value="1">Ajouter ces créneaux</button></p>
</form>
</div>
<div class="card">
<h2>Générer des créneaux automatiquement</h2>
<form method="post" action="" class="ajout">
<label>Titre <input type="text" name="g_titre" placeholder="ex. Permanence atelier" /></label>
<label>de <input type="time" name="g_heure_debut" value="19:00" required="required" /></label>
<label>à <input type="time" name="g_heure_fin" value="21:00" required="required" /></label>
<label>Du <input type="date" name="g_debut_periode" required="required" /></label>
<label>au <input type="date" name="g_fin_periode" required="required" /></label>
<button type="submit" name="generer_creneaux" value="1">Générer les créneaux</button>
<div style="width:100%; display:flex; gap:1rem; flex-wrap:wrap; margin-top:.5rem;">
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="1" /> Lundi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="2" /> Mardi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="3" /> Mercredi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="4" /> Jeudi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="5" /> Vendredi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="6" /> Samedi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="7" /> Dimanche</label>
</div>
</form>
<p class="aide">Crée un créneau pour chaque jour correspondant dans la période choisie (ex. "tous les mardis du 1er au 30 septembre"). Limité à un an à partir de la date de début.</p>
</div>
{{/if*}}
{{:debug sondage=$s}}
+1
View File
@@ -0,0 +1 @@
<svg id="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zm64 192c17.7 0 32 14.3 32 32v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V256c0-17.7 14.3-32 32-32zm64-64c0-17.7 14.3-32 32-32s32 14.3 32 32V352c0 17.7-14.3 32-32 32s-32-14.3-32-32V160zM320 288c17.7 0 32 14.3 32 32v32c0 17.7-14.3 32-32 32s-32-14.3-32-32V320c0-17.7 14.3-32 32-32z"/></svg>

After

Width:  |  Height:  |  Size: 617 B

+85
View File
@@ -0,0 +1,85 @@
{{* =========================================================================
MODULE SONDAGE
ADMINISTRATION : accès admin géré par les permissions Paheko réelles
(membre connecté avec droit d'écriture sur la section "web"), via
{{#restrict}} ci-dessous.
========================================================================= *}}
{{#restrict section="web" level="admin"}}
{{:assign est_admin=true son_style="admin"}}
{{:assign _url="%sindex.html"|args:$module.url}}
{{else}}
{{#restrict section="users" level="admin"}}
{{:assign est_admin=false son_style="prive"}}
{{else}}
{{if $is_logged}}
{{:assign est_admin=false son_style="membre"}}
{{else}}
{{:assign est_admin=false son_style="public"}}
{{/if}}
{{/restrict}}
{{/restrict}}
{{if $est_admin==true}}
{{:admin_header title="Sondages" custom_css="/m/vote/sondage.css" layout="" current="module_vote"}}
{{if $est_admin}}<span class="badge-admin">mode admin</span>{{/if}}
{{* TODO membre logué
<link rel='stylesheet' id='agenda-css' href='agenda.css' media='all'/>*}}
{{else}}
{{:admin_header title="Sondages" custom_css="/m/vote/sondage.css" layout="" current="module_vote"}}
{{/if}}
{{* Si edition ou suppression de sondages *}}
{{if $est_admin==true}}
{{if $_GET.id > 0}}
{{:assign _nav="conf" _conf="edit_son"}}
{{/if}}
{{:assign _nav=$_GET.nav _conf=$_GET.conf}}
{{else}}
{{:assign _nav=$_GET.nav}}
{{:assign _conf=$_GET.conf}}
{{/if}}
{{* Charge le sondage choisi si dispo *}}
{{#load assign="s" id=$_GET.id|intval}}
{{else}}
{{#load assign="s" id=$_POST.id|intval}}{{/load}}
{{/load}}
{{:assign vue=$_GET.vue}}
{{* ---------- Ajout/modification/suppression d'un sondage (admin) ---------- *}}
{{if $_POST.create_son || $_POST.del_son || $_POST.save_son}}
{{:include file="manage/_sondage.html"}}
{{/if}}
{{* ---------- Ajout/suppression d'une option ou d'un vote (sondage simple, admin) ---------- *}}
{{if $_POST.add_opt_son || $_POST.del_opt_son || $_POST.del_vot_son}}
{{:include file="manage/_sondage_simple.html"}}
{{/if}}
{{* ---------- Voter sondage (public) ---------- *}}
{{if $_POST.voter_simple || $_POST.voter_creneau}}
{{:include file="manage/_vote.html"}}
{{/if}}
{{* ---------- Manage créneaux (admin) ---------- *}}
{{if $_POST.add_creneau || $_POST.ajout_multiple || $_POST.generer_creneaux || $_POST.rename_creneau || $_POST.suppr_creneau || $_POST.suppr_nom|| $_POST.enregistrer}}
{{:include file="manage/_sondage_creneaux.html"}}
{{/if}}
{{* Navigation config (admin) *}}
{{if $_nav == "conf"}}
{{if !$_conf}}
{{:include file="_nav.html" current="config" subcurrent="new_son"}}
{{:assign _conf="new_son"}}
{{else}}
{{:include file="_nav.html" current="config" subcurrent="%s"|args:$_conf}}
{{:assign _conf=$_conf}}
{{/if}}
{{:include file="_config.html" subconf=$_conf}}
{{* Navigation normale (tous) *}}
{{else}}
{{:include file="_nav.html" current="sondage" subcurrent="%s"|args:$vue}}
{{:include file="_sondage.html" _vue="%s"|args:$vue}}
{{/if}}
{{:debug get=$_GET post=$_POST cur=$current sub=$subcurrent subconf=$subconf}}
+79
View File
@@ -0,0 +1,79 @@
{{* -*- brindille -*- *}}
{{#restrict block=true section="config" level="write"}}{{/restrict}}
{{* Traiter l'envoi du formulaire *}}
{{#form on="save_param"}}
{{* vérification *}}
{{if $_POST.purge == true}}
{{:assign purge_creneaux=true}}
{{else}}
{{:assign purge_creneaux=false}}
{{/if}}
{{* Valeurs par défaut *}}
{{if !$module.config.sondage_styles }}
{{:assign var="sondage_styles.prive" label="Sondage privé (Conseil Collégial/CA)" mcat="privat"}}
{{:assign var="sondage_styles.membre" label="Sondage membre (membres logués)" mcat="logged"}}
{{:assign var="sondage_styles.public" label="Sondage public (tous)" mcat="all"}}
{{else}}
{{:assign var="sondage_styles" value=$module.config.sondage_styles}}
{{/if}}
{{* vérification *}}
{{if $_POST.name && $_POST.name|key_in:$sondage_styles}}
{{:error message="Le nom %s est déjà utilisé !"|args:$_POST.name}}
{{/if}}
{{if $_POST.name|strval && $_POST.label|strval && $_POST.cat|intval}}
{{:assign shortname=$_POST.name|tolower}}
{{:assign var="sondage_styles.%s"|args:$shortname label="%s"|args:$_POST.label mcat=$_POST.cat}}
{{/if}}
{{* save *}}
{{:save key="config"
purge=$purge_creneaux|boolval
sondage_styles=$sondage_styles
}}
{{:redirect force="%s?nav=conf&conf=edit_con"|args:$module.url}}
{{/form}}
{{* Charge les catégories de membres *}}
{{#select id, name FROM users_categories WHERE (hidden = 0 AND perm_connect = 1);}}
{{:assign var="member_cat.%d"|args:$id label="%s"|args:$name}}
{{/select}}
<form method="post" action="" data-focus="1">
<fieldset class="storage">
<legend>Paramètres</legend>
<dl>
{{:input type="checkbox" name="purge" label="Purge les créneaux passés" checked=$module.config.purge value=true}}
</dl>
</fieldset>
<fieldset class="storage">
<legend>Ajouter un type de sondage</legend>
<dl>
<table>
<tr><th>Nom</th><th>Label</th><th>Catégorie de membres</th></tr>
<tr>
<td width="25%">{{:input type="text" help="Un seul mot en minuscules" placeholder="Ex. actifs" name="name"}}</td>
<td width="50%">{{:input type="text" placeholder="Ex. Sondage privé (Conseil Collégial/CA)" name="label"}}</td>
<td width="25%">{{:input type="select" name="cat" options=$member_cat}}</td>
</tr>
{{if $module.config.sondage_styles}}
{{#foreach from=$module.config.sondage_styles key="key" }}
<tr>
<td>{{$key}}</td>
<td>{{$label}}</td>
{{if $mcat|intval > 0 }}
{{:assign var="mcat_label" from="member_cat.%s.label"|args:$mcat}}
<td>{{$mcat_label}}</td>
{{else}}
<td>{{$mcat}}</td>
{{/if}}
</tr>
{{/foreach}}
{{/if}}
</table>
</dl>
</fieldset>
<p class="submit">
{{:button type="submit" name="save_param" label="Enregistrer" shape="right" class="main"}}
</p>
</form>
+45
View File
@@ -0,0 +1,45 @@
{{* Création Nouveau Sondage *}}
{{#form on="create_son"}}
{{*:assign var="titre" value=$_POST.titre|strval|trim*}}
{{*:assign var="description" value=$_POST.description|strval|trim*}}
{{:save type="sondage"
titre=$_POST.titre|strval|trim
description=$_POST.description|strval|trim
mode=$_POST.mode|strval|trim
style=$_POST.style|strval|trim
assign_new_id="nouveau_id"
}}
{{:redirect url="%s?nav=conf&conf=edit_son&id=%s"|args:$module.url:$nouveau_id}}
{{else}}
{{:form_errors}}
{{/form}}
{{* Modification Sondage *}}
{{#form on="save_son"}}
{{*:assign var="titre" value=$_POST.titre|strval|trim*}}
{{*:assign var="description" value=$_POST.description|strval|trim*}}
{{:save type="sondage" id=$_POST.save_son|intval
titre=$_POST.titre|strval|trim
style=$_POST.style|strval|trim
description=$_POST.description|strval|trim
}}
{{*:redirect url="sondage.html?id=%s"|args:$nouveau_id*}}
{{else}}
{{:form_errors}}
{{/form}}
{{* ---------- Suppression du sondage (admin) ---------- *}}
{{#form on="del_son"}}
{{:delete id=$_POST.del_son|intval}}
{{:redirect url="%s?nav=conf&conf=edit_son"|args:$module.url}}
{{else}}
{{:form_errors}}
{{/form}}
{{* ---------- Modification de la description (admin) ---------- *}}
{{#form on="maj_description"}}
{{:save id=$_POST.maj_description description=$saisi_description}}
{{*:redirect url="%s?nav=conf&conf=edit_son"|args:$module.url*}}
{{else}}
{{:form_errors}}
{{/form}}
+178
View File
@@ -0,0 +1,178 @@
{{* ---------- Ajout d'un créneau (admin) ---------- *}}
{{if $_POST.add_creneau && $est_admin}}
{{:assign var="saisi_titre" value=$_POST.titre|strval|trim}}
{{:assign var="saisi_date" value=$_POST.date|strval|trim}}
{{:assign var="saisi_debut" value=$_POST.debut|strval|trim}}
{{:assign var="saisi_fin" value=$_POST.fin|strval|trim}}
{{if $saisi_date}}
{{:assign var="new_creneaux" value=$s.creneaux}}
{{:assign var="cid" value=$now|date:"YmdHis"}}
{{:assign var="nouveau" id=$cid titre=$saisi_titre date=$saisi_date debut=$saisi_debut fin=$saisi_fin}}
{{:assign var="new_creneaux." value=$nouveau}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{*:redirect url="%s?vue=view&id=%s"|args:$_url:$s.id*}}
{{/if}}
{{/if}}
{{* ---------- Ajout de plusieurs créneaux d'un coup (saisie libre, admin) ---------- *}}
{{if $_POST.ajout_multiple && $est_admin}}
{{:assign var="new_creneaux" value=$s.creneaux}}
{{:assign var="lignes." value=1}}{{:assign var="lignes." value=2}}{{:assign var="lignes." value=3}}{{:assign var="lignes." value=4}}{{:assign var="lignes." value=5}}
{{#foreach from=$lignes item="ligne_i"}}
{{:assign var="m_date_brut" from="_POST.date_%d"|args:$ligne_i}}
{{:assign var="m_date" value=$m_date_brut|strval|trim}}
{{if $m_date}}
{{:assign var="m_titre_brut" from="_POST.titre_%d"|args:$ligne_i}}
{{:assign var="m_debut_brut" from="_POST.debut_%d"|args:$ligne_i}}
{{:assign var="m_fin_brut" from="_POST.fin_%d"|args:$ligne_i}}
{{:assign var="m_titre" value=$m_titre_brut|strval|trim}}
{{:assign var="m_debut" value=$m_debut_brut|strval|trim}}
{{:assign var="m_fin" value=$m_fin_brut|strval|trim}}
{{:assign this_date=$now|date:'YmdHis'}}
{{:assign var="cid_m" value="%s-%d"|args:$this_date:$ligne_i}}
{{:assign var="nouveau_m" id=$cid_m titre=$m_titre date=$m_date debut=$m_debut fin=$m_fin}}
{{:assign var="new_creneaux." value=$nouveau_m}}
{{/if}}
{{/foreach}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{:redirect url="%s?vue=view&id=%s"|args:$_url:$s.id}}
{{/if}}
{{* ---------- Générateur automatique de créneaux par jour de semaine (admin) ---------- *}}
{{if $_POST.generer_creneaux && $est_admin}}
{{#foreach from=$_POST.g_jour item="jc"}}
{{:assign var="jours_sel." value=$jc|intval}}
{{/foreach}}
{{:assign var="g_debut_periode" value=$_POST.g_debut_periode|strval|trim}}
{{:assign var="g_fin_periode" value=$_POST.g_fin_periode|strval|trim}}
{{:assign var="g_titre" value=$_POST.g_titre|strval|trim}}
{{:assign var="g_heure_debut" value=$_POST.g_heure_debut|strval|trim}}
{{:assign var="g_heure_fin" value=$_POST.g_heure_fin|strval|trim}}
{{if $g_debut_periode && $g_fin_periode}}
{{:assign var="new_creneaux" value=$s.creneaux}}
{{:assign var="an_g0" value=$g_debut_periode|date:"Y"}}
{{:assign var="mois_g0" value=$g_debut_periode|date:"n"}}
{{if $mois_g0 == 12}}{{:assign var="mois_g1" value=1}}{{:assign var="an_g1" value="%d+1"|math:$an_g0}}{{else}}{{:assign var="mois_g1" value="%d+1"|math:$mois_g0}}{{:assign var="an_g1" value=$an_g0}}{{/if}}
{{if $mois_g1 == 12}}{{:assign var="mois_g2" value=1}}{{:assign var="an_g2" value="%d+1"|math:$an_g1}}{{else}}{{:assign var="mois_g2" value="%d+1"|math:$mois_g1}}{{:assign var="an_g2" value=$an_g1}}{{/if}}
{{if $mois_g2 == 12}}{{:assign var="mois_g3" value=1}}{{:assign var="an_g3" value="%d+1"|math:$an_g2}}{{else}}{{:assign var="mois_g3" value="%d+1"|math:$mois_g2}}{{:assign var="an_g3" value=$an_g2}}{{/if}}
{{if $mois_g3 == 12}}{{:assign var="mois_g4" value=1}}{{:assign var="an_g4" value="%d+1"|math:$an_g3}}{{else}}{{:assign var="mois_g4" value="%d+1"|math:$mois_g3}}{{:assign var="an_g4" value=$an_g3}}{{/if}}
{{if $mois_g4 == 12}}{{:assign var="mois_g5" value=1}}{{:assign var="an_g5" value="%d+1"|math:$an_g4}}{{else}}{{:assign var="mois_g5" value="%d+1"|math:$mois_g4}}{{:assign var="an_g5" value=$an_g4}}{{/if}}
{{if $mois_g5 == 12}}{{:assign var="mois_g6" value=1}}{{:assign var="an_g6" value="%d+1"|math:$an_g5}}{{else}}{{:assign var="mois_g6" value="%d+1"|math:$mois_g5}}{{:assign var="an_g6" value=$an_g5}}{{/if}}
{{if $mois_g6 == 12}}{{:assign var="mois_g7" value=1}}{{:assign var="an_g7" value="%d+1"|math:$an_g6}}{{else}}{{:assign var="mois_g7" value="%d+1"|math:$mois_g6}}{{:assign var="an_g7" value=$an_g6}}{{/if}}
{{if $mois_g7 == 12}}{{:assign var="mois_g8" value=1}}{{:assign var="an_g8" value="%d+1"|math:$an_g7}}{{else}}{{:assign var="mois_g8" value="%d+1"|math:$mois_g7}}{{:assign var="an_g8" value=$an_g7}}{{/if}}
{{if $mois_g8 == 12}}{{:assign var="mois_g9" value=1}}{{:assign var="an_g9" value="%d+1"|math:$an_g8}}{{else}}{{:assign var="mois_g9" value="%d+1"|math:$mois_g8}}{{:assign var="an_g9" value=$an_g8}}{{/if}}
{{if $mois_g9 == 12}}{{:assign var="mois_g10" value=1}}{{:assign var="an_g10" value="%d+1"|math:$an_g9}}{{else}}{{:assign var="mois_g10" value="%d+1"|math:$mois_g9}}{{:assign var="an_g10" value=$an_g9}}{{/if}}
{{if $mois_g10 == 12}}{{:assign var="mois_g11" value=1}}{{:assign var="an_g11" value="%d+1"|math:$an_g10}}{{else}}{{:assign var="mois_g11" value="%d+1"|math:$mois_g10}}{{:assign var="an_g11" value=$an_g10}}{{/if}}
{{:assign var="mois_gen_an.0" value=$an_g0}}{{:assign var="mois_gen_mois.0" value=$mois_g0}}
{{:assign var="mois_gen_an.1" value=$an_g1}}{{:assign var="mois_gen_mois.1" value=$mois_g1}}
{{:assign var="mois_gen_an.2" value=$an_g2}}{{:assign var="mois_gen_mois.2" value=$mois_g2}}
{{:assign var="mois_gen_an.3" value=$an_g3}}{{:assign var="mois_gen_mois.3" value=$mois_g3}}
{{:assign var="mois_gen_an.4" value=$an_g4}}{{:assign var="mois_gen_mois.4" value=$mois_g4}}
{{:assign var="mois_gen_an.5" value=$an_g5}}{{:assign var="mois_gen_mois.5" value=$mois_g5}}
{{:assign var="mois_gen_an.6" value=$an_g6}}{{:assign var="mois_gen_mois.6" value=$mois_g6}}
{{:assign var="mois_gen_an.7" value=$an_g7}}{{:assign var="mois_gen_mois.7" value=$mois_g7}}
{{:assign var="mois_gen_an.8" value=$an_g8}}{{:assign var="mois_gen_mois.8" value=$mois_g8}}
{{:assign var="mois_gen_an.9" value=$an_g9}}{{:assign var="mois_gen_mois.9" value=$mois_g9}}
{{:assign var="mois_gen_an.10" value=$an_g10}}{{:assign var="mois_gen_mois.10" value=$mois_g10}}
{{:assign var="mois_gen_an.11" value=$an_g11}}{{:assign var="mois_gen_mois.11" value=$mois_g11}}
{{:assign var="jours_gen." value=1}}{{:assign var="jours_gen." value=2}}{{:assign var="jours_gen." value=3}}{{:assign var="jours_gen." value=4}}{{:assign var="jours_gen." value=5}}{{:assign var="jours_gen." value=6}}{{:assign var="jours_gen." value=7}}{{:assign var="jours_gen." value=8}}{{:assign var="jours_gen." value=9}}{{:assign var="jours_gen." value=10}}
{{:assign var="jours_gen." value=11}}{{:assign var="jours_gen." value=12}}{{:assign var="jours_gen." value=13}}{{:assign var="jours_gen." value=14}}{{:assign var="jours_gen." value=15}}{{:assign var="jours_gen." value=16}}{{:assign var="jours_gen." value=17}}{{:assign var="jours_gen." value=18}}{{:assign var="jours_gen." value=19}}{{:assign var="jours_gen." value=20}}
{{:assign var="jours_gen." value=21}}{{:assign var="jours_gen." value=22}}{{:assign var="jours_gen." value=23}}{{:assign var="jours_gen." value=24}}{{:assign var="jours_gen." value=25}}{{:assign var="jours_gen." value=26}}{{:assign var="jours_gen." value=27}}{{:assign var="jours_gen." value=28}}{{:assign var="jours_gen." value=29}}{{:assign var="jours_gen." value=30}}
{{:assign var="jours_gen." value=31}}
{{:assign var="idx_mois_gen." value=0}}{{:assign var="idx_mois_gen." value=1}}{{:assign var="idx_mois_gen." value=2}}{{:assign var="idx_mois_gen." value=3}}{{:assign var="idx_mois_gen." value=4}}{{:assign var="idx_mois_gen." value=5}}
{{:assign var="idx_mois_gen." value=6}}{{:assign var="idx_mois_gen." value=7}}{{:assign var="idx_mois_gen." value=8}}{{:assign var="idx_mois_gen." value=9}}{{:assign var="idx_mois_gen." value=10}}{{:assign var="idx_mois_gen." value=11}}
{{#foreach from=$idx_mois_gen item="im_gen"}}
{{:assign var="an_g" from="mois_gen_an.%s"|args:$im_gen}}
{{:assign var="mois_g" from="mois_gen_mois.%s"|args:$im_gen}}
{{:assign var="premier_g" value="%04d-%02d-01"|args:$an_g:$mois_g}}
{{:assign var="nb_jours_g" value=$premier_g|date:"t"}}
{{#foreach from=$jours_gen item="jn_g"}}
{{if $jn_g <= $nb_jours_g}}
{{:assign var="date_g" value="%04d-%02d-%02d"|args:$an_g:$mois_g:$jn_g}}
{{if $date_g >= $g_debut_periode && $date_g <= $g_fin_periode}}
{{:assign var="dow_g" value=$date_g|date:"N"}}
{{:assign var="jour_ok_g" value=false}}
{{#foreach from=$jours_sel item="jsel_g"}}
{{if $dow_g == $jsel_g}}{{:assign var="jour_ok_g" value=true}}{{/if}}
{{/foreach}}
{{if $jour_ok_g}}
{{:assign var="cid_g" value="%s-%s"|args:$now|date:"YmdHis":$date_g}}
{{:assign var="nouveau_g" id=$cid_g titre=$g_titre date=$date_g debut=$g_heure_debut fin=$g_heure_fin}}
{{:assign var="new_creneaux." value=$nouveau_g}}
{{/if}}
{{/if}}
{{/if}}
{{/foreach}}
{{/foreach}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{:redirect url="%s?vue=view&id=%s"|args:$_url:$s.id}}
{{/if}}
{{/if}}
{{* ---------- Modification d'un créneau (admin) ---------- *}}
{{if $_POST.rename_creneau && $est_admin}}
{{:debug _POST_rename_creneau=$_POST.rename_creneau}}
{{:assign var="saisi_titre" value=$_POST.titre|strval|trim}}
{{:assign var="saisi_date" value=$_POST.date|strval|trim}}
{{:assign var="saisi_debut" value=$_POST.debut|strval|trim}}
{{:assign var="saisi_fin" value=$_POST.fin|strval|trim}}
{{if $saisi_date}}
{{#foreach from=$s.creneaux item="c"}}
{{if $c.id == $_POST.rename_creneau}}
{{:assign var="modifie" id=$c.id titre=$saisi_titre date=$saisi_date debut=$saisi_debut fin=$saisi_fin}}
{{:assign var="new_creneaux." value=$modifie}}
{{else}}
{{:assign var="new_creneaux." value=$c}}
{{/if}}
{{/foreach}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{*:redirect url="%s?vue=view&id=%s"|args:$_url:$s.id*}}
{{/if}}
{{/if}}
{{* ---------- Suppression d'un créneau (admin) ---------- *}}
{{if $_POST.suppr_creneau && $est_admin}}
{{#foreach from=$s.creneaux item="c"}}
{{if $c.id != $_POST.suppr_creneau}}
{{:assign var="new_creneaux." value=$c}}
{{/if}}
{{/foreach}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{:redirect url="%s?vue=view&id=%s"|args:$_url:$s.id}}
{{/if}}
{{* ---------- Suppression d'une ligne (admin) ---------- *}}
{{if $_POST.suppr_nom && $est_admin}}
{{#foreach from=$s.votes item="v"}}
{{if $v.nom != $_POST.suppr_nom}}
{{:assign var="new_votes." value=$v}}
{{/if}}
{{/foreach}}
{{:save id=$s.id votes=$new_votes}}
{{:redirect url="%s?vue=view&id=%s"|args:$_url:$s.id}}
{{/if}}
{{* ---------- Enregistrement d'une ligne (public) ---------- *}}
{{if $_POST.enregistrer}}
{{:assign var="saisi_nom" value=$_POST.nom|strval|trim}}
{{:assign var="saisi_remarque" value=$_POST.remarque|strval|trim}}
{{if $saisi_nom}}
{{#foreach from=$s.votes item="v"}}
{{if $v.nom != $saisi_nom}}
{{:assign var="new_votes." value=$v}}
{{/if}}
{{/foreach}}
{{#foreach from=$s.creneaux item="c"}}
{{:assign var="val" from="_POST.dispo.%s"|args:$c.id}}
{{:assign var="new_choix.%s"|args:$c.id value=$val|intval}}
{{/foreach}}
{{:assign var="ligne" nom=$saisi_nom choix=$new_choix remarque=$saisi_remarque}}
{{:assign var="new_votes." value=$ligne}}
{{:save id=$s.id votes=$new_votes}}
{{:redirect url="%s?vue=view&id=%s"|args:$_url:$s.id}}
{{/if}}
{{/if}}
+48
View File
@@ -0,0 +1,48 @@
{{* ---------- Ajout d'une option (sondage simple, admin) ---------- *}}
{{#form on="add_opt_son"}}
{{if $_POST.add_opt_son}}
{{* Charge sondage *}}
{{#load assign="s" id=$_POST.add_opt_son|intval}}{{/load}}
{{:assign var="saisi_opt" value=$_POST.texte|strval|trim}}
{{if $saisi_opt}}
{{:assign var="new_options" value=$s.options}}
{{:assign var="oid" value=$now|date:"YmdHis"}}
{{:assign var="nouvelle_opt" id=$oid texte=$saisi_opt}}
{{:assign var="new_options." value=$nouvelle_opt}}
{{:save id=$s.id options=$new_options}}
{{:redirect url="%s?vue=view&id=%s&msg=ajout"|args:$module.url:$s.id}}
{{/if}}
{{/if}}
{{else}}
{{:form_errors}}
{{/form}}
{{* ---------- Suppression d'une option (sondage simple, admin) ---------- *}}
{{#form on="del_opt_son"}}
{{if $_POST.del_opt_son}}
{{* Charge sondage *}}
{{#load assign="s" id=$_POST.del_opt_son|intval}}{{/load}}
{{#foreach from=$s.options item="o"}}
{{if $o.id != $_POST.oid}}
{{:assign var="new_options." value=$o}}
{{/if}}
{{/foreach}}
{{:save id=$s.id options=$new_options}}
{{:redirect url="%s?vue=view&id=%s&msg=suppression"|args:$module.url:$s.id}}
{{/if}}
{{else}}
{{:form_errors}}
{{/form}}
{{* ---------- Suppression d'un vote (sondage simple, admin) ---------- *}}
{{#form on="del_vot_son"}}
{{if $_POST.del_vot_son}}
{{* Charge sondage *}}
{{#load assign="s" id=$_POST.del_vot_son|intval}}{{/load}}
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.choix != $_POST.choix}}
{{:assign var="new_votes_simple." value=$v}}
{{/if}}
{{/foreach}}
{{:save id=$s.id votes_simple=$new_votes_simple}}
{{:redirect url="%s?vue=view&id=%s&msg=suppression"|args:$module.url:$s.id}}
{{/if}}
{{/form}}
+48
View File
@@ -0,0 +1,48 @@
{{* ---------- Vote sur un sondage simple (public) ---------- *}}
{{#form on="voter_simple"}}
{{if $_POST.voter_simple}}
{{:assign var="vs_nom" value=$_POST.nom_vote|strval|trim}}
{{:assign var="vs_choix" value=$_POST.choix_option|strval|trim}}
{{:assign var="vs_remarque" value=$_POST.remarque|strval|trim}}
{{if $vs_nom != "" && $vs_choix != ""}}
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.nom != $vs_nom}}
{{:assign var="new_votes_simple." value=$v}}
{{/if}}
{{/foreach}}
{{:assign var="ligne_vs" nom=$vs_nom choix=$vs_choix remarque=$vs_remarque}}
{{:assign var="new_votes_simple." value=$ligne_vs}}
{{*:debug new_votes_simple=$new_votes_simple*}}
{{:save id=$_POST.voter_simple votes_simple=$new_votes_simple}}
{{:redirect url="%s?msg=vote"|args:$module.url}}
{{/if}}
{{/if}}
{{else}}
{{:form_errors}}
{{/form}}
{{* ---------- Vote sur un sondage de disponibilités (public) ---------- *}}
{{#form on="voter_creneau"}}
{{if $_POST.voter_creneau}}
{{:assign var="saisi_nom" value=$_POST.nom_vote|strval|trim}}
{{:assign var="saisi_remarque" value=$_POST.remarque|strval|trim}}
{{if $saisi_nom}}
{{#foreach from=$s.votes item="v"}}
{{if $v.nom != $saisi_nom}}
{{:assign var="new_votes." value=$v}}
{{/if}}
{{/foreach}}
{{:debug new_votes=$new_votes}}
{{#foreach from=$s.creneaux item="c"}}
{{:assign var="val" from="_POST.dispo.%s"|args:$c.id}}
{{:assign var="new_choix.%s"|args:$c.id value=$val|intval}}
{{/foreach}}
{{:assign var="ligne" nom=$saisi_nom choix=$new_choix remarque=$saisi_remarque}}
{{:assign var="new_votes." value=$ligne}}
{{:save id=$s.id votes=$new_votes}}
{{:redirect url="%s?msg=vote"|args:$module.url}}
{{/if}}
{{/if}}
{{else}}
{{:form_errors}}
{{/form}}
+10
View File
@@ -0,0 +1,10 @@
name = "Sondages"
description = "Tableau de disponibilités partagé, façon Framadate : chacun indique ses disponibilités sur les créneaux proposés."
author = "Vive le Vélo / F.Boudaud (Asso Recycl'arz)"
author_url = "https://recyclarz.bountyarz.ovh"
restrict_section = "web"
restrict_level = "write"
home_button = false
menu = true
home_button = true
web = false
+66
View File
@@ -0,0 +1,66 @@
:root { --terra: #8c3a1e; --terra2: #bb4f2a; --orange: #d9720f; --vert: #4c7a2e; }
* { box-sizing: border-box; }
.wrap { max-width: 62rem; margin: 0 auto; }
h1 { margin: 0 0 1.2rem; font-size: 1.7rem; color: var(--terra); }
.card { background: #fff; border: 1px solid #e2ddd9; border-radius: .6rem; padding: 1rem 1.2rem 1.2rem; margin-bottom: 1.2rem; box-shadow: 0 1px 4px rgba(0,0,0,.10); }
.card h2 { margin: 0 0 .8rem; font-size: 1.05rem; color: var(--terra); text-transform: uppercase; letter-spacing: .04em; }
input[type=text] { max-width: 100%; box-sizing: border-box; font-size: 1.05rem; padding: .45rem .7rem; border: 1px solid #bbb; border-radius: .4rem; background: #fff; }
ul.sondages { list-style: none; margin: 0; padding: 0; }
ul.sondages li { border-bottom: 1px solid #eee; }
ul.sondages li:last-child { border-bottom: none; }
ul.sondages a { display: block; padding: .7rem .2rem; color: #00358a; font-size: 1.15rem; text-decoration: none; }
ul.sondages a:hover { color: var(--terra); text-decoration: underline; }
ul.sondages small { display: block; color: #777; font-size: .85rem; }
p.vide { color: #777; margin: 0; }
a.retour { color: var(--terra); text-decoration: none; font-size: .95rem; }
a.retour:hover { text-decoration: underline; }
textarea.description: { width:100%; font-family:inherit; font-size:1rem; padding:.45rem .7rem; border:1px solid #bbb; border-radius:.4rem; resize:vertical; }
p.fil { margin: 0 0 .2rem; }
p.fil span.sep { color: #c4bdb8; margin: 0 .45rem; }
h1 { margin: .4rem 0 1.2rem; font-size: 1.7rem; color: var(--terra); }
.badge-admin { display: inline-block; background: var(--vert); color: #fff; font-size: .75rem; padding: .15rem .5rem; border-radius: 1rem; margin-left: .5rem; vertical-align: middle; }
.card { background: #fff; border: 1px solid #e2ddd9; border-radius: .6rem; padding: 1rem 1.2rem 1.2rem; margin-bottom: 1.2rem; box-shadow: 0 1px 4px rgba(0,0,0,.10); }
.card h2 { margin: 0 0 .8rem; font-size: 1.05rem; color: var(--terra); text-transform: uppercase; letter-spacing: .04em; }
.scroll { overflow: auto; max-height: 70vh; }
table.grille { border-collapse: separate; border-spacing: 0; width: 100%; }
table.grille th, table.grille td { padding: .5rem .6rem; text-align: center; border-bottom: 1px solid #eceae8; }
table.grille th:first-child { width: 15rem; min-width: 15rem; position: sticky; left: 0; z-index: 2; }
table.grille thead th { background: var(--terra); color: #fff; font-size: .9rem; line-height: 1.25; vertical-align: middle; border-bottom: none; position: sticky; top: 0; z-index: 3; }
table.grille thead th:first-child { background: var(--terra); z-index: 4; }
table.grille thead th.creneau { min-width: 7.5rem; border-left: 1px solid rgba(255,255,255,.25); }
table.grille thead th.creneau b { display: block; font-size: .95rem; }
table.grille thead th.creneau small { display: block; font-weight: normal; opacity: .85; }
table.grille tbody th { text-align: right; font-weight: bold; background: #faf9f8; }
td.oui { background: #dbeec6; color: #33521a; font-weight: bold; }
td.peut { background: #fae4c6; color: #7a5310; font-weight: bold; }
td.non { background: #f7cec7; }
tr.somme th, tr.somme td { border-top: 2px solid var(--terra); border-bottom: none; padding-top: .7rem; font-weight: bold; background: #fff; }
tr.somme td span.best { color: var(--terra); }
tr.somme td small, tr.somme th small { display: block; font-weight: normal; color: #7a5310; }
tr.saisie th, tr.saisie td { background: #f1f5ec; border-top: 2px solid #cfd9c2; }
tr.saisie label { display: block; cursor: pointer; font-size: .8rem; line-height: 1.5; text-align: left; }
tr.saisie input[type=radio] { margin: 0 .3rem 0 0; vertical-align: middle; }
input[type=text] { font-size: 1rem; padding: .4rem .6rem; border: 1px solid #bbb; border-radius: .4rem; width: 100%; }
input[type=date], input[type=time] { font-family: inherit; font-size: 1rem; padding: .4rem .6rem; border: 1px solid #bbb; border-radius: .4rem; background: #fff; }
button { font-family: inherit; font-size: .95rem; padding: .45rem .9rem; border: none; border-radius: .4rem; background: var(--terra); color: #fff; cursor: pointer; }
button:hover { background: var(--orange); }
button.mini { background: none; color: #e6cfc6; padding: .1rem .25rem; font-size: .9rem; }
button.mini:hover { background: none; color: #fff; }
p.aide { color: #777; font-size: .9rem; margin: .6rem 0 0; }
.ajout { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; }
.ajout label { font-size: .9rem; color: #666; }
p.vide { color: #777; }
.ajout input[type=text] { width: auto; min-width: 13rem; }
table.grille thead th.creneau em.titre { display: block; font-style: normal; font-size: .78rem; text-transform: uppercase; letter-spacing: .04em; opacity: .8; margin-bottom: .15rem; }
.card.danger { border-color: #e6c9c2; }
.card.danger h2 { color: #a12a12; }
.card.danger label { font-size: .95rem; cursor: pointer; }
button.danger { background: #a12a12; }
button.danger:hover { background: #c9401f; }
@media (max-width: 600px) {
table.grille th:first-child { width: 6.5rem; min-width: 6.5rem; }
tr.saisie th input[type=text] { padding: .3rem .4rem; font-size: .85rem; }
tr.saisie label { font-size: .72rem; }
table.grille th, table.grille td { padding: .4rem .3rem; }
}
+742
View File
@@ -0,0 +1,742 @@
{{* Administration : droits Paheko réels (écriture sur la section "web"), plus de code partagé dans l'URL. *}}
{{#restrict section="web" level="write"}}
{{:assign var="est_admin" value=true}}
{{else}}
{{if $is_logged==true}}
{{:assign _url="%sindex.html"|args:$module.url}}
{{else}}
{{:assign _url="%ssondage.html"|args:$module.url}}
{{/if}}
{{:assign var="est_admin" value=false}}
{{/restrict}}
{{if $est_admin==true}}
{{:admin_header title="Sondages" custom_css="/m/vote/sondage.css" layout="" current="module_vote"}}
{{* TODO membre logué
<link rel='stylesheet' id='agenda-css' href='agenda.css' media='all'/>*}}
{{else}}
{{:admin_header title="Sondages" custom_css="/m/vote/sondage.css" layout="" current="module_vote"}}
{{/if}}
{{* Charge le sondage choisi si dispo *}}
{{#load assign="s" id=$_GET.id|intval}}{{/load}}
{{:assign vue=$_GET.vue}}
{{* Navigation *}}
{{if $_nav == "conf"}}
{{if !$_conf}}
{{:include file="_nav.html" current="config" subcurrent="new_son"}}
{{:assign _conf="new_son"}}
{{else}}
{{:include file="_nav.html" current="config" subcurrent="%s"|args:$_conf}}
{{:assign _conf=$_conf}}
{{/if}}
{{:include file="_config.html" subconf=$_conf}}
{{else}}
{{if !$_GET.vue}}
{{:assign vue="new_son"}}
{{/if}}
{{:include file="_nav.html" current="sondage" subcurrent="%s"|args:$vue}}
{{/if}}
{{if !$s.id}}
{{:error message="Ce sondage n'existe pas (ou plus)."}}
{{/if}}
{{* ---------- Ajout d'une option (sondage simple, admin) ----------
{{if $_POST.add_option && $est_admin}}
{{:assign var="saisi_opt" value=$_POST.texte|strval|trim}}
{{if $saisi_opt}}
{{:assign var="new_options" value=$s.options}}
{{:assign var="oid" value=$now|date:"YmdHis"}}
{{:assign var="nouvelle_opt" id=$oid texte=$saisi_opt}}
{{:assign var="new_options." value=$nouvelle_opt}}
{{:save id=$s.id options=$new_options}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
{{/if}}
*}}
{{* ---------- Suppression d'une option (sondage simple, admin) ----------
{{if $_POST.suppr_option && $est_admin}}
{{#foreach from=$s.options item="o"}}
{{if $o.id != $_POST.suppr_option}}
{{:assign var="new_options." value=$o}}
{{/if}}
{{/foreach}}
{{:save id=$s.id options=$new_options}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
*}}
{{* ---------- Vote sur un sondage simple (public) ----------
{{if $_POST.voter_simple}}
{{:assign var="vs_nom" value=$_POST.nom_vote|strval|trim}}
{{:assign var="vs_choix" value=$_POST.choix_option|strval|trim}}
{{:assign var="vs_remarque" value=$_POST.remarque|strval|trim}}
{{if $vs_nom != "" && $vs_choix != ""}}
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.nom != $vs_nom}}
{{:assign var="new_votes_simple." value=$v}}
{{/if}}
{{/foreach}}
{{:assign var="ligne_vs" nom=$vs_nom choix=$vs_choix remarque=$vs_remarque}}
{{:assign var="new_votes_simple." value=$ligne_vs}}
{{:save id=$s.id votes_simple=$new_votes_simple}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
{{/if}}
*}}
{{* ---------- Ajout d'un créneau (admin) ----------
{{if $_POST.add_creneau && $est_admin}}
{{:assign var="saisi_titre" value=$_POST.titre|strval|trim}}
{{:assign var="saisi_date" value=$_POST.date|strval|trim}}
{{:assign var="saisi_debut" value=$_POST.debut|strval|trim}}
{{:assign var="saisi_fin" value=$_POST.fin|strval|trim}}
{{if $saisi_date}}
{{:assign var="new_creneaux" value=$s.creneaux}}
{{:assign var="cid" value=$now|date:"YmdHis"}}
{{:assign var="nouveau" id=$cid titre=$saisi_titre date=$saisi_date debut=$saisi_debut fin=$saisi_fin}}
{{:assign var="new_creneaux." value=$nouveau}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
{{/if}}
*}}
{{* ---------- Ajout de plusieurs créneaux d'un coup (saisie libre, admin) ----------
{{if $_POST.ajout_multiple && $est_admin}}
{{:assign var="new_creneaux" value=$s.creneaux}}
{{:assign var="lignes." value=1}}{{:assign var="lignes." value=2}}{{:assign var="lignes." value=3}}{{:assign var="lignes." value=4}}{{:assign var="lignes." value=5}}
{{#foreach from=$lignes item="ligne_i"}}
{{:assign var="m_date_brut" from="_POST.date_%d"|args:$ligne_i}}
{{:assign var="m_date" value=$m_date_brut|strval|trim}}
{{if $m_date}}
{{:assign var="m_titre_brut" from="_POST.titre_%d"|args:$ligne_i}}
{{:assign var="m_debut_brut" from="_POST.debut_%d"|args:$ligne_i}}
{{:assign var="m_fin_brut" from="_POST.fin_%d"|args:$ligne_i}}
{{:assign var="m_titre" value=$m_titre_brut|strval|trim}}
{{:assign var="m_debut" value=$m_debut_brut|strval|trim}}
{{:assign var="m_fin" value=$m_fin_brut|strval|trim}}
{{:assign this_date=$now|date:'YmdHis'}}
{{:assign var="cid_m" value="%s-%d"|args:$this_date:$ligne_i}}
{{:assign var="nouveau_m" id=$cid_m titre=$m_titre date=$m_date debut=$m_debut fin=$m_fin}}
{{:assign var="new_creneaux." value=$nouveau_m}}
{{/if}}
{{/foreach}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
*}}
{{* ---------- Générateur automatique de créneaux par jour de semaine (admin) ----------
{{if $_POST.generer_creneaux && $est_admin}}
{{#foreach from=$_POST.g_jour item="jc"}}
{{:assign var="jours_sel." value=$jc|intval}}
{{/foreach}}
{{:assign var="g_debut_periode" value=$_POST.g_debut_periode|strval|trim}}
{{:assign var="g_fin_periode" value=$_POST.g_fin_periode|strval|trim}}
{{:assign var="g_titre" value=$_POST.g_titre|strval|trim}}
{{:assign var="g_heure_debut" value=$_POST.g_heure_debut|strval|trim}}
{{:assign var="g_heure_fin" value=$_POST.g_heure_fin|strval|trim}}
{{if $g_debut_periode && $g_fin_periode}}
{{:assign var="new_creneaux" value=$s.creneaux}}
{{:assign var="an_g0" value=$g_debut_periode|date:"Y"}}
{{:assign var="mois_g0" value=$g_debut_periode|date:"n"}}
{{if $mois_g0 == 12}}{{:assign var="mois_g1" value=1}}{{:assign var="an_g1" value="%d+1"|math:$an_g0}}{{else}}{{:assign var="mois_g1" value="%d+1"|math:$mois_g0}}{{:assign var="an_g1" value=$an_g0}}{{/if}}
{{if $mois_g1 == 12}}{{:assign var="mois_g2" value=1}}{{:assign var="an_g2" value="%d+1"|math:$an_g1}}{{else}}{{:assign var="mois_g2" value="%d+1"|math:$mois_g1}}{{:assign var="an_g2" value=$an_g1}}{{/if}}
{{if $mois_g2 == 12}}{{:assign var="mois_g3" value=1}}{{:assign var="an_g3" value="%d+1"|math:$an_g2}}{{else}}{{:assign var="mois_g3" value="%d+1"|math:$mois_g2}}{{:assign var="an_g3" value=$an_g2}}{{/if}}
{{if $mois_g3 == 12}}{{:assign var="mois_g4" value=1}}{{:assign var="an_g4" value="%d+1"|math:$an_g3}}{{else}}{{:assign var="mois_g4" value="%d+1"|math:$mois_g3}}{{:assign var="an_g4" value=$an_g3}}{{/if}}
{{if $mois_g4 == 12}}{{:assign var="mois_g5" value=1}}{{:assign var="an_g5" value="%d+1"|math:$an_g4}}{{else}}{{:assign var="mois_g5" value="%d+1"|math:$mois_g4}}{{:assign var="an_g5" value=$an_g4}}{{/if}}
{{if $mois_g5 == 12}}{{:assign var="mois_g6" value=1}}{{:assign var="an_g6" value="%d+1"|math:$an_g5}}{{else}}{{:assign var="mois_g6" value="%d+1"|math:$mois_g5}}{{:assign var="an_g6" value=$an_g5}}{{/if}}
{{if $mois_g6 == 12}}{{:assign var="mois_g7" value=1}}{{:assign var="an_g7" value="%d+1"|math:$an_g6}}{{else}}{{:assign var="mois_g7" value="%d+1"|math:$mois_g6}}{{:assign var="an_g7" value=$an_g6}}{{/if}}
{{if $mois_g7 == 12}}{{:assign var="mois_g8" value=1}}{{:assign var="an_g8" value="%d+1"|math:$an_g7}}{{else}}{{:assign var="mois_g8" value="%d+1"|math:$mois_g7}}{{:assign var="an_g8" value=$an_g7}}{{/if}}
{{if $mois_g8 == 12}}{{:assign var="mois_g9" value=1}}{{:assign var="an_g9" value="%d+1"|math:$an_g8}}{{else}}{{:assign var="mois_g9" value="%d+1"|math:$mois_g8}}{{:assign var="an_g9" value=$an_g8}}{{/if}}
{{if $mois_g9 == 12}}{{:assign var="mois_g10" value=1}}{{:assign var="an_g10" value="%d+1"|math:$an_g9}}{{else}}{{:assign var="mois_g10" value="%d+1"|math:$mois_g9}}{{:assign var="an_g10" value=$an_g9}}{{/if}}
{{if $mois_g10 == 12}}{{:assign var="mois_g11" value=1}}{{:assign var="an_g11" value="%d+1"|math:$an_g10}}{{else}}{{:assign var="mois_g11" value="%d+1"|math:$mois_g10}}{{:assign var="an_g11" value=$an_g10}}{{/if}}
{{:assign var="mois_gen_an.0" value=$an_g0}}{{:assign var="mois_gen_mois.0" value=$mois_g0}}
{{:assign var="mois_gen_an.1" value=$an_g1}}{{:assign var="mois_gen_mois.1" value=$mois_g1}}
{{:assign var="mois_gen_an.2" value=$an_g2}}{{:assign var="mois_gen_mois.2" value=$mois_g2}}
{{:assign var="mois_gen_an.3" value=$an_g3}}{{:assign var="mois_gen_mois.3" value=$mois_g3}}
{{:assign var="mois_gen_an.4" value=$an_g4}}{{:assign var="mois_gen_mois.4" value=$mois_g4}}
{{:assign var="mois_gen_an.5" value=$an_g5}}{{:assign var="mois_gen_mois.5" value=$mois_g5}}
{{:assign var="mois_gen_an.6" value=$an_g6}}{{:assign var="mois_gen_mois.6" value=$mois_g6}}
{{:assign var="mois_gen_an.7" value=$an_g7}}{{:assign var="mois_gen_mois.7" value=$mois_g7}}
{{:assign var="mois_gen_an.8" value=$an_g8}}{{:assign var="mois_gen_mois.8" value=$mois_g8}}
{{:assign var="mois_gen_an.9" value=$an_g9}}{{:assign var="mois_gen_mois.9" value=$mois_g9}}
{{:assign var="mois_gen_an.10" value=$an_g10}}{{:assign var="mois_gen_mois.10" value=$mois_g10}}
{{:assign var="mois_gen_an.11" value=$an_g11}}{{:assign var="mois_gen_mois.11" value=$mois_g11}}
{{:assign var="jours_gen." value=1}}{{:assign var="jours_gen." value=2}}{{:assign var="jours_gen." value=3}}{{:assign var="jours_gen." value=4}}{{:assign var="jours_gen." value=5}}{{:assign var="jours_gen." value=6}}{{:assign var="jours_gen." value=7}}{{:assign var="jours_gen." value=8}}{{:assign var="jours_gen." value=9}}{{:assign var="jours_gen." value=10}}
{{:assign var="jours_gen." value=11}}{{:assign var="jours_gen." value=12}}{{:assign var="jours_gen." value=13}}{{:assign var="jours_gen." value=14}}{{:assign var="jours_gen." value=15}}{{:assign var="jours_gen." value=16}}{{:assign var="jours_gen." value=17}}{{:assign var="jours_gen." value=18}}{{:assign var="jours_gen." value=19}}{{:assign var="jours_gen." value=20}}
{{:assign var="jours_gen." value=21}}{{:assign var="jours_gen." value=22}}{{:assign var="jours_gen." value=23}}{{:assign var="jours_gen." value=24}}{{:assign var="jours_gen." value=25}}{{:assign var="jours_gen." value=26}}{{:assign var="jours_gen." value=27}}{{:assign var="jours_gen." value=28}}{{:assign var="jours_gen." value=29}}{{:assign var="jours_gen." value=30}}
{{:assign var="jours_gen." value=31}}
{{:assign var="idx_mois_gen." value=0}}{{:assign var="idx_mois_gen." value=1}}{{:assign var="idx_mois_gen." value=2}}{{:assign var="idx_mois_gen." value=3}}{{:assign var="idx_mois_gen." value=4}}{{:assign var="idx_mois_gen." value=5}}
{{:assign var="idx_mois_gen." value=6}}{{:assign var="idx_mois_gen." value=7}}{{:assign var="idx_mois_gen." value=8}}{{:assign var="idx_mois_gen." value=9}}{{:assign var="idx_mois_gen." value=10}}{{:assign var="idx_mois_gen." value=11}}
{{#foreach from=$idx_mois_gen item="im_gen"}}
{{:assign var="an_g" from="mois_gen_an.%s"|args:$im_gen}}
{{:assign var="mois_g" from="mois_gen_mois.%s"|args:$im_gen}}
{{:assign var="premier_g" value="%04d-%02d-01"|args:$an_g:$mois_g}}
{{:assign var="nb_jours_g" value=$premier_g|date:"t"}}
{{#foreach from=$jours_gen item="jn_g"}}
{{if $jn_g <= $nb_jours_g}}
{{:assign var="date_g" value="%04d-%02d-%02d"|args:$an_g:$mois_g:$jn_g}}
{{if $date_g >= $g_debut_periode && $date_g <= $g_fin_periode}}
{{:assign var="dow_g" value=$date_g|date:"N"}}
{{:assign var="jour_ok_g" value=false}}
{{#foreach from=$jours_sel item="jsel_g"}}
{{if $dow_g == $jsel_g}}{{:assign var="jour_ok_g" value=true}}{{/if}}
{{/foreach}}
{{if $jour_ok_g}}
{{:assign var="cid_g" value="%s-%s"|args:$now|date:"YmdHis":$date_g}}
{{:assign var="nouveau_g" id=$cid_g titre=$g_titre date=$date_g debut=$g_heure_debut fin=$g_heure_fin}}
{{:assign var="new_creneaux." value=$nouveau_g}}
{{/if}}
{{/if}}
{{/if}}
{{/foreach}}
{{/foreach}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
{{/if}}
*}}
{{* ---------- Modification de la description (admin) ----------
{{if $_POST.maj_description && $est_admin}}
{{:assign var="saisi_description" value=$_POST.description|strval|trim}}
{{:save id=$s.id description=$saisi_description}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
*}}
{{* ---------- Modification d'un créneau (admin) ----------
{{if $_POST.rename_creneau && $est_admin}}
{{:assign var="saisi_titre" value=$_POST.titre|strval|trim}}
{{:assign var="saisi_date" value=$_POST.date|strval|trim}}
{{:assign var="saisi_debut" value=$_POST.debut|strval|trim}}
{{:assign var="saisi_fin" value=$_POST.fin|strval|trim}}
{{if $saisi_date}}
{{#foreach from=$s.creneaux item="c"}}
{{if $c.id == $_POST.rename_creneau}}
{{:assign var="modifie" id=$c.id titre=$saisi_titre date=$saisi_date debut=$saisi_debut fin=$saisi_fin}}
{{:assign var="new_creneaux." value=$modifie}}
{{else}}
{{:assign var="new_creneaux." value=$c}}
{{/if}}
{{/foreach}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
{{/if}}
*}}
{{* ---------- Suppression d'un créneau (admin) ----------
{{if $_POST.suppr_creneau && $est_admin}}
{{#foreach from=$s.creneaux item="c"}}
{{if $c.id != $_POST.suppr_creneau}}
{{:assign var="new_creneaux." value=$c}}
{{/if}}
{{/foreach}}
{{:save id=$s.id creneaux=$new_creneaux}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
*}}
{{* ---------- Suppression d'une ligne (admin) ---------- *}}
{{if $_POST.suppr_nom && $est_admin}}
{{#foreach from=$s.votes item="v"}}
{{if $v.nom != $_POST.suppr_nom}}
{{:assign var="new_votes." value=$v}}
{{/if}}
{{/foreach}}
{{:save id=$s.id votes=$new_votes}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
{{* ---------- Suppression du sondage (admin) ----------
{{if $_POST.suppr_sondage && $est_admin}}
{{if $_POST.confirmer}}
{{:delete id=$s.id}}
{{:redirect url="./?code=%s"|args:$code_saisi}}
{{/if}}
{{/if}}
*}}
{{* ---------- Enregistrement d'une ligne (public) ----------
{{if $_POST.enregistrer}}
{{:assign var="saisi_nom" value=$_POST.nom|strval|trim}}
{{:assign var="saisi_remarque" value=$_POST.remarque|strval|trim}}
{{if $saisi_nom}}
{{#foreach from=$s.votes item="v"}}
{{if $v.nom != $saisi_nom}}
{{:assign var="new_votes." value=$v}}
{{/if}}
{{/foreach}}
{{#foreach from=$s.creneaux item="c"}}
{{:assign var="val" from="_POST.dispo.%s"|args:$c.id}}
{{:assign var="new_choix.%s"|args:$c.id value=$val|intval}}
{{/foreach}}
{{:assign var="ligne" nom=$saisi_nom choix=$new_choix remarque=$saisi_remarque}}
{{:assign var="new_votes." value=$ligne}}
{{:save id=$s.id votes=$new_votes}}
{{:redirect url="sondage.html?id=%s"|args:$s.id}}
{{/if}}
{{/if}}
*}}
{{* ---------- Purge automatique des créneaux dont la date est passée ----------
{{:assign var="aujourdhui_s" value=$now|date:"Y-m-d"}}
{{:assign var="suppression_faite" value=false}}
{{#foreach from=$s.creneaux item="c"}}
{{if !$c.date || $c.date >= $aujourdhui_s}}
{{:assign var="creneaux_actifs." value=$c}}
{{else}}
{{:assign var="suppression_faite" value=true}}
{{/if}}
{{/foreach}}
{{if $suppression_faite}}
{{:save id=$s.id creneaux=$creneaux_actifs}}
{{:redirect url="sondage.html?id=%s&code=%s"|args:$s.id:$code_saisi}}
{{/if}}
*}}
{{* ---------- Créneaux triés par ordre chronologique ----------
{{#foreach from=$s.creneaux item="c"}}
{{:assign var="cle_date" value=$c.date|strval}}
{{if !$cle_date}}{{:assign var="cle_date" value="9999-99-99"}}{{/if}}
{{:assign var="cle_tri" value="%s_%s_%s"|args:$cle_date:$c.debut:$c.id}}
{{:assign var="tri.%s"|args:$cle_tri value=$c}}
{{/foreach}}
{{if $s.creneaux|count}}{{:assign var="creneaux" value=$tri|ksort|values}}{{/if}}
*}}
{{* ---------- Ligne en cours de modification ----------
{{:assign var="edit_nom" value=$_POST.edit_nom|strval}}
{{#foreach from=$s.votes item="v"}}
{{if $v.nom == $edit_nom}}
{{:assign var="edit_choix" value=$v.choix}}
{{:assign var="edit_remarque" value=$v.remarque}}
{{/if}}
{{/foreach}}
*}}
{{* ---------- Créneau en cours de modification ----------
{{:assign var="edit_creneau" value=$_POST.edit_creneau|strval}}
{{#foreach from=$s.creneaux item="c"}}
{{if $c.id == $edit_creneau}}
{{:assign var="edit_c_titre" value=$c.titre}}
{{:assign var="edit_c_date" value=$c.date}}
{{:assign var="edit_c_debut" value=$c.debut}}
{{:assign var="edit_c_fin" value=$c.fin}}
{{:assign var="edit_c_ok" value=1}}
{{/if}}
{{/foreach}}
*}}
{{* ---------- Totaux par créneau ----------
{{:assign var="max_oui" value=0}}
{{:assign var="nb_votants" value=0}}
*}}
{{* ---------- Totaux par option (sondage simple) ----------
{{:assign var="max_opt" value=0}}
{{#foreach from=$s.options item="o"}}
{{:assign var="l_opt" value=[]}}
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.choix == $o.id}}{{:assign var="l_opt." value=1}}{{/if}}
{{/foreach}}
{{:assign var="n_opt" value=0}}
{{if $l_opt|count}}{{:assign var="n_opt" value=$l_opt|count}}{{/if}}
{{:assign var="tot_opt.%s"|args:$o.id value=$n_opt}}
{{if $n_opt > $max_opt}}{{:assign var="max_opt" value=$n_opt}}{{/if}}
{{/foreach}}
{{:assign var="nb_votants_simple" value=0}}
{{if $s.votes_simple|count}}{{:assign var="nb_votants_simple" value=$s.votes_simple|count}}{{/if}}
*}}
{{* ---------- Choix en cours de modification (sondage simple) ----------
{{:assign var="edit_nom_vs" value=$_POST.edit_nom_vs|strval}}
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.nom == $edit_nom_vs}}
{{:assign var="edit_choix_vs" value=$v.choix}}
{{:assign var="edit_remarque_vs" value=$v.remarque}}
{{/if}}
{{/foreach}}
{{#foreach from=$s.votes item="v"}}
{{:assign var="l_votants." value=1}}
{{/foreach}}
{{if $l_votants|count}}{{:assign var="nb_votants" value=$l_votants|count}}{{/if}}
{{#foreach from=$s.creneaux item="c"}}
{{:assign var="l_oui" value=[]}}
{{:assign var="l_peut" value=[]}}
{{#foreach from=$s.votes item="v"}}
{{:assign var="val" from="v.choix.%s"|args:$c.id}}
{{if $val == 2}}{{:assign var="l_oui." value=1}}{{/if}}
{{if $val == 1}}{{:assign var="l_peut." value=1}}{{/if}}
{{/foreach}}
{{:assign var="n_oui" value=0}}
{{:assign var="n_peut" value=0}}
{{if $l_oui|count}}{{:assign var="n_oui" value=$l_oui|count}}{{/if}}
{{if $l_peut|count}}{{:assign var="n_peut" value=$l_peut|count}}{{/if}}
{{:assign var="tot_oui.%s"|args:$c.id value=$n_oui}}
{{:assign var="tot_peut.%s"|args:$c.id value=$n_peut}}
{{if $n_oui > $max_oui}}{{:assign var="max_oui" value=$n_oui}}{{/if}}
{{/foreach}}
*}}
{{*
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{{$s.titre}} — {{$config.org_name}}</title>
<style>
:root { --terra: #8c3a1e; --orange: #d9720f; --vert: #4c7a2e; }
* { box-sizing: border-box; }
body { margin: 0; padding: 1.5rem 1rem 3rem; font-family: "Trebuchet MS", Helvetica, sans-serif; background: #f4f6f2; color: #222; }
.wrap { max-width: 78rem; margin: 0 auto; }
a.retour { color: var(--terra); text-decoration: none; font-size: .95rem; }
a.retour:hover { text-decoration: underline; }
p.fil { margin: 0 0 .2rem; }
p.fil span.sep { color: #c4bdb8; margin: 0 .45rem; }
h1 { margin: .4rem 0 1.2rem; font-size: 1.7rem; color: var(--terra); }
.badge-admin { display: inline-block; background: var(--vert); color: #fff; font-size: .75rem; padding: .15rem .5rem; border-radius: 1rem; margin-left: .5rem; vertical-align: middle; }
.card { background: #fff; border: 1px solid #e2ddd9; border-radius: .6rem; padding: 1rem 1.2rem 1.2rem; margin-bottom: 1.2rem; box-shadow: 0 1px 4px rgba(0,0,0,.10); }
.card h2 { margin: 0 0 .8rem; font-size: 1.05rem; color: var(--terra); text-transform: uppercase; letter-spacing: .04em; }
.scroll { overflow: auto; max-height: 70vh; }
table.grille { border-collapse: separate; border-spacing: 0; width: 100%; }
table.grille th, table.grille td { padding: .5rem .6rem; text-align: center; border-bottom: 1px solid #eceae8; }
table.grille th:first-child { width: 15rem; min-width: 15rem; position: sticky; left: 0; z-index: 2; }
table.grille thead th { background: var(--terra); color: #fff; font-size: .9rem; line-height: 1.25; vertical-align: middle; border-bottom: none; position: sticky; top: 0; z-index: 3; }
table.grille thead th:first-child { background: var(--terra); z-index: 4; }
table.grille thead th.creneau { min-width: 7.5rem; border-left: 1px solid rgba(255,255,255,.25); }
table.grille thead th.creneau b { display: block; font-size: .95rem; }
table.grille thead th.creneau small { display: block; font-weight: normal; opacity: .85; }
table.grille tbody th { text-align: right; font-weight: bold; background: #faf9f8; }
td.oui { background: #dbeec6; color: #33521a; font-weight: bold; }
td.peut { background: #fae4c6; color: #7a5310; font-weight: bold; }
td.non { background: #f7cec7; }
tr.somme th, tr.somme td { border-top: 2px solid var(--terra); border-bottom: none; padding-top: .7rem; font-weight: bold; background: #fff; }
tr.somme td span.best { color: var(--terra); }
tr.somme td small, tr.somme th small { display: block; font-weight: normal; color: #7a5310; }
tr.saisie th, tr.saisie td { background: #f1f5ec; border-top: 2px solid #cfd9c2; }
tr.saisie label { display: block; cursor: pointer; font-size: .8rem; line-height: 1.5; text-align: left; }
tr.saisie input[type=radio] { margin: 0 .3rem 0 0; vertical-align: middle; }
input[type=text] { font-size: 1rem; padding: .4rem .6rem; border: 1px solid #bbb; border-radius: .4rem; width: 100%; }
input[type=date], input[type=time] { font-family: inherit; font-size: 1rem; padding: .4rem .6rem; border: 1px solid #bbb; border-radius: .4rem; background: #fff; }
button { font-family: inherit; font-size: .95rem; padding: .45rem .9rem; border: none; border-radius: .4rem; background: var(--terra); color: #fff; cursor: pointer; }
button:hover { background: var(--orange); }
button.mini { background: none; color: #e6cfc6; padding: .1rem .25rem; font-size: .9rem; }
button.mini:hover { background: none; color: #fff; }
p.aide { color: #777; font-size: .9rem; margin: .6rem 0 0; }
.ajout { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; }
.ajout label { font-size: .9rem; color: #666; }
p.vide { color: #777; }
.ajout input[type=text] { width: auto; min-width: 13rem; }
table.grille thead th.creneau em.titre { display: block; font-style: normal; font-size: .78rem; text-transform: uppercase; letter-spacing: .04em; opacity: .8; margin-bottom: .15rem; }
.card.danger { border-color: #e6c9c2; }
.card.danger h2 { color: #a12a12; }
.card.danger label { font-size: .95rem; cursor: pointer; }
button.danger { background: #a12a12; }
button.danger:hover { background: #c9401f; }
@media (max-width: 600px) {
table.grille th:first-child { width: 6.5rem; min-width: 6.5rem; }
tr.saisie th input[type=text] { padding: .3rem .4rem; font-size: .85rem; }
tr.saisie label { font-size: .72rem; }
table.grille th, table.grille td { padding: .4rem .3rem; }
}
</style>
</head>
<body>
<div class="wrap">
<p class="fil"><a class="retour" href="/">&larr; Retour au site</a><span class="sep">·</span><a class="retour" href="./{{if $est_admin}}?code={{$code_saisi}}{{/if}}">Tous les sondages</a>{{if $est_admin}}<span class="sep">·</span><a class="retour" href="./?code={{$code_saisi}}&amp;mode=simple#form-nouveau">+ Nouveau sondage libre</a>{{/if}}</p>
<h1>{{$s.titre}}{{if $est_admin}}<span class="badge-admin">mode admin</span>{{/if}}</h1>
*}}
<div class="card">
<h2>Description</h2>
{{if $est_admin}}
{{:assign var="desc_len" value=$s.description|strval|strlen}}
{{:assign var="desc_rows" value=3}}
{{if $desc_len > 400}}
{{:assign var="desc_rows" value=16}}
{{elseif $desc_len > 250}}
{{:assign var="desc_rows" value=10}}
{{elseif $desc_len > 120}}
{{:assign var="desc_rows" value=6}}
{{elseif $desc_len > 40}}
{{:assign var="desc_rows" value=4}}
{{/if}}
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<p><textarea class="description" name="description" rows="{{$desc_rows}}" placeholder="Ajoutez une description...">{{$s.description}}</textarea></p>
<p><button type="submit" name="maj_description" value="1">Enregistrer la description</button></p>
</form>
{{else}}
{{if $s.description|trim}}<p id="desc-texte" style="white-space:pre-wrap;">{{$s.description}}</p>{{else}}<p class="vide">Aucune description.</p>{{/if}}
{{/if}}
</div>
{{if $s.mode == "simple"}}
{{:include file="_vote.html"}}
{{*
<div class="card">
<h2>Voter</h2>
{{if $s.options|count}}
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<p class="champ"><label style="display:block; font-size:.9rem; color:#666; margin-bottom:.3rem;">Votre nom</label><input type="text" name="nom_vote" value="{{$edit_nom_vs}}" placeholder="Votre nom" required="required" /></p>
<div style="margin:.8rem 0;">
{{#foreach from=$s.options item="o"}}
<label style="display:block; padding:.4rem 0; cursor:pointer;">
<input type="radio" name="choix_option" value="{{$o.id}}" {{if $edit_choix_vs == $o.id}}checked="checked"{{/if}} required="required" /> {{$o.texte}}
</label>
{{/foreach}}
</div>
<p class="champ"><label style="display:block; font-size:.9rem; color:#666; margin-bottom:.3rem;">Remarque (facultatif)</label><textarea name="remarque" rows="2" placeholder="Une précision à ajouter ?" style="width:100%; font-family:inherit; font-size:1rem; padding:.45rem .7rem; border:1px solid #bbb; border-radius:.4rem;">{{$edit_remarque_vs}}</textarea></p>
<button type="submit" name="voter_simple" value="1">Voter</button>
<p class="aide">Pour corriger votre vote, retapez le même nom et choisissez une autre option.</p>
</form>
{{else}}
<p class="vide">Aucune option pour l'instant.{{if $est_admin}} Ajoutez-en ci-dessous.{{/if}}</p>
{{/if}}
</div>
<div class="card">
<h2>Résultats</h2>
{{if $s.options|count}}
<table style="width:100%; border-collapse:collapse;">
{{#foreach from=$s.options item="o"}}
{{:assign var="n_o" from="tot_opt.%s"|args:$o.id}}
<tr>
<th style="text-align:left; padding:.4rem .3rem; border-bottom:1px solid #eceae8; font-weight:normal;">{{$o.texte}}</th>
<td style="padding:.4rem .3rem; border-bottom:1px solid #eceae8; text-align:right; white-space:nowrap;">
{{if $n_o > 0 && $n_o == $max_opt}}<span class="best">&#9733; {{$n_o}} voix</span>{{else}}{{$n_o}} voix{{/if}}
</td>
{{if $est_admin}}
<td style="padding:.4rem .3rem; border-bottom:1px solid #eceae8; text-align:right;">
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}" style="display:inline">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<button type="submit" name="suppr_option" value="{{$o.id}}" class="mini" title="Supprimer cette option">&#10005;</button>
</form>
</td>
{{/if}}
</tr>
{{/foreach}}
</table>
<p class="aide">{{$nb_votants_simple}} votant(s) au total.</p>
{{else}}
<p class="vide">Rien à afficher pour l'instant.</p>
{{/if}}
</div>
{{:assign var="remarque_trouvee_vs" value=false}}
<div class="card">
<h2>Remarques</h2>
<ul style="list-style:none; margin:0; padding:0;">
{{#foreach from=$s.votes_simple item="v"}}
{{if $v.remarque|trim}}
{{:assign var="remarque_trouvee_vs" value=true}}
<li style="padding:.5rem 0; border-bottom:1px solid #eceae8;"><b>{{$v.nom}}</b> — {{$v.remarque}}</li>
{{/if}}
{{/foreach}}
</ul>
{{if !$remarque_trouvee_vs}}<p class="vide">Aucune remarque pour l'instant.</p>{{/if}}
</div>
{{if $est_admin}}
<div class="card">
<h2>Qui a voté quoi</h2>
{{if $s.votes_simple|count}}
<ul style="list-style:none; margin:0; padding:0;">
{{#foreach from=$s.votes_simple item="v"}}
{{:assign var="txt_choix" value=""}}
{{#foreach from=$s.options item="o"}}
{{if $o.id == $v.choix}}{{:assign var="txt_choix" value=$o.texte}}{{/if}}
{{/foreach}}
<li style="padding:.4rem 0; border-bottom:1px solid #eceae8;">{{$v.nom}} — {{$txt_choix}}</li>
{{/foreach}}
</ul>
{{else}}
<p class="vide">Personne n'a encore voté.</p>
{{/if}}
</div>
<div class="card">
<h2>Ajouter une option</h2>
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}" class="ajout">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<label style="flex:2; min-width:14rem;">Texte de l'option <input type="text" name="texte" placeholder="ex. Samedi matin" required="required" /></label>
<button type="submit" name="add_option" value="1">Ajouter</button>
</form>
</div>
{{/if}}
*}}
{{else}}
{{:include file="_vote_date.html"}}
{{*
<div class="card">
{{if $creneaux|count}}
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<div class="scroll">
<table class="grille">
<thead>
<tr>
<th></th>
{{#foreach from=$creneaux item="c"}}
{{:assign var="th_oui" from="tot_oui.%s"|args:$c.id}}{{:assign var="th_peut" from="tot_peut.%s"|args:$c.id}}
<th class="creneau">{{if $c.titre|trim}}<em class="titre">{{$c.titre}}</em>{{/if}}{{if $c.date}}<b>{{$c.date|date_long}}</b><small>{{$c.debut}} → {{$c.fin}}</small>{{else}}<b>{{$c.label}}</b>{{/if}}
{{if $est_admin}}
{{if $th_oui < 1 && $th_peut < 1}}<button type="submit" name="edit_creneau" value="{{$c.id}}" class="mini" formnovalidate="formnovalidate" title="Modifier ce créneau">&#9998;</button>{{/if}} <button type="submit" name="suppr_creneau" value="{{$c.id}}" class="mini" formnovalidate="formnovalidate" title="Supprimer ce créneau">&#10005;</button>
{{/if}}
</th>
{{/foreach}}
</tr>
</thead>
<tbody>
{{#foreach from=$s.votes item="v"}}
<tr>
<th>{{$v.nom}} <button type="submit" name="edit_nom" value="{{$v.nom}}" class="mini" formnovalidate="formnovalidate" title="Modifier cette ligne">&#9998;</button> {{if $est_admin}}<button type="submit" name="suppr_nom" value="{{$v.nom}}" class="mini" formnovalidate="formnovalidate" title="Supprimer cette ligne">&#10005;</button>{{/if}}</th>
{{#foreach from=$creneaux item="c"}}
{{:assign var="val" from="v.choix.%s"|args:$c.id}}
{{if $val == 2}}<td class="oui">&#10004;</td>{{elseif $val == 1}}<td class="peut">(&#10004;)</td>{{else}}<td class="non"></td>{{/if}}
{{/foreach}}
</tr>
{{/foreach}}
<tr class="saisie">
<th><input type="text" name="nom" placeholder="Votre nom" value="{{$edit_nom}}" required="required" /></th>
{{#foreach from=$creneaux item="c"}}
{{:assign var="pre" from="edit_choix.%s"|args:$c.id}}
<td>
<label><input type="radio" name="dispo[{{$c.id}}]" value="2" {{if $pre == 2}}checked="checked"{{/if}} /> oui</label>
<label><input type="radio" name="dispo[{{$c.id}}]" value="1" {{if $pre == 1}}checked="checked"{{/if}} /> si besoin</label>
<label><input type="radio" name="dispo[{{$c.id}}]" value="0" {{if $pre != 1 && $pre != 2}}checked="checked"{{/if}} /> non</label>
</td>
{{/foreach}}
</tr>
<tr class="somme">
<th>Somme<small>{{$nb_votants}} votant(s)</small></th>
{{#foreach from=$creneaux item="c"}}
{{:assign var="n_oui" from="tot_oui.%s"|args:$c.id}}
{{:assign var="n_peut" from="tot_peut.%s"|args:$c.id}}
<td>{{if $n_oui > 0 && $n_oui == $max_oui}}<span class="best">&#9733; {{$n_oui}}</span>{{elseif $n_oui > 0}}{{$n_oui}}{{else}}0{{/if}}{{if $n_peut > 0}}<small>(+{{$n_peut}})</small>{{/if}}</td>
{{/foreach}}
</tr>
</tbody>
</table>
</div>
<p class="champ" style="margin-top:.8rem;"><label style="display:block; font-size:.9rem; color:#666; margin-bottom:.3rem;">Remarque (facultatif)</label><textarea name="remarque" rows="2" placeholder="Une précision à ajouter ?" style="width:100%; font-family:inherit; font-size:1rem; padding:.45rem .7rem; border:1px solid #bbb; border-radius:.4rem;">{{$edit_remarque}}</textarea></p>
<p><button type="submit" name="enregistrer" value="1">Enregistrer mes disponibilités</button></p>
<p class="aide">Tapez votre nom, cochez vos disponibilités puis enregistrez. Pour corriger une ligne existante, cliquez sur le crayon à côté du nom.</p>
</form>
{{else}}
<p class="vide">Aucun créneau pour l'instant.{{if $est_admin}} Ajoutez-en un ci-dessous pour commencer.{{/if}}</p>
{{/if}}
</div>
{{:assign var="remarque_trouvee" value=false}}
<div class="card">
<h2>Remarques</h2>
<ul style="list-style:none; margin:0; padding:0;">
{{#foreach from=$s.votes item="v"}}
{{if $v.remarque|trim}}
{{:assign var="remarque_trouvee" value=true}}
<li style="padding:.5rem 0; border-bottom:1px solid #eceae8;"><b>{{$v.nom}}</b> — {{$v.remarque}}</li>
{{/if}}
{{/foreach}}
</ul>
{{if !$remarque_trouvee}}<p class="vide">Aucune remarque pour l'instant.</p>{{/if}}
</div>
{{if $est_admin}}
<div class="card">
{{if $edit_c_ok}}
<h2>Modifier ce créneau</h2>
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}" class="ajout">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<label>Titre <input type="text" name="titre" value="{{$edit_c_titre}}" placeholder="ex. Permanence atelier" /></label>
<label>Date <input type="date" name="date" value="{{$edit_c_date}}" required="required" /></label>
<label>de <input type="time" name="debut" value="{{$edit_c_debut}}" required="required" /></label>
<label>à <input type="time" name="fin" value="{{$edit_c_fin}}" required="required" /></label>
<button type="submit" name="rename_creneau" value="{{$edit_creneau}}">Enregistrer</button>
<a class="retour" href="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}">Annuler</a>
</form>
{{else}}
<h2>Ajouter un créneau</h2>
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}" class="ajout">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<label>Titre <input type="text" name="titre" placeholder="ex. Permanence atelier" /></label>
<label>Date <input type="date" name="date" required="required" /></label>
<label>de <input type="time" name="debut" value="19:00" required="required" /></label>
<label>à <input type="time" name="fin" value="21:00" required="required" /></label>
<button type="submit" name="add_creneau" value="1">Ajouter la colonne</button>
</form>
{{/if}}
</div>
<div class="card">
<h2>Ajouter plusieurs créneaux (saisie libre)</h2>
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<table style="width:100%; border-collapse:collapse;">
<thead><tr><th style="text-align:left; font-size:.85rem; color:#666;">Titre</th><th style="text-align:left; font-size:.85rem; color:#666;">Date</th><th style="text-align:left; font-size:.85rem; color:#666;">De</th><th style="text-align:left; font-size:.85rem; color:#666;">À</th></tr></thead>
<tbody>
<tr><td><input type="text" name="titre_1" placeholder="ex. Permanence" /></td><td><input type="date" name="date_1" /></td><td><input type="time" name="debut_1" value="19:00" /></td><td><input type="time" name="fin_1" value="21:00" /></td></tr>
<tr><td><input type="text" name="titre_2" placeholder="ex. Permanence" /></td><td><input type="date" name="date_2" /></td><td><input type="time" name="debut_2" value="19:00" /></td><td><input type="time" name="fin_2" value="21:00" /></td></tr>
<tr><td><input type="text" name="titre_3" placeholder="ex. Permanence" /></td><td><input type="date" name="date_3" /></td><td><input type="time" name="debut_3" value="19:00" /></td><td><input type="time" name="fin_3" value="21:00" /></td></tr>
<tr><td><input type="text" name="titre_4" placeholder="ex. Permanence" /></td><td><input type="date" name="date_4" /></td><td><input type="time" name="debut_4" value="19:00" /></td><td><input type="time" name="fin_4" value="21:00" /></td></tr>
<tr><td><input type="text" name="titre_5" placeholder="ex. Permanence" /></td><td><input type="date" name="date_5" /></td><td><input type="time" name="debut_5" value="19:00" /></td><td><input type="time" name="fin_5" value="21:00" /></td></tr>
</tbody>
</table>
<p class="aide">Laissez la date vide pour ignorer une ligne. Seules les lignes avec une date seront ajoutées.</p>
<p><button type="submit" name="ajout_multiple" value="1">Ajouter ces créneaux</button></p>
</form>
</div>
<div class="card">
<h2>Générer des créneaux automatiquement</h2>
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}" class="ajout">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<label>Titre <input type="text" name="g_titre" placeholder="ex. Permanence atelier" /></label>
<label>de <input type="time" name="g_heure_debut" value="19:00" required="required" /></label>
<label>à <input type="time" name="g_heure_fin" value="21:00" required="required" /></label>
<label>Du <input type="date" name="g_debut_periode" required="required" /></label>
<label>au <input type="date" name="g_fin_periode" required="required" /></label>
<button type="submit" name="generer_creneaux" value="1">Générer les créneaux</button>
<div style="width:100%; display:flex; gap:1rem; flex-wrap:wrap; margin-top:.5rem;">
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="1" /> Lundi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="2" /> Mardi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="3" /> Mercredi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="4" /> Jeudi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="5" /> Vendredi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="6" /> Samedi</label>
<label style="display:flex; align-items:center; gap:.3rem; font-size:.9rem;"><input type="checkbox" name="g_jour[]" value="7" /> Dimanche</label>
</div>
</form>
<p class="aide">Crée un créneau pour chaque jour correspondant dans la période choisie (ex. "tous les mardis du 1er au 30 septembre"). Limité à un an à partir de la date de début.</p>
</div>
{{/if}}
*}}
{{if $est_admin}}
<div class="card danger">
<h2>Supprimer ce sondage</h2>
<form method="post" action="sondage.html?id={{$s.id}}&amp;code={{$code_saisi}}">
<input type="hidden" name="code" value="{{$code_saisi}}" />
<p><label><input type="checkbox" name="confirmer" value="1" /> Je confirme vouloir supprimer définitivement ce sondage et toutes les réponses.</label></p>
<p><button type="submit" name="suppr_sondage" value="1" class="danger">Supprimer le sondage</button></p>
</form>
</div>
{{/if}}
{{/if}}
</div>
<script>
var descEl = document.getElementById('desc-texte');
if (descEl) {
descEl.innerHTML = descEl.innerHTML.replace(/(https?:\/\/[^\s<]+)/g, '<a href="$1" target="_blank" rel="noopener">$1</a>');
}
</script>
{{*/html>*}}
<!-- v3 -->