Merge #16602 - Fix #16568 - Multiple Error Notifications and report requests

Pull-request: #16602
Fixes: #16568

Signed-off-by: William Desportes <williamdes@wdes.fr>
This commit is contained in:
William Desportes 2021-03-15 01:36:56 +01:00
commit 9d1925c3f6
No known key found for this signature in database
GPG Key ID: 90A0EF1B8251A889

View File

@ -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 = $(
'<div class="alert alert-danger userPermissionModal" role="alert" id="error_notification"></div>'
'<div class="alert alert-danger userPermissionModal error_message" role="alert" id="error_notification"></div>'
).append(
Functions.getImage('s_error') + Messages.strErrorOccurred
);
var $buttons = $('<div class="float-end"></div>');
var buttonHtml = '<button class="btn btn-primary" id="show_error_report">';
var key = Math.random().toString(36).substring(2, 12);
while (key in ErrorReport.keyDict) {
key = Math.random().toString(36).substring(2, 12);
}
ErrorReport.keyDict[key] = 1;
var buttonHtml = '<button class="btn btn-primary" id="show_error_report_' + key + '">';
buttonHtml += Messages.strShowReportDetails;
buttonHtml += '</button>';
@ -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();
});
},