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');