static/js/com/events-table.js (191 lines of code) (raw):
var render = require('../util/render');
var util = require('../util/common');
var $ = require('jquery');
var helpers = {},
templates = {};
helpers.formatDate = function (date) {
var formatted = '',
isRange = util.isArray(date),
months = EventsTable.MONTHS,
nowYear = EventsTable.NOW_DATE.getFullYear(),
year, month, day;
if (isRange) {
month = [
months[date[0].getMonth()],
months[date[1].getMonth()]
];
year = [date[0].getFullYear(), date[1].getFullYear()];
day = [date[0].getDate(), date[1].getDate()];
if (month[0] !== month[1]) {
formatted = month[0] + ' ' + day[0] + '-' + month[1] + ' ' + day[1];
} else {
formatted = month[0] + ' ' + day[0] + '-' + day[1];
}
if (year[0] !== nowYear || year[1] !== nowYear) {
formatted += ', ' + year[1];
}
}
else {
year = date.getFullYear();
month = months[date.getMonth()];
day = date.getDate();
formatted = month + ' ' + day;
if (year !== nowYear) {
formatted += ', ' + year;
}
}
return formatted;
};
templates.main = function (events) {
var now = EventsTable.NOW_DATE,
pastEvents = [],
futureEvents = [],
hasPastEvents, hasFutureEvents;
// Split events list to past and future events
for (var i = 0, len = events.length; i < len; i++) {
var event = events[i];
var isRangeOfDates = util.isArray(event.date);
if (isRangeOfDates)
((event.date[0] < now || event.date[1] < now)
? pastEvents
: futureEvents
).push(event);
else
(event.date < now ? pastEvents : futureEvents).push(event);
}
hasPastEvents = pastEvents.length > 0;
hasFutureEvents = futureEvents.length > 0;
return [
['.events-table',
hasFutureEvents
? ['.events-table-row',
['.events-table-row-title', 'Upcoming Events'],
templates.eventsList(futureEvents)
]
: null,
hasPastEvents
? ['.events-table-row',
['.events-table-row-title', 'Past Events'],
templates.eventsList(pastEvents)
]
: null
]
];
};
templates.eventsList = function (events) {
var template = ['.events-list'];
for (var i = 0, len = events.length; i < len; i++) {
template.push(this.event(events[i]));
}
return [template];
};
templates.event = function (event) {
var hasUrl = 'url' in event,
hasSubject = 'subject' in event,
hasContent = 'content' in event,
hasSpeaker = 'speaker' in event,
isMultipleSpeakers = hasSpeaker && util.isArray(event.speaker),
hasLocation = 'location' in event;
var t =
['.event',
['.event-date-col',
['.event-date', helpers.formatDate(event.date)]
],
['.event-title-col',
['.event-title',
hasUrl
? ['a.event-url', {href: event.url, target: '_blank'}, event.title]
: event.title
],
hasLocation
? ['.event-location', event.location]
: null
],
['.event-info-col',
['.event-subject',
hasSubject ? ['span.text', event.subject] : null,
templates.eventContent(event)
],
hasSpeaker
? ['.event-speaker',
isMultipleSpeakers
? event.speaker.join(', ')
: event.speaker
]
: null
]
];
return t;
};
templates.eventContent = function (event) {
var hasContent = 'content' in event,
template = [
'.event-info-indicators'
];
if ('lang' in event) {
template.push(['.event-lang', event.lang]);
}
if (hasContent) {
for (var itemType in event.content) {
var itemUrl = event.content[itemType];
var itemTitle = itemType.charAt(0).toUpperCase() + itemType.slice(1);
template.push(['a.event-content-item._' + itemType, {
href: itemUrl,
target: '_blank',
title: itemTitle
}]);
}
}
return template;
};
function EventsTable(elem, events) {
var that = this;
that.elem = elem;
// Convert event date from string to Date object
for (var i = 0, len = events.length; i < len; i++) {
var event = events[i];
var isDateRange = util.isArray(event.date);
if (isDateRange && (typeof event.date[0] === 'string')) {
event.date = [
new Date(event.date[0]),
new Date(event.date[1])
];
}
else if (!isDateRange && typeof event.date === 'string') {
event.date = new Date(event.date);
}
}
// Sorting
events.sort(function (a, b) {
var dateA = a.date,
dateB = b.date,
isADateIsRange = util.isArray(dateA),
isBDateIsRange = util.isArray(dateB),
compareA = isADateIsRange ? dateA[1] : dateA,
compareB = isBDateIsRange ? dateB[1] : dateB;
if (compareA === compareB) {
return 0;
}
return (compareA < compareB) ? 1 : -1;
});
this.events = events;
elem.appendChild(that.render());
}
EventsTable.MONTHS = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
];
EventsTable.NOW_DATE = new Date();
EventsTable.prototype.elem = null;
EventsTable.prototype.events = null;
EventsTable.prototype.render = function () {
return render(templates.main(this.events));
};
module.exports = EventsTable;