Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
I
IPRSv2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Ngei
IPRSv2
Commits
e73e85ad
Commit
e73e85ad
authored
Apr 10, 2025
by
Brian Wangora
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Admin dashboard 90%
parent
3ad67b88
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
979 additions
and
454 deletions
+979
-454
dashboard.blade.php
resources/views/home/dashboard.blade.php
+979
-454
No files found.
resources/views/home/dashboard.blade.php
View file @
e73e85ad
...
@@ -193,29 +193,121 @@
...
@@ -193,29 +193,121 @@
</div>
</div>
</div>
</div>
<!-- User Activity & Access Logs -->
<div
class=
"row mt-4"
>
<div
class=
"col-md-4"
>
<x-adminlte-info-box
title=
"Active Users (24h)"
text=
"142"
icon=
"fas fa-users fa-2x"
theme=
"gradient-teal"
progress-value=
"15"
progress-description=
"↑15% from yesterday"
/>
</div>
<div
class=
"col-md-4"
>
<x-adminlte-info-box
title=
"Failed Logins (24h)"
text=
"28"
icon=
"fas fa-user-lock fa-2x"
theme=
"gradient-orange"
progress-value=
"8"
progress-description=
"↓3 from yesterday"
/>
</div>
<div
class=
"col-md-4"
>
<x-adminlte-info-box
title=
"Avg Session Duration"
text=
"24m 18s"
icon=
"fas fa-clock fa-2x"
theme=
"gradient-info"
progress-value=
"12"
progress-description=
"↑12% from last week"
/>
</div>
</div>
<div
class=
"d-flex flex-column flex-lg-row"
>
<!-- Data Quality & Maintenance -->
<div
class=
"col-lg-8"
>
<div
class=
"row mt-4"
>
<div>
<div
class=
"col-md-4"
>
<div
class=
"d-flex flex-column flex-sm-row justify-content-between"
>
<x-adminlte-info-box
<x-adminlte-info-box
title=
"National Registration Bureau"
text=
"53,568,898"
icon=
"fas fa-lg fa-users text-success"
class=
"mr-3"
/>
title=
"Duplicate Records"
<x-adminlte-info-box
title=
"Civil Registration Department"
text=
"23,984,343"
icon=
"fas fa-lg fa-certificate text-success"
/>
text=
"1,842"
</div>
icon=
"fas fa-copy fa-2x"
theme=
"gradient-orange"
progress-value=
"3.2"
progress-description=
"0.32% of total records"
>
<div
class=
"text-xs text-muted"
>
NRB: 892 | CRS: 612 | DOI: 338
</div>
</x-adminlte-info-box>
</div>
<div
class=
"col-md-4"
>
<x-adminlte-info-box
title=
"Unverified Records"
text=
"247"
icon=
"fas fa-question-circle fa-2x"
theme=
"gradient-indigo"
progress-value=
"15"
progress-description=
"15% overdue"
/>
</div>
<div
class=
"col-md-4"
>
<x-adminlte-info-box
title=
"Sync Success Rate"
text=
"98.7%"
icon=
"fas fa-sync-alt fa-2x"
theme=
"gradient-teal"
progress-value=
"98.7"
progress-description=
"↑1.2% from last week"
/>
</div>
</div>
<div
class=
"d-flex flex-column flex-sm-row justify-content-between"
>
<!-- Performance Monitoring -->
<x-adminlte-info-box
title=
"Department of Immigration"
text=
"17,763,238"
icon=
"fas fa-lg fa-flag text-success"
class=
"mr-3"
/>
<div
class=
"row mt-4"
>
<x-adminlte-info-box
title=
"Refugee Affairs Department"
text=
"11,821,317"
icon=
"fas fa-lg fa-life-ring text-success"
/>
<div
class=
"col-md-4"
>
</div>
<x-adminlte-info-box
title=
"Avg Query Time"
text=
"142ms"
icon=
"fas fa-database fa-2x"
theme=
"gradient-indigo"
progress-value=
"85"
progress-description=
"Slowest: 2.4s"
id=
"queryTimeWidget"
>
</x-adminlte-info-box>
</div>
<div
class=
"col-md-4"
>
<x-adminlte-info-box
title=
"Storage Used"
text=
"2.4TB/5TB"
icon=
"fas fa-hdd fa-2x"
theme=
"gradient-teal"
progress-value=
"48"
progress-description=
"48% utilized"
id=
"storageWidget"
>
</x-adminlte-info-box>
</div>
<div
class=
"col-md-4"
>
<x-adminlte-info-box
title=
"Network Traffic"
text=
"42GB"
icon=
"fas fa-network-wired fa-2x"
theme=
"gradient-primary"
progress-value=
"72"
progress-description=
"72% external"
id=
"trafficWidget"
>
</x-adminlte-info-box>
</div>
</div>
<div
class=
"d-flex flex-column flex-sm-row justify-content-between"
>
<x-adminlte-info-box
title=
"Registrar General"
text=
"17,763,238"
icon=
"fas fa-lg fa-server text-success"
class=
""
/>
{{--
<x-adminlte-info-box
style=
"opacity: 0;"
/>
--}}
</div>
</div>
<!-- New Widgets -->
<div
class=
"d-flex flex-column flex-lg-row mt-4"
>
<!-- Left Side -->
<div
class=
"col-lg-8"
>
<!-- System Performance and Health -->
<!-- System Performance and Health -->
<div
class=
"row
mt-4
"
>
<div
class=
"row"
>
<div
class=
"col-md-6"
>
<div
class=
"col-md-6"
>
<x-adminlte-card
title=
"System Load & Capacity"
theme=
""
icon=
""
collapsible
>
<x-adminlte-card
title=
"System Load & Capacity"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<x-slot
name=
"titleSlot"
>
...
@@ -275,37 +367,76 @@
...
@@ -275,37 +367,76 @@
</table>
</table>
</x-adminlte-card>
</x-adminlte-card>
</div>
</div>
</div>
<div
class=
"col-md-6 mt-4"
>
<div
class=
"col-md-12 mt-4"
>
<x-adminlte-card
title=
"Database Query Performance"
theme=
""
icon=
""
collapsible
>
<x-adminlte-card
title=
"API Request Volume (Last 7 Days)"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Database Query Performance
</h4>
<h4
class=
"card-title"
>
API Request Volume (Last 7 Days)
</h4>
</x-slot>
</x-slot>
<div
class=
"float-right mb-3"
>
<div
class=
"d-flex justify-content-end mb-3"
>
<button
class=
"btn btn-sm btn-outline-primary"
id=
"refreshQueries"
>
<div
class=
"btn-group"
>
<i
class=
"fas fa-sync-alt"
></i>
Refresh
<button
class=
"btn btn-sm btn-outline-secondary"
>
24h
</button>
</button>
<button
class=
"btn btn-sm btn-secondary"
>
7d
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
30d
</button>
</div>
</div>
</div>
<div
class=
"chart-container"
style=
"position: relative; height: 300px;"
>
<div
class=
"card-body"
>
<canvas
id=
"queryPerformanceChart"
></canvas>
<div
class=
"position-relative mb-4"
>
<canvas
id=
"apiVolumeChart"
height=
"300"
></canvas>
</div>
</div>
<div
class=
"d-flex flex-row justify-content-between"
>
<div
class=
"mt-3 table-responsive"
>
<span
class=
"mr-2"
>
<table
class=
"table table-sm table-hover"
id=
"slowQueriesTable"
>
<i
class=
"fas fa-square text-primary"
></i>
External
<thead>
</span>
<tr>
<span
class=
"mr-2"
>
<th>
Query
</th>
<i
class=
"fas fa-square text-teal"
></i>
Internal
<th>
Avg Time
</th>
</span>
<th>
Calls
</th>
<span>
</tr>
<i
class=
"fas fa-square text-gray"
></i>
Failed
</thead>
</span>
<tbody>
<tr>
<td>
SELECT * FROM users WHERE...
</td>
<td>
420ms
</td>
<td>
1,842
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</x-adminlte-card>
</x-adminlte-card>
</div>
<div
class=
"col-md-6 mt-4"
>
<x-adminlte-card
title=
"Storage Utilization"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Storage Utilization
</h4>
</x-slot>
<div
class=
"row"
>
<div
class=
"col-md-6"
>
<div
class=
"chart-container"
style=
"position: relative; height: 200px;"
>
<canvas
id=
"storageChart"
></canvas>
</div>
</div>
<div
class=
"col-md-6"
>
<div
class=
"chart-container"
style=
"position: relative; height: 200px;"
>
<canvas
id=
"storageTrendChart"
></canvas>
</div>
</div>
</div>
<div
class=
"mt-3"
>
<table
class=
"table table-sm"
>
<tr>
<td>
Database
</td>
<td>
1.2TB
</td>
<td><div
class=
"progress progress-xs"
><div
class=
"progress-bar bg-primary"
style=
"width: 60%"
></div></div></td>
</tr>
<tr>
<td>
Backups
</td>
<td>
0.8TB
</td>
<td><div
class=
"progress progress-xs"
><div
class=
"progress-bar bg-success"
style=
"width: 40%"
></div></div></td>
</tr>
<!-- More rows -->
</table>
</div>
</x-adminlte-card>
</div>
</div>
</div>
<!-- SYNC LOGS TABLE -->
<!-- SYNC LOGS TABLE -->
...
@@ -566,49 +697,146 @@
...
@@ -566,49 +697,146 @@
</div>
</div>
<!--
API & System Usage
-->
<!--
User Activity & Access Logs
-->
<div
class=
"mt-4"
>
<div
class=
"mt-4"
>
<x-adminlte-card
title=
"
Response Time Trend
s"
theme=
""
icon=
""
collapsible
>
<x-adminlte-card
title=
"
Failed Login Attempt
s"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Response Time Trend
s
</h4>
<h4
class=
"card-title"
>
Failed Login Attempt
s
</h4>
</x-slot>
</x-slot>
<div
class=
""
>
<div
class=
""
>
<div
class=
"btn-group"
>
<div
class=
"input-group input-group-sm"
style=
"width: 250px;"
>
<button
class=
"btn btn-sm btn-outline-secondary"
>
Hourly
</button>
<input
type=
"text"
class=
"form-control"
placeholder=
"Search..."
>
<button
class=
"btn btn-sm btn-secondary"
>
Daily
</button>
<div
class=
"input-group-append"
>
<button
class=
"btn btn-sm btn-outline-secondary"
>
Weekly
</button>
<button
class=
"btn btn-primary"
>
<i
class=
"fas fa-search"
></i>
</button>
</div>
</div>
</div>
</div>
</div>
<div
class=
"card-body"
>
<div
class=
"card-body p-0"
>
<div
class=
"chart"
>
<div
class=
"table-responsive"
>
<canvas
id=
"responseTimeChart"
height=
"300"
></canvas>
<table
class=
"table table-hover table-striped"
>
<thead>
<tr>
<th>
Timestamp
</th>
<th>
Username
</th>
<th>
IP Address
</th>
<th>
Location
</th>
<th>
Device
</th>
<th>
Actions
</th>
</tr>
</thead>
<tbody>
<tr
class=
"bg-danger-light"
>
<td>
2023-11-20 14:32:18
</td>
<td>
admin
</td>
<td>
192.168.1.45
</td>
<td>
Nairobi, KE
</td>
<td>
Chrome (Windows)
</td>
<td>
<button
class=
"btn btn-xs btn-danger"
>
Block IP
</button>
<button
class=
"btn btn-xs btn-info"
>
Details
</button>
</td>
</tr>
<tr>
<td>
2023-11-20 14:30:05
</td>
<td>
jane.smith
</td>
<td>
41.90.12.34
</td>
<td>
Mombasa, KE
</td>
<td>
Firefox (Linux)
</td>
<td>
<button
class=
"btn btn-xs btn-warning"
>
Notify User
</button>
</td>
</tr>
<!-- More rows -->
</tbody>
</table>
</div>
</div>
<div
class=
"d-flex flex-row justify-content-between mt-2"
>
</div>
<span
class=
"mr-2"
>
<div
class=
"card-footer clearfix"
>
<i
class=
"fas fa-circle text-primary"
></i>
Verification
<div
class=
"float-right"
>
</span>
<button
class=
"btn btn-sm btn-outline-primary mr-2"
>
<span
class=
"mr-2"
>
<i
class=
"fas fa-sync-alt"
></i>
Refresh
<i
class=
"fas fa-circle text-success"
></i>
Search
</button>
</span>
<button
class=
"btn btn-sm btn-primary"
>
<span
class=
"mr-2"
>
<i
class=
"fas fa-download"
></i>
Export
<i
class=
"fas fa-circle text-info"
></i>
Bulk
</button>
</span>
<span>
<i
class=
"fas fa-circle text-warning"
></i>
Admin
</span>
</div>
</div>
</div>
</div>
</x-adminlte-card>
</x-adminlte-card>
</div>
</div>
<!-- Data Quality & Maintenance -->
<div>
<div
class=
"mt-4"
>
<div
class=
"container-fluid d-flex flex-column p-3 bg-white rounded"
>
<x-adminlte-card
title=
"Unverified Records Pending Review"
theme=
""
icon=
""
collapsible
>
<div
class=
"d-flex flex-column flex-sm-row justify-content-between align-items-center mb-3"
>
<x-slot
name=
"titleSlot"
>
<div>
<h4
class=
"card-title"
>
Unverified Records Pending Review
</h4>
<span
class=
"h4"
>
Data
</span>
</x-slot>
<div
class=
"float-right mb-3"
>
<div
class=
"input-group input-group-sm"
style=
"width: 200px;"
>
<select
class=
"form-control"
>
<option>
All Sources
</option>
<option>
NRB
</option>
<option>
CRS
</option>
<option>
DOI
</option>
</select>
</div>
</div>
</div>
</div>
<div
class=
"card-body p-0"
>
<div
class=
"table-responsive"
>
<table
class=
"table table-hover"
>
<thead>
<tr>
<th>
Record ID
</th>
<th>
Source
</th>
<th>
Days Pending
</th>
<th>
Priority
</th>
<th>
Actions
</th>
</tr>
</thead>
<tbody>
<tr
class=
"bg-danger-light"
>
<td>
NRB-2023-8472
</td>
<td><span
class=
"badge bg-primary"
>
NRB
</span></td>
<td>
12
</td>
<td><span
class=
"badge bg-danger"
>
High
</span></td>
<td>
<button
class=
"btn btn-xs btn-info"
>
Review
</button>
<button
class=
"btn btn-xs btn-success"
>
Verify
</button>
</td>
</tr>
<tr>
<td>
CRS-2023-3381
</td>
<td><span
class=
"badge bg-teal"
>
CRS
</span></td>
<td>
5
</td>
<td><span
class=
"badge bg-warning"
>
Medium
</span></td>
<td>
<button
class=
"btn btn-xs btn-info"
>
Review
</button>
</td>
</tr>
<!-- More rows -->
</tbody>
</table>
</div>
</div>
<div
class=
"card-footer clearfix"
>
<div
class=
"float-right"
>
<button
class=
"btn btn-sm btn-outline-primary mr-2"
>
<i
class=
"fas fa-sync-alt"
></i>
Refresh
</button>
<button
class=
"btn btn-sm btn-primary"
>
<i
class=
"fas fa-download"
></i>
Export
</button>
</div>
</div>
</x-adminlte-card>
</div>
<div
class=
"mt-4"
>
<x-adminlte-card
title=
"Number of Requests by Organization"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Number of Requests by Organization
</h4>
</x-slot>
<div
class=
""
>
<div
class=
""
>
@php
@php
$heads = [
$heads = [
...
@@ -650,325 +878,459 @@
...
@@ -650,325 +878,459 @@
@endforeach
@endforeach
</x-adminlte-datatable>
</x-adminlte-datatable>
</div>
</div>
</div>
</x-adminlte-card>
</div>
<div
class=
"d-flex justify-content-between mt-3"
>
<x-adminlte-small-box
title=
"10.8k"
text=
"Remaining Tokens"
icon=
"fas fa-lg fa-coins text-success"
theme=
"white"
url=
"#"
url-text=
"View details"
class=
"w-50 mr-3"
/>
<x-adminlte-small-box
title=
"308"
text=
"Searches Performed"
icon=
"fas fa-lg fa-poll text-danger"
theme=
"white"
url=
"#"
url-text=
"View details"
class=
"w-50"
/>
</div>
</div>
<div
class=
""
>
<div
class=
"container-fluid d-flex flex-column p-3 bg-white rounded"
>
<!-- Performance Monitoring -->
<div
class=
"d-flex flex-column flex-sm-row justify-content-between align-items-center mb-3"
>
<div
class=
"mt-4"
>
<div>
<x-adminlte-card
title=
"Network Traffic Analysis"
theme=
""
icon=
""
collapsible
>
<span
class=
"h4"
></span>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Network Traffic Analysis
</h4>
</x-slot>
<div
class=
"card-tools"
>
<div
class=
"btn-group"
>
<button
class=
"btn btn-sm btn-outline-secondary active"
>
24h
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
7d
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
30d
</button>
</div>
</div>
</div>
</div>
<div
class=
""
>
<div
class=
""
>
<div
class=
"card"
>
<div
class=
"chart-container"
style=
"position: relative; height: 300px;"
>
<div
class=
"m-2"
>
<canvas
id=
"networkTrafficChart"
></canvas>
<span
class=
"h5"
>
Input Traffic
</span>
</div>
<div
class=
"row mt-3"
>
<div
class=
"col-md-4"
>
<div
class=
"info-box bg-light"
>
<span
class=
"info-box-icon bg-primary"
><i
class=
"fas fa-server"
></i></span>
<div
class=
"info-box-content"
>
<span
class=
"info-box-text"
>
Internal Traffic
</span>
<span
class=
"info-box-number"
>
12GB
</span>
</div>
</div>
</div>
</div>
<div
class=
"px-2 py-4"
>
<div
class=
"col-md-4"
>
<canvas
id=
"dataInput"
></canvas>
<div
class=
"info-box bg-light"
>
<span
class=
"info-box-icon bg-danger"
><i
class=
"fas fa-globe"
></i></span>
<div
class=
"info-box-content"
>
<span
class=
"info-box-text"
>
External Traffic
</span>
<span
class=
"info-box-number"
>
30GB
</span>
</div>
</div>
</div>
</div>
</div>
<div
class=
"col-md-4"
>
</div>
<div
class=
"info-box bg-light"
>
</div>
<span
class=
"info-box-icon bg-warning"
><i
class=
"fas fa-shield-alt"
></i></span>
</div>
<div
class=
"info-box-content"
>
</div>
<span
class=
"info-box-text"
>
Blocked Requests
</span>
<div
class=
"col-lg-4 d-flex flex-column"
>
<span
class=
"info-box-number"
>
1.2GB
</span>
<div>
</div>
<div>
</div>
<div
class=
"container-fluid d-flex flex-column mb-3 p-3 bg-white rounded"
>
<div
class=
"d-flex flex-column flex-sm-row justify-content-between align-items-center mb-3"
>
<div>
<span
class=
"h4"
>
Client Onboarding Drafts
</span>
</div>
</div>
</div>
</div>
<div
class=
""
>
@php
$heads = [
'ID',
'Client',
['label' => 'Actions', 'no-export' => true, 'width' => 5],
];
$config = [
'data' => \App\Models\Onboarding::where(function ($query) {
$query->orWhereNull("client_rid")->orWhereNull("contract_rid")->orWhereNull("user_id");
})->get(),
'order' => [[1, 'asc']],
'columns' => [null, null, ['orderable' => false]],
];
@endphp
<x-adminlte-datatable
id=
"onboardingDrafts"
bordered
:heads=
"$heads"
hoverable
striped
>
@foreach($config['data'] as $row)
<tr>
<td>
{{ $row->id }}
</td>
<td>
{{ $row->client->name_fl ?? '-' }}
</td>
<td>
<div
class=
"d-flex"
>
@if($row->client_rid != null)
<a
href=
"{{ route('onboarding.show', $row->id) }}"
class=
"btn btn-xs btn-default text-teal mx-1 shadow"
title=
"Details"
>
<i
class=
"fa fa-lg fa-fw fa-eye"
></i>
</a>
@endif
<a
href=
"{{ route('onboarding.edit', $row->id) }}"
class=
"btn btn-xs btn-default text-primary mx-1 shadow"
title=
"Edit"
>
<i
class=
"fa fa-lg fa-fw fa-pen"
></i>
</a>
</div>
</td>
</tr>
@endforeach
</x-adminlte-datatable>
</div>
</div>
</div>
</div>
</x-adminlte-card>
</div>
<x-adminlte-card
title=
"Error Sources"
theme=
""
icon=
""
collapsible
>
<!-- API & System Usage -->
<div
class=
"mt-4"
>
<x-adminlte-card
title=
"Response Time Trends"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Error Source
s
</h4>
<h4
class=
"card-title"
>
Response Time Trend
s
</h4>
</x-slot>
</x-slot>
<div
class=
""
>
<div
class=
"btn-group"
>
<button
class=
"btn btn-sm btn-outline-secondary"
>
Hourly
</button>
<button
class=
"btn btn-sm btn-secondary"
>
Daily
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
Weekly
</button>
</div>
</div>
<div
class=
"card-body"
>
<div
class=
"card-body"
>
<canvas
id=
"errorSourcesChart"
height=
"250"
></canvas>
<div
class=
"chart"
>
<div
class=
"table-responsive"
>
<canvas
id=
"responseTimeChart"
></canvas>
<table
class=
"table table-sm"
>
</div>
<thead>
<div
class=
"d-flex flex-row justify-content-between mt-2"
>
<tr>
<span
class=
"mr-2"
>
<th>
Source
</th>
<i
class=
"fas fa-circle text-primary"
></i>
Verification
<th>
Errors
</th>
</span>
<th>
Rate
</th>
<span
class=
"mr-2"
>
</tr>
<i
class=
"fas fa-circle text-success"
></i>
Search
</thead>
</span>
<tbody>
<span
class=
"mr-2"
>
<tr>
<i
class=
"fas fa-circle text-info"
></i>
Bulk
<td>
Mobile App
</td>
</span>
<td>
12
</td>
<span>
<td><span
class=
"badge bg-warning"
>
0.18%
</span></td>
<i
class=
"fas fa-circle text-warning"
></i>
Admin
</tr>
</span>
<tr>
<td>
Partner API
</td>
<td>
8
</td>
<td><span
class=
"badge bg-danger"
>
0.31%
</span></td>
</tr>
<!-- More rows -->
</tbody>
</table>
</div>
</div>
</div>
</div>
</x-adminlte-card>
</x-adminlte-card>
</div>
<div
class=
"mt-4"
>
<!-- QUEUE VISUALIZATION -->
<x-adminlte-card
title=
"API Request Volume (Last 7 Days)"
theme=
""
icon=
""
collapsible
>
<x-adminlte-card
title=
"Sync Queue Status"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Sync Queue Status
</h4>
<h4
class=
"card-title"
>
API Request Volume (Last 7 Days)
</h4>
</x-slot>
</x-slot>
<div>
<div
class=
"d-flex justify-content-end mb-3"
>
<div
class=
"btn-group"
>
<button
class=
"btn btn-sm btn-outline-secondary"
>
24h
</button>
<button
class=
"btn btn-sm btn-secondary"
>
7d
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
30d
</button>
</div>
</div>
<div
class=
"card-body"
>
<div
class=
"position-relative mb-4"
>
<div
class=
"position-relative mb-4"
>
<canvas
id=
"
queueStatusChart"
height=
"250
"
></canvas>
<canvas
id=
"
apiVolumeChart
"
></canvas>
</div>
</div>
<div
class=
"d-flex justify-content-around text-center"
>
<div
class=
"d-flex flex-row justify-content-between"
>
<div>
<span
class=
"mr-2"
>
<div
class=
"text-lg"
>
1,842
</div>
<i
class=
"fas fa-square text-primary"
></i>
External
<div
class=
"text-muted"
>
Queued
</div>
</span>
</div>
<span
class=
"mr-2"
>
<div>
<i
class=
"fas fa-square text-teal"
></i>
Internal
<div
class=
"text-lg"
>
4,218
</div>
</span>
<div
class=
"text-muted"
>
Processed (24h)
</div>
<span>
</div>
<i
class=
"fas fa-square text-gray"
></i>
Failed
<div>
</span>
<div
class=
"text-lg"
>
18
</div>
<div
class=
"text-muted"
>
Failed
</div>
</div>
</div>
</div>
</div>
</div>
</x-adminlte-card>
</x-adminlte-card>
</div>
<x-adminlte-card
title=
"Sync Performance"
theme=
""
icon=
""
collapsible
>
<div
class=
"row"
>
<x-slot
name=
"titleSlot"
>
<div
class=
"col-md-6"
>
<h4
class=
"card-title"
>
Sync Performance
</h4>
<x-adminlte-card
title=
"Error Sources"
theme=
""
icon=
""
collapsible
>
</x-slot>
<x-slot
name=
"titleSlot"
>
<div>
<h4
class=
"card-title"
>
Error Sources
</h4>
<ul
class=
"nav nav-tabs"
>
</x-slot>
<li
class=
"nav-item"
>
<a
class=
"nav-link active"
data-toggle=
"tab"
href=
"#tab-nrb"
>
NRB
</a>
<div
class=
"card-body"
>
</li>
<canvas
id=
"errorSourcesChart"
height=
"250"
></canvas>
<li
class=
"nav-item"
>
<div
class=
"table-responsive"
>
<a
class=
"nav-link"
data-toggle=
"tab"
href=
"#tab-crs"
>
CRS
</a>
<table
class=
"table table-sm"
>
</li>
<thead>
<li
class=
"nav-item"
>
<tr>
<a
class=
"nav-link"
data-toggle=
"tab"
href=
"#tab-doi"
>
DOI
</a>
<th>
Source
</th>
</li>
<th>
Errors
</th>
</ul>
<th>
Rate
</th>
<div
class=
"tab-content"
>
</tr>
<div
class=
"tab-pane active"
id=
"tab-nrb"
>
</thead>
<div
class=
"chart"
>
<tbody>
<canvas
id=
"nrbPerformanceChart"
height=
"200"
></canvas>
<tr>
</div>
<td>
Mobile App
</td>
<div
class=
"mt-3"
>
<td>
12
</td>
<span
class=
"badge bg-primary"
>
Avg: 32s
</span>
<td><span
class=
"badge bg-warning"
>
0.18%
</span></td>
<span
class=
"badge bg-success"
>
Success: 99.2%
</span>
</tr>
<span
class=
"badge bg-info"
>
Throughput: 42 rec/s
</span>
<tr>
</div>
<td>
Partner API
</td>
<td>
8
</td>
<td><span
class=
"badge bg-danger"
>
0.31%
</span></td>
</tr>
<!-- More rows -->
</tbody>
</table>
</div>
</div>
<!-- Other tabs -->
</div>
</div>
</div>
</x-adminlte-card>
</x-adminlte-card>
</div>
<div
class=
"col-md-6"
>
<x-adminlte-card
title=
"Error Causes"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Error Causes
</h4>
</x-slot>
<div
class=
"card-body"
>
<canvas
id=
"failureReasonsChart"
height=
"250"
></canvas>
<div
class=
"mt-3"
>
<table
class=
"table table-sm"
>
<tr>
<td><span
class=
"badge bg-danger"
>
Timeout
</span></td>
<td>
142
</td>
<td>
43%
</td>
</tr>
<tr>
<td><span
class=
"badge bg-warning"
>
Invalid Data
</span></td>
<td>
89
</td>
<td>
27%
</td>
</tr>
<tr>
<td><span
class=
"badge bg-secondary"
>
Auth Failed
</span></td>
<td>
62
</td>
<td>
19%
</td>
</tr>
<tr>
<td><span
class=
"badge bg-info"
>
Other
</span></td>
<td>
35
</td>
<td>
11%
</td>
</tr>
</table>
</div>
</div>
</x-adminlte-card>
</div>
</div>
</div>
<!-- Right Side -->
<div
class=
"col-lg-4 d-flex flex-column"
>
<x-adminlte-card
title=
"Client Onboarding Drafts"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Client Onboarding Drafts
</h4>
</x-slot>
<div
class=
""
>
@php
$heads = [
'ID',
'Client',
['label' => 'Actions', 'no-export' => true, 'width' => 5],
];
$config = [
'data' => \App\Models\Onboarding::where(function ($query) {
$query->orWhereNull("client_rid")->orWhereNull("contract_rid")->orWhereNull("user_id");
})->get(),
'order' => [[1, 'asc']],
'columns' => [null, null, ['orderable' => false]],
];
@endphp
<x-adminlte-datatable
id=
"onboardingDrafts"
bordered
:heads=
"$heads"
hoverable
striped
>
@foreach($config['data'] as $row)
<tr>
<td>
{{ $row->id }}
</td>
<td>
{{ $row->client->name_fl ?? '-' }}
</td>
<td>
<div
class=
"d-flex"
>
@if($row->client_rid != null)
<a
href=
"{{ route('onboarding.show', $row->id) }}"
class=
"btn btn-xs btn-default text-teal mx-1 shadow"
title=
"Details"
>
<i
class=
"fa fa-lg fa-fw fa-eye"
></i>
</a>
@endif
<a
href=
"{{ route('onboarding.edit', $row->id) }}"
class=
"btn btn-xs btn-default text-primary mx-1 shadow"
title=
"Edit"
>
<i
class=
"fa fa-lg fa-fw fa-pen"
></i>
</a>
</div>
</td>
</tr>
@endforeach
</x-adminlte-datatable>
</div>
</x-adminlte-card>
<!-- Data Integrity & Verification Trends -->
<x-adminlte-card
title=
"Sync Performance"
theme=
""
icon=
""
collapsible
>
<x-adminlte-card
title=
"Verification Success Rate Trend"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Sync Performance
</h4>
<h4
class=
"card-title"
>
Verification Success Rate Trend
</h4>
</x-slot>
</x-slot>
<div>
<div
class=
"float-right mb-3"
>
<ul
class=
"nav nav-tabs"
>
<div
class=
"btn-group"
>
<li
class=
"nav-item"
>
<button
class=
"btn btn-sm btn-outline-secondary active"
>
30d
</button>
<a
class=
"nav-link active"
data-toggle=
"tab"
href=
"#tab-nrb"
>
NRB
</a>
<button
class=
"btn btn-sm btn-outline-secondary"
>
90d
</button>
</li>
<button
class=
"btn btn-sm btn-outline-secondary"
>
1y
</button>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
data-toggle=
"tab"
href=
"#tab-crs"
>
CRS
</a>
</li>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
data-toggle=
"tab"
href=
"#tab-doi"
>
DOI
</a>
</li>
</ul>
<div
class=
"tab-content"
>
<div
class=
"tab-pane active"
id=
"tab-nrb"
>
<div
class=
"chart"
>
<canvas
id=
"nrbPerformanceChart"
height=
"200"
></canvas>
</div>
<div
class=
"mt-3"
>
<span
class=
"badge bg-primary"
>
Avg: 32s
</span>
<span
class=
"badge bg-success"
>
Success: 99.2%
</span>
<span
class=
"badge bg-info"
>
Throughput: 42 rec/s
</span>
</div>
</div>
</div>
<!-- Other tabs -->
</div>
</div>
<div
class=
"chart"
>
</div>
<canvas
id=
"verificationTrendChart"
height=
"250"
></canvas>
</x-adminlte-card>
</div>
</x-adminlte-card>
<x-adminlte-card
title=
"Duplicate Records by Source"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<!-- Data Integrity & Verification Trends -->
<h4
class=
"card-title"
>
Duplicate Records by Source
</h4>
<x-adminlte-card
title=
"Verification Success Rate Trend"
theme=
""
icon=
""
collapsible
>
</x-slot>
<x-slot
name=
"titleSlot"
>
<div
class=
"card-body"
>
<h4
class=
"card-title"
>
Verification Success Rate Trend
</h4>
<div
class=
"chart"
>
</x-slot>
<canvas
id=
"duplicatesChart"
height=
"250"
></canvas>
<div
class=
"float-right mb-3"
>
<div
class=
"btn-group"
>
<button
class=
"btn btn-sm btn-outline-secondary active"
>
30d
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
90d
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
1y
</button>
</div>
</div>
<div
class=
"chart"
>
<canvas
id=
"verificationTrendChart"
height=
"250"
></canvas>
</div>
</x-adminlte-card>
<x-adminlte-card
title=
"Duplicate Records by Source"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Duplicate Records by Source
</h4>
</x-slot>
<div
class=
"card-body"
>
<div
class=
"chart"
>
<canvas
id=
"duplicatesChart"
height=
"250"
></canvas>
</div>
<div
class=
"mt-3 d-flex justify-content-around text-center"
>
<div>
<span
class=
"badge bg-primary"
>
NRB: 48%
</span>
</div>
</div>
<div
class=
"mt-3 d-flex justify-content-around text-center"
>
<div>
<div>
<span
class=
"badge bg-teal"
>
CRS: 33%
</span>
<span
class=
"badge bg-primary"
>
NRB: 48%
</span>
</div>
</div>
<div>
<div>
<span
class=
"badge bg-purple"
>
DOI: 19%
</span>
<span
class=
"badge bg-teal"
>
CRS: 33%
</span>
</div>
<div>
<span
class=
"badge bg-purple"
>
DOI: 19%
</span>
</div>
</div>
</div>
</div>
</div>
</x-adminlte-card>
</div>
</x-adminlte-card>
<x-adminlte-card
title=
"Duplicate Trend (Last 30 Days)"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Duplicate Trend (Last 30 Days)
</h4>
</x-slot>
<div
class=
"chart"
>
<canvas
id=
"duplicatesTrendChart"
height=
"250"
></canvas>
</div>
</x-adminlte-card>
<!-- External Organizations & Data Consumers -->
<x-adminlte-card
title=
"Top Requesting Organizations (Last 30 Days)"
theme=
""
icon=
""
collapsible
>
<!-- External Organizations & Data Consumers -->
<x-slot
name=
"titleSlot"
>
<x-adminlte-card
title=
"Top Requesting Organizations (Last 30 Days)"
theme=
""
icon=
""
collapsible
>
<h4
class=
"card-title"
>
Top Requesting Organizations (Last 30 Days)
</h4>
<x-slot
name=
"titleSlot"
>
</x-slot>
<h4
class=
"card-title"
>
Top Requesting Organizations (Last 30 Days)
</h4>
<div
class=
"float-right"
>
</x-slot>
<button
class=
"btn btn-sm btn-outline-primary"
>
View All
</button>
<div
class=
"float-right"
>
<button
class=
"btn btn-sm btn-outline-primary"
>
View All
</button>
</div>
<div
class=
"chart"
>
<canvas
id=
"topOrganizationsChart"
height=
"300"
></canvas>
</div>
</x-adminlte-card>
<!-- API & System Usage -->
<x-adminlte-card
title=
"API Requests by Source (Last 7 Days)"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
API Requests by Source (Last 7 Days)
</h4>
</x-slot>
<div
class=
"float-right mb-3"
>
<div
class=
"btn-group"
>
<button
class=
"btn btn-sm btn-outline-secondary"
>
24h
</button>
<button
class=
"btn btn-sm btn-secondary"
>
7d
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
30d
</button>
</div>
</div>
</div>
<div>
<div
class=
"chart"
>
<div
class=
"chart"
>
<canvas
id=
"
topOrganization
sChart"
height=
"300"
></canvas>
<canvas
id=
"
apiRequest
sChart"
height=
"300"
></canvas>
</div>
</div>
</x-adminlte-card
>
<div
class=
"d-flex flex-row justify-content-between mt-2"
>
<span
class=
"mr-2"
>
<x-adminlte-card
title=
"Usage Distribution"
theme=
""
icon=
""
collapsible
>
<i
class=
"fas fa-square text-primary"
></i>
Financial
<x-slot
name=
"titleSlot"
>
</span
>
<
h4
class=
"card-title"
>
Usage Distribution
</h4
>
<
span
class=
"mr-2"
>
</x-slot>
<i
class=
"fas fa-square text-success"
></i>
Government
<div
>
</span
>
<
canvas
id=
"usagePieChart"
height=
"250"
></canvas
>
<
span
class=
"mr-2"
>
<div
class=
"mt-3 text-center"
>
<i
class=
"fas fa-square text-info"
></i>
Telecom
<span
class=
"badge bg-primary mr-2"
>
Financial: 42%
</span>
</span>
<span
class=
"badge bg-success mr-2"
>
Government: 31%
</
span>
<
span>
<
span
class=
"badge bg-info"
>
Commercial: 27%
</span>
<
i
class=
"fas fa-square text-warning"
></i>
Other
</
div
>
</
span
>
</div>
</div>
</x-adminlte-card>
</div>
</x-adminlte-card>
<!-- User Activity & Access Logs -->
<x-adminlte-card
title=
"Most Active Users (Last 7 Days)"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Most Active Users (Last 7 Days)
</h4>
</x-slot>
<div
class=
"float-right"
>
<button
class=
"btn btn-sm btn-outline-primary"
>
View All
</button>
</div>
<div
class=
"card-body"
>
<div
class=
"chart"
>
<canvas
id=
"activeUsersChart"
height=
"250"
></canvas>
</div>
<div
class=
"mt-3"
>
<table
class=
"table table-sm"
>
<tr>
<td>
1.
</td>
<td>
John Doe
</td>
<td>
Admin
</td>
<td>
142 sessions
</td>
</tr>
<tr>
<td>
2.
</td>
<td>
Jane Smith
</td>
<td>
Data Analyst
</td>
<td>
128 sessions
</td>
</tr>
<!-- More rows -->
</table>
</div>
</div>
</x-adminlte-card>
<x-adminlte-card
title=
"User Activity Heatmap"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
User Activity Heatmap
</h4>
</x-slot>
<canvas
id=
"activityHeatmap"
height=
"250"
></canvas>
<div
class=
"mt-2 text-center"
>
<span
class=
"badge bg-success mr-2"
>
Low
</span>
<span
class=
"badge bg-warning mr-2"
>
Medium
</span>
<span
class=
"badge bg-danger"
>
High
</span>
</div>
</x-adminlte-card>
<!-- API & System Usage -->
<x-adminlte-card
title=
"Sync Queue Status"
theme=
""
icon=
""
collapsible
>
<x-adminlte-card
title=
"API Requests by Source (Last 7 Days)"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Sync Queue Status
</h4>
<h4
class=
"card-title"
>
API Requests by Source (Last 7 Days)
</h4>
</x-slot>
</x-slot>
<div>
<div
class=
"float-right mb-3"
>
<div
class=
"position-relative mb-4"
>
<div
class=
"btn-group"
>
<canvas
id=
"queueStatusChart"
height=
"250"
></canvas>
<button
class=
"btn btn-sm btn-outline-secondary"
>
24h
</button>
<button
class=
"btn btn-sm btn-secondary"
>
7d
</button>
<button
class=
"btn btn-sm btn-outline-secondary"
>
30d
</button>
</div>
</div>
</div>
<div>
<div
class=
"d-flex justify-content-around text-center"
>
<div
class=
"chart"
>
<div>
<canvas
id=
"apiRequestsChart"
height=
"300"
></canvas>
<div
class=
"text-lg"
>
1,842
</div>
<div
class=
"text-muted"
>
Queued
</div>
</div>
</div>
<div
class=
"d-flex flex-row justify-content-between mt-2"
>
<div>
<span
class=
"mr-2"
>
<div
class=
"text-lg"
>
4,218
</div>
<i
class=
"fas fa-square text-primary"
></i>
Financial
<div
class=
"text-muted"
>
Processed (24h)
</div>
</span>
<span
class=
"mr-2"
>
<i
class=
"fas fa-square text-success"
></i>
Government
</span>
<span
class=
"mr-2"
>
<i
class=
"fas fa-square text-info"
></i>
Telecom
</span>
<span>
<i
class=
"fas fa-square text-warning"
></i>
Other
</span>
</div>
</div>
</div>
<div>
</x-adminlte-card>
<div
class=
"text-lg"
>
18
</div>
<div
class=
"text-muted"
>
Failed
</div>
<x-adminlte-card
title=
"Failure Reasons"
theme=
""
icon=
""
collapsible
>
<x-slot
name=
"titleSlot"
>
<h4
class=
"card-title"
>
Failure Reasons
</h4>
</x-slot>
<div
class=
"card-body"
>
<canvas
id=
"failureReasonsChart"
height=
"250"
></canvas>
<div
class=
"mt-3"
>
<table
class=
"table table-sm"
>
<tr>
<td><span
class=
"badge bg-danger"
>
Timeout
</span></td>
<td>
142
</td>
<td>
43%
</td>
</tr>
<tr>
<td><span
class=
"badge bg-warning"
>
Invalid Data
</span></td>
<td>
89
</td>
<td>
27%
</td>
</tr>
<tr>
<td><span
class=
"badge bg-secondary"
>
Auth Failed
</span></td>
<td>
62
</td>
<td>
19%
</td>
</tr>
<tr>
<td><span
class=
"badge bg-info"
>
Other
</span></td>
<td>
35
</td>
<td>
11%
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</x-adminlte-card>
</div>
</x-adminlte-card>
<div
class=
"card"
>
<x-adminlte-card
title=
"Usage Distribution"
theme=
""
icon=
""
collapsible
>
<div
class=
"m-2"
>
<x-slot
name=
"titleSlot"
>
<span
class=
"h5"
>
Data Source
</span>
<h4
class=
"card-title"
>
Usage Distribution
</h4>
</div>
</x-slot>
<div
class=
"py-4"
>
<div>
<canvas
id=
"dataSource1"
></canvas>
<canvas
id=
"usagePieChart"
height=
"250"
></canvas>
<div
class=
"mt-3 text-center"
>
<span
class=
"badge bg-primary mr-2"
>
Financial: 42%
</span>
<span
class=
"badge bg-success mr-2"
>
Government: 31%
</span>
<span
class=
"badge bg-info"
>
Commercial: 27%
</span>
</div>
</div>
</div>
</div>
</div>
</x-adminlte-card>
</div>
</div>
</div>
</div>
</main>
</main>
...
@@ -1009,6 +1371,16 @@
...
@@ -1009,6 +1371,16 @@
.table-sm
td
{
.table-sm
td
{
padding
:
0.3rem
;
padding
:
0.3rem
;
}
}
.info-box
{
cursor
:
pointer
;
transition
:
all
0.3s
ease
;
}
.info-box
:hover
{
transform
:
translateY
(
-3px
);
box-shadow
:
0
4px
8px
rgba
(
0
,
0
,
0
,
0.1
);
}
</style>
</style>
@stop
@stop
...
@@ -1016,116 +1388,6 @@
...
@@ -1016,116 +1388,6 @@
<script
src=
'/vendor/chart.js/Chart.min.js'
></script>
<script
src=
'/vendor/chart.js/Chart.min.js'
></script>
<script
src=
"https://cdn.jsdelivr.net/npm/chart.js"
></script>
<script
src=
"https://cdn.jsdelivr.net/npm/chart.js"
></script>
<script>
<script>
let
chart1
;
let
chart2
;
$
(
document
).
ready
(()
=>
{
chart1
=
document
.
getElementById
(
'dataSource1'
);
chart2
=
document
.
getElementById
(
'dataInput'
);
new
Chart
(
chart1
,
{
type
:
'doughnut'
,
data
:
{
labels
:
[
'CRD'
,
'DOI'
,
'NRB'
,
'RAD'
,
'RG'
],
datasets
:
[{
label
:
'Population Dataset'
,
data
:
[
300
,
50
,
100
,
150
,
125
],
backgroundColor
:
[
'rgb(255,99,132)'
,
'rgb(54,162,235)'
,
'rgb(255,205,86)'
,
'rgb(16,203,23)'
,
'rgb(159,8,234)'
,
],
hoverOffset
:
4
}]
}
});
new
Chart
(
chart2
,
{
type
:
'line'
,
data
:
{
labels
:
[
'Jan'
,
'Feb'
,
'Mar'
,
'Apr'
,
'May'
,
'Jun'
],
datasets
:
[
{
label
:
'CRD'
,
data
:
[
196
,
176
,
144
,
160
,
170
,
140
],
fill
:
false
,
borderColor
:
'rgb(255,99,132)'
,
backgroundColor
:
[
'rgb(255,99,132)'
,
'rgb(54,162,235)'
,
'rgb(255,205,86)'
,
'rgb(86,255,179)'
,
'rgb(192,31,68)'
,
'rgb(16,218,188)'
,
],
hoverOffset
:
4
},
{
label
:
'DOI'
,
data
:
[
132
,
178
,
114
,
189
,
151
,
123
],
fill
:
false
,
borderColor
:
'rgb(54,162,235)'
,
backgroundColor
:
[
'rgb(255,99,132)'
,
'rgb(54,162,235)'
,
'rgb(255,205,86)'
,
'rgb(86,255,179)'
,
'rgb(192,31,68)'
,
'rgb(16,218,188)'
,
],
hoverOffset
:
4
},
{
label
:
'NRB'
,
data
:
[
108
,
192
,
147
,
173
,
102
,
111
],
fill
:
false
,
borderColor
:
'rgb(255,205,86)'
,
backgroundColor
:
[
'rgb(255,99,132)'
,
'rgb(54,162,235)'
,
'rgb(255,205,86)'
,
'rgb(86,255,179)'
,
'rgb(192,31,68)'
,
'rgb(16,218,188)'
,
],
hoverOffset
:
4
},
{
label
:
'RAD'
,
data
:
[
115
,
164
,
123
,
200
,
85
,
191
],
fill
:
false
,
borderColor
:
'rgb(225,12,221)'
,
backgroundColor
:
[
'rgb(255,99,132)'
,
'rgb(54,162,235)'
,
'rgb(255,205,86)'
,
'rgb(86,255,179)'
,
'rgb(192,31,68)'
,
'rgb(16,218,188)'
,
],
hoverOffset
:
4
},
{
label
:
'RG'
,
data
:
[
98
,
156
,
110
,
175
,
84
,
200
],
fill
:
false
,
borderColor
:
'rgb(86,236,11)'
,
backgroundColor
:
[
'rgb(255,99,132)'
,
'rgb(54,162,235)'
,
'rgb(255,205,86)'
,
'rgb(86,255,179)'
,
'rgb(192,31,68)'
,
'rgb(16,218,188)'
,
],
hoverOffset
:
4
},
]
}
});
});
// API Volume Chart (would use real data)
// API Volume Chart (would use real data)
new
Chart
(
document
.
getElementById
(
'apiVolumeChart'
),
{
new
Chart
(
document
.
getElementById
(
'apiVolumeChart'
),
{
...
@@ -1517,6 +1779,269 @@
...
@@ -1517,6 +1779,269 @@
}
}
}
}
});
});
// Active Users Chart
new
Chart
(
document
.
getElementById
(
'activeUsersChart'
),
{
type
:
'bar'
,
data
:
{
labels
:
[
'John Doe'
,
'Jane Smith'
,
'Mike Johnson'
,
'Sarah Williams'
,
'David Brown'
],
datasets
:
[{
label
:
'Active Sessions'
,
data
:
[
142
,
128
,
98
,
87
,
76
],
backgroundColor
:
'rgba(58, 115, 240, 0.7)'
,
borderColor
:
'rgba(58, 115, 240, 1)'
,
borderWidth
:
1
}]
},
options
:
{
responsive
:
true
,
scales
:
{
y
:
{
beginAtZero
:
true
}
}
}
});
// Activity Heatmap
// Register the matrix controller
new
Chart
(
document
.
getElementById
(
'activityHeatmap'
),
{
type
:
'bar'
,
data
:
{
labels
:
[
'Mon'
,
'Tue'
,
'Wed'
,
'Thu'
,
'Fri'
,
'Sat'
,
'Sun'
],
datasets
:
[
{
label
:
'08:00'
,
data
:
[
20
,
15
,
18
,
22
,
17
,
5
,
3
],
backgroundColor
:
'#28a745'
// Green
},
{
label
:
'10:00'
,
data
:
[
35
,
40
,
32
,
38
,
42
,
12
,
8
],
backgroundColor
:
'#ffc107'
// Yellow
},
{
label
:
'12:00'
,
data
:
[
45
,
50
,
48
,
52
,
55
,
25
,
15
],
backgroundColor
:
'#fd7e14'
// Orange
},
{
label
:
'14:00'
,
data
:
[
30
,
35
,
32
,
38
,
40
,
18
,
10
],
backgroundColor
:
'#ffc107'
// Yellow
},
{
label
:
'16:00'
,
data
:
[
32
,
38
,
35
,
40
,
42
,
20
,
12
],
backgroundColor
:
'#fd7e14'
// Orange
},
{
label
:
'18:00'
,
data
:
[
15
,
20
,
18
,
22
,
25
,
10
,
5
],
backgroundColor
:
'#28a745'
// Green
}
]
},
options
:
{
responsive
:
true
,
scales
:
{
x
:
{
stacked
:
true
,
grid
:
{
display
:
false
}
},
y
:
{
stacked
:
true
,
grid
:
{
display
:
false
}
}
},
plugins
:
{
legend
:
{
position
:
'bottom'
,
labels
:
{
boxWidth
:
12
}
},
tooltip
:
{
callbacks
:
{
label
:
function
(
context
)
{
return
context
.
dataset
.
label
+
': '
+
context
.
raw
+
' sessions'
;
}
}
}
}
}
});
// Duplicates Trend Chart
new
Chart
(
document
.
getElementById
(
'duplicatesTrendChart'
),
{
type
:
'line'
,
data
:
{
labels
:
Array
.
from
({
length
:
30
},
(
_
,
i
)
=>
i
+
1
+
' Nov'
),
datasets
:
[
{
label
:
'NRB'
,
data
:
[
45
,
42
,
48
,
50
,
52
,
55
,
53
,
50
,
48
,
45
,
42
,
40
,
38
,
35
,
32
,
30
,
28
,
25
,
22
,
20
,
18
,
15
,
12
,
10
,
8
,
5
,
3
,
2
,
1
,
0
],
borderColor
:
'#0d6efd'
,
backgroundColor
:
'rgba(13, 110, 253, 0.1)'
,
tension
:
0.3
},
{
label
:
'CRS'
,
data
:
[
30
,
28
,
32
,
35
,
38
,
40
,
42
,
45
,
48
,
50
,
52
,
55
,
53
,
50
,
48
,
45
,
42
,
40
,
38
,
35
,
32
,
30
,
28
,
25
,
22
,
20
,
18
,
15
,
12
,
10
],
borderColor
:
'#20c997'
,
backgroundColor
:
'rgba(32, 201, 151, 0.1)'
,
tension
:
0.3
},
{
label
:
'DOI'
,
data
:
[
20
,
18
,
22
,
25
,
28
,
30
,
32
,
35
,
38
,
40
,
42
,
45
,
48
,
50
,
52
,
55
,
53
,
50
,
48
,
45
,
42
,
40
,
38
,
35
,
32
,
30
,
28
,
25
,
22
,
20
],
borderColor
:
'#6f42c1'
,
backgroundColor
:
'rgba(111, 66, 193, 0.1)'
,
tension
:
0.3
}
]
},
options
:
{
responsive
:
true
,
interaction
:
{
mode
:
'index'
,
intersect
:
false
,
},
scales
:
{
y
:
{
beginAtZero
:
true
,
title
:
{
display
:
true
,
text
:
'Duplicate Records'
}
}
}
}
});
// Query Performance Chart
new
Chart
(
document
.
getElementById
(
'queryPerformanceChart'
),
{
type
:
'bar'
,
data
:
{
labels
:
[
'User Auth'
,
'Data Search'
,
'Reports'
,
'API Calls'
,
'Admin'
],
datasets
:
[{
label
:
'Query Time (ms)'
,
data
:
[
142
,
210
,
320
,
185
,
95
],
backgroundColor
:
[
'rgba(75, 192, 192, 0.7)'
,
'rgba(255, 159, 64, 0.7)'
,
'rgba(255, 99, 132, 0.7)'
,
'rgba(54, 162, 235, 0.7)'
,
'rgba(153, 102, 255, 0.7)'
],
borderWidth
:
1
}]
},
options
:
{
responsive
:
true
,
maintainAspectRatio
:
false
,
scales
:
{
y
:
{
beginAtZero
:
true
,
title
:
{
display
:
true
,
text
:
'Milliseconds'
}
}
}
}
});
// Storage Utilization
new
Chart
(
document
.
getElementById
(
'storageChart'
),
{
type
:
'doughnut'
,
data
:
{
labels
:
[
'Used'
,
'Free'
],
datasets
:
[{
data
:
[
48
,
52
],
backgroundColor
:
[
'#20c997'
,
'#f8f9fa'
],
borderWidth
:
1
}]
},
options
:
{
responsive
:
true
,
maintainAspectRatio
:
false
,
cutout
:
'70%'
}
});
// Storage Trend
new
Chart
(
document
.
getElementById
(
'storageTrendChart'
),
{
type
:
'line'
,
data
:
{
labels
:
[
'Jan'
,
'Feb'
,
'Mar'
,
'Apr'
,
'May'
,
'Jun'
],
datasets
:
[{
label
:
'Storage Used (TB)'
,
data
:
[
1.2
,
1.4
,
1.6
,
1.8
,
2.0
,
2.2
],
borderColor
:
'#20c997'
,
backgroundColor
:
'rgba(32, 201, 151, 0.1)'
,
fill
:
true
,
tension
:
0.3
}]
},
options
:
{
responsive
:
true
,
maintainAspectRatio
:
false
,
scales
:
{
y
:
{
beginAtZero
:
true
}
}
}
});
// Network Traffic
new
Chart
(
document
.
getElementById
(
'networkTrafficChart'
),
{
type
:
'line'
,
data
:
{
labels
:
Array
.
from
({
length
:
24
},
(
_
,
i
)
=>
i
+
':00'
),
datasets
:
[
{
label
:
'Internal'
,
data
:
[
10
,
12
,
15
,
18
,
20
,
25
,
30
,
35
,
40
,
45
,
50
,
55
,
60
,
55
,
50
,
45
,
40
,
35
,
30
,
25
,
20
,
15
,
10
,
8
],
borderColor
:
'#0d6efd'
,
backgroundColor
:
'rgba(13, 110, 253, 0.1)'
,
tension
:
0.3
,
fill
:
true
},
{
label
:
'External'
,
data
:
[
20
,
25
,
30
,
35
,
40
,
50
,
60
,
70
,
80
,
90
,
100
,
110
,
120
,
110
,
100
,
90
,
80
,
70
,
60
,
50
,
40
,
30
,
20
,
15
],
borderColor
:
'#dc3545'
,
backgroundColor
:
'rgba(220, 53, 69, 0.1)'
,
tension
:
0.3
,
fill
:
true
}
]
},
options
:
{
responsive
:
true
,
maintainAspectRatio
:
false
,
interaction
:
{
mode
:
'index'
,
intersect
:
false
},
scales
:
{
y
:
{
beginAtZero
:
true
,
title
:
{
display
:
true
,
text
:
'Traffic (GB)'
}
}
}
}
});
</script>
</script>
@stop
@stop
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment