feat(web): I1 shell and I2 customer/project UI

Vue 3 + Element Plus layout with JWT login, RBAC routes, axios 401
handling with token restore, and Customers/Projects views wired to
platform APIs.

Made-with: Cursor
This commit is contained in:
2026-04-06 21:05:02 +08:00
parent 3f577b34d5
commit 65eb983035
18 changed files with 2939 additions and 0 deletions
@@ -0,0 +1,19 @@
/**
* @param {unknown} err
* @param {string} fallback
*/
export function apiErrorMessage(err, fallback) {
const e = err && typeof err === "object" && "response" in err ? err : null;
const data = e?.response?.data;
if (typeof data === "string" && data.trim()) return data;
if (data && typeof data === "object") {
if (typeof data.message === "string" && data.message.trim()) return data.message;
if (Array.isArray(data.errors)) {
const parts = data.errors
.map((x) => (x && typeof x === "object" ? x.defaultMessage || x.message : null))
.filter(Boolean);
if (parts.length) return parts.join("");
}
}
return fallback;
}