Files
sondage/sondage.html
T
2026-11-06 18:44:01 +01:00

742 lines
39 KiB
HTML

{{* 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 -->