diff --git a/assets/js/app.js b/assets/js/app.js index 65336fed..d81a2cf0 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -42,6 +42,7 @@ require('bootstrap'); import "./sidebar" import "./datatables"; +import "./error_handler"; //import "./tab_remember"; import "./register_events"; diff --git a/assets/js/error_handler.js b/assets/js/error_handler.js new file mode 100644 index 00000000..4cf3ef77 --- /dev/null +++ b/assets/js/error_handler.js @@ -0,0 +1,76 @@ +import * as bootbox from "bootbox"; + +/** + * If this class is imported the user is shown an error dialog if he calls an page via Turbo and an error is responded. + * @type {ErrorHandlerHelper} + */ +const ErrorHandlerHelper = class { + constructor() { + console.log('Error Handler registered'); + + const content = document.getElementById('content'); + content.addEventListener('turbo:before-fetch-response', (event) => this.handleError(event)); + } + + handleError(event) { + const fetchResponse = event.detail.fetchResponse; + const response = fetchResponse.response; + + //Ignore aborted requests. + if (response.statusText =='abort' || response.status == 0) { + return; + } + + if(fetchResponse.failed) { + //Create error text + let title = response.statusText + ' (Status ' + response.status + ')'; + + /** + switch(response.status) { + case 500: + title = 'Internal Server Error!'; + break; + case 404: + title = "Site not found!"; + break; + case 403: + title = "Permission denied!"; + break; + } **/ + + const alert = bootbox.alert( + { + size: 'large', + message: function() { + let url = fetchResponse.location.toString(); + let msg = `Error calling ${url}. `; + msg += 'Try to reload the page or contact the administrator if this error persists.' + + msg += '

' + 'View details' + ""; + msg += "
"; + + return msg; + }, + title: title, + callback: function () { + //Remove blur + $('#content').removeClass('loading-content'); + } + + }); + + //@ts-ignore + alert.init(function (){ + response.text().then( (html) => { + var dstFrame = document.getElementById('error-iframe'); + //@ts-ignore + var dstDoc = dstFrame.contentDocument || dstFrame.contentWindow.document; + dstDoc.write(html) + dstDoc.close(); + }); + }); + } + } +} + +export default new ErrorHandlerHelper(); \ No newline at end of file