Ajout de l'appel a l'API pretalx
This commit is contained in:
parent
dc07b1b415
commit
87005adb44
7 changed files with 344 additions and 2 deletions
64
js/components/talk.js
Normal file
64
js/components/talk.js
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
const TEMPLATE = document.createElement("template")
|
||||
TEMPLATE.innerHTML = `
|
||||
<div class="talk-calendar">
|
||||
<span class="talk-start-date"></span>
|
||||
<time class="talk-start-time"></time>
|
||||
→
|
||||
<time class="talk-end-time"></time>
|
||||
</div>
|
||||
<h3 class="talk-title"></h3>
|
||||
<p class="talk-abstract"></p>
|
||||
<p><small class="track-name"></small></p>
|
||||
`
|
||||
|
||||
class TalkElement extends HTMLElement {
|
||||
|
||||
#activeChackInterval
|
||||
|
||||
srcObject
|
||||
|
||||
connectedCallback(){
|
||||
this.updateContent()
|
||||
this.#activeChackInterval = setInterval(this.updateActiveState.bind(this), 1000)
|
||||
}
|
||||
|
||||
disconnectedCallback(){
|
||||
clearInterval(this.#activeChackInterval)
|
||||
}
|
||||
|
||||
updateActiveState(){
|
||||
this.classList.toggle("active", this.srcObject?.isActive)
|
||||
}
|
||||
|
||||
updateContent(){
|
||||
if(!this.srcObject){
|
||||
this.replaceChildren()
|
||||
}
|
||||
|
||||
this.dataset.trackId = this.srcObject.track_id
|
||||
|
||||
this.replaceChildren(TEMPLATE.content.cloneNode(true))
|
||||
this.querySelector(".talk-title").textContent = this.srcObject.title
|
||||
this.querySelector(".talk-abstract").textContent = this.srcObject.abstract
|
||||
this.querySelector(".track-name").textContent = this.srcObject.track.fr
|
||||
|
||||
let timeFormatter = new Intl.DateTimeFormat("fr-FR", {
|
||||
timeStyle: "short"
|
||||
})
|
||||
|
||||
let dateFormatter = new Intl.DateTimeFormat("fr-FR", {
|
||||
dateStyle: "short"
|
||||
})
|
||||
|
||||
this.querySelector(".talk-start-date").textContent = dateFormatter.format(this.srcObject.startTime)
|
||||
this.querySelector(".talk-start-time").textContent = timeFormatter.format(this.srcObject.startTime)
|
||||
this.querySelector(".talk-start-time").datetime = this.srcObject.startTime.toJSON()
|
||||
this.querySelector(".talk-end-time").textContent = timeFormatter.format(this.srcObject.endTime)
|
||||
this.querySelector(".talk-end-time").datetime = this.srcObject.endTime.toJSON()
|
||||
|
||||
this.updateActiveState()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
customElements.define("camp-talk", TalkElement)
|
||||
90
js/components/upcoming-talks.js
Normal file
90
js/components/upcoming-talks.js
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
import { getUpcomingTalksForRoom } from "../pretalx.js"
|
||||
|
||||
class UpcomingTalksElement extends HTMLElement {
|
||||
#roomId
|
||||
#loadingPromise
|
||||
|
||||
srcObject = undefined
|
||||
|
||||
get roomId(){
|
||||
return this.#roomId
|
||||
}
|
||||
|
||||
set roomId(val){
|
||||
this.#roomId = val
|
||||
}
|
||||
|
||||
connectedCallback(){
|
||||
this.updateContent()
|
||||
}
|
||||
|
||||
updateContent(){
|
||||
if(!this.roomId){
|
||||
this.replaceChildren()
|
||||
return
|
||||
}
|
||||
|
||||
if(!this.srcObject){
|
||||
|
||||
if(!this.#loadingPromise){
|
||||
this.fetchTalks()
|
||||
}
|
||||
|
||||
let loading = document.createElement("div")
|
||||
loading.classList.add("loading")
|
||||
loading.textContent = "Chargement des événements..."
|
||||
this.replaceChildren(loading)
|
||||
|
||||
} else {
|
||||
|
||||
let childrens = []
|
||||
|
||||
for(let talk of this.srcObject){
|
||||
let item = document.createElement("camp-talk")
|
||||
item.srcObject = talk
|
||||
|
||||
let a = document.createElement("a")
|
||||
a.href = talk.displayUrl
|
||||
a.target = "_blank"
|
||||
a.append(item)
|
||||
|
||||
childrens.push(a)
|
||||
}
|
||||
|
||||
this.classList.toggle("empty", childrens.length == 0)
|
||||
if(childrens.length == 0){
|
||||
let empty = document.createElement("p")
|
||||
empty.classList.add("empty")
|
||||
empty.textContent = `Aucun événement à venir dans cette salle`
|
||||
childrens.push(empty)
|
||||
}
|
||||
this.replaceChildren(...childrens)
|
||||
|
||||
}
|
||||
|
||||
this.classList.toggle("loading", !this.srcObject && this.#loadingPromise)
|
||||
}
|
||||
|
||||
async fetchTalks(){
|
||||
let prom = (async () => {
|
||||
this.srcObject = await getUpcomingTalksForRoom(this.roomId)
|
||||
this.#loadingPromise = null
|
||||
this.updateContent()
|
||||
})()
|
||||
this.#loadingPromise = prom
|
||||
await prom
|
||||
}
|
||||
|
||||
static observedAttributes = ["room-id"]
|
||||
|
||||
attributeChangedCallback(name, oldVal, newVal){
|
||||
switch(name){
|
||||
case "room-id":
|
||||
this.roomId = newVal
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
customElements.define("camp-upcoming-talks", UpcomingTalksElement);
|
||||
Loading…
Add table
Add a link
Reference in a new issue