Added basic field editing

This commit is contained in:
2025-03-12 11:43:06 +00:00
parent 8ce6b3d0fd
commit 1e63adf9d5
5 changed files with 155 additions and 9 deletions

View File

@@ -71,9 +71,76 @@
button:hover { button:hover {
background-color: #0056b3; background-color: #0056b3;
} }
.editable {
cursor: pointer;
padding: 5px;
border-radius: 3px;
transition: background 0.3s;
}
.editable:hover {
background:rgb(226, 43, 43);
}
</style> </style>
</head> </head>
<body> <body>
<script>
document.addEventListener("DOMContentLoaded", function () {
let id = "<?php echo $_GET['id'];?>";
// Select all editable elements
document.querySelectorAll(".editable").forEach((element) => {
let oldValue = element.textContent.trim(); // Store initial value
element.addEventListener("focus", function () {
oldValue = this.textContent.trim(); // Store old value when focused
});
element.addEventListener("blur", function () {
let newValue = this.textContent.trim();
let column = this.getAttribute("data-column");
if (newValue !== oldValue) {
sendUpdate(id, column, oldValue, newValue, element);
}
});
});
});
/**
* Sends the updated data to the server
*/
function sendUpdate(flightId, column, oldValue, newValue, element) {
fetch("update_data.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: `id=${flightId}&column=${encodeURIComponent(column)}&old_value=${encodeURIComponent(oldValue)}&new_value=${encodeURIComponent(newValue)}`
})
.then(response => response.json())
.then(data => {
if (data.success) {
console.log(`Updated: ${data.column} changed from '${data.old_value}' to '${data.new_value}'`);
oldValue = newValue; // ✅ Update oldValue to prevent reverting
} else {
alert("Error updating data");
element.textContent = oldValue; // ❌ Revert ONLY if update fails
}
})
.catch(error => {
console.error("Fetch error:", error);
element.textContent = oldValue; // ❌ Revert only on network failure
});
}
</script>
<?php <?php
include("functions.php"); include("functions.php");
@@ -156,9 +223,9 @@ function opDetail() {
echo "<p><strong>Fuel Required:</strong> " . $row['fuel'] . "</p>"; echo "<p><strong>Fuel Required:</strong> " . $row['fuel'] . "</p>";
echo "<p><strong>POB OUT:</strong> " . $row['pob_out'] . "</p>"; echo "<p><strong>POB OUT:</strong><span class=\"editable\" data-column=\"pob_out\" contenteditable=\"true\">" . $row['pob_out'] . "</p>";
echo "<p><strong>Outbound To:</strong> " . $row['out_to'] . "</p>"; echo "<p><strong>Outbound To:</strong><span class=\"editable\" data-column=\"out_to\" contenteditable=\"true\">" . $row['out_to'] . "</p>";
echo "<p><strong>ETD:</strong> " . $row['etd'] . "</p>"; echo "<p><strong>ETD:</strong><span class=\"editable\" data-column=\"etd\" contenteditable=\"true\">" . $row['etd'] . "</p>";
echo "<p><strong>Email Address:</strong> " . $row['email'] . "</p>"; echo "<p><strong>Email Address:</strong> " . $row['email'] . "</p>";

View File

@@ -8,6 +8,7 @@
let now = new Date(); let now = new Date();
let localDatetime = now.toISOString().slice(0, 16); // Format for datetime-local input let localDatetime = now.toISOString().slice(0, 16); // Format for datetime-local input
document.getElementById("eta").value = localDatetime; document.getElementById("eta").value = localDatetime;
document.getElementById("etd").value = localDatetime;
}); });
function fetchResults() { function fetchResults() {
@@ -156,13 +157,26 @@
<input type="text" id="in_from" name="in_from" required> <input type="text" id="in_from" name="in_from" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="pob_in">POB</label> <label for="pob_in">POB Inbound</label>
<input type="number" id="pob_in" name="pob_in" required> <input type="number" id="pob_in" name="pob_in" required>
</div> </div>
<div class="form-group"></div> <div class="form-group"></div>
<label for="eta">ETA</label> <label for="eta">ETA</label>
<input type="datetime-local" id="eta" name="eta"> <input type="datetime-local" id="eta" name="eta">
</div> </div>
<div class="form-group">
<label for="out_to">Out to</label>
<input type="text" id="out_to" name="out_to">
</div>
<div class="form-group">
<label for="pob_out">POB Outbound</label>
<input type="number" id="pob_out" name="pob_out" >
</div>
<div class="form-group"></div>
<label for="eta">Departing At</label>
<input type="datetime-local" id="etd" name="etd">
</div>
<div class="form-group"> <div class="form-group">
<label for="fuel">Fuel Needed</label> <label for="fuel">Fuel Needed</label>
<select id="fuel" name="fuel" single> <select id="fuel" name="fuel" single>

View File

@@ -18,8 +18,19 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
echo "<h2>Received POST Data:</h2>"; echo "<h2>Received POST Data:</h2>";
echo "<ul>"; echo "<ul>";
foreach ($_POST as $key => $value) { foreach ($_POST as $key => $value) {
$columns[] = "`" . $conn->real_escape_string($key) . "`"; $escaped_key = "`" . $conn->real_escape_string($key) . "`";
$values[] = "'" . $conn->real_escape_string($value) . "'";
if ($value === '' || $value === null) {
$escaped_value = "NULL"; // Use NULL for empty values
} elseif (is_numeric($value)) {
$escaped_value = $value; // No quotes for numbers
} else {
$escaped_value = "'" . $conn->real_escape_string($value) . "'"; // Escape and quote strings
}
$columns[] = $escaped_key;
$values[] = $escaped_value;
echo "<li><strong>" . htmlspecialchars($key) . ":</strong> " . htmlspecialchars($value) . "</li>"; echo "<li><strong>" . htmlspecialchars($key) . ":</strong> " . htmlspecialchars($value) . "</li>";
} }
if (!empty($columns)) { if (!empty($columns)) {

View File

@@ -260,11 +260,13 @@ function markDeparted(id) {
</script> </script>
<center><h2>Tower Ops <?php echo date('l d M Y'); ?></h2></center> <center><h2>Tower Ops <?php echo date('l d M Y'); ?></h2></center>
<!--
<div class="checkbox-container"> <div class="checkbox-container">
<label> <label>
<input type="checkbox" id="toggle-canceled" onchange="toggleRows('state-CANCELED', this.checked)"> Show CANCELED <input type="checkbox" id="toggle-canceled" onchange="toggleRows('state-CANCELED', this.checked)"> Show CANCELED
</label> </label>
</div> </div>
-->
<div class="heading">Inbound PPR</div> <div class="heading">Inbound PPR</div>
@@ -417,8 +419,8 @@ $conn->close();
}); });
}); });
document.getElementById("arrivals").addEventListener("click", clickRow); document.getElementById("arrivals")?.addEventListener("click", clickRow);
document.getElementById("landed").addEventListener("click", clickRow); document.getElementById("landed")?.addEventListener("click", clickRow);
function clickRow (event) { function clickRow (event) {
let td = event.target.closest("td"); let td = event.target.closest("td");

52
update_data.php Normal file
View File

@@ -0,0 +1,52 @@
<?php
include("functions.php");
require_db_auth();
$conn = connectDb();
// Ensure required parameters are received
if (!isset($_POST['id'], $_POST['column'], $_POST['new_value'], $_POST['old_value'])) {
die(json_encode(['error' => 'Invalid request']));
}
$id = intval($_POST['id']); // Sanitize ID
$column = $_POST['column'];
$old_value = $_POST['old_value'];
$new_value = $_POST['new_value'];
// Allowed columns for security (prevent SQL injection)
$allowed_columns = [
'ac_reg', 'ac_type', 'ac_call', 'captain',
'in_from', 'pob_in', 'eta', 'fuel',
'pob_out', 'out_to', 'etd', 'email', 'phone', 'notes'
];
if (!in_array($column, $allowed_columns)) {
die(json_encode(['error' => 'Invalid column']));
}
$stmt = $conn->prepare("UPDATE submitted SET `$column` = ? WHERE id = ?");
if (!$stmt) {
die(json_encode(['error' => 'Prepare statement failed']));
}
$stmt->bind_param("si", $new_value, $id);
$success = $stmt->execute();
$stmt->close();
// If update successful, log the change
if ($success) {
$message = $column . " changed from " . $old_value . " to " . $new_value;
logJournal($conn, $id, $message);
}
$conn->close();
// Return JSON response
echo json_encode([
'success' => $success,
'column' => $column,
'old_value' => $old_value,
'new_value' => $new_value
]);
?>