From ec0924fb7ef6bc3c4f9d9dade68c4932a7051c11 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Tue, 26 Jul 2022 16:39:31 +0300 Subject: [PATCH] Add matomo analytics settings page --- .../controllers/Matomo_analytics_settings.php | 105 +++++++++++++++++ .../views/pages/matomo_analytics_settings.php | 53 +++++++++ .../matomo_analytics_settings_http_client.js | 39 +++++++ assets/js/pages/matomo_analytics_settings.js | 107 ++++++++++++++++++ 4 files changed, 304 insertions(+) create mode 100644 application/controllers/Matomo_analytics_settings.php create mode 100644 application/views/pages/matomo_analytics_settings.php create mode 100644 assets/js/http/matomo_analytics_settings_http_client.js create mode 100644 assets/js/pages/matomo_analytics_settings.js diff --git a/application/controllers/Matomo_analytics_settings.php b/application/controllers/Matomo_analytics_settings.php new file mode 100644 index 00000000..3406b3ce --- /dev/null +++ b/application/controllers/Matomo_analytics_settings.php @@ -0,0 +1,105 @@ + + * @copyright Copyright (c) Alex Tselegidis + * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 + * @link https://easyappointments.org + * @since v1.5.0 + * ---------------------------------------------------------------------------- */ + +/** + * Matomo Analytics settings controller. + * + * Handles Matomo Analytics settings related operations. + * + * @package Controllers + */ +class Matomo_analytics_settings extends EA_Controller { + /** + * Calendar constructor. + */ + public function __construct() + { + parent::__construct(); + + $this->load->model('settings_model'); + + $this->load->library('accounts'); + } + + /** + * Render the settings page. + */ + public function index() + { + session(['dest_url' => site_url('matomo_analytics_settings')]); + + $user_id = session('user_id'); + + if (cannot('view', PRIV_SYSTEM_SETTINGS)) + { + if ($user_id) + { + abort(403, 'Forbidden'); + } + + redirect('login'); + + return; + } + + $role_slug = session('role_slug'); + + script_vars([ + 'user_id' => $user_id, + 'role_slug' => $role_slug, + 'matomo_analytics_settings' => $this->settings_model->get('name like "matomo_analytics_%"'), + ]); + + html_vars([ + 'page_title' => lang('matomo_analytics'), + 'active_menu' => PRIV_SYSTEM_SETTINGS, + 'user_display_name' => $this->accounts->get_user_display_name($user_id), + ]); + + $this->load->view('pages/matomo_analytics_settings'); + } + + /** + * Save general settings. + */ + public function save() + { + try + { + if (cannot('edit', PRIV_SYSTEM_SETTINGS)) + { + throw new RuntimeException('You do not have the required permissions for this task.'); + } + + $settings = request('matomo_analytics_settings', []); + + foreach ($settings as $setting) + { + $existing_setting = $this->settings_model->query()->where('name', $setting['name'])->get()->row_array(); + + if ( ! empty($existing_setting)) + { + $setting['id'] = $existing_setting['id']; + } + + $this->settings_model->save($setting); + } + + response(); + } + catch (Throwable $e) + { + json_exception($e); + } + } +} diff --git a/application/views/pages/matomo_analytics_settings.php b/application/views/pages/matomo_analytics_settings.php new file mode 100644 index 00000000..62cf4469 --- /dev/null +++ b/application/views/pages/matomo_analytics_settings.php @@ -0,0 +1,53 @@ + + + + +
+
+
+
+
+
+ + + + + + + + +
+
+
+ + +
+ + + +
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/assets/js/http/matomo_analytics_settings_http_client.js b/assets/js/http/matomo_analytics_settings_http_client.js new file mode 100644 index 00000000..3fb3e4f9 --- /dev/null +++ b/assets/js/http/matomo_analytics_settings_http_client.js @@ -0,0 +1,39 @@ +/* ---------------------------------------------------------------------------- + * Easy!Appointments - Online Appointment 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 + * ---------------------------------------------------------------------------- */ + +/** + * Matomo Analytics Settings HTTP client. + * + * This module implements the Matomo Analytics settings related HTTP requests. + */ +App.Http.MatomoAnalyticsSettings = (function () { + /** + * Save Matomo Analytics settings. + * + * @param {Object} matomoAnalyticsSettings + * + * @return {Object} + */ + function save(matomoAnalyticsSettings) { + const url = App.Utils.Url.siteUrl('matomo_analytics_settings/save'); + + const data = { + csrf_token: vars('csrf_token'), + matomo_analytics_settings: matomoAnalyticsSettings + }; + + return $.post(url, data); + } + + return { + save + }; +})(); diff --git a/assets/js/pages/matomo_analytics_settings.js b/assets/js/pages/matomo_analytics_settings.js new file mode 100644 index 00000000..331113fb --- /dev/null +++ b/assets/js/pages/matomo_analytics_settings.js @@ -0,0 +1,107 @@ +/* ---------------------------------------------------------------------------- + * Easy!Appointments - Online Appointment 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 + * ---------------------------------------------------------------------------- */ + +/** + * Matomo Analytics settings page. + * + * This module implements the functionality of the Matomo Analytics settings page. + */ +App.Pages.MatomoAnalyticsSettings = (function () { + const $saveSettings = $('#save-settings'); + + /** + * Check if the form has invalid values. + * + * @return {Boolean} + */ + function isInvalid() { + try { + $('#matomo-analytics-settings .is-invalid').removeClass('is-invalid'); + + // Validate required fields. + + let missingRequiredFields = false; + + $('#matomo-analytics-settings .required').each((index, requiredField) => { + const $requiredField = $(requiredField); + + if (!$requiredField.val()) { + $requiredField.addClass('is-invalid'); + missingRequiredFields = true; + } + }); + + if (missingRequiredFields) { + throw new Error(lang('fields_are_required')); + } + + return false; + } catch (error) { + App.Layouts.Backend.displayNotification(error.message); + return true; + } + } + + function deserialize(matomoAnalyticsSettings) { + matomoAnalyticsSettings.forEach((matomoAnalyticsSetting) => { + $('[data-field="' + matomoAnalyticsSetting.name + '"]').val(matomoAnalyticsSetting.value); + }); + } + + function serialize() { + const matomoAnalyticsSettings = []; + + $('[data-field]').each((index, field) => { + const $field = $(field); + + matomoAnalyticsSettings.push({ + name: $field.data('field'), + value: $field.val() + }); + }); + + return matomoAnalyticsSettings; + } + + /** + * Save the account information. + */ + function onSaveSettingsClick() { + if (isInvalid()) { + App.Layouts.Backend.displayNotification(lang('settings_are_invalid')); + + return; + } + + const matomoAnalyticsSettings = serialize(); + + App.Http.MatomoAnalyticsSettings.save(matomoAnalyticsSettings).done(() => { + App.Layouts.Backend.displayNotification(lang('settings_saved')); + }); + } + + /** + * Initialize the module. + */ + function initialize() { + $saveSettings.on('click', onSaveSettingsClick); + + const matomoAnalyticsSettings = vars('matomo_analytics_settings'); + + deserialize(matomoAnalyticsSettings); + + App.Layouts.Backend.placeFooterToBottom(); + } + + document.addEventListener('DOMContentLoaded', initialize); + + return {}; +})();