Skip to content

Commit 98b3d0a

Browse files
committed
workshops
1 parent 05dcd00 commit 98b3d0a

File tree

3 files changed

+76
-28
lines changed

3 files changed

+76
-28
lines changed

src/components/Talks2023.vue

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<template>
2-
<h3 class="mt-large">Helsinki</h3>
32
<div
4-
v-for="talk in talks"
3+
v-for="talk in items"
54
:key="talk.code"
65
class="row p-small mt-large col-sm-12"
76
:class="talk.submission_type === 'Break' ? 'rounded bg-grey-dark' : 'card'">
@@ -13,17 +12,20 @@
1312
</div>
1413
<h3 class="mb-3xsmall title" :id="getSlug(talk.title)">
1514
<template v-if="talk.submission_type === 'Break'">
16-
Break: {{ getShownTime(talk.slot.start) }} - {{ getShownTime(talk.slot.end) }}
15+
Break ({{ getBreakLength(talk.slot.start, talk.slot.end) }} min)
16+
</template>
17+
<template v-else-if="talk.submission_type === 'Misc'">
18+
{{ talk.description.en }}
1719
</template>
1820
<template v-else>
1921
{{ talk.title }}
2022
</template>
2123
</h3>
22-
<p v-if="talk.submission_type !== 'Break'" class="type-small m-none">
23-
{{ format(new Date(talk.slot.start), 'MMM dd') }} {{ getShownTime(talk.slot.start) }} - {{ getShownTime(talk.slot.end) }}
24+
<p class="type-small m-none">
25+
{{ format(new Date(talk.slot.start), 'MMM dd') }} {{ getShownTime(talk.slot.start) }} - {{ getShownTime(talk.slot.end) }} UTC+2
2426
</p>
2527
</div>
26-
<div class="flex top">
28+
<div v-if="talk.submission_type !== 'Misc'" class="flex top">
2729
<a v-if="!$store.state.isMobile && talk.submission_type !== 'Break'" title="get link to talk" :class="talk.submission_type === 'Keynote' && 'm-xsmall'" :href="`#${getSlug(talk.title)}`">
2830
<link-icon style="transform: translateY(2px)" />
2931
</a>
@@ -33,7 +35,7 @@
3335
</div>
3436
</div>
3537
</div>
36-
<div v-if="talk.submission_type !== 'Break'" class="col-sm-12">
38+
<div v-if="!['Break', 'Misc'].includes(talk.submission_type)" class="col-sm-12">
3739
<p
3840
class="relative"
3941
:class="!talk.expanded && talk.abstract && talk.abstract.length > 100 && 'intro-gradient'"
@@ -43,7 +45,7 @@
4345
</button>
4446
<div v-if="talk.expanded" v-html="parseText(talk.description)" />
4547
</div>
46-
<div v-else v-html="parseText(talk.description.en)" />
48+
<div v-else-if="talk.submission_type === 'Break'" v-html="parseText(talk.description.en)" />
4749
<div v-if="talk.submission_type !== 'Break'" class="col-sm-12">
4850
<div
4951
v-for="speaker in talk.speakers"
@@ -78,21 +80,25 @@
7880
<h4>
7981
{{ speaker.name }}
8082
</h4>
81-
<p class="type-small mb-none" v-html="parseText(speaker.biography)" />
83+
<div
84+
class="type-small mb-none relative"
85+
:class="!speaker.expanded ? 'bio-trunc bio-gradient' : ''">
86+
<div v-html="parseText(speaker.biography)" :id="`${talk.code}${speaker.code}`" />
87+
</div>
88+
<button v-if="!speaker.expanded" @click="speaker.expanded = true" class="pl-2xsmall color-theme type-underline type-small" style="transform: translateY(0.25rem);">
89+
Show more
90+
</button>
8291
</div>
8392
</template>
8493
</div>
8594
</div>
8695
</div>
87-
<div class="mt-large">
88-
Online talks will be released soon, stay tuned!
89-
</div>
9096
</template>
9197

