console.log("Stock audit JS loaded"); // Helper function to format date function formatDate(dateString) { if (!dateString) return "-"; const date = new Date(dateString); const months = [ "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des", ]; const day = date.getDate().toString().padStart(2, "0"); const month = months[date.getMonth()]; const year = date.getFullYear(); const hours = date.getHours().toString().padStart(2, "0"); const minutes = date.getMinutes().toString().padStart(2, "0"); return `${day} ${month} ${year}, ${hours}:${minutes}`; } $(document).ready(function () { console.log("Initializing stock audit table..."); // Initialize Select2 without any event handlers $(".select2").select2({ placeholder: "Pilih...", allowClear: true, width: "100%", }); // Initialize Datepicker $(".datepicker").datepicker({ format: "yyyy-mm-dd", autoclose: true, todayHighlight: true, orientation: "bottom auto", language: "id", clearBtn: true, container: "body", }); const $table = $("#stock-audit-table"); const indexRoute = $table.data("route"); console.log("Table route:", indexRoute); let table = $table.DataTable({ processing: true, serverSide: true, language: { processing: '
Memproses...
', loadingRecords: "Memuat data...", zeroRecords: "Tidak ada data yang ditemukan", emptyTable: "Tidak ada data tersedia", }, ajax: { url: indexRoute, data: function (d) { d.dealer = $("#filter-dealer").val(); d.product = $("#filter-product").val(); d.change_type = $("#filter-change-type").val(); d.date = $("#filter-date").val(); console.log("Ajax data with ordering:", d); console.log("Order info:", d.order); console.log("Columns info:", d.columns); }, error: function (xhr, error, thrown) { console.error("Ajax error:", error); console.error("Response:", xhr.responseText); }, }, columns: [ { data: "DT_RowIndex", name: "DT_RowIndex", orderable: false, searchable: false, width: "5%", }, { data: "product_name", name: "product_name", orderable: true, }, { data: "dealer_name", name: "dealer_name", orderable: true, }, { data: "change_type", name: "change_type", orderable: true, }, { data: "quantity_change", name: "quantity_change", className: "text-center", orderable: true, }, { data: "stock_before_after", name: "stock_before_after", className: "text-center", orderable: true, }, { data: "source_info", name: "source_info", orderable: true, }, { data: "user_name", name: "user_name", orderable: true, }, { data: "created_at", name: "created_at", orderable: true, }, { data: "action", name: "action", orderable: false, searchable: false, width: "10%", }, ], order: [[8, "desc"]], // Order by created_at desc (column index 8) pageLength: 10, responsive: true, ordering: true, // Enable column ordering orderMulti: false, // Single column ordering only }); console.log("Table initialized:", table); // Add loading indicator for ordering table.on("processing.dt", function (e, settings, processing) { if (processing) { console.log("DataTable processing started (ordering/filtering)"); } else { console.log("DataTable processing finished"); } }); // Debug order events table.on("order.dt", function () { console.log("Order changed:", table.order()); }); // Manual modal close handlers $(document).on( "click", "#modal-close-btn, #modal-close-footer-btn", function () { console.log("Manual close button clicked"); $("#auditDetailModal").modal("hide"); } ); // Modal backdrop click handler $(document).on("click", "#auditDetailModal", function (e) { if (e.target === this) { console.log("Modal backdrop clicked"); $("#auditDetailModal").modal("hide"); } }); // ESC key handler $(document).on("keydown", function (e) { if (e.keyCode === 27 && $("#auditDetailModal").hasClass("show")) { console.log("ESC key pressed"); $("#auditDetailModal").modal("hide"); } }); // Modal hidden event handler $("#auditDetailModal").on("hidden.bs.modal", function () { console.log("Modal hidden"); // Reset modal content $("#modal-loading").show(); $("#modal-error").hide(); $("#modal-content").hide(); }); // Apply filters button - only way to trigger table reload $("#apply-filters").click(function () { console.log("Apply filters clicked, reloading table..."); console.log("Current filter values:", { dealer: $("#filter-dealer").val(), product: $("#filter-product").val(), change_type: $("#filter-change-type").val(), date: $("#filter-date").val(), }); table.ajax.reload(); }); // Allow Enter key to apply filters on datepicker $("#filter-date").keypress(function (e) { if (e.which == 13) { // Enter key console.log("Enter pressed on date filter, applying filters..."); table.ajax.reload(); } }); // Reset filters $("#reset-filters").click(function () { console.log("Resetting filters..."); // Reset select2 elements properly $("#filter-dealer").val(null).trigger("change.select2"); $("#filter-product").val(null).trigger("change.select2"); $("#filter-change-type").val(null).trigger("change.select2"); // Reset datepicker properly $("#filter-date").val("").datepicker("update"); console.log("Filters reset, values after reset:", { dealer: $("#filter-dealer").val(), product: $("#filter-product").val(), change_type: $("#filter-change-type").val(), date: $("#filter-date").val(), }); // Reload table after reset console.log("Reloading table after reset..."); table.ajax.reload(); }); }); window.showAuditDetail = function (id) { console.log("Showing audit detail for ID:", id); // Reset modal states first $("#modal-loading").show(); $("#modal-error").hide(); $("#modal-content").hide(); // Show modal $("#auditDetailModal").modal("show"); $.ajax({ url: `/warehouse/stock-audit/${id}/detail`, method: "GET", success: function (response) { console.log("Detail response:", response); $("#modal-loading").hide(); if (response.success) { populateModalContent(response.data, response.source_detail); $("#modal-content").show(); } else { $("#error-message").text(response.message); $("#modal-error").show(); } }, error: function (xhr) { console.error("Detail AJAX error:", xhr); $("#modal-loading").hide(); $("#error-message").text("Gagal memuat detail audit"); $("#modal-error").show(); }, }); }; function populateModalContent(audit, sourceDetail) { console.log("Populating modal content:", audit); // Populate basic stock information $("#product-name").text(audit.stock.product.name); $("#dealer-name").text(audit.stock.dealer.name); $("#previous-quantity").text(audit.previous_quantity); $("#new-quantity").text(audit.new_quantity); $("#user-name").text(audit.user ? audit.user.name : "-"); $("#created-at").text(audit.created_at_formatted); $("#description").text(audit.description || "-"); // Set quantity change with styling let quantityChangeClass = ""; let quantityChangeSign = ""; if (audit.quantity_change > 0) { quantityChangeClass = "text-success"; quantityChangeSign = "+"; } else if (audit.quantity_change < 0) { quantityChangeClass = "text-danger"; quantityChangeSign = ""; } else { quantityChangeClass = "text-muted"; quantityChangeSign = ""; } $("#quantity-change").html( `${quantityChangeSign}${audit.quantity_change}` ); // Set change type with styling let changeTypeClass = ""; switch (audit.change_type) { case "increase": changeTypeClass = "text-success"; break; case "decrease": changeTypeClass = "text-danger"; break; case "adjustment": changeTypeClass = "text-warning"; break; default: changeTypeClass = "text-muted"; } $("#change-type").html( `${audit.change_type_label}` ); // Handle source detail if (sourceDetail) { $("#source-detail").show(); if (sourceDetail.type === "mutation") { let mutation = sourceDetail.data; $("#source-title").text( `Mutasi Stock: ${mutation.mutation_number}` ); let mutationContent = `
Dari Dealer: ${ mutation.from_dealer ? mutation.from_dealer.name : "-" }
Ke Dealer: ${ mutation.to_dealer ? mutation.to_dealer.name : "-" }
Status: ${mutation.status}
Diminta oleh: ${ mutation.requested_by ? mutation.requested_by.name : "-" }
Disetujui oleh: ${ mutation.approved_by ? mutation.approved_by.name : "-" }
Tanggal Disetujui: ${ mutation.approved_at_formatted || "-" }
`; $("#source-content").html(mutationContent); } else if (sourceDetail.type === "opname") { let opname = sourceDetail.data; $("#source-title").text("Opname"); let opnameContent = `
Dealer: ${opname.dealer ? opname.dealer.name : "-"}
User: ${opname.user ? opname.user.name : "-"}
Status: ${opname.status || "-"}
`; $("#source-content").html(opnameContent); } } else { $("#source-detail").hide(); } }