This commit is contained in:
tree 2022-05-19 08:05:53 +02:00
rodič f604c70d3f
revize 268aff914a
3 změnil soubory, kde provedl 50 přidání a 17 odebrání

Zobrazit soubor

@ -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(', ')}

Zobrazit soubor

@ -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}&nbsp;přednášejících {@html separator}
{$bundle.spec.events.length}&nbsp;události {@html separator}
{$apiStatus.global.tickets}&nbsp;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"

Zobrazit soubor

@ -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}