diff --git a/ayanova/devdocs/todo.txt b/ayanova/devdocs/todo.txt index e640c117..6e90b53d 100644 --- a/ayanova/devdocs/todo.txt +++ b/ayanova/devdocs/todo.txt @@ -2,9 +2,8 @@ @@@@@@@@@@@@@@@ ROADMAP STAGE 4 - REPORTING / DASHBOARD / KPI @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +todo: exception handling around reports sucks - -todo: can it just scan for locale keys and prefetch them rather than user having to add up front? todo: a script error when just running a report from the report selector acts weird Test with dev mode off to confirm it won't show it in the UI Should show the error in the UI @@ -64,6 +63,8 @@ todo: consider feature to set server to always use a pre-set browser locale sett YAGNI / TTM? +todo: make our logo smaller or move it when a biz logo is displaying on the login form + todo: hide swagger logo and branding in api explorer todo: chunk-vendors has fa-brands in it which is fucking huge, what else is in there I don't need? diff --git a/ayanova/src/api/errorhandler.js b/ayanova/src/api/errorhandler.js index 089f6827..bf6eb751 100644 --- a/ayanova/src/api/errorhandler.js +++ b/ayanova/src/api/errorhandler.js @@ -56,6 +56,60 @@ function dealWithError(msg, vm) { //why two error properties? window.$gz.form.setErrorBoxErrors(vm); } + +/////////////////////////////////////////////////////////////////////////////////// +// DECODE ERROR TO TEXT +// accept an unknown type of error variable +// and return human readable text +// +function decodeError(e, vm) { + //empty? + if (e == null || e == "") { + return "errorHandler::decodeError - Error is unknown / empty"; + } + + //an Error object? + if (e instanceof Error) { + return `Error - Name:${e.name}, Message:${e.message}`; + } + + //API error object? + if (e.error) { + let err = e.error; + // { + // "code": "2002", + // "message": "See server log for details", + // "target": "Server internal error" + // } + let msg = ""; + if (err.code) { + msg += err.code; + msg += " - "; + if (vm) { + msg += vm.$ay.t("ErrorAPI" + err.code); + } + msg += "\n"; + } + if (err.target) { + msg += err.target; + msg += "\n"; + } + + if (err.message) { + msg += err.message; + msg += "\n"; + } + return msg; + } + + //Javascript Fetch API Response object? + if (e instanceof Response) { + return `http error: ${err.statusText} - ${err.status} Url: ${err.url}`; + } + + //last resort + return JSON.stringify(e); +} export default { handleGeneralError(message, source, lineno, colno, error) { let msg = "General error: \n" + message; @@ -77,7 +131,7 @@ export default { dealWithError(msg); }, handleVueError(err, vm, info) { - let msg = "Vue error: \n" + err; + let msg = "Vue error: \n" + decodeError(err, vm); if (err.fileName) { msg += "\nfilename: " + err.fileName; } @@ -90,65 +144,21 @@ export default { if (err.stack) { msg += "\nSTACK:\n " + err.stack; } - dealWithError(msg); + dealWithError(msg, vm); }, handleVueWarning(wmsg, vm, trace) { - let msg = "Vue warning: \n" + wmsg; - // if (vm) { - // msg += "\nvm present "; - // } + let msg = "Vue warning: \n" + decodeError(wmsg, vm); if (trace) { msg += "\ntrace: " + trace; } - dealWithError(msg); + dealWithError(msg, vm); }, ///////////////////////////////////////////////// // translate, log and return error // handleFormError(err, vm) { //called inside forms when things go unexpectedly wrong - //returns the translated message in case the form wants to display it as well - if (err instanceof Error && err.message) { - dealWithError(err.message, vm); - } else if (err.error) { - //it's an api error return object, translate and display correctly - err = err.error; - // { - // "code": "2002", - // "message": "See server log for details", - // "target": "Server internal error" - // } - let msg = ""; - if (err.code) { - msg += err.code; - msg += " - "; - msg += vm.$ay.t("ErrorAPI" + err.code); - msg += "\n"; - } - if (err.target) { - msg += err.target; - msg += "\n"; - } - - if (err.message) { - msg += err.message; - msg += "\n"; - } - dealWithError(msg, vm); - } else if (err instanceof Response) { - let msg = - "http error: " + - err.statusText + - " - " + - err.status + - " Url: " + - err.url; - dealWithError(msg, vm); - } else { - //last resort - let msg = JSON.stringify(err); - dealWithError(msg, vm); - } + dealWithError(decodeError(err, vm), vm); } }; /* diff --git a/ayanova/src/main.js b/ayanova/src/main.js index 7becc2b1..58904e42 100644 --- a/ayanova/src/main.js +++ b/ayanova/src/main.js @@ -62,7 +62,7 @@ import chartBarHorizontalControl from "./components/chart-bar-horizontal-control //DEVELOPMENT MODE //THIS SHOULD BE FALSE IN RELEASE //************************************************************ -const DEV_MODE = true; +const DEV_MODE = false; //************************************************************ //************************************************************** //************************************************************** @@ -105,6 +105,14 @@ window.$gz = { Vue.config.errorHandler = errorHandler.handleVueError; window.onerror = errorHandler.handleGeneralError; + +//unhandled rejection handler here +window.addEventListener("unhandledrejection", function(event) { + // the event object has two special properties: + alert(event.promise); // [object Promise] - the promise that generated the error + alert(event.reason); // Error: Whoops! - the unhandled error object +}); + //warnings, only occur by default in debug mode not production Vue.config.warnHandler = errorHandler.handleVueWarning; diff --git a/ayanova/src/views/widget.vue b/ayanova/src/views/widget.vue index 4bea1986..2277bf21 100644 --- a/ayanova/src/views/widget.vue +++ b/ayanova/src/views/widget.vue @@ -629,6 +629,8 @@ async function clickHandler(menuItem) { m.vm.duplicate(); break; case "report": + // throw "blah blah blah"; + // throw Error("test exception"); if (m.id != null) { //last report selected is in m.id m.vm.$router.push({