Files
ppr/tower.php
2025-03-31 12:33:26 +00:00

414 lines
12 KiB
PHP

<?php
include("functions.php");
require_db_auth();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="300">
<!-- Include SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
let rows = document.querySelectorAll("table tbody tr");
rows.forEach(row => {
let fuelCell = row.cells[3]; // Get the "Fuel" cell (index 3)
if (fuelCell.textContent == "100LL") {
row.classList.add("highlight100LL"); // Add the class
} else if (fuelCell.textContent == "JET A1") {
row.classList.add("highlightJET"); // Add the class
}
});
});
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Swansea Daily PPR</title>
<style>
.checkbox-container {
display: flex;
gap: 15px;
margin-bottom: 15px;
padding: 10px;
background: #f9f9f9;
border-radius: 8px;
width: fit-content;
}
.heading {
width: 80%;
margin: 20px auto;
background-color: #fff;
text-align: center;
font-family: Arial, sans-serif;
font-size: 20pt;
}
label {
display: flex;
align-items: center;
gap: 5px;
font-size: 16px;
cursor: pointer;
}
.hidden {
display: none;
}
/* Styling for the table */
table {
width: 80%;
border-collapse: collapse;
margin: 20px 0;
margin-left: auto; /* Automatically adjusts left margin */
margin-right: auto; /* Automatically adjusts right margin */
}
table, th, td {
border: 1px solid #ddd;
}
th {
padding: 8px;
text-align: center;
}
td {
padding: 8px;
text-align: center;
font-family: Arial, sans-serif;
font-size: 16pt;
}
.acreg {
padding: 4px;
text-align: center;
font-family: Arial, sans-serif;
font-size: 10pt;
font-style: italic;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
tr:hover {
background-color: #f1f1f1;
}
.highlight100LL {
background-color: #ADD8E6 !important;
#font-weight: bold;
}
.highlightJET {
background-color: yellow !important; /* Allow it to override the odd/even shading */
#font-weight: bold;
}
button {
padding: 10px 20px;
font-size: 1rem;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
transition: 0.3s;
}
button:hover {
background-color: #0056b3;
}
.state-CANCELED {
text-decoration: line-through;
color: gray;
}
.state-LANDED {
font-style: italic;
color: gray;
}
input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
}
/* Add this CSS for the red triangle */
.red-triangle {
position: relative;
}
.red-triangle::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
border-left: 10px solid red;
border-bottom: 10px solid transparent;
}
.red-triangle:hover::after {
content: attr(data-notes);
position: absolute;
top: 20px;
left: 0;
background: #fff;
border: 1px solid #ddd;
padding: 5px;
border-radius: 5px;
white-space: nowrap;
z-index: 10;
}
</style>
</head>
<body>
<?php include("menu.php"); ?>
<script>
function markAction(id, action, title, buttonText) {
const now = new Date();
const currentTime = now.toISOString().slice(11, 16); // Extract HH:MM
Swal.fire({
title: title,
html: `<input type="time" id="timepicker" class="swal2-input" value="${currentTime}">`,
icon: "info",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: buttonText,
preConfirm: () => {
const time = document.getElementById("timepicker").value;
if (!time) {
Swal.showValidationMessage("Please select a time");
}
return time;
}
}).then((result) => {
if (result.isConfirmed) {
const page = `action.php?op=${action}&id=${id}&time=${encodeURIComponent(result.value)}`;
var xhr = new XMLHttpRequest();
xhr.open("GET", page, false); // 'false' makes the request synchronous
xhr.send();
window.location.reload(true);
}
});
}
function markDeparted(id) {
markAction(id, "departed", "Depart Aircraft at time (UTC)", "Departed");
}
function markLanded(id) {
markAction(id, "landed", "Land Aircraft at time (UTC)", "Landed");
}
function markCancel(id) {
Swal.fire({
title: "Are you sure?",
text: "This action will cancel the PPR.",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: "Yes, cancel it!",
cancelButtonText: "No, keep it"
}).then((result) => {
if (result.isConfirmed) {
const page = `action.php?op=cancel&id=${id}`;
var xhr = new XMLHttpRequest();
xhr.open("GET", page, false); // 'false' makes the request synchronous
xhr.send();
window.location.reload(true);
}
});
}
function openDetail(id) {
const page = `action.php?op=detail&id=${id}`;
var popupWindow = window.open(page, "PopupWindow", "toolbar=no, location=no, directories=no,status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=yes, width=600, height=1100");
popupWindow.onload = function () {
var contentHeight = popupWindow.document.body.scrollHeight;
var contentWidth = popupWindow.document.body.scrollWidth;
popupWindow.resizeTo(contentWidth + 20, contentHeight + 180); // Adding padding to prevent clipping
};
}
</script>
<center><h2>Tower Ops <?php echo date('l d M Y'); ?></h2></center>
<!--
<div class="checkbox-container">
<label>
<input type="checkbox" id="toggle-canceled" onchange="toggleRows('state-CANCELED', this.checked)"> Show CANCELED
</label>
</div>
-->
<div class="heading">Inbound Aircraft</div>
<?php
function renderTableCell($key, $value, $row) {
if ($key == 'ETA' || $key == 'ETD') {
return "<td>" . htmlspecialchars($value ?? '') . (!empty($value) ? " Z" : "") . "</td>"; // Add "Z" suffix only if not blank
}
if ($key == 'ac_reg' && $row['ac_call'] != NULL) {
$notes = htmlspecialchars($row['notes'] ?? '');
$acCall = htmlspecialchars($row['ac_call'] ?? '');
$acReg = htmlspecialchars($value ?? '');
if (!empty($row['notes'])) {
return "<td class='red-triangle' data-notes='$notes'>$acCall<br><span class='acreg'>$acReg</span></td>";
}
return "<td>$acCall<br><span class='acreg'>$acReg</span></td>";
} elseif ($key == 'ac_reg' && !empty($row['notes'])) {
$notes = htmlspecialchars($row['notes'] ?? '');
$acReg = htmlspecialchars($value ?? '');
return "<td class='red-triangle' data-notes='$notes'>$acReg</td>";
} else {
return "<td>" . htmlspecialchars($value ?? '') . "</td>";
}
}
function renderActionsCell($id, $status = null) {
if ($status === 'LANDED') {
return "<td>
<img src='assets/cancel-icon.webp' title='Cancel PPR' style='width: 25px; height: auto;' onclick='markCancel($id)'>
<img src='assets/depart.png' title='Depart' style='width: 30px; height: auto;' onclick='markDeparted($id)'>
</td>";
} else {
return "<td>
<img src='assets/cancel-icon.webp' title='Cancel PPR' style='width: 25px; height: auto;' onclick='markCancel($id)'>
<img src='assets/arrive.png' title='Land' style='width: 30px; height: auto;' onclick='markLanded($id)'>
</td>";
}
}
function renderTableRow($row) {
$rowHtml = "<tr class='state-" . htmlspecialchars($row['status']) . "' data-id='" . htmlspecialchars($row['id']) . "'>";
foreach ($row as $key => $value) {
if (!in_array($key, ['notes', 'status', 'id', 'ac_call'])) {
$rowHtml .= renderTableCell($key, $value, $row);
}
}
$rowHtml .= renderActionsCell($row['id'], $row['status']);
$rowHtml .= "</tr>";
return $rowHtml;
}
function renderTable($result) {
$tableHtml = "<table border='1' id='arrivals'>
<thead>
<tr>";
$fields = $result->fetch_fields();
foreach ($fields as $field) {
if (!in_array($field->name, ['notes', 'status', 'id', 'ac_call'])) {
$tableHtml .= "<th>" . htmlspecialchars($field->name ?? '') . "</th>";
}
}
$tableHtml .= "<th>actions</th></tr></thead><tbody>";
while ($row = $result->fetch_assoc()) {
$tableHtml .= renderTableRow($row);
}
$tableHtml .= "</tbody></table>";
return $tableHtml;
}
$conn = connectDb();
$sql = "SELECT id, status, ac_reg, ac_type, ac_call, TIME_FORMAT(eta,'%H:%i') AS ETA, fuel, in_from, pob_in, notes FROM submitted WHERE DATE(eta) = CURDATE() AND (status = 'NEW' OR status = 'CANCELED') ORDER BY eta ASC;"; // Replace with your table name
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo renderTable($result);
} else {
echo "No results found.";
}
?>
<div class="heading">Visiting Aircraft</div>
<div id="landed">
<?php
// Define your SQL query
$sql = "SELECT id, status, ac_reg, ac_type, ac_call, TIME_FORMAT(etd,'%H:%i') AS ETD, fuel, out_to, pob_out, notes FROM submitted WHERE DATE(eta) = CURDATE() AND status = 'LANDED' ORDER BY eta ASC;"; // Replace with your table name
// Execute the query
$result = $conn->query($sql);
// Check if there are results
if ($result->num_rows > 0) {
echo renderTable($result); // Use the renderTable function
} else {
echo "No results found.";
}
// Close the database connection
$conn->close();
?>
</div>
<center><button onclick="openPopup()">Log New PPR</button></center>
<script>
function openPopup() {
popup = window.open("input.html", "PopupWindow", "toolbar=no, location=no, directories=no,status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=600, height=1100");
const checkPopup = setInterval(() => {
if (popup && popup.closed) {
clearInterval(checkPopup);
window.location.reload(); // Reload parent window
}
}, 500); // Check every 500ms
}
</script>
<script>
function toggleRows(className) {
document.querySelectorAll('.' + className).forEach(row => {
row.classList.toggle('hidden');
});
}
document.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll('.state-CANCELED').forEach(row => {
row.classList.add('hidden');
});
});
document.getElementById("arrivals")?.addEventListener("click", clickRow);
document.getElementById("landed")?.addEventListener("click", clickRow);
function clickRow (event) {
let td = event.target.closest("td");
if (!td) return; // Clicked outside <td>
let tr = td.parentElement; // Get the row
if (td !== tr.lastElementChild) {
let rowId = tr.dataset.id; // Get the unique row ID
openDetail(rowId);
}
}
</script>
<?php include("footer.php"); ?>