bharat_erp/lib/shared/routes/menu_config.dart
2026-07-16 15:18:59 +05:30

176 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import '../../core/constants/enums.dart';
import '../../core/constants/route_constants.dart';
import '../../core/utils/permission_utils.dart';
class MenuItem {
const MenuItem({
required this.label,
required this.icon,
required this.route,
required this.module,
this.children = const [],
this.requiredRole,
});
final String label;
final IconData icon;
final String route;
final String module;
final List<MenuItem> children;
final UserRole? requiredRole;
}
const List<MenuItem> appMenuItems = [
MenuItem(
label: 'Dashboard',
icon: Icons.dashboard_outlined,
route: RouteConstants.dashboard,
module: 'dashboard',
),
// MenuItem(
// label: 'Companies',
// icon: Icons.business_outlined,
// route: RouteConstants.companies,
// module: 'companies',
// requiredRole: UserRole.superAdmin,
// ),
// MenuItem(
// label: 'Branches',
// icon: Icons.account_tree_outlined,
// route: RouteConstants.branches,
// module: 'branches',
// ),
MenuItem(
label: 'Assets',
icon: Icons.inventory_2_outlined,
route: RouteConstants.assets,
module: 'assets',
children: [
MenuItem(
label: 'Asset Master',
icon: Icons.devices_outlined,
route: RouteConstants.assets,
module: 'assets',
),
MenuItem(
label: 'Alerts',
icon: Icons.notifications_outlined,
route: RouteConstants.assetAlerts,
module: 'assets',
),
],
),
MenuItem(
label: 'Vendors',
icon: Icons.store_outlined,
route: RouteConstants.vendors,
module: 'vendors',
),
MenuItem(
label: 'Purchase Orders',
icon: Icons.receipt_long_outlined,
route: RouteConstants.purchaseOrders,
module: 'purchase_orders',
),
MenuItem(
label: 'GRN',
icon: Icons.inventory_2_outlined,
route: RouteConstants.grn,
module: 'grn',
),
MenuItem(
label: 'Reports',
icon: Icons.assessment_outlined,
route: RouteConstants.reports,
module: 'reports',
),
MenuItem(
label: 'Users & Roles',
icon: Icons.admin_panel_settings_outlined,
route: RouteConstants.usersRoleManagement,
module: 'users',
),
MenuItem(
label: 'Master Data',
icon: Icons.dataset_outlined,
route: RouteConstants.masterData,
module: 'master_data',
),
MenuItem(
label: 'Audit Logs',
icon: Icons.history_outlined,
route: RouteConstants.auditLogs,
module: 'audit_logs',
),
MenuItem(
label: 'Settings',
icon: Icons.settings_outlined,
route: RouteConstants.settings,
module: 'settings',
),
];
/// Routes rendered under the Support section (after primary ops menus).
const Set<String> supportMenuRoutes = {
RouteConstants.usersRoleManagement,
RouteConstants.masterData,
RouteConstants.auditLogs,
RouteConstants.settings,
};
List<MenuItem> getVisibleMenuItems({
required List<String> permissions,
required UserRole role,
}) {
// Only '*' grants every menu. Do not unlock all items by role alone —
// otherwise items like Reports appear without REPORTS:view.
if (permissions.contains('*')) {
return appMenuItems;
}
final visible = <MenuItem>[];
for (final item in appMenuItems) {
if (item.requiredRole != null && !isSuperAdmin(role) && role != item.requiredRole) {
continue;
}
if (item.children.isNotEmpty) {
final visibleChildren = item.children
.where(
(child) => canSeeMenuModule(
permissions: permissions,
module: child.module,
role: role,
),
)
.toList();
if (visibleChildren.isEmpty) continue;
visible.add(
MenuItem(
label: item.label,
icon: item.icon,
route: visibleChildren.first.route,
module: item.module,
children: visibleChildren,
requiredRole: item.requiredRole,
),
);
continue;
}
if (!canSeeMenuModule(
permissions: permissions,
module: item.module,
role: role,
)) {
continue;
}
visible.add(item);
}
return visible;
}