Première version du module agenda

This commit is contained in:
bountz committed 2026-11-06 12:02:29 +01:00
1 parent e00dddf045
commit 76df5b8ad5
10 files changed
+1747

No files matched your search

+48
View File
@@ -0,0 +1,48 @@
{{if $est_admin}}
<div class="card card-perm">
<h2>Rendez-vous réguliers</h2>
{{:assign var="perm_trouve" value=false}}
<div class="scroll-cal">
<table class="permanences">
<thead><tr><th>Récurrence</th><th>Jour</th><th>Horaires</th><th>Détail</th><th>Lieu</th><th>Calendrier</th><th>Depuis / jusqu'à</th>{{if $est_admin}}<th></th>{{/if}}</tr></thead>
<tbody>
{{#load where="$$.type = 'permanence'" order="$$.jour ASC, $$.debut ASC"}}
{{:assign var="perm_trouve" value=true}}
{{:assign var="nom_jour" from="noms_jours.%s"|args:$jour}}
<tr>
<td>
{{if $type_recurrence == "mensuel"}}
{{if $semaine_du_mois == -1}}Dernier{{elseif $semaine_du_mois == 1}}1er{{else}}{{$semaine_du_mois}}e{{/if}} du mois
{{elseif $type_recurrence == "quinzaine"}}
Toutes les 2 semaines
{{else}}
Chaque semaine
{{/if}}
</td>
<td>{{$nom_jour}}</td>
<td>{{$debut}}{{if $fin}} — {{$fin}}{{/if}}</td>
<td>{{$label}}</td>
<td>{{if $lieu}}<a class="lieu-lien" href="https://www.openstreetmap.org/search?query={{$lieu|url_encode}}" target="_blank" rel="noopener">{{$lieu}}</a>{{/if}}</td>
<td>
{{:assign var="cal_eff_tab" value=$calendrier}}
{{if $cal_eff_tab == ""}}{{:assign var="cal_eff_tab" value="agenda"}}{{/if}}
{{:assign var="nom_cal_tab" from="calendriers_liste.%s.nom"|args:$cal_eff_tab}}
{{$nom_cal_tab}}
</td>
<td>{{if $date_debut}}à partir du {{$date_debut|date_short}}{{/if}}{{if $date_debut && $date_fin}}<br />{{/if}}{{if $date_fin}}jusqu'au {{$date_fin|date_short}}{{/if}}</td>
{{if $est_admin}}
<td>
<a class="mini" href="index.html?edit_perm={{$id}}#form-perm" title="Modifier">&#9998;</a>
<form method="post" action="index.html" style="display:inline">
<button type="submit" name="suppr_perm" value="{{$id}}" class="mini" title="Supprimer">&#10005;</button>
</form>
</td>
{{/if}}
</tr>
{{/load}}
</tbody>
</table>
</div>
{{if !$perm_trouve}}<p class="vide">Aucun rendez-vous régulier enregistré.</p>{{/if}}
</div>
{{/if}}
+171
View File
@@ -0,0 +1,171 @@
{{if $vue != "liste"}}
<div class="card">
<h2>Calendrier ({{$cal_filtre}})</h2>
{{if $vue == "mois"}}
<div class="nav-mois">
<a href="{{$_url}}?vue=mois&amp;an={{$an_prec}}&amp;mois={{$mois_prec}}">&larr;</a>
<span>{{$nom_mois}}</span>
<a href="{{$_url}}?vue=mois&amp;an={{$an_suiv}}&amp;mois={{$mois_suiv}}">&rarr;</a>
</div>
{{else}}
<div class="nav-mois">
{{if $semaine_sel <= 1}}
<a href="{{$_url}}?vue=semaine&amp;an={{$an_prec}}&amp;mois={{$mois_prec}}&amp;semaine_sel={{$total_rows_prec}}">&larr;</a>
{{else}}
<a href="{{$_url}}?vue=semaine&amp;an={{$an}}&amp;mois={{$mois}}&amp;semaine_sel={{"%d-1"|math:$semaine_sel}}">&larr;</a>
{{/if}}
<span>Semaine du {{$nom_mois}}</span>
{{if $semaine_sel >= $total_rows}}
<a href="{{$_url}}?vue=semaine&amp;an={{$an_suiv}}&amp;mois={{$mois_suiv}}&amp;semaine_sel=1">&rarr;</a>
{{else}}
<a href="{{$_url}}?vue=semaine&amp;an={{$an}}&amp;mois={{$mois}}&amp;semaine_sel={{"%d+1"|math:$semaine_sel}}">&rarr;</a>
{{/if}}
</div>
{{/if}}
<div class="scroll-cal">
<table class="calendrier">
<thead>
<tr><th>Lun</th><th>Mar</th><th>Mer</th><th>Jeu</th><th>Ven</th><th>Sam</th><th>Dim</th></tr>
</thead>
<tbody>
<tr>
{{:assign var="cellules." value=1}}{{:assign var="cellules." value=2}}{{:assign var="cellules." value=3}}{{:assign var="cellules." value=4}}{{:assign var="cellules." value=5}}{{:assign var="cellules." value=6}}{{:assign var="cellules." value=7}}{{:assign var="cellules." value=8}}{{:assign var="cellules." value=9}}{{:assign var="cellules." value=10}}
{{:assign var="cellules." value=11}}{{:assign var="cellules." value=12}}{{:assign var="cellules." value=13}}{{:assign var="cellules." value=14}}{{:assign var="cellules." value=15}}{{:assign var="cellules." value=16}}{{:assign var="cellules." value=17}}{{:assign var="cellules." value=18}}{{:assign var="cellules." value=19}}{{:assign var="cellules." value=20}}
{{:assign var="cellules." value=21}}{{:assign var="cellules." value=22}}{{:assign var="cellules." value=23}}{{:assign var="cellules." value=24}}{{:assign var="cellules." value=25}}{{:assign var="cellules." value=26}}{{:assign var="cellules." value=27}}{{:assign var="cellules." value=28}}{{:assign var="cellules." value=29}}{{:assign var="cellules." value=30}}
{{:assign var="cellules." value=31}}{{:assign var="cellules." value=32}}{{:assign var="cellules." value=33}}{{:assign var="cellules." value=34}}{{:assign var="cellules." value=35}}{{:assign var="cellules." value=36}}{{:assign var="cellules." value=37}}{{:assign var="cellules." value=38}}{{:assign var="cellules." value=39}}{{:assign var="cellules." value=40}}
{{:assign var="cellules." value=41}}{{:assign var="cellules." value=42}}
{{#foreach from=$cellules item="n"}}
{{:assign var="rangee_n" value="floor((%d-1)/7)+1"|math:$n}}
{{if $vue == "mois" || $rangee_n == $semaine_sel}}
{{:assign var="jour_num" value="%d-%d"|math:$n:$decalage}}
{{if $jour_num >= 1 && $jour_num <= $nb_jours}}
{{:assign var="date_cellule" value="%04d-%02d-%02d"|args:$an:$mois:$jour_num}}
{{:assign var="dow_cellule" value=$date_cellule|date:"N"}}
{{:assign var="occurrence_mois" value="floor((%d-1)/7)+1"|math:$jour_num}}
{{:assign var="est_derniere_occurrence" value=false}}
{{if "%d+7"|math:$jour_num > $nb_jours}}{{:assign var="est_derniere_occurrence" value=true}}{{/if}}
{{:assign var="evts_ce_jour" from="events_par_jour.%s"|args:$date_cellule}}
{{:assign var="badges_jour" value=""}}
{{#foreach from=$perms_data item="pd"}}
{{if $pd.jour == $dow_cellule}}
{{if $pd.date_debut == "" || $date_cellule >= $pd.date_debut}}
{{if $pd.date_fin == "" || $date_cellule <= $pd.date_fin}}
{{:assign var="est_exclue" value=false}}
{{#foreach from=$pd.exceptions item="ex"}}
{{if $ex == $date_cellule}}{{:assign var="est_exclue" value=true}}{{/if}}
{{/foreach}}
{{if !$est_exclue}}
{{:assign var="afficher_badge" value=false}}
{{if $pd.type_recurrence == "mensuel"}}
{{if $pd.semaine_du_mois == -1 && $est_derniere_occurrence}}{{:assign var="afficher_badge" value=true}}{{/if}}
{{if $pd.semaine_du_mois == $occurrence_mois}}{{:assign var="afficher_badge" value=true}}{{/if}}
{{elseif $pd.type_recurrence == "quinzaine"}}
{{if $pd.date_debut != ""}}
{{:assign var="ref_sem_q" value=$pd.date_debut|date:"W"|intval}}
{{:assign var="cell_sem_q" value=$date_cellule|date:"W"|intval}}
{{:assign var="diff_sem_q" value="(%d-%d) %% 2"|math:$cell_sem_q:$ref_sem_q}}
{{if $diff_sem_q == 0}}{{:assign var="afficher_badge" value=true}}{{/if}}
{{/if}}
{{else}}
{{:assign var="afficher_badge" value=true}}
{{/if}}
{{if $afficher_badge}}
{{:assign var="cle_b" value="%s_a_perm%s"|args:$pd.debut:$pd.id}}
{{:assign var="badges_jour.%s.type"|args:$cle_b value="perm"}}
{{:assign var="badges_jour.%s.debut"|args:$cle_b value=$pd.debut}}
{{:assign var="badges_jour.%s.fin"|args:$cle_b value=$pd.fin}}
{{:assign var="badges_jour.%s.label"|args:$cle_b value=$pd.label}}
{{:assign var="badges_jour.%s.couleur"|args:$cle_b value=$pd.couleur|or:'#4c7a2e'}}
{{:assign var="badges_jour.%s.pid"|args:$cle_b value=$pd.id}}
{{:assign var="badges_jour.%s.lieu"|args:$cle_b value=$pd.lieu}}
{{:assign var="badges_jour.%s.description"|args:$cle_b value=$pd.description}}
{{/if}}
{{/if}}
{{/if}}
{{/if}}
{{/if}}
{{/foreach}}
{{if $evts_ce_jour}}
{{#foreach from=$evts_ce_jour item="ev"}}
{{:assign var="cle_b" value="%s_b_evt%s"|args:$ev.debut:$ev.id}}
{{:assign var="badges_jour.%s.type"|args:$cle_b value="evt"}}
{{:assign var="badges_jour.%s.id"|args:$cle_b value=$ev.id}}
{{:assign var="badges_jour.%s.debut"|args:$cle_b value=$ev.debut}}
{{:assign var="badges_jour.%s.fin"|args:$cle_b value=$ev.fin}}
{{:assign var="badges_jour.%s.label"|args:$cle_b value=$ev.titre}}
{{:assign var="badges_jour.%s.couleur"|args:$cle_b value=$ev.couleur|or:'#8c3a1e'}}
{{:assign var="badges_jour.%s.lieu"|args:$cle_b value=$ev.lieu}}
{{:assign var="badges_jour.%s.description"|args:$cle_b value=$ev.description}}
{{:assign var="badges_jour.%s.lien"|args:$cle_b value=$ev.lien}}
{{:assign var="badges_jour.%s.lien1_label"|args:$cle_b value=$ev.lien1_label}}
{{:assign var="badges_jour.%s.lien1_url"|args:$cle_b value=$ev.lien1_url}}
{{:assign var="badges_jour.%s.lien2_label"|args:$cle_b value=$ev.lien2_label}}
{{:assign var="badges_jour.%s.lien2_url"|args:$cle_b value=$ev.lien2_url}}
{{:assign var="badges_jour.%s.lien3_label"|args:$cle_b value=$ev.lien3_label}}
{{:assign var="badges_jour.%s.lien3_url"|args:$cle_b value=$ev.lien3_url}}
{{/foreach}}
{{/if}}
{{if $badges_jour}}
{{:assign var="badges_tries" value=$badges_jour|ksort|values}}
{{else}}
{{:assign var="badges_tries" value=""}}
{{/if}}
<td{{if $date_cellule == $aujourdhui}} class="today"{{/if}}>
<div class="num">{{$jour_num}}</div>
{{#foreach from=$badges_tries item="bj"}}
{{if $bj.type == "perm"}}
<div class="perm-badge" style="background:{{$bj.couleur}};">
<div class="badge-content" onclick="ouvrirDetailEvt(this);" data-titre="{{$bj.label}}" data-horaire="{{if $bj.debut}}{{$bj.debut}}{{if $bj.fin}}–{{$bj.fin}}{{/if}}{{/if}}" data-lieu="{{$bj.lieu}}" data-description="{{$bj.description}}" data-lien1-label="" data-lien1-url="" data-lien2-label="" data-lien2-url="" data-lien3-label="" data-lien3-url="">
{{if $bj.debut}}{{$bj.debut}}{{if $bj.fin}}–{{$bj.fin}}{{/if}} — {{/if}}{{$bj.label}}{{if $bj.lieu}}<br /><a class="lieu-lien" href="https://www.openstreetmap.org/search?query={{$bj.lieu|url_encode}}" target="_blank" rel="noopener" onclick="event.stopPropagation();">&#128205; {{$bj.lieu}}</a>{{/if}}
{{if $bj.description}}<div class="evt-desc-apercu">{{$bj.description}}</div>{{/if}}
</div>
{{if $est_admin}}
<span class="badge-actions">
<a class="badge-edit" href="index.html?edit_perm={{$bj.pid}}#form-perm" title="Modifier" onclick="event.stopPropagation();">&#9998;</a>
<form method="post" action="index.html?an={{$an}}&amp;mois={{$mois}}" class="mini-form" onclick="event.stopPropagation();">
<input type="hidden" name="perm_id" value="{{$bj.pid}}" />
<input type="hidden" name="date_exclue" value="{{$date_cellule}}" />
<input type="hidden" name="retour_an" value="{{$an}}" />
<input type="hidden" name="retour_mois" value="{{$mois}}" />
<button type="submit" name="suppr_occurrence" value="1" class="mini-x" title="Supprimer seulement ce jour">&#10005;</button>
</form>
</span>
{{/if}}
</div>
{{else}}
{{* background: hsl(var(--first-color), 50%, 90%);
background: linear-gradient(200deg, hsl(var(--first-color), 50%, 90%) 5%, hsl(var(--second-color), 30%, 90%) 30%);
*}}
<div class="evt-badge" style="background:hsl({{$bj.couleur}},100%,50%);">
<div class="badge-content" onclick="ouvrirDetailEvt(this);" data-titre="{{$bj.label}}" data-horaire="{{if $bj.debut}}{{$bj.debut}}{{if $bj.fin}}–{{$bj.fin}}{{/if}}{{/if}}" data-lieu="{{$bj.lieu}}" data-description="{{$bj.description}}" data-lien="{{$bj.lien}}" data-lien1-label="{{$bj.lien1_label}}" data-lien1-url="{{$bj.lien1_url}}" data-lien2-label="{{$bj.lien2_label}}" data-lien2-url="{{$bj.lien2_url}}" data-lien3-label="{{$bj.lien3_label}}" data-lien3-url="{{$bj.lien3_url}}">
{{if $bj.debut}}{{$bj.debut}}{{if $bj.fin}}–{{$bj.fin}}{{/if}} — {{/if}}{{$bj.label}}{{if $bj.lieu}}<br /><a class="lieu-lien" href="https://www.openstreetmap.org/search?query={{$bj.lieu|url_encode}}" target="_blank" rel="noopener" onclick="event.stopPropagation();">&#128205; {{$bj.lieu}}</a>{{/if}}
{{if $bj.description}}<div class="evt-desc-apercu">{{$bj.description}}</div>{{/if}}
</div>
{{if $est_admin}}
<span class="badge-actions">
<a class="badge-edit" href="index.html?edit_event={{$bj.id}}&amp;an={{$an}}&amp;mois={{$mois}}#form-event" title="Modifier" onclick="event.stopPropagation();">&#9998;</a>
<form method="post" action="index.html?an={{$an}}&amp;mois={{$mois}}" class="mini-form" onclick="event.stopPropagation();">
<input type="hidden" name="retour_an" value="{{$an}}" />
<input type="hidden" name="retour_mois" value="{{$mois}}" />
<button type="submit" name="suppr_event" value="{{$bj.id}}" class="mini-x" title="Supprimer">&#10005;</button>
</form>
</span>
{{/if}}
</div>
{{/if}}
{{/foreach}}
</td>
{{else}}
<td class="vide"></td>
{{/if}}
{{/if}}
{{if $vue == "mois" && "%d %% 7"|math:$n == 0 && $n != 42}}</tr><tr>{{/if}}
{{/foreach}}
</tr>
</tbody>
</table>
</div>
</div>
{{/if}}
+183
View File
@@ -0,0 +1,183 @@
{{if $est_admin && $subconf=="manage_cal"}}
<div class="card">
<h2>Gérer les calendriers</h2>
<table class="permanences">
<thead><tr><th>Nom</th><th>Actions</th></tr></thead>
<tbody>
{{#foreach from=$calendriers_liste item="cd_gest"}}
<tr>
<td>{{$cd_gest.nom}}{{if $cd_gest.par_defaut}} <small style="color:#999;">(par défaut)</small>{{/if}}</td>
<td>
{{if !$cd_gest.par_defaut}}
<form method="post" action="" style="display:inline">
{{* <button type="submit" name="suppr_calendrier" value="{{$cd_gest.id}}" class="mini" title="Supprimer ce calendrier">&#10005; Supprimer</button>*}}
{{:button type="submit" name="suppr_calendrier" label="Supprimer ce calendrier" shape="delete" value="%s"|args:$cd_gest.id}}
</form>
{{/if}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
<form method="post" action="" class="ajout" style="margin-top:.8rem;">
{{* <div class="champ" style="flex:2; min-width:14rem;"><label>Nouveau calendrier</label>
<input type="text" name="nom_calendrier" placeholder="ex. Réunions" required="required" />
</div>
<button type="submit" name="add_calendrier" value="1">Ajouter</button>
*}}
<dl>{{:input type="text" name="nom_calendrier" label="Nouveau calendrier" help="ex. Réunions" required=true}}</dl>
{{:button type="submit" name="add_calendrier" label="Ajouter" title="Ajouter un calendrier" shape="plus" value="1"}}
</form>
<p class="aide" style="color:#777; font-size:.85rem; margin:.6rem 0 0;">Supprimer un calendrier ne supprime pas les événements/rendez-vous qui y étaient rattachés — ils basculent simplement dans "Agenda" par défaut.</p>
</div>
{{/if}}
{{if $est_admin && $subconf=="manage_eve"}}
{{*:debug event=$event*}}
<form method="post" action="">
<fieldset class="entree">
<legend>{{if $edit_event}}Modifier l'événement{{else}}Ajouter un événement{{/if}}</legend>
<dl>
{{:input type="hidden" name="retour_an" default=$an}}
{{:input type="hidden" name="retour_mois" default=$mois}}
{{:input type="text" name="titre" label="Titre" default=$event.titre required=true}}
{{:input type="date" name="date" label="Date" default=$event.date required=true}}
{{:input type="time" name="debut" label="De" default=$event.debut}}
{{:input type="time" name="fin" label="À" default=$event.fin}}
{{:input type="text" name="lieu" label="Lieu" default=$event.lieu}}
{{:input type="hue" name="couleur" label="Couleur" }}
{{:assign var="ee_cal_eff" value=$event.calendrier}}
{{if $ee_cal_eff == ""}}{{:assign var="ee_cal_eff" value="agenda"}}{{/if}}
{{#foreach from=$calendriers_liste item="cd_opt"}}
{{:assign var="calendriers_options.%s"|args:$cd_opt.id label=$cd_opt.nom}}
{{/foreach}}
{{*:debug cal=$calendriers_options*}}
{{:input type="select" name="calendrier" label="Calendrier" default=$event.calendrier options=$calendriers_options required=true}}
{{:input type="textarea" cols=40 rows=3 name="description" label="Description complète" default=$event.description required=false}}
<div class="ajout">{{:input type="text" name="lien1_label" label="Lien 1 — libellé" default=$event.lien1_label placeholder="Ex. Affiche"}}{{:input type="text" name="lien1_url" label="Lien 1 — URL" default=$event.lien1_url placeholder="https://…"}}</div>
<div class="ajout">{{:input type="text" name="lien2_label" label="Lien 2 — libellé" default=$event.lien2_label placeholder="Ex. Programme"}}{{:input type="text" name="lien2_url" label="Lien 2 — URL" default=$event.lien2_url placeholder="https://…"}}</div>
<div class="ajout">{{:input type="text" name="lien3_label" label="Lien 3 — libellé" default=$event.lien3_label placeholder="Ex. Inscription"}}{{:input type="text" name="lien3_url" label="Lien 3 — URL" default=$event.lien3_url placeholder="https://…"}}</div>
</dl>
</fieldset>
<p class="submit">
{{if $edit_event}}
<a class="retour" href="?an={{$an}}&amp;mois={{$mois}}">Annuler</a>
{{:button type="submit" name="save_event" label="Enregistrer les modifications" class="main" value="%s"|args:$event.key}}
{{else}}
{{:button type="submit" name="save_event" label="Ajouter l'événement" shape="plus" class="main"}}
{{/if}}
</p>
</form>
{{* <div class="card" id="form-event">
<h2>{{if $edit_event}}Modifier l'événement{{else}}Ajouter un événement{{/if}}</h2>
<form method="post" action="index.html?an={{$an}}&amp;mois={{$mois}}">
<input type="hidden" name="retour_an" value="{{$an}}" />
<input type="hidden" name="retour_mois" value="{{$mois}}" />
<div class="ajout">
<div class="champ" style="flex:2; min-width:14rem;"><label>Titre</label><input type="text" name="titre" value="{{$ee_titre}}" required="required" /></div>
<div class="champ"><label>Date</label><input type="date" name="date" value="{{$ee_date}}" required="required" /></div>
<div class="champ"><label>De</label><input type="time" name="debut" value="{{$ee_debut}}" /></div>
<div class="champ"><label>À</label><input type="time" name="fin" value="{{$ee_fin}}" /></div>
<div class="champ" style="flex:1; min-width:10rem;"><label>Lieu</label><input type="text" name="lieu" value="{{$ee_lieu}}" /></div>
<div class="champ" style="flex:0 0 5rem;"><label>Couleur</label><input type="color" name="couleur" value="{{$ee_couleur|or:'#8c3a1e'}}" style="height:2.4rem; padding:.2rem;" /></div>
<div class="champ" style="flex:0 0 10rem;">
<label>Calendrier</label>
<select name="calendrier">
{{:assign var="ee_cal_eff" value=$ee_calendrier}}
{{if $ee_cal_eff == ""}}{{:assign var="ee_cal_eff" value="agenda"}}{{/if}}
{{#foreach from=$calendriers_liste item="cd_opt"}}
<option value="{{$cd_opt.id}}" {{if $cd_opt.id == $ee_cal_eff}}selected="selected"{{/if}}>{{$cd_opt.nom}}</option>
{{/foreach}}
</select>
</div>
</div>
<p><label>Description (facultatif)</label><textarea name="description" rows="2">{{$ee_description}}</textarea></p>
<p style="margin:.8rem 0 .3rem; font-size:.85rem; color:#666;">Liens (affiche, document, inscription… — jusqu'à 3, facultatifs)</p>
<div class="ajout">
<div class="champ" style="flex:1; min-width:10rem;"><label>Lien 1 — libellé</label><input type="text" name="lien1_label" value="{{$ee_lien1_label}}" placeholder="ex. Affiche" /></div>
<div class="champ" style="flex:2; min-width:14rem;"><label>Lien 1 — URL</label><input type="url" name="lien1_url" value="{{$ee_lien1_url}}" placeholder="https://…" /></div>
</div>
<div class="ajout">
<div class="champ" style="flex:1; min-width:10rem;"><label>Lien 2 — libellé</label><input type="text" name="lien2_label" value="{{$ee_lien2_label}}" placeholder="ex. Programme" /></div>
<div class="champ" style="flex:2; min-width:14rem;"><label>Lien 2 — URL</label><input type="url" name="lien2_url" value="{{$ee_lien2_url}}" placeholder="https://…" /></div>
</div>
<div class="ajout">
<div class="champ" style="flex:1; min-width:10rem;"><label>Lien 3 — libellé</label><input type="text" name="lien3_label" value="{{$ee_lien3_label}}" placeholder="ex. Inscription" /></div>
<div class="champ" style="flex:2; min-width:14rem;"><label>Lien 3 — URL</label><input type="url" name="lien3_url" value="{{$ee_lien3_url}}" placeholder="https://…" /></div>
</div>
{{if $edit_event}}
<button type="submit" name="rename_event" value="{{$edit_event}}">Enregistrer les modifications</button>
<a class="retour" href="index.html?an={{$an}}&amp;mois={{$mois}}">Annuler</a>
{{else}}
<button type="submit" name="add_event" value="1">Ajouter l'événement</button>
{{/if}}
</form>
</div>
*}}
{{/if}}
{{if $est_admin && $subconf=="manage_app"}}
<div class="card" id="form-perm">
<h2>{{if $edit_perm}}Modifier ce rendez-vous régulier{{else}}Ajouter un rendez-vous régulier{{/if}}</h2>
<form method="post" action="index.html">
<div class="ajout">
<div class="champ">
<label>Récurrence</label>
<select name="type_recurrence">
<option value="hebdomadaire" {{if $ep_type_recurrence != "mensuel" && $ep_type_recurrence != "quinzaine"}}selected="selected"{{/if}}>Chaque semaine</option>
<option value="quinzaine" {{if $ep_type_recurrence == "quinzaine"}}selected="selected"{{/if}}>Toutes les 2 semaines</option>
<option value="mensuel" {{if $ep_type_recurrence == "mensuel"}}selected="selected"{{/if}}>Un jour précis du mois</option>
</select>
</div>
<div class="champ">
<label>Jour</label>
<select name="jour">
<option value="1" {{if $ep_jour == 1}}selected="selected"{{/if}}>Lundi</option>
<option value="2" {{if $ep_jour == 2}}selected="selected"{{/if}}>Mardi</option>
<option value="3" {{if $ep_jour == 3}}selected="selected"{{/if}}>Mercredi</option>
<option value="4" {{if $ep_jour == 4}}selected="selected"{{/if}}>Jeudi</option>
<option value="5" {{if $ep_jour == 5}}selected="selected"{{/if}}>Vendredi</option>
<option value="6" {{if $ep_jour == 6}}selected="selected"{{/if}}>Samedi</option>
<option value="7" {{if $ep_jour == 7}}selected="selected"{{/if}}>Dimanche</option>
</select>
</div>
<div class="champ">
<label>Quel(le) — si "un jour précis du mois"</label>
<select name="semaine_du_mois">
<option value="1" {{if $ep_semaine_du_mois == 1}}selected="selected"{{/if}}>1er</option>
<option value="2" {{if $ep_semaine_du_mois == 2}}selected="selected"{{/if}}>2e</option>
<option value="3" {{if $ep_semaine_du_mois == 3}}selected="selected"{{/if}}>3e</option>
<option value="4" {{if $ep_semaine_du_mois == 4}}selected="selected"{{/if}}>4e</option>
<option value="-1" {{if $ep_semaine_du_mois == -1}}selected="selected"{{/if}}>Dernier</option>
</select>
</div>
<div class="champ"><label>De</label><input type="time" name="debut" value="{{$ep_debut}}" /></div>
<div class="champ"><label>À</label><input type="time" name="fin" value="{{$ep_fin}}" /></div>
<div class="champ" style="flex:2; min-width:14rem;"><label>Détail</label><input type="text" name="label" value="{{$ep_label}}" placeholder="ex. Ouvert aux adhérents" required="required" /></div>
<div class="champ" style="flex:1; min-width:10rem;"><label>Lieu (facultatif)</label><input type="text" name="lieu" value="{{$ep_lieu}}" placeholder="ex. Local associatif" /></div>
<div class="champ"><label>Depuis le (facultatif)</label><input type="date" name="date_debut" value="{{$ep_date_debut}}" /></div>
<div class="champ"><label>Jusqu'au (facultatif)</label><input type="date" name="date_fin" value="{{$ep_date_fin}}" /></div>
<div class="champ" style="flex:0 0 5rem;"><label>Couleur</label><input type="color" name="couleur" value="{{$ep_couleur|or:'#4c7a2e'}}" style="height:2.4rem; padding:.2rem;" /></div>
<div class="champ" style="flex:0 0 10rem;">
<label>Calendrier</label>
<select name="calendrier">
{{:assign var="ep_cal_eff" value=$ep_calendrier}}
{{if $ep_cal_eff == ""}}{{:assign var="ep_cal_eff" value="agenda"}}{{/if}}
{{#foreach from=$calendriers_liste item="cd_opt2"}}
<option value="{{$cd_opt2.id}}" {{if $cd_opt2.id == $ep_cal_eff}}selected="selected"{{/if}}>{{$cd_opt2.nom}}</option>
{{/foreach}}
</select>
</div>
</div>
<p><label>Description (facultatif)</label><textarea name="description" rows="2">{{$ep_description}}</textarea></p>
<p class="aide" style="color:#777; font-size:.85rem; margin:.4rem 0 0;">Laissez ces deux dates vides pour un rendez-vous permanent, sans limite dans le temps. Pour "Toutes les 2 semaines", renseignez "Depuis le" avec la date du premier rendez-vous : c'est elle qui sert de point de départ pour calculer une semaine sur deux.</p>
{{if $edit_perm}}
<button type="submit" name="rename_perm" value="{{$edit_perm}}">Enregistrer</button>
<a class="retour" href="index.html">Annuler</a>
{{else}}
<button type="submit" name="add_perm" value="1">Ajouter</button>
{{/if}}
</form>
</div>
{{/if}}
+45
View File
@@ -0,0 +1,45 @@
<div class="card">
<h2>{{if $vue == "liste"}}Calendrier en liste (3 prochains mois){{else}}Événements à venir{{/if}}</h2>
{{if $vue == "liste"}}
{{:assign var="rien_trouve" value=true}}
<ul class="liste-evt">
{{#foreach from=$liste_triee item="it"}}
{{:assign var="rien_trouve" value=false}}
<li>
<span class="date-evt">{{$it.date|date_long}}{{if $it.debut}} — {{$it.debut}}{{if $it.fin}} à {{$it.fin}}{{/if}}{{/if}}</span>
<span class="titre-evt">
<span class="tag-type" style="background:{{$it.couleur}};">{{$it.type}}</span>
{{$it.label}}
{{if $it.lien1_url}}<br /><a class="lien-evt" href="{{$it.lien1_url}}" target="_blank" rel="noopener">{{$it.lien1_label|or:"Voir l'affiche / plus d'infos"}} &rarr;</a>{{/if}}
{{if $it.lien2_url}}<br /><a class="lien-evt" href="{{$it.lien2_url}}" target="_blank" rel="noopener">{{$it.lien2_label|or:"Voir l'affiche / plus d'infos"}} &rarr;</a>{{/if}}
{{if $it.lien3_url}}<br /><a class="lien-evt" href="{{$it.lien3_url}}" target="_blank" rel="noopener">{{$it.lien3_label|or:"Voir l'affiche / plus d'infos"}} &rarr;</a>{{/if}}
{{if !$it.lien1_url && !$it.lien2_url && !$it.lien3_url && $it.lien}}<br /><a class="lien-evt" href="{{$it.lien}}" target="_blank" rel="noopener">Voir l'affiche / plus d'infos &rarr;</a>{{/if}}
</span>
</li>
{{/foreach}}
</ul>
{{if $rien_trouve}}<p class="vide">Rien de prévu sur les 3 prochains mois.</p>{{/if}}
{{else}}
{{:assign var="event_trouve" value=false}}
<ul class="liste-evt">
{{#load where=$where_venir order="$$.date ASC"}}
{{:assign var="event_trouve" value=true}}
<li>
<span class="date-evt">{{$date|date_long}}{{if $debut}} — {{$debut}}{{if $fin}} à {{$fin}}{{/if}}{{/if}}</span>
<span class="titre-evt">{{$titre}}{{if $description}}<br /><small>{{$description}}</small>{{/if}}{{if $lien1_url}}<br /><a class="lien-evt" href="{{$lien1_url}}" target="_blank" rel="noopener">{{$lien1_label|or:"Voir l'affiche / plus d'infos"}} &rarr;</a>{{/if}}{{if $lien2_url}}<br /><a class="lien-evt" href="{{$lien2_url}}" target="_blank" rel="noopener">{{$lien2_label|or:"Voir l'affiche / plus d'infos"}} &rarr;</a>{{/if}}{{if $lien3_url}}<br /><a class="lien-evt" href="{{$lien3_url}}" target="_blank" rel="noopener">{{$lien3_label|or:"Voir l'affiche / plus d'infos"}} &rarr;</a>{{/if}}{{if !$lien1_url && !$lien2_url && !$lien3_url && $lien}}<br /><a class="lien-evt" href="{{$lien}}" target="_blank" rel="noopener">Voir l'affiche / plus d'infos &rarr;</a>{{/if}}</span>
{{if $lieu}}<span class="lieu-evt"><a href="https://www.openstreetmap.org/search?query={{$lieu|url_encode}}" target="_blank" rel="noopener">&#128205; {{$lieu}}</a></span>{{/if}}
{{if $est_admin}}
<span>
<a class="mini" href="index.html?edit_event={{$id}}&amp;an={{$an}}&amp;mois={{$mois}}#form-event" title="Modifier">&#9998;</a>
<form method="post" action="index.html?an={{$an}}&amp;mois={{$mois}}" style="display:inline">
<input type="hidden" name="retour_an" value="{{$an}}" />
<input type="hidden" name="retour_mois" value="{{$mois}}" />
<button type="submit" name="suppr_event" value="{{$id}}" class="mini" title="Supprimer">&#10005;</button>
</form>
</span>
{{/if}}
</li>
{{/load}}
</ul>
{{if !$event_trouve}}<p class="vide">Aucun événement à venir pour l'instant.</p>{{/if}}
{{/if}}
+72
View File
@@ -0,0 +1,72 @@
{{* 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="%sagenda.html"|args:$module.url}}
{{/if}}
{{/restrict}}
<nav class="tabs">
{{if $current == 'agenda'}}
{{#restrict section="web" level="write"}}
<aside>
{{*:debug cf=$cal_filtre*}}
{{if $cal_filtre == "tous"}}
{{:button label="Tous les calendriers" shape="calendar" href="%s?vue=%s&an=%s&mois=%s&cal=tous"|args:$_url:$vue:$an:$mois disabled=true}}
{{else}}
{{:linkbutton label="Tous les calendriers" shape="calendar" href="%s?vue=%s&an=%s&mois=%s&cal=tous"|args:$_url:$vue:$an:$mois}}
{{/if}}
{{#foreach from=$calendriers_liste item="cd_tab"}}
{{if $cal_filtre == $cd_tab.id}}
{{:button 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 disabled=true}}
{{else}}
{{: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}}
{{/if}}
{{/foreach}}
</aside>
{{/restrict}}
{{/if}}
{{* menu principal : exclus pour le site anonyme *}}
{{if $is_logged==true}}
<ul>
<li {{if $current == "agenda"}} class="current"{{/if}}><a href="{{$_url}}">Agenda</a></li>
{{#restrict section="web" level="write"}}
<li {{if $current == 'config'}} class="current"{{/if}}><a href="{{$_url}}?nav=conf">Configuration</a></li>
{{/restrict}}
</ul>
{{/if}}
{{* menu secondaire *}}
{{if $current == 'agenda'}}
{{:assign _liclass="current" _ulclass="sub"}}
{{if $is_logged==false}}
{{:assign _liclass="nav-mois" _ulclass="modal-liens"}}
{{/if}}
<ul class="{{$_ulclass}}">
<li {{if !$subcurrent || $subcurrent == 'mois'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=mois&an={{$an}}&mois={{$mois}}&cal={{$cal}}">Mois</a></li>
<li {{if $subcurrent == 'semaine'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=semaine&an={{$an}}&mois={{$mois}}&cal={{$cal}}">Semaine</a></li>
<li {{if $subcurrent == 'liste'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=liste&cal={{$cal}}">Liste</a></li>
</ul>
{{/if}}
{{#restrict section="web" level="write"}}
{{if $current == 'config'}}
<ul class="sub">
<li {{if !$subcurrent || $subcurrent == 'manage_cal'}} class="current"{{/if}}><a href="{{$_url}}?nav={{$_GET.nav}}&conf=manage_cal">Calendriers</a></li>
<li {{if $subcurrent == 'manage_eve'}} class="current"{{/if}}><a href="{{$_url}}?nav={{$_GET.nav}}&conf=manage_eve">Évènements</a></li>
<li {{if $subcurrent == 'manage_app'}} class="current"{{/if}}><a href="{{$_url}}?nav={{$_GET.nav}}&conf=manage_app">RDV réguliers</a></li>
</ul>
{{/if}}
{{/restrict}}
</nav>
{{* Messages *}}
{{if $_GET.msg == "ajout" }}
<p class="block confirm">Ajout effectué</p>
{{elseif $_GET.msg == "modification" }}
<p class="block confirm">Modification effectuée</p>
{{elseif $_GET.msg == "suppression" }}
<p class="block confirm">Suppression effectuée</p>
{{elseif $_GET.msg == "supprmvtmat" }}
<p class="block confirm">Mouvement supprimé - Matériel supprimé</p>
{{/if}}
+86
View File
@@ -0,0 +1,86 @@
: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; font-size: 1.08rem; }*/
.wrap { display: inline-block; max-width: 100rem; margin: 0 auto; }
a.retour { color: var(--terra); text-decoration: none; font-size: .95rem; }
a.retour:hover { text-decoration: underline; }
h1 { margin: .4rem 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.card-perm { border-left: .35rem solid var(--vert); }
.card.card-perm h2 { color: var(--vert); }
.card.card-horaires table { width: 100%; border-collapse: collapse; }
.card.card-horaires table th, .card.card-horaires table td { padding: .35rem .5rem; text-align: left; border-bottom: 1px solid #eceae8; }
.card.card-horaires .activite { display: block; font-weight: bold; color: var(--terra); }
.card h2 { margin: 0 0 .8rem; font-size: 1.05rem; color: var(--terra); text-transform: uppercase; letter-spacing: .04em; }
.nav-mois { display: flex; align-items: center; justify-content: space-between; margin-bottom: .8rem; }
.nav-mois a { color: var(--terra); text-decoration: none; font-weight: bold; font-size: 1.3rem; padding: .1rem .6rem; }
.nav-mois a:hover { color: var(--orange); }
.nav-mois span { font-size: 1.15rem; font-weight: bold; text-transform: capitalize; color: var(--terra); }
.scroll-cal { overflow-x: auto; -webkit-overflow-scrolling: touch; }
table.calendrier { border-collapse: collapse; width: 100%; min-width: 46rem; table-layout: fixed; }
table.calendrier th { padding: .4rem; font-size: .9rem; color: #777; text-transform: uppercase; }
table.calendrier td { border: 1px solid #eceae8; vertical-align: top; height: 7.5rem; padding: .35rem; font-size: 1rem; }
table.calendrier td.vide { background: #fafafa; }
table.calendrier td .num { font-weight: bold; color: #555; font-size: 1.15rem; }
table.calendrier td.today { background: #fdf2e6; }
table.calendrier td.today .num { color: var(--orange); }
.evt-badge { color: #fff; border-radius: .3rem; padding: .15rem .4rem; margin-top: .25rem; font-size: .88rem; line-height: 1.3; display: flex; align-items: flex-start; justify-content: space-between; gap: .2rem; }
.evt-badge .badge-content { flex: 1; min-width: 0; cursor: pointer; white-space: normal; word-break: break-word; }
.evt-desc-apercu { margin-top: .15rem; font-size: .8rem; opacity: .85; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.perm-badge { color: #fff; border-radius: .3rem; padding: .15rem .4rem; margin-top: .25rem; font-size: .88rem; line-height: 1.3; opacity: .95; display: flex; align-items: flex-start; justify-content: space-between; gap: .2rem; }
.perm-badge .badge-content { flex: 1; min-width: 0; cursor: pointer; white-space: normal; word-break: break-word; }
.perm-badge span { white-space: normal; word-break: break-word; }
.perm-badge form.mini-form { display: inline; flex-shrink: 0; }
button.mini-x { background: none; border: none; color: #fff; opacity: .7; padding: 0; font-size: .8rem; line-height: 1; cursor: pointer; }
button.mini-x:hover { opacity: 1; }
.badge-actions { display: flex; align-items: center; gap: .35rem; flex-shrink: 0; }
a.badge-edit { color: #fff; opacity: .7; text-decoration: none; font-size: .85rem; line-height: 1.3; flex-shrink: 0; }
a.badge-edit:hover { opacity: 1; }
.modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.55); z-index: 1000; align-items: center; justify-content: center; padding: 1rem; }
.modal-overlay.open { display: flex; }
.modal-box { background: #fff; border-radius: .6rem; padding: 1.2rem 1.4rem 1.4rem; max-width: 28rem; width: 100%; max-height: 82vh; overflow-y: auto; position: relative; box-shadow: 0 4px 24px rgba(0,0,0,.25); }
.modal-box h3 { margin: 0 1.6rem .3rem 0; color: var(--terra); }
.modal-meta { color: #777; font-size: .9rem; margin: .15rem 0; }
.modal-meta a { color: var(--terra); text-decoration: none; }
.modal-meta a:hover { text-decoration: underline; }
.modal-description { margin-top: .7rem; white-space: pre-wrap; }
.modal-liens { margin-top: .8rem; display: flex; flex-wrap: wrap; gap: .5rem; }
.modal-liens a { display: inline-block; background: var(--terra); color: #fff; text-decoration: none; padding: .45rem .9rem; border-radius: .4rem; font-size: .92rem; }
.modal-liens a:hover { background: var(--orange); }
.modal-close { position: absolute; top: .5rem; right: .6rem; background: none; border: none; font-size: 1.5rem; line-height: 1; color: #999; cursor: pointer; padding: .2rem .4rem; }
.modal-close:hover { color: var(--terra); }
ul.liste-evt { list-style: none; margin: 0; padding: 0; }
ul.liste-evt li { padding: .6rem 0; border-bottom: 1px solid #eceae8; display: flex; justify-content: space-between; gap: .8rem; align-items: baseline; flex-wrap: wrap; }
ul.liste-evt li:last-child { border-bottom: none; }
ul.liste-evt .date-evt { color: var(--terra); font-weight: bold; min-width: 9rem; }
ul.liste-evt .titre-evt { flex: 1; }
ul.liste-evt .lieu-evt { color: #777; font-size: .85rem; }
ul.liste-evt .lieu-evt a { color: inherit; text-decoration: none; }
ul.liste-evt .lieu-evt a:hover { text-decoration: underline; }
a.lieu-lien { color: inherit; text-decoration: none; }
a.lieu-lien:hover { text-decoration: underline; }
ul.liste-evt .lien-evt { color: var(--terra); font-size: .85rem; }
.tag-type { display: inline-block; color: #fff; font-size: .75rem; text-transform: uppercase; letter-spacing: .03em; padding: .1rem .4rem; border-radius: .3rem; margin-right: .4rem; vertical-align: middle; }
p.vide { color: #777; }
table.permanences { border-collapse: collapse; width: 100%; }
.scroll-cal table.permanences { min-width: 42rem; }
table.permanences th, table.permanences td { padding: .5rem .4rem; text-align: left; border-bottom: 1px solid #eceae8; }
table.permanences th { color: #777; font-size: .8rem; text-transform: uppercase; }
input[type=text], input[type=date], input[type=time], input[type=url], textarea, select { font-family: inherit; font-size: 1rem; padding: .4rem .6rem; border: 1px solid #bbb; border-radius: .4rem; width: 100%; background: #fff; }
.ajout { display: flex; gap: .6rem; align-items: flex-end; flex-wrap: wrap; }
.ajout label { font-size: .85rem; color: #666; display: block; margin-bottom: .2rem; }
.ajout .champ { min-width: 9rem; }
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: #999; padding: .1rem .3rem; font-size: .85rem; text-decoration: none; }
button.mini:hover { color: var(--terra); }
a.mini { color: #999; text-decoration: none; font-size: .85rem; padding: .1rem .3rem; }
a.mini:hover { 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; }
nav.vue-tabs { display: flex; gap: .4rem; margin-bottom: 1.2rem; }
nav.vue-tabs a { color: var(--terra); text-decoration: none; font-weight: bold; padding: .4rem .9rem; border-radius: .4rem; background: #fff; border: 1px solid #e2ddd9; }
nav.vue-tabs a:hover { background: #fdf2e6; }
nav.vue-tabs a.current { background: var(--terra); color: #fff; border-color: var(--terra); }
nav.cal-tabs { margin-top: -.6rem; }
nav.cal-tabs a { font-weight: normal; font-size: .88rem; padding: .3rem .7rem; }
nav.cal-tabs a.current { background: var(--vert); border-color: var(--vert); }
+61
View File
@@ -0,0 +1,61 @@
{{* =========================================================================
FLUX ICALENDAR — module agenda
Placez ce fichier dans le module "agenda", nommé par exemple "flux.ics".
Les gens pourront s'abonner (lecture seule) avec l'URL publique de ce
fichier, ex: https://VOTRE-SITE/m/agenda/flux.ics
Limite connue : sans calcul de date avancé disponible dans ce langage,
l'heure de début de la récurrence (DTSTART) est calée sur la date de
début choisie (ou aujourd'hui si aucune n'est renseignée) même si son
jour de la semaine ne correspond pas exactement — ce n'est pas un
problème pour la plupart des calendriers, qui recalculent les
occurrences à partir de la règle BYDAY, mais à tester.
========================================================================= *}}
{{:assign var="aujourdhui_ics" value=$now|date:"Y-m-d"}}
{{* ---------- Codes des jours de la semaine pour BYDAY ---------- *}}
{{:assign var="jours_ical.1" value="MO"}}
{{:assign var="jours_ical.2" value="TU"}}
{{:assign var="jours_ical.3" value="WE"}}
{{:assign var="jours_ical.4" value="TH"}}
{{:assign var="jours_ical.5" value="FR"}}
{{:assign var="jours_ical.6" value="SA"}}
{{:assign var="jours_ical.7" value="SU"}}
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//{{$config.org_name}}//Agenda//FR
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:{{$config.org_name}} — Agenda
{{#load where="$$.type = 'event'" order="$$.date ASC"}}
BEGIN:VEVENT
UID:evt-{{$id}}@{{$config.org_name|strval|replace:" ":"-"}}
DTSTAMP:{{$aujourdhui_ics|date:"Ymd"}}T000000Z
DTSTART:{{$date|date:"Ymd"}}T{{$debut|strval|replace:":":""}}00
{{if $fin}}DTEND:{{$date|date:"Ymd"}}T{{$fin|strval|replace:":":""}}00
{{/if}}SUMMARY:{{$titre|strval|replace:"\\":"\\\\"|replace:",":"\,"|replace:";":"\;"}}
{{if $lieu}}LOCATION:{{$lieu|strval|replace:"\\":"\\\\"|replace:",":"\,"|replace:";":"\;"}}
{{/if}}{{if $description}}DESCRIPTION:{{$description|strval|replace:"\\":"\\\\"|replace:",":"\,"|replace:";":"\;"|replace:"
":" "}}
{{/if}}END:VEVENT
{{/load}}
{{#load where="$$.type = 'permanence'" order="$$.jour ASC"}}
{{:assign var="jc" from="jours_ical.%s"|args:$jour}}
{{:assign var="dtstart_date" value=$date_debut}}
{{if !$dtstart_date}}{{:assign var="dtstart_date" value=$aujourdhui_ics}}{{/if}}
BEGIN:VEVENT
UID:perm-{{$id}}@{{$config.org_name|strval|replace:" ":"-"}}
DTSTAMP:{{$aujourdhui_ics|date:"Ymd"}}T000000Z
DTSTART:{{$dtstart_date|date:"Ymd"}}T{{$debut|strval|replace:":":""}}00
{{if $fin}}DTEND:{{$dtstart_date|date:"Ymd"}}T{{$fin|strval|replace:":":""}}00
{{/if}}{{if $type_recurrence == "mensuel"}}RRULE:FREQ=MONTHLY;BYDAY={{$semaine_du_mois}}{{$jc}}{{if $date_fin}};UNTIL={{$date_fin|date:"Ymd"}}T235959Z{{/if}}
{{else}}RRULE:FREQ=WEEKLY;BYDAY={{$jc}}{{if $date_fin}};UNTIL={{$date_fin|date:"Ymd"}}T235959Z{{/if}}
{{/if}}{{#foreach from=$exceptions item="ex_ics"}}EXDATE:{{$ex_ics|date:"Ymd"}}T{{$debut|strval|replace:":":""}}00
{{/foreach}}SUMMARY:{{$label|strval|replace:"\\":"\\\\"|replace:",":"\,"|replace:";":"\;"}}
{{if $lieu}}LOCATION:{{$lieu|strval|replace:"\\":"\\\\"|replace:",":"\,"|replace:";":"\;"}}
{{/if}}END:VEVENT
{{/load}}
END:VCALENDAR
+1021
View File
File diff suppressed because it is too large. Load diff
+12
View File
@@ -0,0 +1,12 @@
name = "Agenda"
description = "Calendrier mensuel/semaine/liste, rendez-vous réguliers récurrents (avec exceptions et couleurs), événements ponctuels, purge et tri automatiques."
author = "Vive le Vélo/Recycl'arz"
author_url = "https://recyclarz.bountyarz.ovh"
restrict_section = "web"
restrict_level = "write"
home_button = false
menu = true
config = null
enabled = false
web = false
system = false
+48
View File
@@ -0,0 +1,48 @@
{{*
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<style>
:root { --terra: #8c3a1e; }
* { box-sizing: border-box; }
body { margin: 0; padding: 0; font-family: "Trebuchet MS", Helvetica, sans-serif; background: transparent; color: #222; }
h4 { margin: 0 0 .4em; color: var(--terra); font-size: 1em; }
ul.agenda-upcoming-list { margin: 0 0 .5em; padding: 0; list-style: none; }
ul.agenda-upcoming-list li { font-size: .9em; margin-bottom: .3em; }
ul.agenda-upcoming-list li b { color: var(--terra); margin-right: .3em; }
p.vide { font-size: .9em; color: #777; margin: 0 0 .5em; }
p.agenda-lien { margin: 0; font-size: .85em; text-align: right; }
p.agenda-lien a { color: var(--terra); }
</style>
</head>
<body>
*}}
{{*
<style>
* { box-sizing: border-box; }
h4.agenda-upcoming-list { margin: 0 0 .4em; color: #8c3a1e; font-size: .8em; }
ul.agenda-upcoming-list { margin: 0 0 .5em; padding: 0; list-style: none; }
ul.agenda-upcoming-list li { font-size: .5em; margin-bottom: .3em; }
ul.agenda-upcoming-list li b { color: #8c3a1e; margin-right: .3em; }
p.vide { font-size: .7em; color: #777; margin: 0 0 .5em; }
p.agenda-lien { margin: 0; font-size: .7em; text-align: right; }
p.agenda-lien a { color: #8c3a1e; }
</style>
*}}
{{:assign var="aujourdhui" value=$now|date:"Y-m-d"}}
{{:assign var="where_venir" value="$$.type = 'event' AND $$.date >= '%s' AND ($$.calendrier = 'agenda' OR $$.calendrier IS NULL OR $$.calendrier = '')"|args:$aujourdhui}}
{{:assign var="event_trouve" value=false}}
<h4>Prochains événements</h4>
<ul>
{{#load module="agenda" where=$where_venir order="$$.date ASC" limit=4}}
{{:assign var="event_trouve" value=true}}
<li><b>{{$date|date_short}}</b> {{$titre}}</li>
{{/load}}
</ul>
{{if !$event_trouve}}<p>Aucun événement à venir pour l'instant.</p>{{/if}}
{{*<p class="agenda-lien"><a href="index.html" target="_top">Voir l'agenda complet &rarr;</a></p>
</body>
</html>
*}}