9298
<script>
9399
import * as DOMPurify from 'dompurify'
94100
import { marked } from 'marked'
95-
import { format } from 'date-fns'
101+
import { format, differenceInMinutes } from 'date-fns'
96102
import LinkIcon from './icons/LinkIcon.vue'
97103
98104
export default {
@@ -101,14 +107,24 @@ export default {
101107
LinkIcon
102108
},
103109
props: {
104-
talks: {
110+
items: {
105111
type: Array,
106112
required: true
107113
}
108114
},
109115
data: () => ({
110116
publicPath: process.env.BASE_URL
111117
}),
118+
mounted() {
119+
this.items.forEach((talk) => {
120+
if (!talk.speakers) return
121+
talk.speakers.forEach((speaker) => {
122+
const bioElement = document.getElementById(`${talk.code}${speaker.code}`)
123+
if (bioElement === undefined) return
124+
if (bioElement.offsetHeight < 100) speaker.expanded = true
125+
})
126+
})
127+
},
112128
methods: {
113129
format,
114130
getShownTime(time) {
@@ -123,6 +139,9 @@ export default {
123139
getSlug(title) {
124140
if (!title) return ''
125141
return title.replace(/[ ]/g, '-').replace(/[^a-zA-Z0-9-]/g, '').toLowerCase()
142+
},
143+
getBreakLength(start, end) {
144+
return differenceInMinutes(new Date(end), new Date(start))
126145
}
127146
}
128147
}

src/content/english/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import archive from './archive'
66

77
export default {
88
langName: 'English',
9-
newsBanner: '🎉 Helsinki talks released! 🎉',
9+
newsBanner: '🎉 Workshops and talks released! 🎉',
1010
navbar: {
1111
links: [
1212
{ text: 'RBCN23', name: 'Home' },

src/views/Home.vue

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,14 @@
4646
</h3>
4747
January 17th
4848
<p class="type-small">
49-
Workshops and tickets TBA!
49+
Join a workshop for an ultimate hands-on learning experience in Helsinki.
50+
</p>
51+
<p class="type-small">
52+
There are several different workshops so you'll surely find one that
53+
caters your needs and experience level!
54+
</p>
55+
<p class="type-small color-theme">
56+
Tickets available soon!
5057
</p>
5158
</div>
5259
<div class="card p-small mb-small">
@@ -68,17 +75,27 @@
6875
<p class="type-small">
6976
Held at <a href="https://goo.gl/maps/jEW5zoLuZgmca6D1A">Bio Rex</a> in city center.
7077
</p>
71-
<p class="type-small">
72-
<a href="/#talks">List of talks</a>
73-
</p>
7478
</div>
7579
</div>
7680
</page-section>
7781
<page-section title-id="sponsors" title="Sponsors">
7882
<sponsors :sponsors="$tm('home.sponsors')" />
7983
</page-section>
84+
<page-section title-id="workshops" title="Workshops">
85+
<h3 class="mt-large">Helsinki, in-person</h3>
86+
<talks-2023 v-if="workshops.length" :items="workshops" />
87+
<div v-else>
88+
Loading workshops...
89+
</div>
90+
</page-section>
8091
<page-section title-id="talks" title="Talks">
81-
<talks-2023 v-if="talks.length" :talks="talks" />
92+
<template v-if="talks.length">
93+
<h3 class="mt-large">Helsinki</h3>
94+
<talks-2023 :items="talks" />
95+
<div class="mt-large">
96+
Online talks will be released soon, stay tuned!
97+
</div>
98+
</template>
8299
<div v-else>
83100
Loading talks...
84101
</div>
@@ -107,7 +124,8 @@ export default {
107124
NewsBanner
108125
},
109126
data: () => ({
110-
talks: []
127+
talks: [],
128+
workshops: []
111129
}),
112130
created() {
113131
Promise.all([
@@ -117,25 +135,36 @@ export default {
117135
.then(async([submissions, schedule]) => {
118136
const talks = await submissions.json()
119137
const { breaks } = await schedule.json()
120-
return [...talks.results, ...breaks]
138+
return [talks.results, breaks]
121139
})
122-
.then((list) => {
123-
this.talks = list
124-
.filter(({ submission_type }) => !submission_type || ['Talk', 'Keynote'].includes(submission_type.en)) // eslint-disable-line
140+
.then(([list, breaks]) => {
141+
const talks = list
142+
.filter(({ submission_type }) => submission_type.en && ['Talk', 'Keynote'].includes(submission_type.en)) // eslint-disable-line
143+
const workshops = list
144+
.filter(({ submission_type }) => submission_type.en && submission_type.en.includes('Workshop')) // eslint-disable-line
145+
const breaksParsed = breaks
125146
.map((item) => ({
126147
...item,
127-
submission_type: item.submission_type?.en || 'Break',
128-
slot: item.slot || { start: item.start, end: item.end }
148+
submission_type: item.description.en.toLowerCase().includes('talk') ? 'Misc' : 'Break'
129149
}))
150+
151+
this.talks = [...talks, ...breaksParsed]
152+
.map((item) => ({
153+
...item,
154+
slot: item.slot || { start: item.start, end: item.end },
155+
type: item.submission_type.en || item.submission_type
156+
}))
157+
.sort((a, b) => new Date(a.slot.start) < new Date(b.slot.start) ? -1 : 1)
158+
this.workshops = workshops
130159
.sort((a, b) => new Date(a.slot.start) < new Date(b.slot.start) ? -1 : 1)
160+
131161
this.$nextTick(() => {
132162
const hash = window.location.hash
133163
if (!hash || hash === '') return
134164
const el = document.getElementById(hash.slice(1))
135165
if (el) el.scrollIntoView()
136166
})
137167
})
138-
// fa63d553-692a-4c25-9a0d-865af22271f3
139168
// fetch('https://cfp.robocon.io/api/events/robocon-2023/submissions/')
140169
// .then((res) => res.json())
141170
// fetch('https://pretalx.com/api/events/robocon-2023/schedules/latest/')

0 commit comments

Comments
 (0)