Settings: fold Users and Organization into the Settings tabs

The left rail is back to the three places you actually go — Garage,
Charging, Settings — and user management moves inside Settings as an
admin-only tab, next to a new Organization tab that used to be a card
buried in the personal settings. Tab order is Personal settings, Users,
Organization, Integrations. /admin redirects to /settings?tab=users so
old links keep working, and ?tab= picks the starting tab in general.

AdminUsers moves from views/ to components/ since it is a panel now, not
a route, and its page header becomes a section header like its
neighbours. The personal panel was split in two around the integrations
markup, which left no gap between the Profile and Privacy cards; it is
one block again.

Creating a user gets an organization picker for superadmins, defaulting
to "no organization" so an org-less account stays a deliberate choice.
Admins see no picker: the server pins their members to their own org
regardless, which users_test.go now covers along with both superadmin
paths.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tajniak81
2026-08-17 17:38:54 +02:00
co-authored by Claude Opus 5
parent cd16d4383f
commit e373497958
10 changed files with 387 additions and 151 deletions
+3 -8
View File
@@ -4,8 +4,7 @@ import CarDetail from "./views/CarDetail.vue";
import Charging from "./views/Charging.vue";
import Login from "./views/Login.vue";
import Settings from "./views/Settings.vue";
import AdminUsers from "./views/AdminUsers.vue";
import { isAuthenticated, isAdmin } from "./auth";
import { isAuthenticated } from "./auth";
const routes = [
{ path: "/login", name: "login", component: Login, meta: { public: true } },
@@ -13,7 +12,8 @@ const routes = [
{ path: "/charging", name: "charging", component: Charging },
{ path: "/cars/:id", name: "car", component: CarDetail, props: true },
{ path: "/settings", name: "settings", component: Settings },
{ path: "/admin", name: "admin", component: AdminUsers, meta: { admin: true } },
// User management moved into Settings; keep old links working.
{ path: "/admin", redirect: { name: "settings", query: { tab: "users" } } },
];
const router = createRouter({
@@ -29,11 +29,6 @@ router.beforeEach((to) => {
if (to.name === "login" && isAuthenticated.value) {
return { name: "dashboard" };
}
// Admin-only routes: bounce non-admins to the dashboard. (Server enforces the
// real gate; this just avoids showing a page that would 403 on every call.)
if (to.meta.admin && !isAdmin.value) {
return { name: "dashboard" };
}
});
export default router;