Admin Dashboard Guide
Last Updated: 2026-01-19 Status: Implemented Plan Reference: 012-admin-dashboard.md, 075-admin-dashboard-improvement.md, 123-universal-dashboard-builder.md, 124-dashboard-builder-improvements.md, 136-widget-service-refactoring.md, 137-dashboard-widget-expansion.md, 138-dashboard-widget-expansion-phase-2.md
Overview
The Admin Dashboard system provides administrators with comprehensive dashboards for monitoring the client portal. The system includes:
- Static Dashboard - The original dashboard with fixed widgets (
/admin/dashboard?static) - Universal Dashboard Builder - Create unlimited custom dashboards with 149+ widgets across 10 categories
Table of Contents
- Accessing Dashboards
- Dashboard Builder
- Widget Library
- Widget Categories
- Creating Dashboards
- Managing Widgets
- Dashboard Templates
- Technical Architecture
- Static Dashboard
- Related Features
Accessing Dashboards
Navigation
| Access Point | URL | Description |
|---|---|---|
| Home Dashboard | /admin/dashboard | Redirects to default dashboard or static view |
| My Dashboards | /admin/dashboards | Dashboard manager |
| Specific Dashboard | /admin/dashboards/{id} | View a custom dashboard |
| Static Dashboard | /admin/dashboard?static | Original static dashboard |
Permissions
Only users with the Admin role can access admin dashboards.
Dashboard Builder
Overview
The Universal Dashboard Builder allows admins to:
- Create unlimited named dashboards
- Add widgets from a categorized library (145+ widgets across 10 categories)
- Drag-and-drop to rearrange widgets
- Resize widgets
- Set a default dashboard
- Share dashboards with other admins
Edit Mode
Click Edit Dashboard to enter edit mode:
- Widget Library - Sidebar appears with available widgets
- Drag & Drop - Reorder widgets by dragging
- Resize - Use +/- buttons to adjust widget width
- Remove - Click X to remove widgets
- Done Editing - Click to save and exit edit mode
Dashboard Settings
| Setting | Description |
|---|---|
| Name | Dashboard title (editable in edit mode) |
| Description | Optional description |
| Is Default | Set as your default dashboard |
| Is Shared | Make available to other admins |
Widget Library
Categories Overview (149+ Total Widgets)
| Category | Widget Count | Description |
|---|---|---|
| Revenue & Financial | 31 | Financial metrics, invoicing, payments, trends |
| Clients | 31 | Client metrics, pipeline variants, health, surveys/feedback |
| Projects | 21 | Project status, tasks, milestones, deadlines |
| Activity | 18 | Activity feed, meetings, documents, reports |
| System Health | 15 | System health, API monitoring, webhooks |
| Compliance & Security | 16 | Compliance checks, alerts, workflows |
| Time & Resources | 11 | Time tracking, utilization, team scheduling |
| Communication | 8 | Messages, conversations, internal notes |
| Files & Storage | 7 | File uploads, share links, storage metrics |
| Navigation & Links | 2 | Quick navigation widgets |
Widget Categories
Communication (8 widgets)
Messages, conversations, and internal notes tracking.
| Widget Key | Type | Description |
|---|---|---|
unread_messages | metric | Total unread client messages |
recent_conversations | list | Latest active conversations |
messages_today | metric | Messages sent/received today |
conversation_response_time | metric | Average time to respond to clients |
internal_notes_recent | list | Latest internal notes added |
unread_mentions | metric | @mentions awaiting attention |
messages_by_client | chart (bar) | Message volume by client |
communication_summary | metric_grid | Messages, notes, mentions counts |
Files & Storage (7 widgets)
File uploads, share links, and storage metrics.
| Widget Key | Type | Description |
|---|---|---|
active_share_links | metric | Currently active file share links |
expiring_share_links | list | Share links expiring in 7 days |
recent_file_uploads | list | Latest files uploaded |
file_storage_by_client | chart (bar) | Storage usage per client |
file_versions_today | metric | New file versions created today |
virus_scan_status | metric_grid | Passed, failed, pending scans |
file_activity_trend | chart (line) | Upload/download trend over 30 days |
Revenue & Financial (31 widgets)
Core revenue metrics and financial analysis.
| Widget Key | Type | Description |
|---|---|---|
total_revenue | metric | Revenue this month |
outstanding_invoices_count | metric | Count of unpaid invoices |
pending_invoices | metric | Draft and sent invoices |
outstanding_amount | metric | Total outstanding $ |
total_invoiced | metric | Total invoiced in period |
total_paid | metric | Total paid in period |
total_overdue | metric | Overdue amount |
collection_rate | metric | Payment collection % |
avg_payment_time | metric | Average days to payment |
monthly_recurring | metric | Monthly recurring revenue |
total_revenue_financial | metric | Total revenue with invoice count |
invoice_status_chart | chart (doughnut) | Draft/Sent/Paid/Overdue |
invoice_aging_chart | chart (bar) | Aging buckets |
revenue_trend_chart | chart (line) | 6-month revenue |
revenue_trend_1_month | chart (line) | Daily revenue last month |
revenue_trend_12_months | chart (line) | Monthly revenue last year |
revenue_chart | chart (bar) | Monthly revenue visualization |
revenue_by_client | list_progress | Client revenue with progress bars |
invoice_aging_detailed | aging | Aging buckets with chart |
revenue_forecast | forecast | Next 6 months prediction |
financial_summary | financial_summary | Invoiced, paid, outstanding, overdue |
revenue_by_service | chart (doughnut) | Revenue by service type |
invoice_payment_methods | chart (doughnut) | Payments by method |
recurring_revenue_trend | chart (line) | MRR trend over 12 months |
| Payments | ||
payments_this_month | metric | Total payment count this month |
payment_trend | chart (line) | Payments received over 6 months |
recurring_invoices_active | metric | Active recurring invoice count |
recurring_revenue_projection | metric | Next month's expected recurring |
Clients (31 widgets)
Client management and stage tracking.
| Widget Key | Type | Description |
|---|---|---|
total_clients | metric | Total client count |
active_clients | metric | Active client count |
new_clients_this_month | metric | New this month |
client_retention_rate | metric | Retention % |
average_client_ltv | metric | Average lifetime value |
average_client_tenure | metric | Average months as client |
churn_rate | metric | 12-month churn rate |
client_stage_pipeline | pipeline | All 14 stages visual (original) |
client_stage_pipeline_grouped | pipeline_grouped | Stages grouped by phase (Lead/Active/Completed/Ended) |
client_stage_pipeline_rows | pipeline_rows | Two-row layout for better readability |
client_stage_pipeline_list | pipeline_list | Vertical list with progress bars |
client_stage_pipeline_cards | pipeline_cards | Compact cards with abbreviations and tooltips |
client_stage_summary | metric_grid | 4 key stage counts |
client_stage_distribution | chart (doughnut) | Clients by stage |
recent_clients | table | Recently updated |
top_clients | list_progress | By revenue with progress |
at_risk_clients | list | Low health score clients |
client_health_distribution | chart (doughnut) | Distribution by health |
client_growth_trend | chart (line) | New vs churned over time |
client_ltv_analysis | table | Revenue, projects, health by client |
client_summary | summary | Total, active, new with retention |
client_health_trend | chart (line) | Health score trend over 6 months |
clients_by_source | chart (doughnut) | Distribution by acquisition source |
client_acquisition_trend | chart (line) | Where clients come from over time |
| Surveys & Feedback | ||
satisfaction_score | metric | Average client satisfaction rating |
recent_feedback | list | Latest project feedback submissions |
nps_score | metric | Net Promoter Score calculation |
pending_approvals | metric | Deliverables awaiting client approval |
feedback_by_rating | chart (doughnut) | Distribution of ratings |
satisfaction_trend | chart (line) | Satisfaction scores over 6 months |
Projects (21 widgets)
Project status and milestone tracking.
| Widget Key | Type | Description |
|---|---|---|
active_projects | metric | Active project count |
completed_projects | metric | Completed count |
overdue_projects_count | metric | Overdue count |
completion_rate | metric | % completed on time |
on_time_rate | metric | % delivered on time |
total_project_value | metric | Total contract value |
avg_project_duration | metric | Average project length |
project_status_chart | chart (doughnut) | Draft/Active/Completed |
project_timeline | chart (line) | Projects over time |
upcoming_deadlines | list | Due in next 14 days |
overdue_projects | list | Past deadline |
recent_files | list | Recently uploaded files |
projects_by_type | chart (doughnut) | Distribution by type |
milestone_progress | list_progress | Milestone completion |
project_health_overview | metric_grid | Health metrics summary |
| Tasks & Milestones | ||
tasks_due_today | metric | Tasks with today's deadline |
tasks_overdue | metric | Tasks past deadline |
upcoming_milestones | list | Milestones due in 14 days |
milestone_acceptance_rate | metric | Client milestone approval rate |
tasks_by_status | chart (doughnut) | Task distribution by status |
project_progress_overview | list_progress | Progress bars for active projects |
tasks_completed_this_week | metric | Tasks completed in current week |
Activity (18 widgets)
Activity feed, meetings, and documents.
| Widget Key | Type | Description |
|---|---|---|
activity_feed | list | Recent activity |
activity_summary | summary | Period stats |
user_activity_chart | chart (bar) | Activity by user |
activity_by_type | chart (doughnut) | Activity distribution |
login_activity | list | Recent logins |
| Meetings & Discovery | ||
upcoming_meetings | list | Client meetings in next 7 days |
discovery_calls_this_week | metric | Scheduled discovery calls |
meeting_completion_rate | metric | Completed vs scheduled % |
questionnaire_submissions | metric | New submissions this month |
discovery_pipeline | pipeline | Leads by discovery stage |
| Documents & Approvals | ||
pending_documents | metric | Documents awaiting client action |
document_requests_list | list | Recent requests with status |
avg_document_turnaround | metric | Average days to completion |
documents_by_status | chart (doughnut) | Pending/Signed/Expired |
| Reports | ||
scheduled_reports | metric | Active scheduled report count |
reports_generated_today | metric | Reports generated today |
recent_reports | list | Latest generated reports |
Compliance & Security (16 widgets)
Compliance scores, security alerts, and workflows.
| Widget Key | Type | Description |
|---|---|---|
compliance_score | metric | Overall compliance % |
framework_status | metric_grid | SOC2/GDPR/General scores |
mfa_adoption | metric | MFA adoption % |
inactive_accounts | metric | Accounts inactive 90+ days |
audit_logs_today | metric | Today's log count |
security_alerts | metric | Active security alerts |
compliance_checks | table | All checks + status |
open_findings | list | Findings needing attention |
| Alerts & Workflows | ||
active_alerts | metric | Unresolved alerts by severity |
alerts_by_type | chart (bar) | Alert distribution by category |
workflow_executions | metric | Workflows executed today |
workflow_success_rate | metric | Successful vs failed % |
Time & Resources (11 widgets)
Time tracking and team utilization.
| Widget Key | Type | Description |
|---|---|---|
billable_utilization_rate | metric | Billable vs total hours % |
time_by_project | chart (bar) | Hours by project |
time_by_client | chart (doughnut) | Hours by client |
team_workload | list_progress | Hours per team member |
unbilled_time | metric | Total unbilled hours value |
weekly_time_summary | metric_grid | This week's hours breakdown |
| Team Scheduling | ||
pending_time_off | metric | Time off requests awaiting approval |
upcoming_time_off | list | Approved time off in next 14 days |
running_timers | list | Currently active timers |
timesheet_approval_pending | metric | Timesheets awaiting approval |
team_availability | list_progress | Weekly availability overview |
Navigation & Links (2 widgets)
Quick navigation and shortcuts.
| Widget Key | Type | Description |
|---|---|---|
analytics_hub | link_grid | Financial/Project/Client/Custom |
compliance_links | link_grid | Reports/Timeline/History |
System Health (15 widgets)
System health, API monitoring, and quick actions.
| Widget Key | Type | Description |
|---|---|---|
system_health | metric_grid | Queue/Cache/DB status |
quick_actions | actions | Create client/project/invoice |
personalized_insights | insights | AI-powered insights |
| API & Webhooks | ||
active_api_keys | metric | Count of active API keys |
api_calls_today | metric | API requests in last 24 hours |
api_usage_trend | chart (line) | API calls over 30 days |
webhook_delivery_rate | metric | Successful webhook delivery rate |
webhook_failures | list | Recent webhook delivery failures |
api_rate_limit_status | metric_grid | Keys approaching rate limits |
Widget Types
| Type | Component | Description |
|---|---|---|
metric | metric.blade.php | Single value with optional trend |
chart | chart.blade.php | Chart.js visualization (bar, line, doughnut) |
list | list.blade.php | Clickable list items |
list_progress | list-progress.blade.php | List with progress bars |
table | table.blade.php | Data table with headers |
pipeline | pipeline.blade.php | Horizontal stage pipeline (original) |
pipeline_grouped | pipeline-grouped.blade.php | Stages grouped into phase columns |
pipeline_rows | pipeline-rows.blade.php | Two-row layout for 12+ stages |
pipeline_list | pipeline-list.blade.php | Vertical list with progress bars |
pipeline_cards | pipeline-cards.blade.php | Compact cards with abbreviations |
metric_grid | metric-grid.blade.php | Grid of metrics |
link_grid | link-grid.blade.php | Navigation cards |
insights | insights.blade.php | AI insights banner |
actions | actions.blade.php | Quick action buttons |
summary | summary.blade.php | Summary card with multiple metrics |
financial_summary | financial-summary.blade.php | Financial metrics layout |
aging | aging.blade.php | Aging buckets with visualization |
forecast | forecast.blade.php | Prediction chart |
Creating Dashboards
From Scratch
- Navigate to Dashboard > My Dashboards
- Click Create Dashboard
- Enter a name and optional description
- Click Create
- Enter Edit Mode to add widgets
From Template
- Navigate to Dashboard > My Dashboards
- Click From Template
- Select a template:
- Admin Overview - Clients, projects, revenue, activity
- Client Focused - Pipeline, stages, client metrics
- Compliance - Security checks, audit logs, MFA
- Analytics Overview - Financial trends, insights
Managing Widgets
Adding Widgets
- Enter Edit Mode
- Browse widget library (left sidebar)
- Click a widget to add it
Removing Widgets
- Enter Edit Mode
- Hover over widget
- Click the red X button
Resizing Widgets
- Enter Edit Mode
- Hover over widget
- Use +/- buttons to adjust width (3-12 columns)
Reordering Widgets
- Enter Edit Mode
- Drag widgets to new position
- Drop to reorder
Dashboard Templates
Admin Overview
Default dashboard for administrators:
total_clients,active_projects,outstanding_invoices_count,total_revenueinvoice_status_chart,project_status_chart,revenue_trend_chartactivity_summary,upcoming_deadlines,quick_actions
Client Focused
Pipeline and client management:
client_stage_pipeline(full width)client_stage_summary,total_clients,new_clients_this_monthrecent_clients,top_clients,at_risk_clients
Compliance Dashboard
Security and compliance monitoring:
compliance_score,framework_statusmfa_adoption,inactive_accounts,audit_logs_today,security_alertscompliance_checks,open_findings
Analytics Overview
Financial analysis:
personalized_insights(full width)total_invoiced,total_paid,total_overdue,collection_raterevenue_trend_chart,invoice_aging_charttop_clients
Technical Architecture
Services (Federated Provider Pattern)
The widget system uses a federated provider architecture where each category has its own registry and data provider.
app/Services/Dashboard/
├── Contracts/
│ ├── WidgetDataProviderInterface.php
│ └── WidgetRegistryProviderInterface.php
├── AbstractWidgetDataProvider.php
├── WidgetRegistry.php # Orchestrator
├── WidgetDataService.php # Orchestrator
└── Widgets/
├── Activity/
│ ├── ActivityWidgetDataProvider.php
│ └── ActivityWidgetRegistry.php
├── Client/
│ ├── ClientWidgetDataProvider.php
│ └── ClientWidgetRegistry.php
├── Communication/
│ ├── CommunicationWidgetDataProvider.php
│ └── CommunicationWidgetRegistry.php
├── Compliance/
│ ├── ComplianceWidgetDataProvider.php
│ └── ComplianceWidgetRegistry.php
├── Files/
│ ├── FilesWidgetDataProvider.php
│ └── FilesWidgetRegistry.php
├── Project/
│ ├── ProjectWidgetDataProvider.php
│ └── ProjectWidgetRegistry.php
├── Revenue/
│ ├── RevenueWidgetDataProvider.php
│ └── RevenueWidgetRegistry.php
├── SystemHealth/
│ ├── SystemHealthWidgetDataProvider.php
│ └── SystemHealthWidgetRegistry.php
└── TimeResources/
├── TimeResourcesWidgetDataProvider.php
└── TimeResourcesWidgetRegistry.php
Controllers
| Controller | Purpose |
|---|---|
DashboardController | Static dashboard, redirects |
DashboardBuilderController | CRUD for custom dashboards |
Models
| Model | Description |
|---|---|
Dashboard | User's dashboard with name, settings |
DashboardWidget | Widget instance with position, config |
API Routes
| Method | Route | Description |
|---|---|---|
| GET | /admin/dashboards | List dashboards |
| POST | /admin/dashboards | Create dashboard |
| GET | /admin/dashboards/{id} | View dashboard |
| PUT | /admin/dashboards/{id} | Update dashboard |
| DELETE | /admin/dashboards/{id} | Delete dashboard |
| POST | /admin/dashboards/{id}/widgets | Add widget |
| DELETE | /admin/dashboards/{id}/widgets/{widget} | Remove widget |
| PUT | /admin/dashboards/{id}/layout | Update layout |
| PATCH | /admin/dashboards/{id}/set-default | Set as default |
Key Files
app/
├── Http/Controllers/Admin/
│ ├── DashboardController.php
│ └── DashboardBuilderController.php
├── Models/
│ ├── Dashboard.php
│ └── DashboardWidget.php
├── Services/Dashboard/
│ ├── Contracts/
│ ├── AbstractWidgetDataProvider.php
│ ├── WidgetRegistry.php
│ ├── WidgetDataService.php
│ └── Widgets/
│ ├── Activity/
│ ├── Client/
│ ├── Communication/
│ ├── Compliance/
│ ├── Files/
│ ├── Project/
│ ├── Revenue/
│ ├── SystemHealth/
│ └── TimeResources/
resources/views/
├── admin/dashboards/
│ ├── index.blade.php # Dashboard manager
│ ├── show.blade.php # Dashboard view with edit mode
│ └── create.blade.php # Create form
├── components/dashboard/
│ ├── widget-library.blade.php
│ └── widgets/
│ ├── metric.blade.php
│ ├── chart.blade.php
│ ├── list.blade.php
│ ├── list-progress.blade.php
│ ├── table.blade.php
│ ├── pipeline.blade.php
│ ├── pipeline-grouped.blade.php
│ ├── pipeline-rows.blade.php
│ ├── pipeline-list.blade.php
│ ├── pipeline-cards.blade.php
│ ├── metric-grid.blade.php
│ ├── link-grid.blade.php
│ ├── insights.blade.php
│ ├── actions.blade.php
│ ├── summary.blade.php
│ ├── financial-summary.blade.php
│ ├── aging.blade.php
│ └── forecast.blade.php
Adding New Widgets
To add a new widget:
-
Add to Registry: In the appropriate
*WidgetRegistry.php, add the widget definition:'my_new_widget' => [ 'key' => 'my_new_widget', 'name' => 'My New Widget', 'description' => 'Description here', 'category' => 'clients', 'type' => 'metric', 'icon' => 'chart-bar', 'default_size' => ['w' => 3, 'h' => 1], 'data_provider' => 'getMyNewWidget', 'click_url' => 'admin.clients.index', ], -
Add Data Provider Method: In the corresponding
*WidgetDataProvider.php:public function getMyNewWidget(): array { return [ 'value' => 42, 'label' => 'My Metric', ]; } -
Register in getSupportedWidgets(): Add the widget key to the provider's supported list.
Technical Notes
Tailwind Dynamic Classes
Widget column spans use dynamic class names (col-span-{width}). These are safelisted in tailwind.config.js to prevent purging:
col-span-1throughcol-span-12md:col-span-1throughmd:col-span-12lg:col-span-1throughlg:col-span-12
Drag and Drop
The drag-and-drop system uses HTML5 native drag events with a placeholder-based approach:
- Dragged widget is marked with
isDragging: trueand styled as semi-transparent - A dashed placeholder appears at the drop position
- Position is calculated based on mouse position relative to widget centers
- Charts are reinitialized after drop via
$nextTick(() => this.initCharts())
Chart Reinitialization
Charts must be reinitialized after certain operations:
- After drag-and-drop (
finalizeDrop()) - After widget resize (
resizeWidget()) - After widget deletion (
removeWidget()) - This is handled via
this.$nextTick(() => this.initCharts())
Widget Key Format
Widget keys in the JavaScript widgets object use string prefixes (e.g., widget_102) to preserve PHP's insertion order, since Object.entries() sorts numeric keys.
Static Dashboard
The original static dashboard remains available at /admin/dashboard?static:
Overview Cards
| Card | Metric | Description |
|---|---|---|
| Total Clients | Count | All registered clients |
| Active Projects | Count | Projects with "active" status |
| Pending Invoices | Amount | Unpaid invoice total |
| This Month Revenue | Amount | Paid invoices this month |
Charts
- Invoice Status (doughnut)
- Project Status (doughnut)
- Revenue Trend (line)
Activity
- Activity summary by period
- Recent activity feed
Lists
- Overdue invoices
- Upcoming project deadlines
Related Features
| Feature | Relationship |
|---|---|
| Authorization | Admin role required |
| Client Management | Client metrics, surveys & feedback |
| Project Management | Project metrics, tasks & milestones |
| Invoicing | Financial metrics, payments |
| Analytics | Analytics widgets |
| Audit & Compliance | Compliance widgets |
| Time Tracking | Time & Resources, team scheduling |
| Workflow Automation | Workflow widgets |
| Messaging | Communication widgets |
| File Management | Files & Storage widgets |
| API Management | API & Webhooks widgets |
Best Practices
For Dashboard Design
- Start with templates - Use pre-built templates as starting points
- Group related widgets - Keep metrics together by category
- Use full-width wisely - Pipeline and insights work well full-width
- Limit widgets - 8-12 widgets per dashboard for clarity
For Performance
- Refresh sparingly - Data is cached for performance
- Use specific dashboards - Different dashboards for different tasks
- Remove unused widgets - Keep dashboards focused
Troubleshooting
| Issue | Solution |
|---|---|
| Dashboard won't load | Check browser console for errors |
| Widget shows empty | Verify data exists for that metric |
| Drag-drop not working | Ensure you're in Edit Mode |
| Layout not saving | Check network requests for errors |
| New widget not appearing | Check widget is in getSupportedWidgets() |
See Also
- Client Dashboard - Client portal view
- Analytics - Business intelligence
- Audit & Compliance - Security monitoring
- Time Tracking - Time entry system