- CodeIgniter 4 framework setup with SQL Server database config - Models: Control, Test, Dept, Result, Daily/ Monthly entry models - Controllers: Dashboard, Control, Test, Dept, Entry, Report, API endpoints - Views: CRUD pages with modal dialogs, dashboard, reports - Database: Migrations for control test and daily/monthly result tables - Legacy v1 PHP application preserved in /v1 directory - Documentation: AGENTS.md, VIEWS_RULES.md for development guidelines
143 lines
8.7 KiB
PHP
143 lines
8.7 KiB
PHP
<?= $this->extend("layout/main_layout"); ?>
|
|
<?= $this->section("content") ?>
|
|
<main x-data="dashboard()">
|
|
<div class="space-y-8">
|
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
|
<div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-100 hover:shadow-md transition-shadow duration-200 group">
|
|
<div class="flex items-center justify-between">
|
|
<div>
|
|
<p class="text-sm font-medium text-slate-500 mb-1">Total Tests</p>
|
|
<h3 class="text-3xl font-bold text-slate-800 group-hover:text-primary-600 transition-colors"><?= count($tests) ?></h3>
|
|
</div>
|
|
<div class="h-12 w-12 rounded-xl bg-blue-50 text-blue-600 flex items-center justify-center group-hover:scale-110 transition-transform duration-200">
|
|
<i class="fa-solid fa-file-medical text-2xl"></i>
|
|
</div>
|
|
</div>
|
|
<div class="mt-4 flex items-center text-sm text-slate-500">
|
|
<span class="text-green-600 font-medium flex items-center mr-2">
|
|
<i class="fa-solid fa-check-circle mr-1"></i>
|
|
Active
|
|
</span>
|
|
<span>in library</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-100 hover:shadow-md transition-shadow duration-200 group">
|
|
<div class="flex items-center justify-between">
|
|
<div>
|
|
<p class="text-sm font-medium text-slate-500 mb-1">Total Controls</p>
|
|
<h3 class="text-3xl font-bold text-slate-800 group-hover:text-primary-600 transition-colors"><?= count($controls) ?></h3>
|
|
</div>
|
|
<div class="h-12 w-12 rounded-xl bg-emerald-50 text-emerald-600 flex items-center justify-center group-hover:scale-110 transition-transform duration-200">
|
|
<i class="fa-solid fa-vial text-2xl"></i>
|
|
</div>
|
|
</div>
|
|
<div class="mt-4 flex items-center text-sm text-slate-500">
|
|
<span class="text-slate-600 font-medium flex items-center mr-2">Reference</span>
|
|
<span>definitions</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-100 hover:shadow-md transition-shadow duration-200 group">
|
|
<div class="flex items-center justify-between">
|
|
<div>
|
|
<p class="text-sm font-medium text-slate-500 mb-1">Departments</p>
|
|
<h3 class="text-3xl font-bold text-slate-800 group-hover:text-primary-600 transition-colors"><?= count($depts) ?></h3>
|
|
</div>
|
|
<div class="h-12 w-12 rounded-xl bg-violet-50 text-violet-600 flex items-center justify-center group-hover:scale-110 transition-transform duration-200">
|
|
<i class="fa-solid fa-building text-2xl"></i>
|
|
</div>
|
|
</div>
|
|
<div class="mt-4 flex items-center text-sm text-slate-500">
|
|
<span class="text-slate-600 font-medium flex items-center mr-2">Active</span>
|
|
<span>units</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="bg-white rounded-2xl shadow-sm border border-slate-100 overflow-hidden">
|
|
<div class="px-6 py-5 border-b border-slate-100 bg-white">
|
|
<h3 class="text-lg font-bold text-slate-800">Menu</h3>
|
|
<p class="text-sm text-slate-500">Quick access to all features</p>
|
|
</div>
|
|
<div class="p-6">
|
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
<a href="<?= base_url('/test') ?>" class="flex items-start p-4 rounded-xl border border-slate-200 hover:border-primary-300 hover:bg-primary-50/50 transition-all duration-200 group">
|
|
<div class="h-10 w-10 rounded-lg bg-blue-100 text-blue-600 flex items-center justify-center mr-4 group-hover:scale-110 transition-transform">
|
|
<i class="fa-solid fa-vial"></i>
|
|
</div>
|
|
<div>
|
|
<h4 class="font-semibold text-slate-800 group-hover:text-primary-600">Test Definitions</h4>
|
|
<p class="text-sm text-slate-500 mt-1">Manage test types, methods, and units</p>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="<?= base_url('/control') ?>" class="flex items-start p-4 rounded-xl border border-slate-200 hover:border-primary-300 hover:bg-primary-50/50 transition-all duration-200 group">
|
|
<div class="h-10 w-10 rounded-lg bg-emerald-100 text-emerald-600 flex items-center justify-center mr-4 group-hover:scale-110 transition-transform">
|
|
<i class="fa-solid fa-sliders"></i>
|
|
</div>
|
|
<div>
|
|
<h4 class="font-semibold text-slate-800 group-hover:text-primary-600">Control Dictionary</h4>
|
|
<p class="text-sm text-slate-500 mt-1">Manage control materials and lot numbers</p>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="<?= base_url('/dept') ?>" class="flex items-start p-4 rounded-xl border border-slate-200 hover:border-primary-300 hover:bg-primary-50/50 transition-all duration-200 group">
|
|
<div class="h-10 w-10 rounded-lg bg-violet-100 text-violet-600 flex items-center justify-center mr-4 group-hover:scale-110 transition-transform">
|
|
<i class="fa-solid fa-building"></i>
|
|
</div>
|
|
<div>
|
|
<h4 class="font-semibold text-slate-800 group-hover:text-primary-600">Department Dictionary</h4>
|
|
<p class="text-sm text-slate-500 mt-1">Manage departments and units</p>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="<?= base_url('/entry') ?>" class="flex items-start p-4 rounded-xl border border-slate-200 hover:border-primary-300 hover:bg-primary-50/50 transition-all duration-200 group">
|
|
<div class="h-10 w-10 rounded-lg bg-amber-100 text-amber-600 flex items-center justify-center mr-4 group-hover:scale-110 transition-transform">
|
|
<i class="fa-solid fa-calendar-check"></i>
|
|
</div>
|
|
<div>
|
|
<h4 class="font-semibold text-slate-800 group-hover:text-primary-600">Monthly Entry</h4>
|
|
<p class="text-sm text-slate-500 mt-1">Enter monthly QC results</p>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="<?= base_url('/entry/daily') ?>" class="flex items-start p-4 rounded-xl border border-slate-200 hover:border-primary-300 hover:bg-primary-50/50 transition-all duration-200 group">
|
|
<div class="h-10 w-10 rounded-lg bg-rose-100 text-rose-600 flex items-center justify-center mr-4 group-hover:scale-110 transition-transform">
|
|
<i class="fa-solid fa-calendar-day"></i>
|
|
</div>
|
|
<div>
|
|
<h4 class="font-semibold text-slate-800 group-hover:text-primary-600">Daily Entry</h4>
|
|
<p class="text-sm text-slate-500 mt-1">Enter daily QC results</p>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="<?= base_url('/report') ?>" class="flex items-start p-4 rounded-xl border border-slate-200 hover:border-primary-300 hover:bg-primary-50/50 transition-all duration-200 group">
|
|
<div class="h-10 w-10 rounded-lg bg-indigo-100 text-indigo-600 flex items-center justify-center mr-4 group-hover:scale-110 transition-transform">
|
|
<i class="fa-solid fa-chart-column"></i>
|
|
</div>
|
|
<div>
|
|
<h4 class="font-semibold text-slate-800 group-hover:text-primary-600">Reports</h4>
|
|
<p class="text-sm text-slate-500 mt-1">View and generate QC reports</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
<?= $this->endSection(); ?>
|
|
|
|
<?= $this->section("script") ?>
|
|
<script>
|
|
document.addEventListener('alpine:init', () => {
|
|
Alpine.data("dashboard", () => ({
|
|
init() {
|
|
// Dashboard init
|
|
}
|
|
}));
|
|
});
|
|
</script>
|
|
<?= $this->endSection(); ?>
|
|
|