jam-cloud/web/app/assets/javascripts/findSession.js

378 lines
11 KiB
JavaScript

(function (context, $) {
"use strict";
context.JK = context.JK || {};
context.JK.FindSessionScreen = function(app) {
var CATEGORY = {
ACTIVE: {index: 0, id: "table#sessions-active"},
SCHEDULED: {index: 1, id: "table#sessions-scheduled"}
};
var $dateFilter = $("#session-date-filter");
var $sessionLanguageFilter = $('#session-language-filter');
var logger = context.JK.logger;
var rest = context.JK.Rest();
var sessionList;
var LIMIT = 10;
var $asNext = null;
var $asScroller = null;
var currentActiveSessionsPage = 0;
var currentActiveSessionsQuery = defaultActiveSessionsQuery();
var $ssNext = null;
var $ssScroller = null;
var currentScheduledSessionsPage = 0;
var currentScheduledSessionsQuery = defaultScheduledSessionsQuery();
function getCategoryEnum() {
return CATEGORY;
}
function removeSpinner($selector) {
$('div[layout-id=findSession] .content .spinner').remove();// remove any existing spinners
}
function addSpinner($selector) {
removeSpinner();
$selector.append('<div class="spinner spinner-large"></div>')
}
function search() {
logger.debug("Searching for sessions...");
clearResults();
buildActiveSessionsQuery();
buildScheduledSessionsQuery();
loadSessions();
}
function loadSessions() {
addSpinner($('#sessions-active'));
addSpinner($('#sessions-scheduled'));
// get active sessions
rest.findActiveSessions(currentActiveSessionsQuery)
.done(function(sessions) {
renderActiveSessions(sessions);
})
.fail(function(xhr, textStatus, errorMessage) {
if (xhr.status === 404) {
// swallow 404
}
else {
app.ajaxError(xhr, textStatus, errorMessage);
}
})
.always(function() {
removeSpinner($('#sessions-active'));
});
// get scheduled sessions
rest.findInactiveSessions(currentScheduledSessionsQuery)
.done(function(sessions) {
renderScheduledSessions(sessions);
})
.fail(function(xhr, textStatus, errorMessage) {
if (xhr.status === 404) {
// swallow 404
}
else {
app.ajaxError(xhr, textStatus, errorMessage);
}
})
.always(function() {
removeSpinner($('#sessions-scheduled'));
});
}
/***************** ACTIVE SESSIONS *****************/
function defaultActiveSessionsQuery() {
return {offset:currentActiveSessionsPage * LIMIT, limit:LIMIT, page:currentActiveSessionsPage};
}
function renderActiveSessions(sessions) {
$.each(sessions, function(i, session) {
sessionList.renderActiveSession(session, $(CATEGORY.ACTIVE.id));
});
afterLoadActiveSessions(sessions);
}
function buildActiveSessionsQuery() {
currentActiveSessionsQuery = defaultActiveSessionsQuery();
// genre filter
var genres = context.JK.GenreSelectorHelper.getSelectedGenres('#find-session-genre');
if (genres !== null && genres.length > 0) {
currentActiveSessionsQuery.genre = genres.join(',');
}
// date filter
var date = $('#session-date-filter').val();
if (date !== null && date.length > 0) {
currentActiveSessionsQuery.day = context.JK.formatDateYYYYMMDD(date);
currentActiveSessionsQuery.timezone_offset = (new Date().getTimezoneOffset()) / 60;
}
// language filter
var language = $sessionLanguageFilter.val();
if (language !== null && language.length > 0) {
currentActiveSessionsQuery.lang = language;
}
// keyword filter
var keyword = $('#session-keyword-srch').val();
if (keyword !== null && keyword.length > 0 && keyword !== 'Search by Keyword') {
currentActiveSessionsQuery.keyword = $('#session-keyword-srch').val();
}
// always set client ID (required on server)
currentActiveSessionsQuery.client_id = context.JK.clientId;
console.log("currentActiveSessionsQuery = %o", currentActiveSessionsQuery);
return currentActiveSessionsQuery;
}
function afterLoadActiveSessions(sessionList) {
var $noSessionsMsgSelector = $('#no-active-sessions');
if (sessionList.length === 0 && currentActiveSessionsPage === 0) {
$(CATEGORY.ACTIVE.id).hide();
$noSessionsMsgSelector.show();
}
else {
$(CATEGORY.ACTIVE.id).show();
$noSessionsMsgSelector.hide();
}
if(sessionList.length < LIMIT) {
// if we retrieve less results than asked for, end searching
$asScroller.infinitescroll('pause');
}
else {
currentActiveSessionsPage++;
buildActiveSessionsQuery();
registerActiveSessionInfiniteScroll();
}
context.JK.GA.trackFindSessions(sessionList.length);
}
function registerActiveSessionInfiniteScroll() {
$asScroller.infinitescroll({
behavior: 'local',
navSelector: '#sessions-active .btn-next-wrapper',
nextSelector: '#sessions-active .btn-next',
binder: $asScroller,
dataType: 'json',
appendCallback: false,
debug: true,
prefill: false,
bufferPx:100,
loading: {
msg: $('<div class="infinite-scroll-loader">Loading ...</div>'),
img: '/assets/shared/spinner.gif'
},
path: function(page) {
return '/api/sessions/active?' + $.param(buildActiveSessionsQuery());
}
},function(json, opts) {
renderActiveSessions(json);
});
}
/***************** SCHEDULED SESSIONS *****************/
function defaultScheduledSessionsQuery() {
return {offset:currentScheduledSessionsPage * LIMIT, limit:LIMIT, page:currentScheduledSessionsPage};
}
function renderScheduledSessions(sessions) {
$.each(sessions, function(i, session) {
sessionList.renderInactiveSession(session, $(CATEGORY.SCHEDULED.id));
});
afterLoadScheduledSessions(sessions);
}
function buildScheduledSessionsQuery() {
currentScheduledSessionsQuery = defaultScheduledSessionsQuery();
// genre filter
var genres = context.JK.GenreSelectorHelper.getSelectedGenres('#find-session-genre');
if (genres !== null && genres.length > 0) {
currentScheduledSessionsQuery.genre = genres.join(',');
}
// date filter
var date = $('#session-date-filter').val();
if (date !== null && date.length > 0) {
currentScheduledSessionsQuery.day = context.JK.formatDateYYYYMMDD(date);
currentScheduledSessionsQuery.timezone_offset = (new Date().getTimezoneOffset()) / 60;
}
// language filter
var language = $sessionLanguageFilter.val();
if (language !== null && language.length > 0) {
currentScheduledSessionsQuery.lang = language;
}
// keyword filter
var keyword = $('#session-keyword-srch').val();
if (keyword !== null && keyword.length > 0 && keyword !== 'Search by Keyword') {
currentScheduledSessionsQuery.keyword = $('#session-keyword-srch').val();
}
// always set client ID (required on server)
currentScheduledSessionsQuery.client_id = context.JK.clientId;
console.log("currentScheduledSessionsQuery = %o", currentScheduledSessionsQuery);
return currentScheduledSessionsQuery;
}
function afterLoadScheduledSessions(sessionList) {
var $noSessionsMsgSelector = $('#no-scheduled-sessions');
if (sessionList.length === 0 && currentScheduledSessionsPage === 0) {
$(CATEGORY.SCHEDULED.id).hide();
$noSessionsMsgSelector.show();
}
else {
$(CATEGORY.SCHEDULED.id).show();
$noSessionsMsgSelector.hide();
}
if(sessionList.length < LIMIT) {
// if we retrieve less results than asked for, end searching
$ssScroller.infinitescroll('pause');
}
else {
currentScheduledSessionsPage++;
buildScheduledSessionsQuery();
registerScheduledSessionInfiniteScroll();
}
context.JK.GA.trackFindSessions(sessionList.length);
}
function registerScheduledSessionInfiniteScroll() {
$ssScroller.infinitescroll({
behavior: 'local',
navSelector: '#sessions-scheduled .btn-next-wrapper',
nextSelector: '#sessions-scheduled .btn-next',
binder: $ssScroller,
dataType: 'json',
appendCallback: false,
debug: true,
prefill: false,
bufferPx:100,
loading: {
msg: $('<div class="infinite-scroll-loader">Loading ...</div>'),
img: '/assets/shared/spinner.gif'
},
path: function(page) {
return '/api/sessions/inactive?' + $.param(buildScheduledSessionsQuery());
}
},function(json, opts) {
renderScheduledSessions(json);
});
}
/******************************************************/
function beforeShow(data) {
context.JK.GenreSelectorHelper.render('#find-session-genre', 'Any Genre');
}
function afterShow(data) {
if(!context.JK.JamServer.connected) {
app.notifyAlert("Not Connected", 'To create or join a session, you must be connected to the server.');
window.location = '/client#/home'
return;
}
clearResults();
buildActiveSessionsQuery();
buildScheduledSessionsQuery();
loadSessions();
}
function clearResults() {
currentActiveSessionsPage = 0;
$asScroller.infinitescroll('resume');
$('table#sessions-active').empty();
currentScheduledSessionsPage = 0;
$ssScroller.infinitescroll('resume');
$('table#sessions-scheduled').empty();
}
function events() {
$('#session-keyword-srch').focus(function () {
$(this).val('');
});
$("#session-keyword-srch").keypress(function (evt) {
if (evt.which === 13) {
evt.preventDefault();
search();
}
});
$('#btn-refresh').on("click", search);
}
function initialize() {
var screenBindings = {
'beforeShow': beforeShow,
'afterShow': afterShow
};
app.bindScreen('findSession', screenBindings);
sessionList = new context.JK.SessionList(app);
$asNext = $('#sessions-active .btn-next')
$asScroller = $('#sessions-active .findsession-scroll-container');
$ssNext = $('#sessions-scheduled .btn-next')
$ssScroller = $('#sessions-scheduled .findsession-scroll-container');
$dateFilter.datepicker({
dateFormat: "D d MM yy",
onSelect: toggleDate
}
);
context.JK.dropdown($sessionLanguageFilter);
events();
}
function toggleDate() {
var selectedDate = new Date($dateFilter.val());
var currentDate = new Date();
var startIndex = 0;
if (currentDate.getYear() == selectedDate.getYear() &&
currentDate.getMonth() == selectedDate.getMonth() &&
currentDate.getDate() == selectedDate.getDate()) {
var timeString = getFormattedTime(currentDate, true);
startIndex = defaultTimeArray.indexOf(timeString);
}
}
this.initialize = initialize;
this.afterShow = afterShow;
this.clearResults = clearResults;
this.getCategoryEnum = getCategoryEnum;
return this;
};
})(window, jQuery);