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(),