diff --git a/_appointments_list.html b/_appointments_list.html new file mode 100644 index 0000000..be94b6c --- /dev/null +++ b/_appointments_list.html @@ -0,0 +1,48 @@ +{{if $est_admin}} +
+

Rendez-vous réguliers

+ {{:assign var="perm_trouve" value=false}} +
+ + {{if $est_admin}}{{/if}} + + {{#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}} + + + + + + + + + {{if $est_admin}} + + {{/if}} + + {{/load}} + +
RécurrenceJourHorairesDétailLieuCalendrierDepuis / jusqu'à
+ {{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}} + {{$nom_jour}}{{$debut}}{{if $fin}} — {{$fin}}{{/if}}{{$label}}{{if $lieu}}{{$lieu}}{{/if}} + {{: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}} + {{if $date_debut}}à partir du {{$date_debut|date_short}}{{/if}}{{if $date_debut && $date_fin}}
{{/if}}{{if $date_fin}}jusqu'au {{$date_fin|date_short}}{{/if}}
+ ✎ +
+ +
+
+
+ {{if !$perm_trouve}}

Aucun rendez-vous régulier enregistré.

{{/if}} +
+{{/if}} \ No newline at end of file diff --git a/_calendar.html b/_calendar.html new file mode 100644 index 0000000..47607ea --- /dev/null +++ b/_calendar.html @@ -0,0 +1,171 @@ +{{if $vue != "liste"}} +
+

Calendrier ({{$cal_filtre}})

+ {{if $vue == "mois"}} + + {{else}} + +{{/if}} +
+ + + + + + +{{: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}} + + +
{{$jour_num}}
+ {{#foreach from=$badges_tries item="bj"}} + {{if $bj.type == "perm"}} +
+
+ {{if $bj.debut}}{{$bj.debut}}{{if $bj.fin}}–{{$bj.fin}}{{/if}} — {{/if}}{{$bj.label}}{{if $bj.lieu}}
📍 {{$bj.lieu}}{{/if}} + {{if $bj.description}}
{{$bj.description}}
{{/if}} +
+ {{if $est_admin}} + + ✎ +
+ + + + + + +
+ {{/if}} +
+ {{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%); +*}} +
+
+ {{if $bj.debut}}{{$bj.debut}}{{if $bj.fin}}–{{$bj.fin}}{{/if}} — {{/if}}{{$bj.label}}{{if $bj.lieu}}
📍 {{$bj.lieu}}{{/if}} + {{if $bj.description}}
{{$bj.description}}
{{/if}} +
+ {{if $est_admin}} + + ✎ +
+ + + + +
+ {{/if}} +
+ {{/if}} + {{/foreach}} + + {{else}} +
+ + {{/if}} + {{/if}} + {{if $vue == "mois" && "%d %% 7"|math:$n == 0 && $n != 42}}{{/if}} +{{/foreach}} + + +
LunMarMerJeuVenSamDim
+
+
+{{/if}} \ No newline at end of file diff --git a/_config.html b/_config.html new file mode 100644 index 0000000..855674f --- /dev/null +++ b/_config.html @@ -0,0 +1,183 @@ +{{if $est_admin && $subconf=="manage_cal"}} +
+

Gérer les calendriers

+ + + + {{#foreach from=$calendriers_liste item="cd_gest"}} + + + + + {{/foreach}} + +
NomActions
{{$cd_gest.nom}}{{if $cd_gest.par_defaut}} (par défaut){{/if}} + {{if !$cd_gest.par_defaut}} +
+ {{* *}} + {{:button type="submit" name="suppr_calendrier" label="Supprimer ce calendrier" shape="delete" value="%s"|args:$cd_gest.id}} +
+ {{/if}} +
+
+ {{*
+ +
+ + *}} +
{{:input type="text" name="nom_calendrier" label="Nouveau calendrier" help="ex. Réunions" required=true}}
+ {{:button type="submit" name="add_calendrier" label="Ajouter" title="Ajouter un calendrier" shape="plus" value="1"}} +
+

Supprimer un calendrier ne supprime pas les événements/rendez-vous qui y étaient rattachés — ils basculent simplement dans "Agenda" par défaut.

+
+{{/if}} + +{{if $est_admin && $subconf=="manage_eve"}} + {{*:debug event=$event*}} +
+
+ {{if $edit_event}}Modifier l'événement{{else}}Ajouter un événement{{/if}} +
+ {{: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}} + +
{{: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://…"}}
+
{{: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://…"}}
+
{{: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://…"}}
+
+
+

+ {{if $edit_event}} + Annuler + {{: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}} +

+
+{{*
+

{{if $edit_event}}Modifier l'événement{{else}}Ajouter un événement{{/if}}

+
+ + +
+
+
+
+
+
+
+
+ + +
+
+

+

Liens (affiche, document, inscription… — jusqu'à 3, facultatifs)

+
+
+
+
+
+
+
+
+
+
+
+
+ {{if $edit_event}} + + Annuler + {{else}} + + {{/if}} +
+
+*}} +{{/if}} + +{{if $est_admin && $subconf=="manage_app"}} +
+

{{if $edit_perm}}Modifier ce rendez-vous régulier{{else}}Ajouter un rendez-vous régulier{{/if}}

+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+ + +
+
+

+

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.

+ {{if $edit_perm}} + + Annuler + {{else}} + + {{/if}} +
+
+{{/if}} \ No newline at end of file diff --git a/_events_list.html b/_events_list.html new file mode 100644 index 0000000..8884582 --- /dev/null +++ b/_events_list.html @@ -0,0 +1,45 @@ +
+

{{if $vue == "liste"}}Calendrier en liste (3 prochains mois){{else}}Événements à venir{{/if}}

+{{if $vue == "liste"}} + {{:assign var="rien_trouve" value=true}} + + {{if $rien_trouve}}

Rien de prévu sur les 3 prochains mois.

{{/if}} +{{else}} + {{:assign var="event_trouve" value=false}} + + {{if !$event_trouve}}

Aucun événement à venir pour l'instant.

{{/if}} +{{/if}} \ No newline at end of file diff --git a/_nav.html b/_nav.html new file mode 100644 index 0000000..85a07b9 --- /dev/null +++ b/_nav.html @@ -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}} + + +{{* Messages *}} +{{if $_GET.msg == "ajout" }} +

Ajout effectué

+{{elseif $_GET.msg == "modification" }} +

Modification effectuée

+{{elseif $_GET.msg == "suppression" }} +

Suppression effectuée

+{{elseif $_GET.msg == "supprmvtmat" }} +

Mouvement supprimé - Matériel supprimé

+{{/if}} \ No newline at end of file diff --git a/agenda.css b/agenda.css new file mode 100644 index 0000000..355a6af --- /dev/null +++ b/agenda.css @@ -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); } \ No newline at end of file diff --git a/flux.ics b/flux.ics new file mode 100644 index 0000000..1b7cc11 --- /dev/null +++ b/flux.ics @@ -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 \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..0cc4cb6 --- /dev/null +++ b/index.html @@ -0,0 +1,1021 @@ +{{* ========================================================================= + MODULE AGENDA + + ADMINISTRATION : accès admin géré par les permissions Paheko réelles + (membre connecté avec droit d'écriture sur la section "web"), via + {{#restrict}} ci-dessous. Plus de code partagé dans l'URL. +========================================================================= *}} +{{#restrict section="web" level="write"}} + {{:assign var="est_admin" value=true}} +{{else}} + {{if $is_logged==true}} + {{:assign _url="%sindex.html"|args:$module.url}} + {{else}} + {{:assign _url="%sagenda.html"|args:$module.url}} + {{/if}} + {{:assign var="est_admin" value=false}} +{{/restrict}} + +{{if $est_admin==true}} + {{:admin_header title="Agenda" custom_css="/m/agenda/agenda.css" layout="" current="module_agenda"}} +{{* {{else}} TODO membre logué + *}} +{{/if}} + +{{* ---------- Temp correction ---------- *}} +{{*:delete where="$$.type = :type AND id > 9" :type="event"*}} +{{*:save key="c489ba90-16d0-42cb-b5b8-8daa2f7e0d06" date="28/10/2026"|parse_date*}} + +{{* ---------- Ajout ou Modification d'un événement ---------- *}} +{{#form on="save_event" }} + {{if $_POST.save_event && $est_admin}} + {{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}} + +{{* ---------- 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}} + +{{* ---------- 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}} + +{{* ---------- Mois affiché (par défaut : le mois en cours) ---------- *}} +{{:assign var="an" value=$_GET.an|intval}} +{{:assign var="mois" value=$_GET.mois|intval}} +{{if $an < 1}}{{:assign var="an" value=$now|date:"Y"}}{{/if}} +{{if $mois < 1 || $mois > 12}}{{:assign var="mois" value=$now|date:"n"}}{{/if}} + +{{:assign var="premier_du_mois" value="%04d-%02d-01"|args:$an:$mois}} +{{:assign var="nb_jours" value=$premier_du_mois|date:"t"}} +{{:assign var="dow_premier" value=$premier_du_mois|date:"N"}} +{{:assign var="decalage" value="%d-1"|math:$dow_premier}} +{{:assign var="nom_mois" value=$premier_du_mois|date:"F Y"}} +{{:assign var="aujourdhui" value=$now|date:"Y-m-d"}} + +{{* ---------- Mois précédent / suivant ---------- *}} +{{if $mois == 1}} + {{:assign var="mois_prec" value=12}} + {{:assign var="an_prec" value="%d-1"|math:$an}} +{{else}} + {{:assign var="mois_prec" value="%d-1"|math:$mois}} + {{:assign var="an_prec" value=$an}} +{{/if}} +{{if $mois == 12}} + {{:assign var="mois_suiv" value=1}} + {{:assign var="an_suiv" value="%d+1"|math:$an}} +{{else}} + {{:assign var="mois_suiv" value="%d+1"|math:$mois}} + {{:assign var="an_suiv" value=$an}} +{{/if}} + +{{* ---------- Vue choisie : mois (défaut), semaine ou liste ---------- *}} +{{if $_GET.nav != "conf"}} + {{:assign var="vue" value=$_GET.vue|strval|trim}} + {{if $vue != "semaine" && $vue != "liste"}}{{:assign var="vue" value="mois"}}{{/if}} +{{/if}} + +{{* ---------- Gestion des calendriers (ajout / suppression, admin) ---------- *}} +{{if $_POST.add_calendrier && $est_admin}} + {{: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.nom"|args:$id value=$nom}} + {{:assign var="calendriers_liste.%s.par_defaut"|args:$id value=false}} +{{/load}} + +{{* ---------- Filtre calendrier (choisi via ?cal=..., "agenda" par défaut) ---------- *}} +{{:assign var="cal_filtre" value=$_GET.cal|strval|trim}} +{{:assign var="cal_filtre_valide" value=false}} +{{if $cal_filtre == "tous"}}{{:assign var="cal_filtre_valide" value=true}}{{/if}} +{{#foreach from=$calendriers_liste item="cd_check"}} + {{if $cd_check.id == $cal_filtre}}{{:assign var="cal_filtre_valide" value=true}}{{/if}} +{{/foreach}} +{{if !$cal_filtre_valide}}{{:assign var="cal_filtre" value="agenda"}}{{/if}} + +{{:assign var="filtre_cal_sql" value=""}} +{{if $cal_filtre == "agenda"}} + {{: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}} + +{{* ---------- 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="premier_du_mois_prec" value="%04d-%02d-01"|args:$an_prec:$mois_prec}} +{{:assign var="nb_jours_prec" value=$premier_du_mois_prec|date:"t"}} +{{:assign var="dow_premier_prec" value=$premier_du_mois_prec|date:"N"}} +{{:assign var="decalage_prec" value="%d-1"|math:$dow_premier_prec}} +{{:assign var="total_rows_prec" value="ceil((%d+%d)/7)"|math:$nb_jours_prec:$decalage_prec}} + +{{* ---------- Rangée sélectionnée pour la vue semaine (par défaut : celle contenant aujourd'hui) ---------- *}} +{{:assign var="semaine_sel" value=$_GET.semaine_sel|intval}} +{{if $semaine_sel < 1}} + {{:assign var="jour_today_num" value=$aujourdhui|date:"j"}} + {{if $an == $now|date:"Y" && $mois == $now|date:"n"}} + {{:assign var="semaine_sel" value="ceil((%d+%d)/7)"|math:$jour_today_num:$decalage}} + {{else}} + {{:assign var="semaine_sel" value=1}} + {{/if}} +{{/if}} +{{if $semaine_sel > $total_rows}}{{:assign var="semaine_sel" value=$total_rows}}{{/if}} + +{{* ---------- Purge automatique des événements passés et rendez-vous réguliers expirés ---------- *}} +{{* 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="where_purge_evt" value="$$.type = 'event' AND $$.date < '%s'"|args:$aujourdhui}} +{{#load where=$where_purge_evt}} + {{*:delete id=$id*}} + {{*:debug id=$id*}} + {{:assign var="purge_faite" value=true}} +{{/load}} +{{:assign var="where_purge_perm" value="$$.type = 'permanence' AND $$.date_fin != '' AND $$.date_fin < '%s'"|args:$aujourdhui}} +{{#load where=$where_purge_perm}} + {{*:delete id=$id*}} + {{*:debug id=$id*}} + {{:assign var="purge_faite" value=true}} +{{/load}} +{{if $purge_faite}} + {{* FB : provoque une redirection en boucle et un timeout *}} + {{*:redirect url="index.html?vue=%s&an=%s&mois=%s&cal=%s"|args:$vue:$an:$mois:$cal_filtre*}} +{{/if}} + +{{* ---------- 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="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"}} + {{: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.debut"|args:$date:$id value=$debut}} + {{:assign var="events_par_jour.%s.%s.fin"|args:$date:$id value=$fin}} + {{:assign var="events_par_jour.%s.%s.couleur"|args:$date:$id value=$couleur}} + {{:assign var="events_par_jour.%s.%s.lieu"|args:$date:$id value=$lieu}} + {{:assign var="events_par_jour.%s.%s.description"|args:$date:$id value=$description}} + {{:assign var="events_par_jour.%s.%s.lien"|args:$date:$id value=$lien}} + {{:assign var="events_par_jour.%s.%s.lien1_label"|args:$date:$id value=$lien1_label}} + {{:assign var="events_par_jour.%s.%s.lien1_url"|args:$date:$id value=$lien1_url}} + {{:assign var="events_par_jour.%s.%s.lien2_label"|args:$date:$id value=$lien2_label}} + {{:assign var="events_par_jour.%s.%s.lien2_url"|args:$date:$id value=$lien2_url}} + {{:assign var="events_par_jour.%s.%s.lien3_label"|args:$date:$id value=$lien3_label}} + {{:assign var="events_par_jour.%s.%s.lien3_url"|args:$date:$id value=$lien3_url}} +{{/load}} + +{{* ---------- Préchargement des permanences (pour la grille, avec vérification date début/fin) ---------- *}} +{{:assign var="where_perms" value="$$.type = 'permanence'%s"|args:$filtre_cal_sql}} +{{#load module="agenda" where=$where_perms order="$$.jour ASC, $$.debut ASC"}} + {{:assign var="perms_data.%s.id"|args:$id value=$id}} + {{:assign var="perms_data.%s.jour"|args:$id value=$jour}} + {{:assign var="perms_data.%s.label"|args:$id value=$label}} + {{:assign var="perms_data.%s.lieu"|args:$id value=$lieu}} + {{:assign var="perms_data.%s.description"|args:$id value=$description}} + {{:assign var="perms_data.%s.debut"|args:$id value=$debut}} + {{:assign var="perms_data.%s.fin"|args:$id value=$fin}} + {{:assign var="perms_data.%s.date_debut"|args:$id value=$date_debut}} + {{:assign var="perms_data.%s.date_fin"|args:$id value=$date_fin}} + {{:assign var="perms_data.%s.type_recurrence"|args:$id value=$type_recurrence}} + {{:assign var="perms_data.%s.semaine_du_mois"|args:$id value=$semaine_du_mois}} + {{:assign var="perms_data.%s.exceptions"|args:$id value=$exceptions}} + {{:assign var="perms_data.%s.couleur"|args:$id value=$couleur}} +{{/load}} + +{{* ---------- Chargement des événements à venir (pour la liste) ---------- *}} +{{:assign var="where_venir" value="$$.type = 'event' AND $$.date >= '%s'%s"|args:$aujourdhui:$filtre_cal_sql}} + +{{* ---------- Vue Liste uniquement : occurrences des rendez-vous réguliers sur les 3 prochains mois, fusionnées avec les événements ---------- *}} +{{if $vue == "liste"}} + {{#load module="agenda" where=$where_venir order="$$.date ASC"}} + {{:assign var="cle_liste" value="%s_%s_evt%s"|args:$date:$debut:$id}} + {{:assign var="liste_fusionnee.%s.date"|args:$cle_liste value=$date}} + {{:assign var="liste_fusionnee.%s.debut"|args:$cle_liste value=$debut}} + {{:assign var="liste_fusionnee.%s.fin"|args:$cle_liste value=$fin}} + {{:assign var="liste_fusionnee.%s.label"|args:$cle_liste value=$titre}} + {{:assign var="liste_fusionnee.%s.couleur"|args:$cle_liste value=$couleur|or:"#8c3a1e"}} + {{:assign var="liste_fusionnee.%s.type"|args:$cle_liste value="Événement"}} + {{:assign var="liste_fusionnee.%s.lien"|args:$cle_liste value=$lien}} + {{:assign var="liste_fusionnee.%s.lien1_label"|args:$cle_liste value=$lien1_label}} + {{:assign var="liste_fusionnee.%s.lien1_url"|args:$cle_liste value=$lien1_url}} + {{:assign var="liste_fusionnee.%s.lien2_label"|args:$cle_liste value=$lien2_label}} + {{:assign var="liste_fusionnee.%s.lien2_url"|args:$cle_liste value=$lien2_url}} + {{:assign var="liste_fusionnee.%s.lien3_label"|args:$cle_liste value=$lien3_label}} + {{:assign var="liste_fusionnee.%s.lien3_url"|args:$cle_liste value=$lien3_url}} + {{/load}} + + {{* -- Mois 1 : le mois en cours -- *}} + {{:assign var="an_m0" value=$now|date:"Y"}} + {{:assign var="mois_m0" value=$now|date:"n"}} + + {{* -- Mois 2 : le mois suivant -- *}} + {{if $mois_m0 == 12}}{{:assign var="mois_m1" value=1}}{{:assign var="an_m1" value="%d+1"|math:$an_m0}} + {{else}}{{:assign var="mois_m1" value="%d+1"|math:$mois_m0}}{{:assign var="an_m1" value=$an_m0}}{{/if}} + + {{* -- Mois 3 : encore le mois suivant -- *}} + {{if $mois_m1 == 12}}{{:assign var="mois_m2" value=1}}{{:assign var="an_m2" value="%d+1"|math:$an_m1}} + {{else}}{{:assign var="mois_m2" value="%d+1"|math:$mois_m1}}{{:assign var="an_m2" value=$an_m1}}{{/if}} + + {{:assign var="jours_du_mois." value=1}}{{:assign var="jours_du_mois." value=2}}{{:assign var="jours_du_mois." value=3}}{{:assign var="jours_du_mois." value=4}}{{:assign var="jours_du_mois." value=5}}{{:assign var="jours_du_mois." value=6}}{{:assign var="jours_du_mois." value=7}}{{:assign var="jours_du_mois." value=8}}{{:assign var="jours_du_mois." value=9}}{{:assign var="jours_du_mois." value=10}} + {{:assign var="jours_du_mois." value=11}}{{:assign var="jours_du_mois." value=12}}{{:assign var="jours_du_mois." value=13}}{{:assign var="jours_du_mois." value=14}}{{:assign var="jours_du_mois." value=15}}{{:assign var="jours_du_mois." value=16}}{{:assign var="jours_du_mois." value=17}}{{:assign var="jours_du_mois." value=18}}{{:assign var="jours_du_mois." value=19}}{{:assign var="jours_du_mois." value=20}} + {{:assign var="jours_du_mois." value=21}}{{:assign var="jours_du_mois." value=22}}{{:assign var="jours_du_mois." value=23}}{{:assign var="jours_du_mois." value=24}}{{:assign var="jours_du_mois." value=25}}{{:assign var="jours_du_mois." value=26}}{{:assign var="jours_du_mois." value=27}}{{:assign var="jours_du_mois." value=28}}{{:assign var="jours_du_mois." value=29}}{{:assign var="jours_du_mois." value=30}} + {{:assign var="jours_du_mois." value=31}} + + {{:assign var="mois_traite_an.0" value=$an_m0}}{{:assign var="mois_traite_mois.0" value=$mois_m0}} + {{:assign var="mois_traite_an.1" value=$an_m1}}{{:assign var="mois_traite_mois.1" value=$mois_m1}} + {{:assign var="mois_traite_an.2" value=$an_m2}}{{:assign var="mois_traite_mois.2" value=$mois_m2}} + + {{:assign var="idx_mois." value=0}} + {{:assign var="idx_mois." value=1}} + {{:assign var="idx_mois." value=2}} + + {{#foreach from=$idx_mois item="idx_m"}} + {{:assign var="an_l2" from="mois_traite_an.%s"|args:$idx_m}} + {{:assign var="mois_l2" from="mois_traite_mois.%s"|args:$idx_m}} + {{:assign var="premier_l2" value="%04d-%02d-01"|args:$an_l2:$mois_l2}} + {{:assign var="nb_jours_l2" value=$premier_l2|date:"t"}} + + {{#foreach from=$jours_du_mois item="jn"}} + {{if $jn <= $nb_jours_l2}} + {{:assign var="date_l2" value="%04d-%02d-%02d"|args:$an_l2:$mois_l2:$jn}} + {{if $date_l2 >= $aujourdhui}} + {{:assign var="dow_l2" value=$date_l2|date:"N"}} + {{:assign var="occ_l2" value="floor((%d-1)/7)+1"|math:$jn}} + {{:assign var="derniere_l2" value=false}} + {{if "%d+7"|math:$jn > $nb_jours_l2}}{{:assign var="derniere_l2" value=true}}{{/if}} + {{#foreach from=$perms_data item="pd"}} + {{if $pd.jour == $dow_l2}} + {{if $pd.date_debut == "" || $date_l2 >= $pd.date_debut}} + {{if $pd.date_fin == "" || $date_l2 <= $pd.date_fin}} + {{:assign var="excl_l2" value=false}} + {{#foreach from=$pd.exceptions item="ex2"}} + {{if $ex2 == $date_l2}}{{:assign var="excl_l2" value=true}}{{/if}} + {{/foreach}} + {{if !$excl_l2}} + {{:assign var="ok_l2" value=false}} + {{if $pd.type_recurrence == "mensuel"}} + {{if $pd.semaine_du_mois == -1 && $derniere_l2}}{{:assign var="ok_l2" value=true}}{{/if}} + {{if $pd.semaine_du_mois == $occ_l2}}{{:assign var="ok_l2" value=true}}{{/if}} + {{elseif $pd.type_recurrence == "quinzaine"}} + {{if $pd.date_debut != ""}} + {{:assign var="ref_sem_q2" value=$pd.date_debut|date:"W"|intval}} + {{:assign var="cell_sem_q2" value=$date_l2|date:"W"|intval}} + {{:assign var="diff_sem_q2" value="(%d-%d) %% 2"|math:$cell_sem_q2:$ref_sem_q2}} + {{if $diff_sem_q2 == 0}}{{:assign var="ok_l2" value=true}}{{/if}} + {{/if}} + {{else}} + {{:assign var="ok_l2" value=true}} + {{/if}} + {{if $ok_l2}} + {{:assign var="cle_liste2" value="%s_%s_perm%s"|args:$date_l2:$pd.debut:$pd.id}} + {{:assign var="liste_fusionnee.%s.date"|args:$cle_liste2 value=$date_l2}} + {{:assign var="liste_fusionnee.%s.debut"|args:$cle_liste2 value=$pd.debut}} + {{:assign var="liste_fusionnee.%s.fin"|args:$cle_liste2 value=$pd.fin}} + {{:assign var="liste_fusionnee.%s.label"|args:$cle_liste2 value=$pd.label}} + {{:assign var="liste_fusionnee.%s.couleur"|args:$cle_liste2 value=$pd.couleur|or:"#4c7a2e"}} + {{:assign var="liste_fusionnee.%s.type"|args:$cle_liste2 value="Rendez-vous régulier"}} + {{/if}} + {{/if}} + {{/if}} + {{/if}} + {{/if}} + {{/foreach}} + {{/if}} + {{/if}} + {{/foreach}} + {{/foreach}} + + {{:assign var="liste_triee" value=$liste_fusionnee|ksort|values}} +{{/if}} + +{{* ---------- Noms des jours ---------- *}} +{{:assign var="noms_jours." value=""}} +{{:assign var="noms_jours." value="Lundi"}} +{{:assign var="noms_jours." value="Mardi"}} +{{:assign var="noms_jours." value="Mercredi"}} +{{:assign var="noms_jours." value="Jeudi"}} +{{:assign var="noms_jours." value="Vendredi"}} +{{:assign var="noms_jours." value="Samedi"}} +{{:assign var="noms_jours." value="Dimanche"}} + +{{* ---------- Événement / permanence en cours de modification ---------- *}} +{{:assign var="edit_event" value=$_GET.edit_event|intval}} +{{if $edit_event}} + {{#load id=$edit_event assign="event"}} + {{:assign var="ee_titre" value=$titre}} + {{:assign var="ee_date" value=$date}} + {{:assign var="ee_debut" value=$debut}} + {{:assign var="ee_fin" value=$fin}} + {{:assign var="ee_lieu" value=$lieu}} + {{:assign var="ee_description" value=$description}} + {{:assign var="ee_lien1_label" value=$lien1_label}} + {{:assign var="ee_lien1_url" value=$lien1_url}} + {{:assign var="ee_lien2_label" value=$lien2_label}} + {{:assign var="ee_lien2_url" value=$lien2_url}} + {{:assign var="ee_lien3_label" value=$lien3_label}} + {{:assign var="ee_lien3_url" value=$lien3_url}} + {{if $ee_lien1_url == "" && $ee_lien2_url == "" && $ee_lien3_url == "" && $lien != ""}} + {{:assign var="ee_lien1_url" value=$lien}} + {{/if}} + {{:assign var="ee_couleur" value=$couleur}} + {{:assign var="ee_calendrier" value=$calendrier}} + {{/load}} +{{/if}} + +{{:assign var="edit_perm" value=$_GET.edit_perm|intval}} +{{if $edit_perm}} + {{#load id=$edit_perm assign="perm"}} + {{:assign var="ep_jour" value=$jour}} + {{:assign var="ep_debut" value=$debut}} + {{:assign var="ep_fin" value=$fin}} + {{:assign var="ep_label" value=$label}} + {{:assign var="ep_lieu" value=$lieu}} + {{:assign var="ep_description" value=$description}} + {{:assign var="ep_date_debut" value=$date_debut}} + {{:assign var="ep_date_fin" value=$date_fin}} + {{:assign var="ep_type_recurrence" value=$type_recurrence}} + {{:assign var="ep_semaine_du_mois" value=$semaine_du_mois}} + {{:assign var="ep_couleur" value=$couleur}} + {{:assign var="ep_calendrier" value=$calendrier}} + {{/load}} +{{/if}} +{{* + + + + + +Agenda — {{$config.org_name}} + + +*}} + +{{* Si edition ou suppression d'évenements ou RDV *}} +{{if $est_admin==true}} + {{if $_GET.edit_event > 0}} + {{:assign _nav="conf"}} + {{:assign _conf="manage_eve"}} + {{elseif $_GET.edit_perm > 0}} + {{:assign _nav="conf"}} + {{:assign _conf="manage_app"}} + {{else}} + {{:assign _nav=$_GET.nav}} + {{:assign _conf=$_GET.conf}} + {{/if}} +{{/if}} + +{{* Navigation *}} +{{if $_nav == "conf"}} + {{if !$_conf}} + {{:include file="_nav.html" current="config" subcurrent="manage_cal"}} + {{:assign _conf="manage_cal"}} + {{else}} + {{:include file="_nav.html" current="config" subcurrent="%s"|args:$_conf}} + {{:assign _conf=$_conf}} + {{/if}} + {{:include file="_config.html" subconf=$_conf}} +{{else}} + {{:include file="_nav.html" current="agenda" subcurrent="%s"|args:$vue vue=$vue an=$an mois=$mois cal=$cal_filtre}} +{{/if}} + +
+{{* FB : Retour vers l'admin du site si admin +{{if $est_admin}} +

← Retour au site

+{{else}} +

← Retour au site

+{{/if}} +

Agenda{{if $est_admin}}mode admin{{/if}}

+*}} +{{* + + + +*}} +{{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"}} +
+

Calendrier ({{$cal_filtre}})

+ {{if $vue == "mois"}} + + {{else}} + +{{/if}} +
+ + + + + + +{{: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}} + +
{{$jour_num}}
+ {{#foreach from=$badges_tries item="bj"}} + {{if $bj.type == "perm"}} +
+
+ {{if $bj.debut}}{{$bj.debut}}{{if $bj.fin}}–{{$bj.fin}}{{/if}} — {{/if}}{{$bj.label}}{{if $bj.lieu}}
📍 {{$bj.lieu}}{{/if}} + {{if $bj.description}}
{{$bj.description}}
{{/if}} +
+ {{if $est_admin}} + + ✎ +
+ + + + + + +
+ {{/if}} +
+ {{else}} +
+
+ {{if $bj.debut}}{{$bj.debut}}{{if $bj.fin}}–{{$bj.fin}}{{/if}} — {{/if}}{{$bj.label}}{{if $bj.lieu}}
📍 {{$bj.lieu}}{{/if}} + {{if $bj.description}}
{{$bj.description}}
{{/if}} +
+ {{if $est_admin}} + + ✎ +
+ + + + +
+ {{/if}} +
+ {{/if}} + {{/foreach}} + + {{else}} +
+ + {{/if}} + {{/if}} + {{if $vue == "mois" && "%d %% 7"|math:$n == 0 && $n != 42}}{{/if}} +{{/foreach}} + + +
LunMarMerJeuVenSamDim
+
+
+{{/if}} +*}} + +{{*if $est_admin}} +
+

Gérer les calendriers

+ + + +{{#foreach from=$calendriers_liste item="cd_gest"}} + + + + +{{/foreach}} + +
Nom
{{$cd_gest.nom}}{{if $cd_gest.par_defaut}} (par défaut){{/if}} + {{if !$cd_gest.par_defaut}} +
+ +
+ {{/if}} +
+
+
+ +
+

Supprimer un calendrier ne supprime pas les événements/rendez-vous qui y étaient rattachés — ils basculent simplement dans "Agenda" par défaut.

+
+{{/if*}} + +{{*if $est_admin}} +
+

Rendez-vous réguliers

+{{:assign var="perm_trouve" value=false}} +
+ +{{if $est_admin}}{{/if}} + +{{#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}} + + + + + + + + + {{if $est_admin}} + + {{/if}} + +{{/load}} + +
RécurrenceJourHorairesDétailLieuCalendrierDepuis / jusqu'à
+ {{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}} + {{$nom_jour}}{{$debut}}{{if $fin}} — {{$fin}}{{/if}}{{$label}}{{if $lieu}}{{$lieu}}{{/if}} + {{: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}} + {{if $date_debut}}à partir du {{$date_debut|date_short}}{{/if}}{{if $date_debut && $date_fin}}
{{/if}}{{if $date_fin}}jusqu'au {{$date_fin|date_short}}{{/if}}
+ ✎ +
+ +
+
+
+{{if !$perm_trouve}}

Aucun rendez-vous régulier enregistré.

{{/if}} +
+{{/if*}} + +{{* +
+

{{if $vue == "liste"}}Calendrier en liste (3 prochains mois){{else}}Événements à venir{{/if}}

+{{if $vue == "liste"}} + {{:assign var="rien_trouve" value=true}} + + {{if $rien_trouve}}

Rien de prévu sur les 3 prochains mois.

{{/if}} +{{else}} + {{:assign var="event_trouve" value=false}} + + {{if !$event_trouve}}

Aucun événement à venir pour l'instant.

{{/if}} +{{/if}} +
+*}} + +{{*if $est_admin}} +
+

{{if $edit_event}}Modifier l'événement{{else}}Ajouter un événement{{/if}}

+
+ + +
+
+
+
+
+
+
+
+ + +
+
+

+

Liens (affiche, document, inscription… — jusqu'à 3, facultatifs)

+
+
+
+
+
+
+
+
+
+
+
+
+ {{if $edit_event}} + + Annuler + {{else}} + + {{/if}} +
+
+{{/if*}} + +{{*if $est_admin}} +
+

{{if $edit_perm}}Modifier ce rendez-vous régulier{{else}}Ajouter un rendez-vous régulier{{/if}}

+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+ + +
+
+

+

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.

+ {{if $edit_perm}} + + Annuler + {{else}} + + {{/if}} +
+
+{{/if*}} + +
+ + + + +{{* + +*}} +{{if $est_admin==true}} + {{:admin_footer}} +{{/if}} \ No newline at end of file diff --git a/module.ini b/module.ini new file mode 100644 index 0000000..d1f73b0 --- /dev/null +++ b/module.ini @@ -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 \ No newline at end of file diff --git a/upcoming.html b/upcoming.html new file mode 100644 index 0000000..ba89221 --- /dev/null +++ b/upcoming.html @@ -0,0 +1,48 @@ +{{* + + + + + + + +*}} +{{* + +*}} +{{: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}} +

Prochains événements

+ +{{if !$event_trouve}}

Aucun événement à venir pour l'instant.

{{/if}} +{{*

Voir l'agenda complet →

+ + + +*}} \ No newline at end of file