From f1dff12888c0f8e7421e2044f777db601fd21c39 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 12 Nov 2025 18:10:03 +0000 Subject: [PATCH] 3 --- assets/css/custom.css | 11 +- assets/css/dark-mode.css | 100 ++++++++ assets/pasted-20251112-162625-ae9fd705.jpg | Bin 0 -> 22532 bytes footer.php | 67 +++++ header.php | 196 +++++++++++++++ index.php | 270 +++++---------------- statistics.php | 232 ++++++++++++++++++ 7 files changed, 666 insertions(+), 210 deletions(-) create mode 100644 assets/css/dark-mode.css create mode 100644 assets/pasted-20251112-162625-ae9fd705.jpg create mode 100644 footer.php create mode 100644 header.php create mode 100644 statistics.php diff --git a/assets/css/custom.css b/assets/css/custom.css index 886b3fb..c987b0e 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -1,16 +1,21 @@ body { - background-color: #f8f9fa; + } .header { - background: linear-gradient(135deg, #0d6efd, #0d6efd); + background: linear-gradient(to right, #007bff, #0056b3); color: white; padding: 4rem 0; text-align: center; } +.header h1 { + text-shadow: none; +} + + .footer { position: fixed; bottom: 0; width: 100%; -} +} \ No newline at end of file diff --git a/assets/css/dark-mode.css b/assets/css/dark-mode.css new file mode 100644 index 0000000..2ba1049 --- /dev/null +++ b/assets/css/dark-mode.css @@ -0,0 +1,100 @@ +body.dark-mode { + background-color: #121212; + color: #e0e0e0; +} + +body.dark-mode .header { + background: #1e1e1e; + border-bottom: 1px solid #333; +} + +body.dark-mode .card { + background-color: #1e1e1e; + border: 1px solid #333; +} + +body.dark-mode .modal-content { + background-color: #1e1e1e; + border: 1px solid #333; +} + +body.dark-mode .footer { + background-color: #1e1e1e; + border-top: 1px solid #333; +} + +body.dark-mode .table { + background-color: #1e1e1e; + color: #e0e0e0; +} + +body.dark-mode .table-light { + background-color: #333; + color: #e0e0e0; +} + +body.dark-mode .nav-tabs .nav-link { + color: #e0e0e0; + border: 1px solid #333; +} + +body.dark-mode .nav-tabs .nav-link.active { + background-color: #333; + border-color: #333; +} + +body.dark-mode .form-control { + background-color: #333; + color: #e0e0e0; + border: 1px solid #555; +} + +body.dark-mode .form-select { + background-color: #333; + color: #e0e0e0; + border: 1px solid #555; +} + +body.dark-mode .btn-primary { + background-color: #0d6efd; + border-color: #0d6efd; +} + +body.dark-mode .btn-outline-primary { + color: #0d6efd; + border-color: #0d6efd; +} + +body.dark-mode .btn-outline-primary:hover { + background-color: #0d6efd; + color: #fff; +} + +body.dark-mode .btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; +} + +body.dark-mode .btn-outline-secondary:hover { + background-color: #6c757d; + color: #fff; +} + +body.dark-mode .btn-outline-info { + color: #0dcaf0; + border-color: #0dcaf0; +} + +body.dark-mode .btn-outline-info:hover { + background-color: #0dcaf0; + color: #000; +} + +body.dark-mode .text-muted { + color: #aaa !important; +} + +body.dark-mode .badge.bg-info { + background-color: #0dcaf0 !important; + color: #000 !important; +} diff --git a/assets/pasted-20251112-162625-ae9fd705.jpg b/assets/pasted-20251112-162625-ae9fd705.jpg new file mode 100644 index 0000000000000000000000000000000000000000..05d07481ced9e9c23c9234f1db4577a3b9840e1a GIT binary patch literal 22532 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

mIH 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≪CpG5V1KEraAAKgo+7 z4u?&f5r~M0A|@H!NKdTYMz`0a1q&vNHRQWkK~Nh0j^S%TcnuZb5ky53a+2EE?`5kM z;E0WRVN;_?rEv6tD}x*v1%0p&uw*(;u0UF8mVkMvXlxt~Fa)4z5^7*DPBj^zHD=*! zh(gVXl1mi^+B@YSE^N4!3RELz7VR;G0;E80l_JA6Rgg9SDneFayxT9fcaKFB_ac}x zit5x0;`}nAJHtfEdh%W)HMZ>ZW#yAkyIqX5q1%o&mYOx^|LS{ zB@-1E3`>5hiWR}Egko!~GEXbLFA0KtHV;J=RTL>h2ND`nbu!X{pa>l$t*Ahi-iWr^LgoaX&<#2!XJnLC5OWy^;%JDbd`kb|Sh88>Mau zAE%G6j{g9&7N8+h3=~9?k^B QRqDE%<6PJO04RU|*`nRn{Qv*} literal 0 HcmV?d00001 diff --git a/footer.php b/footer.php new file mode 100644 index 0000000..fc6fb5e --- /dev/null +++ b/footer.php @@ -0,0 +1,67 @@ +

+ + + + + + + \ No newline at end of file diff --git a/header.php b/header.php new file mode 100644 index 0000000..5200081 --- /dev/null +++ b/header.php @@ -0,0 +1,196 @@ + + + + + + TWU Local 555 BNA Ramp Grievance Tracker + + + + + + + + + + + + + + + setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $pdotest = $pdo->query('SHOW TABLES'); + if ($pdotest->rowCount() == 0) { + $pdo->exec("CREATE TABLE IF NOT EXISTS grievances ( + id INT AUTO_INCREMENT PRIMARY KEY, + grievant_name VARCHAR(255) NOT NULL, + discipline VARCHAR(255) NOT NULL, + subject VARCHAR(255) NOT NULL, + status VARCHAR(100) NOT NULL, + last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + union_representative VARCHAR(255) NOT NULL, + category VARCHAR(255) NOT NULL DEFAULT 'Local Grievances' + );"); + } + + // Check if 'category' column exists and add it if it doesn't + $stmt = $pdo->query("SHOW COLUMNS FROM grievances LIKE 'category'"); + if ($stmt->rowCount() == 0) { + $pdo->exec("ALTER TABLE grievances ADD COLUMN category VARCHAR(255) NOT NULL DEFAULT 'Local Grievances'"); + } + + // Check if 'case_number' column exists and add it if it doesn't + $stmt = $pdo->query("SHOW COLUMNS FROM grievances LIKE 'case_number'"); + if ($stmt->rowCount() == 0) { + $pdo->exec("ALTER TABLE grievances ADD COLUMN case_number VARCHAR(255) NULL"); + } + + $pdo->exec("CREATE TABLE IF NOT EXISTS grievance_updates ( + id INT AUTO_INCREMENT PRIMARY KEY, + grievance_id INT NOT NULL, + update_text TEXT NOT NULL, + representative_name VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (grievance_id) REFERENCES grievances(id) ON DELETE CASCADE + );"); + + } catch (PDOException $e) { + $message = ''; + } + + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (isset($_POST['add_grievance'])) { + $grievant_name = trim($_POST['grievant_name']); + $discipline = trim($_POST['discipline']); + $subject = trim($_POST['subject']); + $status = trim($_POST['status']); + $union_representative = trim($_POST['union_representative']); + $category = trim($_POST['category']); + + if (!empty($grievant_name) && !empty($discipline) && !empty($subject) && !empty($status) && !empty($union_representative) && !empty($category)) { + try { + $stmt = $pdo->prepare("INSERT INTO grievances (grievant_name, discipline, subject, status, union_representative, category) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$grievant_name, $discipline, $subject, $status, $union_representative, $category]); + $message = ''; + } catch (PDOException $e) { + $message = ''; + } + } else { + $message = ''; + } + } elseif (isset($_POST['move_grievance'])) { + $grievance_id = $_POST['grievance_id']; + $new_category = $_POST['new_category']; + + if (!empty($grievance_id) && !empty($new_category) && in_array($new_category, $categories)) { + try { + $stmt = $pdo->prepare("UPDATE grievances SET category = ? WHERE id = ?"); + $stmt->execute([$new_category, $grievance_id]); + $message = ''; + } catch (PDOException $e) { + $message = ''; + } + } else { + $message = ''; + } + } elseif (isset($_POST['edit_grievance'])) { + $grievance_id = $_POST['grievance_id']; + $grievant_name = trim($_POST['grievant_name']); + $discipline = trim($_POST['discipline']); + $subject = trim($_POST['subject']); + $status = trim($_POST['status']); + $union_representative = trim($_POST['union_representative']); + $case_number = isset($_POST['case_number']) ? trim($_POST['case_number']) : null; + + if (!empty($grievance_id) && !empty($grievant_name) && !empty($discipline) && !empty($subject) && !empty($status) && !empty($union_representative)) { + try { + // Check category to decide if case_number should be updated + $stmt_cat = $pdo->prepare("SELECT category FROM grievances WHERE id = ?"); + $stmt_cat->execute([$grievance_id]); + $grievance_category = $stmt_cat->fetchColumn(); + + $sql = "UPDATE grievances SET grievant_name = ?, discipline = ?, subject = ?, status = ?, union_representative = ?"; + $params = [$grievant_name, $discipline, $subject, $status, $union_representative]; + + if (($grievance_category === 'FWD to Office' || $grievance_category === 'Terminations')) { + $sql .= ", case_number = ?"; + $params[] = $case_number; + } + + $sql .= " WHERE id = ?"; + $params[] = $grievance_id; + + $stmt = $pdo->prepare($sql); + $stmt->execute($params); + $message = ''; + } catch (PDOException $e) { + $message = ''; + } + } else { + $message = ''; + } + } elseif (isset($_POST['add_grievance_update'])) { + $grievance_id = $_POST['grievance_id']; + $update_text = trim($_POST['update_text']); + $representative_name = trim($_POST['representative_name']); + + if (!empty($grievance_id) && !empty($update_text) && !empty($representative_name)) { + try { + $stmt = $pdo->prepare("INSERT INTO grievance_updates (grievance_id, update_text, representative_name) VALUES (?, ?, ?)"); + $stmt->execute([$grievance_id, $update_text, $representative_name]); + $message = ''; + } catch (PDOException $e) { + $message = ''; + } + } else { + $message = ''; + } + } + } + + try { + $stmt = $pdo->prepare("SELECT * FROM grievances WHERE category = ? ORDER BY last_updated DESC"); + $stmt->execute([$page]); + $grievances = $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + $grievances = []; + $message .= ''; + } + ?> + +
+
+
+
+

TWU Local 555 BNA Ramp Grievance Tracker

+

A simple tool to track and manage ramp grievances.

+
+
+ + +
+
+
+
+ +
+ diff --git a/index.php b/index.php index 129b98b..9120167 100644 --- a/index.php +++ b/index.php @@ -1,156 +1,4 @@ - - - - - - TWU Local 555 BNA Ramp Grievance Tracker - - - - - - - - - - - - - - setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - - $pdotest = $pdo->query('SHOW TABLES'); - if ($pdotest->rowCount() == 0) { - $pdo->exec("CREATE TABLE IF NOT EXISTS grievances ( - id INT AUTO_INCREMENT PRIMARY KEY, - grievant_name VARCHAR(255) NOT NULL, - discipline VARCHAR(255) NOT NULL, - subject VARCHAR(255) NOT NULL, - status VARCHAR(100) NOT NULL, - last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - union_representative VARCHAR(255) NOT NULL, - category VARCHAR(255) NOT NULL DEFAULT 'Local Grievances' - );"); - } - - // Check if 'category' column exists and add it if it doesn't - $stmt = $pdo->query("SHOW COLUMNS FROM grievances LIKE 'category'"); - if ($stmt->rowCount() == 0) { - $pdo->exec("ALTER TABLE grievances ADD COLUMN category VARCHAR(255) NOT NULL DEFAULT 'Local Grievances'"); - } - - // Check if 'case_number' column exists and add it if it doesn't - $stmt = $pdo->query("SHOW COLUMNS FROM grievances LIKE 'case_number'"); - if ($stmt->rowCount() == 0) { - $pdo->exec("ALTER TABLE grievances ADD COLUMN case_number VARCHAR(255) NULL"); - } - - } catch (PDOException $e) { - $message = ''; - } - - if ($_SERVER['REQUEST_METHOD'] === 'POST') { - if (isset($_POST['add_grievance'])) { - $grievant_name = trim($_POST['grievant_name']); - $discipline = trim($_POST['discipline']); - $subject = trim($_POST['subject']); - $status = trim($_POST['status']); - $union_representative = trim($_POST['union_representative']); - $category = trim($_POST['category']); - - if (!empty($grievant_name) && !empty($discipline) && !empty($subject) && !empty($status) && !empty($union_representative) && !empty($category)) { - try { - $stmt = $pdo->prepare("INSERT INTO grievances (grievant_name, discipline, subject, status, union_representative, category) VALUES (?, ?, ?, ?, ?, ?)"); - $stmt->execute([$grievant_name, $discipline, $subject, $status, $union_representative, $category]); - $message = ''; - } catch (PDOException $e) { - $message = ''; - } - } else { - $message = ''; - } - } elseif (isset($_POST['move_grievance'])) { - $grievance_id = $_POST['grievance_id']; - $new_category = $_POST['new_category']; - - if (!empty($grievance_id) && !empty($new_category) && in_array($new_category, $categories)) { - try { - $stmt = $pdo->prepare("UPDATE grievances SET category = ? WHERE id = ?"); - $stmt->execute([$new_category, $grievance_id]); - $message = ''; - } catch (PDOException $e) { - $message = ''; - } - } else { - $message = ''; - } - } elseif (isset($_POST['edit_grievance'])) { - $grievance_id = $_POST['grievance_id']; - $grievant_name = trim($_POST['grievant_name']); - $discipline = trim($_POST['discipline']); - $subject = trim($_POST['subject']); - $status = trim($_POST['status']); - $union_representative = trim($_POST['union_representative']); - $case_number = isset($_POST['case_number']) ? trim($_POST['case_number']) : null; - - if (!empty($grievance_id) && !empty($grievant_name) && !empty($discipline) && !empty($subject) && !empty($status) && !empty($union_representative)) { - try { - // Check category to decide if case_number should be updated - $stmt_cat = $pdo->prepare("SELECT category FROM grievances WHERE id = ?"); - $stmt_cat->execute([$grievance_id]); - $grievance_category = $stmt_cat->fetchColumn(); - - $sql = "UPDATE grievances SET grievant_name = ?, discipline = ?, subject = ?, status = ?, union_representative = ?"; - $params = [$grievant_name, $discipline, $subject, $status, $union_representative]; - - if (($grievance_category === 'FWD to Office' || $grievance_category === 'Terminations')) { - $sql .= ", case_number = ?"; - $params[] = $case_number; - } - - $sql .= " WHERE id = ?"; - $params[] = $grievance_id; - - $stmt = $pdo->prepare($sql); - $stmt->execute($params); - $message = ''; - } catch (PDOException $e) { - $message = ''; - } - } else { - $message = ''; - } - } - } - - try { - $stmt = $pdo->prepare("SELECT * FROM grievances WHERE category = ? ORDER BY last_updated DESC"); - $stmt->execute([$page]); - $grievances = $stmt->fetchAll(PDO::FETCH_ASSOC); - } catch (PDOException $e) { - $grievances = []; - $message .= ''; - } - ?> - -
-
-

TWU Local 555 BNA Ramp Grievance Tracker

-

A simple tool to track and manage ramp grievances.

-
-
- -
- +
@@ -179,6 +30,9 @@ Case Number + + Timeframes + Status Last Updated Union Representative @@ -188,7 +42,7 @@ - No grievances found in this category. + No grievances found in this category. @@ -199,6 +53,9 @@ + + + @@ -231,6 +88,47 @@ data-case-number=""> Edit + + + + + +
+
Updates
+ prepare("SELECT * FROM grievance_updates WHERE grievance_id = ? ORDER BY created_at DESC"); + $update_stmt->execute([$grievance['id']]); + $updates = $update_stmt->fetchAll(PDO::FETCH_ASSOC); + ?> + +

No updates for this grievance yet.

+ +
    + +
  • +

    + By on +
  • + +
+ + +
+ + +
+ + +
+
+ + +
+ +
+
@@ -269,10 +167,11 @@
@@ -316,10 +215,11 @@
@@ -340,48 +240,4 @@
- - - - - - - + diff --git a/statistics.php b/statistics.php new file mode 100644 index 0000000..3c56748 --- /dev/null +++ b/statistics.php @@ -0,0 +1,232 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + // Fetch data for Discipline + $discipline_stmt = $pdo->query("SELECT discipline, COUNT(*) as count FROM grievances GROUP BY discipline"); + $discipline_data = $discipline_stmt->fetchAll(PDO::FETCH_ASSOC); + + // Fetch data for Subject + $subject_stmt = $pdo->query("SELECT subject, COUNT(*) as count FROM grievances GROUP BY subject"); + $subject_data = $subject_stmt->fetchAll(PDO::FETCH_ASSOC); + + // Fetch data for Grievances per Quarter + $quarter_stmt = $pdo->query("SELECT QUARTER(last_updated) as quarter, COUNT(*) as count FROM grievances GROUP BY QUARTER(last_updated)"); + $quarter_data = $quarter_stmt->fetchAll(PDO::FETCH_ASSOC); + +} catch (PDOException $e) { + echo '
Database error: ' . $e->getMessage() . '
'; + exit; +} + +$discipline_labels = []; +$discipline_values = []; +foreach ($discipline_data as $data) { + $discipline_labels[] = $data['discipline']; + $discipline_values[] = $data['count']; +} + +$subject_labels = []; +$subject_values = []; +foreach ($subject_data as $data) { + $subject_labels[] = $data['subject']; + $subject_values[] = $data['count']; +} + +$quarter_labels = []; +$quarter_values = []; +foreach ($quarter_data as $data) { + $quarter_labels[] = 'Q' . $data['quarter']; + $quarter_values[] = $data['count']; +} +?> + +
+

Grievance Statistics

+
+
+

Discipline

+ +
+
+

Subject

+ +
+
+

Grievances per Quarter

+ +
+
+
+ + + + \ No newline at end of file