176 lines
4.1 KiB
Dart
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;
|
|
}
|