feat: Add frontend menu management system with permission filtering
This commit is contained in:
130
docs/menu-management.md
Normal file
130
docs/menu-management.md
Normal file
@@ -0,0 +1,130 @@
|
||||
# Frontend Menu Management
|
||||
|
||||
This template includes a dynamic menu management system that allows administrators to create and manage frontend navigation menus through the admin panel.
|
||||
|
||||
## Features
|
||||
|
||||
- **Dynamic Menus**: Create multiple menus (header, footer, sidebar, etc.)
|
||||
- **Nested Items**: Support for parent-child menu items (dropdowns)
|
||||
- **Multiple Link Types**:
|
||||
- External links (URLs)
|
||||
- Named routes
|
||||
- Module links (auto-generates route from module slug)
|
||||
- **Permission-Based Filtering**: Menu items are automatically filtered based on user permissions
|
||||
- **Drag & Drop Reordering**: Reorder menu items in the admin panel
|
||||
|
||||
## How It Works
|
||||
|
||||
### Permission Filtering
|
||||
|
||||
Menu items are automatically filtered based on the current user's permissions:
|
||||
|
||||
1. **Module Items**: If a menu item links to a module (e.g., `companies`), the user must have `{module}.view` permission (e.g., `companies.view`) to see that item.
|
||||
|
||||
2. **Permission Items**: If a menu item has a specific `permission` set, the user must have that exact permission.
|
||||
|
||||
3. **Admin Users**: Users with the `admin` role can see all menu items.
|
||||
|
||||
4. **Guest Users**: Only see items with no permission or module restrictions.
|
||||
|
||||
## Usage
|
||||
|
||||
### In Blade Templates
|
||||
|
||||
Use the `<x-frontend-menu>` component to render a menu:
|
||||
|
||||
```blade
|
||||
{{-- Desktop navigation --}}
|
||||
<x-frontend-menu menu="header" />
|
||||
|
||||
{{-- Mobile/responsive navigation --}}
|
||||
<x-frontend-menu-responsive menu="header" />
|
||||
|
||||
{{-- By location --}}
|
||||
<x-frontend-menu menu="footer" />
|
||||
```
|
||||
|
||||
### Programmatic Access
|
||||
|
||||
```php
|
||||
use App\Services\MenuService;
|
||||
|
||||
$menuService = app(MenuService::class);
|
||||
|
||||
// Get menu items (already filtered for current user)
|
||||
$items = $menuService->getMenu('header');
|
||||
|
||||
// Get available modules for menu items
|
||||
$modules = $menuService->getAvailableModules();
|
||||
|
||||
// Get available routes for menu items
|
||||
$routes = $menuService->getAvailableRoutes();
|
||||
```
|
||||
|
||||
## Admin Panel
|
||||
|
||||
Navigate to **Settings > Menus** in the admin panel to:
|
||||
|
||||
1. Create new menus
|
||||
2. Add/edit/delete menu items
|
||||
3. Set item types (link, route, module)
|
||||
4. Configure permissions for each item
|
||||
5. Reorder items via drag & drop
|
||||
|
||||
## Database Structure
|
||||
|
||||
### `menus` table
|
||||
- `id` - Primary key
|
||||
- `name` - Display name
|
||||
- `slug` - Unique identifier (used in templates)
|
||||
- `location` - Optional location hint (header, footer, sidebar)
|
||||
- `is_active` - Toggle menu visibility
|
||||
|
||||
### `menu_items` table
|
||||
- `id` - Primary key
|
||||
- `menu_id` - Foreign key to menus
|
||||
- `parent_id` - For nested items
|
||||
- `title` - Display text
|
||||
- `type` - link, route, or module
|
||||
- `url` - For external links
|
||||
- `route` - For named routes
|
||||
- `route_params` - JSON parameters for routes
|
||||
- `module` - Module slug for permission checking
|
||||
- `permission` - Specific permission required
|
||||
- `icon` - Heroicon name
|
||||
- `target` - _self or _blank
|
||||
- `order` - Sort order
|
||||
- `is_active` - Toggle visibility
|
||||
|
||||
## Adding Menu Items for New Modules
|
||||
|
||||
When creating a new module, add a menu item to link to it:
|
||||
|
||||
1. Go to **Settings > Menus** in admin
|
||||
2. Edit the "Header Navigation" menu
|
||||
3. Click "New" in the Items section
|
||||
4. Set:
|
||||
- **Title**: Your module name
|
||||
- **Type**: Module
|
||||
- **Module**: Select your module from dropdown
|
||||
5. Save
|
||||
|
||||
The menu item will automatically:
|
||||
- Generate the correct URL (`/{module-slug}`)
|
||||
- Check for `{module}.view` permission
|
||||
- Hide from users without permission
|
||||
|
||||
## Customization
|
||||
|
||||
### Custom Menu Component
|
||||
|
||||
Copy and modify the default component:
|
||||
|
||||
```bash
|
||||
cp resources/views/components/frontend-menu.blade.php \
|
||||
resources/views/components/my-custom-menu.blade.php
|
||||
```
|
||||
|
||||
### Styling
|
||||
|
||||
The default components use Tailwind CSS classes. Modify the component templates to match your design.
|
||||
Reference in New Issue
Block a user