diff --git a/js/src/error_report.js b/js/src/error_report.js index a55ffda9b8..0e21d34a33 100644 --- a/js/src/error_report.js +++ b/js/src/error_report.js @@ -10,12 +10,44 @@ var ErrorReport = { * @var {object}, stores the last exception info */ lastException: null, + /** + * @var object stores the Error Report Data to prevent unnecessary data fetching + */ + errorReportData: null, + /** + * @var object maintains unique keys already used + */ + keyDict: {}, /** * handles thrown error exceptions based on user preferences * + * @param {object} data * @param {any} exception * @return {void} */ + errorDataHandler: function (data, exception) { + if (data.success !== true) { + Functions.ajaxShowMessage(data.error, false); + return; + } + if (data.report_setting === 'ask') { + ErrorReport.showErrorNotification(); + } else if (data.report_setting === 'always') { + var reportData = ErrorReport.getReportData(exception); + var postData = $.extend(reportData, { + 'send_error_report': true, + 'automatic': true + }); + $.post('index.php?route=/error-report', postData, function (data) { + if (data.success === false) { + // in the case of an error, show the error message returned. + Functions.ajaxShowMessage(data.error, false); + } else { + Functions.ajaxShowMessage(data.message, false); + } + }); + } + }, errorHandler: function (exception) { // issue: 14359 if (JSON.stringify(ErrorReport.lastException) === JSON.stringify(exception)) { @@ -25,34 +57,19 @@ var ErrorReport = { exception.name = ErrorReport.extractExceptionName(exception); } ErrorReport.lastException = exception; - $.post('index.php?route=/error-report', { - 'ajax_request': true, - 'server': CommonParams.get('server'), - 'get_settings': true, - 'exception_type': 'js' - }, function (data) { - if (data.success !== true) { - Functions.ajaxShowMessage(data.error, false); - return; - } - if (data.report_setting === 'ask') { - ErrorReport.showErrorNotification(); - } else if (data.report_setting === 'always') { - var reportData = ErrorReport.getReportData(exception); - var postData = $.extend(reportData, { - 'send_error_report': true, - 'automatic': true - }); - $.post('index.php?route=/error-report', postData, function (data) { - if (data.success === false) { - // in the case of an error, show the error message returned. - Functions.ajaxShowMessage(data.error, false); - } else { - Functions.ajaxShowMessage(data.message, false); - } - }); - } - }); + if (ErrorReport.errorReportData === null) { + $.post('index.php?route=/error-report', { + 'ajax_request': true, + 'server': CommonParams.get('server'), + 'get_settings': true, + 'exception_type': 'js' + }, function (data) { + ErrorReport.errorReportData = data; + ErrorReport.errorDataHandler(data, exception); + }); + } else { + ErrorReport.errorDataHandler(ErrorReport.errorReportData, exception); + } }, /** * Shows the modal dialog previewing the report @@ -83,6 +100,8 @@ var ErrorReport = { $.post('index.php?route=/error-report', reportData).done(function (data) { const $errorReportModal = $('#errorReportModal'); $errorReportModal.on('show.bs.modal', function () { + // Prevents multiple onClick events + $('#errorReportModalConfirm').off('click', sendErrorReport); $('#errorReportModalConfirm').on('click', sendErrorReport); this.querySelector('.modal-body').innerHTML = data.message; }); @@ -98,14 +117,18 @@ var ErrorReport = { ErrorReport.removeErrorNotification(); var $div = $( - '' + '' ).append( Functions.getImage('s_error') + Messages.strErrorOccurred ); var $buttons = $('
'); - - var buttonHtml = ''; @@ -121,8 +144,8 @@ var ErrorReport = { $div.append($buttons); $div.appendTo(document.body); + $(document).on('click', '#show_error_report_' + key, ErrorReport.createReportDialog); $(document).on('click', '#change_error_settings', ErrorReport.redirectToSettings); - $(document).on('click', '#show_error_report', ErrorReport.createReportDialog); $(document).on('click', '#ignore_error', ErrorReport.removeErrorNotification); }, /** @@ -136,7 +159,7 @@ var ErrorReport = { // don't remove the hash fragment by navigating to # e.preventDefault(); } - $('#error_notification').fadeOut(function () { + $('.error_message').fadeOut(function () { $(this).remove(); }); },