feat: expand RBAC system with granular permissions and update role definitions and UI configuration
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useState } from 'react';
|
import { useState } from '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';
|
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, Bell, MessageSquare } from 'lucide-react';
|
||||||
|
|
||||||
interface Permission {
|
interface Permission {
|
||||||
key: string;
|
key: string;
|
||||||
@@ -35,11 +35,10 @@ interface Role {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const buildDefaultGroups = (): PermissionGroup[] => [
|
const buildDefaultGroups = (): PermissionGroup[] => [
|
||||||
|
|
||||||
{
|
{
|
||||||
id: 'kyc',
|
id: 'kyc',
|
||||||
title: 'KYC Requests & Verification',
|
title: 'KYC Requests & Verification',
|
||||||
description: 'The Biker user will request from the app. Investor, Swap Station, Merchant will request from the website. Front desk officers (hub/head office) can request for Biker, Investor, Swap Station, Merchant and can upload remaining documents. Admin officers (head office) will approve or reject documents with notes and "make a Biker | Investor | Swap Station | Merchant".',
|
description: 'The Biker user will request from the app. Biker, Investor, Shop, Merchant will request from the website. Front desk officers (hub/head office) can request for Biker, Investor, Shop, Merchant, and can upload remaining documents. Admin managers (head office) will approve or reject documents with notes and "make a Biker | Investor | Shop | Merchant".',
|
||||||
icon: FileSearch,
|
icon: FileSearch,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'kyc.request', label: 'KYC Request', enabled: false },
|
{ key: 'kyc.request', label: 'KYC Request', enabled: false },
|
||||||
@@ -62,15 +61,20 @@ const buildDefaultGroups = (): PermissionGroup[] => [
|
|||||||
edit: { key: 'settings.kyc_documents_config', label: 'Config', enabled: false },
|
edit: { key: 'settings.kyc_documents_config', label: 'Config', enabled: false },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Plan Selection with Condition',
|
label: 'Plan Selection with EV Condition',
|
||||||
view: { key: 'settings.plan_selection_with_condition_view', label: 'View', enabled: false },
|
view: { key: 'settings.plan_selection_with_condition_view', label: 'View', enabled: false },
|
||||||
edit: { key: 'settings.plan_selection_with_condition_config', label: 'Config', enabled: false },
|
edit: { key: 'settings.plan_selection_with_condition_config', label: 'Config', enabled: false },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Investment Plan',
|
label: 'EV Investment Plan',
|
||||||
view: { key: 'settings.investment_plan_view', label: 'View', enabled: false },
|
view: { key: 'settings.investment_plan_view', label: 'View', enabled: false },
|
||||||
edit: { key: 'settings.investment_plan_config', label: 'Config', enabled: false },
|
edit: { key: 'settings.investment_plan_config', label: 'Config', enabled: false },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Battery Investment Plan',
|
||||||
|
view: { key: 'settings.battery_investment_plan_view', label: 'View', enabled: false },
|
||||||
|
edit: { key: 'settings.battery_investment_plan_config', label: 'Config', enabled: false },
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'Swap Station Plan',
|
label: 'Swap Station Plan',
|
||||||
view: { key: 'settings.swap_station_plan_view', label: 'View', enabled: false },
|
view: { key: 'settings.swap_station_plan_view', label: 'View', enabled: false },
|
||||||
@@ -86,13 +90,23 @@ const buildDefaultGroups = (): PermissionGroup[] => [
|
|||||||
view: { key: 'settings.company_policy_view', label: 'View', enabled: false },
|
view: { key: 'settings.company_policy_view', label: 'View', enabled: false },
|
||||||
edit: { key: 'settings.company_policy_config', label: 'Config', enabled: false },
|
edit: { key: 'settings.company_policy_config', label: 'Config', enabled: false },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Email & SMS Templates',
|
||||||
|
view: { key: 'settings.es_templates_view', label: 'View', enabled: false },
|
||||||
|
edit: { key: 'settings.es_templates_config', label: 'Config', enabled: false },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'EV Parts',
|
||||||
|
view: { key: 'settings.ev_parts_view', label: 'View', enabled: false },
|
||||||
|
edit: { key: 'settings.ev_parts_config', label: 'Config', enabled: false },
|
||||||
|
},
|
||||||
],
|
],
|
||||||
permissions: [],
|
permissions: [],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'dashboard',
|
id: 'dashboard',
|
||||||
title: 'Dashboard',
|
title: 'Dashboard',
|
||||||
description: 'Access to main dashboard',
|
description: 'Access to main dashboard insights and summary metrics.',
|
||||||
icon: BarChart3,
|
icon: BarChart3,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'dashboard.view', label: 'View Dashboard', enabled: false },
|
{ key: 'dashboard.view', label: 'View Dashboard', enabled: false },
|
||||||
@@ -101,133 +115,188 @@ const buildDefaultGroups = (): PermissionGroup[] => [
|
|||||||
{
|
{
|
||||||
id: 'rentals',
|
id: 'rentals',
|
||||||
title: 'Rentals',
|
title: 'Rentals',
|
||||||
description: 'Manage rental operations',
|
description: 'Front desk officers can select user, rental type, contract duration, bike, hub and payment methods to create rentals. Bikers can accept or reject rentals. Managers can edit, cancel, lock, or unlock rentals and view default and penalty fee tracking.',
|
||||||
icon: Bike,
|
icon: Bike,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'rentals.view', label: 'View', enabled: false },
|
{ key: 'rental.view', label: 'View Rentals', enabled: false },
|
||||||
{ key: 'rentals.create', label: 'Create', enabled: false },
|
{ key: 'rental.create', label: 'Create Rental', enabled: false },
|
||||||
{ key: 'rentals.edit', label: 'Edit', enabled: false },
|
{ key: 'rental.requset', label: 'Rental Request', enabled: false },
|
||||||
{ key: 'rentals.delete', label: 'Delete', enabled: false },
|
{ key: 'rental.accept', label: 'Accept Rental', enabled: false },
|
||||||
|
{ key: 'rental.reject', label: 'Reject Rental', enabled: false },
|
||||||
|
{ key: 'rental.edit', label: 'Edit Rental', enabled: false },
|
||||||
|
{ key: 'rental.cancel', label: 'Cancel Rental', enabled: false },
|
||||||
|
{ key: 'rental.image_approve', label: 'Image Approve', enabled: false },
|
||||||
|
{ key: 'rental.lock', label: 'Lock Rental', enabled: false },
|
||||||
|
{ key: 'rental.unlock', label: 'Unlock Rental', enabled: false },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'bikers',
|
id: 'bikers',
|
||||||
title: 'Bikers',
|
title: 'Bikers Management',
|
||||||
description: 'Manage bikers',
|
description: 'Handle automatic biker profile creation after KYC approval, basic detail updates, status/membership changes, document uploads/removals, internal notes and activity tracking.',
|
||||||
icon: Users,
|
icon: Users,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'bikers.view', label: 'View', enabled: false },
|
{ key: 'biker.view', label: 'View Biker Profile', enabled: false },
|
||||||
{ key: 'bikers.create', label: 'Create', enabled: false },
|
{ key: 'biker.create', label: 'Create Biker Profile', enabled: false },
|
||||||
{ key: 'bikers.edit', label: 'Edit', enabled: false },
|
{ key: 'biker.edit', label: 'Edit Biker Profile', enabled: false },
|
||||||
{ key: 'bikers.delete', label: 'Delete', enabled: false },
|
{ key: 'biker.delete', label: 'Soft Delete / Deactivate Biker', enabled: false },
|
||||||
|
{ key: 'biker.status_change', label: 'Change Biker Status', enabled: false },
|
||||||
|
{ key: 'biker.membership_change', label: 'Change Biker Membership', enabled: false },
|
||||||
|
{ key: 'biker.kyc_view', label: 'View Biker KYC Info', enabled: false },
|
||||||
|
{ key: 'biker.kyc_update', label: 'Update Biker KYC Info', enabled: false },
|
||||||
|
{ key: 'biker.activity_view', label: 'View Biker Activity Logs', enabled: false },
|
||||||
|
{ key: 'biker.document_view', label: 'View Biker Documents', enabled: false },
|
||||||
|
{ key: 'biker.document_upload', label: 'Upload Biker Documents', enabled: false },
|
||||||
|
{ key: 'biker.document_delete', label: 'Remove Biker Documents', enabled: false },
|
||||||
|
{ key: 'biker.rental_history_view', label: 'View Biker Rental History', enabled: false },
|
||||||
|
{ key: 'biker.payment_history_view', label: 'View Biker Payment History', enabled: false },
|
||||||
|
{ key: 'biker.wallet_view', label: 'View Biker Wallet Balance', enabled: false },
|
||||||
|
{ key: 'biker.note_add', label: 'Add Biker Internal Notes', enabled: false },
|
||||||
|
{ key: 'biker.note_view', label: 'View Biker Internal Notes', enabled: false },
|
||||||
|
{ key: 'biker.export', label: 'Export Biker Reports & Data', enabled: false },
|
||||||
|
{ key: 'biker.make_valid_user', label: 'Make Biker Active & Valid', enabled: false },
|
||||||
|
{ key: 'biker.lock', label: 'Lock Biker Account', enabled: false },
|
||||||
|
{ key: 'biker.unlock', label: 'Unlock Biker Account', enabled: false },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'investors',
|
id: 'investors',
|
||||||
title: 'Investors',
|
title: 'Investors Management',
|
||||||
description: 'Manage investors',
|
description: 'Manage automatically created profiles, assign EV & Battery Investment plans, oversee bank accounts/tax logs, track daily rental shares, process withdrawal requests and notifications.',
|
||||||
icon: Briefcase,
|
icon: Briefcase,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'investors.view', label: 'View', enabled: false },
|
{ key: 'investor.view', label: 'View Investors', enabled: false },
|
||||||
{ key: 'investors.create', label: 'Create', enabled: false },
|
{ key: 'investor.create', label: 'Create Investor Profile', enabled: false },
|
||||||
{ key: 'investors.edit', label: 'Edit', enabled: false },
|
{ key: 'investor.edit', label: 'Edit Investor Details', enabled: false },
|
||||||
{ key: 'investors.delete', label: 'Delete', enabled: false },
|
{ key: 'investor.delete', label: 'Soft Delete Investor', enabled: false },
|
||||||
|
{ key: 'investor.plan_assign', label: 'Assign Investment Plans', enabled: false },
|
||||||
|
{ key: 'investor.bank_edit', label: 'Manage Bank & Tax Info', enabled: false },
|
||||||
|
{ key: 'investor.withdraw_request', label: 'Withdrawal Requests', enabled: false },
|
||||||
|
{ key: 'investor.document_upload', label: 'Upload Investor Documents', enabled: false },
|
||||||
|
{ key: 'investor.document_approve', label: 'Approve Investor Documents', enabled: false },
|
||||||
|
{ key: 'investor.notification_view', label: 'View Investor Notifications', enabled: false },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'battery',
|
||||||
|
title: 'Battery Management',
|
||||||
|
description: 'Add new battery assets with pricing, deposit, daily rent, and BMS identifiers. Oversee ownership history, rental transactions, damage logs, maintenance, and data exports.',
|
||||||
|
icon: BatteryCharging,
|
||||||
|
permissions: [
|
||||||
|
{ key: 'battery.view', label: 'View Batteries', enabled: false },
|
||||||
|
{ key: 'battery.create', label: 'Add Battery & BMS Config', enabled: false },
|
||||||
|
{ key: 'battery.edit', label: 'Edit Battery details', enabled: false },
|
||||||
|
{ key: 'battery.delete', label: 'Delete Battery Record', enabled: false },
|
||||||
|
{ key: 'battery.export', label: 'Export Battery History', enabled: false },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'fleet',
|
id: 'fleet',
|
||||||
title: 'Fleet',
|
title: 'Fleet Management',
|
||||||
description: 'Manage fleet vehicles',
|
description: 'Register new EV bikes, configure GPS details, associate battery packs, view rental transactions, maintenance, damage history, investor ownership logs, and activity trackers.',
|
||||||
icon: Truck,
|
icon: Truck,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'fleet.view', label: 'View', enabled: false },
|
{ key: 'fleet.view', label: 'View Fleet Vehicles', enabled: false },
|
||||||
{ key: 'fleet.create', label: 'Create', enabled: false },
|
{ key: 'fleet.create', label: 'Register New Bike', enabled: false },
|
||||||
{ key: 'fleet.edit', label: 'Edit', enabled: false },
|
{ key: 'fleet.edit', label: 'Edit Fleet Vehicle', enabled: false },
|
||||||
{ key: 'fleet.delete', label: 'Delete', enabled: false },
|
{ key: 'fleet.delete', label: 'Soft Delete Bike', enabled: false },
|
||||||
|
{ key: 'fleet.gps_config', label: 'Configure Vehicle GPS', enabled: false },
|
||||||
|
{ key: 'fleet.export', label: 'Export Fleet Records', enabled: false },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'merchants',
|
id: 'service_centers',
|
||||||
title: 'Merchants',
|
title: 'Service Centers',
|
||||||
description: 'Manage merchants',
|
description: 'Add and manage service center listings, locations, and capacity. Track fleet service logs, maintenance logs, and uploaded dealer/biker invoices.',
|
||||||
icon: Store,
|
icon: Wrench,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'merchants.view', label: 'View', enabled: false },
|
{ key: 'service_center.view', label: 'View Service Centers', enabled: false },
|
||||||
{ key: 'merchants.create', label: 'Create', enabled: false },
|
{ key: 'service_center.create', label: 'Create Service Center', enabled: false },
|
||||||
{ key: 'merchants.edit', label: 'Edit', enabled: false },
|
{ key: 'service_center.edit', label: 'Edit Service Center Details', enabled: false },
|
||||||
{ key: 'merchants.delete', label: 'Delete', enabled: false },
|
{ key: 'service_center.delete', label: 'Remove Service Center', enabled: false },
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'swap_stations',
|
|
||||||
title: 'Swap Stations',
|
|
||||||
description: 'Manage swap stations',
|
|
||||||
icon: BatteryCharging,
|
|
||||||
permissions: [
|
|
||||||
{ key: 'swap_stations.view', label: 'View', enabled: false },
|
|
||||||
{ key: 'swap_stations.create', label: 'Create', enabled: false },
|
|
||||||
{ key: 'swap_stations.edit', label: 'Edit', enabled: false },
|
|
||||||
{ key: 'swap_stations.delete', label: 'Delete', enabled: false },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'hubs',
|
|
||||||
title: 'Hubs',
|
|
||||||
description: 'Manage hubs',
|
|
||||||
icon: Building2,
|
|
||||||
permissions: [
|
|
||||||
{ key: 'hubs.view', label: 'View', enabled: false },
|
|
||||||
{ key: 'hubs.create', label: 'Create', enabled: false },
|
|
||||||
{ key: 'hubs.edit', label: 'Edit', enabled: false },
|
|
||||||
{ key: 'hubs.delete', label: 'Delete', enabled: false },
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'maintenance',
|
id: 'maintenance',
|
||||||
title: 'Maintenance',
|
title: 'Damage & Maintenance',
|
||||||
description: 'Manage maintenance requests',
|
description: 'Report damage or technical issues from the biker side, and manage repairs, spare parts inventory, claim notifications, and service schedules on the admin side.',
|
||||||
icon: Wrench,
|
icon: Settings,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'maintenance.view', label: 'View', enabled: false },
|
{ key: 'maintenance.view', label: 'View Damage Logs', enabled: false },
|
||||||
{ key: 'maintenance.create', label: 'Create', enabled: false },
|
{ key: 'maintenance.create', label: 'Report Damage/Claim Free Service', enabled: false },
|
||||||
{ key: 'maintenance.edit', label: 'Edit', enabled: false },
|
{ key: 'maintenance.edit', label: 'Update Repair Details', enabled: false },
|
||||||
{ key: 'maintenance.delete', label: 'Delete', enabled: false },
|
{ key: 'maintenance.delete', label: 'Delete Repair Log', enabled: false },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'accounting',
|
id: 'accounting',
|
||||||
title: 'Accounting',
|
title: 'Accounting',
|
||||||
description: 'Manage financial records',
|
description: 'Oversee automatic journals generated by rentals, verify battery rental deposits, maintain general ledgers, and process and verify investor withdrawal requests.',
|
||||||
icon: DollarSign,
|
icon: DollarSign,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'accounting.view', label: 'View', enabled: false },
|
{ key: 'accounting.view', label: 'View Financial Ledger', enabled: false },
|
||||||
{ key: 'accounting.create', label: 'Create', enabled: false },
|
{ key: 'accounting.create', label: 'Create Financial Entry', enabled: false },
|
||||||
{ key: 'accounting.edit', label: 'Edit', enabled: false },
|
{ key: 'accounting.edit', label: 'Modify Financial Entry', enabled: false },
|
||||||
{ key: 'accounting.delete', label: 'Delete', enabled: false },
|
{ key: 'accounting.delete', label: 'Void Financial Entry', enabled: false },
|
||||||
|
{ key: 'accounting.withdraw_process', label: 'Process & Pay Withdrawal', enabled: false },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'hubs',
|
||||||
|
title: 'Hubs Management',
|
||||||
|
description: 'Admin can create and manage geographic hubs, assign dedicated Hub Managers, allocate bike/battery inventory, and process hub-specific rentals and KYC checkups.',
|
||||||
|
icon: Building2,
|
||||||
|
permissions: [
|
||||||
|
{ key: 'hub.view', label: 'View Hubs', enabled: false },
|
||||||
|
{ key: 'hub.create', label: 'Create New Hub', enabled: false },
|
||||||
|
{ key: 'hub.edit', label: 'Edit Hub Details & Staff', enabled: false },
|
||||||
|
{ key: 'hub.delete', label: 'Deactivate Hub', enabled: false },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'reports',
|
id: 'reports',
|
||||||
title: 'Reports',
|
title: 'Reports & Analytics',
|
||||||
description: 'View and generate reports',
|
description: 'Generate, schedule, view, and export comprehensive administrative reports for KYC, fleet, investment payouts, rentals, and general ledger operations.',
|
||||||
icon: TrendingUp,
|
icon: TrendingUp,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'reports.view', label: 'View', enabled: false },
|
{ key: 'reports.view', label: 'View Reports', enabled: false },
|
||||||
{ key: 'reports.export', label: 'Export', enabled: false },
|
{ key: 'reports.export', label: 'Export Reports (CSV/PDF)', enabled: false },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'users',
|
id: 'users',
|
||||||
title: 'Users',
|
title: 'Users & Staff Management',
|
||||||
description: 'Manage system users',
|
description: 'Admin-only module for managing internal administrative users, hub managers, front desk staff, accountants, and Super Admins.',
|
||||||
icon: UserCog,
|
icon: UserCog,
|
||||||
permissions: [
|
permissions: [
|
||||||
{ key: 'users.view', label: 'View', enabled: false },
|
{ key: 'users.view', label: 'View System Users', enabled: false },
|
||||||
{ key: 'users.create', label: 'Create', enabled: false },
|
{ key: 'users.create', label: 'Create Staff User', enabled: false },
|
||||||
{ key: 'users.edit', label: 'Edit', enabled: false },
|
{ key: 'users.edit', label: 'Edit Staff details', enabled: false },
|
||||||
{ key: 'users.delete', label: 'Delete', enabled: false },
|
{ key: 'users.delete', label: 'Deactivate Staff User', enabled: false },
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'roles',
|
||||||
|
title: 'Roles & Access Permissions',
|
||||||
|
description: 'Super Admin-only module to construct custom administrative roles and configure fine-grained permissions.',
|
||||||
|
icon: Shield,
|
||||||
|
permissions: [
|
||||||
|
{ key: 'roles.view', label: 'View Roles list', enabled: false },
|
||||||
|
{ key: 'roles.config', label: 'Configure & Update Roles', enabled: false },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'notifications',
|
||||||
|
title: 'Notifications & Messaging',
|
||||||
|
description: 'Access system logs, alerts (KYC Verification, Rentals, Vehicle Service, Cabinet, Ledger), compose custom system notifications, broadcast messages, and schedule notifications.',
|
||||||
|
icon: Bell,
|
||||||
|
permissions: [
|
||||||
|
{ key: 'notifications.view', label: 'View Notifications', enabled: false },
|
||||||
|
{ key: 'messaging.compose', label: 'Compose Message', enabled: false },
|
||||||
|
{ key: 'messaging.broadcast', label: 'Broadcast message', enabled: false },
|
||||||
|
{ key: 'messaging.schedule', label: 'Schedule notification', enabled: false },
|
||||||
|
]
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
const mockRoles: Role[] = [
|
const mockRoles: Role[] = [
|
||||||
@@ -238,7 +307,12 @@ const mockRoles: Role[] = [
|
|||||||
isDefault: false,
|
isDefault: false,
|
||||||
permissionGroups: buildDefaultGroups().map(g => ({
|
permissionGroups: buildDefaultGroups().map(g => ({
|
||||||
...g,
|
...g,
|
||||||
permissions: g.permissions.map(p => ({ ...p, enabled: true }))
|
permissions: g.permissions.map(p => ({ ...p, enabled: true })),
|
||||||
|
permissionPairs: g.permissionPairs?.map(p => ({
|
||||||
|
...p,
|
||||||
|
view: { ...p.view, enabled: true },
|
||||||
|
edit: { ...p.edit, enabled: true }
|
||||||
|
}))
|
||||||
}))
|
}))
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -251,13 +325,18 @@ const mockRoles: Role[] = [
|
|||||||
permissions: g.permissions.map(p => ({
|
permissions: g.permissions.map(p => ({
|
||||||
...p,
|
...p,
|
||||||
enabled: !p.key.includes('delete')
|
enabled: !p.key.includes('delete')
|
||||||
|
})),
|
||||||
|
permissionPairs: g.permissionPairs?.map(p => ({
|
||||||
|
...p,
|
||||||
|
view: { ...p.view, enabled: true },
|
||||||
|
edit: { ...p.edit, enabled: !p.edit.key.includes('config') && !p.edit.key.includes('delete') }
|
||||||
}))
|
}))
|
||||||
}))
|
}))
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'ROLE-003',
|
id: 'ROLE-003',
|
||||||
name: 'Front Desk Officer',
|
name: 'Front Desk Officer',
|
||||||
description: 'Hub/head office officer - can request KYC and upload documents',
|
description: 'Hub/head office officer - can request KYC, create rentals and upload documents',
|
||||||
isDefault: false,
|
isDefault: false,
|
||||||
permissionGroups: buildDefaultGroups().map(g => {
|
permissionGroups: buildDefaultGroups().map(g => {
|
||||||
if (g.id === 'kyc') {
|
if (g.id === 'kyc') {
|
||||||
@@ -269,9 +348,55 @@ const mockRoles: Role[] = [
|
|||||||
}))
|
}))
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (g.id === 'rentals') {
|
||||||
|
return {
|
||||||
|
...g,
|
||||||
|
permissions: g.permissions.map(p => ({
|
||||||
|
...p,
|
||||||
|
enabled: ['rental.view', 'rental.create', 'rental.image_approve'].includes(p.key)
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (g.id === 'bikers') {
|
||||||
|
return {
|
||||||
|
...g,
|
||||||
|
permissions: g.permissions.map(p => ({
|
||||||
|
...p,
|
||||||
|
enabled: ['biker.view', 'biker.edit', 'biker.kyc_view', 'biker.kyc_update', 'biker.activity_view', 'biker.document_view', 'biker.document_upload', 'biker.rental_history_view', 'biker.payment_history_view', 'biker.wallet_view', 'biker.note_add', 'biker.note_view'].includes(p.key)
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (g.id === 'investors') {
|
||||||
|
return {
|
||||||
|
...g,
|
||||||
|
permissions: g.permissions.map(p => ({
|
||||||
|
...p,
|
||||||
|
enabled: ['investor.view', 'investor.document_upload'].includes(p.key)
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (g.id === 'settings') {
|
||||||
|
return {
|
||||||
|
...g,
|
||||||
|
permissionPairs: g.permissionPairs?.map(p => ({
|
||||||
|
...p,
|
||||||
|
view: { ...p.view, enabled: true },
|
||||||
|
edit: { ...p.edit, enabled: false }
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
}
|
||||||
if (g.id === 'dashboard') {
|
if (g.id === 'dashboard') {
|
||||||
return { ...g, permissions: g.permissions.map(p => ({ ...p, enabled: true })) };
|
return { ...g, permissions: g.permissions.map(p => ({ ...p, enabled: true })) };
|
||||||
}
|
}
|
||||||
|
if (['battery', 'fleet', 'service_centers', 'maintenance', 'accounting', 'hubs', 'reports'].includes(g.id)) {
|
||||||
|
return {
|
||||||
|
...g,
|
||||||
|
permissions: g.permissions.map(p => ({
|
||||||
|
...p,
|
||||||
|
enabled: p.key.includes('view')
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
}
|
||||||
return g;
|
return g;
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@@ -319,7 +444,16 @@ const mockRoles: Role[] = [
|
|||||||
...g,
|
...g,
|
||||||
permissions: g.permissions.map(p => ({
|
permissions: g.permissions.map(p => ({
|
||||||
...p,
|
...p,
|
||||||
enabled: ['rentals.view', 'rentals.create'].includes(p.key)
|
enabled: ['rental.requset', 'rental.accept', 'rental.reject', 'rental.view'].includes(p.key)
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (g.id === 'bikers') {
|
||||||
|
return {
|
||||||
|
...g,
|
||||||
|
permissions: g.permissions.map(p => ({
|
||||||
|
...p,
|
||||||
|
enabled: ['biker.view'].includes(p.key)
|
||||||
}))
|
}))
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,57 @@
|
|||||||
|
const ALL_PERMISSIONS = [
|
||||||
|
'kyc.request', 'kyc.view', 'kyc.doc_upload', 'kyc.doc_approve', 'kyc.doc_reject', 'kyc.make_valid_user',
|
||||||
|
'settings.kyc_documents_view', 'settings.kyc_documents_config',
|
||||||
|
'settings.plan_selection_with_condition_view', 'settings.plan_selection_with_condition_config',
|
||||||
|
'settings.investment_plan_view', 'settings.investment_plan_config',
|
||||||
|
'settings.battery_investment_plan_view', 'settings.battery_investment_plan_config',
|
||||||
|
'settings.swap_station_plan_view', 'settings.swap_station_plan_config',
|
||||||
|
'settings.rider_request_plan_for_merchant_view', 'settings.rider_request_plan_for_merchant_config',
|
||||||
|
'settings.company_policy_view', 'settings.company_policy_config',
|
||||||
|
'settings.es_templates_view', 'settings.es_templates_config',
|
||||||
|
'settings.ev_parts_view', 'settings.ev_parts_config',
|
||||||
|
'dashboard.view',
|
||||||
|
'rental.requset', 'rental.accept', 'rental.reject', 'rental.view', 'rental.cancel', 'rental.edit', 'rental.image_approve', 'rental.lock', 'rental.unlock', 'rental.create',
|
||||||
|
'biker.view', 'biker.create', 'biker.edit', 'biker.delete', 'biker.status_change', 'biker.membership_change', 'biker.kyc_view', 'biker.kyc_update', 'biker.activity_view', 'biker.document_view', 'biker.document_upload', 'biker.document_delete', 'biker.rental_history_view', 'biker.payment_history_view', 'biker.wallet_view', 'biker.note_add', 'biker.note_view', 'biker.export', 'biker.make_valid_user', 'biker.lock', 'biker.unlock',
|
||||||
|
'investor.view', 'investor.create', 'investor.edit', 'investor.delete', 'investor.plan_assign', 'investor.bank_edit', 'investor.withdraw_request', 'investor.document_upload', 'investor.document_approve', 'investor.notification_view',
|
||||||
|
'battery.view', 'battery.create', 'battery.edit', 'battery.delete', 'battery.export',
|
||||||
|
'fleet.view', 'fleet.create', 'fleet.edit', 'fleet.delete', 'fleet.gps_config', 'fleet.export',
|
||||||
|
'service_center.view', 'service_center.create', 'service_center.edit', 'service_center.delete',
|
||||||
|
'maintenance.view', 'maintenance.create', 'maintenance.edit', 'maintenance.delete',
|
||||||
|
'accounting.view', 'accounting.create', 'accounting.edit', 'accounting.delete', 'accounting.withdraw_process',
|
||||||
|
'hub.view', 'hub.create', 'hub.edit', 'hub.delete',
|
||||||
|
'reports.view', 'reports.export',
|
||||||
|
'users.view', 'users.create', 'users.edit', 'users.delete',
|
||||||
|
'roles.view', 'roles.config',
|
||||||
|
'notifications.view', 'messaging.compose', 'messaging.broadcast', 'messaging.schedule'
|
||||||
|
];
|
||||||
|
|
||||||
const ROLE_PERMISSIONS: Record<string, string[]> = {
|
const ROLE_PERMISSIONS: Record<string, string[]> = {
|
||||||
super_admin: ['kyc.request', 'kyc.view', 'kyc.doc_upload', 'kyc.doc_approve', 'kyc.doc_reject', 'kyc.make_valid_user', 'dashboard.view', 'rental.view', 'rental.create', 'rental.accept', 'rental.reject', 'rental.cancel', 'rental.edit', 'rental.image_approve', 'rental.lock', 'rental.unlock'],
|
super_admin: ALL_PERMISSIONS,
|
||||||
admin_manager: ['kyc.request', 'kyc.view', 'kyc.doc_upload', 'kyc.doc_approve', 'kyc.doc_reject', 'kyc.make_valid_user', 'dashboard.view', 'rental.view', 'rental.create', 'rental.accept', 'rental.reject', 'rental.cancel', 'rental.edit', 'rental.image_approve', 'rental.lock', 'rental.unlock'],
|
admin_manager: ALL_PERMISSIONS.filter(p => !p.includes('delete') || p === 'biker.document_delete' || p === 'fleet.delete' || p === 'battery.delete'),
|
||||||
staff: ['kyc.request', 'kyc.view', 'kyc.doc_upload', 'dashboard.view', 'rental.view', 'rental.create'],
|
staff: [
|
||||||
accountant: ['dashboard.view', 'accounting.view', 'accounting.create', 'accounting.edit', 'accounting.delete'],
|
'kyc.request', 'kyc.view', 'kyc.doc_upload',
|
||||||
investor: ['dashboard.view', 'kyc.request', 'kyc.view'],
|
'settings.kyc_documents_view', 'settings.plan_selection_with_condition_view', 'settings.investment_plan_view', 'settings.battery_investment_plan_view', 'settings.swap_station_plan_view', 'settings.rider_request_plan_for_merchant_view', 'settings.company_policy_view', 'settings.es_templates_view', 'settings.ev_parts_view',
|
||||||
biker: ['dashboard.view', 'kyc.request', 'kyc.view', 'rentals.view', 'rentals.create'],
|
'dashboard.view',
|
||||||
'swap-station': ['dashboard.view', 'kyc.request', 'kyc.view'],
|
'rental.view', 'rental.create', 'rental.image_approve',
|
||||||
merchant: ['dashboard.view', 'kyc.request', 'kyc.view', 'merchants.view'],
|
'biker.view', 'biker.edit', 'biker.kyc_view', 'biker.kyc_update', 'biker.activity_view', 'biker.document_view', 'biker.document_upload', 'biker.rental_history_view', 'biker.payment_history_view', 'biker.wallet_view', 'biker.note_add', 'biker.note_view',
|
||||||
|
'investor.view', 'investor.document_upload',
|
||||||
|
'battery.view', 'fleet.view', 'service_center.view', 'maintenance.view', 'maintenance.create', 'accounting.view', 'hub.view', 'reports.view', 'notifications.view'
|
||||||
|
],
|
||||||
|
accountant: [
|
||||||
|
'dashboard.view', 'accounting.view', 'accounting.create', 'accounting.edit', 'accounting.delete', 'accounting.withdraw_process', 'reports.view', 'reports.export'
|
||||||
|
],
|
||||||
|
investor: [
|
||||||
|
'dashboard.view', 'kyc.request', 'kyc.view', 'investor.view', 'investor.bank_edit', 'investor.withdraw_request', 'investor.document_upload', 'notifications.view'
|
||||||
|
],
|
||||||
|
biker: [
|
||||||
|
'dashboard.view', 'kyc.request', 'kyc.view', 'rental.requset', 'rental.accept', 'rental.reject', 'rental.view', 'biker.view', 'maintenance.create', 'maintenance.view', 'notifications.view'
|
||||||
|
],
|
||||||
|
'swap-station': [
|
||||||
|
'dashboard.view', 'kyc.request', 'kyc.view', 'notifications.view'
|
||||||
|
],
|
||||||
|
merchant: [
|
||||||
|
'dashboard.view', 'kyc.request', 'kyc.view', 'settings.rider_request_plan_for_merchant_view', 'notifications.view'
|
||||||
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
export const canRentalAccept = () => hasPermission('rental.accept');
|
export const canRentalAccept = () => hasPermission('rental.accept');
|
||||||
|
|||||||
Reference in New Issue
Block a user