Update
This commit is contained in:
rodič
f604c70d3f
revize
268aff914a
|
@ -6,7 +6,7 @@
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import { onMount, onDestroy } from "svelte";
|
import { onMount, onDestroy } from "svelte";
|
||||||
import { format, compareAsc } from "date-fns"
|
import { format, compareAsc, compareDesc } from "date-fns"
|
||||||
import { bundle, userData, loadInfo, schedulePref } from "$lib/stores.js";
|
import { bundle, userData, loadInfo, schedulePref } from "$lib/stores.js";
|
||||||
import { cs } from "date-fns/locale/index.js";
|
import { cs } from "date-fns/locale/index.js";
|
||||||
|
|
||||||
|
@ -29,6 +29,18 @@
|
||||||
.filter(i => i.stage === stageId)
|
.filter(i => i.stage === stageId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function findSegment (bundle, stage, period) {
|
||||||
|
for (const st of stage.times) {
|
||||||
|
const p = parsePeriod(bundle, st)
|
||||||
|
if (compareAsc(period.start, p.period.end) !== -1 && compareDesc(period.end, p.period.start) !== 1) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
function dateSlots (pl, period, bundle, schedulePref = null) {
|
function dateSlots (pl, period, bundle, schedulePref = null) {
|
||||||
let time = period.start
|
let time = period.start
|
||||||
const endTime = period.end
|
const endTime = period.end
|
||||||
|
@ -46,8 +58,9 @@
|
||||||
if (schedulePref && !schedulePref.stages.includes(stage.id)) {
|
if (schedulePref && !schedulePref.stages.includes(stage.id)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
const si = pl.schedule.find(pi => (new Date(pi.period.start).getTime() === new Date(time).getTime()) && pi.stage === stage.id)
|
let si = pl.schedule.find(pi => (new Date(pi.period.start).getTime() === new Date(time).getTime()) && pi.stage === stage.id)
|
||||||
stages[stage.id] = si
|
stages[stage.id] = si
|
||||||
|
|
||||||
if (si) {
|
if (si) {
|
||||||
const span = Math.floor((new Date(si.period.end).getTime() - new Date(si.period.start).getTime())/(1000 * 60) / 30)
|
const span = Math.floor((new Date(si.period.end).getTime() - new Date(si.period.start).getTime())/(1000 * 60) / 30)
|
||||||
si.span = span
|
si.span = span
|
||||||
|
@ -63,19 +76,21 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function showSpeakers (bundle, ev) {
|
function showSpeakers (bundle, ev) {
|
||||||
return ev.speakers.map(sp => bundle.spec.speakers.find(s => s.id === sp).name).join(', ')
|
return ev.speakers.map(sId => {
|
||||||
|
const sp = bundle.spec.speakers.find(s => s.id === sId)
|
||||||
|
return sp.name + (sp.nickname ? ` (${sp.nickname})` : '')
|
||||||
|
}).join(', ')
|
||||||
}
|
}
|
||||||
|
|
||||||
function showEventDetail (bundle, ev) {
|
function showEventDetail (bundle, ev) {
|
||||||
if (ev.type === 'lightning-series') {
|
if (ev.type === 'lightning-series') {
|
||||||
return bundle.spec.events.filter(e => e.parent === ev.id).map(e => `${e.name} (${showSpeakers(bundle, e)})`).join(', ')
|
return bundle.spec.events.filter(e => e.parent === ev.id).map(e => `<span class="font-semibold"><a href="/udalosti?id=${e.id}">${e.name}</a></span> - ${showSpeakers(bundle, e) || 'TBD'}`).join('<br>')
|
||||||
}
|
}
|
||||||
return showSpeakers(bundle, ev)
|
return showSpeakers(bundle, ev)
|
||||||
}
|
}
|
||||||
|
|
||||||
function scheduleTimes (bundle) {
|
function parsePeriod (bundle, str) {
|
||||||
return bundle.scheduleTimes.map(item => {
|
const [ dayNumber, times ] = str.split('/')
|
||||||
const [ dayNumber, times ] = item.split('/')
|
|
||||||
const [ start, end ] = times.split('-')
|
const [ start, end ] = times.split('-')
|
||||||
const date = bundle.dates[dayNumber-1]
|
const date = bundle.dates[dayNumber-1]
|
||||||
return {
|
return {
|
||||||
|
@ -85,6 +100,11 @@
|
||||||
end: new Date(`${date}T${end}`)
|
end: new Date(`${date}T${end}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function scheduleTimes (bundle) {
|
||||||
|
return bundle.scheduleTimes.map(item => {
|
||||||
|
return parsePeriod(bundle, item)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,7 +215,7 @@
|
||||||
<div class="text-xs">{format(new Date(si.period.start), 'HH:mm')}-{format(new Date(si.period.end), 'HH:mm')} {#if event.track}[{#each [$bundle.spec.tracks.find(t => t.id === event.track)] as track}{track.shortname || track.name}{/each}]{/if}</div>
|
<div class="text-xs">{format(new Date(si.period.start), 'HH:mm')}-{format(new Date(si.period.end), 'HH:mm')} {#if event.track}[{#each [$bundle.spec.tracks.find(t => t.id === event.track)] as track}{track.shortname || track.name}{/each}]{/if}</div>
|
||||||
<div class="font-semibold mt-1"><a href="/udalosti?id={event.id}">{event.name}</a></div>
|
<div class="font-semibold mt-1"><a href="/udalosti?id={event.id}">{event.name}</a></div>
|
||||||
<div class="text-xs mt-1">
|
<div class="text-xs mt-1">
|
||||||
{showEventDetail($bundle, event)}
|
{@html showEventDetail($bundle, event)}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-xs mt-2 text-blue-web/50">
|
<div class="text-xs mt-2 text-blue-web/50">
|
||||||
{event.tags.map(t => `#${t}`).join(', ')}
|
{event.tags.map(t => `#${t}`).join(', ')}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { bundle, userData } from "$lib/stores.js";
|
import { bundle, userData, apiStatus } from "$lib/stores.js";
|
||||||
import Avatar from "$lib/Avatar.svelte";
|
import Avatar from "$lib/Avatar.svelte";
|
||||||
import SvelteMarkdown from "svelte-markdown";
|
import SvelteMarkdown from "svelte-markdown";
|
||||||
import Link from "$lib/Link.svelte";
|
import Link from "$lib/Link.svelte";
|
||||||
|
@ -40,6 +40,8 @@
|
||||||
return ud;
|
return ud;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let separator = '<i class="fa-solid fa-angle-right text-lg align-middle px-4"></i>'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
@ -47,6 +49,17 @@
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
{#if $bundle}
|
{#if $bundle}
|
||||||
|
{#if $apiStatus}
|
||||||
|
<section class="bg-blue-web-light">
|
||||||
|
<div class="pb-2 pt-2 lg:pt-4 lg:pb-4 mx-auto sm:px-2 lg:px-6 2xl:px-16">
|
||||||
|
<div class="text-center text-xl sm:text-xl lg:text-2xl font-semibold text-blue-web px-8">
|
||||||
|
{$bundle.spec.speakers.length} přednášejících {@html separator}
|
||||||
|
{$bundle.spec.events.length} události {@html separator}
|
||||||
|
{$apiStatus.global.tickets} návstěvníků
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{/if}
|
||||||
<section class="relative mx-auto pt-6 sm:pt-10 px-6 max-w-6xl">
|
<section class="relative mx-auto pt-6 sm:pt-10 px-6 max-w-6xl">
|
||||||
<div
|
<div
|
||||||
class="flex flex-wrap gap-1.5 sm:gap-3 text-xs uppercase font-bold text-blue-web justify-left"
|
class="flex flex-wrap gap-1.5 sm:gap-3 text-xs uppercase font-bold text-blue-web justify-left"
|
||||||
|
|
|
@ -94,7 +94,7 @@
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<Avatar speaker={s} size="semi-small" />
|
<Avatar speaker={s} size="semi-small" />
|
||||||
<div class="m-auto">
|
<div class="m-auto">
|
||||||
<a href="/lide?id={s.id}" class="text-xl">{s.name}</a>
|
<a href="/lide?id={s.id}" class="text-xl">{s.name} {#if s.nickname} ({s.nickname}){/if}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/each}
|
{/each}
|
||||||
|
|
Načítá se…
Odkázat v novém úkolu