Améliorations diverses : plusieurs calendriers avec mode d'accès (catégorie) et couleurs

This commit is contained in:
bountz committed 2026-11-12 11:08:25 +01:00
1 parent 76df5b8ad5
commit efa2b448ff
14 files changed
+509 -858

No files matched your search

+1 -1
View File
@@ -21,4 +21,4 @@ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE. OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <https://unlicense.org/> For more information, please refer to <https://unlicense.org/>
+4 -2
View File
@@ -3,13 +3,15 @@
Module Agenda associatif pour le logiciel Paheko Module Agenda associatif pour le logiciel Paheko
## Fonctionnalités ## Fonctionnalités
+ Calendrier mensuel/semaine/liste, + gestion de plusieurs calendriers (couleurs et catégorie),
+ catégorie : accès public, membres, administrateurs
+ vues : mensuel/semaine/liste,
+ rendez-vous réguliers récurrents (avec exceptions et couleurs), + rendez-vous réguliers récurrents (avec exceptions et couleurs),
+ événements ponctuels, + événements ponctuels,
+ purge et tri automatiques. + purge et tri automatiques.
## Installation ## Installation
Via module dans Paheko Via import module dans Paheko
## License ## License
Libre de tout droit Libre de tout droit
+158 -140
View File
@@ -1,6 +1,6 @@
{{if $vue != "liste"}} {{if $vue != "liste"}}
<div class="card"> <div class="card">
<h2>Calendrier ({{$cal_filtre}})</h2> <h2 style="background:hsl({{$selected_calendar_couleur}},100%,50%)">Calendrier ({{$selected_calendar_name}})</h2>
{{if $vue == "mois"}} {{if $vue == "mois"}}
<div class="nav-mois"> <div class="nav-mois">
<a href="{{$_url}}?vue=mois&amp;an={{$an_prec}}&amp;mois={{$mois_prec}}">&larr;</a> <a href="{{$_url}}?vue=mois&amp;an={{$an_prec}}&amp;mois={{$mois_prec}}">&larr;</a>
@@ -21,151 +21,169 @@
<a href="{{$_url}}?vue=semaine&amp;an={{$an}}&amp;mois={{$mois}}&amp;semaine_sel={{"%d+1"|math:$semaine_sel}}">&rarr;</a> <a href="{{$_url}}?vue=semaine&amp;an={{$an}}&amp;mois={{$mois}}&amp;semaine_sel={{"%d+1"|math:$semaine_sel}}">&rarr;</a>
{{/if}} {{/if}}
</div> </div>
{{/if}} {{/if}}
<div class="scroll-cal"> <div class="scroll-cal">
<table class="calendrier"> <table class="calendrier">
<thead> <thead>
<tr><th>Lun</th><th>Mar</th><th>Mer</th><th>Jeu</th><th>Ven</th><th>Sam</th><th>Dim</th></tr> <tr><th>Lun</th><th>Mar</th><th>Mer</th><th>Jeu</th><th>Ven</th><th>Sam</th><th>Dim</th></tr>
</thead> </thead>
<tbody> <tbody>
<tr> <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}} {{#foreach count=42 key="i"}}
{{: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="i" value="1+%d"|math:$i}}
{{: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=$i}}
{{: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}} {{/foreach}}
{{:assign var="cellules." value=41}}{{:assign var="cellules." value=42}} {{*
{{#foreach from=$cellules item="n"}} {{: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="rangee_n" value="floor((%d-1)/7)+1"|math:$n}} {{: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}}
{{if $vue == "mois" || $rangee_n == $semaine_sel}} {{: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="jour_num" value="%d-%d"|math:$n:$decalage}} {{: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}}
{{if $jour_num >= 1 && $jour_num <= $nb_jours}} {{:assign var="cellules." value=41}}{{:assign var="cellules." value=42}}
{{:assign var="date_cellule" value="%04d-%02d-%02d"|args:$an:$mois:$jour_num}} *}}
{{:assign var="dow_cellule" value=$date_cellule|date:"N"}} {{#foreach from=$cellules item="n"}}
{{:assign var="occurrence_mois" value="floor((%d-1)/7)+1"|math:$jour_num}} {{:assign var="rangee_n" value="floor((%d-1)/7)+1"|math:$n}}
{{:assign var="est_derniere_occurrence" value=false}} {{if $vue == "mois" || $rangee_n == $semaine_sel}}
{{if "%d+7"|math:$jour_num > $nb_jours}}{{:assign var="est_derniere_occurrence" value=true}}{{/if}} {{:assign var="jour_num" value="%d-%d"|math:$n:$decalage}}
{{:assign var="evts_ce_jour" from="events_par_jour.%s"|args:$date_cellule}} {{if $jour_num >= 1 && $jour_num <= $nb_jours}}
{{:assign var="badges_jour" value=""}} {{:assign var="date_cellule" value="%04d-%02d-%02d"|args:$an:$mois:$jour_num}}
{{#foreach from=$perms_data item="pd"}} {{:assign var="dow_cellule" value=$date_cellule|date:"N"}}
{{if $pd.jour == $dow_cellule}} {{:assign var="occurrence_mois" value="floor((%d-1)/7)+1"|math:$jour_num}}
{{if $pd.date_debut == "" || $date_cellule >= $pd.date_debut}} {{:assign var="est_derniere_occurrence" value=false}}
{{if $pd.date_fin == "" || $date_cellule <= $pd.date_fin}} {{if "%d+7"|math:$jour_num > $nb_jours}}{{:assign var="est_derniere_occurrence" value=true}}{{/if}}
{{:assign var="est_exclue" value=false}} {{:assign var="evts_ce_jour" from="events_par_jour.%s"|args:$date_cellule}}
{{#foreach from=$pd.exceptions item="ex"}} {{:assign var="badges_jour" value=""}}
{{if $ex == $date_cellule}}{{:assign var="est_exclue" value=true}}{{/if}} {{#foreach from=$perms_data item="pd"}}
{{/foreach}} {{if $pd.jour == $dow_cellule}}
{{if !$est_exclue}} {{if $pd.date_debut == "" || $date_cellule >= $pd.date_debut}}
{{:assign var="afficher_badge" value=false}} {{if $pd.date_fin == "" || $date_cellule <= $pd.date_fin}}
{{if $pd.type_recurrence == "mensuel"}} {{:assign var="est_exclue" value=false}}
{{if $pd.semaine_du_mois == -1 && $est_derniere_occurrence}}{{:assign var="afficher_badge" value=true}}{{/if}} {{#foreach from=$pd.exceptions item="ex"}}
{{if $pd.semaine_du_mois == $occurrence_mois}}{{:assign var="afficher_badge" value=true}}{{/if}} {{if $ex == $date_cellule}}{{:assign var="est_exclue" value=true}}{{/if}}
{{elseif $pd.type_recurrence == "quinzaine"}} {{/foreach}}
{{if $pd.date_debut != ""}} {{if !$est_exclue}}
{{:assign var="ref_sem_q" value=$pd.date_debut|date:"W"|intval}} {{:assign var="afficher_badge" value=false}}
{{:assign var="cell_sem_q" value=$date_cellule|date:"W"|intval}} {{if $pd.type_recurrence == "mensuel"}}
{{:assign var="diff_sem_q" value="(%d-%d) %% 2"|math:$cell_sem_q:$ref_sem_q}} {{if $pd.semaine_du_mois == -1 && $est_derniere_occurrence}}{{:assign var="afficher_badge" value=true}}{{/if}}
{{if $diff_sem_q == 0}}{{: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}}
{{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}} {{/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}}
{{/if}} {{if $badges_jour}}
{{/foreach}} {{:assign var="badges_tries" value=$badges_jour|ksort|values}}
{{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}} {{else}}
{{* background: hsl(var(--first-color), 50%, 90%); {{:assign var="badges_tries" value=""}}
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}} {{/if}}
{{/foreach}}
</td>
{{else}}
<td class="vide"></td>
{{/if}} <td{{if $date_cellule == $aujourdhui}} class="today"{{/if}}>
{{/if}} <div class="num">{{$jour_num}}</div>
{{if $vue == "mois" && "%d %% 7"|math:$n == 0 && $n != 42}}</tr><tr>{{/if}} {{#foreach from=$badges_tries item="bj"}}
{{/foreach}} {{if $bj.type == "perm"}}
</tr> <div class="perm-badge" style="background:{{$bj.couleur}};">
</tbody> <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="">
</table> {{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}}
</div> {{if $bj.description}}<div class="evt-desc-apercu">{{$bj.description}}</div>{{/if}}
</div> </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="" class="mini-form" onclick="event.stopPropagation();">
{{:input type="hidden" name="perm_id" default=$bj.pid }}
{{:input type="hidden" name="date_exclue" default=$date_cellule }}
{{:input type="hidden" name="retour_an" default=$an }}
{{:input type="hidden" name="retour_mois" default=$mois }}
{{:button type="submit" name="suppr_occurrence" class="mini-x" shape="delete" title="Supprimer seulement ce jour" value=$bj.pid}}
{{*
<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="" class="mini-form" onclick="event.stopPropagation();">
{{:input type="hidden" name="retour_an" default=$an }}
{{:input type="hidden" name="retour_mois" default=$mois }}
{{:button type="submit" name="suppr_event" class="mini-x" shape="delete" title="Supprimer" value=$bj.id}}
{{*
<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}} {{/if}}
+77 -69
View File
@@ -1,3 +1,4 @@
{{* Gestion des Calendriers *}}
{{if $est_admin && $subconf=="manage_cal"}} {{if $est_admin && $subconf=="manage_cal"}}
<div class="card"> <div class="card">
<h2>Gérer les calendriers</h2> <h2>Gérer les calendriers</h2>
@@ -6,32 +7,71 @@
<tbody> <tbody>
{{#foreach from=$calendriers_liste item="cd_gest"}} {{#foreach from=$calendriers_liste item="cd_gest"}}
<tr> <tr>
<td>{{$cd_gest.nom}}{{if $cd_gest.par_defaut}} <small style="color:#999;">(par défaut)</small>{{/if}}</td>
<td> <td>
{{if !$cd_gest.par_defaut}} <span style="color:hsl({{$cd_gest.textecouleur}},100%,50%) ;background:hsl({{$cd_gest.couleur}},100%,50%);"> {{$cd_gest.nom}}</span>
<form method="post" action="" style="display:inline"> {{if $cd_gest.par_defaut}} <small style="color:#999;">(par défaut)</small>{{/if}}</td>
{{* <button type="submit" name="suppr_calendrier" value="{{$cd_gest.id}}" class="mini" title="Supprimer ce calendrier">&#10005; Supprimer</button>*}} <td>
{{:button type="submit" name="suppr_calendrier" label="Supprimer ce calendrier" shape="delete" value="%s"|args:$cd_gest.id}} {{:linkbutton href="index.html?nav=conf&conf=manage_cal&idcal=%s"|args:$cd_gest.id label="Modifier ce calendrier" class="mini" shape="edit"}}
</form> <form method="post" action="" style="display:inline">
{{/if}} {{if !$cd_gest.par_defaut}}
{{:button type="submit" name="suppr_calendrier" label="Supprimer ce calendrier" class="mini" shape="delete" value="%s"|args:$cd_gest.id}}
{{/if}}
</form>
</td> </td>
</tr> </tr>
{{/foreach}} {{/foreach}}
</tbody> </tbody>
</table> </table>
<p class="aide">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>
<form method="post" action="" class="ajout" style="margin-top:.8rem;"> <form method="post" action="" class="ajout" style="margin-top:.8rem;">
{{* <div class="champ" style="flex:2; min-width:14rem;"><label>Nouveau calendrier</label> <fieldset class="entree">
<input type="text" name="nom_calendrier" placeholder="ex. Réunions" required="required" /> {{if $_GET.idcal && $est_admin}}
</div> <h2>Modifier un calendrier</h2>
<button type="submit" name="add_calendrier" value="1">Ajouter</button> {{:assign var="_cnom" from="calendriers_liste.%s.nom"|args:$_GET.idcal}}
*}} {{:assign var="_cdef" from="calendriers_liste.%s.par_defaut"|args:$_GET.idcal}}
<dl>{{:input type="text" name="nom_calendrier" label="Nouveau calendrier" help="ex. Réunions" required=true}}</dl> {{:assign var="_ccou" from="calendriers_liste.%s.couleur"|args:$_GET.idcal}}
{{:button type="submit" name="add_calendrier" label="Ajouter" title="Ajouter un calendrier" shape="plus" value="1"}} {{:assign var="_ctco" from="calendriers_liste.%s.textecouleur"|args:$_GET.idcal}}
{{:assign var="_ccat" from="calendriers_liste.%s.categorie"|args:$_GET.idcal}}
{{if $_cdef == true}}
{{:assign _checked="checked"}}
{{/if}}
<dl>{{:input type="text" name="nom_calendrier" label="Nom du calendrier" default=$_cnom required=true}}</dl>
<dl>{{:input type="hue" name="couleur" label="Couleur de l'arrière-plan" default=$_ccou}}</dl>
<dl>{{:input type="hue" name="couleur_texte" label="Couleur du texte" default=$_ctco}}</dl>
<dl>{{:input type="checkbox" name="pardefaut" label="Calendrier par défaut ?" checked="%s"|args:$_checked value=true}}</dl>
{{if $_ccat == "p"}} {{:assign _p="checked"}} {{elseif $_ccat == "m"}} {{:assign _m="checked"}} {{elseif $_ccat == "a"}} {{:assign _a="checked"}} {{else}} {{:assign _p="checked"}} {{/if}}
{{:assign var="options." id="p" texte="public" checked="%s"|args:$_p}}
{{:assign var="options." id="m" texte="membres" checked="%s"|args:$_m}}
{{:assign var="options." id="a" texte="admins" checked="%s"|args:$_a}}
<dl>
{{#foreach from=$options item="o"}}
{{:input type="radio" name="categorie" label="Catégorie" value=$o.id label=$o.texte checked=$o.checked}}
{{/foreach}}
{{*:input type="radio" name="categorie" label="Catégorie" checked="%s"|args:$_checked value=true*}}
</dl>
{{:button type="submit" name="mod_calendrier" label="Modifier" title="Modifier un calendrier" shape="plus" value="%d"|args:$_GET.idcal}}
{{else}}
<h2>Ajouter un calendrier</h2>
<dl>{{:input type="text" name="nom_calendrier" label="Nom du calendrier" help="ex. Réunions" required=true}}</dl>
<dl>{{:input type="hue" name="couleur" label="Couleur de l'arrière-plan" help="Couleur par defaut de l'arrière-plan des évènements créés dans ce calendrier." }}</dl>
<dl>{{:input type="hue" name="couleur_texte" label="Couleur du texte" default=$_ctco}}</dl>
<dl>{{:input type="checkbox" name="pardefaut" label="Calendrier par défaut ?" value=true}}</dl>
{{:assign var="options." id="p" texte="public" checked="checked"}}
{{:assign var="options." id="m" texte="membres"}}
{{:assign var="options." id="a" texte="admins"}}
<dl>
{{#foreach from=$options item="o"}}
{{:input type="radio" name="categorie" label="Catégorie" value=$o.id label=$o.texte checked=$o.checked}}
{{/foreach}}
</dl>
{{:button type="submit" name="add_calendrier" label="Ajouter" title="Ajouter un calendrier" shape="plus" value="1"}}
{{/if}}
</fieldset>
</form> </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> </div>
{{/if}} {{/if}}
{{* Gestion des évènements *}}
{{if $est_admin && $subconf=="manage_eve"}} {{if $est_admin && $subconf=="manage_eve"}}
{{*:debug event=$event*}} {{*:debug event=$event*}}
<form method="post" action=""> <form method="post" action="">
@@ -45,78 +85,46 @@
{{:input type="time" name="debut" label="De" default=$event.debut}} {{:input type="time" name="debut" label="De" default=$event.debut}}
{{:input type="time" name="fin" label="À" default=$event.fin}} {{:input type="time" name="fin" label="À" default=$event.fin}}
{{:input type="text" name="lieu" label="Lieu" default=$event.lieu}} {{:input type="text" name="lieu" label="Lieu" default=$event.lieu}}
{{:input type="hue" name="couleur" label="Couleur" }} {{if $edit_event}}
{{:input type="hue" name="couleur" label="Couleur" default=$event.couleur }}
{{/if}}
{{:assign var="ee_cal_eff" value=$event.calendrier}} {{:assign var="ee_cal_eff" value=$event.calendrier}}
{{if $ee_cal_eff == ""}}{{:assign var="ee_cal_eff" value="agenda"}}{{/if}} {{*if $ee_cal_eff == ""}}{{:assign var="ee_cal_eff" value="agenda"}}{{/if*}} {{* inutile *}}
{{#foreach from=$calendriers_liste item="cd_opt"}} {{#foreach from=$calendriers_liste item="cd_opt"}}
{{:assign var="calendriers_options.%s"|args:$cd_opt.id label=$cd_opt.nom}} {{:assign var="calendriers_options.%s"|args:$cd_opt.id label=$cd_opt.nom}}
{{/foreach}} {{/foreach}}
{{*:debug cal=$calendriers_options*}} {{*:debug cal=$calendriers_options*}}
{{:input type="select" name="calendrier" label="Calendrier" default=$event.calendrier options=$calendriers_options required=true}} {{: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}} {{:input type="textarea" cols=40 rows=3 name="description" label="Description complète" default=$event.description required=false}}
{{#foreach count=3 key="i"}}
{{:assign var="i" value="1+%d"|math:$i}}
{{:assign _ell="event.lien%d_label"|args:$i _elu="event.lien%d_url"|args:$i}}
{{:assign var="ell" from=$_ell}}
{{:assign var="elu" from=$_elu}}
<div class="ajout">
{{:input type="text" name="lien%d_label"|args:$i label="Lien %d — libellé"|args:$i default=$ell placeholder="Ex. Inscription"}}
{{:input type="text" name="lien%d_url"|args:$i label="Lien %d — URL"|args:$i default=$elu placeholder="https://…"}}
{{/foreach}}
{{*
<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="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="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> <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> </dl>
</fieldset> </fieldset>
<p class="submit"> <p class="submit">
{{if $edit_event}} {{if $edit_event}}
<a class="retour" href="?an={{$an}}&amp;mois={{$mois}}">Annuler</a> <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}} {{:input type="hidden" name="event_id" default=$event.id}}
{{:button type="submit" name="save_event" label="Enregistrer les modifications" class="main"}}
{{else}} {{else}}
{{:button type="submit" name="save_event" label="Ajouter l'événement" shape="plus" class="main"}} {{:button type="submit" name="save_event" label="Ajouter l'événement" shape="plus" class="main"}}
{{/if}} {{/if}}
</p> </p>
</form> </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}}
{{* Gestion des occurences *}}
{{if $est_admin && $subconf=="manage_app"}} {{if $est_admin && $subconf=="manage_app"}}
<div class="card" id="form-perm"> <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> <h2>{{if $edit_perm}}Modifier ce rendez-vous régulier{{else}}Ajouter un rendez-vous régulier{{/if}}</h2>
@@ -163,10 +171,10 @@
<label>Calendrier</label> <label>Calendrier</label>
<select name="calendrier"> <select name="calendrier">
{{:assign var="ep_cal_eff" value=$ep_calendrier}} {{:assign var="ep_cal_eff" value=$ep_calendrier}}
{{if $ep_cal_eff == ""}}{{:assign var="ep_cal_eff" value="agenda"}}{{/if}} {{if $ep_cal_eff == ""}}{{:assign var="ep_cal_eff" value="agenda"}}{{/if}}
{{#foreach from=$calendriers_liste item="cd_opt2"}} {{#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> <option value="{{$cd_opt2.id}}" {{if $cd_opt2.id == $ep_cal_eff}}selected="selected"{{/if}}>{{$cd_opt2.nom}}</option>
{{/foreach}} {{/foreach}}
</select> </select>
</div> </div>
</div> </div>
+6 -1
View File
@@ -31,10 +31,15 @@
{{if $est_admin}} {{if $est_admin}}
<span> <span>
<a class="mini" href="index.html?edit_event={{$id}}&amp;an={{$an}}&amp;mois={{$mois}}#form-event" title="Modifier">&#9998;</a> <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"> <form method="post" action="" style="display:inline">
{{:input type="hidden" name="retour_an" default=$an}}
{{:input type="hidden" name="retour_mois" default=$mois}}
{{:button type="submit" name="suppr_event" label="Supprimer" shape="delete" class="mini" default=$id required=true}}
{{*
<input type="hidden" name="retour_an" value="{{$an}}" /> <input type="hidden" name="retour_an" value="{{$an}}" />
<input type="hidden" name="retour_mois" value="{{$mois}}" /> <input type="hidden" name="retour_mois" value="{{$mois}}" />
<button type="submit" name="suppr_event" value="{{$id}}" class="mini" title="Supprimer">&#10005;</button> <button type="submit" name="suppr_event" value="{{$id}}" class="mini" title="Supprimer">&#10005;</button>
*}}
</form> </form>
</span> </span>
{{/if}} {{/if}}
+7 -7
View File
@@ -13,13 +13,13 @@
{{#restrict section="web" level="write"}} {{#restrict section="web" level="write"}}
<aside> <aside>
{{*:debug cf=$cal_filtre*}} {{*:debug cf=$cal_filtre*}}
{{if $cal_filtre == "tous"}} {{if $selected_calendar == -1}}
{{:button label="Tous les calendriers" shape="calendar" href="%s?vue=%s&an=%s&mois=%s&cal=tous"|args:$_url:$vue:$an:$mois disabled=true}} {{:button label="Tous les calendriers" shape="calendar" href="%s?vue=%s&an=%s&mois=%s&cal=-1"|args:$_url:$vue:$an:$mois disabled=true}}
{{else}} {{else}}
{{:linkbutton label="Tous les calendriers" shape="calendar" href="%s?vue=%s&an=%s&mois=%s&cal=tous"|args:$_url:$vue:$an:$mois}} {{:linkbutton label="Tous les calendriers" shape="calendar" href="%s?vue=%s&an=%s&mois=%s&cal=-1"|args:$_url:$vue:$an:$mois}}
{{/if}} {{/if}}
{{#foreach from=$calendriers_liste item="cd_tab"}} {{#foreach from=$calendriers_liste item="cd_tab"}}
{{if $cal_filtre == $cd_tab.id}} {{if $selected_calendar == $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}} {{: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}} {{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}} {{: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}}
@@ -44,9 +44,9 @@
{{:assign _liclass="nav-mois" _ulclass="modal-liens"}} {{:assign _liclass="nav-mois" _ulclass="modal-liens"}}
{{/if}} {{/if}}
<ul class="{{$_ulclass}}"> <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 || $subcurrent == 'mois'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=mois&an={{$an}}&mois={{$mois}}">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 == 'semaine'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=semaine&an={{$an}}&mois={{$mois}}">Semaine</a></li>
<li {{if $subcurrent == 'liste'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=liste&cal={{$cal}}">Liste</a></li> <li {{if $subcurrent == 'liste'}} class="{{$_liclass}}"{{/if}}><a href="{{$_url}}?vue=liste">Liste</a></li>
</ul> </ul>
{{/if}} {{/if}}
{{#restrict section="web" level="write"}} {{#restrict section="web" level="write"}}
+1
View File
@@ -62,6 +62,7 @@ a.lieu-lien:hover { text-decoration: underline; }
ul.liste-evt .lien-evt { color: var(--terra); font-size: .85rem; } 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; } .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; } p.vide { color: #777; }
p.aide { color:#777; font-size:.85rem; margin:.6rem 0 0; }
table.permanences { border-collapse: collapse; width: 100%; } table.permanences { border-collapse: collapse; width: 100%; }
.scroll-cal table.permanences { min-width: 42rem; } .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, table.permanences td { padding: .5rem .4rem; text-align: left; border-bottom: 1px solid #eceae8; }
+80 -596
View File
@@ -26,123 +26,21 @@
{{*:delete where="$$.type = :type AND id > 9" :type="event"*}} {{*:delete where="$$.type = :type AND id > 9" :type="event"*}}
{{*:save key="c489ba90-16d0-42cb-b5b8-8daa2f7e0d06" date="28/10/2026"|parse_date*}} {{*:save key="c489ba90-16d0-42cb-b5b8-8daa2f7e0d06" date="28/10/2026"|parse_date*}}
{{* ---------- Ajout ou Modification d'un événement ---------- *}} {{* ---------- Gestion des événements ---------- *}}
{{#form on="save_event" }} {{if $_POST.save_event || $_POST.suppr_event }}
{{if $_POST.save_event && $est_admin}} {{:include file="manage/_event.html"}}
{{if $_POST.save_event == 0}}
{{:assign var="_eventKey" value="%s"|uuid}}
{{else}}
{{:assign var="_eventKey" value=$_POST.save_event}}
{{/if}}
{{:debug post=$_POST _eventKey=$_eventKey}}
{{:save
key=$_eventKey
type="event"
titre=$_POST.titre|strval|trim
date=$_POST.date|parse_date
debut=$_POST.debut|parse_time
fin=$_POST.fin|parse_time
lieu=$_POST.lieu|strval|trim
description=$_POST.description|strval|trim
lien1_label=$_POST.lien1_label|strval|trim
lien1_url=$_POST.lien1_url|strval|trim
lien2_label=$_POST.lien2_label|strval|trim
lien2_url=$_POST.lien2_url|strval|trim
lien3_label=$_POST.lien3_label|strval|trim
lien3_url=$_POST.lien3_url|strval|trim
couleur=$_POST.couleur|strval|trim
calendrier=$_POST.calendrier|strval|trim}}
{{:redirect url="?an=%s&mois=%s"|args:$_POST.retour_an:$_POST.retour_mois*}}
{{/if}}
{{else}}
{{:form_errors}}
{{/form}}
{{* ---------- Modification d'un événement ----------
{{#form on="rename_event"}}
{{if $_POST.rename_event && $est_admin}}
{{:assign var="t" value=$_POST.titre|strval|trim}}
{{:assign var="d" value=$_POST.date|strval|trim}}
{{if $t != "" && $d != ""}}
{{:save
id=$_POST.rename_event|intval
type="event"
titre=$t
date=$d
debut=$_POST.debut|strval|trim
fin=$_POST.fin|strval|trim
lieu=$_POST.lieu|strval|trim
description=$_POST.description|strval|trim
lien1_label=$_POST.lien1_label|strval|trim
lien1_url=$_POST.lien1_url|strval|trim
lien2_label=$_POST.lien2_label|strval|trim
lien2_url=$_POST.lien2_url|strval|trim
lien3_label=$_POST.lien3_label|strval|trim
lien3_url=$_POST.lien3_url|strval|trim
couleur=$_POST.couleur|strval|trim
calendrier=$_POST.calendrier|strval|trim}}
{{*:redirect url="index.html?an=%s&mois=%s"|args:$_POST.retour_an:$_POST.retour_mois}}
{{/if}}
{{/if}}
{{else}}
{{:form_errors}}
{{/form}}
*}}
{{* ---------- Suppression d'un événement ---------- *}}
{{if $_POST.suppr_event && $est_admin}}
{{:delete id=$_POST.suppr_event|intval}}
{{:redirect url="index.html?an=%s&mois=%s"|args:$_POST.retour_an:$_POST.retour_mois}}
{{/if}} {{/if}}
{{* ---------- Gestion des permanences ---------- *}}
{{* ---------- Ajout d'une permanence récurrente ---------- *}} {{if $_POST.add_perm || $_POST.rename_perm || $_POST.suppr_perm}}
{{if $_POST.add_perm && $est_admin}} {{:include file="manage/_perm.html"}}
{{:assign var="lbl" value=$_POST.label|strval|trim}}
{{if $lbl != ""}}
{{:save type="permanence" jour=$_POST.jour|intval debut=$_POST.debut|strval|trim fin=$_POST.fin|strval|trim label=$lbl lieu=$_POST.lieu|strval|trim description=$_POST.description|strval|trim date_debut=$_POST.date_debut|strval|trim date_fin=$_POST.date_fin|strval|trim type_recurrence=$_POST.type_recurrence|strval|trim semaine_du_mois=$_POST.semaine_du_mois|intval couleur=$_POST.couleur|strval|trim calendrier=$_POST.calendrier|strval|trim}}
{{:redirect url="index.html"}}
{{/if}}
{{/if}} {{/if}}
{{* ---------- Gestion des occurrences ---------- *}}
{{* ---------- Modification d'une permanence ---------- *}} {{if $_POST.suppr_occurrence }}
{{if $_POST.rename_perm && $est_admin}} {{:include file="manage/_occurence.html"}}
{{:assign var="lbl" value=$_POST.label|strval|trim}}
{{if $lbl != ""}}
{{:save id=$_POST.rename_perm|intval type="permanence" jour=$_POST.jour|intval debut=$_POST.debut|strval|trim fin=$_POST.fin|strval|trim label=$lbl lieu=$_POST.lieu|strval|trim description=$_POST.description|strval|trim date_debut=$_POST.date_debut|strval|trim date_fin=$_POST.date_fin|strval|trim type_recurrence=$_POST.type_recurrence|strval|trim semaine_du_mois=$_POST.semaine_du_mois|intval couleur=$_POST.couleur|strval|trim calendrier=$_POST.calendrier|strval|trim}}
{{:redirect url="index.html"}}
{{/if}}
{{/if}} {{/if}}
{{* ---------- Gestion des calendriers ---------- *}}
{{* ---------- Suppression d'une permanence ---------- *}} {{if $_POST.add_calendrier || $_POST.suppr_calendrier || $_POST.mod_calendrier}}
{{if $_POST.suppr_perm && $est_admin}} {{:include file="manage/_calendrier.html"}}
{{:delete id=$_POST.suppr_perm|intval}}
{{:redirect url="index.html"}}
{{/if}}
{{* ---------- Suppression d'une seule occurrence (date) d'un rendez-vous régulier ---------- *}}
{{if $_POST.suppr_occurrence && $est_admin}}
{{:assign var="perm_id" value=$_POST.perm_id|intval}}
{{:assign var="date_exclue" value=$_POST.date_exclue|strval|trim}}
{{#load id=$perm_id}}
{{:assign var="ov_jour" value=$jour}}
{{:assign var="ov_debut" value=$debut}}
{{:assign var="ov_fin" value=$fin}}
{{:assign var="ov_label" value=$label}}
{{:assign var="ov_date_debut" value=$date_debut}}
{{:assign var="ov_date_fin" value=$date_fin}}
{{:assign var="ov_type_recurrence" value=$type_recurrence}}
{{:assign var="ov_semaine_du_mois" value=$semaine_du_mois}}
{{:assign var="ov_couleur" value=$couleur}}
{{:assign var="ov_lieu" value=$lieu}}
{{:assign var="ov_description" value=$description}}
{{:assign var="ov_calendrier" value=$calendrier}}
{{#foreach from=$exceptions item="ex"}}
{{:assign var="new_exceptions." value=$ex}}
{{/foreach}}
{{/load}}
{{:assign var="new_exceptions." value=$date_exclue}}
{{:save id=$perm_id type="permanence" jour=$ov_jour debut=$ov_debut fin=$ov_fin label=$ov_label lieu=$ov_lieu description=$ov_description date_debut=$ov_date_debut date_fin=$ov_date_fin type_recurrence=$ov_type_recurrence semaine_du_mois=$ov_semaine_du_mois couleur=$ov_couleur calendrier=$ov_calendrier exceptions=$new_exceptions}}
{{:redirect url="index.html?an=%s&mois=%s"|args:$_POST.retour_an:$_POST.retour_mois}}
{{/if}} {{/if}}
{{* ---------- Mois affiché (par défaut : le mois en cours) ---------- *}} {{* ---------- Mois affiché (par défaut : le mois en cours) ---------- *}}
@@ -180,55 +78,71 @@
{{if $vue != "semaine" && $vue != "liste"}}{{:assign var="vue" value="mois"}}{{/if}} {{if $vue != "semaine" && $vue != "liste"}}{{:assign var="vue" value="mois"}}{{/if}}
{{/if}} {{/if}}
{{* ---------- Gestion des calendriers (ajout / suppression, admin) ---------- *}} {{* ---------- Liste des calendriers disponibles ---------- *}}
{{if $_POST.add_calendrier && $est_admin}} {{#load module="agenda" where="$$.type = 'calendrier'" order="$$.nom ASC"}}
{{:assign var="nom_cal" value=$_POST.nom_calendrier|strval|trim}}
{{if $nom_cal != ""}}
{{:save type="calendrier" nom=$nom_cal}}
{{:redirect url="index.html?nav=conf&conf=manage_cal&msg=ajout"}}
{{/if}}
{{/if}}
{{if $_POST.suppr_calendrier && $est_admin}}
{{:assign var="cal_a_suppr" value=$_POST.suppr_calendrier|strval|trim}}
{{:assign var="where_reassign" value="$$.calendrier = '%s'"|args:$cal_a_suppr}}
{{#load where=$where_reassign}}
{{if $type == "event"}}
{{:save id=$id type="event" titre=$titre date=$date debut=$debut fin=$fin lieu=$lieu description=$description lien=$lien lien1_label=$lien1_label lien1_url=$lien1_url lien2_label=$lien2_label lien2_url=$lien2_url lien3_label=$lien3_label lien3_url=$lien3_url couleur=$couleur calendrier=""}}
{{elseif $type == "permanence"}}
{{:save id=$id type="permanence" jour=$jour debut=$debut fin=$fin label=$label lieu=$lieu description=$description date_debut=$date_debut date_fin=$date_fin type_recurrence=$type_recurrence semaine_du_mois=$semaine_du_mois couleur=$couleur exceptions=$exceptions calendrier=""}}
{{/if}}
{{/load}}
{{:delete id=$cal_a_suppr|intval}}
{{:redirect url="index.html?nav=conf&conf=manage_cal&msg=suppression"}}
{{/if}}
{{* ---------- Liste des calendriers disponibles (Agenda + ceux ajoutés) ---------- *}}
{{:assign var="calendriers_liste.agenda.id" value="agenda"}}
{{:assign var="calendriers_liste.agenda.nom" value="Agenda"}}
{{:assign var="calendriers_liste.agenda.par_defaut" value=true}}
{{#load where="$$.type = 'calendrier'" order="$$.nom ASC"}}
{{:assign var="calendriers_liste.%s.id"|args:$id value=$id}} {{:assign var="calendriers_liste.%s.id"|args:$id value=$id}}
{{:assign var="calendriers_liste.%s.nom"|args:$id value=$nom}} {{:assign var="calendriers_liste.%s.nom"|args:$id value=$nom}}
{{:assign var="calendriers_liste.%s.par_defaut"|args:$id value=false}} {{:assign var="calendriers_liste.%s.par_defaut"|args:$id value=$par_defaut}}
{{:assign var="calendriers_liste.%s.couleur"|args:$id value=$couleur}}
{{:assign var="calendriers_liste.%s.textecouleur"|args:$id value=$textecouleur}}
{{:assign var="calendriers_liste.%s.categorie"|args:$id value=$categorie}}
{{else}}
{{* Pas encore de calendrier créé : vérifier que nous ne sommes pas sur le site web *}}
{{if $module.name == "agenda"}}
{{:save type="calendrier" nom="Agenda" par_defaut=true couleur=180 textecouleur="225" categorie="p"}}
{{/if}}
{{/load}} {{/load}}
{{* ---------- Filtre calendrier (choisi via ?cal=..., "agenda" par défaut) ---------- *}} {{* ---------- Liste des calendriers publics (Web) ---------- *}}
{{:assign var="cal_filtre" value=$_GET.cal|strval|trim}} {{if $module.name == "web"}}
{{:assign var="cal_filtre_valide" value=false}} {{:assign filtre_cal_sql="1"}}
{{if $cal_filtre == "tous"}}{{:assign var="cal_filtre_valide" value=true}}{{/if}} {{#foreach from=$calendriers_liste item="value"}}
{{#foreach from=$calendriers_liste item="cd_check"}} {{if $value.categorie == "p"}}
{{if $cd_check.id == $cal_filtre}}{{:assign var="cal_filtre_valide" value=true}}{{/if}} {{:assign var="calendriers_publics." id=$id value=$nom}}
{{/foreach}} {{:assign filtre_cal_sql=" AND $$.calendrier = '%d' AND %s"|args:$id:$filtre_cal_sql}}
{{if !$cal_filtre_valide}}{{:assign var="cal_filtre" value="agenda"}}{{/if}} {{/if}}
{{/foreach}}
{{:assign var="filtre_cal_sql" value=""}} {{:assign selected_calendar=-1 selected_calendar_name="Public" selected_calendar_couleur=180}}
{{if $cal_filtre == "agenda"}} {{*:debug filtre_cal_sql=$filtre_cal_sql*}}
{{:assign var="filtre_cal_sql" value=" AND ($$.calendrier = 'agenda' OR $$.calendrier IS NULL OR $$.calendrier = '')"}}
{{elseif $cal_filtre != "tous"}}
{{:assign var="filtre_cal_sql" value=" AND $$.calendrier = '%s'"|args:$cal_filtre}}
{{/if}} {{/if}}
{{* ---------- Filtre calendrier (Utilisateurs logués) ---------- *}}
{{if $is_logged==true}}
{{:assign saved_filters=$module.config.filters}}
{{:assign var="user_filters" from="saved_filters.%s"|args:$logged_user.id}}
{{if $_GET.cal == null}}
{{:assign selected_calendar=$user_filters.cal_key }}
{{:assign var="selected_calendar_name" from="calendriers_liste.%s.nom"|args:$selected_calendar}}
{{:assign var="selected_calendar_couleur" from="calendriers_liste.%s.couleur"|args:$selected_calendar}}
{{if $selected_calendar == -1}}
{{:assign filtre_cal_sql=""}}
{{else}}
{{:assign filtre_cal_sql=" AND $$.calendrier = '%s'"|args:$selected_calendar}}
{{/if}}
{{else}}
{{*
-1 = Tous
n = Id du calendrier dans la base
*}}
{{if $_GET.cal == -1}}
{{:assign selected_calendar=-1 selected_calendar_name="Tous" selected_calendar_couleur=180}}
{{:assign filtre_cal_sql=""}}
{{else}}
{{:assign selected_calendar=$_GET.cal}}
{{:assign var="selected_calendar_name" from="calendriers_liste.%s.nom"|args:$selected_calendar}}
{{:assign var="selected_calendar_couleur" from="calendriers_liste.%s.couleur"|args:$selected_calendar}}
{{:assign filtre_cal_sql=" AND $$.calendrier = '%s'"|args:$selected_calendar}}
{{/if}}
{{:assign var="user_filters.cal_key" value=$selected_calendar}}
{{:assign var="saved_filters.%s"|args:$logged_user.id value=$user_filters}}
{{:save key="config" filters=$saved_filters}}
{{/if}}
{{else}}
{{:assign selected_calendar=$_GET.cal}}
{{/if}}
{{*:debug _GET=$_GET scal=$selected_calendar fsql=$filtre_cal_sql user_cal=$user_filters.cal_key*}}
{{* ---------- Nombre de rangées du mois affiché, et du mois précédent (pour la navigation par semaine) ---------- *}} {{* ---------- Nombre de rangées du mois affiché, et du mois précédent (pour la navigation par semaine) ---------- *}}
{{:assign var="total_rows" value="ceil((%d+%d)/7)"|math:$nb_jours:$decalage}} {{:assign var="total_rows" value="ceil((%d+%d)/7)"|math:$nb_jours:$decalage}}
{{:assign var="premier_du_mois_prec" value="%04d-%02d-01"|args:$an_prec:$mois_prec}} {{:assign var="premier_du_mois_prec" value="%04d-%02d-01"|args:$an_prec:$mois_prec}}
@@ -253,13 +167,13 @@
{{* FB : Ne Fonctionne pas : erreur "Database is locked" / perso ca m'arrrange de conserver les anciens RDV pour avoir une trace ;-)SS *}} {{* FB : Ne Fonctionne pas : erreur "Database is locked" / perso ca m'arrrange de conserver les anciens RDV pour avoir une trace ;-)SS *}}
{{:assign var="purge_faite" value=false}} {{:assign var="purge_faite" value=false}}
{{:assign var="where_purge_evt" value="$$.type = 'event' AND $$.date < '%s'"|args:$aujourdhui}} {{:assign var="where_purge_evt" value="$$.type = 'event' AND $$.date < '%s'"|args:$aujourdhui}}
{{#load where=$where_purge_evt}} {{#load module="agenda" where=$where_purge_evt}}
{{*:delete id=$id*}} {{*:delete id=$id*}}
{{*:debug id=$id*}} {{*:debug id=$id*}}
{{:assign var="purge_faite" value=true}} {{:assign var="purge_faite" value=true}}
{{/load}} {{/load}}
{{:assign var="where_purge_perm" value="$$.type = 'permanence' AND $$.date_fin != '' AND $$.date_fin < '%s'"|args:$aujourdhui}} {{:assign var="where_purge_perm" value="$$.type = 'permanence' AND $$.date_fin != '' AND $$.date_fin < '%s'"|args:$aujourdhui}}
{{#load where=$where_purge_perm}} {{#load module="agenda" where=$where_purge_perm}}
{{*:delete id=$id*}} {{*:delete id=$id*}}
{{*:debug id=$id*}} {{*:debug id=$id*}}
{{:assign var="purge_faite" value=true}} {{:assign var="purge_faite" value=true}}
@@ -272,7 +186,7 @@
{{* ---------- Chargement des événements du mois affiché (pour la grille) ---------- *}} {{* ---------- Chargement des événements du mois affiché (pour la grille) ---------- *}}
{{:assign var="date_fin_mois" value="%04d-%02d-%02d"|args:$an:$mois:$nb_jours}} {{:assign var="date_fin_mois" value="%04d-%02d-%02d"|args:$an:$mois:$nb_jours}}
{{:assign var="where_mois" value="$$.type = 'event' AND $$.date >= '%s' AND $$.date <= '%s'%s"|args:$premier_du_mois:$date_fin_mois:$filtre_cal_sql}} {{:assign var="where_mois" value="$$.type = 'event' AND $$.date >= '%s' AND $$.date <= '%s'%s"|args:$premier_du_mois:$date_fin_mois:$filtre_cal_sql}}
{{#load module="agenda" where=$where_mois order="$$.date ASC"}} {{#load module="agenda" where=$where_mois order="$$.date ASC" }}
{{:assign var="events_par_jour.%s.%s.titre"|args:$date:$id value=$titre}} {{:assign var="events_par_jour.%s.%s.titre"|args:$date:$id value=$titre}}
{{:assign var="events_par_jour.%s.%s.id"|args:$date:$id value=$id}} {{:assign var="events_par_jour.%s.%s.id"|args:$date:$id value=$id}}
{{:assign var="events_par_jour.%s.%s.debut"|args:$date:$id value=$debut}} {{:assign var="events_par_jour.%s.%s.debut"|args:$date:$id value=$debut}}
@@ -504,443 +418,12 @@
{{/if}} {{/if}}
<div class="wrap"> <div class="wrap">
{{* FB : Retour vers l'admin du site si admin {{if $vue == "mois" || $vue == "semaine"}}
{{if $est_admin}} {{:include file="_calendar.html" vue=$vue}}
<p><a class="retour" href="/admin">&larr; Retour au site</a></p> {{elseif $vue == "liste"}}
{{else}} {{:include file="_appointments_list.html" vue=$vue}}
<p><a class="retour" href="/">&larr; Retour au site</a></p> {{:include file="_events_list.html" vue=$vue}}
{{/if}}
<h1>Agenda{{if $est_admin}}<span class="badge-admin">mode admin</span>{{/if}}</h1>
*}}
{{*
<nav class="vue-tabs">
<a class="{{if $vue == "mois"}}current{{/if}}" href="index.html?vue=mois&amp;an={{$an}}&amp;mois={{$mois}}&amp;cal={{$cal_filtre}}">Mois</a>
<a class="{{if $vue == "semaine"}}current{{/if}}" href="index.html?vue=semaine&amp;an={{$an}}&amp;mois={{$mois}}&amp;cal={{$cal_filtre}}">Semaine</a>
<a class="{{if $vue == "liste"}}current{{/if}}" href="index.html?vue=liste&amp;cal={{$cal_filtre}}">Liste</a>
</nav>
<nav class="vue-tabs cal-tabs">
<a class="{{if $cal_filtre == "tous"}}current{{/if}}" href="index.html?vue={{$vue}}&amp;an={{$an}}&amp;mois={{$mois}}&amp;cal=tous">Tous les calendriers</a>
{{#foreach from=$calendriers_liste item="cd_tab"}}
<a class="{{if $cal_filtre == $cd_tab.id}}current{{/if}}" href="index.html?vue={{$vue}}&amp;an={{$an}}&amp;mois={{$mois}}&amp;cal={{$cd_tab.id}}">{{$cd_tab.nom}}</a>
{{/foreach}}
</nav>
*}}
{{if $vue == "mois" || $vue == "semaine"}}
{{:include file="_calendar.html" vue=$vue}}
{{elseif $vue == "liste"}}
{{:include file="_appointments_list.html" vue=$vue}}
{{:include file="_events_list.html" vue=$vue}}
{{/if}}
{{* CALENDAR
{{if $vue != "liste"}}
<div class="card">
<h2>Calendrier ({{$cal_filtre}})</h2>
{{if $vue == "mois"}}
<div class="nav-mois">
<a href="index.html?vue=mois&amp;an={{$an_prec}}&amp;mois={{$mois_prec}}">&larr;</a>
<span>{{$nom_mois}}</span>
<a href="index.html?vue=mois&amp;an={{$an_suiv}}&amp;mois={{$mois_suiv}}">&rarr;</a>
</div>
{{else}}
<div class="nav-mois">
{{if $semaine_sel <= 1}}
<a href="index.html?vue=semaine&amp;an={{$an_prec}}&amp;mois={{$mois_prec}}&amp;semaine_sel={{$total_rows_prec}}">&larr;</a>
{{else}}
<a href="index.html?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="index.html?vue=semaine&amp;an={{$an_suiv}}&amp;mois={{$mois_suiv}}&amp;semaine_sel=1">&rarr;</a>
{{else}}
<a href="index.html?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}}
<div class="evt-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-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}}
{{if $vue == "mois" && "%d %% 7"|math:$n == 0 && $n != 42}}</tr><tr>{{/if}}
{{/foreach}}
</tr>
</tbody>
</table>
</div>
</div>
{{/if}}
*}}
{{*if $est_admin}}
<div class="card">
<h2>Gérer les calendriers</h2>
<table class="permanences">
<thead><tr><th>Nom</th><th></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="index.html" style="display:inline">
<button type="submit" name="suppr_calendrier" value="{{$cd_gest.id}}" class="mini" title="Supprimer ce calendrier">&#10005; Supprimer</button>
</form>
{{/if}}
</td>
</tr>
{{/foreach}}
</tbody>
</table>
<form method="post" action="index.html" 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>
</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}}
<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*}}
{{*
<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}}
</div>
*}}
{{*if $est_admin}}
<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}}
<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*}}
</div> </div>
<div class="modal-overlay" id="modalDetailEvt" onclick="if(event.target===this){fermerDetailEvt();}"> <div class="modal-overlay" id="modalDetailEvt" onclick="if(event.target===this){fermerDetailEvt();}">
@@ -1016,6 +499,7 @@ document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { fer
{{*</body> {{*</body>
</html> </html>
*}} *}}
{{*:debug*}}
{{if $est_admin==true}} {{if $est_admin==true}}
{{:admin_footer}} {{:admin_footer}}
{{/if}} {{/if}}
+77
View File
@@ -0,0 +1,77 @@
{{* ---------- Gestion des calendriers (ajout / suppression, admin) ---------- *}}
{{#form on="add_calendrier"}}
{{if $_POST.add_calendrier && $est_admin}}
{{* Nom déjà existant ? *}}
{{if $_POST.nom_calendrier}}
{{#load where="$$.type = 'calendrier' AND $$.nom = '%s'"|args:$_POST.nom_calendrier}}
{{:error message="Le nom du calendrier existe déjà."}}
{{/load}}
{{else}}
{{:error message="Le nom du calendrier doit être renseigné."}}
{{/if}}
{{if $_POST.pardefaut == true}}
{{* enlève le flag à un des autres calendriers *}}
{{#load where="$$.type = 'calendrier' AND $$.par_defaut = true"|args:$_POST.nom_calendrier}}
{{:assign var="_id_cal" value=$id}}
{{/load}}
{{if $_id_cal}}
{{:save type="calendrier" id=$_id_cal par_defaut=false}}
{{/if}}
{{:assign _pardef=true}}
{{else}}
{{:assign _pardef=false}}
{{/if}}
{{:save type="calendrier" nom=$_POST.nom_calendrier par_defaut=$_pardef couleur=$_POST.couleur}}
{{:redirect url="index.html?nav=conf&conf=manage_cal&msg=ajout"}}
{{/if}}
{{else}}
{{:form_errors}}
{{/form}}
{{* Modifier un calendrier *}}
{{#form on="mod_calendrier"}}
{{:debug p=$_POST}}
{{* vérifications *}}
{{if !$_POST.mod_calendrier && !$est_admin}}
{{:error message="Le calendrier n'existe pas."}}
{{/if}}
{{* Nom déjà existant ? *}}
{{if $_POST.nom_calendrier}}
{{#load where="$$.type = 'calendrier' AND $$.nom = '%s' AND id <> %d"|args:$_POST.nom_calendrier:$_POST.mod_calendrier}}
{{:error message="Le nom du calendrier existe déjà."}}
{{/load}}
{{else}}
{{:error message="Le nom du calendrier doit être renseigné."}}
{{/if}}
{{* Par défaut déjà existant ? *}}
{{if $_POST.pardefaut == true}}
{{* enlève le flag à un des autres calendriers *}}
{{#load where="$$.type = 'calendrier' AND $$.par_defaut = true"|args:$_POST.nom_calendrier}}
{{:assign var="_id_cal" value=$id}}
{{/load}}
{{if $_id_cal}}
{{:save type="calendrier" id=$_id_cal par_defaut=false}}
{{/if}}
{{:assign _pardef=true}}
{{else}}
{{:assign _pardef=false}}
{{/if}}
{{:save type="calendrier" id=$_POST.mod_calendrier nom=$_POST.nom_calendrier par_defaut=$_pardef couleur=$_POST.couleur textecouleur=$_POST.couleur_texte categorie=$_POST.categorie}}
{{else}}
{{:form_errors}}
{{/form}}
{{* Supprimer un calendrier *}}
{{if $_POST.suppr_calendrier && $est_admin}}
{{:assign var="cal_a_suppr" value=$_POST.suppr_calendrier|strval|trim}}
{{:assign var="where_reassign" value="$$.calendrier = '%s'"|args:$cal_a_suppr}}
{{#load where=$where_reassign}}
{{if $type == "event"}}
{{:save id=$id type="event" titre=$titre date=$date debut=$debut fin=$fin lieu=$lieu description=$description lien=$lien lien1_label=$lien1_label lien1_url=$lien1_url lien2_label=$lien2_label lien2_url=$lien2_url lien3_label=$lien3_label lien3_url=$lien3_url couleur=$couleur calendrier=""}}
{{elseif $type == "permanence"}}
{{:save id=$id type="permanence" jour=$jour debut=$debut fin=$fin label=$label lieu=$lieu description=$description date_debut=$date_debut date_fin=$date_fin type_recurrence=$type_recurrence semaine_du_mois=$semaine_du_mois couleur=$couleur exceptions=$exceptions calendrier=""}}
{{/if}}
{{/load}}
{{:delete id=$cal_a_suppr|intval}}
{{:redirect url="index.html?nav=conf&conf=manage_cal&msg=suppression"}}
{{/if}}
+41
View File
@@ -0,0 +1,41 @@
{{* ---------- Ajout ou Modification d'un événement (admin) ---------- *}}
{{#form on="save_event" }}
{{if $_POST.save_event && $est_admin}}
{{if !$_POST.event_id}}
{{:assign var="_eventKey" value="%s"|uuid}}
{{#load where="id = %d"|args:$_POST.calendrier}}
{{:assign var="_eventColor" value=$couleur}}
{{/load}}
{{else}}
{{:assign var="_eventKey" value=$_POST.save_event}}
{{:assign var="_eventColor" value=$_POST.couleur}}
{{/if}}
{{:debug post=$_POST _eventKey=$_eventKey _eventColor=$_eventColor}}
{{:save
key=$_eventKey
type="event"
titre=$_POST.titre|strval|trim
date=$_POST.date|parse_date
debut=$_POST.debut|parse_time
fin=$_POST.fin|parse_time
lieu=$_POST.lieu|strval|trim
description=$_POST.description|strval|trim
lien1_label=$_POST.lien1_label|strval|trim
lien1_url=$_POST.lien1_url|strval|trim
lien2_label=$_POST.lien2_label|strval|trim
lien2_url=$_POST.lien2_url|strval|trim
lien3_label=$_POST.lien3_label|strval|trim
lien3_url=$_POST.lien3_url|strval|trim
couleur=$_eventColor|intval
calendrier=$_POST.calendrier|strval|trim}}
{{:redirect url="?an=%s&mois=%s"|args:$_POST.retour_an:$_POST.retour_mois}}
{{/if}}
{{else}}
{{:form_errors}}
{{/form}}
{{* ---------- Suppression d'un événement (admin) ---------- *}}
{{if $_POST.suppr_event && $est_admin}}
{{:delete id=$_POST.suppr_event|intval}}
{{:redirect url="index.html?an=%s&mois=%s"|args:$_POST.retour_an:$_POST.retour_mois}}
{{/if}}
+25
View File
@@ -0,0 +1,25 @@
{{* ---------- Suppression d'une seule occurrence (date) d'un rendez-vous régulier ---------- *}}
{{if $_POST.suppr_occurrence && $est_admin}}
{{:assign var="perm_id" value=$_POST.perm_id|intval}}
{{:assign var="date_exclue" value=$_POST.date_exclue|strval|trim}}
{{#load id=$perm_id}}
{{:assign var="ov_jour" value=$jour}}
{{:assign var="ov_debut" value=$debut}}
{{:assign var="ov_fin" value=$fin}}
{{:assign var="ov_label" value=$label}}
{{:assign var="ov_date_debut" value=$date_debut}}
{{:assign var="ov_date_fin" value=$date_fin}}
{{:assign var="ov_type_recurrence" value=$type_recurrence}}
{{:assign var="ov_semaine_du_mois" value=$semaine_du_mois}}
{{:assign var="ov_couleur" value=$couleur}}
{{:assign var="ov_lieu" value=$lieu}}
{{:assign var="ov_description" value=$description}}
{{:assign var="ov_calendrier" value=$calendrier}}
{{#foreach from=$exceptions item="ex"}}
{{:assign var="new_exceptions." value=$ex}}
{{/foreach}}
{{/load}}
{{:assign var="new_exceptions." value=$date_exclue}}
{{:save id=$perm_id type="permanence" jour=$ov_jour debut=$ov_debut fin=$ov_fin label=$ov_label lieu=$ov_lieu description=$ov_description date_debut=$ov_date_debut date_fin=$ov_date_fin type_recurrence=$ov_type_recurrence semaine_du_mois=$ov_semaine_du_mois couleur=$ov_couleur calendrier=$ov_calendrier exceptions=$new_exceptions}}
{{:redirect url="index.html?an=%s&mois=%s"|args:$_POST.retour_an:$_POST.retour_mois}}
{{/if}}
+23
View File
@@ -0,0 +1,23 @@
{{* ---------- Ajout d'une permanence récurrente ---------- *}}
{{if $_POST.add_perm && $est_admin}}
{{:assign var="lbl" value=$_POST.label|strval|trim}}
{{if $lbl != ""}}
{{:save type="permanence" jour=$_POST.jour|intval debut=$_POST.debut|strval|trim fin=$_POST.fin|strval|trim label=$lbl lieu=$_POST.lieu|strval|trim description=$_POST.description|strval|trim date_debut=$_POST.date_debut|strval|trim date_fin=$_POST.date_fin|strval|trim type_recurrence=$_POST.type_recurrence|strval|trim semaine_du_mois=$_POST.semaine_du_mois|intval couleur=$_POST.couleur|strval|trim calendrier=$_POST.calendrier|strval|trim}}
{{:redirect url="index.html"}}
{{/if}}
{{/if}}
{{* ---------- Modification d'une permanence ---------- *}}
{{if $_POST.rename_perm && $est_admin}}
{{:assign var="lbl" value=$_POST.label|strval|trim}}
{{if $lbl != ""}}
{{:save id=$_POST.rename_perm|intval type="permanence" jour=$_POST.jour|intval debut=$_POST.debut|strval|trim fin=$_POST.fin|strval|trim label=$lbl lieu=$_POST.lieu|strval|trim description=$_POST.description|strval|trim date_debut=$_POST.date_debut|strval|trim date_fin=$_POST.date_fin|strval|trim type_recurrence=$_POST.type_recurrence|strval|trim semaine_du_mois=$_POST.semaine_du_mois|intval couleur=$_POST.couleur|strval|trim calendrier=$_POST.calendrier|strval|trim}}
{{:redirect url="index.html"}}
{{/if}}
{{/if}}
{{* ---------- Suppression d'une permanence ---------- *}}
{{if $_POST.suppr_perm && $est_admin}}
{{:delete id=$_POST.suppr_perm|intval}}
{{:redirect url="index.html"}}
{{/if}}
+3 -3
View File
@@ -1,7 +1,7 @@
name = "Agenda" name = "Agenda"
description = "Calendrier mensuel/semaine/liste, rendez-vous réguliers récurrents (avec exceptions et couleurs), événements ponctuels, purge et tri automatiques." description = "Gestion des calendriers associatif avec vues mensuel/semaine/liste, rendez-vous réguliers récurrents (avec exceptions et couleurs), événements ponctuels, purge et tri automatiques. \nversion 1.1"
author = "Vive le Vélo/Recycl'arz" author = "Vive le Vélo (original) / Recycl'arz"
author_url = "https://recyclarz.bountyarz.ovh" author_url = "https://git.kaz.bzh/bountz/agenda"
restrict_section = "web" restrict_section = "web"
restrict_level = "write" restrict_level = "write"
home_button = false home_button = false
+6 -39
View File
@@ -1,48 +1,15 @@
{{*
<!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="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="where_public" value="$$.type = 'calendrier' AND $$.categorie = 'p' "}}
{{:assign var="event_trouve" value=false}} {{:assign var="event_trouve" value=false}}
<h4>Prochains événements</h4> <h4>Prochains événements</h4>
<ul> <ul>
{{#load module="agenda" where=$where_public limit=1}}
{{:assign var="where_venir" value="$$.type = 'event' AND $$.date >= '%s' AND $$.calendrier = '%s' "|args:$aujourdhui:$id}}
{{/load}}
{{#load module="agenda" where=$where_venir order="$$.date ASC" limit=4}} {{#load module="agenda" where=$where_venir order="$$.date ASC" limit=4}}
{{:assign var="event_trouve" value=true}} {{:assign var="event_trouve" value=true}}
<li><b>{{$date|date_short}}</b> {{$titre}}</li> <li><b>{{$date|date_short}}</b> {{$titre}}</li>
{{/load}} {{/load}}
</ul> </ul>
{{if !$event_trouve}}<p>Aucun événement à venir pour l'instant.</p>{{/if}} {{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>
*}}