diff --git a/src/assets/js/backend_calendar.js b/src/assets/js/backend_calendar.js index 9522770e..16ac1909 100644 --- a/src/assets/js/backend_calendar.js +++ b/src/assets/js/backend_calendar.js @@ -30,16 +30,16 @@ window.BackendCalendar = window.BackendCalendar || {}; var lastFocusedEventData; // Contains event data for later use. /** - * This method binds the default event handlers for the backend calendar - * page. If you do not need the default handlers then initialize the page - * by setting the "defaultEventHandlers" argument to "false". + * Bind Event Handlers + * + * This method binds the default event handlers for the backend calendar page. If you do not need the + * default handlers then initialize the page by setting the "defaultEventHandlers" argument to "false". */ function _bindEventHandlers() { /** * Event: Calendar Filter Item "Change" * - * Load the appointments that correspond to the select filter item and - * display them on the calendar. + * Load the appointments that correspond to the select filter item and display them on the calendar. */ $('#select-filter-item').change(function() { _refreshCalendarAppointments( @@ -50,14 +50,11 @@ window.BackendCalendar = window.BackendCalendar || {}; $('#calendar').fullCalendar('getView').visEnd); // If current value is service, then the sync buttons must be disabled. - if ($('#select-filter-item option:selected').attr('type') - === FILTER_TYPE_SERVICE) { - $('#google-sync, #enable-sync, #insert-appointment, #insert-unavailable') - .prop('disabled', true); + if ($('#select-filter-item option:selected').attr('type') === FILTER_TYPE_SERVICE) { + $('#google-sync, #enable-sync, #insert-appointment, #insert-unavailable').prop('disabled', true); } else { + $('#google-sync, #enable-sync, #insert-appointment, #insert-unavailable').prop('disabled', false); - $('#google-sync, #enable-sync, #insert-appointment, #insert-unavailable') - .prop('disabled', false); // If the user has already the sync enabled then apply the proper style changes. if ($('#select-filter-item option:selected').attr('google-sync') === 'true') { $('#enable-sync').addClass('btn-danger enabled'); @@ -78,6 +75,7 @@ window.BackendCalendar = window.BackendCalendar || {}; */ $('#google-sync').click(function() { var url = GlobalVariables.baseUrl + '/index.php/google/sync/' + $('#select-filter-item').val(); + $.ajax({ url: url, type: 'GET', @@ -110,8 +108,7 @@ window.BackendCalendar = window.BackendCalendar || {}; /** * Event: Reload Button "Click" * - * When the user clicks the reload button an the calendar items need to - * be refreshed. + * When the user clicks the reload button an the calendar items need to be refreshed. */ $('#reload-appointments').click(function() { $('#select-filter-item').trigger('change'); @@ -142,7 +139,7 @@ window.BackendCalendar = window.BackendCalendar || {}; _resetAppointmentDialog(); - // :: APPLY APPOINTMENT DATA AND SHOW TO MODAL DIALOG + // Apply appointment data and show modal dialog. $dialog.find('.modal-header h3').text(EALang['edit_appointment_title']); $dialog.find('#appointment-id').val(appointment['id']); $dialog.find('#select-service').val(appointment['id_services']).trigger('change'); @@ -151,12 +148,10 @@ window.BackendCalendar = window.BackendCalendar || {}; // Set the start and end datetime of the appointment. var startDatetime = Date.parseExact(appointment['start_datetime'], 'yyyy-MM-dd HH:mm:ss'); - // $dialog.find('#start-datetime').val(GeneralFunctions.formatDate(startDatetime, GlobalVariables.dateFormat, true)); $dialog.find('#start-datetime').datetimepicker('setDate', startDatetime); var endDatetime = Date.parseExact(appointment['end_datetime'], 'yyyy-MM-dd HH:mm:ss'); - // $dialog.find('#end-datetime').val(GeneralFunctions.formatDate(endDatetime, GlobalVariables.dateFormat, true)); $dialog.find('#end-datetime').datetimepicker('setDate', endDatetime); var customer = appointment['customer']; @@ -180,7 +175,7 @@ window.BackendCalendar = window.BackendCalendar || {}; $dialog = $('#manage-unavailable'); _resetUnavailableDialog(); - // :: APPLY UNAVAILABLE DATA TO DIALOG + // Apply unvailable data to dialog. $dialog.find('.modal-header h3').text('Edit Unavailable Period'); $dialog.find('#unavailable-start').datetimepicker('setDate', unavailable.start_datetime); $dialog.find('#unavailable-id').val(unavailable.id); @@ -195,9 +190,8 @@ window.BackendCalendar = window.BackendCalendar || {}; /** * Event: Popover Delete Button "Click" * - * Displays a prompt on whether the user wants the appoinmtent to be - * deleted. If he confirms the deletion then an ajax call is made to - * the server and deletes the appointment from the database. + * Displays a prompt on whether the user wants the appoinmtent to be deleted. If he confirms the + * deletion then an ajax call is made to the server and deletes the appointment from the database. */ $(document).on('click', '.delete-popover', function() { $(this).parents().eq(2).remove(); // Hide the popover @@ -218,14 +212,16 @@ window.BackendCalendar = window.BackendCalendar || {}; if (response.exceptions) { response.exceptions = GeneralFunctions.parseExceptions(response.exceptions); - GeneralFunctions.displayMessageBox(GeneralFunctions.EXCEPTIONS_TITLE, GeneralFunctions.EXCEPTIONS_MESSAGE); + GeneralFunctions.displayMessageBox(GeneralFunctions.EXCEPTIONS_TITLE, + GeneralFunctions.EXCEPTIONS_MESSAGE); $('#message_box').append(GeneralFunctions.exceptionsToHtml(response.exceptions)); return; } if (response.warnings) { response.warnings = GeneralFunctions.parseExceptions(response.warnings); - GeneralFunctions.displayMessageBox(GeneralFunctions.WARNINGS_TITLE, GeneralFunctions.WARNINGS_MESSAGE); + GeneralFunctions.displayMessageBox(GeneralFunctions.WARNINGS_TITLE, + GeneralFunctions.WARNINGS_MESSAGE); $('#message_box').append(GeneralFunctions.exceptionsToHtml(response.warnings)); } @@ -240,16 +236,16 @@ window.BackendCalendar = window.BackendCalendar || {}; GeneralFunctions.displayMessageBox(EALang['delete_appointment_title'], EALang['write_appointment_removal_reason'], messageButtons); + $('#message_box').append(''); $('#delete-reason').css('width', '100%'); } else { // Do not display confirmation promt. - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_delete_unavailable'; - - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'unavailable_id' : lastFocusedEventData.data.id - }; + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_delete_unavailable', + postData = { + csrfToken: GlobalVariables.csrfToken, + unavailable_id : lastFocusedEventData.data.id + }; $.post(postUrl, postData, function(response) { $('#message_box').dialog('close'); @@ -285,33 +281,32 @@ window.BackendCalendar = window.BackendCalendar || {}; /** * Event: Manage Appointments Dialog Save Button "Click" * - * Stores the appointment changes or inserts a new appointment depending the dialog - * mode. + * Stores the appointment changes or inserts a new appointment depending the dialog mode. */ $('#manage-appointment #save-appointment').click(function() { // Before doing anything the appointment data need to be validated. if (!_validateAppointmentForm()) { - return; // validation failed + return; } - // :: PREPARE APPOINTMENT DATA FOR AJAX CALL + // Prepare appointment data for AJAX request. var $dialog = $('#manage-appointment'); - // Id must exist on the object in order for the model to update - // the record and not to perform an insert operation. + // ID must exist on the object in order for the model to update the record and not to perform + // an insert operation. var startDatetime = $dialog.find('#start-datetime') - .datepicker('getDate').toString('yyyy-MM-dd HH:mm:ss'); - var endDatetime = $dialog.find('#end-datetime') + .datepicker('getDate').toString('yyyy-MM-dd HH:mm:ss'), + endDatetime = $dialog.find('#end-datetime') .datepicker('getDate').toString('yyyy-MM-dd HH:mm:ss'); var appointment = { - 'id_services': $dialog.find('#select-service').val(), - 'id_users_provider': $dialog.find('#select-provider').val(), - 'start_datetime': startDatetime, - 'end_datetime': endDatetime, - 'notes': $dialog.find('#appointment-notes').val(), - 'is_unavailable': false + id_services: $dialog.find('#select-service').val(), + id_users_provider: $dialog.find('#select-provider').val(), + start_datetime: startDatetime, + end_datetime: endDatetime, + notes: $dialog.find('#appointment-notes').val(), + is_unavailable: false }; if ($dialog.find('#appointment-id').val() !== '') { @@ -320,14 +315,14 @@ window.BackendCalendar = window.BackendCalendar || {}; } var customer = { - 'first_name': $dialog.find('#first-name').val(), - 'last_name': $dialog.find('#last-name').val(), - 'email': $dialog.find('#email').val(), - 'phone_number': $dialog.find('#phone-number').val(), - 'address': $dialog.find('#address').val(), - 'city': $dialog.find('#city').val(), - 'zip_code': $dialog.find('#zip-code').val(), - 'notes': $dialog.find('#customer-notes').val() + first_name: $dialog.find('#first-name').val(), + last_name: $dialog.find('#last-name').val(), + email: $dialog.find('#email').val(), + phone_number: $dialog.find('#phone-number').val(), + address: $dialog.find('#address').val(), + city: $dialog.find('#city').val(), + zip_code: $dialog.find('#zip-code').val(), + notes: $dialog.find('#customer-notes').val() }; if ($dialog.find('#customer-id').val() !== '') { @@ -336,7 +331,7 @@ window.BackendCalendar = window.BackendCalendar || {}; appointment['id_users_customer'] = customer['id']; } - // :: DEFINE SUCCESS EVENT CALLBACK + // Define success callback. var successCallback = function(response) { if (!GeneralFunctions.handleAjaxExceptions(response)) { $dialog.find('.modal-message').text(EALang['unexpected_issues_occurred']); @@ -349,8 +344,7 @@ window.BackendCalendar = window.BackendCalendar || {}; $dialog.find('.modal-message').addClass('alert-success').removeClass('alert-danger hidden'); $dialog.find('.modal-body').scrollTop(0); - // Close the modal dialog and refresh the calendar appointments - // after one second. + // Close the modal dialog and refresh the calendar appointments after one second. setTimeout(function() { $dialog.find('.alert').addClass('hidden'); $dialog.modal('hide'); @@ -358,14 +352,14 @@ window.BackendCalendar = window.BackendCalendar || {}; }, 2000); }; - // :: DEFINE AJAX ERROR EVENT CALLBACK + // Define error callback. var errorCallback = function() { $dialog.find('.modal-message').text(EALang['server_communication_error']); $dialog.find('.modal-message').addClass('alert-danger').removeClass('hidden'); $dialog.find('.modal-body').scrollTop(0); }; - // :: CALL THE UPDATE APPOINTMENT METHOD + // Save appointment data. _saveAppointment(appointment, customer, successCallback, errorCallback); }); @@ -390,10 +384,10 @@ window.BackendCalendar = window.BackendCalendar || {}; // Unavailable period records go to the appointments table. var unavailable = { - 'start_datetime': start.toString('yyyy-MM-dd HH:mm'), - 'end_datetime': end.toString('yyyy-MM-dd HH:mm'), - 'notes': $dialog.find('#unavailable-notes').val(), - 'id_users_provider': $('#select-filter-item').val() // curr provider + start_datetime: start.toString('yyyy-MM-dd HH:mm'), + end_datetime: end.toString('yyyy-MM-dd HH:mm'), + notes: $dialog.find('#unavailable-notes').val(), + id_users_provider: $('#select-filter-item').val() // curr provider }; if ($dialog.find('#unavailable-id').val() !== '') { @@ -404,7 +398,8 @@ window.BackendCalendar = window.BackendCalendar || {}; var successCallback = function(response) { if (response.exceptions) { response.exceptions = GeneralFunctions.parseExceptions(response.exceptions); - GeneralFunctions.displayMessageBox(GeneralFunctions.EXCEPTIONS_TITLE, GeneralFunctions.EXCEPTIONS_MESSAGE); + GeneralFunctions.displayMessageBox(GeneralFunctions.EXCEPTIONS_TITLE, + GeneralFunctions.EXCEPTIONS_MESSAGE); $('#message_box').append(GeneralFunctions.exceptionsToHtml(response.exceptions)); $dialog.find('.modal-message') @@ -417,7 +412,8 @@ window.BackendCalendar = window.BackendCalendar || {}; if (response.warnings) { response.warnings = GeneralFunctions.parseExceptions(response.warnings); - GeneralFunctions.displayMessageBox(GeneralFunctions.WARNINGS_TITLE, GeneralFunctions.WARNINGS_MESSAGE); + GeneralFunctions.displayMessageBox(GeneralFunctions.WARNINGS_TITLE, + GeneralFunctions.WARNINGS_MESSAGE); $('#message_box').append(GeneralFunctions.exceptionsToHtml(response.warnings)); } @@ -427,9 +423,7 @@ window.BackendCalendar = window.BackendCalendar || {}; .addClass('alert-success') .removeClass('alert-danger hidden'); - - // Close the modal dialog and refresh the calendar appointments - // after one second. + // Close the modal dialog and refresh the calendar appointments after one second. setTimeout(function() { $dialog.find('.alert').addClass('hidden'); $dialog.modal('hide'); @@ -465,7 +459,7 @@ window.BackendCalendar = window.BackendCalendar || {}; */ $('#enable-sync').click(function() { if ($('#enable-sync').hasClass('enabled') === false) { - // :: ENABLE SYNCHRONIZATION FOR SELECTED PROVIDER + // Enable synchronization for selected provider. var authUrl = GlobalVariables.baseUrl + '/index.php/google/oauth/' + $('#select-filter-item').val(); @@ -475,10 +469,9 @@ window.BackendCalendar = window.BackendCalendar || {}; 'width=800, height=600'); var authInterval = window.setInterval(function() { - // When the browser redirects to the google user consent page the - // "window.document" variable becomes "undefined" and when it comes - // back to the redirect url it changes back. So check whether the - // variable is undefined to avoid javascript errors. + // When the browser redirects to the google user consent page the "window.document" variable + // becomes "undefined" and when it comes back to the redirect URL it changes back. So check + // whether the variable is undefined to avoid javascript errors. if (windowHandle.document !== undefined) { if (windowHandle.document.URL.indexOf(redirectUrl) !== -1) { // The user has granted access to his data. @@ -489,16 +482,19 @@ window.BackendCalendar = window.BackendCalendar || {}; $('#google-sync').prop('disabled', false); $('#select-filter-item option:selected').attr('google-sync', 'true'); - // Display the calendar selection dialog. First we will get a list - // of the available user's calendars and then we will display a selection - // modal so the user can select the sync calendar. - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_get_google_calendars'; - var postData = { - 'csrfToken': GlobalVariables.csrfToken, - 'provider_id': $('#select-filter-item').val() - }; + // Display the calendar selection dialog. First we will get a list of the available + // user's calendars and then we will display a selection modal so the user can select + // the sync calendar. + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_get_google_calendars', + postData = { + csrfToken: GlobalVariables.csrfToken, + provider_id: $('#select-filter-item').val() + }; + $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) return; + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } $('#google-calendar').empty(); $.each(response, function() { @@ -507,16 +503,15 @@ window.BackendCalendar = window.BackendCalendar || {}; }); $('#select-google-calendar').modal('show'); - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); } } }, 100); } else { - // :: DISABLE SYNCHRONIZATION FOR SELECTED PROVIDER - // Update page elements and make an ajax call to remove the google - // sync setting of the selected provider. + // Disable synchronization for selected provider. + // Update page elements and make an AJAX call to remove the google sync setting of the + // selected provider. $.each(GlobalVariables.availableProviders, function(index, provider) { if (provider['id'] == $('#select-filter-item').val()) { provider['settings']['google_sync'] = '0'; @@ -538,19 +533,18 @@ window.BackendCalendar = window.BackendCalendar || {}; /** * Event: Insert Appointment Button "Click" * - * When the user presses this button, the manage appointment dialog opens and lets - * the user to create a new appointment. + * When the user presses this button, the manage appointment dialog opens and lets the user to + * create a new appointment. */ $('#insert-appointment').click(function() { _resetAppointmentDialog(); var $dialog = $('#manage-appointment'); - // Set the selected filter item and find the next appointment time - // as the default modal values. + // Set the selected filter item and find the next appointment time as the default modal values. if ($('#select-filter-item option:selected').attr('type') == 'provider') { var $providerOption = $dialog.find('#select-provider option[value="' + $('#select-filter-item').val() + '"]'); - if ($providerOption.length == 0) { // Change the services until you find the correct. + if ($providerOption.length === 0) { // Change the services until you find the correct. $.each($dialog.find('#select-service option'), function() { $(this).prop('selected', true).parent().change(); if ($providerOption.length > 0) @@ -571,17 +565,18 @@ window.BackendCalendar = window.BackendCalendar || {}; } }); - var start = new Date(); - var currentMin = parseInt(start.toString('mm')); + var start = new Date(), + currentMin = parseInt(start.toString('mm')); - if (currentMin > 0 && currentMin < 15) + if (currentMin > 0 && currentMin < 15) { start.set({ 'minute': 15 }); - else if (currentMin > 15 && currentMin < 30) + } else if (currentMin > 15 && currentMin < 30) { start.set({ 'minute': 30 }); - else if (currentMin > 30 && currentMin < 45) + } else if (currentMin > 30 && currentMin < 45) { start.set({ 'minute': 45 }); - else + } else { start.addHours(1).set({ 'minute': 0 }); + } $dialog.find('#start-datetime').val(GeneralFunctions.formatDate(start, GlobalVariables.dateFormat, true)); $dialog.find('#end-datetime').val(GeneralFunctions.formatDate(start.addMinutes(serviceDuration), @@ -595,25 +590,26 @@ window.BackendCalendar = window.BackendCalendar || {}; /** * Event : Insert Unavailable Time Period Button "Click" * - * When the user clicks this button a popup dialog appears and the use can set - * a time period where he cannot accept any appointments. + * When the user clicks this button a popup dialog appears and the use can set a time period where + * he cannot accept any appointments. */ $('#insert-unavailable').click(function() { _resetUnavailableDialog(); var $dialog = $('#manage-unavailable'); // Set the default datetime values. - var start = new Date(); - var currentMin = parseInt(start.toString('mm')); + var start = new Date(), + currentMin = parseInt(start.toString('mm')); - if (currentMin > 0 && currentMin < 15) + if (currentMin > 0 && currentMin < 15) { start.set({ 'minute': 15 }); - else if (currentMin > 15 && currentMin < 30) + } else if (currentMin > 15 && currentMin < 30) { start.set({ 'minute': 30 }); - else if (currentMin > 30 && currentMin < 45) + } else if (currentMin > 30 && currentMin < 45) { start.set({ 'minute': 45 }); - else + } else { start.addHours(1).set({ 'minute': 0 }); + } $dialog.find('#unavailable-start').val(GeneralFunctions.formatDate(start, GlobalVariables.dateFormat, true)); $dialog.find('#unavailable-end').val(GeneralFunctions.formatDate(start.addHours(1), GlobalVariables.dateFormat, true)); @@ -727,9 +723,8 @@ window.BackendCalendar = window.BackendCalendar || {}; /** * Event: Selected Service "Change" * - * When the user clicks on a service, its available providers should - * become visible. Also we need to update the start and end time of the - * appointment. + * When the user clicks on a service, its available providers should become visible. Also we need to + * update the start and end time of the appointment. */ $('#select-service').change(function() { var sid = $('#select-service').val(); @@ -747,8 +742,7 @@ window.BackendCalendar = window.BackendCalendar || {}; // Update the providers select box. $.each(GlobalVariables.availableProviders, function(indexProvider, provider) { $.each(provider.services, function(indexService, serviceId) { - // If the current provider is able to provide the selected service, - // add him to the listbox. + // If the current provider is able to provide the selected service, add him to the listbox. if (serviceId == sid) { var optionHtml = '