378 lines
11 KiB
JavaScript
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); |