|
|
<!DOCTYPE html> |
|
|
<html lang="en" class="h-full bg-gray-50"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>Nexus Vision | Data Ingestion Dashboard</title> |
|
|
<link rel="icon" type="image/x-icon" href="/static/favicon.ico"> |
|
|
<script src="https://cdn.tailwindcss.com"></script> |
|
|
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> |
|
|
<script> |
|
|
tailwind.config = { |
|
|
theme: { |
|
|
extend: { |
|
|
colors: { |
|
|
primary: { |
|
|
500: '#6366f1', |
|
|
600: '#4f46e5', |
|
|
}, |
|
|
secondary: { |
|
|
500: '#ec4899', |
|
|
600: '#db2777', |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
</script> |
|
|
<style> |
|
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); |
|
|
body { |
|
|
font-family: 'Inter', sans-serif; |
|
|
} |
|
|
.vanta-bg { |
|
|
position: absolute; |
|
|
top: 0; |
|
|
left: 0; |
|
|
width: 100%; |
|
|
height: 350px; |
|
|
z-index: 0; |
|
|
} |
|
|
.dashboard-grid { |
|
|
display: grid; |
|
|
grid-template-columns: 240px 1fr; |
|
|
grid-template-rows: 60px 1fr; |
|
|
min-height: 100vh; |
|
|
} |
|
|
@media (max-width: 768px) { |
|
|
.dashboard-grid { |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body class="h-full"> |
|
|
|
|
|
<div id="vanta-bg" class="vanta-bg"></div> |
|
|
|
|
|
<div class="dashboard-grid"> |
|
|
|
|
|
<aside class="bg-white shadow-lg z-10"> |
|
|
<div class="p-4 border-b border-gray-200"> |
|
|
<div class="flex items-center space-x-2"> |
|
|
<div class="w-8 h-8 rounded-full bg-primary-500 flex items-center justify-center"> |
|
|
<i data-feather="database" class="text-white w-4 h-4"></i> |
|
|
</div> |
|
|
<span class="font-semibold text-gray-800">Nexus Vision</span> |
|
|
</div> |
|
|
</div> |
|
|
<nav class="p-4"> |
|
|
<ul class="space-y-2"> |
|
|
<li> |
|
|
<a href="#" class="flex items-center space-x-3 p-2 rounded-lg bg-primary-50 text-primary-600"> |
|
|
<i data-feather="home" class="w-5 h-5"></i> |
|
|
<span>Dashboard</span> |
|
|
</a> |
|
|
</li> |
|
|
<li> |
|
|
<a href="#" class="flex items-center space-x-3 p-2 rounded-lg text-gray-600 hover:bg-gray-100"> |
|
|
<i data-feather="upload" class="w-5 h-5"></i> |
|
|
<span>Data Ingestion</span> |
|
|
</a> |
|
|
</li> |
|
|
<li> |
|
|
<a href="#" class="flex items-center space-x-3 p-2 rounded-lg text-gray-600 hover:bg-gray-100"> |
|
|
<i data-feather="list" class="w-5 h-5"></i> |
|
|
<span>Audit Log</span> |
|
|
</a> |
|
|
</li> |
|
|
<li> |
|
|
<a href="#" class="flex items-center space-x-3 p-2 rounded-lg text-gray-600 hover:bg-gray-100"> |
|
|
<i data-feather="activity" class="w-5 h-5"></i> |
|
|
<span>System Health</span> |
|
|
</a> |
|
|
</li> |
|
|
</ul> |
|
|
</nav> |
|
|
</aside> |
|
|
|
|
|
|
|
|
<main class="z-10"> |
|
|
|
|
|
<header class="bg-white border-b border-gray-200 px-6 py-4 flex items-center justify-between"> |
|
|
<h1 class="text-xl font-semibold text-gray-800">Dashboard Overview</h1> |
|
|
<div class="flex items-center space-x-4"> |
|
|
<div class="relative"> |
|
|
<i data-feather="search" class="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400"></i> |
|
|
<input type="text" placeholder="Search..." class="pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-primary-500 outline-none"> |
|
|
</div> |
|
|
<button class="p-2 rounded-full bg-gray-100 hover:bg-gray-200"> |
|
|
<i data-feather="bell" class="w-5 h-5 text-gray-600"></i> |
|
|
</button> |
|
|
<div class="flex items-center space-x-2"> |
|
|
<div class="w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center"> |
|
|
<i data-feather="user" class="w-4 h-4 text-gray-600"></i> |
|
|
</div> |
|
|
<span class="text-sm font-medium text-gray-700">Admin</span> |
|
|
</div> |
|
|
</div> |
|
|
</header> |
|
|
|
|
|
|
|
|
<div class="p-6 space-y-6"> |
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-6"> |
|
|
<div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100"> |
|
|
<div class="flex items-center justify-between"> |
|
|
<div> |
|
|
<p class="text-sm font-medium text-gray-500">Total Ingestion Runs</p> |
|
|
<h3 class="text-2xl font-semibold text-gray-800 mt-1">24</h3> |
|
|
</div> |
|
|
<div class="p-3 rounded-lg bg-primary-50"> |
|
|
<i data-feather="database" class="w-6 h-6 text-primary-600"></i> |
|
|
</div> |
|
|
</div> |
|
|
<div class="mt-4 flex items-center text-sm text-gray-500"> |
|
|
<i data-feather="trending-up" class="w-4 h-4 text-green-500"></i> |
|
|
<span class="ml-1">12% from last month</span> |
|
|
</div> |
|
|
</div> |
|
|
<div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100"> |
|
|
<div class="flex items-center justify-between"> |
|
|
<div> |
|
|
<p class="text-sm font-medium text-gray-500">Successful Runs</p> |
|
|
<h3 class="text-2xl font-semibold text-gray-800 mt-1">22</h3> |
|
|
</div> |
|
|
<div class="p-3 rounded-lg bg-green-50"> |
|
|
<i data-feather="check-circle" class="w-6 h-6 text-green-600"></i> |
|
|
</div> |
|
|
</div> |
|
|
<div class="mt-4 flex items-center text-sm text-gray-500"> |
|
|
<i data-feather="trending-up" class="w-4 h-4 text-green-500"></i> |
|
|
<span class="ml-1">8% from last month</span> |
|
|
</div> |
|
|
</div> |
|
|
<div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100"> |
|
|
<div class="flex items-center justify-between"> |
|
|
<div> |
|
|
<p class="text-sm font-medium text-gray-500">System Health</p> |
|
|
<h3 class="text-2xl font-semibold text-gray-800 mt-1">Operational</h3> |
|
|
</div> |
|
|
<div class="p-3 rounded-lg bg-green-50"> |
|
|
<i data-feather="activity" class="w-6 h-6 text-green-600"></i> |
|
|
</div> |
|
|
</div> |
|
|
<div class="mt-4 flex items-center text-sm text-gray-500"> |
|
|
<div class="w-2 h-2 rounded-full bg-green-500 mr-2"></div> |
|
|
<span>All systems normal</span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100"> |
|
|
<div class="flex items-center justify-between mb-6"> |
|
|
<h2 class="text-lg font-semibold text-gray-800">CSV Data Ingestion</h2> |
|
|
<button class="px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 flex items-center space-x-2"> |
|
|
<i data-feather="upload" class="w-4 h-4"></i> |
|
|
<span>Upload CSV</span> |
|
|
</button> |
|
|
</div> |
|
|
|
|
|
<div class="border-2 border-dashed border-gray-300 rounded-lg p-8 text-center"> |
|
|
<div class="mx-auto w-12 h-12 bg-gray-100 rounded-full flex items-center justify-center mb-4"> |
|
|
<i data-feather="file" class="w-5 h-5 text-gray-500"></i> |
|
|
</div> |
|
|
<p class="text-gray-500 mb-2">Drag and drop your CSV file here</p> |
|
|
<p class="text-sm text-gray-400 mb-4">or</p> |
|
|
<label for="file-upload" class="cursor-pointer px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50"> |
|
|
Browse Files |
|
|
</label> |
|
|
<input id="file-upload" type="file" class="hidden" accept=".csv"> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100"> |
|
|
<div class="flex items-center justify-between mb-6"> |
|
|
<h2 class="text-lg font-semibold text-gray-800">Recent Activity</h2> |
|
|
<button class="text-sm text-primary-600 hover:text-primary-700">View All</button> |
|
|
</div> |
|
|
|
|
|
<div class="overflow-x-auto"> |
|
|
<table class="min-w-full divide-y divide-gray-200"> |
|
|
<thead class="bg-gray-50"> |
|
|
<tr> |
|
|
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date</th> |
|
|
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Event Type</th> |
|
|
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Entity</th> |
|
|
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Description</th> |
|
|
</tr> |
|
|
</thead> |
|
|
<tbody class="bg-white divide-y divide-gray-200"> |
|
|
<tr class="hover:bg-gray-50"> |
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-06-15 14:32</td> |
|
|
<td class="px-6 py-4 whitespace-nowrap"> |
|
|
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">Success</span> |
|
|
</td> |
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">workforce_data.csv</td> |
|
|
<td class="px-6 py-4 text-sm text-gray-500">CSV file successfully ingested (243 records)</td> |
|
|
</tr> |
|
|
<tr class="hover:bg-gray-50"> |
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-06-15 11:45</td> |
|
|
<td class="px-6 py-4 whitespace-nowrap"> |
|
|
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">Success</span> |
|
|
</td> |
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">employee_stats.csv</td> |
|
|
<td class="px-6 py-4 text-sm text-gray-500">CSV file successfully ingested (187 records)</td> |
|
|
</tr> |
|
|
<tr class="hover:bg-gray-50"> |
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-06-14 16:20</td> |
|
|
<td class="px-6 py-4 whitespace-nowrap"> |
|
|
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">Error</span> |
|
|
</td> |
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">payroll_data.csv</td> |
|
|
<td class="px-6 py-4 text-sm text-gray-500">Validation error: Missing required column "employee_id"</td> |
|
|
</tr> |
|
|
<tr class="hover:bg-gray-50"> |
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-06-14 09:12</td> |
|
|
<td class="px-6 py-4 whitespace-nowrap"> |
|
|
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">Success</span> |
|
|
</td> |
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">department_budget.csv</td> |
|
|
<td class="px-6 py-4 text-sm text-gray-500">CSV file successfully ingested (56 records)</td> |
|
|
</tr> |
|
|
</tbody> |
|
|
</table> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</main> |
|
|
</div> |
|
|
|
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script> |
|
|
<script> |
|
|
VANTA.GLOBE({ |
|
|
el: "#vanta-bg", |
|
|
mouseControls: true, |
|
|
touchControls: true, |
|
|
gyroControls: false, |
|
|
minHeight: 200.00, |
|
|
minWidth: 200.00, |
|
|
scale: 1.00, |
|
|
scaleMobile: 1.00, |
|
|
color: 0x6366f1, |
|
|
backgroundColor: 0xf8fafc, |
|
|
size: 1.00 |
|
|
}); |
|
|
</script> |
|
|
<script> |
|
|
feather.replace(); |
|
|
</script> |
|
|
</body> |
|
|
</html> |
|
|
|