- API и страницы профиля (редактирование, смена пароля, аватар), публичные карточки. - Сайдбар: блок пользователя, пункт Users для admin/root, исправлен порядок инициализации (показ admin-only после initAuthSession, currentUser). - GET /auth/me: ответ через ProfileMeResponse, исправлена валидация (is_founder bool). Команды и роли - Маршруты и UI команд; при редактировании роли: видимость Team, выбор команды в модалке, только команды с активным членством; API team_id в details/ update. - GET /api/v1/teams?membership=active для списка «своих» команд. - Форма роли: сегмент Team, панель выбора команды только при Team и не при с
92 lines
3.8 KiB
JavaScript
92 lines
3.8 KiB
JavaScript
window.dashboard = window.dashboard || {};
|
|
|
|
window.addEventListener("unhandledrejection", async (event) => {
|
|
event.preventDefault();
|
|
await dashboard.showErrorModal(event.reason, "Unhandled error");
|
|
});
|
|
|
|
window.addEventListener("error", async (event) => {
|
|
if (!event || !event.error) return;
|
|
await dashboard.showErrorModal(event.error, "Application error");
|
|
});
|
|
|
|
dashboard.initTheme();
|
|
dashboard.initLogout();
|
|
|
|
/**
|
|
* Show Users / Admin accordion etc. only for admin|root. Must run after initAuthSession so the token
|
|
* and dashboard.currentUser are loaded (parallel initAdminOnlyMenu previously raced and left links hidden).
|
|
*/
|
|
async function applyAdminOnlySidebarNav() {
|
|
if (!dashboard.getAccessToken()) return;
|
|
try {
|
|
const me = dashboard.currentUser || (await dashboard.apiFetch("/auth/me"));
|
|
const role = String((me && me.role) || "").toLowerCase();
|
|
const show = role === "admin" || role === "root";
|
|
document.querySelectorAll(".menu-item-admin-only").forEach((el) => {
|
|
el.style.display = show ? "" : "none";
|
|
});
|
|
if (show) {
|
|
try {
|
|
dashboard.markActiveSidebar();
|
|
} catch (_e2) {
|
|
void _e2;
|
|
}
|
|
} else if (String(dashboard.page || "").startsWith("admin-")) {
|
|
window.location.href = "/";
|
|
}
|
|
} catch (_e) {
|
|
document.querySelectorAll(".menu-item-admin-only").forEach((el) => {
|
|
el.style.display = "none";
|
|
});
|
|
if (String(dashboard.page || "").startsWith("admin-")) {
|
|
window.location.href = "/";
|
|
}
|
|
}
|
|
}
|
|
|
|
void (async function bootstrapSessionAndSidebar() {
|
|
await dashboard.initAuthSession();
|
|
dashboard.initSidebarUserMenu();
|
|
await applyAdminOnlySidebarNav();
|
|
})();
|
|
if (dashboard.page === "audit-logs") dashboard.initAuditLogs();
|
|
if (dashboard.page === "users") dashboard.initUsersPage();
|
|
if (dashboard.page === "user-detail") dashboard.initUserDetailPage();
|
|
if (dashboard.page === "admin-options") dashboard.initAdminOptionsPage();
|
|
if (dashboard.page === "clusters") dashboard.initClusterList();
|
|
if (dashboard.page === "cluster-create") dashboard.initClusterCreate();
|
|
if (dashboard.page === "addon-install") dashboard.initAddonInstall();
|
|
if (dashboard.page === "cluster-detail") dashboard.initClusterDetail();
|
|
if (dashboard.page === "cluster-provisioning") dashboard.initClusterDetail();
|
|
if (dashboard.page === "cluster-rbac") dashboard.initClusterDetail();
|
|
if (dashboard.page === "cluster-access") dashboard.initClusterDetail();
|
|
if (dashboard.page === "cluster-ops") dashboard.initClusterDetail();
|
|
if (dashboard.page === "task-logs") dashboard.initTaskLogs();
|
|
if (dashboard.page === "tasks") dashboard.initTasksPage();
|
|
if (dashboard.page === "task-console") dashboard.initTaskConsole();
|
|
if (dashboard.page === "molecule") dashboard.initMolecule();
|
|
if (dashboard.page === "roles") dashboard.initRolesPage();
|
|
if (dashboard.page === "roles-create" || dashboard.page === "roles-view") dashboard.initRoleViewPage();
|
|
if (dashboard.page === "teams") dashboard.initTeamsPage();
|
|
if (dashboard.page === "team-detail") dashboard.initTeamDetailPage();
|
|
if (dashboard.page === "admin-config") dashboard.initAdminConfigPage();
|
|
if (dashboard.page === "admin-os-images") dashboard.initAdminOsImagesPage();
|
|
if (dashboard.page === "admin-yaml-lint-config") dashboard.initAdminYamlLintPage();
|
|
if (dashboard.page === "admin-json-lint-config") dashboard.initAdminJsonLintPage();
|
|
if (dashboard.page === "admin-categories") dashboard.initAdminCategoriesPage();
|
|
if (dashboard.page === "login") dashboard.initLogin();
|
|
if (dashboard.page === "register") dashboard.initRegister();
|
|
if (dashboard.page === "reset-password") dashboard.initResetPassword();
|
|
if (
|
|
dashboard.page === "profile" ||
|
|
dashboard.page === "profile-edit" ||
|
|
dashboard.page === "profile-avatar" ||
|
|
dashboard.page === "profile-password" ||
|
|
dashboard.page === "profile-user"
|
|
) {
|
|
dashboard.initProfilePages();
|
|
}
|
|
dashboard.initMenuAccordions();
|
|
dashboard.markActiveSidebar();
|