From f006c015b064501f26cdd78fc1b5ed32333837d2 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 6 Mar 2026 14:14:11 -0600 Subject: [PATCH 01/86] Add client/public --- client/public | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 client/public diff --git a/client/public b/client/public new file mode 100644 index 0000000..e69de29 -- 2.52.0 From 6305cedb14b1e164dcfda0aced54c693c9c7dfa4 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 6 Mar 2026 14:14:27 -0600 Subject: [PATCH 02/86] Delete client/public --- client/public | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 client/public diff --git a/client/public b/client/public deleted file mode 100644 index e69de29..0000000 -- 2.52.0 From eb07832cc7a05fc8568121a6d6dc48232e23ae2c Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 6 Mar 2026 14:15:05 -0600 Subject: [PATCH 03/86] Upload files to "client/public/static" --- client/public/static/mpm-logo.png | Bin 0 -> 4188 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 client/public/static/mpm-logo.png diff --git a/client/public/static/mpm-logo.png b/client/public/static/mpm-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..02e50cc2a2713bdd2a2ade7301d92179d5b25707 GIT binary patch literal 4188 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 Date: Fri, 6 Mar 2026 15:25:48 -0600 Subject: [PATCH 04/86] Upload files to "client/src/components" --- client/src/components/EmployeeModal.jsx | 8 +- client/src/components/NegateModal.jsx | 232 ++++++++++++++++++------ 2 files changed, 182 insertions(+), 58 deletions(-) diff --git a/client/src/components/EmployeeModal.jsx b/client/src/components/EmployeeModal.jsx index 500ea7d..bd3c017 100755 --- a/client/src/components/EmployeeModal.jsx +++ b/client/src/components/EmployeeModal.jsx @@ -68,12 +68,18 @@ export default function EmployeeModal({ employeeId, onClose }) { const handleRestore = async (id) => { await axios.patch(`/api/violations/${id}/restore`); + setConfirmDel(null); load(); }; const handleNegate = async ({ resolution_type, details, resolved_by }) => { - await axios.patch(`/api/violations/${negating.id}/negate`, { resolution_type, details, resolved_by }); + await axios.patch(`/api/violations/${negating.id}/negate`, { + resolution_type, + details, + resolved_by, + }); setNegating(null); + setConfirmDel(null); load(); }; diff --git a/client/src/components/NegateModal.jsx b/client/src/components/NegateModal.jsx index 1ea38a1..e52614b 100755 --- a/client/src/components/NegateModal.jsx +++ b/client/src/components/NegateModal.jsx @@ -1,68 +1,186 @@ import React, { useState } from 'react'; -const RESOLUTION_TYPES = [ - 'Corrective Training Completed', - 'Management Discretion', - 'Data Entry Error', - 'Successfully Appealed', -]; - const s = { - overlay: { position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.65)', zIndex: 2000, display: 'flex', alignItems: 'center', justifyContent: 'center' }, - box: { background: 'white', borderRadius: '10px', padding: '28px', width: '440px', maxWidth: '95vw', boxShadow: '0 8px 32px rgba(0,0,0,0.22)' }, - title: { fontSize: '17px', fontWeight: 700, color: '#2c3e50', marginBottom: '6px' }, - sub: { fontSize: '12px', color: '#888', marginBottom: '20px' }, - label: { fontWeight: 600, color: '#555', fontSize: '12px', marginBottom: '5px', display: 'block' }, - input: { width: '100%', padding: '9px 12px', border: '1px solid #ddd', borderRadius: '5px', fontSize: '13px', fontFamily: 'inherit', marginBottom: '14px' }, - btnRow: { display: 'flex', gap: '10px', justifyContent: 'flex-end', marginTop: '8px' }, - btnOk: { padding: '10px 22px', background: '#856404', color: 'white', border: 'none', borderRadius: '6px', cursor: 'pointer', fontWeight: 700, fontSize: '13px' }, - btnCancel:{ padding: '10px 22px', background: '#f1f3f5', color: '#555', border: 'none', borderRadius: '6px', cursor: 'pointer', fontWeight: 600, fontSize: '13px' }, - violBox: { background: '#fff3cd', border: '1px solid #ffc107', borderRadius: '6px', padding: '10px 14px', marginBottom: '18px', fontSize: '13px' }, + overlay: { + position: 'fixed', + inset: 0, + background: 'rgba(0,0,0,0.75)', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + zIndex: 1100, + }, + modal: { + width: '480px', + maxWidth: '95vw', + background: '#111217', + borderRadius: '12px', + boxShadow: '0 16px 40px rgba(0,0,0,0.8)', + color: '#f8f9fa', + overflow: 'hidden', + border: '1px solid #2a2b3a', + }, + header: { + padding: '18px 24px', + borderBottom: '1px solid #222', + background: 'linear-gradient(135deg, #000000, #151622)', + }, + title: { + fontSize: '18px', + fontWeight: 700, + }, + subtitle: { + fontSize: '12px', + color: '#c0c2d6', + marginTop: '4px', + }, + body: { + padding: '18px 24px 8px 24px', + }, + pill: { + background: '#3b2e00', + borderRadius: '6px', + padding: '8px 10px', + fontSize: '12px', + color: '#ffd666', + border: '1px solid #d4af37', + marginBottom: '14px', + }, + label: { + fontSize: '13px', + fontWeight: 600, + marginBottom: '4px', + color: '#e5e7f1', + }, + input: { + width: '100%', + padding: '9px 10px', + borderRadius: '6px', + border: '1px solid #333544', + background: '#050608', + color: '#f8f9fa', + fontSize: '13px', + fontFamily: 'inherit', + marginBottom: '14px', + }, + textarea: { + width: '100%', + minHeight: '80px', + resize: 'vertical', + padding: '9px 10px', + borderRadius: '6px', + border: '1px solid #333544', + background: '#050608', + color: '#f8f9fa', + fontSize: '13px', + fontFamily: 'inherit', + marginBottom: '14px', + }, + footer: { + display: 'flex', + justifyContent: 'flex-end', + gap: '10px', + padding: '16px 24px 20px 24px', + background: '#0c0d14', + borderTop: '1px solid #222', + }, + btnCancel: { + padding: '10px 20px', + borderRadius: '6px', + border: '1px solid #333544', + background: '#050608', + color: '#f8f9fa', + fontWeight: 600, + fontSize: '13px', + cursor: 'pointer', + }, + btnConfirm: { + padding: '10px 22px', + borderRadius: '6px', + border: 'none', + background: 'linear-gradient(135deg, #d4af37 0%, #ffdf8a 100%)', + color: '#000', + fontWeight: 700, + fontSize: '13px', + cursor: 'pointer', + textTransform: 'uppercase', + }, }; export default function NegateModal({ violation, onConfirm, onCancel }) { - const [resType, setResType] = useState(''); - const [details, setDetails] = useState(''); - const [resolvedBy, setResolvedBy] = useState(''); - const [error, setError] = useState(''); + const [resolutionType, setResolutionType] = useState('Corrective Training Completed'); + const [details, setDetails] = useState(''); + const [resolvedBy, setResolvedBy] = useState(''); - const handleSubmit = () => { - if (!resType) { setError('Please select a resolution type.'); return; } - onConfirm({ resolution_type: resType, details, resolved_by: resolvedBy }); - }; + if (!violation) return null; - return ( -
-
-
⊘ Negate Violation Points
-
This will zero out the points from this incident. The record remains in the audit log.
+ const handleConfirm = () => { + onConfirm({ + resolution_type: resolutionType, + details, + resolved_by: resolvedBy, + }); + }; -
- {violation.violation_name}  ·  {violation.points} pts  ·  {violation.incident_date} -
- - - - - -