From 8649983c6fecd2612fcf2397953d96d0435ca800 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Sun, 17 Jul 2016 14:23:18 +0200 Subject: [PATCH] Moved google-sync related code to a new javascript file. --- src/assets/js/backend_calendar.js | 170 +-------------- src/assets/js/backend_calendar_google_sync.js | 203 ++++++++++++++++++ 2 files changed, 206 insertions(+), 167 deletions(-) create mode 100644 src/assets/js/backend_calendar_google_sync.js diff --git a/src/assets/js/backend_calendar.js b/src/assets/js/backend_calendar.js index 902c3035..b711e911 100644 --- a/src/assets/js/backend_calendar.js +++ b/src/assets/js/backend_calendar.js @@ -34,43 +34,6 @@ window.BackendCalendar = window.BackendCalendar || {}; function _bindEventHandlers() { var $calendarPage = $('#calendar-page'); - - /** - * Event: Google Sync Button "Click" - * - * Trigger the synchronization algorithm. - */ - $('#google-sync').click(function() { - var url = GlobalVariables.baseUrl + '/index.php/google/sync/' + $('#select-filter-item').val(); - - $.ajax({ - url: url, - type: 'GET', - dataType: 'json' - }) - .done(function(response) { - if (response.exceptions) { - response.exceptions = GeneralFunctions.parseExceptions(response.exceptions); - 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); - $('#message_box').append(GeneralFunctions.exceptionsToHtml(response.warnings)); - } - - Backend.displayNotification(EALang['google_sync_completed']); - $('#reload-appointments').trigger('click'); - }) - .fail(function(jqXHR, textStatus, errorThrown) { - Backend.displayNotification(EALang['google_sync_failed']); - }); - }); /** * Event: Reload Button "Click" @@ -418,84 +381,7 @@ window.BackendCalendar = window.BackendCalendar || {}; $('#manage-unavailable').modal('hide'); }); - /** - * Event: Enable - Disable Synchronization Button "Click" - * - * When the user clicks on the "Enable Sync" button, a popup should appear - * that is going to follow the web server authorization flow of OAuth. - */ - $('#enable-sync').click(function() { - if ($('#enable-sync').hasClass('enabled') === false) { - // Enable synchronization for selected provider. - var authUrl = GlobalVariables.baseUrl + '/index.php/google/oauth/' - + $('#select-filter-item').val(); - - var redirectUrl = GlobalVariables.baseUrl + '/index.php/google/oauth_callback'; - - var windowHandle = window.open(authUrl, 'Authorize Easy!Appointments', - '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. - if (windowHandle.document !== undefined) { - if (windowHandle.document.URL.indexOf(redirectUrl) !== -1) { - // The user has granted access to his data. - windowHandle.close(); - window.clearInterval(authInterval); - $('#enable-sync').addClass('btn-danger enabled'); - $('#enable-sync span:eq(1)').text(EALang['disable_sync']); - $('#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() - }; - - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) { - return; - } - - $('#google-calendar').empty(); - $.each(response, function() { - var option = ''; - $('#google-calendar').append(option); - }); - - $('#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. - $.each(GlobalVariables.availableProviders, function(index, provider) { - if (provider['id'] == $('#select-filter-item').val()) { - provider['settings']['google_sync'] = '0'; - provider['settings']['google_token'] = null; - - _disableProviderSync(provider['id']); - - $('#enable-sync').removeClass('btn-danger enabled'); - $('#enable-sync span:eq(1)').text(EALang['enable_sync']); - $('#google-sync').prop('disabled', true); - $('#select-filter-item option:selected').attr('google-sync', 'false'); - - return false; - } - }); - } - }); + /** * Event: Insert Appointment Button "Click" @@ -727,32 +613,6 @@ window.BackendCalendar = window.BackendCalendar || {}; $('#manage-appointment').find('#customer-id, #first-name, #last-name, #email, ' + '#phone-number, #address, #city, #zip-code, #customer-notes').val(''); }); - - /** - * Event: Select Google Calendar "Click" - */ - $('#select-calendar').click(function() { - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_select_google_calendar'; - var postData = { - csrfToken: GlobalVariables.csrfToken, - provider_id: $('#select-filter-item').val(), - calendar_id: $('#google-calendar').val() - }; - $.post(postUrl, postData, function(response) { - if (!GeneralFunctions.handleAjaxExceptions(response)) { - return; - } - Backend.displayNotification(EALang['google_calendar_selected']); - $('#select-google-calendar').modal('hide'); - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); - }); - - /** - * Event: Close Google Calendar "Click" - */ - $('#close-calendar').click(function() { - $('#select-google-calendar').modal('hide'); - }); } /** @@ -818,32 +678,6 @@ window.BackendCalendar = window.BackendCalendar || {}; }); } - /** - * Disable Provider Sync - * - * This method disables the google synchronization for a specific provider. - * - * @param {Number} providerId The selected provider record ID. - */ - function _disableProviderSync(providerId) { - // Make an ajax call to the server in order to disable the setting - // from the database. - var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_disable_provider_sync'; - var postData = { - csrfToken: GlobalVariables.csrfToken, - provider_id: providerId - }; - - $.post(postUrl, postData, function(response) { - if (response.exceptions) { - response.exceptions = GeneralFunctions.parseExceptions(response.exceptions); - GeneralFunctions.displayMessageBox(GeneralFunctions.EXCEPTIONS_TITLE, GeneralFunctions.EXCEPTIONS_MESSAGE); - $('#message_box').append(GeneralFunctions.exceptionsToHtml(response.exceptions)); - return; - } - }, 'json').fail(GeneralFunctions.ajaxFailureHandler); - } - /** * Reset Apppointment Dialog * @@ -1130,6 +964,8 @@ window.BackendCalendar = window.BackendCalendar || {}; BackendCalendarDefaultView.initialize(); } + BackendCalendarGoogleSync.initialize(); + _bindEventHandlers(); // General event handling. }; diff --git a/src/assets/js/backend_calendar_google_sync.js b/src/assets/js/backend_calendar_google_sync.js new file mode 100644 index 00000000..ccad82e2 --- /dev/null +++ b/src/assets/js/backend_calendar_google_sync.js @@ -0,0 +1,203 @@ +/* ---------------------------------------------------------------------------- + * Easy!Appointments - Open Source Web Scheduler + * + * @package EasyAppointments + * @author A.Tselegidis + * @copyright Copyright (c) 2013 - 2016, Alex Tselegidis + * @license http://opensource.org/licenses/GPL-3.0 - GPLv3 + * @link http://easyappointments.org + * @since v1.2.0 + * ---------------------------------------------------------------------------- */ + +/** + * Backend Calendar Google Sync + * + * This module implements the Google Calendar sync operations. + * + * @module BackendCalendarGoogleSync + */ +window.BackendCalendarGoogleSync = window.BackendCalendarGoogleSync || {}; + +(function(exports) { + + 'use strict'; + + /** + * Bind event handlers. + */ + function _bindEventHandlers() { + /** + * Event: Enable - Disable Synchronization Button "Click" + * + * When the user clicks on the "Enable Sync" button, a popup should appear + * that is going to follow the web server authorization flow of OAuth. + */ + $('#enable-sync').click(function() { + if ($('#enable-sync').hasClass('enabled') === false) { + // Enable synchronization for selected provider. + var authUrl = GlobalVariables.baseUrl + '/index.php/google/oauth/' + + $('#select-filter-item').val(); + + var redirectUrl = GlobalVariables.baseUrl + '/index.php/google/oauth_callback'; + + var windowHandle = window.open(authUrl, 'Authorize Easy!Appointments', + '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. + if (windowHandle.document !== undefined) { + if (windowHandle.document.URL.indexOf(redirectUrl) !== -1) { + // The user has granted access to his data. + windowHandle.close(); + window.clearInterval(authInterval); + $('#enable-sync').addClass('btn-danger enabled'); + $('#enable-sync span:eq(1)').text(EALang['disable_sync']); + $('#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() + }; + + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + + $('#google-calendar').empty(); + $.each(response, function() { + var option = ''; + $('#google-calendar').append(option); + }); + + $('#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. + $.each(GlobalVariables.availableProviders, function(index, provider) { + if (provider['id'] == $('#select-filter-item').val()) { + provider['settings']['google_sync'] = '0'; + provider['settings']['google_token'] = null; + + _disableProviderSync(provider['id']); + + $('#enable-sync').removeClass('btn-danger enabled'); + $('#enable-sync span:eq(1)').text(EALang['enable_sync']); + $('#google-sync').prop('disabled', true); + $('#select-filter-item option:selected').attr('google-sync', 'false'); + + return false; + } + }); + } + }); + + /** + * Event: Select Google Calendar "Click" + */ + $('#select-calendar').click(function() { + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_select_google_calendar'; + var postData = { + csrfToken: GlobalVariables.csrfToken, + provider_id: $('#select-filter-item').val(), + calendar_id: $('#google-calendar').val() + }; + $.post(postUrl, postData, function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + Backend.displayNotification(EALang['google_calendar_selected']); + $('#select-google-calendar').modal('hide'); + }, 'json').fail(GeneralFunctions.ajaxFailureHandler); + }); + + /** + * Event: Close Google Calendar "Click" + */ + $('#close-calendar').click(function() { + $('#select-google-calendar').modal('hide'); + }); + + /** + * Event: Google Sync Button "Click" + * + * Trigger the synchronization algorithm. + */ + $('#google-sync').click(function() { + var url = GlobalVariables.baseUrl + '/index.php/google/sync/' + $('#select-filter-item').val(); + + $.ajax({ + url: url, + type: 'GET', + dataType: 'json' + }) + .done(function(response) { + if (response.exceptions) { + response.exceptions = GeneralFunctions.parseExceptions(response.exceptions); + 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); + $('#message_box').append(GeneralFunctions.exceptionsToHtml(response.warnings)); + } + + Backend.displayNotification(EALang['google_sync_completed']); + $('#reload-appointments').trigger('click'); + }) + .fail(function(jqXHR, textStatus, errorThrown) { + Backend.displayNotification(EALang['google_sync_failed']); + }); + }); + } + + /** + * Disable Provider Sync + * + * This method disables the google synchronization for a specific provider. + * + * @param {Number} providerId The selected provider record ID. + */ + function _disableProviderSync(providerId) { + // Make an ajax call to the server in order to disable the setting + // from the database. + var postUrl = GlobalVariables.baseUrl + '/index.php/backend_api/ajax_disable_provider_sync'; + var postData = { + csrfToken: GlobalVariables.csrfToken, + provider_id: providerId + }; + + $.post(postUrl, postData, function(response) { + if (response.exceptions) { + response.exceptions = GeneralFunctions.parseExceptions(response.exceptions); + GeneralFunctions.displayMessageBox(GeneralFunctions.EXCEPTIONS_TITLE, GeneralFunctions.EXCEPTIONS_MESSAGE); + $('#message_box').append(GeneralFunctions.exceptionsToHtml(response.exceptions)); + return; + } + }, 'json').fail(GeneralFunctions.ajaxFailureHandler); + } + + + exports.initialize = function() { + _bindEventHandlers(); + }; + +})(window.BackendCalendarGoogleSync);