178 lines
4.9 KiB
JavaScript
178 lines
4.9 KiB
JavaScript
/* xeslint-disable */
|
|
let lastMessageHash = 0;
|
|
|
|
////////////////////////////////////////////////////////
|
|
//
|
|
// translate, Log and optionally display errors
|
|
// return translated message in case caller needs it
|
|
function dealWithError(msg, vm) {
|
|
//Check if this is the same message again as last time to avoid
|
|
//repetitive loops of useless messages
|
|
let newHash = window.$gz.util.quickHash(msg);
|
|
if (newHash == lastMessageHash) {
|
|
return;
|
|
}
|
|
lastMessageHash = newHash;
|
|
|
|
//translate as necessary
|
|
msg = window.$gz.translation.translateString(msg);
|
|
|
|
//In some cases the error may not be translatable, if this is not a debug run then it should show without the ?? that translating puts in keys not found
|
|
//so it's not as weird looking to the user
|
|
//vm may be null here so check window gz for dev
|
|
if (!window.$gz.dev && msg.includes("??")) {
|
|
msg = msg.replace("??", "");
|
|
}
|
|
window.$gz.store.commit("logItem", msg);
|
|
if (window.$gz.dev) {
|
|
let errMsg = "Unexpected error: \r\n" + msg;
|
|
// eslint-disable-next-line no-console
|
|
console.error(errMsg);
|
|
console.trace();
|
|
debugger;
|
|
// window.$gz.eventBus.$emit("notify-error", "Dev error see log / console");
|
|
return;
|
|
}
|
|
|
|
//If a form instance was provided (vue instance)
|
|
//and it can display and error then put the error into it
|
|
if (!vm || vm.formState == undefined) {
|
|
//popup if no place to display it elsewise
|
|
window.$gz.eventBus.$emit("notify-error", msg);
|
|
return;
|
|
}
|
|
|
|
//should be able to display in form...
|
|
if (vm.$ay.dev) {
|
|
//make sure formState.appError is defined on data
|
|
if (!window.$gz._.has(vm, "formState.appError")) {
|
|
throw new Error(
|
|
"DEV ERROR errorHandler::dealWithError -> formState.appError seems to be missing from form's vue data object"
|
|
);
|
|
}
|
|
}
|
|
vm.formState.appError = msg;
|
|
|
|
//TODO: What is this doing exactly?
|
|
//it's related to server errors but I'm setting appError above
|
|
//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;
|
|
if (source) {
|
|
msg += "\nsource: " + source;
|
|
}
|
|
if (lineno) {
|
|
msg += "\nlineno: " + lineno;
|
|
}
|
|
if (colno) {
|
|
msg += "\ncolno: " + colno;
|
|
}
|
|
if (error) {
|
|
if (typeof error === "object") {
|
|
error = JSON.stringify(error);
|
|
}
|
|
msg += "\nerror: " + error;
|
|
}
|
|
dealWithError(msg);
|
|
},
|
|
handleVueError(err, vm, info) {
|
|
let msg = "Vue error: \n" + decodeError(err, vm);
|
|
if (err.fileName) {
|
|
msg += "\nfilename: " + err.fileName;
|
|
}
|
|
if (err.lineNumber) {
|
|
msg += "\nlineNumber: " + err.lineNumber;
|
|
}
|
|
if (info) {
|
|
msg += "\ninfo: " + info;
|
|
}
|
|
if (err.stack) {
|
|
msg += "\nSTACK:\n " + err.stack;
|
|
}
|
|
dealWithError(msg, vm);
|
|
},
|
|
handleVueWarning(wmsg, vm, trace) {
|
|
let msg = "Vue warning: \n" + decodeError(wmsg, vm);
|
|
if (trace) {
|
|
msg += "\ntrace: " + trace;
|
|
}
|
|
dealWithError(msg, vm);
|
|
},
|
|
/////////////////////////////////////////////////
|
|
// translate, log and return error
|
|
//
|
|
handleFormError(err, vm) {
|
|
//called inside forms when things go unexpectedly wrong
|
|
dealWithError(decodeError(err, vm), vm);
|
|
}
|
|
};
|
|
/*
|
|
ERROR CODES USED:
|
|
Client error codes are all in the range of E16 to E999
|
|
Server error codes are all in the range of E1000 to E1999
|
|
API specific (logic) error codes are all in the range of 2000 to 3000
|
|
|
|
CLIENT ERROR CODES:
|
|
E16 - ErrorUserNotAuthenticated
|
|
E17 - ErrorServerUnresponsive
|
|
E18 - Misc error without a translation key, unexpected throws etc or api error during server call, details in the message / Any error without a translation key defined basically
|
|
|
|
*/
|