From ae342f1671321e8cd017fe6fb0d1ad94cc009295 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Wed, 5 Jan 2022 09:08:39 +0100 Subject: [PATCH] Refactored the legal settings page functionality and structure --- application/controllers/Legal_settings.php | 19 +-- application/views/pages/legal_settings.php | 138 +++++++-------- assets/js/http/legal_settings_http_client.js | 34 ++++ .../pages/backend_settings_legal_contents.js | 110 ------------ .../backend_settings_legal_contents_helper.js | 124 -------------- assets/js/pages/legal_settings.js | 157 ++++++++++++++++++ 6 files changed, 253 insertions(+), 329 deletions(-) create mode 100644 assets/js/http/legal_settings_http_client.js delete mode 100644 assets/js/pages/backend_settings_legal_contents.js delete mode 100644 assets/js/pages/backend_settings_legal_contents_helper.js create mode 100644 assets/js/pages/legal_settings.js diff --git a/application/controllers/Legal_settings.php b/application/controllers/Legal_settings.php index 0f8e88a9..ed2f2b6e 100644 --- a/application/controllers/Legal_settings.php +++ b/application/controllers/Legal_settings.php @@ -26,18 +26,9 @@ class Legal_settings extends EA_Controller { { parent::__construct(); - $this->load->model('appointments_model'); - $this->load->model('customers_model'); - $this->load->model('services_model'); - $this->load->model('providers_model'); - $this->load->model('roles_model'); $this->load->model('settings_model'); $this->load->library('accounts'); - $this->load->library('google_sync'); - $this->load->library('notifications'); - $this->load->library('synchronization'); - $this->load->library('timezones'); } /** @@ -54,21 +45,21 @@ class Legal_settings extends EA_Controller { $user_id = session('user_id'); - $role_slug = session('role_slug'); + script_vars([ + 'legal_settings' => $this->settings_model->get(), + ]); html_vars([ 'page_title' => lang('settings'), 'active_menu' => PRIV_SYSTEM_SETTINGS, 'user_display_name' => $this->accounts->get_user_display_name($user_id), - 'privileges' => $this->roles_model->get_permissions_by_slug($role_slug), - 'system_settings' => $this->settings_model->get(), ]); $this->load->view('pages/legal_settings', html_vars()); } /** - * Save general settings. + * Save legal settings. */ public function save() { @@ -79,7 +70,7 @@ class Legal_settings extends EA_Controller { throw new Exception('You do not have the required permissions for this task.'); } - $settings = json_decode(request('settings', FALSE), TRUE); + $settings = request('legal_settings', []); foreach ($settings as $setting) { diff --git a/application/views/pages/legal_settings.php b/application/views/pages/legal_settings.php index 84c62b27..6b2e72b1 100755 --- a/application/views/pages/legal_settings.php +++ b/application/views/pages/legal_settings.php @@ -9,82 +9,79 @@ - @@ -92,30 +89,9 @@ - - - + + - $(function () { - BackendSettingsLegalContents.initialize(true); - }); - diff --git a/assets/js/http/legal_settings_http_client.js b/assets/js/http/legal_settings_http_client.js new file mode 100644 index 00000000..8fc8ec70 --- /dev/null +++ b/assets/js/http/legal_settings_http_client.js @@ -0,0 +1,34 @@ +/* ---------------------------------------------------------------------------- + * Easy!Appointments - Open Source Web Scheduler + * + * @package EasyAppointments + * @author A.Tselegidis + * @copyright Copyright (c) Alex Tselegidis + * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 + * @link https://easyappointments.org + * @since v1.5.0 + * ---------------------------------------------------------------------------- */ + +App.Http.LegalSettings = (function () { + /** + * Save legal settings. + * + * @param {Object} legalSettings + * + * @return {Object} + */ + function save(legalSettings) { + const url = App.Utils.Url.siteUrl('legal_settings/save'); + + const data = { + csrf_token: App.Vars.csrf_token, + legal_settings: legalSettings + }; + + return $.post(url, data); + } + + return { + save + }; +})(); diff --git a/assets/js/pages/backend_settings_legal_contents.js b/assets/js/pages/backend_settings_legal_contents.js deleted file mode 100644 index 7ad5b98c..00000000 --- a/assets/js/pages/backend_settings_legal_contents.js +++ /dev/null @@ -1,110 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Easy!Appointments - Open Source Web Scheduler - * - * @package EasyAppointments - * @author A.Tselegidis - * @copyright Copyright (c) Alex Tselegidis - * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 - * @link https://easyappointments.org - * @since v1.0.0 - * ---------------------------------------------------------------------------- */ - -window.BackendSettingsLegalContents = window.BackendSettingsLegalContents || {}; - -/** - * Backend Settings - * - * Contains the functionality of the backend settings page. Can either work for system or user settings, - * but the actions allowed to the user are restricted to his role (only admin has full privileges). - * - * @module BackendSettingsLegalContents - */ -(function (exports) { - 'use strict'; - - // Constants - exports.SETTINGS_SYSTEM = 'SETTINGS_SYSTEM'; - - /** - * Use this WorkingPlan class instance to perform actions on the page's working plan tables. - * - * @type {WorkingPlan} - */ - exports.wp = {}; - - /** - * Tab settings object. - * - * @type {Object} - */ - var settings = {}; - - /** - * Initialize Page - * - * @param {bool} defaultEventHandlers Optional (true), determines whether to bind the default event handlers. - */ - exports.initialize = function (defaultEventHandlers) { - defaultEventHandlers = defaultEventHandlers || true; - - $('#cookie-notice-content, #terms-and-conditions-content, #privacy-policy-content').trumbowyg(); - - // Apply setting values from database. - var workingPlan = {}; - - GlobalVariables.settings.system.forEach(function (setting) { - $('input[data-field="' + setting.name + '"]').val(setting.value); - $('select[data-field="' + setting.name + '"]').val(setting.value); - - if (setting.name === 'display_cookie_notice') { - $('#display-cookie-notice').prop('checked', Boolean(Number(setting.value))); - } - - if (setting.name === 'cookie_notice_content') { - $('#cookie-notice-content').trumbowyg('html', setting.value); - } - - if (setting.name === 'display_terms_and_conditions') { - $('#display-terms-and-conditions').prop('checked', Boolean(Number(setting.value))); - } - - if (setting.name === 'terms_and_conditions_content') { - $('#terms-and-conditions-content').trumbowyg('html', setting.value); - } - - if (setting.name === 'display_privacy_policy') { - $('#display-privacy-policy').prop('checked', Boolean(Number(setting.value))); - } - - if (setting.name === 'privacy_policy_content') { - $('#privacy-policy-content').trumbowyg('html', setting.value); - } - }); - - // Set default settings helper. - settings = new SystemSettingsLegalContentsHelper(); - - if (defaultEventHandlers) { - bindEventHandlers(); - } - - Backend.placeFooterToBottom(); - }; - - /** - * Bind the backend/settings default event handlers. - * - * This method depends on the backend/settings html, so do not use this method on a different page. - */ - function bindEventHandlers() { - /** - * Event: Save Settings Button "Click" - * - * Store the setting changes into the database. - */ - $('.save-settings').on('click', function () { - var data = settings.get(); - settings.save(data); - }); - } -})(window.BackendSettingsLegalContents); diff --git a/assets/js/pages/backend_settings_legal_contents_helper.js b/assets/js/pages/backend_settings_legal_contents_helper.js deleted file mode 100644 index 7340b10c..00000000 --- a/assets/js/pages/backend_settings_legal_contents_helper.js +++ /dev/null @@ -1,124 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Easy!Appointments - Open Source Web Scheduler - * - * @package EasyAppointments - * @author A.Tselegidis - * @copyright Copyright (c) Alex Tselegidis - * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 - * @link https://easyappointments.org - * @since v1.0.0 - * ---------------------------------------------------------------------------- */ - -(function () { - 'use strict'; - - /** - * "System Settings" Tab Helper Class - * - * @class SystemSettingsLegalContentsHelper - */ - var SystemSettingsLegalContentsHelper = function () {}; - - /** - * Save the system settings. - * - * This method is run after changes are detected on the tab input fields. - * - * @param {Array} settings Contains the system settings data. - */ - SystemSettingsLegalContentsHelper.prototype.save = function (settings) { - if (!this.validate()) { - return; // Validation failed, do not proceed. - } - - var url = GlobalVariables.baseUrl + '/index.php/settings/legal_contents/save'; - - var data = { - csrf_token: GlobalVariables.csrfToken, - settings: JSON.stringify(settings), - type: BackendSettingsLegalContents.SETTINGS_SYSTEM - }; - - $.post(url, data).done(function () { - Backend.displayNotification(App.Lang.settings_saved); - }); - }; - - /** - * Prepare the system settings array. - * - * This method uses the DOM elements of the backend/settings page, so it can't be used in another page. - * - * @return {Array} Returns the system settings array. - */ - SystemSettingsLegalContentsHelper.prototype.get = function () { - var settings = []; - - // Legal Contents Tab - - settings.push({ - name: 'display_cookie_notice', - value: $('#display-cookie-notice').prop('checked') ? '1' : '0' - }); - - settings.push({ - name: 'cookie_notice_content', - value: $('#cookie-notice-content').trumbowyg('html') - }); - - settings.push({ - name: 'display_terms_and_conditions', - value: $('#display-terms-and-conditions').prop('checked') ? '1' : '0' - }); - - settings.push({ - name: 'terms_and_conditions_content', - value: $('#terms-and-conditions-content').trumbowyg('html') - }); - - settings.push({ - name: 'display_privacy_policy', - value: $('#display-privacy-policy').prop('checked') ? '1' : '0' - }); - - settings.push({ - name: 'privacy_policy_content', - value: $('#privacy-policy-content').trumbowyg('html') - }); - - return settings; - }; - - /** - * Validate the settings data. - * - * If the validation fails then display a message to the user. - * - * @return {Boolean} Returns the validation result. - */ - SystemSettingsLegalContentsHelper.prototype.validate = function () { - $('#legal-contents .is-invalid').removeClass('is-invalid'); - - try { - // Validate required fields. - var missingRequired = false; - $('#general .required').each(function (index, requiredField) { - if (!$(requiredField).val()) { - $(requiredField).addClass('is-invalid'); - missingRequired = true; - } - }); - - if (missingRequired) { - throw new Error(App.Lang.fields_are_required); - } - - return true; - } catch (error) { - Backend.displayNotification(error.message); - return false; - } - }; - - window.SystemSettingsLegalContentsHelper = SystemSettingsLegalContentsHelper; -})(); diff --git a/assets/js/pages/legal_settings.js b/assets/js/pages/legal_settings.js new file mode 100644 index 00000000..6affe4f4 --- /dev/null +++ b/assets/js/pages/legal_settings.js @@ -0,0 +1,157 @@ +/* ---------------------------------------------------------------------------- + * Easy!Appointments - Open Source Web Scheduler + * + * @package EasyAppointments + * @author A.Tselegidis + * @copyright Copyright (c) Alex Tselegidis + * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 + * @link https://easyappointments.org + * @since v1.5.0 + * ---------------------------------------------------------------------------- */ + +/** + * Legal Settings + * + * Contains the functionality of the legal settings page. + */ +App.Pages.LegalSettings = (function () { + const $saveSettings = $('#save-settings'); + const $displayCookieNotice = $('#display-cookie-notice'); + const $cookieNoticeContent = $('#cookie-notice-content'); + const $displayTermsAndConditions = $('#display-terms-and-conditions'); + const $termsAndConditionsContent = $('#terms-and-conditions-content'); + const $displayPrivacyPolicy = $('#display-privacy-policy'); + const $privacyPolicyContent = $('#privacy-policy-content'); + + /** + * Check if the form has invalid values. + * + * @return {Boolean} + */ + function isInvalid() { + try { + $('#legal-settings .is-invalid').removeClass('is-invalid'); + + // Validate required fields. + + let missingRequiredFields = false; + + $('#legal-settings .required').each((index, requiredField) => { + const $requiredField = $(requiredField); + + if (!$requiredField.val()) { + $requiredField.addClass('is-invalid'); + missingRequiredFields = true; + } + }); + + if (missingRequiredFields) { + throw new Error(App.Lang.fields_are_required); + } + + return false; + } catch (error) { + Backend.displayNotification(error.message); + return true; + } + } + + function deserialize(legalSettings) { + legalSettings.forEach((legalSetting) => { + if (legalSetting.name === 'display_cookie_notice') { + $displayCookieNotice.prop('checked', Boolean(Number(legalSetting.value))); + } + + if (legalSetting.name === 'cookie_notice_content') { + $cookieNoticeContent.trumbowyg('html', legalSetting.value); + } + + if (legalSetting.name === 'display_terms_and_conditions') { + $displayTermsAndConditions.prop('checked', Boolean(Number(legalSetting.value))); + } + + if (legalSetting.name === 'terms_and_conditions_content') { + $termsAndConditionsContent.trumbowyg('html', legalSetting.value); + } + + if (legalSetting.name === 'display_privacy_policy') { + $displayPrivacyPolicy.prop('checked', Boolean(Number(legalSetting.value))); + } + + if (legalSetting.name === 'privacy_policy_content') { + $privacyPolicyContent.trumbowyg('html', legalSetting.value); + } + }); + } + + function serialize() { + const legalSettings = []; + + legalSettings.push({ + name: 'display_cookie_notice', + value: $displayCookieNotice.prop('checked') ? '1' : '0' + }); + + legalSettings.push({ + name: 'cookie_notice_content', + value: $cookieNoticeContent.trumbowyg('html') + }); + + legalSettings.push({ + name: 'display_terms_and_conditions', + value: $displayTermsAndConditions.prop('checked') ? '1' : '0' + }); + + legalSettings.push({ + name: 'terms_and_conditions_content', + value: $termsAndConditionsContent.trumbowyg('html') + }); + + legalSettings.push({ + name: 'display_privacy_policy', + value: $displayPrivacyPolicy.prop('checked') ? '1' : '0' + }); + + legalSettings.push({ + name: 'privacy_policy_content', + value: $privacyPolicyContent.trumbowyg('html') + }); + + return legalSettings; + } + + /** + * Save the account information. + */ + function onSaveSettingsClick() { + if (isInvalid()) { + Backend.displayNotification(App.Lang.settings_are_invalid); + + return; + } + + const legalSettings = serialize(); + + App.Http.LegalSettings.save(legalSettings).done(() => { + Backend.displayNotification(App.Lang.settings_saved); + }); + } + + function init() { + $cookieNoticeContent.trumbowyg(); + $termsAndConditionsContent.trumbowyg(); + $privacyPolicyContent.trumbowyg(); + + const legalSettings = App.Vars.legal_settings; + + deserialize(legalSettings); + + $saveSettings.on('click', onSaveSettingsClick); + + Backend.placeFooterToBottom(); + } + + document.addEventListener('DOMContentLoaded', init); + + return {}; +})();