diff --git a/src/assets/js/backend_users.js b/src/assets/js/backend_users.js index 6314b875..55e7c3b7 100644 --- a/src/assets/js/backend_users.js +++ b/src/assets/js/backend_users.js @@ -9,28 +9,40 @@ * @since v1.0.0 * ---------------------------------------------------------------------------- */ +window.BackendUsers = window.BackendUsers || {}; + /** - * This namespace handles the js functionality of the users backend page. It uses three other + * Backend Users + * + * This module handles the js functionality of the users backend page. It uses three other * classes (defined below) in order to handle the admin, provider and secretary record types. * - * @namespace BackendUsers + * @module BackendUsers */ -var BackendUsers = { - MIN_PASSWORD_LENGTH: 7, +(function(exports){ + + 'use strict'; + + /** + * Minimum Password Length + * + * @type {int} + */ + exports.MIN_PASSWORD_LENGTH = 7; /** * Contains the current tab record methods for the page. * * @type AdminsHelper|ProvidersHelper|SecretariesHelper */ - helper: {}, + var helper = {}; /** * Use this class instance for performing actions on the working plan. * * @type {object} */ - wp: {}, + exports.wp = {}; /** * Initialize the backend users page. @@ -38,8 +50,8 @@ var BackendUsers = { * @param {bool} defaultEventHandlers (OPTIONAL) Whether to bind the default event handlers * (default: true). */ - initialize: function(defaultEventHandlers) { - if (defaultEventHandlers == undefined) defaultEventHandlers = true; + exports.initialize = function(defaultEventHandlers) { + defaultEventHandlers = defaultEventHandlers || true; // Initialize jScrollPane Scrollbars $('#filter-admins .results').jScrollPane(); @@ -47,12 +59,13 @@ var BackendUsers = { $('#filter-secretaries .results').jScrollPane(); // Instanciate default helper object (admin). - BackendUsers.helper = new AdminsHelper(); - BackendUsers.helper.resetForm(); - BackendUsers.helper.filter(''); + helper = new AdminsHelper(); + helper.resetForm(); + helper.filter(''); + helper.bindEventHandlers(); - BackendUsers.wp = new WorkingPlan(); - BackendUsers.wp.bindEventHandlers(); + exports.wp = new WorkingPlan(); + exports.wp.bindEventHandlers(); // Fill the services and providers list boxes. var html = '
'; @@ -96,14 +109,16 @@ var BackendUsers = { }); // Bind event handlers. - if (defaultEventHandlers) BackendUsers.bindEventHandlers(); - }, + if (defaultEventHandlers) { + _bindEventHandlers(); + } + }; /** * Binds the defauly backend users event handlers. Do not use this method on a different * page because it needs the backend users page DOM. */ - bindEventHandlers: function() { + function _bindEventHandlers() { /** * Event: Page Tab Button "Click" * @@ -113,27 +128,30 @@ var BackendUsers = { $(this).parent().find('.active').removeClass('active'); $(this).addClass('active'); $('.tab-content').hide(); + $('#admins, #providers, #secretaries').off(); if ($(this).hasClass('admins-tab')) { // display admins tab $('#admins').show(); - BackendUsers.helper = new AdminsHelper(); + helper = new AdminsHelper(); } else if ($(this).hasClass('providers-tab')) { // display providers tab $('#providers').show(); $('#provider-services').data('jsp').destroy(); $('#provider-services').jScrollPane({ mouseWheelSpeed: 70 }); - BackendUsers.helper = new ProvidersHelper(); + helper = new ProvidersHelper(); } else if ($(this).hasClass('secretaries-tab')) { // display secretaries tab $('#secretaries').show(); - BackendUsers.helper = new SecretariesHelper(); + helper = new SecretariesHelper(); // Update the list with the all the available providers. - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_filter_providers'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'key': '' - }; + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_filter_providers', + postData = { + csrfToken: GlobalVariables.csrfToken, + key: '' + }; $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } GlobalVariables.providers = response; @@ -158,8 +176,9 @@ var BackendUsers = { }, 'json').fail(GeneralFunctions.ajaxFailureHandler); } - BackendUsers.helper.resetForm(); - BackendUsers.helper.filter(''); + helper.resetForm(); + helper.filter(''); + helper.bindEventHandlers(); $('.filter-key').val(''); }); @@ -182,15 +201,18 @@ var BackendUsers = { return; } - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_validate_username'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'username': $input.val(), - 'user_id': userId - }; + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_validate_username', + postData = { + csrfToken: GlobalVariables.csrfToken, + username: $input.val(), + user_id: userId + }; $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + if (response == false) { $input.css('border', '2px solid red'); $input.attr('already-exists', 'true'); @@ -205,19 +227,6 @@ var BackendUsers = { } }, 'json').fail(GeneralFunctions.ajaxFailureHandler); }); + }; - // ------------------------------------------------------------------------ - - AdminsHelper.prototype.bindEventHandlers(); - - // ------------------------------------------------------------------------ - - ProvidersHelper.prototype.bindEventHandlers(); - - // ------------------------------------------------------------------------ - - SecretariesHelper.prototype.bindEventHandlers(); - - // ------------------------------------------------------------------------ - } -}; +})(window.BackendUsers); diff --git a/src/assets/js/backend_users_admins.js b/src/assets/js/backend_users_admins.js index 71d2e6b8..a579871f 100644 --- a/src/assets/js/backend_users_admins.js +++ b/src/assets/js/backend_users_admins.js @@ -9,401 +9,418 @@ * @since v1.0.0 * ---------------------------------------------------------------------------- */ -/** - * This class contains the Admins helper class declaration, along with the "Admins" tab - * event handlers. By deviding the backend/users tab functionality into separate files - * it is easier to maintain the code. - * - * @class AdminsHelper - */ -var AdminsHelper = function() { - this.filterResults = {}; // Store the results for later use. -}; +(function() { + + 'use strict'; -/** - * Bind the event handlers for the backend/users "Admins" tab. - */ -AdminsHelper.prototype.bindEventHandlers = function() { /** - * Event: Filter Admins Form "Sumbit" + * This class contains the Admins helper class declaration, along with the "Admins" tab + * event handlers. By deviding the backend/users tab functionality into separate files + * it is easier to maintain the code. * - * Filter the admin records with the given key string. + * @class AdminsHelper */ - $('#filter-admins form').submit(function(event) { - var key = $('#filter-admins .key').val(); - $('#filter-admins .selected-row').removeClass('selected-row'); - BackendUsers.helper.resetForm(); - BackendUsers.helper.filter(key); - return false; - }); + var AdminsHelper = function() { + this.filterResults = []; // Store the results for later use. + }; /** - * Event: Clear Filter Results Button "Click" + * Bind the event handlers for the backend/users "Admins" tab. */ - $('#filter-admins .clear').click(function() { - BackendUsers.helper.filter(''); - $('#filter-admins .key').val(''); - BackendUsers.helper.resetForm(); - }); + AdminsHelper.prototype.bindEventHandlers = function() { + /** + * Event: Filter Admins Form "Sumbit" + * + * Filter the admin records with the given key string. + */ + $('#admins').on('submit', '#filter-admins form', function(event) { + var key = $('#filter-admins .key').val(); + $('#filter-admins .selected-row').removeClass('selected-row'); + this.resetForm(); + this.filter(key); + return false; + }.bind(this)); - /** - * Event: Filter Admin Row "Click" - * - * Display the selected admin data to the user. - */ - $(document).on('click', '.admin-row', function() { - if ($('#filter-admins .filter').prop('disabled')) { + /** + * Event: Clear Filter Results Button "Click" + */ + $('#admins').on('click', '#filter-admins .clear', function() { + this.filter(''); + $('#filter-admins .key').val(''); + this.resetForm(); + }.bind(this)); + + /** + * Event: Filter Admin Row "Click" + * + * Display the selected admin data to the user. + */ + $('#admins').on('click', '.admin-row', function(e) { + if ($('#filter-admins .filter').prop('disabled')) { + $('#filter-admins .results').css('color', '#AAA'); + return; // exit because we are currently on edit mode + } + + var adminId = $(e.currentTarget).attr('data-id'), + admin = {}; + $.each(this.filterResults, function(index, item) { + if (item.id === adminId) { + admin = item; + return false; + } + }); + + this.display(admin); + $('#filter-admins .selected-row').removeClass('selected-row'); + $(e.currentTarget).addClass('selected-row'); + $('#edit-admin, #delete-admin').prop('disabled', false); + }.bind(this)); + + /** + * Event: Add New Admin Button "Click" + */ + $('#admins').on('click', '#add-admin', function() { + this.resetForm(); + $('#admins .add-edit-delete-group').hide(); + $('#admins .save-cancel-group').show(); + $('#admins .details').find('input, textarea').prop('readonly', false); + $('#admin-password, #admin-password-confirm').addClass('required'); + $('#admin-notifications').prop('disabled', false); + $('#filter-admins button').prop('disabled', true); $('#filter-admins .results').css('color', '#AAA'); - return; // exit because we are currently on edit mode - } + }.bind(this)); - var adminId = $(this).attr('data-id'); - var admin = {}; - $.each(BackendUsers.helper.filterResults, function(index, item) { - if (item.id === adminId) { - admin = item; - return false; - } + /** + * Event: Edit Admin Button "Click" + */ + $('#admins').on('click', '#edit-admin', function() { + $('#admins .add-edit-delete-group').hide(); + $('#admins .save-cancel-group').show(); + $('#admins .details').find('input, textarea').prop('readonly', false); + $('#admin-password, #admin-password-confirm').removeClass('required'); + $('#admin-notifications').prop('disabled', false); + + $('#filter-admins .filter').prop('disabled', true); + $('#filter-admins .results').css('color', '#AAA'); }); - BackendUsers.helper.display(admin); - $('#filter-admins .selected-row').removeClass('selected-row'); - $(this).addClass('selected-row'); - $('#edit-admin, #delete-admin').prop('disabled', false); - }); + /** + * Event: Delete Admin Button "Click" + */ + $('#admins').on('click', '#delete-admin', function() { + var adminId = $('#admin-id').val(); - /** - * Event: Add New Admin Button "Click" - */ - $('#add-admin').click(function() { - BackendUsers.helper.resetForm(); - $('#admins .add-edit-delete-group').hide(); - $('#admins .save-cancel-group').show(); - $('#admins .details').find('input, textarea').prop('readonly', false); - $('#admin-password, #admin-password-confirm').addClass('required'); - $('#admin-notifications').prop('disabled', false); - $('#filter-admins button').prop('disabled', true); - $('#filter-admins .results').css('color', '#AAA'); - }); + var messageBtns = {}; + messageBtns[EALang['delete']] = function() { + this.delete(adminId); + $('#message_box').dialog('close'); + }.bind(this); + messageBtns[EALang['cancel']] = function() { + $('#message_box').dialog('close'); + }; - /** - * Event: Edit Admin Button "Click" - */ - $('#edit-admin').click(function() { - $('#admins .add-edit-delete-group').hide(); - $('#admins .save-cancel-group').show(); - $('#admins .details').find('input, textarea').prop('readonly', false); - $('#admin-password, #admin-password-confirm').removeClass('required'); - $('#admin-notifications').prop('disabled', false); + GeneralFunctions.displayMessageBox(EALang['delete_admin'], + EALang['delete_record_prompt'], messageBtns); + }.bind(this)); - $('#filter-admins .filter').prop('disabled', true); - $('#filter-admins .results').css('color', '#AAA'); - }); + /** + * Event: Save Admin Button "Click" + */ + $('#admins').on('click', '#save-admin', function() { + var admin = { + first_name: $('#admin-first-name').val(), + last_name: $('#admin-last-name').val(), + email: $('#admin-email').val(), + mobile_number: $('#admin-mobile-number').val(), + phone_number: $('#admin-phone-number').val(), + address: $('#admin-address').val(), + city: $('#admin-city').val(), + state: $('#admin-state').val(), + zip_code: $('#admin-zip-code').val(), + notes: $('#admin-notes').val(), + settings: { + username: $('#admin-username').val(), + notifications: $('#admin-notifications').hasClass('active') + } + }; - /** - * Event: Delete Admin Button "Click" - */ - $('#delete-admin').click(function() { - var adminId = $('#admin-id').val(); - - var messageBtns = {}; - messageBtns[EALang['delete']] = function() { - BackendUsers.helper.delete(adminId); - $('#message_box').dialog('close'); - }; - messageBtns[EALang['cancel']] = function() { - $('#message_box').dialog('close'); - }; - - GeneralFunctions.displayMessageBox(EALang['delete_admin'], - EALang['delete_record_prompt'], messageBtns); - }); - - /** - * Event: Save Admin Button "Click" - */ - $('#save-admin').click(function() { - var admin = { - 'first_name': $('#admin-first-name').val(), - 'last_name': $('#admin-last-name').val(), - 'email': $('#admin-email').val(), - 'mobile_number': $('#admin-mobile-number').val(), - 'phone_number': $('#admin-phone-number').val(), - 'address': $('#admin-address').val(), - 'city': $('#admin-city').val(), - 'state': $('#admin-state').val(), - 'zip_code': $('#admin-zip-code').val(), - 'notes': $('#admin-notes').val(), - 'settings': { - 'username': $('#admin-username').val(), - 'notifications': $('#admin-notifications').hasClass('active') + // Include password if changed. + if ($('#admin-password').val() !== '') { + admin.settings.password = $('#admin-password').val(); } - }; - // Include password if changed. - if ($('#admin-password').val() !== '') { - admin.settings.password = $('#admin-password').val(); - } + // Include id if changed. + if ($('#admin-id').val() !== '') { + admin.id = $('#admin-id').val(); + } - // Include id if changed. - if ($('#admin-id').val() !== '') { - admin.id = $('#admin-id').val(); - } + if (!this.validate(admin)) { + return; + } - if (!BackendUsers.helper.validate(admin)) return; + this.save(admin); + }.bind(this)); - BackendUsers.helper.save(admin); - }); + /** + * Event: Cancel Admin Button "Click" + * + * Cancel add or edit of an admin record. + */ + $('#admins').on('click', '#cancel-admin', function() { + var id = $('#admin-id').val(); + this.resetForm(); + if (id != '') { + this.select(id, true); + } + }.bind(this)); + }; /** - * Event: Cancel Admin Button "Click" + * Save admin record to database. * - * Cancel add or edit of an admin record. + * @param {object} admin Contains the admin record data. If an 'id' value is provided + * then the update operation is going to be executed. */ - $('#cancel-admin').click(function() { - var id = $('#admin-id').val(); - BackendUsers.helper.resetForm(); - if (id != '') { - BackendUsers.helper.select(id, true); - } - }); -}; + AdminsHelper.prototype.save = function(admin) { + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_save_admin', + postData = { + csrfToken: GlobalVariables.csrfToken, + admin: JSON.stringify(admin) + }; -/** - * Save admin record to database. - * - * @param {object} admin Contains the admin record data. If an 'id' value is provided - * then the update operation is going to be executed. - */ -AdminsHelper.prototype.save = function(admin) { - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_save_admin'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'admin': JSON.stringify(admin) - }; - - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; - Backend.displayNotification(EALang['admin_saved']); - BackendUsers.helper.resetForm(); - $('#filter-admins .key').val(''); - BackendUsers.helper.filter('', response.id, true); - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; - -/** - * Delete an admin record from database. - * - * @param {int} id Record id to be deleted. - */ -AdminsHelper.prototype.delete = function(id) { - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_delete_admin'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'admin_id': id - }; - - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; - Backend.displayNotification(EALang['admin_deleted']); - BackendUsers.helper.resetForm(); - BackendUsers.helper.filter($('#filter-admins .key').val()); - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; - -/** - * Validates an admin record. - * - * @param {object} admin Contains the admin data to be validated. - * @returns {bool} Returns the validation result. - */ -AdminsHelper.prototype.validate = function(admin) { - $('#admins .required').css('border', ''); - $('#admin-password, #admin-password-confirm').css('border', ''); - - try { - // Validate required fields. - var missingRequired = false; - $('#admins .required').each(function() { - if ($(this).val() == '' || $(this).val() == undefined) { - $(this).css('border', '2px solid red'); - missingRequired = true; + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; } - }); - if (missingRequired) { - throw 'Fields with * are required.'; - } - - // Validate passwords. - if ($('#admin-password').val() != $('#admin-password-confirm').val()) { - $('#admin-password, #admin-password-confirm').css('border', '2px solid red'); - throw EALang['passwords_mismatch']; - } - - if ($('#admin-password').val().length < BackendUsers.MIN_PASSWORD_LENGTH - && $('#admin-password').val() != '') { - $('#admin-password, #admin-password-confirm').css('border', '2px solid red'); - - throw EALang['password_length_notice'].replace('$number', BackendUsers.MIN_PASSWORD_LENGTH); - } - - // Validate user email. - if (!GeneralFunctions.validateEmail($('#admin-email').val())) { - $('#admin-email').css('border', '2px solid red'); - throw EALang['invalid_email']; - } - - // Check if username exists - if ($('#admin-username').attr('already-exists') == 'true') { - $('#admin-username').css('border', '2px solid red'); - throw EALang['username_already_exists']; - } - - return true; - } catch(exc) { - $('#admins .form-message').text(exc); - $('#admins .form-message').show(); - return false; - } -}; - -/** - * Resets the admin form back to its initial state. - */ -AdminsHelper.prototype.resetForm = function() { - $('#admins .add-edit-delete-group').show(); - $('#admins .save-cancel-group').hide(); - $('#admins .details').find('input, textarea').prop('readonly', true); - $('#admins .form-message').hide(); - $('#admin-notifications').prop('disabled', true); - $('#admins .required').css('border', ''); - $('#admin-password, #admin-password-confirm').css('border', ''); - $('#admins .details').find('input, textarea').val(''); - $('#admin-notifications').removeClass('active'); - $('#edit-admin, #delete-admin').prop('disabled', true); - - $('#filter-admins .selected-row').removeClass('selected-row'); - $('#filter-admins button').prop('disabled', false); - $('#filter-admins .results').css('color', ''); -}; - -/** - * Display a admin record into the admin form. - * - * @param {object} admin Contains the admin record data. - */ -AdminsHelper.prototype.display = function(admin) { - $('#admin-id').val(admin.id); - $('#admin-first-name').val(admin.first_name); - $('#admin-last-name').val(admin.last_name); - $('#admin-email').val(admin.email); - $('#admin-mobile-number').val(admin.mobile_number); - $('#admin-phone-number').val(admin.phone_number); - $('#admin-address').val(admin.address); - $('#admin-city').val(admin.city); - $('#admin-state').val(admin.state); - $('#admin-zip-code').val(admin.zip_code); - $('#admin-notes').val(admin.notes); - - $('#admin-username').val(admin.settings.username); - if (admin.settings.notifications == true) { - $('#admin-notifications').addClass('active'); - } else { - $('#admin-notifications').removeClass('active'); - } -}; - -/** - * Filters admin records depending a key string. - * - * @param {string} key This string is used to filter the admin records of the database. - * @param {numeric} selectId (OPTIONAL = undefined) This record id will be selected when - * the filter operation is finished. - * @param {bool} display (OPTIONAL = false) If true the selected record data are going - * to be displayed on the details column (requires a selected record though). - */ -AdminsHelper.prototype.filter = function(key, selectId, display) { - if (display == undefined) display = false; - - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_filter_admins'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'key': key + Backend.displayNotification(EALang['admin_saved']); + this.resetForm(); + $('#filter-admins .key').val(''); + this.filter('', response.id, true); + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); }; - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; + /** + * Delete an admin record from database. + * + * @param {int} id Record id to be deleted. + */ + AdminsHelper.prototype.delete = function(id) { + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_delete_admin', + postData = { + csrfToken: GlobalVariables.csrfToken, + admin_id: id + }; - BackendUsers.helper.filterResults = response; + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + Backend.displayNotification(EALang['admin_deleted']); + this.resetForm(); + this.filter($('#filter-admins .key').val()); + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); + }; - $('#filter-admins .results').data('jsp').destroy(); - $('#filter-admins .results').html(''); - $.each(response, function(index, admin) { - var html = AdminsHelper.prototype.getFilterHtml(admin); - $('#filter-admins .results').append(html); - }); - $('#filter-admins .results').jScrollPane({ mouseWheelSpeed: 70 }); + /** + * Validates an admin record. + * + * @param {object} admin Contains the admin data to be validated. + * @returns {bool} Returns the validation result. + */ + AdminsHelper.prototype.validate = function(admin) { + $('#admins .required').css('border', ''); + $('#admin-password, #admin-password-confirm').css('border', ''); - if (response.length == 0) { - $('#filter-admins .results').html('' + EALang['no_records_found'] + '') - } + try { + // Validate required fields. + var missingRequired = false; + $('#admins .required').each(function() { + if ($(this).val() == '' || $(this).val() == undefined) { + $(this).css('border', '2px solid red'); + missingRequired = true; + } + }); + if (missingRequired) { + throw 'Fields with * are required.'; + } - if (selectId != undefined) { - BackendUsers.helper.select(selectId, display); - } - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; + // Validate passwords. + if ($('#admin-password').val() != $('#admin-password-confirm').val()) { + $('#admin-password, #admin-password-confirm').css('border', '2px solid red'); + throw EALang['passwords_mismatch']; + } -/** - * Get an admin row html code that is going to be displayed on the filter results list. - * - * @param {object} admin Contains the admin record data. - * @returns {string} The html code that represents the record on the filter results list. - */ -AdminsHelper.prototype.getFilterHtml = function(admin) { - var name = admin.first_name + ' ' + admin.last_name; - var info = admin.email; - info = (admin.mobile_number != '' && admin.mobile_number != null) - ? info + ', ' + admin.mobile_number : info; - info = (admin.phone_number != '' && admin.phone_number != null) - ? info + ', ' + admin.phone_number : info; + if ($('#admin-password').val().length < BackendUsers.MIN_PASSWORD_LENGTH + && $('#admin-password').val() != '') { + $('#admin-password, #admin-password-confirm').css('border', '2px solid red'); + throw EALang['password_length_notice'].replace('$number', BackendUsers.MIN_PASSWORD_LENGTH); + } - var html = - '
' + - '' + name + '
' + - info + '
' + - '

'; + // Validate user email. + if (!GeneralFunctions.validateEmail($('#admin-email').val())) { + $('#admin-email').css('border', '2px solid red'); + throw EALang['invalid_email']; + } - return html; -}; + // Check if username exists + if ($('#admin-username').attr('already-exists') == 'true') { + $('#admin-username').css('border', '2px solid red'); + throw EALang['username_already_exists']; + } -/** - * Select a specific record from the current filter results. If the admin id does not exist - * in the list then no record will be selected. - * - * @param {numeric} id The record id to be selected from the filter results. - * @param {bool} display (OPTIONAL = false) If true then the method will display the record - * on the form. - */ -AdminsHelper.prototype.select = function(id, display) { - if (display == undefined) display = false; - - $('#filter-admins .selected-row').removeClass('selected-row'); - - $('.admin-row').each(function() { - if ($(this).attr('data-id') == id) { - $(this).addClass('selected-row'); + return true; + } catch(exc) { + $('#admins .form-message').text(exc); + $('#admins .form-message').show(); return false; } - }); + }; - if (display) { - $.each(BackendUsers.helper.filterResults, function(index, admin) { - if (admin.id == id) { - BackendUsers.helper.display(admin); - $('#edit-admin, #delete-admin').prop('disabled', false); + /** + * Resets the admin form back to its initial state. + */ + AdminsHelper.prototype.resetForm = function() { + $('#admins .add-edit-delete-group').show(); + $('#admins .save-cancel-group').hide(); + $('#admins .details').find('input, textarea').prop('readonly', true); + $('#admins .form-message').hide(); + $('#admin-notifications').prop('disabled', true); + $('#admins .required').css('border', ''); + $('#admin-password, #admin-password-confirm').css('border', ''); + $('#admins .details').find('input, textarea').val(''); + $('#admin-notifications').removeClass('active'); + $('#edit-admin, #delete-admin').prop('disabled', true); + + $('#filter-admins .selected-row').removeClass('selected-row'); + $('#filter-admins button').prop('disabled', false); + $('#filter-admins .results').css('color', ''); + }; + + /** + * Display a admin record into the admin form. + * + * @param {object} admin Contains the admin record data. + */ + AdminsHelper.prototype.display = function(admin) { + $('#admin-id').val(admin.id); + $('#admin-first-name').val(admin.first_name); + $('#admin-last-name').val(admin.last_name); + $('#admin-email').val(admin.email); + $('#admin-mobile-number').val(admin.mobile_number); + $('#admin-phone-number').val(admin.phone_number); + $('#admin-address').val(admin.address); + $('#admin-city').val(admin.city); + $('#admin-state').val(admin.state); + $('#admin-zip-code').val(admin.zip_code); + $('#admin-notes').val(admin.notes); + + $('#admin-username').val(admin.settings.username); + if (admin.settings.notifications == true) { + $('#admin-notifications').addClass('active'); + } else { + $('#admin-notifications').removeClass('active'); + } + }; + + /** + * Filters admin records depending a key string. + * + * @param {string} key This string is used to filter the admin records of the database. + * @param {numeric} selectId (OPTIONAL = undefined) This record id will be selected when + * the filter operation is finished. + * @param {bool} display (OPTIONAL = false) If true the selected record data are going + * to be displayed on the details column (requires a selected record though). + */ + AdminsHelper.prototype.filter = function(key, selectId, display) { + display = display || false; + + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_filter_admins', + postData = { + csrfToken: GlobalVariables.csrfToken, + key: key + }; + + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + + this.filterResults = response; + + $('#filter-admins .results').data('jsp').destroy(); + $('#filter-admins .results').html(''); + $.each(response, function(index, admin) { + var html = this.getFilterHtml(admin); + $('#filter-admins .results').append(html); + }.bind(this)); + $('#filter-admins .results').jScrollPane({ mouseWheelSpeed: 70 }); + + if (response.length == 0) { + $('#filter-admins .results').html('' + EALang['no_records_found'] + '') + } + + if (selectId != undefined) { + this.select(selectId, display); + } + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); + }; + + /** + * Get an admin row html code that is going to be displayed on the filter results list. + * + * @param {object} admin Contains the admin record data. + * @returns {string} The html code that represents the record on the filter results list. + */ + AdminsHelper.prototype.getFilterHtml = function(admin) { + var name = admin.first_name + ' ' + admin.last_name, + info = admin.email; + + info = (admin.mobile_number != '' && admin.mobile_number != null) + ? info + ', ' + admin.mobile_number : info; + + info = (admin.phone_number != '' && admin.phone_number != null) + ? info + ', ' + admin.phone_number : info; + + var html = + '
' + + '' + name + '
' + + info + '
' + + '

'; + + return html; + }; + + /** + * Select a specific record from the current filter results. If the admin id does not exist + * in the list then no record will be selected. + * + * @param {numeric} id The record id to be selected from the filter results. + * @param {bool} display (OPTIONAL = false) If true then the method will display the record + * on the form. + */ + AdminsHelper.prototype.select = function(id, display) { + display = display || false; + + $('#filter-admins .selected-row').removeClass('selected-row'); + + $('.admin-row').each(function() { + if ($(this).attr('data-id') == id) { + $(this).addClass('selected-row'); return false; } }); - } -}; + + if (display) { + $.each(this.filterResults, function(index, admin) { + if (admin.id == id) { + this.display(admin); + $('#edit-admin, #delete-admin').prop('disabled', false); + return false; + } + }.bind(this)); + } + }; + + window.AdminsHelper = AdminsHelper; + +})(); diff --git a/src/assets/js/backend_users_providers.js b/src/assets/js/backend_users_providers.js index 92318cfc..1a440270 100644 --- a/src/assets/js/backend_users_providers.js +++ b/src/assets/js/backend_users_providers.js @@ -9,538 +9,561 @@ * @since v1.0.0 * ---------------------------------------------------------------------------- */ -/** - * This class contains the Providers helper class declaration, along with the "Providers" tab - * event handlers. By deviding the backend/users tab functionality into separate files - * it is easier to maintain the code. - * - * @class ProvidersHelper - */ -var ProvidersHelper = function() { - this.filterResults = {}; // Store the results for later use. -}; +(function() { + + 'use strict'; -/** - * Bind the event handlers for the backend/users "Providers" tab. - */ -ProvidersHelper.prototype.bindEventHandlers = function() { /** - * Event: Filter Providers Form "Submit" + * Providers Helper * - * Filter the provider records with the given key string. - */ - $('#filter-providers form').submit(function(event) { - var key = $('#filter-providers .key').val(); - $('.selected-row').removeClass('selected-row'); - BackendUsers.helper.resetForm(); - BackendUsers.helper.filter(key); - return false; - }); - - /** - * Event: Clear Filter Button "Click" - */ - $('#filter-providers .clear').click(function() { - BackendUsers.helper.filter(''); - $('#filter-providers .key').val(''); - BackendUsers.helper.resetForm(); - }); - - /** - * Event: Filter Provider Row "Click" + * This class contains the Providers helper class declaration, along with the "Providers" tab + * event handlers. By deviding the backend/users tab functionality into separate files + * it is easier to maintain the code. * - * Display the selected provider data to the user. + * @class ProvidersHelper */ - $(document).on('click', '.provider-row', function() { - if ($('#filter-providers .filter').prop('disabled')) { + var ProvidersHelper = function() { + this.filterResults = {}; // Store the results for later use. + }; + + /** + * Bind the event handlers for the backend/users "Providers" tab. + */ + ProvidersHelper.prototype.bindEventHandlers = function() { + /** + * Event: Filter Providers Form "Submit" + * + * Filter the provider records with the given key string. + */ + $('#providers').on('submit', '#filter-providers form', function(event) { + var key = $('#filter-providers .key').val(); + $('.selected-row').removeClass('selected-row'); + this.resetForm(); + this.filter(key); + return false; + }.bind(this)); + + /** + * Event: Clear Filter Button "Click" + */ + $('#providers').on('click', '#filter-providers .clear', function() { + this.filter(''); + $('#filter-providers .key').val(''); + this.resetForm(); + }.bind(this)); + + /** + * Event: Filter Provider Row "Click" + * + * Display the selected provider data to the user. + */ + $('#providers').on('click', '.provider-row', function(e) { + if ($('#filter-providers .filter').prop('disabled')) { + $('#filter-providers .results').css('color', '#AAA'); + return; // Exit because we are currently on edit mode. + } + + var providerId = $(e.currentTarget).attr('data-id'), + provider = {}; + $.each(this.filterResults, function(index, item) { + if (item.id === providerId) { + provider = item; + return false; + } + }); + + this.display(provider); + $('#filter-providers .selected-row').removeClass('selected-row'); + $(e.currentTarget).addClass('selected-row'); + $('#edit-provider, #delete-provider').prop('disabled', false); + }.bind(this)); + + /** + * Event: Add New Provider Button "Click" + */ + $('#providers').on('click', '#add-provider', function() { + this.resetForm(); + $('#filter-providers button').prop('disabled', true); $('#filter-providers .results').css('color', '#AAA'); - return; // Exit because we are currently on edit mode. - } + $('#providers .add-edit-delete-group').hide(); + $('#providers .save-cancel-group').show(); + $('#providers .details').find('input, textarea').prop('readonly', false); + $('#provider-password, #provider-password-confirm').addClass('required'); + $('#provider-notifications').prop('disabled', false); + $('#providers').find('.add-break, .edit-break, .delete-break, #reset-working-plan').prop('disabled', false); + $('#provider-services input[type="checkbox"]').prop('disabled', false); + $('#providers input[type="checkbox"]').prop('disabled', false); - var providerId = $(this).attr('data-id'); - var provider = {}; - $.each(BackendUsers.helper.filterResults, function(index, item) { - if (item.id === providerId) { - provider = item; - return false; - } + // Apply default working plan + BackendUsers.wp.setup(GlobalVariables.workingPlan); + BackendUsers.wp.timepickers(false); + }.bind(this)); + + /** + * Event: Edit Provider Button "Click" + */ + $('#providers').on('click', '#edit-provider', function() { + $('#providers .add-edit-delete-group').hide(); + $('#providers .save-cancel-group').show(); + $('#filter-providers button').prop('disabled', true); + $('#filter-providers .results').css('color', '#AAA'); + $('#providers .details').find('input, textarea').prop('readonly', false); + $('#provider-password, #provider-password-confirm').removeClass('required'); + $('#provider-notifications').prop('disabled', false); + $('#provider-services input[type="checkbox"]').prop('disabled', false); + $('#providers').find('.add-break, .edit-break, .delete-break, #reset-working-plan').prop('disabled', false); + $('#providers input[type="checkbox"]').prop('disabled', false); + BackendUsers.wp.timepickers(false); }); - BackendUsers.helper.display(provider); - $('#filter-providers .selected-row').removeClass('selected-row'); - $(this).addClass('selected-row'); - $('#edit-provider, #delete-provider').prop('disabled', false); - }); + /** + * Event: Delete Provider Button "Click" + */ + $('#providers').on('click', '#delete-provider', function() { + var providerId = $('#provider-id').val(); - /** - * Event: Add New Provider Button "Click" - */ - $('#add-provider').click(function() { - BackendUsers.helper.resetForm(); - $('#filter-providers button').prop('disabled', true); - $('#filter-providers .results').css('color', '#AAA'); - $('#providers .add-edit-delete-group').hide(); - $('#providers .save-cancel-group').show(); - $('#providers .details').find('input, textarea').prop('readonly', false); - $('#provider-password, #provider-password-confirm').addClass('required'); - $('#provider-notifications').prop('disabled', false); - $('#providers').find('.add-break, .edit-break, .delete-break, #reset-working-plan').prop('disabled', false); - $('#provider-services input[type="checkbox"]').prop('disabled', false); - $('#providers input[type="checkbox"]').prop('disabled', false); + var messageBtns = {}; + messageBtns[EALang['delete']] = function() { + this.delete(providerId); + $('#message_box').dialog('close'); + }.bind(this); + messageBtns[EALang['cancel']] = function() { + $('#message_box').dialog('close'); + }; - // Apply default working plan - BackendUsers.wp.setup(GlobalVariables.workingPlan); - BackendUsers.wp.timepickers(false); - }); + GeneralFunctions.displayMessageBox(EALang['delete_provider'], + EALang['delete_record_prompt'], messageBtns); + }.bind(this)); - /** - * Event: Edit Provider Button "Click" - */ - $('#edit-provider').click(function() { - $('#providers .add-edit-delete-group').hide(); - $('#providers .save-cancel-group').show(); - $('#filter-providers button').prop('disabled', true); - $('#filter-providers .results').css('color', '#AAA'); - $('#providers .details').find('input, textarea').prop('readonly', false); - $('#provider-password, #provider-password-confirm').removeClass('required'); - $('#provider-notifications').prop('disabled', false); - $('#provider-services input[type="checkbox"]').prop('disabled', false); - $('#providers').find('.add-break, .edit-break, .delete-break, #reset-working-plan').prop('disabled', false); - $('#providers input[type="checkbox"]').prop('disabled', false); - BackendUsers.wp.timepickers(false); - }); + /** + * Event: Save Provider Button "Click" + */ + $('#providers').on('click', '#save-provider', function() { + var provider = { + first_name: $('#provider-first-name').val(), + last_name: $('#provider-last-name').val(), + email: $('#provider-email').val(), + mobile_number: $('#provider-mobile-number').val(), + phone_number: $('#provider-phone-number').val(), + address: $('#provider-address').val(), + city: $('#provider-city').val(), + state: $('#provider-state').val(), + zip_code: $('#provider-zip-code').val(), + notes: $('#provider-notes').val(), + settings: { + username: $('#provider-username').val(), + working_plan: JSON.stringify(BackendUsers.wp.get()), + notifications: $('#provider-notifications').hasClass('active') + } + }; - /** - * Event: Delete Provider Button "Click" - */ - $('#delete-provider').click(function() { - var providerId = $('#provider-id').val(); + // Include provider services. + provider.services = []; + $('#provider-services input[type="checkbox"]').each(function() { + if ($(this).prop('checked')) { + provider.services.push($(this).attr('data-id')); + } + }); - var messageBtns = {}; - messageBtns[EALang['delete']] = function() { - BackendUsers.helper.delete(providerId); - $('#message_box').dialog('close'); - }; - messageBtns[EALang['cancel']] = function() { - $('#message_box').dialog('close'); - }; - - GeneralFunctions.displayMessageBox(EALang['delete_provider'], - EALang['delete_record_prompt'], messageBtns); - }); - - /** - * Event: Save Provider Button "Click" - */ - $('#save-provider').click(function() { - var provider = { - 'first_name': $('#provider-first-name').val(), - 'last_name': $('#provider-last-name').val(), - 'email': $('#provider-email').val(), - 'mobile_number': $('#provider-mobile-number').val(), - 'phone_number': $('#provider-phone-number').val(), - 'address': $('#provider-address').val(), - 'city': $('#provider-city').val(), - 'state': $('#provider-state').val(), - 'zip_code': $('#provider-zip-code').val(), - 'notes': $('#provider-notes').val(), - 'settings': { - 'username': $('#provider-username').val(), - 'working_plan': JSON.stringify(BackendUsers.wp.get()), - 'notifications': $('#provider-notifications').hasClass('active') + // Include password if changed. + if ($('#provider-password').val() !== '') { + provider.settings.password = $('#provider-password').val(); } - }; - // Include provider services. - provider.services = []; - $('#provider-services input[type="checkbox"]').each(function() { - if ($(this).prop('checked')) { - provider.services.push($(this).attr('data-id')); + // Include id if changed. + if ($('#provider-id').val() !== '') { + provider.id = $('#provider-id').val(); } + + if (!this.validate(provider)) { + return; + } + + this.save(provider); + }.bind(this)); + + /** + * Event: Cancel Provider Button "Click" + * + * Cancel add or edit of an provider record. + */ + $('#providers').on('click', '#cancel-provider', function() { + var id = $('#filter-providers .selected-row').attr('data-id'); + this.resetForm(); + if (id != '') { + this.select(id, true); + } + }.bind(this)); + + /** + * Event: Display Provider Details "Click" + */ + $('#providers').on('click', '.display-details', function() { + $('#providers .switch-view .current').removeClass('current'); + $(this).addClass('current'); + $('.working-plan-view').hide('fade', function() { + $('.details-view').show('fade'); + }); }); - // Include password if changed. - if ($('#provider-password').val() !== '') { - provider.settings.password = $('#provider-password').val(); - } + /** + * Event: Display Provider Working Plan "Click" + */ + $('#providers').on('click', '.display-working-plan', function() { + $('#providers .switch-view .current').removeClass('current'); + $(this).addClass('current'); + $('.details-view').hide('fade', function() { + $('.working-plan-view').show('fade'); + }); + }); - // Include id if changed. - if ($('#provider-id').val() !== '') { - provider.id = $('#provider-id').val(); - } - - if (!BackendUsers.helper.validate(provider)) return; - - BackendUsers.helper.save(provider); - }); + /** + * Event: Reset Working Plan Button "Click". + */ + $('#providers').on('click', '#reset-working-plan', function() { + $('.breaks').empty(); + $('.work-start, .work-end').val(''); + BackendUsers.wp.setup(GlobalVariables.workingPlan); + BackendUsers.wp.timepickers(false); + }); + }; /** - * Event: Cancel Provider Button "Click" + * Save provider record to database. * - * Cancel add or edit of an provider record. + * @param {object} provider Contains the admin record data. If an 'id' value is provided + * then the update operation is going to be executed. */ - $('#cancel-provider').click(function() { - var id = $('#filter-providers .selected-row').attr('data-id'); - BackendUsers.helper.resetForm(); - if (id != '') { - BackendUsers.helper.select(id, true); - } - }); + ProvidersHelper.prototype.save = function(provider) { + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_save_provider', + postData = { + csrfToken: GlobalVariables.csrfToken, + provider: JSON.stringify(provider) + }; - /** - * Event: Display Provider Details "Click" - */ - $('#providers .display-details').click(function() { - $('#providers .switch-view .current').removeClass('current'); - $(this).addClass('current'); - $('.working-plan-view').hide('fade', function() { - $('.details-view').show('fade'); - }); - }); - - /** - * Event: Display Provider Working Plan "Click" - */ - $('#providers .display-working-plan').click(function() { - $('#providers .switch-view .current').removeClass('current'); - $(this).addClass('current'); - $('.details-view').hide('fade', function() { - $('.working-plan-view').show('fade'); - }); - }); - - /** - * Event: Reset Working Plan Button "Click". - */ - $('#reset-working-plan').click(function() { - $('.breaks').empty(); - $('.work-start, .work-end').val(''); - BackendUsers.wp.setup(GlobalVariables.workingPlan); - BackendUsers.wp.timepickers(false); - }); -}; - -/** - * Save provider record to database. - * - * @param {object} provider Contains the admin record data. If an 'id' value is provided - * then the update operation is going to be executed. - */ -ProvidersHelper.prototype.save = function(provider) { - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_save_provider'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'provider': JSON.stringify(provider) - }; - - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; - Backend.displayNotification(EALang['provider_saved']); - BackendUsers.helper.resetForm(); - $('#filter-providers .key').val(''); - BackendUsers.helper.filter('', response.id, true); - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; - -/** - * Delete a provider record from database. - * - * @param {numeric} id Record id to be deleted. - */ -ProvidersHelper.prototype.delete = function(id) { - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_delete_provider'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'provider_id': id - }; - - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; - Backend.displayNotification(EALang['provider_deleted']); - BackendUsers.helper.resetForm(); - BackendUsers.helper.filter($('#filter-providers .key').val()); - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; - -/** - * Validates a provider record. - * - * @param {object} provider Contains the admin data to be validated. - * @returns {bool} Returns the validation result. - */ -ProvidersHelper.prototype.validate = function(provider) { - $('#providers .required').css('border', ''); - $('#provider-password, #provider-password-confirm').css('border', ''); - - try { - // Validate required fields. - var missingRequired = false; - $('#providers .required').each(function() { - if ($(this).val() == '' || $(this).val() == undefined) { - $(this).css('border', '2px solid red'); - missingRequired = true; + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; } - }); - if (missingRequired) { - throw EALang['fields_are_required']; - } - - // Validate passwords. - if ($('#provider-password').val() != $('#provider-password-confirm').val()) { - $('#provider-password, #provider-password-confirm').css('border', '2px solid red'); - throw EALang['passwords_mismatch']; - } - - if ($('#provider-password').val().length < BackendUsers.MIN_PASSWORD_LENGTH - && $('#provider-password').val() != '') { - $('#provider-password, #provider-password-confirm').css('border', '2px solid red'); - throw EALang['password_length_notice'].replace('$number', BackendUsers.MIN_PASSWORD_LENGTH); - } - - // Validate user email. - if (!GeneralFunctions.validateEmail($('#provider-email').val())) { - $('#provider-email').css('border', '2px solid red'); - throw EALang['invalid_email']; - } - - // Check if username exists - if ($('#provider-username').attr('already-exists') == 'true') { - $('#provider-username').css('border', '2px solid red'); - throw EALang['username_already_exists']; - } - - return true; - } catch(exc) { - $('#providers .form-message').text(exc); - $('#providers .form-message').show(); - return false; - } -}; - -/** - * Resets the admin tab form back to its initial state. - */ -ProvidersHelper.prototype.resetForm = function() { - $('#filter-providers .selected-row').removeClass('selected-row'); - $('#filter-providers button').prop('disabled', false); - $('#filter-providers .results').css('color', ''); - - $('#providers .add-edit-delete-group').show(); - $('#providers .save-cancel-group').hide(); - $('#providers .details').find('input, textarea').prop('readonly', true); - $('#providers .form-message').hide(); - $('#provider-notifications').removeClass('active'); - $('#provider-notifications').prop('disabled', true); - $('#provider-services input[type="checkbox"]').prop('disabled', true); - $('#providers .required').css('border', ''); - $('#provider-password, #provider-password-confirm').css('border', ''); - $('#providers .add-break, #reset-working-plan').prop('disabled', true); - BackendUsers.wp.timepickers(true); - $('#providers .working-plan input[type="text"]').timepicker('destroy'); - $('#providers .working-plan input[type="checkbox"]').prop('disabled', true); - $('.breaks').find('.edit-break, .delete-break').prop('disabled', true); - - $('#edit-provider, #delete-provider').prop('disabled', true); - $('#providers .details').find('input, textarea').val(''); - $('#providers input[type="checkbox"]').prop('checked', false); - $('#provider-services input[type="checkbox"]').prop('checked', false); - $('#providers .breaks tbody').empty(); - -}; - -/** - * Display a provider record into the admin form. - * - * @param {object} provider Contains the provider record data. - */ -ProvidersHelper.prototype.display = function(provider) { - $('#provider-id').val(provider.id); - $('#provider-first-name').val(provider.first_name); - $('#provider-last-name').val(provider.last_name); - $('#provider-email').val(provider.email); - $('#provider-mobile-number').val(provider.mobile_number); - $('#provider-phone-number').val(provider.phone_number); - $('#provider-address').val(provider.address); - $('#provider-city').val(provider.city); - $('#provider-state').val(provider.state); - $('#provider-zip-code').val(provider.zip_code); - $('#provider-notes').val(provider.notes); - - $('#provider-username').val(provider.settings.username); - if (provider.settings.notifications == true) { - $('#provider-notifications').addClass('active'); - } else { - $('#provider-notifications').removeClass('active'); - } - - $('#provider-services input[type="checkbox"]').prop('checked', false); - $.each(provider.services, function(index, serviceId) { - $('#provider-services input[type="checkbox"]').each(function() { - if ($(this).attr('data-id') == serviceId) { - $(this).prop('checked', true); - } - }); - }); - - // Display working plan - $('#providers .breaks tbody').empty(); - var workingPlan = $.parseJSON(provider.settings.working_plan); - BackendUsers.wp.setup(workingPlan); - $('.breaks').find('.edit-break, .delete-break').prop('disabled', true); -}; - -/** - * Filters provider records depending a string key. - * - * @param {string} key This is used to filter the provider records of the database. - * @param {numeric} selectId (OPTIONAL = undefined) If set, when the function is complete - * a result row can be set as selected. - * @param {bool} display (OPTIONAL = false) If true then the selected record will be also - * displayed. - */ -ProvidersHelper.prototype.filter = function(key, selectId, display) { - if (display == undefined) display = false; - - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_filter_providers'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'key': key + Backend.displayNotification(EALang['provider_saved']); + this.resetForm(); + $('#filter-providers .key').val(''); + this.filter('', response.id, true); + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); }; - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; + /** + * Delete a provider record from database. + * + * @param {numeric} id Record id to be deleted. + */ + ProvidersHelper.prototype.delete = function(id) { + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_delete_provider', + postData = { + csrfToken: GlobalVariables.csrfToken, + provider_id: id + }; - BackendUsers.helper.filterResults = response; + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + Backend.displayNotification(EALang['provider_deleted']); + this.resetForm(); + this.filter($('#filter-providers .key').val()); + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); + }; + /** + * Validates a provider record. + * + * @param {object} provider Contains the admin data to be validated. + * @returns {bool} Returns the validation result. + */ + ProvidersHelper.prototype.validate = function(provider) { + $('#providers .required').css('border', ''); + $('#provider-password, #provider-password-confirm').css('border', ''); - $('#filter-providers .results').data('jsp').destroy; - $('#filter-providers .results').html(''); - $.each(response, function(index, provider) { - var html = ProvidersHelper.prototype.getFilterHtml(provider); - $('#filter-providers .results').append(html); - }); - $('#filter-providers .results').jScrollPane({ mouseWheelSpeed: 70 }); + try { + // Validate required fields. + var missingRequired = false; + $('#providers .required').each(function() { + if ($(this).val() == '' || $(this).val() == undefined) { + $(this).css('border', '2px solid red'); + missingRequired = true; + } + }); + if (missingRequired) { + throw EALang['fields_are_required']; + } - if (response.length == 0) { - $('#filter-providers .results').html('' + EALang['no_records_found'] + '') - } + // Validate passwords. + if ($('#provider-password').val() != $('#provider-password-confirm').val()) { + $('#provider-password, #provider-password-confirm').css('border', '2px solid red'); + throw EALang['passwords_mismatch']; + } - if (selectId != undefined) { - BackendUsers.helper.select(selectId, display); - } - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; + if ($('#provider-password').val().length < BackendUsers.MIN_PASSWORD_LENGTH + && $('#provider-password').val() != '') { + $('#provider-password, #provider-password-confirm').css('border', '2px solid red'); + throw EALang['password_length_notice'].replace('$number', BackendUsers.MIN_PASSWORD_LENGTH); + } -/** - * Get an provider row html code that is going to be displayed on the filter results list. - * - * @param {object} provider Contains the provider record data. - * @returns {string} The html code that represents the record on the filter results list. - */ -ProvidersHelper.prototype.getFilterHtml = function(provider) { - var name = provider.first_name + ' ' + provider.last_name; - var info = provider.email; - info = (provider.mobile_number != '' && provider.mobile_number != null) - ? info + ', ' + provider.mobile_number : info; - info = (provider.phone_number != '' && provider.phone_number != null) - ? info + ', ' + provider.phone_number : info; + // Validate user email. + if (!GeneralFunctions.validateEmail($('#provider-email').val())) { + $('#provider-email').css('border', '2px solid red'); + throw EALang['invalid_email']; + } - var html = - '
' + - '' + name + '
' + - info + '
' + - '

'; + // Check if username exists + if ($('#provider-username').attr('already-exists') == 'true') { + $('#provider-username').css('border', '2px solid red'); + throw EALang['username_already_exists']; + } - return html; -}; - -/** - * Initialize the editable functionality to the break day table cells. - * - * @param {object} $selector The cells to be initialized. - */ -ProvidersHelper.prototype.editableBreakDay = function($selector) { - var weekDays = {}; - weekDays[EALang['monday']] = 'Monday'; - weekDays[EALang['tuesday']] = 'Tuesday'; - weekDays[EALang['wednesday']] = 'Wednesday'; - weekDays[EALang['thursday']] = 'Thursday'; - weekDays[EALang['friday']] = 'Friday'; - weekDays[EALang['saturday']] = 'Saturday'; - weekDays[EALang['sunday']] = 'Sunday'; - - - $selector.editable(function(value, settings) { - return value; - }, { - 'type': 'select', - // 'data': '{ "Monday": "Monday", "Tuesday": "Tuesday", "Wednesday": "Wednesday", ' - // + '"Thursday": "Thursday", "Friday": "Friday", "Saturday": "Saturday", ' - // + '"Sunday": "Sunday", "selected": "Monday"}', - 'data': weekDays, - 'event': 'edit', - 'height': '30px', - 'submit': '', - 'cancel': '', - 'onblur': 'ignore', - 'onreset': function(settings, td) { - if (!BackendUsers.enableCancel) return false; // disable ESC button - }, - 'onsubmit': function(settings, td) { - if (!BackendUsers.enableSubmit) return false; // disable Enter button - } - }); -}; - -/** - * Initialize the editable functionality to the break time table cells. - * - * @param {object} $selector The cells to be initialized. - */ -ProvidersHelper.prototype.editableBreakTime = function($selector) { - $selector.editable(function(value, settings) { - // Do not return the value because the user needs to press the "Save" button. - return value; - }, { - 'event': 'edit', - 'height': '25px', - 'submit': '', - 'cancel': '', - 'onblur': 'ignore', - 'onreset': function(settings, td) { - if (!BackendUsers.enableCancel) return false; // disable ESC button - }, - 'onsubmit': function(settings, td) { - if (!BackendUsers.enableSubmit) return false; // disable Enter button - } - }); -}; - -/** - * Select and display a providers filter result on the form. - * - * @param {numeric} id Record id to be selected. - * @param {bool} display (OPTIONAL = false) If true the record will be displayed on the form. - */ -ProvidersHelper.prototype.select = function(id, display) { - if (display == undefined) display = false; - - // Select record in filter results. - $('#filter-providers .provider-row').each(function() { - if ($(this).attr('data-id') == id) { - $(this).addClass('selected-row'); + return true; + } catch(exc) { + $('#providers .form-message').text(exc); + $('#providers .form-message').show(); return false; } - }); + }; - // Display record in form (if display = true). - if (display) { - $.each(BackendUsers.helper.filterResults, function(index, provider) { - if (provider.id == id) { - BackendUsers.helper.display(provider); - $('#edit-provider, #delete-provider').prop('disabled', false); + /** + * Resets the admin tab form back to its initial state. + */ + ProvidersHelper.prototype.resetForm = function() { + $('#filter-providers .selected-row').removeClass('selected-row'); + $('#filter-providers button').prop('disabled', false); + $('#filter-providers .results').css('color', ''); + + $('#providers .add-edit-delete-group').show(); + $('#providers .save-cancel-group').hide(); + $('#providers .details').find('input, textarea').prop('readonly', true); + $('#providers .form-message').hide(); + $('#provider-notifications').removeClass('active'); + $('#provider-notifications').prop('disabled', true); + $('#provider-services input[type="checkbox"]').prop('disabled', true); + $('#providers .required').css('border', ''); + $('#provider-password, #provider-password-confirm').css('border', ''); + $('#providers .add-break, #reset-working-plan').prop('disabled', true); + BackendUsers.wp.timepickers(true); + $('#providers .working-plan input[type="text"]').timepicker('destroy'); + $('#providers .working-plan input[type="checkbox"]').prop('disabled', true); + $('.breaks').find('.edit-break, .delete-break').prop('disabled', true); + + $('#edit-provider, #delete-provider').prop('disabled', true); + $('#providers .details').find('input, textarea').val(''); + $('#providers input[type="checkbox"]').prop('checked', false); + $('#provider-services input[type="checkbox"]').prop('checked', false); + $('#providers .breaks tbody').empty(); + }; + + /** + * Display a provider record into the admin form. + * + * @param {object} provider Contains the provider record data. + */ + ProvidersHelper.prototype.display = function(provider) { + $('#provider-id').val(provider.id); + $('#provider-first-name').val(provider.first_name); + $('#provider-last-name').val(provider.last_name); + $('#provider-email').val(provider.email); + $('#provider-mobile-number').val(provider.mobile_number); + $('#provider-phone-number').val(provider.phone_number); + $('#provider-address').val(provider.address); + $('#provider-city').val(provider.city); + $('#provider-state').val(provider.state); + $('#provider-zip-code').val(provider.zip_code); + $('#provider-notes').val(provider.notes); + + $('#provider-username').val(provider.settings.username); + if (provider.settings.notifications == true) { + $('#provider-notifications').addClass('active'); + } else { + $('#provider-notifications').removeClass('active'); + } + + $('#provider-services input[type="checkbox"]').prop('checked', false); + $.each(provider.services, function(index, serviceId) { + $('#provider-services input[type="checkbox"]').each(function() { + if ($(this).attr('data-id') == serviceId) { + $(this).prop('checked', true); + } + }); + }); + + // Display working plan + $('#providers .breaks tbody').empty(); + var workingPlan = $.parseJSON(provider.settings.working_plan); + BackendUsers.wp.setup(workingPlan); + $('.breaks').find('.edit-break, .delete-break').prop('disabled', true); + }; + + /** + * Filters provider records depending a string key. + * + * @param {string} key This is used to filter the provider records of the database. + * @param {numeric} selectId (OPTIONAL = undefined) If set, when the function is complete + * a result row can be set as selected. + * @param {bool} display (OPTIONAL = false) If true then the selected record will be also + * displayed. + */ + ProvidersHelper.prototype.filter = function(key, selectId, display) { + display = display || false; + + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_filter_providers', + postData = { + csrfToken: GlobalVariables.csrfToken, + key: key + }; + + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + + this.filterResults = response; + + $('#filter-providers .results').data('jsp').destroy; + $('#filter-providers .results').html(''); + $.each(response, function(index, provider) { + var html = this.getFilterHtml(provider); + $('#filter-providers .results').append(html); + }.bind(this)); + $('#filter-providers .results').jScrollPane({ mouseWheelSpeed: 70 }); + + if (response.length == 0) { + $('#filter-providers .results').html('' + EALang['no_records_found'] + '') + } + + if (selectId != undefined) { + this.select(selectId, display); + } + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); + }; + + /** + * Get an provider row html code that is going to be displayed on the filter results list. + * + * @param {object} provider Contains the provider record data. + * @returns {string} The html code that represents the record on the filter results list. + */ + ProvidersHelper.prototype.getFilterHtml = function(provider) { + var name = provider.first_name + ' ' + provider.last_name, + info = provider.email; + + info = (provider.mobile_number != '' && provider.mobile_number != null) + ? info + ', ' + provider.mobile_number : info; + + info = (provider.phone_number != '' && provider.phone_number != null) + ? info + ', ' + provider.phone_number : info; + + var html = + '
' + + '' + name + '
' + + info + '
' + + '

'; + + return html; + }; + + /** + * Initialize the editable functionality to the break day table cells. + * + * @param {object} $selector The cells to be initialized. + */ + ProvidersHelper.prototype.editableBreakDay = function($selector) { + var weekDays = {}; + weekDays[EALang['monday']] = 'Monday'; + weekDays[EALang['tuesday']] = 'Tuesday'; + weekDays[EALang['wednesday']] = 'Wednesday'; + weekDays[EALang['thursday']] = 'Thursday'; + weekDays[EALang['friday']] = 'Friday'; + weekDays[EALang['saturday']] = 'Saturday'; + weekDays[EALang['sunday']] = 'Sunday'; + + + $selector.editable(function(value, settings) { + return value; + }, { + type: 'select', + data: weekDays, + event: 'edit', + height: '30px', + submit: '', + cancel: '', + onblur: 'ignore', + onreset: function(settings, td) { + if (!BackendUsers.enableCancel) { + return false; // disable ESC button + } + }, + onsubmit: function(settings, td) { + if (!BackendUsers.enableSubmit) { + return false; // disable Enter button + } + } + }); + }; + + /** + * Initialize the editable functionality to the break time table cells. + * + * @param {object} $selector The cells to be initialized. + */ + ProvidersHelper.prototype.editableBreakTime = function($selector) { + $selector.editable(function(value, settings) { + // Do not return the value because the user needs to press the "Save" button. + return value; + }, { + event: 'edit', + height: '25px', + submit: '', + cancel: '', + onblur: 'ignore', + onreset: function(settings, td) { + if (!BackendUsers.enableCancel) { + return false; // disable ESC button + } + }, + onsubmit: function(settings, td) { + if (!BackendUsers.enableSubmit) { + return false; // disable Enter button + } + } + }); + }; + + /** + * Select and display a providers filter result on the form. + * + * @param {numeric} id Record id to be selected. + * @param {bool} display (OPTIONAL = false) If true the record will be displayed on the form. + */ + ProvidersHelper.prototype.select = function(id, display) { + display = display || false; + + // Select record in filter results. + $('#filter-providers .provider-row').each(function() { + if ($(this).attr('data-id') == id) { + $(this).addClass('selected-row'); return false; } }); - } -}; + + // Display record in form (if display = true). + if (display) { + $.each(this.filterResults, function(index, provider) { + if (provider.id == id) { + this.display(provider); + $('#edit-provider, #delete-provider').prop('disabled', false); + return false; + } + }.bind(this)); + } + }; + + window.ProvidersHelper = ProvidersHelper; + +})(); diff --git a/src/assets/js/backend_users_secretaries.js b/src/assets/js/backend_users_secretaries.js index 076af921..6f9fccee 100644 --- a/src/assets/js/backend_users_secretaries.js +++ b/src/assets/js/backend_users_secretaries.js @@ -9,422 +9,442 @@ * @since v1.0.0 * ---------------------------------------------------------------------------- */ -/** - * This class contains the Secretaries helper class declaration, along with the "Secretaries" - * tab event handlers. By deviding the backend/users tab functionality into separate files - * it is easier to maintain the code. - * - * @class SecretariesHelper - */ -var SecretariesHelper = function() { - this.filterResults = {}; // Store the results for later use. -}; +(function() { + + 'use strict'; -/** - * Bind the event handlers for the backend/users "Secretaries" tab. - */ -SecretariesHelper.prototype.bindEventHandlers = function() { /** - * Event: Filter Secretaries Form "Submit" + * Secretaries Helper * - * Filter the secretary records with the given key string. - */ - $('#filter-secretaries form').submit(function(event) { - var key = $('#filter-secretaries .key').val(); - $('#filter-secretaries .selected-row').removeClass('selected-row'); - BackendUsers.helper.resetForm(); - BackendUsers.helper.filter(key); - return false; - }); - - /** - * Event: Clear Filter Results Button "Click" - */ - $('#filter-secretaries .clear').click(function() { - BackendUsers.helper.filter(''); - $('#filter-secretaries .key').val(''); - BackendUsers.helper.resetForm(); - }); - - /** - * Event: Filter Secretary Row "Click" + * This class contains the Secretaries helper class declaration, along with the "Secretaries" + * tab event handlers. By deviding the backend/users tab functionality into separate files + * it is easier to maintain the code. * - * Display the selected secretary data to the user. + * @class SecretariesHelper */ - $(document).on('click', '.secretary-row', function() { - if ($('#filter-secretaries .filter').prop('disabled')) { - $('#filter-secretaries .results').css('color', '#AAA'); - return; // exit because we are currently on edit mode - } - - var secretaryId = $(this).attr('data-id'); - var secretary = {}; - $.each(BackendUsers.helper.filterResults, function(index, item) { - if (item.id === secretaryId) { - secretary = item; - return false; - } - }); - - BackendUsers.helper.display(secretary); - $('#filter-secretaries .selected-row').removeClass('selected-row'); - $(this).addClass('selected-row'); - $('#edit-secretary, #delete-secretary').prop('disabled', false); - }); - - /** - * Event: Add New Secretary Button "Click" - */ - $('#add-secretary').click(function() { - BackendUsers.helper.resetForm(); - $('#filter-secretaries button').prop('disabled', true); - $('#filter-secretaries .results').css('color', '#AAA'); - - $('#secretaries .add-edit-delete-group').hide(); - $('#secretaries .save-cancel-group').show(); - $('#secretaries .details').find('input, textarea').prop('readonly', false); - $('#secretary-password, #secretary-password-confirm').addClass('required'); - $('#secretary-notifications').prop('disabled', false); - $('#secretary-providers input[type="checkbox"]').prop('disabled', false); - }); - - /** - * Event: Edit Secretary Button "Click" - */ - $('#edit-secretary').click(function() { - $('#filter-secretaries button').prop('disabled', true); - $('#filter-secretaries .results').css('color', '#AAA'); - - $('#secretaries .add-edit-delete-group').hide(); - $('#secretaries .save-cancel-group').show(); - $('#secretaries .details').find('input, textarea').prop('readonly', false); - $('#secretary-password, #secretary-password-confirm').removeClass('required'); - $('#secretary-notifications').prop('disabled', false); - $('#secretary-providers input[type="checkbox"]').prop('disabled', false); - }); - - /** - * Event: Delete Secretary Button "Click" - */ - $('#delete-secretary').click(function() { - var secretaryId = $('#secretary-id').val(); - - var messageBtns = {}; - messageBtns[EALang['delete']] = function() { - BackendUsers.helper.delete(secretaryId); - $('#message_box').dialog('close'); - }; - messageBtns[EALang['cancel']] = function() { - $('#message_box').dialog('close'); - }; - - GeneralFunctions.displayMessageBox(EALang['delete_secretary'], - EALang['delete_record_prompt'], messageBtns); - }); - - /** - * Event: Save Secretary Button "Click" - */ - $('#save-secretary').click(function() { - var secretary = { - 'first_name': $('#secretary-first-name').val(), - 'last_name': $('#secretary-last-name').val(), - 'email': $('#secretary-email').val(), - 'mobile_number': $('#secretary-mobile-number').val(), - 'phone_number': $('#secretary-phone-number').val(), - 'address': $('#secretary-address').val(), - 'city': $('#secretary-city').val(), - 'state': $('#secretary-state').val(), - 'zip_code': $('#secretary-zip-code').val(), - 'notes': $('#secretary-notes').val(), - 'settings': { - 'username': $('#secretary-username').val(), - 'notifications': $('#secretary-notifications').hasClass('active') - } - }; - - // Include secretary services. - secretary.providers = []; - $('#secretary-providers input[type="checkbox"]').each(function() { - if ($(this).prop('checked')) { - secretary.providers.push($(this).attr('data-id')); - } - }); - - // Include password if changed. - if ($('#secretary-password').val() !== '') { - secretary.settings.password = $('#secretary-password').val(); - } - - // Include id if changed. - if ($('#secretary-id').val() !== '') { - secretary.id = $('#secretary-id').val(); - } - - if (!BackendUsers.helper.validate(secretary)) return; - - BackendUsers.helper.save(secretary); - }); - - /** - * Event: Cancel Secretary Button "Click" - * - * Cancel add or edit of an secretary record. - */ - $('#cancel-secretary').click(function() { - var id = $('#secretary-id').val(); - BackendUsers.helper.resetForm(); - if (id != '') { - BackendUsers.helper.select(id, true); - } - }); -}; - -/** - * Save secretary record to database. - * - * @param {object} secretary Contains the admin record data. If an 'id' value is provided - * then the update operation is going to be executed. - */ -SecretariesHelper.prototype.save = function(secretary) { - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_save_secretary', - postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'secretary': JSON.stringify(secretary) - }; - - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; - Backend.displayNotification(EALang['secretary_saved']); - BackendUsers.helper.resetForm(); - $('#filter-secretaries .key').val(''); - BackendUsers.helper.filter('', response.id, true); - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; - -/** - * Delete a secretary record from database. - * - * @param {int} id Record id to be deleted. - */ -SecretariesHelper.prototype.delete = function(id) { - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_delete_secretary', - postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'secretary_id': id - }; - - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; - Backend.displayNotification(EALang['secretary_deleted']); - BackendUsers.helper.resetForm(); - BackendUsers.helper.filter($('#filter-secretaries .key').val()); - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; - -/** - * Validates a secretary record. - * - * @param {object} secretary Contains the admin data to be validated. - * @returns {bool} Returns the validation result. - */ -SecretariesHelper.prototype.validate = function(secretary) { - $('#secretaries .required').css('border', ''); - $('#secretary-password, #secretary-password-confirm').css('border', ''); - - try { - // Validate required fields. - var missingRequired = false; - $('#secretaries .required').each(function() { - if ($(this).val() == '' || $(this).val() == undefined) { - $(this).css('border', '2px solid red'); - missingRequired = true; - } - }); - if (missingRequired) { - throw 'Fields with * are required.'; - } - - // Validate passwords. - if ($('#secretary-password').val() != $('#secretary-password-confirm').val()) { - $('#secretary-password, #secretary-password-confirm').css('border', '2px solid red'); - throw 'Passwords mismatch!'; - } - - if ($('#secretary-password').val().length < BackendUsers.MIN_PASSWORD_LENGTH - && $('#secretary-password').val() != '') { - $('#secretary-password, #secretary-password-confirm').css('border', '2px solid red'); - throw 'Password must be at least ' + BackendUsers.MIN_PASSWORD_LENGTH - + ' characters long.'; - } - - // Validate user email. - if (!GeneralFunctions.validateEmail($('#secretary-email').val())) { - $('#secretary-email').css('border', '2px solid red'); - throw 'Invalid email address!'; - } - - // Check if username exists - if ($('#secretary-username').attr('already-exists') == 'true') { - $('#secretary-username').css('border', '2px solid red'); - throw 'Username already exists.'; - } - - return true; - } catch(exc) { - $('#secretaries .form-message').text(exc); - $('#secretaries .form-message').show(); - return false; - } -}; - -/** - * Resets the admin tab form back to its initial state. - */ -SecretariesHelper.prototype.resetForm = function() { - $('#secretaries .details').find('input, textarea').val(''); - $('#secretaries .add-edit-delete-group').show(); - $('#secretaries .save-cancel-group').hide(); - $('#edit-secretary, #delete-secretary').prop('disabled', true); - $('#secretaries .details').find('input, textarea').prop('readonly', true); - $('#secretaries .form-message').hide(); - $('#secretary-notifications').removeClass('active'); - $('#secretary-notifications').prop('disabled', true); - $('#secretary-providers input[type="checkbox"]').prop('checked', false); - $('#secretary-providers input[type="checkbox"]').prop('disabled', true); - $('#secretaries .required').css('border', ''); - $('#secretary-password, #secretary-password-confirm').css('border', ''); - - $('#filter-secretaries .selected-row').removeClass('selected-row'); - $('#filter-secretaries button').prop('disabled', false); - $('#filter-secretaries .results').css('color', ''); -}; - -/** - * Display a secretary record into the admin form. - * - * @param {object} secretary Contains the secretary record data. - */ -SecretariesHelper.prototype.display = function(secretary) { - $('#secretary-id').val(secretary.id); - $('#secretary-first-name').val(secretary.first_name); - $('#secretary-last-name').val(secretary.last_name); - $('#secretary-email').val(secretary.email); - $('#secretary-mobile-number').val(secretary.mobile_number); - $('#secretary-phone-number').val(secretary.phone_number); - $('#secretary-address').val(secretary.address); - $('#secretary-city').val(secretary.city); - $('#secretary-state').val(secretary.state); - $('#secretary-zip-code').val(secretary.zip_code); - $('#secretary-notes').val(secretary.notes); - - $('#secretary-username').val(secretary.settings.username); - if (secretary.settings.notifications == true) { - $('#secretary-notifications').addClass('active'); - } else { - $('#secretary-notifications').removeClass('active'); - } - - $('#secretary-providers input[type="checkbox"]').prop('checked', false); - $.each(secretary.providers, function(index, providerId) { - $('#secretary-providers input[type="checkbox"]').each(function() { - if ($(this).attr('data-id') == providerId) { - $(this).prop('checked', true); - } - }); - }); -}; - -/** - * Filters secretary records depending a string key. - * - * @param {string} key This is used to filter the secretary records of the database. - * @param {numeric} selectId (OPTIONAL = undefined) If provided then the given id will be - * selected in the filter results (only selected, not displayed). - * @param {bool} display (OPTIONAL = false) - */ -SecretariesHelper.prototype.filter = function(key, selectId, display) { - if (display == undefined) display = false; - - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_filter_secretaries'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'key': key + var SecretariesHelper = function() { + this.filterResults = {}; // Store the results for later use. }; - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; + /** + * Bind the event handlers for the backend/users "Secretaries" tab. + */ + SecretariesHelper.prototype.bindEventHandlers = function() { + /** + * Event: Filter Secretaries Form "Submit" + * + * Filter the secretary records with the given key string. + */ + $('#secretaries').on('submit', '#filter-secretaries form', function(event) { + var key = $('#filter-secretaries .key').val(); + $('#filter-secretaries .selected-row').removeClass('selected-row'); + this.resetForm(); + this.filter(key); + return false; + }.bind(this)); - BackendUsers.helper.filterResults = response; + /** + * Event: Clear Filter Results Button "Click" + */ + $('#secretaries').on('click', '#filter-secretaries .clear', function() { + this.filter(''); + $('#filter-secretaries .key').val(''); + this.resetForm(); + }.bind(this)); - $('#filter-secretaries .results').data('jsp').destroy(); - $('#filter-secretaries .results').html(''); - $.each(response, function(index, secretary) { - var html = SecretariesHelper.prototype.getFilterHtml(secretary); - $('#filter-secretaries .results').append(html); + /** + * Event: Filter Secretary Row "Click" + * + * Display the selected secretary data to the user. + */ + $('#secretaries').on('click', '.secretary-row', function(e) { + if ($('#filter-secretaries .filter').prop('disabled')) { + $('#filter-secretaries .results').css('color', '#AAA'); + return; // exit because we are currently on edit mode + } + + var secretaryId = $(e.currentTarget).attr('data-id'), + secretary = {}; + $.each(this.filterResults, function(index, item) { + if (item.id === secretaryId) { + secretary = item; + return false; + } + }); + + this.display(secretary); + $('#filter-secretaries .selected-row').removeClass('selected-row'); + $(e.currentTarget).addClass('selected-row'); + $('#edit-secretary, #delete-secretary').prop('disabled', false); + }.bind(this)); + + /** + * Event: Add New Secretary Button "Click" + */ + $('#secretaries').on('click', '#add-secretary', function() { + this.resetForm(); + $('#filter-secretaries button').prop('disabled', true); + $('#filter-secretaries .results').css('color', '#AAA'); + + $('#secretaries .add-edit-delete-group').hide(); + $('#secretaries .save-cancel-group').show(); + $('#secretaries .details').find('input, textarea').prop('readonly', false); + $('#secretary-password, #secretary-password-confirm').addClass('required'); + $('#secretary-notifications').prop('disabled', false); + $('#secretary-providers input[type="checkbox"]').prop('disabled', false); + }.bind(this)); + + /** + * Event: Edit Secretary Button "Click" + */ + $('#secretaries').on('click', '#edit-secretary', function() { + $('#filter-secretaries button').prop('disabled', true); + $('#filter-secretaries .results').css('color', '#AAA'); + + $('#secretaries .add-edit-delete-group').hide(); + $('#secretaries .save-cancel-group').show(); + $('#secretaries .details').find('input, textarea').prop('readonly', false); + $('#secretary-password, #secretary-password-confirm').removeClass('required'); + $('#secretary-notifications').prop('disabled', false); + $('#secretary-providers input[type="checkbox"]').prop('disabled', false); }); - $('#filter-secretaries .results').jScrollPane({ mouseWheelSpeed: 70 }); - if (response.length == 0) { - $('#filter-secretaries .results').html('' + EALang['no_records_found'] + '') - } + /** + * Event: Delete Secretary Button "Click" + */ + $('#secretaries').on('click', '#delete-secretary', function() { + var secretaryId = $('#secretary-id').val(); - if (selectId != undefined) { - BackendUsers.helper.select(selectId, display); - } - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); -}; + var messageBtns = {}; + messageBtns[EALang['delete']] = function() { + this.delete(secretaryId); + $('#message_box').dialog('close'); + }.bind(this); + messageBtns[EALang['cancel']] = function() { + $('#message_box').dialog('close'); + }; -/** - * Get an secretary row html code that is going to be displayed on the filter results list. - * - * @param {object} secretary Contains the secretary record data. - * @returns {string} The html code that represents the record on the filter results list. - */ -SecretariesHelper.prototype.getFilterHtml = function(secretary) { - var name = secretary.first_name + ' ' + secretary.last_name; - var info = secretary.email; - info = (secretary.mobile_number != '' && secretary.mobile_number != null) - ? info + ', ' + secretary.mobile_number : info; - info = (secretary.phone_number != '' && secretary.phone_number != null) - ? info + ', ' + secretary.phone_number : info; + GeneralFunctions.displayMessageBox(EALang['delete_secretary'], + EALang['delete_record_prompt'], messageBtns); + }); - var html = - '
' + - '' + name + '
' + - info + '
' + - '

'; + /** + * Event: Save Secretary Button "Click" + */ + $('#secretaries').on('click', '#save-secretary', function() { + var secretary = { + first_name: $('#secretary-first-name').val(), + last_name: $('#secretary-last-name').val(), + email: $('#secretary-email').val(), + mobile_number: $('#secretary-mobile-number').val(), + phone_number: $('#secretary-phone-number').val(), + address: $('#secretary-address').val(), + city: $('#secretary-city').val(), + state: $('#secretary-state').val(), + zip_code: $('#secretary-zip-code').val(), + notes: $('#secretary-notes').val(), + settings: { + username: $('#secretary-username').val(), + notifications: $('#secretary-notifications').hasClass('active') + } + }; - return html; -}; + // Include secretary services. + secretary.providers = []; + $('#secretary-providers input[type="checkbox"]').each(function() { + if ($(this).prop('checked')) { + secretary.providers.push($(this).attr('data-id')); + } + }); -/** - * Select a specific record from the current filter results. If the secretary id does not exist - * in the list then no record will be selected. - * - * @param {numeric} id The record id to be selected from the filter results. - * @param {bool} display (OPTIONAL = false) If true then the method will display the record - * on the form. - */ -SecretariesHelper.prototype.select = function(id, display) { - if (display == undefined) display = false; + // Include password if changed. + if ($('#secretary-password').val() !== '') { + secretary.settings.password = $('#secretary-password').val(); + } - $('#filter-secretaries .selected-row').removeClass('selected-row'); + // Include id if changed. + if ($('#secretary-id').val() !== '') { + secretary.id = $('#secretary-id').val(); + } - $('#filter-secretaries .secretary-row').each(function() { - if ($(this).attr('data-id') == id) { - $(this).addClass('selected-row'); + if (!this.validate(secretary)) { + return; + } + + this.save(secretary); + }.bind(this)); + + /** + * Event: Cancel Secretary Button "Click" + * + * Cancel add or edit of an secretary record. + */ + $('#secretaries').on('Click', '#cancel-secretary', function() { + var id = $('#secretary-id').val(); + this.resetForm(); + if (id != '') { + this.select(id, true); + } + }.bind(this)); + }; + + /** + * Save secretary record to database. + * + * @param {object} secretary Contains the admin record data. If an 'id' value is provided + * then the update operation is going to be executed. + */ + SecretariesHelper.prototype.save = function(secretary) { + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_save_secretary', + postData = { + csrfToken: GlobalVariables.csrfToken, + secretary: JSON.stringify(secretary) + }; + + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + Backend.displayNotification(EALang['secretary_saved']); + this.resetForm(); + $('#filter-secretaries .key').val(''); + this.filter('', response.id, true); + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); + }; + + /** + * Delete a secretary record from database. + * + * @param {int} id Record id to be deleted. + */ + SecretariesHelper.prototype.delete = function(id) { + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_delete_secretary', + postData = { + csrfToken: GlobalVariables.csrfToken, + secretary_id: id + }; + + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + Backend.displayNotification(EALang['secretary_deleted']); + this.resetForm(); + this.filter($('#filter-secretaries .key').val()); + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); + }; + + /** + * Validates a secretary record. + * + * @param {object} secretary Contains the admin data to be validated. + * @returns {bool} Returns the validation result. + */ + SecretariesHelper.prototype.validate = function(secretary) { + $('#secretaries .required').css('border', ''); + $('#secretary-password, #secretary-password-confirm').css('border', ''); + + try { + // Validate required fields. + var missingRequired = false; + $('#secretaries .required').each(function() { + if ($(this).val() == '' || $(this).val() == undefined) { + $(this).css('border', '2px solid red'); + missingRequired = true; + } + }); + if (missingRequired) { + throw 'Fields with * are required.'; + } + + // Validate passwords. + if ($('#secretary-password').val() != $('#secretary-password-confirm').val()) { + $('#secretary-password, #secretary-password-confirm').css('border', '2px solid red'); + throw 'Passwords mismatch!'; + } + + if ($('#secretary-password').val().length < BackendUsers.MIN_PASSWORD_LENGTH + && $('#secretary-password').val() != '') { + $('#secretary-password, #secretary-password-confirm').css('border', '2px solid red'); + throw 'Password must be at least ' + BackendUsers.MIN_PASSWORD_LENGTH + + ' characters long.'; + } + + // Validate user email. + if (!GeneralFunctions.validateEmail($('#secretary-email').val())) { + $('#secretary-email').css('border', '2px solid red'); + throw 'Invalid email address!'; + } + + // Check if username exists + if ($('#secretary-username').attr('already-exists') == 'true') { + $('#secretary-username').css('border', '2px solid red'); + throw 'Username already exists.'; + } + + return true; + } catch(exc) { + $('#secretaries .form-message').text(exc); + $('#secretaries .form-message').show(); return false; } - }); + }; - if (display) { - $.each(BackendUsers.helper.filterResults, function(index, admin) { - if (admin.id == id) { - BackendUsers.helper.display(admin); - $('#edit-secretary, #delete-secretary').prop('disabled', false); + /** + * Resets the admin tab form back to its initial state. + */ + SecretariesHelper.prototype.resetForm = function() { + $('#secretaries .details').find('input, textarea').val(''); + $('#secretaries .add-edit-delete-group').show(); + $('#secretaries .save-cancel-group').hide(); + $('#edit-secretary, #delete-secretary').prop('disabled', true); + $('#secretaries .details').find('input, textarea').prop('readonly', true); + $('#secretaries .form-message').hide(); + $('#secretary-notifications').removeClass('active'); + $('#secretary-notifications').prop('disabled', true); + $('#secretary-providers input[type="checkbox"]').prop('checked', false); + $('#secretary-providers input[type="checkbox"]').prop('disabled', true); + $('#secretaries .required').css('border', ''); + $('#secretary-password, #secretary-password-confirm').css('border', ''); + + $('#filter-secretaries .selected-row').removeClass('selected-row'); + $('#filter-secretaries button').prop('disabled', false); + $('#filter-secretaries .results').css('color', ''); + }; + + /** + * Display a secretary record into the admin form. + * + * @param {object} secretary Contains the secretary record data. + */ + SecretariesHelper.prototype.display = function(secretary) { + $('#secretary-id').val(secretary.id); + $('#secretary-first-name').val(secretary.first_name); + $('#secretary-last-name').val(secretary.last_name); + $('#secretary-email').val(secretary.email); + $('#secretary-mobile-number').val(secretary.mobile_number); + $('#secretary-phone-number').val(secretary.phone_number); + $('#secretary-address').val(secretary.address); + $('#secretary-city').val(secretary.city); + $('#secretary-state').val(secretary.state); + $('#secretary-zip-code').val(secretary.zip_code); + $('#secretary-notes').val(secretary.notes); + + $('#secretary-username').val(secretary.settings.username); + if (secretary.settings.notifications == true) { + $('#secretary-notifications').addClass('active'); + } else { + $('#secretary-notifications').removeClass('active'); + } + + $('#secretary-providers input[type="checkbox"]').prop('checked', false); + $.each(secretary.providers, function(index, providerId) { + $('#secretary-providers input[type="checkbox"]').each(function() { + if ($(this).attr('data-id') == providerId) { + $(this).prop('checked', true); + } + }); + }); + }; + + /** + * Filters secretary records depending a string key. + * + * @param {string} key This is used to filter the secretary records of the database. + * @param {numeric} selectId (OPTIONAL = undefined) If provided then the given id will be + * selected in the filter results (only selected, not displayed). + * @param {bool} display (OPTIONAL = false) + */ + SecretariesHelper.prototype.filter = function(key, selectId, display) { + display = display || false; + + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_filter_secretaries', + postData = { + csrfToken: GlobalVariables.csrfToken, + key: key + }; + + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + + this.filterResults = response; + + $('#filter-secretaries .results').data('jsp').destroy(); + $('#filter-secretaries .results').html(''); + $.each(response, function(index, secretary) { + var html = this.getFilterHtml(secretary); + $('#filter-secretaries .results').append(html); + }.bind(this)); + $('#filter-secretaries .results').jScrollPane({ mouseWheelSpeed: 70 }); + + if (response.length == 0) { + $('#filter-secretaries .results').html('' + EALang['no_records_found'] + '') + } + + if (selectId != undefined) { + this.select(selectId, display); + } + }.bind(this), 'json').fail(GeneralFunctions.ajaxFailureHandler); + }; + + /** + * Get an secretary row html code that is going to be displayed on the filter results list. + * + * @param {object} secretary Contains the secretary record data. + * @returns {string} The html code that represents the record on the filter results list. + */ + SecretariesHelper.prototype.getFilterHtml = function(secretary) { + var name = secretary.first_name + ' ' + secretary.last_name, + info = secretary.email; + + info = (secretary.mobile_number != '' && secretary.mobile_number != null) + ? info + ', ' + secretary.mobile_number : info; + + info = (secretary.phone_number != '' && secretary.phone_number != null) + ? info + ', ' + secretary.phone_number : info; + + var html = + '
' + + '' + name + '
' + + info + '
' + + '

'; + + return html; + }; + + /** + * Select a specific record from the current filter results. If the secretary id does not exist + * in the list then no record will be selected. + * + * @param {numeric} id The record id to be selected from the filter results. + * @param {bool} display (OPTIONAL = false) If true then the method will display the record + * on the form. + */ + SecretariesHelper.prototype.select = function(id, display) { + display = display || false; + + $('#filter-secretaries .selected-row').removeClass('selected-row'); + + $('#filter-secretaries .secretary-row').each(function() { + if ($(this).attr('data-id') == id) { + $(this).addClass('selected-row'); return false; } }); - } -}; + + if (display) { + $.each(this.filterResults, function(index, admin) { + if (admin.id == id) { + this.display(admin); + $('#edit-secretary, #delete-secretary').prop('disabled', false); + return false; + } + }.bind(this)); + } + }; + + window.SecretariesHelper = SecretariesHelper; + +})();