64 lines
3.1 KiB
JavaScript
Executable File
64 lines
3.1 KiB
JavaScript
Executable File
import React, { useState } from 'react';
|
||
|
||
const s = {
|
||
wrapper: { marginTop: '24px' },
|
||
title: { color: '#b5b5c0', fontSize: '16px', fontWeight: 700, marginBottom: '10px' },
|
||
table: { width: '100%', borderCollapse: 'collapse', fontSize: '13px', background: '#111217', borderRadius: '6px', overflow: 'hidden', border: '1px solid #222' },
|
||
th: { background: '#000000', color: '#f8f9fa', padding: '8px 10px', textAlign: 'left', fontSize: '12px', fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.5px' },
|
||
td: { padding: '8px 10px', borderBottom: '1px solid #1c1d29', color: '#f8f9fa', verticalAlign: 'middle' },
|
||
trEven: { background: '#111217' },
|
||
trOdd: { background: '#151622' },
|
||
pts: { fontWeight: 700, color: '#667eea' },
|
||
toggle: { background: 'none', border: 'none', color: '#667eea', cursor: 'pointer', fontSize: '13px', padding: 0, textDecoration: 'underline' },
|
||
empty: { color: '#77798a', fontStyle: 'italic', fontSize: '13px', marginTop: '8px' },
|
||
};
|
||
|
||
function formatDate(d) {
|
||
if (!d) return '–';
|
||
const dt = new Date(d + 'T12:00:00');
|
||
return dt.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'America/Chicago' });
|
||
}
|
||
|
||
export default function ViolationHistory({ history, loading }) {
|
||
const [expanded, setExpanded] = useState(false);
|
||
const visible = expanded ? history : history.slice(0, 5);
|
||
|
||
if (loading) return <p style={s.empty}>Loading history...</p>;
|
||
if (!history.length) return <p style={s.empty}>No violations on record for this employee.</p>;
|
||
|
||
return (
|
||
<div style={s.wrapper}>
|
||
<div style={s.title}>Recent Violations ({history.length} total)</div>
|
||
<table style={s.table}>
|
||
<thead>
|
||
<tr>
|
||
<th style={s.th}>Date</th>
|
||
<th style={s.th}>Violation</th>
|
||
<th style={s.th}>Category</th>
|
||
<th style={s.th}>Points</th>
|
||
<th style={s.th}>Details</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{visible.map((v, i) => (
|
||
<tr key={v.id} style={i % 2 === 0 ? s.trEven : s.trOdd}>
|
||
<td style={s.td}>{formatDate(v.incident_date)}</td>
|
||
<td style={s.td}>{v.violation_name}</td>
|
||
<td style={{ ...s.td, color: '#c0c2d6' }}>{v.category}</td>
|
||
<td style={{ ...s.td, ...s.pts }}>{v.points}</td>
|
||
<td style={{ ...s.td, color: '#c0c2d6' }}>{v.details || '–'}</td>
|
||
</tr>
|
||
))}
|
||
</tbody>
|
||
</table>
|
||
{history.length > 5 && (
|
||
<div style={{ marginTop: '8px' }}>
|
||
<button style={s.toggle} onClick={() => setExpanded(e => !e)}>
|
||
{expanded ? '▲ Show less' : `▼ Show all ${history.length} violations`}
|
||
</button>
|
||
</div>
|
||
)}
|
||
</div>
|
||
);
|
||
}
|