This commit adds comprehensive audit logging for specimen requests and sample collection activities across all roles. Changes Summary: New Features: - Added AUDIT_EVENTS table schema for tracking validation and sample collection events - Created ApiRequestsAuditController with /api/requests/(:any)/audit endpoint to retrieve audit history - Added dialog_audit.php view component for displaying audit trails in UI - Integrated audit logging into validation workflow (VAL1, VAL2, UNVAL events) Database: - Created AUDIT_EVENTS table with columns: ACCESSNUMBER, EVENT_TYPE, USERID, EVENT_AT, REASON - Supports tracking validation events and sample collection actions Controllers: - RequestsController: Now inserts audit records for all validation operations - ApiRequestsAuditController: New API controller returning validation and sample collection history Routes: - Added GET /api/requests/(:any)/audit endpoint for retrieving audit trail - Removed DELETE /api/samples/collect/(:any) endpoint (uncollect functionality) Views Refactoring: - Consolidated dashboard layouts into shared components: - layout.php (from layout_dashboard.php) - script_requests.php (from script_dashboard.php) - script_validation.php (from script_validate.php) - content_requests.php (from dashboard_table.php) - content_validation.php (from dashboard_validate.php) - Added content_validation_new.php for enhanced validation interface
149 lines
3.8 KiB
PHP
149 lines
3.8 KiB
PHP
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Loading... Or Not</title>
|
|
<style>
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
body {
|
|
min-height: 100vh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
color: white;
|
|
text-align: center;
|
|
padding: 20px;
|
|
}
|
|
|
|
.container {
|
|
max-width: 600px;
|
|
}
|
|
|
|
h1 {
|
|
font-size: 3rem;
|
|
margin-bottom: 1rem;
|
|
animation: bounce 2s infinite;
|
|
}
|
|
|
|
@keyframes bounce {
|
|
|
|
0%,
|
|
100% {
|
|
transform: translateY(0);
|
|
}
|
|
|
|
50% {
|
|
transform: translateY(-20px);
|
|
}
|
|
}
|
|
|
|
.message {
|
|
font-size: 1.5rem;
|
|
margin-bottom: 2rem;
|
|
opacity: 0.9;
|
|
}
|
|
|
|
.loader {
|
|
width: 80px;
|
|
height: 80px;
|
|
border: 8px solid rgba(255, 255, 255, 0.3);
|
|
border-top-color: white;
|
|
border-radius: 50%;
|
|
animation: spin 1s linear infinite;
|
|
margin: 0 auto 2rem;
|
|
}
|
|
|
|
@keyframes spin {
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
|
|
.cat {
|
|
font-size: 5rem;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.fact {
|
|
background: rgba(255, 255, 255, 0.2);
|
|
padding: 1.5rem;
|
|
border-radius: 15px;
|
|
margin-top: 2rem;
|
|
}
|
|
|
|
.fact h3 {
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.buttons {
|
|
margin-top: 2rem;
|
|
}
|
|
|
|
.btn {
|
|
display: inline-block;
|
|
padding: 12px 30px;
|
|
margin: 10px;
|
|
background: white;
|
|
color: #667eea;
|
|
text-decoration: none;
|
|
border-radius: 25px;
|
|
font-weight: bold;
|
|
transition: transform 0.2s, box-shadow 0.2s;
|
|
}
|
|
|
|
.btn:hover {
|
|
transform: scale(1.05);
|
|
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
|
|
}
|
|
|
|
.shrug {
|
|
font-size: 2rem;
|
|
margin: 1rem 0;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<div class="container">
|
|
<div class="cat">👀</div>
|
|
<h1>Nothing to See Here!</h1>
|
|
<div class="loader"></div>
|
|
<p class="message">The specimens are probably having a tea party somewhere...</p>
|
|
|
|
<div class="fact">
|
|
<h3>💬 Did You Know?</h3>
|
|
<p id="fact">Loading random science fact...</p>
|
|
</div>
|
|
|
|
<div class="shrug">🙹 🧀 🦽</div>
|
|
</div>
|
|
|
|
<script>
|
|
const facts = [
|
|
"A group of flamingos is called a 'flamboyance'.",
|
|
"Octopuses have three hearts and blue blood.",
|
|
"Bananas are berries, but strawberries aren't.",
|
|
"Honey never spoils. Archaeologists found 3000-year-old honey still edible.",
|
|
"Wombat poop is cube-shaped to mark territory.",
|
|
"A day on Venus is longer than its year.",
|
|
"Scotland has 421 words for 'snow'.",
|
|
"Sloths can hold their breath longer than dolphins can (up to 40 minutes).",
|
|
"The shortest war in history lasted 38-45 minutes (Britain vs Zanzibar, 1896).",
|
|
"Electrons are actually just rumors spread by atoms."
|
|
];
|
|
|
|
document.getElementById('fact').textContent = facts[Math.floor(Math.random() * facts.length)];
|
|
</script>
|
|
</body>
|
|
|
|
</html> |