diff --git a/datamodels/2.x/itop-portal-base/portal/src/views/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/src/views/layout.html.twig
index 54d2ca62e9..d9a2372084 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/views/layout.html.twig
+++ b/datamodels/2.x/itop-portal-base/portal/src/views/layout.html.twig
@@ -388,6 +388,16 @@
sUrl += (sUrl.split('?')[1] ? '&':'?') + sParamName + '=' + sParamValue;
return sUrl;
};
+ // Test is sString is a valid JSON string
+ var IsJSONString = function(sString)
+ {
+ try {
+ JSON.parse(sString);
+ } catch (oException) {
+ return false;
+ }
+ return true;
+ }
var GetContentLoaderTemplate = function()
{
return '
{{ 'Page:PleaseWait'|dict_s }}
';
@@ -460,6 +470,19 @@
{
ShowErrorDialog('{{ 'UI:ObjectDoesNotExist'|dict_s|escape('js') }}', '{{ 'Error:HTTP:404'|dict_s|escape('js') }}');
}
+ else if(oXHR.responseText !== undefined && IsJSONString(oXHR.responseText) === true)
+ {
+ var oData = JSON.parse(oXHR.responseText);
+ // Catching AJAX exception with detailed error.
+ if( (oData.error_message !== undefined) && (oData.error_title !== undefined) )
+ {
+ ShowErrorDialog(oData.error_message, oData.error_title);
+ }
+ else
+ {
+ ShowErrorDialog();
+ }
+ }
else
{
ShowErrorDialog();
diff --git a/datamodels/2.x/itop-portal-base/portal/web/css/portal.css b/datamodels/2.x/itop-portal-base/portal/web/css/portal.css
index 89275acfee..26d4be19c8 100644
--- a/datamodels/2.x/itop-portal-base/portal/web/css/portal.css
+++ b/datamodels/2.x/itop-portal-base/portal/web/css/portal.css
@@ -263,6 +263,10 @@ footer {
/******************/
/* Modal settings */
/******************/
+#modal-for-alert {
+ z-index: 9999;
+ /* Should always be on top to display errors messages */
+}
.modal-content .content_loader {
margin: 7em 0em;
text-align: center;
diff --git a/datamodels/2.x/itop-portal-base/portal/web/css/portal.scss b/datamodels/2.x/itop-portal-base/portal/web/css/portal.scss
index 48528507d0..b73b4fd1d1 100644
--- a/datamodels/2.x/itop-portal-base/portal/web/css/portal.scss
+++ b/datamodels/2.x/itop-portal-base/portal/web/css/portal.scss
@@ -278,6 +278,9 @@ footer{
/******************/
/* Modal settings */
/******************/
+#modal-for-alert{
+ z-index: 9999; /* Should always be on top to display errors messages */
+}
.modal-content .content_loader{
margin: 7em 0em;
text-align: center;
diff --git a/datamodels/2.x/itop-portal-base/portal/web/js/portal_form_handler.js b/datamodels/2.x/itop-portal-base/portal/web/js/portal_form_handler.js
index 91aeaefd7d..68bf632af0 100644
--- a/datamodels/2.x/itop-portal-base/portal/web/js/portal_form_handler.js
+++ b/datamodels/2.x/itop-portal-base/portal/web/js/portal_form_handler.js
@@ -175,7 +175,15 @@ $(function()
// Passing formmanager data to the next page, just in case it needs it (eg. when applying stimulus)
formmanager_class: me.options.formmanager_class,
formmanager_data: JSON.stringify(me.options.formmanager_data)
- }
+ },
+ function(oData, sStatus, oXHR)
+ {
+ if(sStatus === 'error')
+ {
+ // Hiding modal in case of error as the general AJAX error handler will display a message
+ oModalElem.modal('hide');
+ }
+ }
);
oModalElem.modal('show');