diff --git a/datamodels/2.x/itop-portal-base/portal/config/legacy_silex_compat_layer.php b/datamodels/2.x/itop-portal-base/portal/config/legacy_silex_compat_layer.php
index f41f971b90..06e69d1d73 100644
--- a/datamodels/2.x/itop-portal-base/portal/config/legacy_silex_compat_layer.php
+++ b/datamodels/2.x/itop-portal-base/portal/config/legacy_silex_compat_layer.php
@@ -48,6 +48,9 @@ $oListsCompat = new Lists($oModuleDesign);
$oListsCompat->Process($container);
// Generating CSS files
+// Note: We do this here as it is not user dependent and therefore can be cached for everyone.
+// A dedicated listener 'CssFromSassCompiler' exists to compile files again when by-passing HTTP cache.
+// This is to keep developers comfort when tuning the SCSS files.
$aImportPaths = array($_ENV['COMBODO_PORTAL_BASE_ABSOLUTE_PATH'].'css/');
$aPortalConf = $container->getParameter('combodo.portal.instance.conf');
foreach ($aPortalConf['properties']['themes'] as $sKey => $value)
@@ -68,43 +71,4 @@ foreach ($aPortalConf['properties']['themes'] as $sKey => $value)
$aPortalConf['properties']['themes'][$sKey] = $aValues;
}
}
-$container->setParameter('combodo.portal.instance.conf', $aPortalConf);
-
-//TODO: The following needs to be refactored
-// Session messages
-// Note: We keep this system instead of following the Symfony system to make it simpler for extension developers to use them accross the admin. console and the portal.
-$aAllMessages = array();
-if ((array_key_exists('obj_messages', $_SESSION)) && (!empty($_SESSION['obj_messages'])))
-{
- foreach ($_SESSION['obj_messages'] as $sMessageKey => $aMessageObjectData)
- {
- $aObjectMessages = array();
- $aRanks = array();
- foreach ($aMessageObjectData as $sMessageId => $aMessageData)
- {
- $sMsgClass = 'alert alert-dismissible alert-';
- switch ($aMessageData['severity'])
- {
- case 'info':
- $sMsgClass .= 'info';
- break;
- case 'error':
- $sMsgClass .= 'danger';
- break;
- case 'ok':
- default:
- $sMsgClass .= 'success';
- break;
- }
- $aObjectMessages[] = array('css_classes' => $sMsgClass, 'message' => $aMessageData['message']);
- $aRanks[] = $aMessageData['rank'];
- }
- //unset($_SESSION['obj_messages'][$sMessageKey]);
- array_multisort($aRanks, $aObjectMessages);
- foreach ($aObjectMessages as $aObjectMessage)
- {
- $aAllMessages[] = $aObjectMessage;
- }
- }
-}
-$container->setParameter('combodo.current_user.session_messages', $aAllMessages);
\ No newline at end of file
+$container->setParameter('combodo.portal.instance.conf', $aPortalConf);
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/session_message.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/session_message.yaml
new file mode 100644
index 0000000000..347f761bc0
--- /dev/null
+++ b/datamodels/2.x/itop-portal-base/portal/config/routes/session_message.yaml
@@ -0,0 +1,21 @@
+# Copyright (C) 2010-2020 Combodo SARL
+#
+# 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_session_message_add:
+ path: '/session-message/add'
+ defaults:
+ _controller: 'Combodo\iTop\Portal\Controller\SessionMessageController::AddMessageAction'
diff --git a/datamodels/2.x/itop-portal-base/portal/config/services.yaml b/datamodels/2.x/itop-portal-base/portal/config/services.yaml
index 2657862b81..a343a9f4c4 100644
--- a/datamodels/2.x/itop-portal-base/portal/config/services.yaml
+++ b/datamodels/2.x/itop-portal-base/portal/config/services.yaml
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2018 Combodo SARL
+# Copyright (C) 2010-2020 Combodo SARL
#
# This file is part of iTop.
#
@@ -74,6 +74,8 @@ services:
tags: [{ name: 'kernel.event_listener', event: 'kernel.request', priority: 400 }]
Combodo\iTop\Portal\EventListener\ApplicationContextSetPluginPropertyClass:
tags: [{ name: 'kernel.event_listener', event: 'kernel.request', priority: 300 }]
+ Combodo\iTop\Portal\EventListener\CssFromSassCompiler:
+ tags: [{ name: 'kernel.event_listener', event: 'kernel.request', priority: 200 }]
# Add more service definitions when explicit configuration is needed
# Please note that last definitions always *replace* previous ones
@@ -141,4 +143,7 @@ services:
public: true
brick_controller_helper:
alias: Combodo\iTop\Portal\Helper\BrickControllerHelper
+ public: true
+ session_message_helper:
+ alias: Combodo\iTop\Portal\Helper\SessionMessageHelper
public: true
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/SessionMessageController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/SessionMessageController.php
new file mode 100644
index 0000000000..33319523be
--- /dev/null
+++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/SessionMessageController.php
@@ -0,0 +1,67 @@
+
+ * @package Combodo\iTop\Portal\Controller
+ * @since 2.7.0
+ */
+class SessionMessageController extends AbstractController
+{
+ /**
+ * @param \Symfony\Component\HttpFoundation\Request $oRequest
+ *
+ * @return \Symfony\Component\HttpFoundation\Response
+ */
+ public function AddMessageAction(Request $oRequest)
+ {
+ $aData = array();
+
+ /** @var \Combodo\iTop\Portal\Helper\RequestManipulatorHelper $oRequestManipulator */
+ $oRequestManipulator = $this->get('request_manipulator');
+ /** @var \Combodo\iTop\Portal\Helper\SessionMessageHelper $oSessionMessageHelper */
+ $oSessionMessageHelper = $this->get('session_message_helper');
+
+ // Retrieve parameters
+ $sMessageSeverity = $oRequestManipulator->ReadParam('sSeverity');
+ $sMessageContent = $oRequestManipulator->ReadParam('sContent');
+
+ // Check parameters consistency
+ if (empty($sMessageSeverity) || empty($sMessageContent))
+ {
+ throw new HttpException(Response::HTTP_BAD_REQUEST, 'Message must have a severity and a content, make sure both sSeverity & sContent parameters are sent.');
+ }
+
+ // Add message
+ $oSessionMessageHelper->AddMessage(uniqid(), $sMessageContent, $sMessageSeverity);
+
+ return new JsonResponse($aData);
+ }
+
+}
diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php
new file mode 100644
index 0000000000..37b67db385
--- /dev/null
+++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php
@@ -0,0 +1,76 @@
+aCombodoPortalInstanceConf = $aCombodoPortalInstanceConf;
+ }
+
+ /**
+ * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent
+ */
+ public function onKernelRequest(GetResponseEvent $oGetResponseEvent)
+ {
+ // Force compilation need only when by-passing cache to limit server load.
+ if (isset($_SERVER['HTTP_CACHE_CONTROL']) && ($_SERVER['HTTP_CACHE_CONTROL'] !== 'no-cache'))
+ {
+ return;
+ }
+
+ $aImportPaths = array($_ENV['COMBODO_PORTAL_BASE_ABSOLUTE_PATH'].'css/');
+ foreach ($this->aCombodoPortalInstanceConf['properties']['themes'] as $sKey => $value)
+ {
+ if (!is_array($value))
+ {
+ utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$value, $aImportPaths);
+ }
+ else
+ {
+ foreach ($value as $sSubValue)
+ {
+ utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$sSubValue, $aImportPaths);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
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 658f972722..a6f9fcef94 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
@@ -325,25 +325,20 @@
-
- {% if app['combodo.current_user.session_messages']|length > 0 %}
-
-
- {% for aSessionMessage in app['combodo.current_user.session_messages'] %}
-
-
- {{ aSessionMessage['message'] }}
-
- {% endfor %}
-
-
- {% endif %}
-
+
+
+ {% for aSessionMessage in app['session_message_helper'] %}
+