/** * This method manages the redirection based on given page name * @param pageName * @param group */ function redirectTo(pageName, group = '') { if (!group) { if (pageMap[pageName]) { window.location = pageMap[pageName]; } } else { if (groupPageMap[group][pageName]) { window.location = groupPageMap[group][pageName]; } else { window.location = groupPageMap[group]['default']; } } } /** * FIXME: document this method ! * @returns {boolean} * @constructor */ function LoggedIn(callback) { var response = CheckSession(); response.then(function(authSession) { // Initialize interface initIdentity(authSession); callback(); }).catch(function(error) { redirectTo('unexpected', 'error'); }); return true; } /** * FIXME: document this method ! * FIXME: call the new api service 'checkSession' in order to validate authentication token from HTTP cookie * @returns {boolean} * @constructor */ function CheckSession() { var apiRequest = initAPIRequest('post', 'session', 'CheckSession'); return makeSyncAPICall(apiRequest); } /** * FIXME: Document this method !!! * @param containerId */ function freeze(containerId) { var container = $('#' + containerId); container.find(':button').prop('disabled', true); container.find('a').addClass('forbiddenLink').click(function () {return false;}); } /** * FIXME: Document this method !!! * @param formId */ function freezeForm(formId) { var container = $('#' + formId); container.find(':input').prop('disabled', true); container.find('select').prop('disabled', true); container.find('textarea').prop('disabled', true); container.find(':button').prop('disabled', true); container.find('a').addClass('forbiddenLink').click(function () {return false;}); } /** * Initialize interface identity information, based on logged user */ function initIdentity(authSession) { var _currentAuthUser = window.localStorage.getItem('_currentAuthUser'); if (!_currentAuthUser) { _currentAuthUser = { id: authSession.id, email: authSession.email, role: authSession.groups['0']['user_role'], name: authSession.first_name + ' ' + authSession.last_name, club: authSession.club, club_group: authSession.club_group }; window.localStorage.setItem('_currentAuthUser', JSON.stringify(_currentAuthUser)); } else { _currentAuthUser = JSON.parse(_currentAuthUser); } if (!userAccessChecker(_currentAuthUser.role)) { LogOut(); } else { var clubName = (_currentAuthUser.club) ? _currentAuthUser.club : 'Unknown'; var userName = (_currentAuthUser.name) ? _currentAuthUser.name : 'Unknown'; var role = (_currentAuthUser.role) ? _currentAuthUser.role : 'Unknown'; $(".clubHeaderTitle").text('').text(clubName); $(".authUserName").text('').text(userName + ' (' + userRoleHuman[role] + ')'); adjustInterface(role); initXHRLoader(); } } /** * FIXME: document this method ! */ function adjustInterface(role = null) { if (!role) { var _currentAuthUser = JSON.parse(window.localStorage.getItem('_currentAuthUser')); role = _currentAuthUser.role; } var accessLevel; var customSections = $('[data-access_level]'); $.each(customSections, function (idx, element) { accessLevel = $(element).data('access_level'); accessLevel = accessLevel.split(","); if (accessLevel.indexOf(role) < 0) { $(element).hide(); } }); } function userAccessChecker(authUserRole) { var viewContext = getCurrentContext(); var viewContextId = viewContextMap[viewContext]; if (accessLevel[viewContextId].length > 0) { if (accessLevel[viewContextId].indexOf(authUserRole) < 0) { return false; } } return true; } function getCurrentContext() { var allScripts = document.getElementsByTagName('script'); var lastScript = allScripts[allScripts.length-1]; var srcSegs = lastScript.src.split('/'); var contextIdx = srcSegs.length-1 ; return srcSegs[contextIdx].slice(0,-3); // remove ".js" extension } function getCurrentContextId() { return viewContextMap[getCurrentContext()]; } function changeModalHeaderClass(container, oldClass, newClass) { if ($(container).find('.modal-content').find('.modal-header').hasClass(oldClass)) { $(container).find('.modal-content').find('.modal-header').removeClass(oldClass); } if (!$(container).find('.modal-content').find('.modal-header').hasClass(newClass)) { $(container).find('.modal-content').find('.modal-header').addClass(newClass); } } function initXHRLoader () { if ($('#XHRWaitDialog')) { $('#XHRWaitDialog').bind('ajaxStart', function(){ $(this).modal('show'); }).bind('ajaxStop', function(){ $(this).modal('hide'); }); } } function getCurrentPage() { var currentPage = getUrlParameter('page'); validationResults = validateData({current_page: currentPage}); if (!currentPage || validationResults.error || currentPage < 1) { currentPage = 1; } return currentPage; } /** * FIXME: document this method ! */ function initNextActivityPanels() { var apiRequest = initAPIRequest('post', 'activity', 'AUX'); makeSyncAPICall(apiRequest).then(function(activities) { $.each(activities, function(key, obj) { var baseString = "#activity" + (key + 1); var title = baseString + '_title'; $(title).text(obj.title); var responsible = baseString + '_responsible'; $(responsible).text("Coordonator: " + obj.responsible); var data = baseString + '_data'; $(data).text(obj.data); var img = baseString + '_icon'; if (obj.category == "Competitie") { $(img).attr("src", "images/competition_pic.png"); } else { $(img).attr("src", "images/debate_meeting.png"); } }); }); } /** * Method that extracts cookies * @param name * @returns {*} */ function getCookie(name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length == 2) return parts.pop().split(";").shift(); } /** * input: 2016-12-31T05:18:43Z * output: 2016-12-31T05:18 (yyyy-MM-ddThh:mm::ss) * @param date */ function formatDateToLocalFormat(date) { var isoDate = new Date(date); var year = isoDate.getUTCFullYear(), month = isoDate.getUTCMonth() + 1, day = isoDate.getUTCDate(), hour = isoDate.getUTCHours(), minute = isoDate.getUTCMinutes(); if (month.toString().length < 2) month = '0' + month; if (day.toString().length < 2) day = '0' + day; if (hour.toString().length < 2) hour = '0' + hour; if (minute.toString().length < 2) minute = '0' + minute; return year + '-' + month + '-' + day + 'T' + hour + ':' + minute; } function formatDateToPrettyFormat(date) { var isoDate = new Date(date); var year = isoDate.getUTCFullYear(), month = isoDate.getUTCMonth() + 1, day = isoDate.getUTCDate(), hour = isoDate.getUTCHours(), minute = isoDate.getUTCMinutes(), second = isoDate.getUTCSeconds(); if (year.toString().length < 2) year = '0' + year.toString(); if (month.toString().length < 2) month = '0' + month.toString(); if (day.toString().length < 2) day = '0' + day.toString(); if (hour.toString().length < 2) hour = '0' + hour.toString(); if (minute.toString().length < 2) minute = '0' + minute.toString(); if (second.toString().length < 2) second = '0' + second.toString(); return day + '.' + month + '.' + year + ', ora ' + hour + ':' + minute; } function countObjectProperties(obj) { var count = 0; for (var k in obj) { if (obj.hasOwnProperty(k)) { ++count; } } return count; } /* =================== HTML tools =================== */ /** * Usage: create simple select with options list * @param elementType * @param data * @returns {string} */ function createFormElement(elementType, data) { var content = ''; if (elementType == 'option') { content += ''; $.each(data, function(key, obj) { if (obj.label_value) { content += ''; } else { content += ''; } }); } else if (elementType == 'checkbox') { // do nothing } return content; } /** * Usage: create text field with simple select - Training field * @param data * @returns {string} */ function createFormRowSelect_Training(data) { var content = ''; var selectOption = createFormElement('option', data); content += '
'; content += '
'; content += ''; content += '
'; content += '
'; content += ''; content += '
'; content += '
'; return content; } /** * Usage: create text field with simple select - Motion field * @param data * @returns {string} */ function createFormRowSelect_Motion(data) { var content = ''; var selectOption = createFormElement('option', data); content += '
'; content += '
'; content += ''; content += '
'; content += '
'; content += ''; content += '
'; content += '
'; return content; } /** * Usage: create text field with simple select - Activity labels field * @param data * @param addButtons * @returns {string} */ function createFormRowSelect_ActivityLabels(data, addButtons) { var content = ''; var selectOption = createFormElement('option', data); content += '
'; content += '
'; content += ''; content += '
'; if (addButtons === true) { content += '
'; content += ''; content += ''; content += '
'; } else { $('button[name="remove_row_activity_labels"]').show(); content += '
'; content += ' '; content += '
'; } content += '
'; return content; } /** * Usage: create checkbox list - Debaters and Trainers lists * @param data * @param context * @returns {string} */ function createFormCheckboxList(data, context) { var content = ''; $.each(data, function(key, obj) { content += '
'; content += ''; content += '
'; }); return content; } /** * Usage: add new form row - this method is called from html action button * @param areaName */ function addRowField(areaName) { var _localLabels = JSON.parse(window.localStorage.getItem('_activity_labels')); if (!_localLabels) { return; } var context = '', contextName = ''; if (areaName == 'training' && _localLabels['training'] && _localLabels['training'].length > 0) { contextName = 'activity-training-area'; context = $('div[' + activityFormBaseDataAttr + '="' + contextName + '"]'); content = createFormRowSelect_Training(_localLabels['training']); context.append(content); $('button[name="remove_row_training"]').show(); } else if (areaName == 'motion' && _localLabels['motion'] && _localLabels['motion'].length > 0) { contextName = 'activity-motion-area'; context = $('div[' + activityFormBaseDataAttr + '="' + contextName + '"]'); content = createFormRowSelect_Motion(_localLabels['motion']); context.append(content); $('button[name="remove_row_motion"]').show(); } else if (areaName == 'activity_labels' && _localLabels['activity'] && _localLabels['activity'].length > 0) { contextName = 'activity-labels-area'; context = $('div[' + activityFormBaseDataAttr + '="' + contextName + '"]'); var addButtons = false; if (context.children().length < 1) { addButtons = true; } content = createFormRowSelect_ActivityLabels( _localLabels['activity'], addButtons, context.children().length ); context.append(content); $('button[name="remove_row_activity_labels"]').show(); } } /** * Usage: remove form row - this method is called from html action button * @param areaName */ function removeRowField(areaName) { var context = '', contextName = ''; if (areaName == 'training') { contextName = 'activity-training-area'; context = $('div[' + activityFormBaseDataAttr + '="' + contextName + '"]'); if (context.children().length > 1) { context.children().last().remove(); } if (context.children().length == 1) { $('button[name="remove_row_training"]').hide(); } } else if (areaName == 'motion') { contextName = 'activity-motion-area'; context = $('div[' + activityFormBaseDataAttr + '="' + contextName + '"]'); if (context.children().length > 1) { context.children().last().remove(); } if (context.children().length == 1) { $('button[name="remove_row_motion"]').hide(); } } else if (areaName == 'activity_labels') { contextName = 'activity-labels-area'; context = $('div[' + activityFormBaseDataAttr + '="' + contextName + '"]'); if (context.children().length > 1) { context.children().last().remove(); } if (context.children().length == 1) { $('button[name="remove_row_activity_labels"]').hide(); } } } function initPageBar(response, dto) { var numberOfItems = response.total_number; var currentPage = dto.page; var pageBar = $('#pageBar'); var numberOfPages = Math.ceil(numberOfItems / itemsPerPage); var barContent = ''; if (numberOfPages < 2) { // do not show pagination bar pageBar.hide(); } else { // remake the pagination bar pageBar.html(''); if (numberOfPages == 2) { barContent += '
  • 1
  • '; barContent += '
  • 2
  • '; pageBar.append(barContent); } else { barContent = '
  • Prima
  • '; for (var i = Math.max(1, currentPage-2); i <= Math.min(numberOfPages, currentPage+2); i++) { barContent += '
  • ' + i + '
  • '; } barContent += '
  • Ultima
  • '; pageBar.append(barContent); } // the page bar might have been hidden from a previous filter query pageBar.show(); } } /** * Usage: check all checkboxes from a specific list, determined by contextName * @param checkGroup * @param contextName */ function checkAll(checkGroup, contextName) { $('input[name="participants[' + contextName + '][]"]') .not(checkGroup) .prop('checked', checkGroup.checked); } function checkAll_Groups(checkbox) { $('input[name="apply_groups[]"]').prop('checked', checkbox.checked); } function localStoreGroups(data) { var groupMembers = {}; var groupDetails = {}; var groupLabels = {}; $.each(data, function(key, group) { var entity = {}; entity['name'] = group.name; entity['label'] = group.label; if (!groupLabels[group.id]) { groupLabels[group.id] = []; } groupLabels[group.id].push(group.label); groupDetails[group.id] = entity; groupMembers[group.id] = group.members; }); window.localStorage.removeItem('_groupDetails'); window.localStorage.setItem('_groupDetails', JSON.stringify(groupDetails)); window.localStorage.removeItem('_groupLabels'); window.localStorage.setItem('_groupLabels', JSON.stringify(groupLabels)); window.localStorage.removeItem('_groupMembers'); window.localStorage.setItem('_groupMembers', JSON.stringify(groupMembers)); } /* =================== end of HTML tools =================== */ /* =================== Usual tools =================== */ /** * Return a flipped array * @param arr * @returns {{}|*} */ function flipArray(arr) { arr_flipped={}; $.each(arr, function(idx, value) { arr_flipped[value]=idx; }); return arr_flipped; } /** * Simple tool that merge started date and finished date for an activity * @param startDate * @param endDate * @returns {{started_at: *, finished_at: *}} */ function formatDateInput(startDate, endDate) { return { started_at: startDate, finished_at: endDate }; } function showAlertMessage(type, text, modal) { var typeMap = { error: 'danger', warning: 'warning', info: 'info', success: 'success' }; var alertClass = 'alert-' + typeMap[type]; var alertTextLabel = (type == 'error') ? 'Oups! ' : ''; var cleanUpAlertClass = function(alertDiv) { for (var key in typeMap) { if (typeMap.hasOwnProperty(key) && alertDiv.hasClass('alert-' + typeMap[key])) { alertDiv.removeClass('alert-' + typeMap[key]) } } }; var alertMessageDiv; if (modal) { alertMessageDiv = modal.find('.modal_alert_message'); alertMessageDiv = alertMessageDiv[0]; $(alertMessageDiv).hide(); cleanUpAlertClass($(alertMessageDiv)); $(alertMessageDiv).addClass(alertClass); $(alertMessageDiv).find('[data-context="alert_message_text"]').html(alertTextLabel + text); $(alertMessageDiv).show(); } else { alertMessageDiv = $('#alert_message'); alertMessageDiv.hide(); cleanUpAlertClass(alertMessageDiv); alertMessageDiv.addClass(alertClass); alertMessageDiv.find('[data-context="alert_message_text"]').html(alertTextLabel + text); alertMessageDiv.show(); } } /** * Check password matching * @param new_password * @param old_password * @returns {boolean} */ function checkPasswordMatch(new_password, old_password){ if(new_password.val() && old_password.val()){ return true; } else if(!new_password.val() && !old_password.val()){ return true; } return false; } /** * Get query parameters from url * @param sParam * @returns {boolean} */ function getUrlParameter(sParam) { var sPageURL = decodeURIComponent(window.location.search.substring(1)), sURLVariables = sPageURL.split('&'), sParameterName, i; for (i = 0; i < sURLVariables.length ;i++) { sParameterName = sURLVariables[i].split('='); if (sParameterName[0] === sParam) { return (sParameterName[1]) ? sParameterName[1] : false; } } }