Compare commits
13 Commits
Author | SHA1 | Date |
---|---|---|
Tocho Tochev | 1cf6847d18 | |
Tocho Tochev | aea60ac5a7 | |
Petko Bordjukov | 5801f6581b | |
Tocho Tochev | e411b8d037 | |
Petko Bordjukov | b6ae81d2e9 | |
Vencislav Atanasov | c355c4c655 | |
Petko Bordjukov | e8f8632530 | |
Petko Bordjukov | 0dcfa7efa0 | |
Petko Bordjukov | dc11a85f41 | |
Petko Bordjukov | baa7ec4b66 | |
Petko Bordjukov | d67539e16a | |
Petko Bordjukov | cd3f9b93a7 | |
Petko Bordjukov | 8e6238c014 |
98
index.html
|
@ -1,6 +1,6 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>The IT Tour</title>
|
<title>OpenFest 2021</title>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
@ -24,8 +24,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- <video id="background_video" src="background.mp4" loop autoplay /> -->
|
||||||
|
<!-- TODO: fix display of speakers -->
|
||||||
|
|
||||||
<script id="agenda_template" type="text/ractive">
|
<script id="agenda_template" type="text/ractive">
|
||||||
<section id="agenda">
|
<section id="agenda">
|
||||||
|
<h3>{{room}}</h3>
|
||||||
<table class="reveal">
|
<table class="reveal">
|
||||||
<tbody>
|
<tbody>
|
||||||
{{#pastEvents}}
|
{{#pastEvents}}
|
||||||
|
@ -70,79 +74,69 @@
|
||||||
|
|
||||||
<script id="current_talk_template" type="text/ractive">
|
<script id="current_talk_template" type="text/ractive">
|
||||||
<section id="current_talk">
|
<section id="current_talk">
|
||||||
<h3>В момента</h3>
|
<h4>В момента</h4>
|
||||||
<h1>{{currentEvent.title}}</h1>
|
<h2>{{currentEvent.title}}</h2>
|
||||||
<p>{{currentEvent.description}}</p>
|
<p>{{currentEvent.abstract}}</p>
|
||||||
</section>
|
</section>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script id="speaker_template" type="text/ractive">
|
<script id="speaker_template" type="text/ractive">
|
||||||
<section>
|
<section>
|
||||||
<h3>Лектор</h3>
|
<h4>Лектор</h4>
|
||||||
<h1>{{name}}</h1>
|
<h2>{{name}}</h2>
|
||||||
<p>{{description}}</p>
|
<p>{{description}}</p>
|
||||||
</section>
|
</section>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script id="next_talk_template" type="text/ractive">
|
<script id="next_talk_template" type="text/ractive">
|
||||||
<section id="next_talk">
|
<section id="next_talk">
|
||||||
<h3>Следва</h3>
|
<h4>Следва</h4>
|
||||||
<h1>{{nextEvent.title}}</h1>
|
<h2>{{nextEvent.title}}</h2>
|
||||||
<p>{{nextEvent.description}}</p>
|
<p>{{nextEvent.abstract}}</p>
|
||||||
<h4>({{nextEvent.startTime.fromNow()}})</h4>
|
<h5><i>({{nextEvent.startTime.from(now)}})</i></h5>
|
||||||
</section>
|
</section>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script id="slides_template" type="text/ractive">
|
<script id="slides_template" type="text/ractive">
|
||||||
<section>
|
<section data-state="update-safe">
|
||||||
<img src="logos/BSDeurope.png"/>
|
<img src="logo.png">
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/egt.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/elwix_big_logo.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/en-logo-redesign-wordmark-v1.0-rgb-01.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/getclouder.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/iXlogo-transparent-2000px.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/largeNewGoogleLogoFinalFlat-a.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/logo_bulstream.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/Madison-Gurkha-logo.jpg"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/netbsd.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/pc-engines-logo.gif"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/TheFreeBSDFoundation_Logo_HighRes.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/threema-logo_schwarz_mit_claim.png"/>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<img src="logos/trivago-logo.png"/>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{{#eventCount}}
|
||||||
<section>
|
<section>
|
||||||
<img src="logos/arm.png"/>
|
{{> agenda_template}}
|
||||||
|
|
||||||
|
{{#currentEvent}}
|
||||||
|
{{> current_talk_template}}
|
||||||
|
{{/currentEvent}}
|
||||||
|
|
||||||
|
{{#currentEvent.speakers}}
|
||||||
|
{{> speaker_template}}
|
||||||
|
{{/currentEvent.speakers}}
|
||||||
|
|
||||||
|
{{#nextEvent}}
|
||||||
|
{{> next_talk_template}}
|
||||||
|
{{/nextEvent}}
|
||||||
|
|
||||||
|
{{#nextEvent.speakers}}
|
||||||
|
{{> speaker_template}}
|
||||||
|
{{/nextEvent.speakers}}
|
||||||
|
</section>
|
||||||
|
{{/eventCount}}
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h1>#OpenFest2021</h1>
|
||||||
|
<h2>в Twitter</h2>
|
||||||
</section>
|
</section>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript" src="ractive-init.js"></script>
|
<script type="text/javascript" src="ractive-init.js"></script>
|
||||||
<script type="text/javascript" src="reveal-init.js"></script>
|
<script type="text/javascript" src="reveal-init.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
// use for green screen background
|
||||||
|
if ($.urlParam('background')) {
|
||||||
|
$('body').css('background-color', $.urlParam('background'));
|
||||||
|
}
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
BIN
logo.png
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 977 KiB |
BIN
logos/arm.png
Before Width: | Height: | Size: 13 KiB |
BIN
logos/egt.png
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 293 KiB |
Before Width: | Height: | Size: 548 KiB |
Before Width: | Height: | Size: 46 KiB |
BIN
logos/netbsd.png
Before Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 9.9 KiB |
|
@ -15,9 +15,12 @@ var reactive = new Ractive({
|
||||||
});
|
});
|
||||||
|
|
||||||
function refreshEvent() {
|
function refreshEvent() {
|
||||||
|
schedule.update();
|
||||||
reactive.set({pastEvents: schedule.pastEvents(),
|
reactive.set({pastEvents: schedule.pastEvents(),
|
||||||
currentEvent: schedule.currentEvent(),
|
currentEvent: schedule.currentEvent(),
|
||||||
nextEvent: schedule.nextEvent(),
|
nextEvent: schedule.nextEvent(),
|
||||||
futureEvents: schedule.futureEvents(),
|
futureEvents: schedule.futureEvents(),
|
||||||
eventCount: schedule.allEvents().length});
|
eventCount: schedule.allEvents().length,
|
||||||
|
now: schedule.now(),
|
||||||
|
room: schedule.room()});
|
||||||
}
|
}
|
||||||
|
|
181
schedule.js
|
@ -1,16 +1,53 @@
|
||||||
function Schedule() {
|
function Schedule(hallId, date, setPageTitle) {
|
||||||
var events = [];
|
var events = [];
|
||||||
|
|
||||||
this.addEvent = function(event) {
|
var apiEndpointPrefix = 'https://cfp.openfest.org/api/conferences/8';
|
||||||
events.push(event);
|
|
||||||
events = _.sortBy(events, function(event) {
|
var pageTitle = 'OpenFest';
|
||||||
return event.startTime.unix()
|
var room = '';
|
||||||
|
|
||||||
|
var nextLectureDelayMinutes = 4; // show the current lecture as next for the first N minutes
|
||||||
|
|
||||||
|
$.getJSON(apiEndpointPrefix + '/halls.json', function(data) {
|
||||||
|
room = data[hallId]['name']['bg'];
|
||||||
|
if (room === undefined) {
|
||||||
|
room = '';
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.update = function() {
|
||||||
|
$.getJSON(apiEndpointPrefix + '/events.json', function(eventsData) {
|
||||||
|
$.getJSON(apiEndpointPrefix + '/slots.json', function(slotsData) {
|
||||||
|
$.each(slotsData, function(slotId, slot) {
|
||||||
|
$.extend(eventsData[slot['event_id'].toString()], slot);
|
||||||
|
$.extend(eventsData[slot['event_id'].toString()], {"slotId": slotId});
|
||||||
|
});
|
||||||
|
var scheduleEvents = $.map(eventsData, function(event, eventId) {
|
||||||
|
event['id'] = eventId;
|
||||||
|
event['startTime'] = moment(event['starts_at']);
|
||||||
|
event['endTime'] = moment(event['ends_at']);
|
||||||
|
event['hallId'] = event['hall_id'];
|
||||||
|
|
||||||
|
if (event['startTime'].date() !== date) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (event['hallId'] !== hallId) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return event;
|
||||||
|
});
|
||||||
|
|
||||||
|
events = scheduleEvents.sort(function (a,b) {return a['startTime'].isBefore(b['startTime']) ? -1 : 1});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this.setPageTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.upcomingEvents = function() {
|
this.upcomingEvents = function() {
|
||||||
|
var now = this.referenceTime();
|
||||||
return _.select(events, function(event) {
|
return _.select(events, function(event) {
|
||||||
return event.startTime.isAfter(moment());
|
return event.startTime.isAfter(now);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,8 +57,7 @@ function Schedule() {
|
||||||
|
|
||||||
this.currentEvent = function() {
|
this.currentEvent = function() {
|
||||||
var latestEvent = _.last(this.pastEvents());
|
var latestEvent = _.last(this.pastEvents());
|
||||||
var nextEvent = this.nextEvent();
|
if (typeof(latestEvent) != 'undefined' && latestEvent.endTime.isAfter(this.now())) {
|
||||||
if (typeof nextEvent != 'undefined' && (latestEvent.displayNext || moment(nextEvent.startTime).subtract('minutes', 10).isAfter(moment()))) {
|
|
||||||
return latestEvent;
|
return latestEvent;
|
||||||
} else {
|
} else {
|
||||||
return undefined;
|
return undefined;
|
||||||
|
@ -33,8 +69,9 @@ function Schedule() {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.pastEvents = function() {
|
this.pastEvents = function() {
|
||||||
|
var now = this.referenceTime();
|
||||||
return _.select(events, function(event) {
|
return _.select(events, function(event) {
|
||||||
return event.startTime.isBefore(moment());
|
return event.startTime.isBefore(now);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,122 +79,38 @@ function Schedule() {
|
||||||
return events;
|
return events;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addDelay = function(time) {
|
this.now = function() {
|
||||||
_.each(this.upcomingEvents(), function(event, index, agenda) {
|
now = $.urlParam("now");
|
||||||
event.startTime.add(time);
|
if (now) {
|
||||||
});
|
return moment(now);
|
||||||
|
} else {
|
||||||
|
return moment();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var schedule = new Schedule();
|
this.referenceTime = function() {
|
||||||
|
return this.now().subtract(nextLectureDelayMinutes, 'minutes');
|
||||||
schedule.addEvent({
|
|
||||||
title: 'Кафе',
|
|
||||||
startTime: moment({hour: 9, minute: 30})
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
|
||||||
title: 'Откриване',
|
|
||||||
startTime: moment({hour: 9, minute: 50})
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
|
||||||
title: 'Node.js and Open Source Software Development on Microsoft Azure',
|
|
||||||
startTime: moment({hour: 10}),
|
|
||||||
speakers: [
|
|
||||||
{
|
|
||||||
name: 'Михаил Матеев',
|
|
||||||
description: 'Михаил е разработчик в Infragistics. Работил е в различни области, свързани с технологии на Microsoft, като Silverlight, WPF, Windows Phone, Visual Studio LightSwitch, Windows Store приложения, WCF RIA Services, MS SQL Server и Microsoft Azure. През последните десет години, Михаил е писал статии за Computer World и различни блогове за .NET технологии. Той е сътрудник и технически редактор на PACKT Publishing and Wiley. Повече от пет години е работил в ESRI България. Няколко години Михаил е бил лектор в ФМИ на Софийския университет "Св. за Климент Охридски ". Също така е и преподавател по компютърни системи в Университет по Архитектура, Строителство и Геодезия в София.'
|
|
||||||
}
|
}
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
this.room = function() {
|
||||||
title: 'Редизайн на „държавата“ и препрограмиране на „системата“',
|
return room;
|
||||||
startTime: moment({hour: 11, minute: 10}),
|
|
||||||
speakers: [
|
|
||||||
{
|
|
||||||
name: 'Антон Стойчев',
|
|
||||||
description: 'Антон е прекарал последните 2 години във Великобритания, работейки като разработчик, предимно на саморегулиращи се системи за извличане и анализ на данни, достигащи на размер стотици сървъри на AWS. Сега е тук и иска да добави смисъл и желание за неизбежния, целодневен престой пред монитор; Чрез “Civic Hacking” – нещо започващо с работещите в дигиталната сфера, но обхващащо всички други. Живее живота си майсторейки и обичайки, в опити за рисуване, писане, четене и прекарвайки часове в сглобяване на извинения за честите си пътувания.'
|
|
||||||
}
|
}
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
this.setPageTitle = function() {
|
||||||
title: 'iOS Development - Tips & Tricks',
|
if (setPageTitle) {
|
||||||
startTime: moment({hour: 12, minute: 10}),
|
$('title').text(pageTitle + " room=" + room + " date=" + date);
|
||||||
speakers: [
|
|
||||||
{
|
|
||||||
name: 'Галин Кърджилов',
|
|
||||||
description: 'Галин е проактивен и творчески настроен софтуерен инженер с повече от 10 години опит. В момента е посветен на мобилните разработки и работи като Senior iOS Developer в MentorMate София. Неговият стремеж е да генерира максимално въздействие към потребителите.'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Стефан Цвятков',
|
|
||||||
description: 'Стефан е започнал кариерата си като разработчик за Mac. През 2008 г. Apple пуска iOS SDK и това е началото на една ера. Оттогава, той работи по създаването iOS приложения. В MentorMate той успява да изгради най-големия екип от iOS програмисти в България. Стефан е известен с желанието си да подобри мобилните приложения, за да бъдат по-интерактивни, ефективни и оптимизирани за нуждите на бизнеса.'
|
|
||||||
}
|
}
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
|
||||||
title: 'Обяд',
|
|
||||||
startTime: moment({hour: 12, minute: 40})
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
|
||||||
title: 'The Cloud Beyond the Buzzword',
|
|
||||||
startTime: moment({hour: 13, minute: 30}),
|
|
||||||
speakers: [
|
|
||||||
{
|
|
||||||
name: 'Божидар Божанов',
|
|
||||||
description: 'Божидар Божанов е програмист, а понякога и архитект. От скука е направил http://computoser.com - компютърен композитор, а друго негово хоби е лингвистиката. Притежател на "дебел" stackoverflow профил.'
|
|
||||||
}
|
}
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
|
||||||
title: 'Мета-програмиране с Nimrod',
|
|
||||||
startTime: moment({hour: 14, minute: 20}),
|
|
||||||
speakers: [
|
|
||||||
{
|
|
||||||
name: 'Захари Караджов',
|
|
||||||
description: 'Захари е C++ ветеран от гейм-индустрията, а понастоящем технически директор в Даркиум Студио, където с помощта на кофейн и CoffeeScript се разработва нов социално ориентиран уеб браузър. Твърдо убеден е, че използваните в момента езици за програмиране ще бъдат изместени от нови по-бързи, по-мощни и по-красиви такива и от нетърпение сам се е захванал да допринесе за това, участвайки в разработката на Nimrod.'
|
|
||||||
}
|
}
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
$.urlParam = function(name){
|
||||||
title: 'File editing on the client side (Javascript)',
|
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
|
||||||
startTime: moment({hour: 15, minute: 10}),
|
if (results==null){
|
||||||
speakers: [
|
return null;
|
||||||
{
|
}
|
||||||
name: 'Росен Колев',
|
else{
|
||||||
description: 'Росен работи като софтуерен разработчик повече от 5 години. В моментът е Senior .NET Developer в MentorMate Варна. Пише главно на .NET, C#, JavaScript и от време на време Objective-C. Обича добре подредед код и мрази лошата архитектура.'
|
return results[1] || 0;
|
||||||
}
|
}
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
|
||||||
title: 'Кафе пауза ☕',
|
|
||||||
startTime: moment({hour: 15, minute: 50})
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
|
||||||
title: 'Екстремно програмиране',
|
|
||||||
startTime: moment({hour: 16, minute: 10}),
|
|
||||||
speakers: [
|
|
||||||
{
|
|
||||||
name: 'Стефан Кънев',
|
|
||||||
description: 'Стефан се занимава с програмиране откакто се помни. Сред любимите му неща са Ruby, Vim, автоматизирани тестове, папийонки, Apple продуктите и всевъзможни екзотични езици за програмиране. В заетото си време програмира на Rails, а в свободното - води един-два курса във ФМИ към СУ, пише много код, който после трие и се опитва да не се нарани с планинското си колело. Никак не обича PHP и е амбивалентен към Java.'
|
|
||||||
}
|
}
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
var schedule = new Schedule(parseInt($.urlParam('roomId')), parseInt($.urlParam('date')), true);
|
||||||
title: 'Lightning Talks',
|
|
||||||
startTime: moment({hour: 17, minute: 00})
|
|
||||||
});
|
|
||||||
|
|
||||||
schedule.addEvent({
|
|
||||||
title: 'Закриване',
|
|
||||||
startTime: moment({hour: 18, minute: 00})
|
|
||||||
});
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ body {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: #FFF;
|
/* background-color: #06172A; */ /* BigBlueButton background */
|
||||||
}
|
}
|
||||||
|
|
||||||
body,
|
body,
|
||||||
|
@ -14,6 +14,8 @@ body,
|
||||||
.reveal h5,
|
.reveal h5,
|
||||||
.reveal h6 {
|
.reveal h6 {
|
||||||
font-family: "Roboto Condensed", tahoma, verdana, arial, sans-serif;
|
font-family: "Roboto Condensed", tahoma, verdana, arial, sans-serif;
|
||||||
|
font-weight: bold;
|
||||||
|
-webkit-text-stroke: 0.01em black;
|
||||||
}
|
}
|
||||||
|
|
||||||
#background_video {
|
#background_video {
|
||||||
|
|