diff --git a/_config.html b/_config.html
new file mode 100644
index 0000000..f64d03c
--- /dev/null
+++ b/_config.html
@@ -0,0 +1,130 @@
+{{* Modifier sondage *}}
+{{if $subconf == "edit_son"}}
+
+
+{{* Nouveau sondage *}}
+{{elseif !$subconf || $subconf == "new_son"}}
+
+
+{{* Paramètres globaux *}}
+{{elseif !$subconf || $subconf == "edit_con"}}
+ {{if $est_admin}}
+ {{:include file="manage/_config.html"}}
+ {{else}}
+ Ces paramètres sont réservés à l'administrateur.
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/_crenaux.html b/_crenaux.html
new file mode 100644
index 0000000..ac372ba
--- /dev/null
+++ b/_crenaux.html
@@ -0,0 +1,77 @@
+
+
Créneaux
+ TODO
+ {{#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}}
+ {{if $c.titre|trim}}{{$c.titre}} {{/if}}{{if $c.date}}{{$c.date|date_long}} {{$c.debut}} → {{$c.fin}} {{else}}{{$c.label}} {{/if}}
+ {{if $est_admin}}
+ {{if $th_oui < 1 && $th_peut < 1}}
+ ✎
+ {{/if}}
+ ✕
+ {{/if}}
+
+ {{/foreach}}
+
+
+ {{if $edit_c_ok}}
+
Modifier ce créneau
+
+ {{else}}
+
Ajouter un créneau
+
+ {{/if}}
+
+
+
+
Ajouter plusieurs créneaux (saisie libre)
+
+
+
+
+
Générer des créneaux automatiquement
+
+
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.
+
\ No newline at end of file
diff --git a/_nav.html b/_nav.html
new file mode 100644
index 0000000..e68f212
--- /dev/null
+++ b/_nav.html
@@ -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}}
+*}}
+
+
+ {{*if $current == 'sondage'}}
+ {{#restrict section="web" level="write"}}
+
+ {{: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}}
+
+ {{/restrict}}
+ {{/if*}}
+ {{* menu principal : exclus pour le site anonyme *}}
+ {{if $is_logged==true}}
+
+ {{/if}}
+ {{* menu secondaire *}}
+ {{if $current == 'sondage'}}
+ {{:assign _liclass="current" _ulclass="sub"}}
+ {{if $is_logged==false}}
+ {{:assign _liclass="nav-mois" _ulclass="modal-liens"}}
+ {{/if}}
+
+ {{/if}}
+ {{#restrict section="web" level="write"}}
+ {{if $current == 'config'}}
+
+ {{/if}}
+ {{/restrict}}
+
+
+{{* Messages *}}
+{{if $_GET.msg == "ajout" }}
+ Ajout effectué
+{{elseif $_GET.msg == "vote" }}
+ Merci de votre participation !
+{{elseif $_GET.msg == "modification" }}
+ Modification effectuée
+{{elseif $_GET.msg == "suppression" }}
+ Suppression effectuée
+{{/if}}
\ No newline at end of file
diff --git a/_sondage.html b/_sondage.html
new file mode 100644
index 0000000..06c0d0b
--- /dev/null
+++ b/_sondage.html
@@ -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}}
+
+ {{* Vue des sondages en cours *}}
+ {{if !$vue || $vue=="encours"}}
+
+ {{* Vue des sondages archivés *}}
+ {{elseif $vue=="archive"}}
+
+
Sondages archivés (fermés)
+ {{if $au_moins_un_ferme}}
+
+ {{else}}
+
Aucun sondage archivé.
+ {{/if}}
+
+ {{* 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}}
+
\ No newline at end of file
diff --git a/_vote.html b/_vote.html
new file mode 100644
index 0000000..5bbee74
--- /dev/null
+++ b/_vote.html
@@ -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}}
+
+
+
Sondage
+
{{$s.description}}
+ {{if $s.options|count}}
+ {{* Ne pas laisser l'admin voter *}}
+ {{if !$est_admin}}
+
+ {{/if}}
+ {{else}}
+
Aucune option pour l'instant.{{if $est_admin}} Ajoutez-en ci-dessous.{{/if}}
+ {{/if}}
+
+
+
Résultats
+ {{if $s.options|count}}
+
+ {{#foreach from=$s.options item="o"}}
+ {{:assign var="n_o" from="tot_opt.%s"|args:$o.id}}
+
+ {{$o.texte}}
+
+ {{if $n_o > 0 && $n_o == $max_opt}}★ {{$n_o}} voix {{else}}{{$n_o}} voix{{/if}}
+
+ {{if $est_admin}}
+
+
+
+ {{/if}}
+
+ {{/foreach}}
+
+
{{$nb_votants_simple}} votant(s) au total.
+ {{else}}
+
Rien à afficher pour l'instant.
+ {{/if}}
+
+
+ {{:assign var="remarque_trouvee_vs" value=false}}
+
+
Remarques
+
+ {{#foreach from=$s.votes_simple item="v"}}
+ {{if $v.remarque|trim}}
+ {{:assign var="remarque_trouvee_vs" value=true}}
+ {{$v.nom}} — {{$v.remarque}}
+ {{/if}}
+ {{/foreach}}
+
+ {{if !$remarque_trouvee_vs}}
Aucune remarque pour l'instant.
{{/if}}
+
+
+ {{if $est_admin}}
+
+
Qui a voté quoi
+ {{if $s.votes_simple|count}}
+
+ {{#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}}
+
+ {{$v.nom}} — {{$txt_choix}}
+ {{if $est_admin}}
+
+ {{/if}}
+
+ {{/foreach}}
+
+ {{else}}
+
Personne n'a encore voté.
+ {{/if}}
+
+
+
+
Ajouter une option
+
+
+ {{/if}}
+
+
+{{:debug sondage=$s}}
\ No newline at end of file
diff --git a/_vote_date.html b/_vote_date.html
new file mode 100644
index 0000000..4929565
--- /dev/null
+++ b/_vote_date.html
@@ -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}}
+
+
+
Créneaux
+ {{if $creneaux|count}}
+
+ {{else}}
+
Aucun créneau pour l'instant.{{if $est_admin}} Ajoutez-en un ci-dessous pour commencer.{{/if}}
+ {{/if}}
+
+
+ {{:assign var="remarque_trouvee" value=false}}
+
+
Remarques
+
+ {{#foreach from=$s.votes item="v"}}
+ {{if $v.remarque|trim}}
+ {{:assign var="remarque_trouvee" value=true}}
+ {{$v.nom}} — {{$v.remarque}}
+ {{/if}}
+ {{/foreach}}
+
+ {{if !$remarque_trouvee}}
Aucune remarque pour l'instant.
{{/if}}
+
+
+ {{*if $est_admin}}
+
+
+
+
Ajouter plusieurs créneaux (saisie libre)
+
+
+ Laissez la date vide pour ignorer une ligne. Seules les lignes avec une date seront ajoutées.
+ Ajouter ces créneaux
+
+
+
+
+ {{/if*}}
+{{:debug sondage=$s}}
\ No newline at end of file
diff --git a/icon.svg b/icon.svg
new file mode 100644
index 0000000..f241efc
--- /dev/null
+++ b/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..0d49bff
--- /dev/null
+++ b/index.html
@@ -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}}mode admin {{/if}}
+{{* TODO membre logué
+ *}}
+{{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}}
\ No newline at end of file
diff --git a/manage/_config.html b/manage/_config.html
new file mode 100644
index 0000000..593439f
--- /dev/null
+++ b/manage/_config.html
@@ -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}}
+
+
+
+ Paramètres
+
+ {{:input type="checkbox" name="purge" label="Purge les créneaux passés" checked=$module.config.purge value=true}}
+
+
+
+ Ajouter un type de sondage
+
+
+ Nom Label Catégorie de membres
+
+ {{:input type="text" help="Un seul mot en minuscules" placeholder="Ex. actifs" name="name"}}
+ {{:input type="text" placeholder="Ex. Sondage privé (Conseil Collégial/CA)" name="label"}}
+ {{:input type="select" name="cat" options=$member_cat}}
+
+ {{if $module.config.sondage_styles}}
+ {{#foreach from=$module.config.sondage_styles key="key" }}
+
+ {{$key}}
+ {{$label}}
+ {{if $mcat|intval > 0 }}
+ {{:assign var="mcat_label" from="member_cat.%s.label"|args:$mcat}}
+ {{$mcat_label}}
+ {{else}}
+ {{$mcat}}
+ {{/if}}
+
+ {{/foreach}}
+ {{/if}}
+
+
+
+
+ {{:button type="submit" name="save_param" label="Enregistrer" shape="right" class="main"}}
+
+
\ No newline at end of file
diff --git a/manage/_sondage.html b/manage/_sondage.html
new file mode 100644
index 0000000..3a644c2
--- /dev/null
+++ b/manage/_sondage.html
@@ -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}}
\ No newline at end of file
diff --git a/manage/_sondage_creneaux.html b/manage/_sondage_creneaux.html
new file mode 100644
index 0000000..b99c281
--- /dev/null
+++ b/manage/_sondage_creneaux.html
@@ -0,0 +1,177 @@
+{{* ---------- 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}}
+ {{: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}}
\ No newline at end of file
diff --git a/manage/_sondage_simple.html b/manage/_sondage_simple.html
new file mode 100644
index 0000000..6041846
--- /dev/null
+++ b/manage/_sondage_simple.html
@@ -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}}
\ No newline at end of file
diff --git a/manage/_vote.html b/manage/_vote.html
new file mode 100644
index 0000000..53874fe
--- /dev/null
+++ b/manage/_vote.html
@@ -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}}
\ No newline at end of file
diff --git a/module.ini b/module.ini
new file mode 100644
index 0000000..e6ac038
--- /dev/null
+++ b/module.ini
@@ -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
\ No newline at end of file
diff --git a/sondage.css b/sondage.css
new file mode 100644
index 0000000..1472aa0
--- /dev/null
+++ b/sondage.css
@@ -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; }
+}
\ No newline at end of file
diff --git a/sondage.html b/sondage.html
new file mode 100644
index 0000000..188e2b0
--- /dev/null
+++ b/sondage.html
@@ -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é
+ *}}
+{{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}}
+*}}
+{{*
+
+
+
+
+
+{{$s.titre}} — {{$config.org_name}}
+
+
+
+
+
+
← Retour au site · Tous les sondages {{if $est_admin}}· + Nouveau sondage libre {{/if}}
+
{{$s.titre}}{{if $est_admin}}mode admin {{/if}}
+*}}
+
+
Description
+{{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}}
+
+
+ {{$s.description}}
+ Enregistrer la description
+
+{{else}}
+ {{if $s.description|trim}}
{{$s.description}}
{{else}}
Aucune description.
{{/if}}
+{{/if}}
+
+
+{{if $s.mode == "simple"}}
+ {{:include file="_vote.html"}}
+{{*
+
+
Voter
+{{if $s.options|count}}
+
+
+ Votre nom
+
+ {{#foreach from=$s.options item="o"}}
+
+ {{$o.texte}}
+
+ {{/foreach}}
+
+ Remarque (facultatif) {{$edit_remarque_vs}}
+ Voter
+ Pour corriger votre vote, retapez le même nom et choisissez une autre option.
+
+{{else}}
+
Aucune option pour l'instant.{{if $est_admin}} Ajoutez-en ci-dessous.{{/if}}
+{{/if}}
+
+
+
+
Résultats
+{{if $s.options|count}}
+
+{{#foreach from=$s.options item="o"}}
+ {{:assign var="n_o" from="tot_opt.%s"|args:$o.id}}
+
+ {{$o.texte}}
+
+ {{if $n_o > 0 && $n_o == $max_opt}}★ {{$n_o}} voix {{else}}{{$n_o}} voix{{/if}}
+
+ {{if $est_admin}}
+
+
+
+ ✕
+
+
+ {{/if}}
+
+{{/foreach}}
+
+
{{$nb_votants_simple}} votant(s) au total.
+{{else}}
+
Rien à afficher pour l'instant.
+{{/if}}
+
+
+{{:assign var="remarque_trouvee_vs" value=false}}
+
+
Remarques
+
+{{#foreach from=$s.votes_simple item="v"}}
+ {{if $v.remarque|trim}}
+ {{:assign var="remarque_trouvee_vs" value=true}}
+ {{$v.nom}} — {{$v.remarque}}
+ {{/if}}
+{{/foreach}}
+
+{{if !$remarque_trouvee_vs}}
Aucune remarque pour l'instant.
{{/if}}
+
+
+{{if $est_admin}}
+
+
Qui a voté quoi
+{{if $s.votes_simple|count}}
+
+{{#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}}
+ {{$v.nom}} — {{$txt_choix}}
+{{/foreach}}
+
+{{else}}
+
Personne n'a encore voté.
+{{/if}}
+
+
+
+
Ajouter une option
+
+
+ Texte de l'option
+ Ajouter
+
+
+{{/if}}
+*}}
+{{else}}
+ {{:include file="_vote_date.html"}}
+ {{*
+
+{{if $creneaux|count}}
+
+
+
+Remarque (facultatif) {{$edit_remarque}}
+Enregistrer mes disponibilités
+Tapez votre nom, cochez vos disponibilités puis enregistrez. Pour corriger une ligne existante, cliquez sur le crayon à côté du nom.
+
+{{else}}
+
Aucun créneau pour l'instant.{{if $est_admin}} Ajoutez-en un ci-dessous pour commencer.{{/if}}
+{{/if}}
+
+
+{{:assign var="remarque_trouvee" value=false}}
+
+
Remarques
+
+{{#foreach from=$s.votes item="v"}}
+ {{if $v.remarque|trim}}
+ {{:assign var="remarque_trouvee" value=true}}
+ {{$v.nom}} — {{$v.remarque}}
+ {{/if}}
+{{/foreach}}
+
+{{if !$remarque_trouvee}}
Aucune remarque pour l'instant.
{{/if}}
+
+
+{{if $est_admin}}
+
+
+
+
Ajouter plusieurs créneaux (saisie libre)
+
+
+
+ Laissez la date vide pour ignorer une ligne. Seules les lignes avec une date seront ajoutées.
+ Ajouter ces créneaux
+
+
+
+
+
+{{/if}}
+*}}
+{{if $est_admin}}
+
+
Supprimer ce sondage
+
+
+ Je confirme vouloir supprimer définitivement ce sondage et toutes les réponses.
+ Supprimer le sondage
+
+
+{{/if}}
+
+{{/if}}
+
+
+
+
+
+{{*/html>*}}
+
+
\ No newline at end of file