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

270 lines
7.7 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 currentQuery = defaultQuery();
var currentPage = 0;
var LIMIT = 50;
var $next = null;
var $scroller = null;
var $noMoreSessions = null;
function defaultQuery() {
return {offset:currentPage * LIMIT, limit:LIMIT, page:currentPage};
}
// for unit tests
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 loadSessions() {
addSpinner($('#sessions-active'));
addSpinner($('#sessions-scheduled'));
// get active sessions
rest.findActiveSessions(currentQuery)
.done(function(sessions) {
$.each(sessions, function(i, session) {
logger.debug('Rendering session ID = ' + session.id);
sessionList.renderActiveSession(session, $(CATEGORY.ACTIVE.id));
});
afterLoadSessions(sessions, $(CATEGORY.ACTIVE.id), $('#no-active-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(currentQuery)
.done(function(sessions) {
$.each(sessions, function(i, session) {
logger.debug('Rendering session ID = ' + session.id);
sessionList.renderInactiveSession(session, $(CATEGORY.SCHEDULED.id));
});
afterLoadSessions(sessions, $(CATEGORY.SCHEDULED.id), $('#no-scheduled-sessions'));
})
.fail(function(xhr, textStatus, errorMessage) {
if (xhr.status === 404) {
// swallow 404
}
else {
app.ajaxError(xhr, textStatus, errorMessage);
}
})
.always(function() {
removeSpinner($('#sessions-scheduled'));
});
}
function buildQuery() {
currentQuery = defaultQuery();
// genre filter
var genres = context.JK.GenreSelectorHelper.getSelectedGenres('#find-session-genre');
if (genres !== null && genres.length > 0) {
currentQuery.genre = genres.join(',');
}
// date filter
var date = $('#session-date-filter').val();
if (date !== null && date.length > 0) {
currentQuery.day = context.JK.formatDateYYYYMMDD(date);
currentQuery.timezone_offset = (new Date().getTimezoneOffset()) / 60;
}
// language filter
var language = $sessionLanguageFilter.val();
if (language !== null && language.length > 0) {
currentQuery.lang = language;
}
// keyword filter
var keyword = $('#session-keyword-srch').val();
if (keyword !== null && keyword.length > 0 && keyword !== 'Search by Keyword') {
currentQuery.keyword = $('#session-keyword-srch').val();
}
// always set client ID (required on server)
currentQuery.client_id = context.JK.clientId;
console.log("currentQuery = %o", currentQuery);
return currentQuery;
}
function search() {
logger.debug("Searching for sessions...");
clearResults();
buildQuery();
loadSessions();
}
function afterLoadSessions(sessionList, $headerSelector, $noSessionsMsgSelector) {
if (sessionList.length == 0) {
$headerSelector.hide();
$noSessionsMsgSelector.show();
}
else {
$headerSelector.show();
$noSessionsMsgSelector.hide();
}
context.JK.GA.trackFindSessions(sessionList.length);
}
function beforeShow(data) {
context.JK.GenreSelectorHelper.render('#find-session-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();
buildQuery();
loadSessions();
}
function clearResults() {
currentPage = 0;
$noMoreSessions.hide();
$scroller.infinitescroll('resume');
$('table#sessions-active').children(':not(:first-child)').remove();
$('table#sessions-scheduled').children(':not(:first-child)').remove();
}
// function registerInfiniteScroll() {
// if(gon.use_cached_session_scores) {
// $scroller.infinitescroll({
// behavior: 'local',
// navSelector: '#findSession .btn-next-wrapper',
// nextSelector: '#findSession .btn-next',
// binder: $scroller,
// 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/nindex/' + app.clientId + '?' + $.param(buildQuery());
// }
// },function(json, opts) {
// // Get current page
// //currentPage = opts.state.currPage;
// // Do something with JSON data, create DOM elements, etc ..
// afterLoadScoredSessions(json);
// });
// }
// }
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);
// this event is raised by the RSVP submit dialog after submitting an RSVP request
$(document).on("rsvpSubmitEvent", function() {
$('#btn-refresh').trigger('click');
});
}
function initialize() {
var screenBindings = {
'beforeShow': beforeShow,
'afterShow': afterShow
};
app.bindScreen('findSession', screenBindings);
sessionList = new context.JK.SessionList(app);
$next = $('#findSession .btn-next')
$scroller = $('#findSession .content-body-scroller');
$noMoreSessions = $('#end-of-session-list');
$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);