# User Menu Management (Database-Driven)

## Overview
The user menu dropdown (accessed via the profile icon in the top-right corner) is now fully database-driven. User menu items are organized in a "USER" section in the sidebar menu hierarchy and automatically appear in both the sidebar and the profile dropdown.

## Structure

User menu items are stored as:
- **Parent**: USER (header section, display_order: 999)
  - **Profile** - User profile settings (display_order: 1)
  - **Employee Portal** - Employee self-service portal (display_order: 2)
  - **Settings** - User preferences and settings (display_order: 3)
  - **Logout** - Sign out of the system (display_order: 99)
- **Custom Quick Links** - User-specific custom menu items from UserSettings (dynamically loaded)

### Menu Types
The system now supports three menu types via the `menu_type` column in `menu_items`:

1. **`sidebar`** - Standard sidebar navigation menu (default)
2. **`app_grid`** - App grid items shown in the top bar 3x3 grid dropdown
3. **`user_menu`** - User dropdown menu items (profile icon, top-right)

### User Menu Behavior
- Items with `menu_type = 'user_menu'` appear in the profile dropdown
- Items are sorted by `display_order` ASC
- Permission checks apply: items with `permission_required` are filtered by user permissions
- Quick Links (from `user_custom_menus` table) appear below user menu items with a divider

## Implementation Details

### Database Schema
```sql
-- Migration: 131_add_user_menu_support.sql
ALTER TABLE menu_items 
ADD COLUMN menu_type ENUM('sidebar', 'app_grid', 'user_menu') DEFAULT 'sidebar';

-- User menu items
INSERT INTO menu_items (label, icon, url, menu_type, display_order, is_active) VALUES
('Profile', 'bi bi-person-circle', 'profile', 'user_menu', 1, 1),
('Employee Portal', 'bi bi-briefcase', 'employee-portal', 'user_menu', 2, 1),
('Settings', 'bi bi-gear', 'settings/preferences', 'user_menu', 3, 1),
('Logout', 'bi bi-toggle-off', 'logout', 'user_menu', 99, 1);
```

### Model Method
```php
// models/MenuItem.php
public function getUserMenuItems()
{
    $sql = "SELECT * FROM menu_items 
            WHERE menu_type = 'user_menu' AND is_active = 1 
            ORDER BY display_order ASC";
    
    $items = $this->db->fetchAll($sql);
    
    // Filter by permissions
    $filtered = [];
    foreach ($items as $item) {
        if (empty($item['permission_required']) || hasPermission($item['permission_required'])) {
            $filtered[] = $item;
        }
    }
    
    return $filtered;
}
```

### Header Layout
```php
// views/layouts/app.php (line ~394)
$userMenuItems = $menuItemModel->getUserMenuItems();

// Render dropdown
foreach ($userMenuItems as $userMenuItem) {
    // Display menu item with icon
}
```

## Managing User Menu Items

### Via Admin UI (Settings > Menu Management)

1. **Navigate** to Settings > Menu Management
2. **Click** "Create Menu Item"
3. **Select** Type: "User Menu (Profile Dropdown)"
4. **Fill in**:
   - Label: Display text (e.g., "My Account")
   - Icon: Bootstrap Icon class (e.g., `bi bi-person-circle`)
   - URL: Relative URL (e.g., `profile`)
   - Display Order: Sort position (1-99)
   - Permission Required: Optional permission filter
5. **Save**

### Via SQL

```sql
-- Add a new user menu item
INSERT INTO menu_items (label, icon, url, menu_type, display_order, is_active, permission_required)
VALUES ('Help Center', 'bi bi-question-circle', 'help', 'user_menu', 4, 1, NULL);

-- Update existing item
UPDATE menu_items 
SET display_order = 5 
WHERE label = 'Settings' AND menu_type = 'user_menu';

-- Deactivate item (hide without deleting)
UPDATE menu_items 
SET is_active = 0 
WHERE label = 'Employee Portal' AND menu_type = 'user_menu';
```

## Migration Path

### Before (Hardcoded)
```php
<a href="<?= base_url('profile') ?>">PROFILE</a>
<a href="<?= base_url('logout') ?>">LOGOUT</a>
```

### After (Database-Driven)
```php
<?php foreach ($userMenuItems as $item): ?>
    <a href="<?= base_url($item['url']) ?>">
        <?= strtoupper($item['label']) ?>
        <i class="<?= $item['icon'] ?>"></i>
    </a>
<?php endforeach; ?>
```

## Benefits

1. **Centralized Management** - All menus managed in one place
2. **Permission Control** - Filter items by user permissions
3. **Flexible Ordering** - Reorder items via display_order
4. **Easy Customization** - Add/remove items without code changes
5. **Audit Trail** - Changes logged via AuditLog
6. **Role-Based Access** - Future: restrict items by role

## Future Enhancements

- **Dividers** - Add divider support for grouping
- **External Links** - Support `target="_blank"` for external URLs
- **Icons Per Item** - Already supported, expand usage
- **Conditional Display** - Show/hide based on user attributes
- **Badge Support** - Display notification counts on user menu items

## Files Modified

1. `database/migrations/131_add_user_menu_support.sql` - Migration
2. `models/MenuItem.php` - Added `getUserMenuItems()` method
3. `views/layouts/app.php` - Updated user dropdown to use database
4. `views/menus/create.php` - Added "User Menu" type option
5. `views/menus/edit.php` - Added "User Menu" type option
6. `controllers/MenuController.php` - Handle `menu_type` in store/update

## Testing

1. **Verify Items Load**
   ```sql
   SELECT * FROM menu_items WHERE menu_type = 'user_menu';
   ```

2. **Test Permissions**
   - Add permission_required to an item
   - Login as user without permission
   - Verify item is hidden

3. **Test Ordering**
   - Change display_order values
   - Refresh page
   - Verify new order

4. **Test Active/Inactive**
   - Set is_active = 0
   - Verify item disappears from menu

## Notes

- **Quick Links** are still managed separately via `user_custom_menus` table
- **Custom User Menus** (Quick Links) appear below standard user menu items
- **Logout** intentionally has display_order = 99 to appear last
- **Employee Portal** URL should be verified/created if not exists
- **Settings** URL assumes settings/preferences route exists
