generated from gitea_admin/default
129 lines
3.8 KiB
JavaScript
129 lines
3.8 KiB
JavaScript
export function useConcerts(options = {}) {
|
|
const queryString = computed(() => {
|
|
const locale = unref(options.locale) ?? "fr-FR"
|
|
const sort = unref(options.sort) ?? null
|
|
const populate = unref(options.populate) ?? null
|
|
const filters = unref(options.filters) ?? null
|
|
|
|
const query = new URLSearchParams()
|
|
query.set("locale", locale)
|
|
if (sort) {
|
|
query.set("sort[0]", sort)
|
|
}
|
|
if (populate && typeof populate === "object") {
|
|
appendPopulate(query, populate)
|
|
}
|
|
if (filters && typeof filters === "object") {
|
|
appendFilters(query, filters)
|
|
}
|
|
|
|
return query.toString()
|
|
})
|
|
|
|
const { data, pending, error, refresh } = useFetch(
|
|
() => `/api/__strapi__/concerts?${queryString.value}`,
|
|
{
|
|
server: true,
|
|
key: () => `concerts:${queryString.value}`,
|
|
watch: [queryString],
|
|
}
|
|
)
|
|
|
|
const concerts = computed(() => {
|
|
const rows = (data.value?.data || []).map(normalizeConcert)
|
|
let list = rows.sort(compareByRepresentationDate)
|
|
|
|
const upcomingOnly = Boolean(unref(options.upcomingOnly) ?? false)
|
|
if (upcomingOnly) {
|
|
const todayStart = new Date()
|
|
todayStart.setHours(0, 0, 0, 0)
|
|
list = list.filter((c) => {
|
|
const d = getFirstRepresentationDate(c)
|
|
return d ? d >= todayStart : false
|
|
})
|
|
}
|
|
|
|
const limit = unref(options.limit)
|
|
if (typeof limit === "number") {
|
|
list = list.slice(0, Math.max(0, limit))
|
|
}
|
|
|
|
return list
|
|
})
|
|
|
|
return {
|
|
concerts,
|
|
pending,
|
|
error,
|
|
refresh,
|
|
}
|
|
}
|
|
|
|
function appendPopulate(query, populate, prefix = "populate") {
|
|
Object.entries(populate).forEach(([key, value]) => {
|
|
if (value === true) {
|
|
query.set(`${prefix}[${key}]`, "true")
|
|
return
|
|
}
|
|
if (value && typeof value === "object") {
|
|
const entries = Object.entries(value)
|
|
const allTrue = entries.length > 0 && entries.every(([, v]) => v === true)
|
|
if (allTrue) {
|
|
const list = entries.map(([k]) => k).join(",")
|
|
query.set(`${prefix}[${key}][populate]`, list)
|
|
return
|
|
}
|
|
appendPopulate(query, value, `${prefix}[${key}][populate]`)
|
|
}
|
|
})
|
|
}
|
|
|
|
function appendFilters(query, filters, prefix = "filters") {
|
|
Object.entries(filters).forEach(([key, value]) => {
|
|
if (value === null || value === undefined) return
|
|
if (typeof value !== "object") {
|
|
query.set(`${prefix}[${key}]`, String(value))
|
|
return
|
|
}
|
|
Object.entries(value).forEach(([k, v]) => {
|
|
if (v === null || v === undefined) return
|
|
if (typeof v !== "object") {
|
|
query.set(`${prefix}[${key}][${k}]`, String(v))
|
|
return
|
|
}
|
|
appendFilters(query, v, `${prefix}[${key}][${k}]`)
|
|
})
|
|
})
|
|
}
|
|
|
|
function normalizeConcert(item) {
|
|
const a = item.attributes || item || {}
|
|
|
|
return {
|
|
id: item.id,
|
|
...a,
|
|
}
|
|
}
|
|
|
|
// tri par date de représentation
|
|
function compareByRepresentationDate(a, b) {
|
|
const da = getFirstRepresentationDate(a)
|
|
const db = getFirstRepresentationDate(b)
|
|
if (!da && !db) return 0
|
|
if (!da) return 1
|
|
if (!db) return -1
|
|
return da - db
|
|
}
|
|
|
|
function getFirstRepresentationDate(concert) {
|
|
const reps = concert?.representation_concert || []
|
|
let earliest = null
|
|
reps.forEach((r) => {
|
|
const iso = r?.date_debut_representation
|
|
if (!iso) return
|
|
const d = new Date(iso)
|
|
if (!earliest || d < earliest) earliest = d
|
|
})
|
|
return earliest
|
|
}
|