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