From 70eef4cd822632c6320a6e74e3c54678e992ee5a Mon Sep 17 00:00:00 2001 From: Gemini Agent Date: Sun, 7 Dec 2025 07:52:03 +0000 Subject: [PATCH] Fix: Gewichtsberechnung Zusatztaschen, UI-Konsistenz bei Editieren, Icons --- src/edit_packing_list_details.php | 203 +++++++++++++++++++++--------- 1 file changed, 146 insertions(+), 57 deletions(-) diff --git a/src/edit_packing_list_details.php b/src/edit_packing_list_details.php index 485572f..b47a980 100644 --- a/src/edit_packing_list_details.php +++ b/src/edit_packing_list_details.php @@ -12,7 +12,7 @@ if (!isset($_SESSION['user_id'])) { require_once 'db_connect.php'; require_once 'household_actions.php'; -require_once 'backpack_utils.php'; // Fix: Include utils +require_once 'backpack_utils.php'; require_once 'header.php'; $current_user_id = $_SESSION['user_id']; @@ -91,55 +91,59 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && $can_edit) { $packing_list['name'] = $name; $packing_list['description'] = $description; - // Handle Backpack Assignments - if (isset($_POST['backpacks'])) { - foreach ($_POST['backpacks'] as $uid => $bid) { - $uid = intval($uid); - $bid = intval($bid); + // Handle Participation & Backpacks + // Get all potential users to check if they were unchecked + $participate_map = $_POST['participate'] ?? []; // Array of UserID => "1" if checked + + foreach ($available_users as $user) { + $uid = $user['id']; + $is_checked = isset($participate_map[$uid]); + $was_participating = array_key_exists($uid, $current_assignments); + + if ($is_checked) { + // User participates -> Update/Insert Backpack + $bid = isset($_POST['backpacks'][$uid]) ? intval($_POST['backpacks'][$uid]) : 0; $bid = ($bid > 0) ? $bid : NULL; - - // Update Carrier Table - // Check if exists - $old_backpack_id = 0; - $stmt_chk = $conn->prepare("SELECT id, backpack_id FROM packing_list_carriers WHERE packing_list_id = ? AND user_id = ?"); - $stmt_chk->bind_param("ii", $packing_list_id, $uid); - $stmt_chk->execute(); - $res_chk = $stmt_chk->get_result(); - if ($row_chk = $res_chk->fetch_assoc()) { - $old_backpack_id = $row_chk['backpack_id']; - $stmt_up = $conn->prepare("UPDATE packing_list_carriers SET backpack_id = ? WHERE packing_list_id = ? AND user_id = ?"); - $stmt_up->bind_param("iii", $bid, $packing_list_id, $uid); - $stmt_up->execute(); + + if ($was_participating) { + $old_bid = $current_assignments[$uid]; + // Update if changed + if ($old_bid != $bid) { + $stmt_up = $conn->prepare("UPDATE packing_list_carriers SET backpack_id = ? WHERE packing_list_id = ? AND user_id = ?"); + $stmt_up->bind_param("iii", $bid, $packing_list_id, $uid); + $stmt_up->execute(); + + // Cleanup Old Containers + cleanup_old_backpack_containers($conn, $packing_list_id, $uid); + + // Sync New + if ($bid) { + sync_backpack_items($conn, $packing_list_id, $uid, $bid); + } + } } else { + // New Participant $stmt_in = $conn->prepare("INSERT INTO packing_list_carriers (packing_list_id, user_id, backpack_id) VALUES (?, ?, ?)"); $stmt_in->bind_param("iii", $packing_list_id, $uid, $bid); $stmt_in->execute(); - } - - // CLEANUP LOGIC: If backpack changed or removed - if ($old_backpack_id != $bid) { - // 1. Unparent all items that are inside the old containers (so they don't get deleted) - // Find all container items for this user - $stmt_find_containers = $conn->prepare("SELECT id FROM packing_list_items WHERE packing_list_id = ? AND carrier_user_id = ? AND (backpack_id IS NOT NULL OR backpack_compartment_id IS NOT NULL)"); - $stmt_find_containers->bind_param("ii", $packing_list_id, $uid); - $stmt_find_containers->execute(); - $res_cont = $stmt_find_containers->get_result(); - $container_ids = []; - while ($r = $res_cont->fetch_assoc()) $container_ids[] = $r['id']; - if (!empty($container_ids)) { - $ids_str = implode(',', $container_ids); - // Set parent to NULL for children of these containers - $conn->query("UPDATE packing_list_items SET parent_packing_list_item_id = NULL WHERE packing_list_id = $packing_list_id AND parent_packing_list_item_id IN ($ids_str)"); - - // 2. Delete the containers - $conn->query("DELETE FROM packing_list_items WHERE id IN ($ids_str)"); + if ($bid) { + sync_backpack_items($conn, $packing_list_id, $uid, $bid); } } - - // SYNC LOGIC (Only if new backpack assigned) - if ($bid && $old_backpack_id != $bid) { - sync_backpack_items($conn, $packing_list_id, $uid, $bid); + } else { + // User NOT checked -> Remove if existed + if ($was_participating) { + $conn->query("DELETE FROM packing_list_carriers WHERE packing_list_id = $packing_list_id AND user_id = $uid"); + // Cleanup Items: Delete all items carried by this user? + // Or move to unassigned? Let's move to unassigned (NULL) to be safe against data loss. + // But Containers (Backpacks) should be deleted. + + // 1. Delete Containers + cleanup_old_backpack_containers($conn, $packing_list_id, $uid); + + // 2. Move remaining items (loose items) to unassigned? + $conn->query("UPDATE packing_list_items SET carrier_user_id = NULL WHERE packing_list_id = $packing_list_id AND carrier_user_id = $uid"); } } } @@ -154,6 +158,26 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && $can_edit) { } } +function cleanup_old_backpack_containers($conn, $list_id, $user_id) { + // Find all container items for this user (backpacks or compartments) + $stmt = $conn->prepare("SELECT id FROM packing_list_items WHERE packing_list_id = ? AND carrier_user_id = ? AND (backpack_id IS NOT NULL OR backpack_compartment_id IS NOT NULL)"); + $stmt->bind_param("ii", $list_id, $user_id); + $stmt->execute(); + $res = $stmt->get_result(); + $container_ids = []; + while ($r = $res->fetch_assoc()) $container_ids[] = $r['id']; + + if (!empty($container_ids)) { + $ids_str = implode(',', $container_ids); + // Unparent children so they don't get deleted (or keep them and they get deleted? No, save content) + // Set parent to NULL for children of these containers + $conn->query("UPDATE packing_list_items SET parent_packing_list_item_id = NULL WHERE packing_list_id = $list_id AND parent_packing_list_item_id IN ($ids_str)"); + + // Delete containers + $conn->query("DELETE FROM packing_list_items WHERE id IN ($ids_str)"); + } +} + ?>
@@ -165,7 +189,7 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && $can_edit) { -
+
Basisdaten
@@ -180,35 +204,41 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && $can_edit) {
-
Rucksack-Zuweisung
+
Teilnehmer & Rucksäcke
-

Wähle hier, wer welchen Rucksack trägt. Bereits vergebene Rucksäcke werden ausgeblendet.

+

Wähle hier, wer mitkommt und welchen Rucksack er trägt.

+
+ Ein Rucksack wurde mehrfach ausgewählt! +
+ $my_current_bp_id, 'backpacks' => $user_backpacks ]; - - // Use helper to render the widget - echo '
'; - echo ''; - echo render_backpack_card_selector($user, $my_current_bp_id, $user_backpacks); - echo '
'; - endforeach; ?> +
+
+ id="part_"> + +
+
+ +
+
+
@@ -218,7 +248,7 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && $can_edit) {
Inhalt bearbeiten - +
@@ -228,4 +258,63 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && $can_edit) { + + \ No newline at end of file