diff --git a/src/app/admin/roles/page.tsx b/src/app/admin/roles/page.tsx
index b19f744..8ec6213 100644
--- a/src/app/admin/roles/page.tsx
+++ b/src/app/admin/roles/page.tsx
@@ -1,12 +1,20 @@
'use client';
import { useState } from 'react';
-import { Shield, Plus, Search, X, Edit, Trash2, Copy, Check, ChevronDown, ChevronRight, BookOpen, FileSearch, ClipboardList, Settings, BarChart3, Bike, Users, Briefcase, Truck, Store, BatteryCharging, Building2, Wrench, DollarSign, TrendingUp, UserCog } from 'lucide-react';
+import { Shield, Plus, Search, X, Edit, Trash2, Copy, Check, ChevronDown, ChevronRight, BookOpen, FileSearch, Settings, BarChart3, Bike, Users, Briefcase, Truck, Store, BatteryCharging, Building2, Wrench, DollarSign, TrendingUp, UserCog } from 'lucide-react';
interface Permission {
key: string;
label: string;
enabled: boolean;
+ divider?: boolean;
+ pair?: boolean;
+}
+
+interface PermissionPair {
+ label: string;
+ view: Permission;
+ edit: Permission;
}
interface PermissionGroup {
@@ -15,6 +23,7 @@ interface PermissionGroup {
description: string;
icon: React.ComponentType<{ className?: string }>;
permissions: Permission[];
+ permissionPairs?: PermissionPair[];
}
interface Role {
@@ -38,36 +47,47 @@ const buildDefaultGroups = (): PermissionGroup[] => [
{ key: 'kyc.doc_upload', label: 'Document Upload', enabled: false },
{ key: 'kyc.doc_approve', label: 'Document Approve', enabled: false },
{ key: 'kyc.doc_reject', label: 'Document Reject', enabled: false },
- { key: 'kyc.make_valid_user', label: 'Make a Biker | Investor | Shop | Merchant', enabled: false },
- ]
- },
- {
- id: 'plans',
- title: 'Plan Selection + EV Condition',
- description: 'Manage investment plans, swap station plans, and rider request plans',
- icon: ClipboardList,
- permissions: [
- { key: 'plans.investment.view', label: 'View Investment Plan', enabled: false },
- { key: 'plans.investment.edit', label: 'Edit Investment Plan', enabled: false },
- { key: 'plans.swap_station.view', label: 'View Swap Station Plan', enabled: false },
- { key: 'plans.swap_station.edit', label: 'Edit Swap Station Plan', enabled: false },
- { key: 'plans.rider_request.view', label: 'View Rider Request Plan', enabled: false },
- { key: 'plans.rider_request.edit', label: 'Edit Rider Request Plan', enabled: false },
+ { key: 'kyc.make_valid_user', label: 'Make a Biker | Make an Investor | Make a Shop | Make a Merchant', enabled: false },
]
},
{
id: 'settings',
title: 'Settings',
- description: 'Manage system settings including KYC documents and plans',
+ description: 'Manage KYC documents, plans, company policies, and system configuration',
icon: Settings,
- permissions: [
- { key: 'settings.kyc_documents.view', label: 'View KYC Documents', enabled: false },
- { key: 'settings.kyc_documents.edit', label: 'Edit KYC Documents', enabled: false },
- { key: 'settings.plan_selection.view', label: 'View Plan Selection with Condition', enabled: false },
- { key: 'settings.plan_selection.edit', label: 'Edit Plan Selection with Condition', enabled: false },
- { key: 'settings.company_policy.view', label: 'View Company Policy', enabled: false },
- { key: 'settings.company_policy.edit', label: 'Edit Company Policy', enabled: false },
- ]
+ permissionPairs: [
+ {
+ label: 'KYC Documents',
+ view: { key: 'settings.kyc_documents.view', label: 'View', enabled: false },
+ edit: { key: 'settings.kyc_documents.edit', label: 'Edit', enabled: false },
+ },
+ {
+ label: 'Plan Selection with Condition',
+ view: { key: 'settings.plan_selection.view', label: 'View', enabled: false },
+ edit: { key: 'settings.plan_selection.edit', label: 'Edit', enabled: false },
+ },
+ {
+ label: 'Investment Plan',
+ view: { key: 'settings.investment_plan.view', label: 'View', enabled: false },
+ edit: { key: 'settings.investment_plan.edit', label: 'Edit', enabled: false },
+ },
+ {
+ label: 'Swap Station Plan',
+ view: { key: 'settings.swap_station_plan.view', label: 'View', enabled: false },
+ edit: { key: 'settings.swap_station_plan.edit', label: 'Edit', enabled: false },
+ },
+ {
+ label: 'Rider Request Plan',
+ view: { key: 'settings.rider_request_plan.view', label: 'View', enabled: false },
+ edit: { key: 'settings.rider_request_plan.edit', label: 'Edit', enabled: false },
+ },
+ {
+ label: 'Company Policy',
+ view: { key: 'settings.company_policy.view', label: 'View', enabled: false },
+ edit: { key: 'settings.company_policy.edit', label: 'Edit', enabled: false },
+ },
+ ],
+ permissions: [],
},
{
id: 'dashboard',
@@ -397,17 +417,59 @@ export default function RolesPage() {
setRoles(roles.map(r => r.id === selectedRole.id ? { ...selectedRole, permissionGroups: updated } : r));
};
- const toggleGroupAll = (groupIndex: number, enabled: boolean) => {
+ const togglePermissionPair = (groupIndex: number, pairIndex: number, type: 'view' | 'edit') => {
if (!selectedRole) return;
const updated = [...selectedRole.permissionGroups];
- updated[groupIndex].permissions = updated[groupIndex].permissions.map(p => ({ ...p, enabled }));
+ const pair = updated[groupIndex].permissionPairs![pairIndex];
+ pair[type].enabled = !pair[type].enabled;
setSelectedRole({ ...selectedRole, permissionGroups: updated });
setRoles(roles.map(r => r.id === selectedRole.id ? { ...selectedRole, permissionGroups: updated } : r));
};
- const isGroupAllEnabled = (group: PermissionGroup) => group.permissions.every(p => p.enabled);
- const getEnabledCount = (group: PermissionGroup) => group.permissions.filter(p => p.enabled).length;
- const getTotalEnabled = (role: Role) => role.permissionGroups.reduce((a, g) => a + g.permissions.filter(p => p.enabled).length, 0);
+ const toggleGroupAll = (groupIndex: number, enabled: boolean) => {
+ if (!selectedRole) return;
+ const updated = [...selectedRole.permissionGroups];
+ const group = updated[groupIndex];
+ if (group.permissionPairs) {
+ group.permissionPairs = group.permissionPairs.map(p => ({
+ ...p,
+ view: { ...p.view, enabled },
+ edit: { ...p.edit, enabled },
+ }));
+ } else {
+ group.permissions = group.permissions.map(p => ({ ...p, enabled }));
+ }
+ setSelectedRole({ ...selectedRole, permissionGroups: updated });
+ setRoles(roles.map(r => r.id === selectedRole.id ? { ...selectedRole, permissionGroups: updated } : r));
+ };
+
+ const isGroupAllEnabled = (group: PermissionGroup) => {
+ if (group.permissionPairs) {
+ return group.permissionPairs.every(p => p.view.enabled && p.edit.enabled);
+ }
+ return group.permissions.every(p => p.enabled);
+ };
+
+ const getEnabledCount = (group: PermissionGroup) => {
+ if (group.permissionPairs) {
+ return group.permissionPairs.filter(p => p.view.enabled && p.edit.enabled).length;
+ }
+ return group.permissions.filter(p => p.enabled).length;
+ };
+
+ const getTotalCount = (group: PermissionGroup) => {
+ if (group.permissionPairs) {
+ return group.permissionPairs.length;
+ }
+ return group.permissions.length;
+ };
+
+ const getTotalEnabled = (role: Role) => role.permissionGroups.reduce((a, g) => {
+ if (g.permissionPairs) {
+ return a + g.permissionPairs.filter(p => p.view.enabled && p.edit.enabled).length;
+ }
+ return a + g.permissions.filter(p => p.enabled).length;
+ }, 0);
const toggleGroup = (groupId: string) => {
setExpandedGroups(prev => ({ ...prev, [groupId]: !prev[groupId] }));
@@ -522,7 +584,7 @@ export default function RolesPage() {
{group.title}
-{getEnabledCount(group)}/{group.permissions.length} enabled
+{getEnabledCount(group)}/{getTotalCount(group)} enabled
{group.description}