Skip to content

Commit da67e15

Browse files
committed
✨ User management: add resources page proxy
2 parents 007df6f + 02e8cbf commit da67e15

4 files changed

Lines changed: 51 additions & 18 deletions

File tree

docker/init.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,7 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_
820820
(6, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'),
821821
(7, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'),
822822
(8, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'),
823+
(211, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/tenant-resources'),
823824
(9, 'SU', 'RESOURCE', 'AGENT', 'READ'),
824825
(10, 'SU', 'RESOURCE', 'AGENT', 'DELETE'),
825826
(11, 'SU', 'RESOURCE', 'KB', 'READ'),
@@ -846,6 +847,7 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_
846847
(32, 'SU', 'RESOURCE', 'TENANT', 'READ'),
847848
(33, 'SU', 'RESOURCE', 'TENANT', 'UPDATE'),
848849
(34, 'SU', 'RESOURCE', 'TENANT', 'DELETE'),
850+
(213, 'SU', 'RESOURCE', 'TENANT.LIST', 'READ'),
849851
(35, 'SU', 'RESOURCE', 'TENANT.INFO', 'READ'),
850852
(36, 'SU', 'RESOURCE', 'TENANT.INFO', 'UPDATE'),
851853
(37, 'SU', 'RESOURCE', 'TENANT.INVITE', 'CREATE'),
@@ -868,6 +870,7 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_
868870
(54, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'),
869871
(55, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'),
870872
(56, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'),
873+
(212, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/tenant-resources'),
871874
(57, 'ADMIN', 'RESOURCE', 'AGENT', 'CREATE'),
872875
(58, 'ADMIN', 'RESOURCE', 'AGENT', 'READ'),
873876
(59, 'ADMIN', 'RESOURCE', 'AGENT', 'UPDATE'),
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-- =============================================================================
2+
-- File: v1.8.0_0202_role_permission_update.sql
3+
-- Description: Add /tenant-resources route permission and tenant list visibility for SU role
4+
-- Version: 1.8.0
5+
-- Date: 2026-02-02
6+
-- =============================================================================
7+
8+
-- Add /tenant-resources LEFT_NAV_MENU permission for SU (Super Admin) role
9+
INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype)
10+
VALUES (211, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/tenant-resources')
11+
ON CONFLICT (role_permission_id) DO NOTHING;
12+
13+
-- Add /tenant-resources LEFT_NAV_MENU permission for ADMIN (Tenant Admin) role
14+
INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype)
15+
VALUES (212, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/tenant-resources')
16+
ON CONFLICT (role_permission_id) DO NOTHING;
17+
18+
-- Add tenant list visibility permission for SU (Super Admin) role - controls tenant list display in resource page
19+
INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype)
20+
VALUES (213, 'SU', 'RESOURCE', 'TENANT.LIST', 'READ')
21+
ON CONFLICT (role_permission_id) DO NOTHING;

frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client";
22

3-
import React, { useState } from "react";
3+
import React, { useState, useEffect } from "react";
44
import {
55
Row,
66
Col,
@@ -33,6 +33,7 @@ import McpList from "./resources/McpList";
3333
import { useDeployment } from "@/components/providers/deploymentProvider";
3434
import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider";
3535
import { USER_ROLES } from "@/const/auth";
36+
import { Can } from "@/components/permission/Can";
3637

3738
// Removed mockTenants - now using real data from API
3839

@@ -232,8 +233,13 @@ export default function UserManageComp() {
232233
// Tenant management state for super admin operations
233234
const [tenantsState, setTenantsState] = useState<Tenant[]>([]);
234235

235-
// For non-super admins, use their current tenant (from user metadata or default)
236-
const [tenantId, setTenantId] = useState<string | null>(tenants[0]?.tenant_id || null);
236+
// For non-super admins, automatically select their first tenant when data loads
237+
const [tenantId, setTenantId] = useState<string | null>(null);
238+
useEffect(() => {
239+
if (!isSuperAdmin && tenants.length > 0 && !tenantId) {
240+
setTenantId(tenants[0].tenant_id);
241+
}
242+
}, [isSuperAdmin, tenants, tenantId]);
237243

238244
// Get current tenant name
239245
const currentTenant = tenants.find((t) => t.tenant_id === tenantId);
@@ -267,23 +273,25 @@ export default function UserManageComp() {
267273
</div>
268274
</div>
269275
<Row className="h-full">
270-
<Col className="h-full" style={{ width: 300 }}>
271-
<div className="h-full pr-6">
272-
<div className="sticky top-6">
273-
<div className="bg-white dark:bg-gray-800 rounded-md shadow-sm p-3">
274-
<TenantList
275-
selected={tenantId}
276-
onSelect={(id) => setTenantId(id)}
277-
tenants={tenants}
278-
onTenantsChange={setTenantsState}
279-
onTenantsRefetch={refetchTenants}
280-
loading={tenantsLoading}
281-
t={t}
282-
/>
276+
<Can permission="tenant.list:read">
277+
<Col className="h-full" style={{ width: 300 }}>
278+
<div className="h-full pr-6">
279+
<div className="sticky top-6">
280+
<div className="bg-white dark:bg-gray-800 rounded-md shadow-sm p-3">
281+
<TenantList
282+
selected={tenantId}
283+
onSelect={(id) => setTenantId(id)}
284+
tenants={tenants}
285+
onTenantsChange={setTenantsState}
286+
onTenantsRefetch={refetchTenants}
287+
loading={tenantsLoading}
288+
t={t}
289+
/>
290+
</div>
283291
</div>
284292
</div>
285-
</div>
286-
</Col>
293+
</Col>
294+
</Can>
287295
<Col className="flex-1 p-6">
288296
<div className="bg-white dark:bg-gray-800 rounded-md shadow-sm p-4 min-h-[300px]">
289297
{/* Tenant name header */}

frontend/components/navigation/SideNavigation.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ const ROUTE_CONFIG: RouteConfig[] = [
5959
{ path: "/models", Icon: Settings, labelKey: "sidebar.modelManagement", order: 9 },
6060
{ path: "/memory", Icon: Database, labelKey: "sidebar.memoryManagement", order: 10 },
6161
{ path: "/users", Icon: User, labelKey: "sidebar.userManagement", order: 11 },
62+
{ path: "/tenant-resources", Icon: Building2, labelKey: "sidebar.tenantResources", order: 12 },
6263
];
6364

6465
/**

0 commit comments

Comments
 (0)