nouveau-theatre-de-besancon/site/snippets/calendar-strip.php
2024-09-16 15:04:09 +02:00

201 lines
6.8 KiB
PHP

<section
class="calendar-strip"
@mouseleave="open = false"
x-data="{
calendar: createEmptyCalendar(),
currentMonthIndex: dayjs().month() + 1,
currentWeekIndex: (() => {
dayjs.extend(window.dayjs_plugin_weekOfYear);
const today = dayjs();
const firstDayOfMonth = today.startOf('month');
const currentWeek = today.week();
const firstWeekOfMonth = firstDayOfMonth.week();
const currentWeekIndex = currentWeek - firstWeekOfMonth;
return currentWeekIndex;
})(),
token: '<?= $site->mapadoToken() ?>',
contractId: '<?= $site->mapadoContractId() ?>',
targetSessions: [],
open: false,
today: dayjs().format('DD-MM-YYYY'),
get monthName() {
return dayjs().month(this.currentMonthIndex - 1).format('MMMM');
},
get currentMonth() {
return this.calendar[this.currentMonthIndex]
},
get currentWeeks() {
const weeks = [[]];
let index = 0;
for (let key in this.currentMonth) {
const date = this.currentMonth[key]
weeks[index].push(date)
if (date.indexInWeek === 7) {
weeks.push([])
index++
}
}
return weeks
},
get currentWeek() {
this.currentWeeks[this.currentWeekIndex];
},
async updateDates() {
fetch('/<?= page('programme')->children()->first()->uri() ?>/data.json')
.then(res => res.json())
.then(json => {
console.log('Saved calendar : ', json)
this.calendar = json
})
.catch(error => console.log('No saved calendar.'))
const daysNode = document.querySelector('.calendar-strip__days');
daysNode.classList.toggle('progress');
this.calendar = await getCurrentSeasonCalendar();
console.log('Updated calendar for current season :', this.calendar);
daysNode.classList.toggle('progress');
},
handleDayHover() {
if (!this.date) return
if (this.date.sessions.length > 0) {
this.targetSessions = this.date.sessions;
this.open = true;
} else {
setTimeout(() => {
this.targetSessions = this.date.sessions;
}, 100);
this.open = false;
}
},
prevWeek() {
if (this.currentWeekIndex === 0) {
this.prevMonth()
this.currentWeekIndex = this.currentWeeks.length - 1
} else {
this.currentWeekIndex--
}
},
nextWeek() {
if (this.currentWeekIndex === this.currentWeeks.length - 1) {
this.nextMonth()
this.currentWeekIndex = 0
} else {
this.currentWeekIndex++
}
},
nextMonth() {
if (this.currentMonthIndex == 12) {
this.currentMonthIndex = 1
} else {
this.currentMonthIndex++
}
},
prevMonth() {
if (this.currentMonthIndex == 1) {
this.currentMonthIndex = 12
} else {
this.currentMonthIndex--
}
}
}"
x-init="updateDates()"
>
<div class="calendar-strip__selector">
<button class="prev-month" @click="prevMonth()" :disabled="currentMonthIndex === 9"></button>
<span x-text="monthName"></span>
<button class="next-month" @click="nextMonth()" :disabled="currentMonthIndex === 8"></button>
</div>
<button @click="prevWeek()" class="calendar-strip__change-week calendar-strip__next-week"></button>
<ul class="calendar-strip__days">
<template x-for="(week, weekIndex) in currentWeeks">
<li class="week" :class="weekIndex == currentWeekIndex ? 'current' : ''">
<ul>
<template x-for="date in week">
<li class="calendar-strip__day" :class="targetSessions.length > 0 && open && date.index == targetSessions[0].day ? 'active' : ''" :style="'animation-delay: ' + date.index * 0.03 + 's'">
<button
:class="!date || date.full !== today ? '' : 'today'"
:disabled="!date || date.sessions.length === 0 ? true : false"
:title="!date || date.sessions.length === 0 ? 'Pas de représentation.' : 'Voir les représentations.'"
@mouseover="handleDayHover()"
>
<template x-if="date">
<span x-text="date.initial"></span>
</template>
<span x-text="date.index"></span>
</button>
</li>
</template>
</ul>
</li>
</template>
</ul>
<button @click="nextWeek()" class="calendar-strip__change-week calendar-strip__next-week"></button>
<a href="<?= page('programme')->url() ?>" class="calendar-strip__calendar-btn">calendrier</a>
<div class="calendar-strip__date" :class="open ? 'open' : ''">
<ul class="sessions">
<template x-for="session in targetSessions">
<li
x-data="{
stockThreshold: (session.totalStock / 100) * 25
}"
:style="'--color: ' + session.color"
class="session"
>
<a class="session__event-link" :href="session.eventUrl" title="En savoir plus"></a>
<div class="session__info session__info--slot">
<p x-html="`${session.day} ${monthName}`"></p>
<p x-html="session.time"></p>
</div>
<div class="session__info session__info--title">
<p><strong x-html="`<strong>${session.title}</strong>`"></strong></p>
<p x-html="session.authors"></p>
</div>
<div x-text="session.duration ? session.duration : ''" class="session__info session__info--duration"></div>
<div x-text="`${session.place}`" class="session__info session__info--place"></div>
<template x-if="!session.ticketingUrl">
<div class="session__info session__info--book">
<a class="ticket-link" target="_blank" title="Entrée libre" disabled><?php snippet('ticket') ?> Entrée libre</a>
</div>
</template>
<template x-if="session.bookableStock === 0">
<div class="session__info session__info--book">
<a class="ticket-link" title="Plus de places disponibles" disabled><?php snippet('ticket') ?> Complet</a>
</div>
</template>
<template x-if="session.bookableStock > stockThreshold">
<div class="session__info">
<a class="ticket-link" title="Plateforme de réservation" :href="session.ticketingUrl" target="_blank"><?php snippet('ticket') ?> Billetterie</a>
</div>
</template>
<template x-if="session.bookableStock !== 0 && session.bookableStock < stockThreshold">
<div class="session__info">
<a class="ticket-link" title="Plateforme de réservation" :href="session.ticketingUrl" target="_blank"><?php snippet('ticket') ?> Plus que quelques places !</a>
</div>
</template>
</li>
</template>
</ul>
</div>
</section>