diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/preferences.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/preferences.yaml new file mode 100644 index 000000000..33617e47e --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/config/routes/preferences.yaml @@ -0,0 +1,21 @@ +# Copyright (C) 2010-2024 Combodo SAS +# +# This file is part of iTop. +# +# iTop is free software; you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iTop is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with iTop. If not, see + +p_preferences_set_preference: + path: '/preferences/setPreference' + defaults: + _controller: 'Combodo\iTop\Portal\Controller\PreferencesController::SetPreferenceAction' \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/public/js/custom_elements/navigation_menu_element.js b/datamodels/2.x/itop-portal-base/portal/public/js/custom_elements/navigation_menu_element.js index 6d8ef8c09..0667d3505 100644 --- a/datamodels/2.x/itop-portal-base/portal/public/js/custom_elements/navigation_menu_element.js +++ b/datamodels/2.x/itop-portal-base/portal/public/js/custom_elements/navigation_menu_element.js @@ -245,6 +245,10 @@ class NavigationMenuElement extends HTMLElement { } Expand(bSaveUserPreference = false) { + // save user preference + if (bSaveUserPreference) { + oUserPreferences.setPreference('portal.navigation_menu.expanded', 'expanded'); + } // sync attribute if (this.getAttribute(NavigationMenuElement.DATA_EXPANDED_STATE) !== 'expanded') { this.setAttribute(NavigationMenuElement.DATA_EXPANDED_STATE, 'expanded'); @@ -257,13 +261,13 @@ class NavigationMenuElement extends HTMLElement { // dispatch events window.dispatchEvent(new Event('resize')); // do layout this.dispatchEvent(new CustomEvent("state", {detail: 'expanded'})); - // save user preference - if (bSaveUserPreference) { - SetUserPreference('portal.navigation_menu.expanded', 'expanded', true); - } } Collapse(bSaveUserPreference = false) { + // save user preference + if (bSaveUserPreference) { + oUserPreferences.setPreference('portal.navigation_menu.expanded', 'collapsed'); + } // sync attribute if (this.getAttribute(NavigationMenuElement.DATA_EXPANDED_STATE) !== 'collapsed') { this.setAttribute(NavigationMenuElement.DATA_EXPANDED_STATE, 'collapsed'); @@ -276,10 +280,6 @@ class NavigationMenuElement extends HTMLElement { // dispatch events window.dispatchEvent(new Event('resize')); // do layout this.dispatchEvent(new CustomEvent("state", {detail: 'collapsed'})); - // save user preference - if (bSaveUserPreference) { - SetUserPreference('portal.navigation_menu.expanded', 'collapsed', true); - } } IsExpanded() { diff --git a/datamodels/2.x/itop-portal-base/portal/public/js/user_preferences.js b/datamodels/2.x/itop-portal-base/portal/public/js/user_preferences.js new file mode 100644 index 000000000..5a8c6d699 --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/public/js/user_preferences.js @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2013-2024 Combodo SAS + * + * This file is part of iTop. + * + * iTop is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * iTop is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + */ + +class UserPreferences { + + constructor(sUrl) { + this.sUrl = sUrl; + } + + setPreference(key, value) { + + let $data = new FormData(); + $data.append("key", key); + $data.append("value", value); + + fetch(this.sUrl, { + method: "POST", + body: $data, + }).then( + (response) => { + if (!response.ok) { + throw new Error(`Network response was not ok: ${response.statusText}`); + } + return response.json(); + } + ).catch( + (error) => { + console.error('Unable to set user preference:', error); + } + ); + } + + + +} \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/PreferencesController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/PreferencesController.php new file mode 100644 index 000000000..88fddd0ef --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/PreferencesController.php @@ -0,0 +1,65 @@ +request->get('key'); + $sValue = $oRequest->request->get('value'); + + // set user preference + try{ + appUserPreferences::SetPref($sKey, $sValue); + } + catch(Exception){ + $sStatus = 'error'; + } + + return new JsonResponse([ + 'status' => $sStatus, + ]); + } +} diff --git a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig index 6d20a1549..90899feb9 100644 --- a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig @@ -160,6 +160,8 @@ + {# User Preferences #} + {# custom elements #} @@ -279,8 +281,8 @@ { return '{{ app['url_generator'].generate('p_session_message_add')|raw }}'; }; - // used to allow SetUserPreferences to be called from the UI - const oUserPreferences = JSON.parse('{{ user_preferences|json_encode|e('js') }}'); + // user preferences object + const oUserPreferences = new UserPreferences('{{ app['url_generator'].generate('p_preferences_set_preference')|raw }}'); /** * @param sUrl {string} The URL to append the new param to * @param sParamName {string} Name of the parameter diff --git a/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_classmap.php b/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_classmap.php index 464028ea3..f8c764b11 100644 --- a/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_classmap.php +++ b/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_classmap.php @@ -25,6 +25,7 @@ return array( 'Combodo\\iTop\\Portal\\Controller\\DefaultController' => $baseDir . '/src/Controller/DefaultController.php', 'Combodo\\iTop\\Portal\\Controller\\ManageBrickController' => $baseDir . '/src/Controller/ManageBrickController.php', 'Combodo\\iTop\\Portal\\Controller\\ObjectController' => $baseDir . '/src/Controller/ObjectController.php', + 'Combodo\\iTop\\Portal\\Controller\\PreferencesController' => $baseDir . '/src/Controller/PreferencesController.php', 'Combodo\\iTop\\Portal\\Controller\\SessionMessageController' => $baseDir . '/src/Controller/SessionMessageController.php', 'Combodo\\iTop\\Portal\\Controller\\UserProfileBrickController' => $baseDir . '/src/Controller/UserProfileBrickController.php', 'Combodo\\iTop\\Portal\\DataCollector\\PortalCollector' => $baseDir . '/src/DataCollector/PortalCollector.php', diff --git a/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_static.php b/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_static.php index e50f3e609..75e390678 100644 --- a/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_static.php +++ b/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_static.php @@ -45,6 +45,7 @@ class ComposerStaticInitCombodo_ItopPortalBase_Portal 'Combodo\\iTop\\Portal\\Controller\\DefaultController' => __DIR__ . '/../..' . '/src/Controller/DefaultController.php', 'Combodo\\iTop\\Portal\\Controller\\ManageBrickController' => __DIR__ . '/../..' . '/src/Controller/ManageBrickController.php', 'Combodo\\iTop\\Portal\\Controller\\ObjectController' => __DIR__ . '/../..' . '/src/Controller/ObjectController.php', + 'Combodo\\iTop\\Portal\\Controller\\PreferencesController' => __DIR__ . '/../..' . '/src/Controller/PreferencesController.php', 'Combodo\\iTop\\Portal\\Controller\\SessionMessageController' => __DIR__ . '/../..' . '/src/Controller/SessionMessageController.php', 'Combodo\\iTop\\Portal\\Controller\\UserProfileBrickController' => __DIR__ . '/../..' . '/src/Controller/UserProfileBrickController.php', 'Combodo\\iTop\\Portal\\DataCollector\\PortalCollector' => __DIR__ . '/../..' . '/src/DataCollector/PortalCollector.php', diff --git a/datamodels/2.x/itop-portal-base/portal/vendor/composer/installed.php b/datamodels/2.x/itop-portal-base/portal/vendor/composer/installed.php index 1a0595d07..22c7e3072 100644 --- a/datamodels/2.x/itop-portal-base/portal/vendor/composer/installed.php +++ b/datamodels/2.x/itop-portal-base/portal/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '6d8d747575dc9cd4b53dc9592eb646b692d3ea86', + 'reference' => 'c203329236dfb3c05aa02ac73ab12dd1fe52143e', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '6d8d747575dc9cd4b53dc9592eb646b692d3ea86', + 'reference' => 'c203329236dfb3c05aa02ac73ab12dd1fe52143e', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(),