diff --git a/app/Http/Controllers/WarehouseManagement/MutationsController.php b/app/Http/Controllers/WarehouseManagement/MutationsController.php
index 395b4fe..97222a8 100755
--- a/app/Http/Controllers/WarehouseManagement/MutationsController.php
+++ b/app/Http/Controllers/WarehouseManagement/MutationsController.php
@@ -18,20 +18,13 @@ class MutationsController extends Controller
public function index(Request $request)
{
$menu = Menu::where('link','mutations.index')->first();
+ $dealers = Dealer::all();
if ($request->ajax()) {
- Log::info('Mutations DataTables request', [
- 'order' => $request->get('order'),
- 'columns' => $request->get('columns'),
- 'user_id' => auth()->id()
- ]);
-
// Use a more specific query to avoid join conflicts
$data = Mutation::query()
->with(['fromDealer', 'toDealer', 'requestedBy.role', 'approvedBy.role', 'receivedBy.role'])
- ->select([
- 'mutations.*'
- ]); // Remove default ordering to let DataTables handle it
+ ->select(['mutations.*']);
// Filter berdasarkan dealer jika user bukan admin
if (auth()->user()->dealer_id) {
@@ -40,6 +33,35 @@ class MutationsController extends Controller
->orWhere('to_dealer_id', auth()->user()->dealer_id);
});
}
+
+ // Filter berdasarkan dealer yang dipilih
+ if ($request->filled('dealer_filter')) {
+ $data->where(function($query) use ($request) {
+ $query->where('from_dealer_id', $request->dealer_filter)
+ ->orWhere('to_dealer_id', $request->dealer_filter);
+ });
+ }
+
+ // Filter berdasarkan tanggal
+ if ($request->filled('date_from')) {
+ try {
+ $dateFrom = \Carbon\Carbon::parse($request->date_from)->format('Y-m-d');
+ $data->whereDate('mutations.created_at', '>=', $dateFrom);
+ } catch (\Exception $e) {
+ // Fallback to original format
+ $data->whereDate('mutations.created_at', '>=', $request->date_from);
+ }
+ }
+
+ if ($request->filled('date_to')) {
+ try {
+ $dateTo = \Carbon\Carbon::parse($request->date_to)->format('Y-m-d');
+ $data->whereDate('mutations.created_at', '<=', $dateTo);
+ } catch (\Exception $e) {
+ // Fallback to original format
+ $data->whereDate('mutations.created_at', '<=', $request->date_to);
+ }
+ }
return DataTables::of($data)
->addIndexColumn()
@@ -134,7 +156,7 @@ class MutationsController extends Controller
->make(true);
}
- return view('warehouse_management.mutations.index', compact('menu'));
+ return view('warehouse_management.mutations.index', compact('menu', 'dealers'));
}
public function create()
diff --git a/app/Http/Controllers/WarehouseManagement/OpnamesController.php b/app/Http/Controllers/WarehouseManagement/OpnamesController.php
index 62a263e..333f2fb 100755
--- a/app/Http/Controllers/WarehouseManagement/OpnamesController.php
+++ b/app/Http/Controllers/WarehouseManagement/OpnamesController.php
@@ -22,10 +22,38 @@ class OpnamesController extends Controller
{
public function index(Request $request){
$menu = Menu::where('link','opnames.index')->first();
+ $dealers = Dealer::all();
if($request->ajax()){
- $data = Opname::with('user','dealer')
- ->orderBy('created_at', 'desc')
- ->get();
+ $data = Opname::query()
+ ->with('user','dealer')
+ ->orderBy('created_at', 'desc');
+
+ // Filter berdasarkan dealer yang dipilih
+ if ($request->filled('dealer_filter')) {
+ $data->where('dealer_id', $request->dealer_filter);
+ }
+
+ // Filter berdasarkan tanggal
+ if ($request->filled('date_from')) {
+ try {
+ $dateFrom = \Carbon\Carbon::parse($request->date_from)->format('Y-m-d');
+ $data->whereDate('opname_date', '>=', $dateFrom);
+ } catch (\Exception $e) {
+ // Fallback to original format
+ $data->whereDate('opname_date', '>=', $request->date_from);
+ }
+ }
+
+ if ($request->filled('date_to')) {
+ try {
+ $dateTo = \Carbon\Carbon::parse($request->date_to)->format('Y-m-d');
+ $data->whereDate('opname_date', '<=', $dateTo);
+ } catch (\Exception $e) {
+ // Fallback to original format
+ $data->whereDate('opname_date', '<=', $request->date_to);
+ }
+ }
+
return DataTables::of($data)
->addColumn('user_name', function ($row){
return $row->user ? $row->user->name : '-';
@@ -59,7 +87,7 @@ class OpnamesController extends Controller
->make(true);
}
- return view('warehouse_management.opnames.index');
+ return view('warehouse_management.opnames.index', compact('dealers'));
}
public function create(){
diff --git a/public/js/warehouse_management/mutations/index.js b/public/js/warehouse_management/mutations/index.js
index 53943cc..0784742 100755
--- a/public/js/warehouse_management/mutations/index.js
+++ b/public/js/warehouse_management/mutations/index.js
@@ -15,7 +15,7 @@
\**************************************************************/
/***/ (() => {
-eval("$(document).ready(function () {\n console.log(\"Mutations index.js loaded\"); // Check if DataTables is available\n\n if (typeof $.fn.DataTable === \"undefined\") {\n console.error(\"DataTables not available!\");\n return;\n } // Wait for DOM to be fully ready\n\n\n setTimeout(function () {\n initializeDataTable();\n }, 100);\n});\n\nfunction initializeDataTable() {\n console.log(\"Initializing DataTable...\"); // Destroy existing table if any\n\n if ($.fn.DataTable.isDataTable(\"#mutations-table\")) {\n $(\"#mutations-table\").DataTable().destroy();\n } // Initialize DataTable\n\n\n var table = $(\"#mutations-table\").DataTable({\n processing: true,\n serverSide: true,\n destroy: true,\n ajax: {\n url: $(\"#mutations-table\").data(\"url\"),\n type: \"GET\",\n data: function data(d) {\n console.log(\"DataTables request data:\", d);\n console.log(\"Order info:\", d.order);\n console.log(\"Columns info:\", d.columns);\n return d;\n },\n error: function error(xhr, _error, code) {\n console.error(\"DataTables AJAX error:\", _error, code);\n console.error(\"Response:\", xhr.responseText);\n }\n },\n columnDefs: [{\n targets: 0,\n // No. column\n width: \"5%\"\n }, {\n targets: 8,\n // Action column\n width: \"20%\",\n className: \"text-center\"\n }, {\n targets: [6, 7],\n // Total Items and Status columns\n className: \"text-center\"\n }],\n columns: [{\n data: \"DT_RowIndex\",\n name: \"DT_RowIndex\",\n orderable: false,\n searchable: false\n }, {\n data: \"mutation_number\",\n name: \"mutation_number\",\n orderable: true\n }, {\n data: \"created_at\",\n name: \"created_at\",\n orderable: true\n }, {\n data: \"from_dealer\",\n name: \"from_dealer\",\n orderable: true\n }, {\n data: \"to_dealer\",\n name: \"to_dealer\",\n orderable: true\n }, {\n data: \"requested_by\",\n name: \"requested_by\",\n orderable: true\n }, {\n data: \"total_items\",\n name: \"total_items\",\n orderable: true\n }, {\n data: \"status\",\n name: \"status\",\n orderable: true\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }],\n order: [[1, \"desc\"]],\n // Order by mutation_number desc (which follows ID order)\n pageLength: 10,\n responsive: true,\n ordering: true,\n // Enable column ordering\n orderMulti: false // Single column ordering only\n\n }); // Debug ordering events\n\n table.on(\"order.dt\", function () {\n console.log(\"Order changed:\", table.order());\n }); // Add loading indicator for ordering\n\n table.on(\"processing.dt\", function (e, settings, processing) {\n if (processing) {\n console.log(\"DataTable processing started (ordering/filtering)\");\n } else {\n console.log(\"DataTable processing finished\");\n }\n }); // Manual click handler for column headers (fallback)\n\n $(\"#mutations-table thead th\").on(\"click\", function () {\n var columnIndex = $(this).index();\n console.log(\"Column header clicked:\", columnIndex, $(this).text()); // Skip if it's the first (No.) or last (Action) column\n\n if (columnIndex === 0 || columnIndex === 8) {\n console.log(\"Non-sortable column clicked, ignoring\");\n return;\n } // Check if DataTables is handling the click\n\n\n if ($(this).hasClass(\"sorting\") || $(this).hasClass(\"sorting_asc\") || $(this).hasClass(\"sorting_desc\")) {\n console.log(\"DataTables should handle this click\");\n } else {\n console.log(\"DataTables not handling click, manual trigger needed\"); // Force DataTables to handle the ordering\n\n table.order([columnIndex, \"asc\"]).draw();\n }\n }); // Handle Cancel Button Click with SweetAlert\n\n $(document).on(\"click\", \".btn-cancel\", function () {\n var mutationId = $(this).data(\"id\");\n\n if (typeof Swal !== \"undefined\") {\n Swal.fire({\n title: \"Batalkan Mutasi?\",\n text: \"Apakah Anda yakin ingin membatalkan mutasi ini?\",\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#3085d6\",\n confirmButtonText: \"Ya, Batalkan\",\n cancelButtonText: \"Batal\"\n }).then(function (result) {\n if (result.isConfirmed) {\n cancelMutation(mutationId);\n }\n });\n } else {\n if (confirm(\"Apakah Anda yakin ingin membatalkan mutasi ini?\")) {\n cancelMutation(mutationId);\n }\n }\n }); // Handle form submissions with loading state\n\n $(document).on(\"submit\", \".approve-form\", function () {\n $(this).find('button[type=\"submit\"]').prop(\"disabled\", true).html(\"Memproses...\");\n }); // Validate quantity approved in receive modal\n\n $(document).on(\"input\", 'input[name*=\"quantity_approved\"]', function () {\n var maxValue = parseFloat($(this).attr(\"max\"));\n var currentValue = parseFloat($(this).val());\n\n if (maxValue && currentValue > maxValue) {\n $(this).val(maxValue);\n $(this).addClass(\"is-invalid\");\n\n if (!$(this).siblings(\".invalid-feedback\").length) {\n $(this).after('
Quantity tidak boleh melebihi yang diminta
');\n }\n } else {\n $(this).removeClass(\"is-invalid\");\n $(this).siblings(\".invalid-feedback\").remove();\n }\n });\n}\n\nfunction cancelMutation(mutationId) {\n $.ajax({\n url: \"/warehouse/mutations/\" + mutationId + \"/cancel\",\n type: \"POST\",\n data: {\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success(response) {\n if (typeof Swal !== \"undefined\") {\n Swal.fire({\n title: \"Berhasil!\",\n text: \"Mutasi berhasil dibatalkan\",\n icon: \"success\",\n timer: 2000,\n showConfirmButton: false\n });\n } else {\n alert(\"Mutasi berhasil dibatalkan\");\n } // Get table instance\n\n\n var table = $(\"#mutations-table\").DataTable();\n table.ajax.reload();\n },\n error: function error(xhr) {\n var _xhr$responseJSON;\n\n var errorMsg = ((_xhr$responseJSON = xhr.responseJSON) === null || _xhr$responseJSON === void 0 ? void 0 : _xhr$responseJSON.message) || \"Gagal membatalkan mutasi\";\n\n if (typeof Swal !== \"undefined\") {\n Swal.fire({\n title: \"Error!\",\n text: errorMsg,\n icon: \"error\"\n });\n } else {\n alert(\"Error: \" + errorMsg);\n }\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsImNvbnNvbGUiLCJsb2ciLCJmbiIsIkRhdGFUYWJsZSIsImVycm9yIiwic2V0VGltZW91dCIsImluaXRpYWxpemVEYXRhVGFibGUiLCJpc0RhdGFUYWJsZSIsImRlc3Ryb3kiLCJ0YWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsInVybCIsImRhdGEiLCJ0eXBlIiwiZCIsIm9yZGVyIiwiY29sdW1ucyIsInhociIsImNvZGUiLCJyZXNwb25zZVRleHQiLCJjb2x1bW5EZWZzIiwidGFyZ2V0cyIsIndpZHRoIiwiY2xhc3NOYW1lIiwibmFtZSIsIm9yZGVyYWJsZSIsInNlYXJjaGFibGUiLCJwYWdlTGVuZ3RoIiwicmVzcG9uc2l2ZSIsIm9yZGVyaW5nIiwib3JkZXJNdWx0aSIsIm9uIiwiZSIsInNldHRpbmdzIiwiY29sdW1uSW5kZXgiLCJpbmRleCIsInRleHQiLCJoYXNDbGFzcyIsImRyYXciLCJtdXRhdGlvbklkIiwiU3dhbCIsImZpcmUiLCJ0aXRsZSIsImljb24iLCJzaG93Q2FuY2VsQnV0dG9uIiwiY29uZmlybUJ1dHRvbkNvbG9yIiwiY2FuY2VsQnV0dG9uQ29sb3IiLCJjb25maXJtQnV0dG9uVGV4dCIsImNhbmNlbEJ1dHRvblRleHQiLCJ0aGVuIiwicmVzdWx0IiwiaXNDb25maXJtZWQiLCJjYW5jZWxNdXRhdGlvbiIsImNvbmZpcm0iLCJmaW5kIiwicHJvcCIsImh0bWwiLCJtYXhWYWx1ZSIsInBhcnNlRmxvYXQiLCJhdHRyIiwiY3VycmVudFZhbHVlIiwidmFsIiwiYWRkQ2xhc3MiLCJzaWJsaW5ncyIsImxlbmd0aCIsImFmdGVyIiwicmVtb3ZlQ2xhc3MiLCJyZW1vdmUiLCJfdG9rZW4iLCJzdWNjZXNzIiwicmVzcG9uc2UiLCJ0aW1lciIsInNob3dDb25maXJtQnV0dG9uIiwiYWxlcnQiLCJyZWxvYWQiLCJlcnJvck1zZyIsInJlc3BvbnNlSlNPTiIsIm1lc3NhZ2UiXSwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3dhcmVob3VzZV9tYW5hZ2VtZW50L211dGF0aW9ucy9pbmRleC5qcz83YTRlIl0sInNvdXJjZXNDb250ZW50IjpbIiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZyhcIk11dGF0aW9ucyBpbmRleC5qcyBsb2FkZWRcIik7XG5cbiAgICAvLyBDaGVjayBpZiBEYXRhVGFibGVzIGlzIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgJC5mbi5EYXRhVGFibGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkRhdGFUYWJsZXMgbm90IGF2YWlsYWJsZSFcIik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXYWl0IGZvciBET00gdG8gYmUgZnVsbHkgcmVhZHlcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5pdGlhbGl6ZURhdGFUYWJsZSgpO1xuICAgIH0sIDEwMCk7XG59KTtcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZURhdGFUYWJsZSgpIHtcbiAgICBjb25zb2xlLmxvZyhcIkluaXRpYWxpemluZyBEYXRhVGFibGUuLi5cIik7XG5cbiAgICAvLyBEZXN0cm95IGV4aXN0aW5nIHRhYmxlIGlmIGFueVxuICAgIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZShcIiNtdXRhdGlvbnMtdGFibGVcIikpIHtcbiAgICAgICAgJChcIiNtdXRhdGlvbnMtdGFibGVcIikuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgRGF0YVRhYmxlXG4gICAgdmFyIHRhYmxlID0gJChcIiNtdXRhdGlvbnMtdGFibGVcIikuRGF0YVRhYmxlKHtcbiAgICAgICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICAgICAgc2VydmVyU2lkZTogdHJ1ZSxcbiAgICAgICAgZGVzdHJveTogdHJ1ZSxcbiAgICAgICAgYWpheDoge1xuICAgICAgICAgICAgdXJsOiAkKFwiI211dGF0aW9ucy10YWJsZVwiKS5kYXRhKFwidXJsXCIpLFxuICAgICAgICAgICAgdHlwZTogXCJHRVRcIixcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEYXRhVGFibGVzIHJlcXVlc3QgZGF0YTpcIiwgZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJPcmRlciBpbmZvOlwiLCBkLm9yZGVyKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNvbHVtbnMgaW5mbzpcIiwgZC5jb2x1bW5zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhociwgZXJyb3IsIGNvZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRGF0YVRhYmxlcyBBSkFYIGVycm9yOlwiLCBlcnJvciwgY29kZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJlc3BvbnNlOlwiLCB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNvbHVtbkRlZnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzOiAwLCAvLyBOby4gY29sdW1uXG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiNSVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0czogOCwgLy8gQWN0aW9uIGNvbHVtblxuICAgICAgICAgICAgICAgIHdpZHRoOiBcIjIwJVwiLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ0ZXh0LWNlbnRlclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzOiBbNiwgN10sIC8vIFRvdGFsIEl0ZW1zIGFuZCBTdGF0dXMgY29sdW1uc1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ0ZXh0LWNlbnRlclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwiRFRfUm93SW5kZXhcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkRUX1Jvd0luZGV4XCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJtdXRhdGlvbl9udW1iZXJcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm11dGF0aW9uX251bWJlclwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcImZyb21fZGVhbGVyXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJmcm9tX2RlYWxlclwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJ0b19kZWFsZXJcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInRvX2RlYWxlclwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJyZXF1ZXN0ZWRfYnlcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInJlcXVlc3RlZF9ieVwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJ0b3RhbF9pdGVtc1wiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwidG90YWxfaXRlbXNcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwic3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJzdGF0dXNcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwiYWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3JkZXI6IFtbMSwgXCJkZXNjXCJdXSwgLy8gT3JkZXIgYnkgbXV0YXRpb25fbnVtYmVyIGRlc2MgKHdoaWNoIGZvbGxvd3MgSUQgb3JkZXIpXG4gICAgICAgIHBhZ2VMZW5ndGg6IDEwLFxuICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgICBvcmRlcmluZzogdHJ1ZSwgLy8gRW5hYmxlIGNvbHVtbiBvcmRlcmluZ1xuICAgICAgICBvcmRlck11bHRpOiBmYWxzZSwgLy8gU2luZ2xlIGNvbHVtbiBvcmRlcmluZyBvbmx5XG4gICAgfSk7XG5cbiAgICAvLyBEZWJ1ZyBvcmRlcmluZyBldmVudHNcbiAgICB0YWJsZS5vbihcIm9yZGVyLmR0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJPcmRlciBjaGFuZ2VkOlwiLCB0YWJsZS5vcmRlcigpKTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBsb2FkaW5nIGluZGljYXRvciBmb3Igb3JkZXJpbmdcbiAgICB0YWJsZS5vbihcInByb2Nlc3NpbmcuZHRcIiwgZnVuY3Rpb24gKGUsIHNldHRpbmdzLCBwcm9jZXNzaW5nKSB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZSBwcm9jZXNzaW5nIHN0YXJ0ZWQgKG9yZGVyaW5nL2ZpbHRlcmluZylcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZSBwcm9jZXNzaW5nIGZpbmlzaGVkXCIpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNYW51YWwgY2xpY2sgaGFuZGxlciBmb3IgY29sdW1uIGhlYWRlcnMgKGZhbGxiYWNrKVxuICAgICQoXCIjbXV0YXRpb25zLXRhYmxlIHRoZWFkIHRoXCIpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29sdW1uSW5kZXggPSAkKHRoaXMpLmluZGV4KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ29sdW1uIGhlYWRlciBjbGlja2VkOlwiLCBjb2x1bW5JbmRleCwgJCh0aGlzKS50ZXh0KCkpO1xuXG4gICAgICAgIC8vIFNraXAgaWYgaXQncyB0aGUgZmlyc3QgKE5vLikgb3IgbGFzdCAoQWN0aW9uKSBjb2x1bW5cbiAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSAwIHx8IGNvbHVtbkluZGV4ID09PSA4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vbi1zb3J0YWJsZSBjb2x1bW4gY2xpY2tlZCwgaWdub3JpbmdcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBEYXRhVGFibGVzIGlzIGhhbmRsaW5nIHRoZSBjbGlja1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAkKHRoaXMpLmhhc0NsYXNzKFwic29ydGluZ1wiKSB8fFxuICAgICAgICAgICAgJCh0aGlzKS5oYXNDbGFzcyhcInNvcnRpbmdfYXNjXCIpIHx8XG4gICAgICAgICAgICAkKHRoaXMpLmhhc0NsYXNzKFwic29ydGluZ19kZXNjXCIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJEYXRhVGFibGVzIHNob3VsZCBoYW5kbGUgdGhpcyBjbGlja1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGF0YVRhYmxlcyBub3QgaGFuZGxpbmcgY2xpY2ssIG1hbnVhbCB0cmlnZ2VyIG5lZWRlZFwiKTtcbiAgICAgICAgICAgIC8vIEZvcmNlIERhdGFUYWJsZXMgdG8gaGFuZGxlIHRoZSBvcmRlcmluZ1xuICAgICAgICAgICAgdGFibGUub3JkZXIoW2NvbHVtbkluZGV4LCBcImFzY1wiXSkuZHJhdygpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgQ2FuY2VsIEJ1dHRvbiBDbGljayB3aXRoIFN3ZWV0QWxlcnRcbiAgICAkKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmJ0bi1jYW5jZWxcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbXV0YXRpb25JZCA9ICQodGhpcykuZGF0YShcImlkXCIpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgU3dhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJCYXRhbGthbiBNdXRhc2k/XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCJBcGFrYWggQW5kYSB5YWtpbiBpbmdpbiBtZW1iYXRhbGthbiBtdXRhc2kgaW5pP1wiLFxuICAgICAgICAgICAgICAgIGljb246IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiNkMzNcIixcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjMzA4NWQ2XCIsXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWWEsIEJhdGFsa2FuXCIsXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogXCJCYXRhbFwiLFxuICAgICAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgICAgICBjYW5jZWxNdXRhdGlvbihtdXRhdGlvbklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb25maXJtKFwiQXBha2FoIEFuZGEgeWFraW4gaW5naW4gbWVtYmF0YWxrYW4gbXV0YXNpIGluaT9cIikpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxNdXRhdGlvbihtdXRhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGZvcm0gc3VibWlzc2lvbnMgd2l0aCBsb2FkaW5nIHN0YXRlXG4gICAgJChkb2N1bWVudCkub24oXCJzdWJtaXRcIiwgXCIuYXBwcm92ZS1mb3JtXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgLmZpbmQoJ2J1dHRvblt0eXBlPVwic3VibWl0XCJdJylcbiAgICAgICAgICAgIC5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSlcbiAgICAgICAgICAgIC5odG1sKFwiTWVtcHJvc2VzLi4uXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGUgcXVhbnRpdHkgYXBwcm92ZWQgaW4gcmVjZWl2ZSBtb2RhbFxuICAgICQoZG9jdW1lbnQpLm9uKFwiaW5wdXRcIiwgJ2lucHV0W25hbWUqPVwicXVhbnRpdHlfYXBwcm92ZWRcIl0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXhWYWx1ZSA9IHBhcnNlRmxvYXQoJCh0aGlzKS5hdHRyKFwibWF4XCIpKTtcbiAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHBhcnNlRmxvYXQoJCh0aGlzKS52YWwoKSk7XG5cbiAgICAgICAgaWYgKG1heFZhbHVlICYmIGN1cnJlbnRWYWx1ZSA+IG1heFZhbHVlKSB7XG4gICAgICAgICAgICAkKHRoaXMpLnZhbChtYXhWYWx1ZSk7XG4gICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKFwiaXMtaW52YWxpZFwiKTtcbiAgICAgICAgICAgIGlmICghJCh0aGlzKS5zaWJsaW5ncyhcIi5pbnZhbGlkLWZlZWRiYWNrXCIpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICQodGhpcykuYWZ0ZXIoXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlF1YW50aXR5IHRpZGFrIGJvbGVoIG1lbGViaWhpIHlhbmcgZGltaW50YTwvZGl2PidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcyhcImlzLWludmFsaWRcIik7XG4gICAgICAgICAgICAkKHRoaXMpLnNpYmxpbmdzKFwiLmludmFsaWQtZmVlZGJhY2tcIikucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsTXV0YXRpb24obXV0YXRpb25JZCkge1xuICAgICQuYWpheCh7XG4gICAgICAgIHVybDogXCIvd2FyZWhvdXNlL211dGF0aW9ucy9cIiArIG11dGF0aW9uSWQgKyBcIi9jYW5jZWxcIixcbiAgICAgICAgdHlwZTogXCJQT1NUXCIsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIF90b2tlbjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgU3dhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIkJlcmhhc2lsIVwiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBcIk11dGFzaSBiZXJoYXNpbCBkaWJhdGFsa2FuXCIsXG4gICAgICAgICAgICAgICAgICAgIGljb246IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICB0aW1lcjogMjAwMCxcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbGVydChcIk11dGFzaSBiZXJoYXNpbCBkaWJhdGFsa2FuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IHRhYmxlIGluc3RhbmNlXG4gICAgICAgICAgICB2YXIgdGFibGUgPSAkKFwiI211dGF0aW9ucy10YWJsZVwiKS5EYXRhVGFibGUoKTtcbiAgICAgICAgICAgIHRhYmxlLmFqYXgucmVsb2FkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JNc2cgPVxuICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZUpTT04/Lm1lc3NhZ2UgfHwgXCJHYWdhbCBtZW1iYXRhbGthbiBtdXRhc2lcIjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgU3dhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIkVycm9yIVwiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZyxcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbGVydChcIkVycm9yOiBcIiArIGVycm9yTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUFBLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBWTtFQUMxQkMsT0FBTyxDQUFDQyxHQUFSLENBQVksMkJBQVosRUFEMEIsQ0FHMUI7O0VBQ0EsSUFBSSxPQUFPSixDQUFDLENBQUNLLEVBQUYsQ0FBS0MsU0FBWixLQUEwQixXQUE5QixFQUEyQztJQUN2Q0gsT0FBTyxDQUFDSSxLQUFSLENBQWMsMkJBQWQ7SUFDQTtFQUNILENBUHlCLENBUzFCOzs7RUFDQUMsVUFBVSxDQUFDLFlBQVk7SUFDbkJDLG1CQUFtQjtFQUN0QixDQUZTLEVBRVAsR0FGTyxDQUFWO0FBR0gsQ0FiRDs7QUFlQSxTQUFTQSxtQkFBVCxHQUErQjtFQUMzQk4sT0FBTyxDQUFDQyxHQUFSLENBQVksMkJBQVosRUFEMkIsQ0FHM0I7O0VBQ0EsSUFBSUosQ0FBQyxDQUFDSyxFQUFGLENBQUtDLFNBQUwsQ0FBZUksV0FBZixDQUEyQixrQkFBM0IsQ0FBSixFQUFvRDtJQUNoRFYsQ0FBQyxDQUFDLGtCQUFELENBQUQsQ0FBc0JNLFNBQXRCLEdBQWtDSyxPQUFsQztFQUNILENBTjBCLENBUTNCOzs7RUFDQSxJQUFJQyxLQUFLLEdBQUdaLENBQUMsQ0FBQyxrQkFBRCxDQUFELENBQXNCTSxTQUF0QixDQUFnQztJQUN4Q08sVUFBVSxFQUFFLElBRDRCO0lBRXhDQyxVQUFVLEVBQUUsSUFGNEI7SUFHeENILE9BQU8sRUFBRSxJQUgrQjtJ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VSxPQUFPLEVBQUUsaUJBQVVDLFFBQVYsRUFBb0I7TUFDekIsSUFBSSxPQUFPOUIsSUFBUCxLQUFnQixXQUFwQixFQUFpQztRQUM3QkEsSUFBSSxDQUFDQyxJQUFMLENBQVU7VUFDTkMsS0FBSyxFQUFFLFdBREQ7VUFFTk4sSUFBSSxFQUFFLDRCQUZBO1VBR05PLElBQUksRUFBRSxTQUhBO1VBSU40QixLQUFLLEVBQUUsSUFKRDtVQUtOQyxpQkFBaUIsRUFBRTtRQUxiLENBQVY7TUFPSCxDQVJELE1BUU87UUFDSEMsS0FBSyxDQUFDLDRCQUFELENBQUw7TUFDSCxDQVh3QixDQVl6Qjs7O01BQ0EsSUFBSWxFLEtBQUssR0FBR1osQ0FBQyxDQUFDLGtCQUFELENBQUQsQ0FBc0JNLFNBQXRCLEVBQVo7TUFDQU0sS0FBSyxDQUFDRyxJQUFOLENBQVdnRSxNQUFYO0lBQ0gsQ0FyQkU7SUFzQkh4RSxLQUFLLEVBQUUsZUFBVWUsR0FBVixFQUFlO01BQUE7O01BQ2xCLElBQUkwRCxRQUFRLEdBQ1Isc0JBQUExRCxHQUFHLENBQUMyRCxZQUFKLHdFQUFrQkMsT0FBbEIsS0FBNkIsMEJBRGpDOztNQUVBLElBQUksT0FBT3JDLElBQVAsS0FBZ0IsV0FBcEIsRUFBaUM7UUFDN0JBLElBQUksQ0FBQ0MsSUFBTCxDQUFVO1VBQ05DLEtBQUssRUFBRSxRQUREO1VBRU5OLElBQUksRUFBRXVDLFFBRkE7VUFHTmhDLElBQUksRUFBRTtRQUhBLENBQVY7TUFLSCxDQU5ELE1BTU87UUFDSDhCLEtBQUssQ0FBQyxZQUFZRSxRQUFiLENBQUw7TUFDSDtJQUNKO0VBbENFLENBQVA7QUFvQ0giLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvbXV0YXRpb25zL2luZGV4LmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/mutations/index.js\n");
+eval("$(document).ready(function () {\n console.log(\"Mutations index.js loaded\"); // Check if DataTables is available\n\n if (typeof $.fn.DataTable === \"undefined\") {\n console.error(\"DataTables not available!\");\n return;\n } // Initialize components\n\n\n initializeSelect2();\n initializeDatepickers(); // Wait for DOM to be fully ready\n\n setTimeout(function () {\n initializeDataTable();\n }, 100);\n});\n\nfunction initializeSelect2() {\n console.log(\"Initializing Select2...\"); // Initialize Select2 for dealer filter\n\n if (typeof $.fn.select2 !== \"undefined\") {\n $(\"#dealer_filter\").select2({\n placeholder: \"Pilih Dealer\",\n allowClear: false,\n width: \"100%\",\n dropdownAutoWidth: true,\n minimumResultsForSearch: 5 // Show search box if more than 5 options\n\n });\n } else {\n console.warn(\"Select2 not available, using regular select\");\n }\n}\n\nfunction initializeDatepickers() {\n console.log(\"Initializing datepickers...\"); // Initialize start date picker\n\n $(\"#date_from\").datepicker({\n dateFormat: \"yy-mm-dd\",\n changeMonth: true,\n changeYear: true,\n maxDate: new Date(),\n yearRange: \"-5:+0\",\n onSelect: function onSelect(selectedDate) {\n console.log(\"Start date selected:\", selectedDate);\n enableEndDatePicker(selectedDate);\n $(this).datepicker(\"hide\");\n },\n onClose: function onClose(selectedDate) {\n if (selectedDate) {\n console.log(\"Start date closed with value:\", selectedDate);\n enableEndDatePicker(selectedDate);\n }\n }\n }); // Initialize end date picker (initially disabled)\n\n initializeEndDatePicker(); // Initially disable end date input\n\n $(\"#date_to\").prop(\"disabled\", true); // Add calendar icons\n\n addCalendarIcons(); // Setup calendar icon click handlers\n\n setupIconClickHandlers(); // Backup: Listen to change event\n\n setupChangeEventHandlers();\n}\n\nfunction enableEndDatePicker(startDate) {\n console.log(\"Enabling end date picker with min date:\", startDate); // Enable the input\n\n $(\"#date_to\").prop(\"disabled\", false); // Destroy existing datepicker\n\n $(\"#date_to\").datepicker(\"destroy\"); // Re-initialize with new minDate\n\n $(\"#date_to\").datepicker({\n dateFormat: \"yy-mm-dd\",\n changeMonth: true,\n changeYear: true,\n maxDate: new Date(),\n yearRange: \"-5:+0\",\n minDate: new Date(startDate),\n // Convert to Date object for proper comparison\n onSelect: function onSelect(selectedDate) {\n console.log(\"End date selected:\", selectedDate);\n $(this).datepicker(\"hide\");\n }\n });\n console.log(\"End date picker enabled with minDate:\", startDate);\n}\n\nfunction initializeEndDatePicker() {\n $(\"#date_to\").datepicker({\n dateFormat: \"yy-mm-dd\",\n changeMonth: true,\n changeYear: true,\n maxDate: new Date(),\n yearRange: \"-5:+0\",\n onSelect: function onSelect(selectedDate) {\n console.log(\"End date selected:\", selectedDate);\n $(this).datepicker(\"hide\");\n }\n });\n}\n\nfunction addCalendarIcons() {\n // Remove any existing icons first\n $(\".input-icon\").remove(); // Add calendar icons with just the classes, no inline styles\n\n var iconHtml = '';\n $(\"#date_from\").after(iconHtml);\n $(\"#date_to\").after(iconHtml); // Ensure parent containers have relative positioning\n\n $(\"#date_from, #date_to\").closest(\".form-group\").css(\"position\", \"relative\");\n}\n\nfunction setupIconClickHandlers() {\n $(document).on(\"click\", \".input-icon\", function () {\n var input = $(this).prev(\"input\");\n\n if (!input.prop(\"disabled\")) {\n input.datepicker(\"show\");\n }\n });\n}\n\nfunction setupChangeEventHandlers() {\n $(\"#date_from\").on(\"change\", function () {\n var selectedDate = $(this).val();\n\n if (selectedDate) {\n console.log(\"Start date change event:\", selectedDate);\n enableEndDatePicker(selectedDate);\n }\n });\n}\n\nfunction initializeDataTable() {\n console.log(\"Initializing DataTable...\"); // Destroy existing table if any\n\n if ($.fn.DataTable.isDataTable(\"#mutations-table\")) {\n $(\"#mutations-table\").DataTable().destroy();\n } // Initialize DataTable\n\n\n var table = $(\"#mutations-table\").DataTable({\n processing: true,\n serverSide: true,\n destroy: true,\n ajax: {\n url: $(\"#mutations-table\").data(\"url\"),\n type: \"GET\",\n data: function data(d) {\n // Add filter parameters\n d.dealer_filter = $(\"#dealer_filter\").val();\n d.date_from = $(\"#date_from\").val();\n d.date_to = $(\"#date_to\").val();\n console.log(\"AJAX data being sent:\", {\n dealer_filter: d.dealer_filter,\n date_from: d.date_from,\n date_to: d.date_to\n });\n return d;\n },\n error: function error(xhr, _error, code) {\n console.error(\"DataTables AJAX error:\", _error, code);\n console.error(\"Response:\", xhr.responseText);\n }\n },\n columnDefs: [{\n targets: 0,\n width: \"5%\"\n }, // No. column\n {\n targets: 8,\n width: \"20%\",\n className: \"text-center\"\n }, // Action column\n {\n targets: [6, 7],\n className: \"text-center\"\n } // Total Items and Status columns\n ],\n columns: [{\n data: \"DT_RowIndex\",\n name: \"DT_RowIndex\",\n orderable: false,\n searchable: false\n }, {\n data: \"mutation_number\",\n name: \"mutation_number\",\n orderable: true\n }, {\n data: \"created_at\",\n name: \"created_at\",\n orderable: true\n }, {\n data: \"from_dealer\",\n name: \"from_dealer\",\n orderable: true\n }, {\n data: \"to_dealer\",\n name: \"to_dealer\",\n orderable: true\n }, {\n data: \"requested_by\",\n name: \"requested_by\",\n orderable: true\n }, {\n data: \"total_items\",\n name: \"total_items\",\n orderable: true\n }, {\n data: \"status\",\n name: \"status\",\n orderable: true\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }],\n order: [[1, \"desc\"]],\n // Order by mutation_number desc\n pageLength: 10,\n responsive: true,\n ordering: true,\n orderMulti: false\n }); // Setup filter button handlers\n\n setupFilterHandlers(table); // Setup other event handlers\n\n setupTableEventHandlers(table);\n}\n\nfunction setupFilterHandlers(table) {\n // Handle Filter Search Button\n $(\"#kt_search\").on(\"click\", function () {\n console.log(\"Filter button clicked\");\n var dealerFilter = $(\"#dealer_filter\").val();\n var dateFrom = $(\"#date_from\").val();\n var dateTo = $(\"#date_to\").val();\n console.log(\"Filtering with:\", {\n dealer: dealerFilter,\n dateFrom: dateFrom,\n dateTo: dateTo\n });\n table.ajax.reload();\n }); // Handle Filter Reset Button\n\n $(\"#kt_reset\").on(\"click\", function () {\n console.log(\"Reset button clicked\"); // Clear all filters\n\n $(\"#dealer_filter\").val(\"\").trigger(\"change\"); // Reset Select2\n\n $(\"#date_from\").val(\"\");\n $(\"#date_to\").val(\"\"); // Reset end date picker and disable it\n\n resetEndDatePicker(); // Reload table\n\n table.ajax.reload();\n }); // Handle Enter key on date inputs\n\n $(\"#date_from, #date_to\").on(\"keypress\", function (e) {\n if (e.which === 13) {\n // Enter key\n $(\"#kt_search\").click();\n }\n }); // Auto-filter when dealer selection changes\n\n $(\"#dealer_filter\").on(\"change\", function () {\n console.log(\"Dealer filter changed:\", $(this).val()); // Uncomment the line below if you want auto-filter on dealer change\n // table.ajax.reload();\n });\n}\n\nfunction resetEndDatePicker() {\n // Destroy existing datepicker\n $(\"#date_to\").datepicker(\"destroy\"); // Re-initialize without minDate constraint\n\n initializeEndDatePicker(); // Disable the input\n\n $(\"#date_to\").prop(\"disabled\", true);\n console.log(\"End date picker reset and disabled\");\n}\n\nfunction setupTableEventHandlers(table) {\n // Debug ordering events\n table.on(\"order.dt\", function () {\n console.log(\"Order changed:\", table.order());\n }); // Add loading indicator for ordering\n\n table.on(\"processing.dt\", function (e, settings, processing) {\n if (processing) {\n console.log(\"DataTable processing started\");\n } else {\n console.log(\"DataTable processing finished\");\n }\n }); // Manual click handler for column headers (fallback)\n\n $(\"#mutations-table thead th\").on(\"click\", function () {\n var columnIndex = $(this).index();\n console.log(\"Column header clicked:\", columnIndex, $(this).text()); // Skip if it's the first (No.) or last (Action) column\n\n if (columnIndex === 0 || columnIndex === 8) {\n console.log(\"Non-sortable column clicked, ignoring\");\n return;\n } // Check if DataTables is handling the click\n\n\n if ($(this).hasClass(\"sorting\") || $(this).hasClass(\"sorting_asc\") || $(this).hasClass(\"sorting_desc\")) {\n console.log(\"DataTables should handle this click\");\n } else {\n console.log(\"DataTables not handling click, manual trigger needed\"); // Force DataTables to handle the ordering\n\n table.order([columnIndex, \"asc\"]).draw();\n }\n }); // Handle Cancel Button Click with SweetAlert\n\n $(document).on(\"click\", \".btn-cancel\", function () {\n var mutationId = $(this).data(\"id\");\n handleCancelMutation(mutationId, table);\n }); // Handle form submissions with loading state\n\n $(document).on(\"submit\", \".approve-form\", function () {\n $(this).find('button[type=\"submit\"]').prop(\"disabled\", true).html(\"Memproses...\");\n }); // Validate quantity approved in receive modal\n\n $(document).on(\"input\", 'input[name*=\"quantity_approved\"]', function () {\n validateQuantityInput($(this));\n });\n}\n\nfunction handleCancelMutation(mutationId, table) {\n if (typeof Swal !== \"undefined\") {\n Swal.fire({\n title: \"Batalkan Mutasi?\",\n text: \"Apakah Anda yakin ingin membatalkan mutasi ini?\",\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#3085d6\",\n confirmButtonText: \"Ya, Batalkan\",\n cancelButtonText: \"Batal\"\n }).then(function (result) {\n if (result.isConfirmed) {\n cancelMutation(mutationId, table);\n }\n });\n } else {\n if (confirm(\"Apakah Anda yakin ingin membatalkan mutasi ini?\")) {\n cancelMutation(mutationId, table);\n }\n }\n}\n\nfunction validateQuantityInput(input) {\n var maxValue = parseFloat(input.attr(\"max\"));\n var currentValue = parseFloat(input.val());\n\n if (maxValue && currentValue > maxValue) {\n input.val(maxValue);\n input.addClass(\"is-invalid\");\n\n if (!input.siblings(\".invalid-feedback\").length) {\n input.after('Quantity tidak boleh melebihi yang diminta
');\n }\n } else {\n input.removeClass(\"is-invalid\");\n input.siblings(\".invalid-feedback\").remove();\n }\n}\n\nfunction cancelMutation(mutationId, table) {\n $.ajax({\n url: \"/warehouse/mutations/\" + mutationId + \"/cancel\",\n type: \"POST\",\n data: {\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success(response) {\n if (typeof Swal !== \"undefined\") {\n Swal.fire({\n title: \"Berhasil!\",\n text: \"Mutasi berhasil dibatalkan\",\n icon: \"success\",\n timer: 2000,\n showConfirmButton: false\n });\n } else {\n alert(\"Mutasi berhasil dibatalkan\");\n } // Reload table\n\n\n table.ajax.reload();\n },\n error: function error(xhr) {\n var _xhr$responseJSON;\n\n var errorMsg = ((_xhr$responseJSON = xhr.responseJSON) === null || _xhr$responseJSON === void 0 ? void 0 : _xhr$responseJSON.message) || \"Gagal membatalkan mutasi\";\n\n if (typeof Swal !== \"undefined\") {\n Swal.fire({\n title: \"Error!\",\n text: errorMsg,\n icon: \"error\"\n });\n } else {\n alert(\"Error: \" + errorMsg);\n }\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsImNvbnNvbGUiLCJsb2ciLCJmbiIsIkRhdGFUYWJsZSIsImVycm9yIiwiaW5pdGlhbGl6ZVNlbGVjdDIiLCJpbml0aWFsaXplRGF0ZXBpY2tlcnMiLCJzZXRUaW1lb3V0IiwiaW5pdGlhbGl6ZURhdGFUYWJsZSIsInNlbGVjdDIiLCJwbGFjZWhvbGRlciIsImFsbG93Q2xlYXIiLCJ3aWR0aCIsImRyb3Bkb3duQXV0b1dpZHRoIiwibWluaW11bVJlc3VsdHNGb3JTZWFyY2giLCJ3YXJuIiwiZGF0ZXBpY2tlciIsImRhdGVGb3JtYXQiLCJjaGFuZ2VNb250aCIsImNoYW5nZVllYXIiLCJtYXhEYXRlIiwiRGF0ZSIsInllYXJSYW5nZSIsIm9uU2VsZWN0Iiwic2VsZWN0ZWREYXRlIiwiZW5hYmxlRW5kRGF0ZVBpY2tlciIsIm9uQ2xvc2UiLCJpbml0aWFsaXplRW5kRGF0ZVBpY2tlciIsInByb3AiLCJhZGRDYWxlbmRhckljb25zIiwic2V0dXBJY29uQ2xpY2tIYW5kbGVycyIsInNldHVwQ2hhbmdlRXZlbnRIYW5kbGVycyIsInN0YXJ0RGF0ZSIsIm1pbkRhdGUiLCJyZW1vdmUiLCJpY29uSHRtbCIsImFmdGVyIiwiY2xvc2VzdCIsImNzcyIsIm9uIiwiaW5wdXQiLCJwcmV2IiwidmFsIiwiaXNEYXRhVGFibGUiLCJkZXN0cm95IiwidGFibGUiLCJwcm9jZXNzaW5nIiwic2VydmVyU2lkZSIsImFqYXgiLCJ1cmwiLCJkYXRhIiwidHlwZSIsImQiLCJkZWFsZXJfZmlsdGVyIiwiZGF0ZV9mcm9tIiwiZGF0ZV90byIsInhociIsImNvZGUiLCJyZXNwb25zZVRleHQiLCJjb2x1bW5EZWZzIiwidGFyZ2V0cyIsImNsYXNzTmFtZSIsImNvbHVtbnMiLCJuYW1lIiwib3JkZXJhYmxlIiwic2VhcmNoYWJsZSIsIm9yZGVyIiwicGFnZUxlbmd0aCIsInJlc3BvbnNpdmUiLCJvcmRlcmluZyIsIm9yZGVyTXVsdGkiLCJzZXR1cEZpbHRlckhhbmRsZXJzIiwic2V0dXBUYWJsZUV2ZW50SGFuZGxlcnMiLCJkZWFsZXJGaWx0ZXIiLCJkYXRlRnJvbSIsImRhdGVUbyIsImRlYWxlciIsInJlbG9hZCIsInRyaWdnZXIiLCJyZXNldEVuZERhdGVQaWNrZXIiLCJlIiwid2hpY2giLCJjbGljayIsInNldHRpbmdzIiwiY29sdW1uSW5kZXgiLCJpbmRleCIsInRleHQiLCJoYXNDbGFzcyIsImRyYXciLCJtdXRhdGlvbklkIiwiaGFuZGxlQ2FuY2VsTXV0YXRpb24iLCJmaW5kIiwiaHRtbCIsInZhbGlkYXRlUXVhbnRpdHlJbnB1dCIsIlN3YWwiLCJmaXJlIiwidGl0bGUiLCJpY29uIiwic2hvd0NhbmNlbEJ1dHRvbiIsImNvbmZpcm1CdXR0b25Db2xvciIsImNhbmNlbEJ1dHRvbkNvbG9yIiwiY29uZmlybUJ1dHRvblRleHQiLCJjYW5jZWxCdXR0b25UZXh0IiwidGhlbiIsInJlc3VsdCIsImlzQ29uZmlybWVkIiwiY2FuY2VsTXV0YXRpb24iLCJjb25maXJtIiwibWF4VmFsdWUiLCJwYXJzZUZsb2F0IiwiYXR0ciIsImN1cnJlbnRWYWx1ZSIsImFkZENsYXNzIiwic2libGluZ3MiLCJsZW5ndGgiLCJyZW1vdmVDbGFzcyIsIl90b2tlbiIsInN1Y2Nlc3MiLCJyZXNwb25zZSIsInRpbWVyIiwic2hvd0NvbmZpcm1CdXR0b24iLCJhbGVydCIsImVycm9yTXNnIiwicmVzcG9uc2VKU09OIiwibWVzc2FnZSJdLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvbXV0YXRpb25zL2luZGV4LmpzPzdhNGUiXSwic291cmNlc0NvbnRlbnQiOlsiJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKFwiTXV0YXRpb25zIGluZGV4LmpzIGxvYWRlZFwiKTtcblxuICAgIC8vIENoZWNrIGlmIERhdGFUYWJsZXMgaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiAkLmZuLkRhdGFUYWJsZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRGF0YVRhYmxlcyBub3QgYXZhaWxhYmxlIVwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgY29tcG9uZW50c1xuICAgIGluaXRpYWxpemVTZWxlY3QyKCk7XG4gICAgaW5pdGlhbGl6ZURhdGVwaWNrZXJzKCk7XG5cbiAgICAvLyBXYWl0IGZvciBET00gdG8gYmUgZnVsbHkgcmVhZHlcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5pdGlhbGl6ZURhdGFUYWJsZSgpO1xuICAgIH0sIDEwMCk7XG59KTtcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVNlbGVjdDIoKSB7XG4gICAgY29uc29sZS5sb2coXCJJbml0aWFsaXppbmcgU2VsZWN0Mi4uLlwiKTtcblxuICAgIC8vIEluaXRpYWxpemUgU2VsZWN0MiBmb3IgZGVhbGVyIGZpbHRlclxuICAgIGlmICh0eXBlb2YgJC5mbi5zZWxlY3QyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICQoXCIjZGVhbGVyX2ZpbHRlclwiKS5zZWxlY3QyKHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIlBpbGloIERlYWxlclwiLFxuICAgICAgICAgICAgYWxsb3dDbGVhcjogZmFsc2UsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICBkcm9wZG93bkF1dG9XaWR0aDogdHJ1ZSxcbiAgICAgICAgICAgIG1pbmltdW1SZXN1bHRzRm9yU2VhcmNoOiA1LCAvLyBTaG93IHNlYXJjaCBib3ggaWYgbW9yZSB0aGFuIDUgb3B0aW9uc1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJTZWxlY3QyIG5vdCBhdmFpbGFibGUsIHVzaW5nIHJlZ3VsYXIgc2VsZWN0XCIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZURhdGVwaWNrZXJzKCkge1xuICAgIGNvbnNvbGUubG9nKFwiSW5pdGlhbGl6aW5nIGRhdGVwaWNrZXJzLi4uXCIpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGFydCBkYXRlIHBpY2tlclxuICAgICQoXCIjZGF0ZV9mcm9tXCIpLmRhdGVwaWNrZXIoe1xuICAgICAgICBkYXRlRm9ybWF0OiBcInl5LW1tLWRkXCIsXG4gICAgICAgIGNoYW5nZU1vbnRoOiB0cnVlLFxuICAgICAgICBjaGFuZ2VZZWFyOiB0cnVlLFxuICAgICAgICBtYXhEYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB5ZWFyUmFuZ2U6IFwiLTU6KzBcIixcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgZGF0ZSBzZWxlY3RlZDpcIiwgc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIGVuYWJsZUVuZERhdGVQaWNrZXIoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICQodGhpcykuZGF0ZXBpY2tlcihcImhpZGVcIik7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0YXJ0IGRhdGUgY2xvc2VkIHdpdGggdmFsdWU6XCIsIHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICAgICAgZW5hYmxlRW5kRGF0ZVBpY2tlcihzZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBlbmQgZGF0ZSBwaWNrZXIgKGluaXRpYWxseSBkaXNhYmxlZClcbiAgICBpbml0aWFsaXplRW5kRGF0ZVBpY2tlcigpO1xuXG4gICAgLy8gSW5pdGlhbGx5IGRpc2FibGUgZW5kIGRhdGUgaW5wdXRcbiAgICAkKFwiI2RhdGVfdG9cIikucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXG4gICAgLy8gQWRkIGNhbGVuZGFyIGljb25zXG4gICAgYWRkQ2FsZW5kYXJJY29ucygpO1xuXG4gICAgLy8gU2V0dXAgY2FsZW5kYXIgaWNvbiBjbGljayBoYW5kbGVyc1xuICAgIHNldHVwSWNvbkNsaWNrSGFuZGxlcnMoKTtcblxuICAgIC8vIEJhY2t1cDogTGlzdGVuIHRvIGNoYW5nZSBldmVudFxuICAgIHNldHVwQ2hhbmdlRXZlbnRIYW5kbGVycygpO1xufVxuXG5mdW5jdGlvbiBlbmFibGVFbmREYXRlUGlja2VyKHN0YXJ0RGF0ZSkge1xuICAgIGNvbnNvbGUubG9nKFwiRW5hYmxpbmcgZW5kIGRhdGUgcGlja2VyIHdpdGggbWluIGRhdGU6XCIsIHN0YXJ0RGF0ZSk7XG5cbiAgICAvLyBFbmFibGUgdGhlIGlucHV0XG4gICAgJChcIiNkYXRlX3RvXCIpLnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cbiAgICAvLyBEZXN0cm95IGV4aXN0aW5nIGRhdGVwaWNrZXJcbiAgICAkKFwiI2RhdGVfdG9cIikuZGF0ZXBpY2tlcihcImRlc3Ryb3lcIik7XG5cbiAgICAvLyBSZS1pbml0aWFsaXplIHdpdGggbmV3IG1pbkRhdGVcbiAgICAkKFwiI2RhdGVfdG9cIikuZGF0ZXBpY2tlcih7XG4gICAgICAgIGRhdGVGb3JtYXQ6IFwieXktbW0tZGRcIixcbiAgICAgICAgY2hhbmdlTW9udGg6IHRydWUsXG4gICAgICAgIGNoYW5nZVllYXI6IHRydWUsXG4gICAgICAgIG1heERhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHllYXJSYW5nZTogXCItNTorMFwiLFxuICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZShzdGFydERhdGUpLCAvLyBDb252ZXJ0IHRvIERhdGUgb2JqZWN0IGZvciBwcm9wZXIgY29tcGFyaXNvblxuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gKHNlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFbmQgZGF0ZSBzZWxlY3RlZDpcIiwgc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICQodGhpcykuZGF0ZXBpY2tlcihcImhpZGVcIik7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkVuZCBkYXRlIHBpY2tlciBlbmFibGVkIHdpdGggbWluRGF0ZTpcIiwgc3RhcnREYXRlKTtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZUVuZERhdGVQaWNrZXIoKSB7XG4gICAgJChcIiNkYXRlX3RvXCIpLmRhdGVwaWNrZXIoe1xuICAgICAgICBkYXRlRm9ybWF0OiBcInl5LW1tLWRkXCIsXG4gICAgICAgIGNoYW5nZU1vbnRoOiB0cnVlLFxuICAgICAgICBjaGFuZ2VZZWFyOiB0cnVlLFxuICAgICAgICBtYXhEYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB5ZWFyUmFuZ2U6IFwiLTU6KzBcIixcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRW5kIGRhdGUgc2VsZWN0ZWQ6XCIsIHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICAkKHRoaXMpLmRhdGVwaWNrZXIoXCJoaWRlXCIpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRDYWxlbmRhckljb25zKCkge1xuICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgaWNvbnMgZmlyc3RcbiAgICAkKFwiLmlucHV0LWljb25cIikucmVtb3ZlKCk7XG5cbiAgICAvLyBBZGQgY2FsZW5kYXIgaWNvbnMgd2l0aCBqdXN0IHRoZSBjbGFzc2VzLCBubyBpbmxpbmUgc3R5bGVzXG4gICAgY29uc3QgaWNvbkh0bWwgPSAnPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBpbnB1dC1pY29uXCI+PC9pPic7XG5cbiAgICAkKFwiI2RhdGVfZnJvbVwiKS5hZnRlcihpY29uSHRtbCk7XG4gICAgJChcIiNkYXRlX3RvXCIpLmFmdGVyKGljb25IdG1sKTtcblxuICAgIC8vIEVuc3VyZSBwYXJlbnQgY29udGFpbmVycyBoYXZlIHJlbGF0aXZlIHBvc2l0aW9uaW5nXG4gICAgJChcIiNkYXRlX2Zyb20sICNkYXRlX3RvXCIpXG4gICAgICAgIC5jbG9zZXN0KFwiLmZvcm0tZ3JvdXBcIilcbiAgICAgICAgLmNzcyhcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIik7XG59XG5cbmZ1bmN0aW9uIHNldHVwSWNvbkNsaWNrSGFuZGxlcnMoKSB7XG4gICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5pbnB1dC1pY29uXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSAkKHRoaXMpLnByZXYoXCJpbnB1dFwiKTtcbiAgICAgICAgaWYgKCFpbnB1dC5wcm9wKFwiZGlzYWJsZWRcIikpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGVwaWNrZXIoXCJzaG93XCIpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldHVwQ2hhbmdlRXZlbnRIYW5kbGVycygpIHtcbiAgICAkKFwiI2RhdGVfZnJvbVwiKS5vbihcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9ICQodGhpcykudmFsKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgZGF0ZSBjaGFuZ2UgZXZlbnQ6XCIsIHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICBlbmFibGVFbmREYXRlUGlja2VyKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZURhdGFUYWJsZSgpIHtcbiAgICBjb25zb2xlLmxvZyhcIkluaXRpYWxpemluZyBEYXRhVGFibGUuLi5cIik7XG5cbiAgICAvLyBEZXN0cm95IGV4aXN0aW5nIHRhYmxlIGlmIGFueVxuICAgIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZShcIiNtdXRhdGlvbnMtdGFibGVcIikpIHtcbiAgICAgICAgJChcIiNtdXRhdGlvbnMtdGFibGVcIikuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgRGF0YVRhYmxlXG4gICAgY29uc3QgdGFibGUgPSAkKFwiI211dGF0aW9ucy10YWJsZVwiKS5EYXRhVGFibGUoe1xuICAgICAgICBwcm9jZXNzaW5nOiB0cnVlLFxuICAgICAgICBzZXJ2ZXJTaWRlOiB0cnVlLFxuICAgICAgICBkZXN0cm95OiB0cnVlLFxuICAgICAgICBhamF4OiB7XG4gICAgICAgICAgICB1cmw6ICQoXCIjbXV0YXRpb25zLXRhYmxlXCIpLmRhdGEoXCJ1cmxcIiksXG4gICAgICAgICAgICB0eXBlOiBcIkdFVFwiLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgZmlsdGVyIHBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICBkLmRlYWxlcl9maWx0ZXIgPSAkKFwiI2RlYWxlcl9maWx0ZXJcIikudmFsKCk7XG4gICAgICAgICAgICAgICAgZC5kYXRlX2Zyb20gPSAkKFwiI2RhdGVfZnJvbVwiKS52YWwoKTtcbiAgICAgICAgICAgICAgICBkLmRhdGVfdG8gPSAkKFwiI2RhdGVfdG9cIikudmFsKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkFKQVggZGF0YSBiZWluZyBzZW50OlwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGRlYWxlcl9maWx0ZXI6IGQuZGVhbGVyX2ZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgZGF0ZV9mcm9tOiBkLmRhdGVfZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZV90bzogZC5kYXRlX3RvLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIsIGVycm9yLCBjb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkRhdGFUYWJsZXMgQUpBWCBlcnJvcjpcIiwgZXJyb3IsIGNvZGUpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSZXNwb25zZTpcIiwgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBjb2x1bW5EZWZzOiBbXG4gICAgICAgICAgICB7IHRhcmdldHM6IDAsIHdpZHRoOiBcIjUlXCIgfSwgLy8gTm8uIGNvbHVtblxuICAgICAgICAgICAgeyB0YXJnZXRzOiA4LCB3aWR0aDogXCIyMCVcIiwgY2xhc3NOYW1lOiBcInRleHQtY2VudGVyXCIgfSwgLy8gQWN0aW9uIGNvbHVtblxuICAgICAgICAgICAgeyB0YXJnZXRzOiBbNiwgN10sIGNsYXNzTmFtZTogXCJ0ZXh0LWNlbnRlclwiIH0sIC8vIFRvdGFsIEl0ZW1zIGFuZCBTdGF0dXMgY29sdW1uc1xuICAgICAgICBdLFxuICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJEVF9Sb3dJbmRleFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiRFRfUm93SW5kZXhcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcIm11dGF0aW9uX251bWJlclwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwibXV0YXRpb25fbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgZGF0YTogXCJjcmVhdGVkX2F0XCIsIG5hbWU6IFwiY3JlYXRlZF9hdFwiLCBvcmRlcmFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgZGF0YTogXCJmcm9tX2RlYWxlclwiLCBuYW1lOiBcImZyb21fZGVhbGVyXCIsIG9yZGVyYWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBkYXRhOiBcInRvX2RlYWxlclwiLCBuYW1lOiBcInRvX2RlYWxlclwiLCBvcmRlcmFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgZGF0YTogXCJyZXF1ZXN0ZWRfYnlcIiwgbmFtZTogXCJyZXF1ZXN0ZWRfYnlcIiwgb3JkZXJhYmxlOiB0cnVlIH0sXG4gICAgICAgICAgICB7IGRhdGE6IFwidG90YWxfaXRlbXNcIiwgbmFtZTogXCJ0b3RhbF9pdGVtc1wiLCBvcmRlcmFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgZGF0YTogXCJzdGF0dXNcIiwgbmFtZTogXCJzdGF0dXNcIiwgb3JkZXJhYmxlOiB0cnVlIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcImFjdGlvblwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvcmRlcjogW1sxLCBcImRlc2NcIl1dLCAvLyBPcmRlciBieSBtdXRhdGlvbl9udW1iZXIgZGVzY1xuICAgICAgICBwYWdlTGVuZ3RoOiAxMCxcbiAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgICAgb3JkZXJpbmc6IHRydWUsXG4gICAgICAgIG9yZGVyTXVsdGk6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgZmlsdGVyIGJ1dHRvbiBoYW5kbGVyc1xuICAgIHNldHVwRmlsdGVySGFuZGxlcnModGFibGUpO1xuXG4gICAgLy8gU2V0dXAgb3RoZXIgZXZlbnQgaGFuZGxlcnNcbiAgICBzZXR1cFRhYmxlRXZlbnRIYW5kbGVycyh0YWJsZSk7XG59XG5cbmZ1bmN0aW9uIHNldHVwRmlsdGVySGFuZGxlcnModGFibGUpIHtcbiAgICAvLyBIYW5kbGUgRmlsdGVyIFNlYXJjaCBCdXR0b25cbiAgICAkKFwiI2t0X3NlYXJjaFwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJGaWx0ZXIgYnV0dG9uIGNsaWNrZWRcIik7XG5cbiAgICAgICAgY29uc3QgZGVhbGVyRmlsdGVyID0gJChcIiNkZWFsZXJfZmlsdGVyXCIpLnZhbCgpO1xuICAgICAgICBjb25zdCBkYXRlRnJvbSA9ICQoXCIjZGF0ZV9mcm9tXCIpLnZhbCgpO1xuICAgICAgICBjb25zdCBkYXRlVG8gPSAkKFwiI2RhdGVfdG9cIikudmFsKCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJGaWx0ZXJpbmcgd2l0aDpcIiwge1xuICAgICAgICAgICAgZGVhbGVyOiBkZWFsZXJGaWx0ZXIsXG4gICAgICAgICAgICBkYXRlRnJvbSxcbiAgICAgICAgICAgIGRhdGVUbyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBGaWx0ZXIgUmVzZXQgQnV0dG9uXG4gICAgJChcIiNrdF9yZXNldFwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJSZXNldCBidXR0b24gY2xpY2tlZFwiKTtcblxuICAgICAgICAvLyBDbGVhciBhbGwgZmlsdGVyc1xuICAgICAgICAkKFwiI2RlYWxlcl9maWx0ZXJcIikudmFsKFwiXCIpLnRyaWdnZXIoXCJjaGFuZ2VcIik7IC8vIFJlc2V0IFNlbGVjdDJcbiAgICAgICAgJChcIiNkYXRlX2Zyb21cIikudmFsKFwiXCIpO1xuICAgICAgICAkKFwiI2RhdGVfdG9cIikudmFsKFwiXCIpO1xuXG4gICAgICAgIC8vIFJlc2V0IGVuZCBkYXRlIHBpY2tlciBhbmQgZGlzYWJsZSBpdFxuICAgICAgICByZXNldEVuZERhdGVQaWNrZXIoKTtcblxuICAgICAgICAvLyBSZWxvYWQgdGFibGVcbiAgICAgICAgdGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFbnRlciBrZXkgb24gZGF0ZSBpbnB1dHNcbiAgICAkKFwiI2RhdGVfZnJvbSwgI2RhdGVfdG9cIikub24oXCJrZXlwcmVzc1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgICAgIC8vIEVudGVyIGtleVxuICAgICAgICAgICAgJChcIiNrdF9zZWFyY2hcIikuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXV0by1maWx0ZXIgd2hlbiBkZWFsZXIgc2VsZWN0aW9uIGNoYW5nZXNcbiAgICAkKFwiI2RlYWxlcl9maWx0ZXJcIikub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkRlYWxlciBmaWx0ZXIgY2hhbmdlZDpcIiwgJCh0aGlzKS52YWwoKSk7XG4gICAgICAgIC8vIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBpZiB5b3Ugd2FudCBhdXRvLWZpbHRlciBvbiBkZWFsZXIgY2hhbmdlXG4gICAgICAgIC8vIHRhYmxlLmFqYXgucmVsb2FkKCk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0RW5kRGF0ZVBpY2tlcigpIHtcbiAgICAvLyBEZXN0cm95IGV4aXN0aW5nIGRhdGVwaWNrZXJcbiAgICAkKFwiI2RhdGVfdG9cIikuZGF0ZXBpY2tlcihcImRlc3Ryb3lcIik7XG5cbiAgICAvLyBSZS1pbml0aWFsaXplIHdpdGhvdXQgbWluRGF0ZSBjb25zdHJhaW50XG4gICAgaW5pdGlhbGl6ZUVuZERhdGVQaWNrZXIoKTtcblxuICAgIC8vIERpc2FibGUgdGhlIGlucHV0XG4gICAgJChcIiNkYXRlX3RvXCIpLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblxuICAgIGNvbnNvbGUubG9nKFwiRW5kIGRhdGUgcGlja2VyIHJlc2V0IGFuZCBkaXNhYmxlZFwiKTtcbn1cblxuZnVuY3Rpb24gc2V0dXBUYWJsZUV2ZW50SGFuZGxlcnModGFibGUpIHtcbiAgICAvLyBEZWJ1ZyBvcmRlcmluZyBldmVudHNcbiAgICB0YWJsZS5vbihcIm9yZGVyLmR0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJPcmRlciBjaGFuZ2VkOlwiLCB0YWJsZS5vcmRlcigpKTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBsb2FkaW5nIGluZGljYXRvciBmb3Igb3JkZXJpbmdcbiAgICB0YWJsZS5vbihcInByb2Nlc3NpbmcuZHRcIiwgZnVuY3Rpb24gKGUsIHNldHRpbmdzLCBwcm9jZXNzaW5nKSB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZSBwcm9jZXNzaW5nIHN0YXJ0ZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZSBwcm9jZXNzaW5nIGZpbmlzaGVkXCIpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNYW51YWwgY2xpY2sgaGFuZGxlciBmb3IgY29sdW1uIGhlYWRlcnMgKGZhbGxiYWNrKVxuICAgICQoXCIjbXV0YXRpb25zLXRhYmxlIHRoZWFkIHRoXCIpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9ICQodGhpcykuaW5kZXgoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJDb2x1bW4gaGVhZGVyIGNsaWNrZWQ6XCIsIGNvbHVtbkluZGV4LCAkKHRoaXMpLnRleHQoKSk7XG5cbiAgICAgICAgLy8gU2tpcCBpZiBpdCdzIHRoZSBmaXJzdCAoTm8uKSBvciBsYXN0IChBY3Rpb24pIGNvbHVtblxuICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IDAgfHwgY29sdW1uSW5kZXggPT09IDgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm9uLXNvcnRhYmxlIGNvbHVtbiBjbGlja2VkLCBpZ25vcmluZ1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIERhdGFUYWJsZXMgaXMgaGFuZGxpbmcgdGhlIGNsaWNrXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICQodGhpcykuaGFzQ2xhc3MoXCJzb3J0aW5nXCIpIHx8XG4gICAgICAgICAgICAkKHRoaXMpLmhhc0NsYXNzKFwic29ydGluZ19hc2NcIikgfHxcbiAgICAgICAgICAgICQodGhpcykuaGFzQ2xhc3MoXCJzb3J0aW5nX2Rlc2NcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZXMgc2hvdWxkIGhhbmRsZSB0aGlzIGNsaWNrXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJEYXRhVGFibGVzIG5vdCBoYW5kbGluZyBjbGljaywgbWFudWFsIHRyaWdnZXIgbmVlZGVkXCIpO1xuICAgICAgICAgICAgLy8gRm9yY2UgRGF0YVRhYmxlcyB0byBoYW5kbGUgdGhlIG9yZGVyaW5nXG4gICAgICAgICAgICB0YWJsZS5vcmRlcihbY29sdW1uSW5kZXgsIFwiYXNjXCJdKS5kcmF3KCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBDYW5jZWwgQnV0dG9uIENsaWNrIHdpdGggU3dlZXRBbGVydFxuICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIuYnRuLWNhbmNlbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG11dGF0aW9uSWQgPSAkKHRoaXMpLmRhdGEoXCJpZFwiKTtcbiAgICAgICAgaGFuZGxlQ2FuY2VsTXV0YXRpb24obXV0YXRpb25JZCwgdGFibGUpO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGZvcm0gc3VibWlzc2lvbnMgd2l0aCBsb2FkaW5nIHN0YXRlXG4gICAgJChkb2N1bWVudCkub24oXCJzdWJtaXRcIiwgXCIuYXBwcm92ZS1mb3JtXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgLmZpbmQoJ2J1dHRvblt0eXBlPVwic3VibWl0XCJdJylcbiAgICAgICAgICAgIC5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSlcbiAgICAgICAgICAgIC5odG1sKFwiTWVtcHJvc2VzLi4uXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGUgcXVhbnRpdHkgYXBwcm92ZWQgaW4gcmVjZWl2ZSBtb2RhbFxuICAgICQoZG9jdW1lbnQpLm9uKFwiaW5wdXRcIiwgJ2lucHV0W25hbWUqPVwicXVhbnRpdHlfYXBwcm92ZWRcIl0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhbGlkYXRlUXVhbnRpdHlJbnB1dCgkKHRoaXMpKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlQ2FuY2VsTXV0YXRpb24obXV0YXRpb25JZCwgdGFibGUpIHtcbiAgICBpZiAodHlwZW9mIFN3YWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIkJhdGFsa2FuIE11dGFzaT9cIixcbiAgICAgICAgICAgIHRleHQ6IFwiQXBha2FoIEFuZGEgeWFraW4gaW5naW4gbWVtYmF0YWxrYW4gbXV0YXNpIGluaT9cIixcbiAgICAgICAgICAgIGljb246IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjZDMzXCIsXG4gICAgICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjMzA4NWQ2XCIsXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJZYSwgQmF0YWxrYW5cIixcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IFwiQmF0YWxcIixcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsTXV0YXRpb24obXV0YXRpb25JZCwgdGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29uZmlybShcIkFwYWthaCBBbmRhIHlha2luIGluZ2luIG1lbWJhdGFsa2FuIG11dGFzaSBpbmk/XCIpKSB7XG4gICAgICAgICAgICBjYW5jZWxNdXRhdGlvbihtdXRhdGlvbklkLCB0YWJsZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUXVhbnRpdHlJbnB1dChpbnB1dCkge1xuICAgIGNvbnN0IG1heFZhbHVlID0gcGFyc2VGbG9hdChpbnB1dC5hdHRyKFwibWF4XCIpKTtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBwYXJzZUZsb2F0KGlucHV0LnZhbCgpKTtcblxuICAgIGlmIChtYXhWYWx1ZSAmJiBjdXJyZW50VmFsdWUgPiBtYXhWYWx1ZSkge1xuICAgICAgICBpbnB1dC52YWwobWF4VmFsdWUpO1xuICAgICAgICBpbnB1dC5hZGRDbGFzcyhcImlzLWludmFsaWRcIik7XG5cbiAgICAgICAgaWYgKCFpbnB1dC5zaWJsaW5ncyhcIi5pbnZhbGlkLWZlZWRiYWNrXCIpLmxlbmd0aCkge1xuICAgICAgICAgICAgaW5wdXQuYWZ0ZXIoXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+UXVhbnRpdHkgdGlkYWsgYm9sZWggbWVsZWJpaGkgeWFuZyBkaW1pbnRhPC9kaXY+J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LnJlbW92ZUNsYXNzKFwiaXMtaW52YWxpZFwiKTtcbiAgICAgICAgaW5wdXQuc2libGluZ3MoXCIuaW52YWxpZC1mZWVkYmFja1wiKS5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbE11dGF0aW9uKG11dGF0aW9uSWQsIHRhYmxlKSB7XG4gICAgJC5hamF4KHtcbiAgICAgICAgdXJsOiBcIi93YXJlaG91c2UvbXV0YXRpb25zL1wiICsgbXV0YXRpb25JZCArIFwiL2NhbmNlbFwiLFxuICAgICAgICB0eXBlOiBcIlBPU1RcIixcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgX3Rva2VuOiAkKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuYXR0cihcImNvbnRlbnRcIiksXG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBTd2FsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiQmVyaGFzaWwhXCIsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IFwiTXV0YXNpIGJlcmhhc2lsIGRpYmF0YWxrYW5cIixcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVyOiAyMDAwLFxuICAgICAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFsZXJ0KFwiTXV0YXNpIGJlcmhhc2lsIGRpYmF0YWxrYW5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlbG9hZCB0YWJsZVxuICAgICAgICAgICAgdGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTXNnID1cbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VKU09OPy5tZXNzYWdlIHx8IFwiR2FnYWwgbWVtYmF0YWxrYW4gbXV0YXNpXCI7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU3dhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIkVycm9yIVwiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZyxcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbGVydChcIkVycm9yOiBcIiArIGVycm9yTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUFBLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBWTtFQUMxQkMsT0FBTyxDQUFDQyxHQUFSLENBQVksMkJBQVosRUFEMEIsQ0FHMUI7O0VBQ0EsSUFBSSxPQUFPSixDQUFDLENBQUNLLEVBQUYsQ0FBS0MsU0FBWixLQUEwQixXQUE5QixFQUEyQztJQUN2Q0gsT0FBTyxDQUFDSSxLQUFSLENBQWMsMkJBQWQ7SUFDQTtFQUNILENBUHlCLENBUzFCOzs7RUFDQUMsaUJBQWlCO0VBQ2pCQyxxQkFBcUIsR0FYSyxDQWExQjs7RUFDQUMsVUFBVSxDQUFDLFlBQVk7SUFDbkJDLG1CQUFtQjtFQUN0QixDQUZTLEVBRVAsR0FGTyxDQUFWO0FBR0gsQ0FqQkQ7O0FBbUJBLFNBQVNILGlCQUFULEdBQTZCO0VBQ3pCTCxPQUFPLENBQUNDLEdBQVIsQ0FBWSx5QkFBWixFQUR5QixDQUd6Qjs7RUFDQSxJQUFJLE9BQU9KLENBQUMsQ0FBQ0ssRUFBRixDQUFLTyxPQUFaLEtBQXdCLFdBQTVCLEVBQXlDO0lBQ3JDWixDQUFDLENBQUMsZ0JBQUQsQ0FBRCxDQUFvQlksT0FBcEIsQ0FBNEI7TUFDeEJDLFdBQVcsRUFBRSxjQURXO01BRXhCQyxVQUFVLEVBQUUsS0FGWTtNQUd4QkMsS0FBSyxFQUFFLE1BSGlCO01BSXhCQyxpQkFBaUIsRUFBRSxJQUpLO01BS3hCQyx1QkFBdUIsRUFBRSxDQUxELENBS0k7O0lBTEosQ0FBNUI7RUFPSCxDQVJELE1BUU87SUFDSGQsT0FBTyxDQUFDZSxJQUFSLENBQWEsNkNBQWI7RUFDSDtBQUNKOztBQUVELFNBQVNULHFCQUFULEdBQWlDO0VBQzdCTixPQUFPLENBQUNDLEdBQVIsQ0FBWSw2QkFBWixFQUQ2QixDQUc3Qjs7RUFDQUosQ0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQm1CLFVBQWhCLENBQTJCO0lBQ3ZCQyxVQUFVLEVBQUUsVUFEVztJQUV2QkMsV0FBVyxFQUFFLElBRlU7SUFHdkJDLFVBQVUsRUFBRSxJQUhXO0lBSXZCQyxPQUFPLEVBQUUsSUFBSUMsSUFBSixFQUpjO0lBS3ZCQyxTQUFTLEVBQUUsT0FMWTtJQU12QkMsUUFBUSxFQUFFLGtCQUFVQyxZQUFWLEVBQXdCO01BQzlCeEIsT0FBTyxDQUFDQyxHQUFSLENBQVksc0JBQVosRUFBb0N1QixZQUFwQztNQUNBQyxtQkFBbUIsQ0FBQ0QsWUFBRCxDQUFuQjtNQUNBM0IsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRbUIsVUFBUixDQUFtQixNQUFuQjtJQUNILENBVnNCO0lBV3ZCVSxPQUFPLEVBQUUsaUJBQVVGLFlBQVYsRUFBd0I7TUFDN0IsSUFBSUEsWUFBSixFQUFrQjtRQUNkeEIsT0FBTyxDQUFDQyxHQUFSLENBQVksK0JBQVosRUFBNkN1QixZQUE3QztRQUNBQyxtQkFBbUIsQ0FBQ0QsWUFBRCxDQUFuQjtNQUNIO0lBQ0o7RUFoQnNCLENBQTNCLEVBSjZCLENBdUI3Qjs7RUFDQUcsdUJBQXVCLEdBeEJNLENBMEI3Qjs7RUFDQTlCLENBQUMsQ0FBQyxVQUFELENBQUQsQ0FBYytCLElBQWQsQ0FBbUIsVUFBbkIsRUFBK0IsSUFBL0IsRUEzQjZCLENBNkI3Qjs7RUFDQUMsZ0JBQWdCLEdBOUJhLENBZ0M3Qjs7RUFDQUMsc0JBQXNCLEdBakNPLENBbUM3Qjs7RUFDQUMsd0JBQXdCO0FBQzNCOztBQUVELFNBQVNOLG1CQUFULENBQTZCTyxTQUE3QixFQUF3QztFQUNwQ2hDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHlDQUFaLEVBQXVEK0IsU0FBdkQsRUFEb0MsQ0FHcEM7O0VBQ0FuQyxDQUFDLENBQUMsVUFBRCxDQUFELENBQWMrQixJQUFkLENBQW1CLFVBQW5CLEVBQStCLEtBQS9CLEVBSm9DLENBTXBDOztFQUNBL0IsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxDQUFjbUIsVUFBZCxDQUF5QixTQUF6QixFQVBvQyxDQVNwQzs7RUFDQW5CLENBQUMsQ0FBQyxVQUFELENBQUQsQ0FBY21CLFVBQWQsQ0FBeUI7SUFDckJDLFVBQVUsRUFBRSxVQURTO0lBRXJCQyxXQUFXLEVBQUUsSUFGUTtJQUdyQkMsVUFBVSxFQUFFLElBSFM7SUFJckJDLE9BQU8sRUFBRSxJQUFJQyxJQUFKLEVBSlk7SUFLckJDLFNBQVMsRUFBRSxPQUxVO0lBTXJCVyxPQUFPLEVBQUUsSUFBSVosSUFBSixDQUFTVyxTQUFULENBTlk7SUFNUztJQUM5QlQsUUFBUSxFQUFFLGtCQUFVQyxZQUFWLEVBQXdCO01BQzlCeEIsT0FBTyxDQUFDQyxHQUFSLENBQVksb0JBQVosRUFBa0N1QixZQUFsQztNQUNBM0IsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRbUIsVUFBUixDQUFtQixNQUFuQjtJQUNIO0VBVm9CLENBQXpCO0VBYUFoQixPQUFPLENBQUNDLEdBQVIsQ0FBWSx1Q0FBWixFQUFxRCtCLFNBQXJEO0FBQ0g7O0FBRUQsU0FBU0wsdUJBQVQsR0FBbUM7RUFDL0I5QixDQUFDLENBQUMsVUFBRCxDQUFELENBQWNtQixVQUFkLENBQXlCO0lBQ3JCQyxVQUFVLEVBQUUsVUFEUztJQUVyQkMsV0FBVyxFQUFFLElBRlE7SUFHckJDLFVBQVUsRUFBRSxJQUhTO0lBSXJCQyxPQUFPLEVBQUUsSUFBSUMsSUFBSixFQUpZO0lBS3JCQyxTQUFTLEVBQUUsT0FMVTtJQU1yQkMsUUFBUSxFQUFFLGtCQUFVQyxZQUFWLEVBQXdCO01BQzlCeEIsT0FBTyxDQUFDQyxHQUFSLENBQVksb0JBQVosRUFBa0N1QixZQUFsQztNQUNBM0IsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRbUIsVUFBUixDQUFtQixNQUFuQjtJQUNIO0VBVG9CLENBQXpCO0FBV0g7O0FBRUQsU0FBU2EsZ0JBQVQsR0FBNEI7RUFDeEI7RUFDQWhDLENBQUMsQ0FBQyxhQUFELENBQUQsQ0FBaUJxQyxNQUFqQixHQUZ3QixDQUl4Qjs7RUFDQSxJQUFNQyxRQUFRLEdBQUcsMkNBQWpCO0VBRUF0QyxDQUFDLENBQUMsWUFBRCxDQUFELENBQWdCdUMsS0FBaEIsQ0FBc0JELFFBQXRCO0VBQ0F0QyxDQUFDLENBQUMsVUFBRCxDQUFELENBQWN1QyxLQUFkLENBQW9CRCxRQUFwQixFQVJ3QixDQVV4Qjs7RUFDQXRDLENBQUMsQ0FBQyxzQkFBRCxDQUFELENBQ0t3QyxPQURMLENBQ2EsYUFEYixFQUVLQyxHQUZMLENBRVMsVUFGVCxFQUVxQixVQUZyQjtBQUdIOztBQUVELFNBQVNSLHNCQUFULEdBQWtDO0VBQzlCakMsQ0FBQyxDQUFDQyxRQUFELENBQUQsQ0FBWXlDLEVBQVosQ0FBZSxPQUFmLEVBQXdCLGFBQXhCLEVBQXVDLFlBQVk7SUFDL0MsSUFBTUMsS0FBSyxHQUFHM0MsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRNEMsSUFBUixDQUFhLE9BQWIsQ0FBZDs7SUFDQSxJQUFJLENBQUNELEtBQUssQ0FBQ1osSUFBTixDQUFXLFVBQVgsQ0FBTCxFQUE2QjtNQUN6QlksS0FBSyxDQUFDeEIsVUFBTixDQUFpQixNQUFqQjtJQUNIO0VBQ0osQ0FMRDtBQU1IOztBQUVELFNBQVNlLHdCQUFULEdBQW9DO0VBQ2hDbEMsQ0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQjBDLEVBQWhCLENBQW1CLFFBQW5CLEVBQTZCLFlBQVk7SUFDckMsSUFBTWYsWUFBWSxHQUFHM0IsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRNkMsR0FBUixFQUFyQjs7SUFDQSxJQUFJbEIsWUFBSixFQUFrQjtNQUNkeEIsT0FBTyxDQUFDQyxHQUFSLENBQVksMEJBQVosRUFBd0N1QixZQUF4QztNQUNBQyxtQkFBbUIsQ0FBQ0QsWUFBRCxDQUFuQjtJQUNIO0VBQ0osQ0FORDtBQU9IOztBQUVELFNBQVNoQixtQkFBVCxHQUErQjtFQUMzQlIsT0FBTyxDQUFDQyxHQUFSLENBQVksMkJBQVosRUFEMkIsQ0FHM0I7O0VBQ0EsSUFBSUosQ0FBQyxDQUFDSyxFQUFGLENBQUtDLFNBQUwsQ0FBZXdDLFdBQWYsQ0FBMkIsa0JBQTNCLENBQUosRUFBb0Q7SUFDaEQ5QyxDQUFDLENBQUMsa0JBQUQsQ0FBRCxDQUFzQk0sU0FBdEIsR0FBa0N5QyxPQUFsQztFQUNILENBTjBCLENBUTNCOzs7RUFDQSxJQUFNQyxLQUFLLEdBQUdoRCxDQUFDLENBQUMsa0JBQUQsQ0FBRCxDQUFzQk0sU0FBdEIsQ0FBZ0M7SUFDMUMyQyxVQUFVLEVBQUUsSUFEOEI7SUFFMUNDLFVBQVUsRUFBRSxJQUY4QjtJQUcxQ0gsT0FBTyxFQUFFLElBSGlDO0lBSTFDSSxJQUFJLEVBQUU7TUFDRkMsR0FBRyxFQUFFcEQsQ0FBQyxDQUFDLGtCQUFELENBQUQsQ0FBc0JxRCxJQUF0QixDQUEyQixLQUEzQixDQURIO01BRUZDLElBQUksRUFBRSxLQUZKO01BR0ZELElBQUksRUFBRSxjQUFVRSxDQUFWLEVBQWE7UUFDZjtRQUNBQSxDQUFDLENBQUNDLGFBQUYsR0FBa0J4RCxDQUFDLENBQUMsZ0JBQUQsQ0FBRCxDQUFvQjZDLEdBQXBCLEVBQWxCO1FBQ0FVLENBQUMsQ0FBQ0UsU0FBRixHQUFjekQsQ0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQjZDLEdBQWhCLEVBQWQ7UUFDQVUsQ0FBQyxDQUFDRyxPQUFGLEdBQVkxRCxDQUFDLENBQUMsVUFBRCxDQUFELENBQWM2QyxHQUFkLEVBQVo7UUFFQTFDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHVCQUFaLEVBQXFDO1VBQ2pDb0QsYUFBYSxFQUFFRCxDQUFDLENBQUNDLGFBRGdCO1VBRWpDQyxTQUFTLEVBQUVGLENBQUMsQ0FBQ0UsU0FGb0I7VUFHakNDLE9BQU8sRUFBRUgsQ0FBQyxDQUFDRztRQUhzQixDQUFyQztRQU1BLE9BQU9ILENBQVA7TUFDSCxDQWhCQztNQWlCRmhELEtBQUssRUFBRSxlQUFVb0QsR0FBVixFQUFlcEQsTUFBZixFQUFzQnFELElBQXRCLEVBQTRCO1FBQy9CekQsT0FBTyxDQUFDSSxLQUFSLENBQWMsd0JBQWQsRUFBd0NBLE1BQXhDLEVBQStDcUQsSUFBL0M7UUFDQXpELE9BQU8sQ0FBQ0ksS0FBUixDQUFjLFdBQWQsRUFBMkJvRCxHQUFHLENBQUNFLFlBQS9CO01BQ0g7SUFwQkMsQ0FKb0M7SUEwQjFDQyxVQUFVLEVBQUUsQ0FDUjtNQUFFQyxPQUFPLEVBQUUsQ0FBWDtNQUFjaEQsS0FBSyxFQUFFO0lBQXJCLENBRFEsRUFDcUI7SUFDN0I7TUFBRWdELE9BQU8sRUFBRSxDQUFYO01BQWNoRCxLQUFLLEVBQUUsS0FBckI7TUFBNEJpRCxTQUFTLEVBQUU7SUFBdkMsQ0FGUSxFQUVnRDtJQUN4RDtNQUFFRCxPQUFPLEVBQUUsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFYO01BQW1CQyxTQUFTLEVBQUU7SUFBOUIsQ0FIUSxDQUd1QztJQUh2QyxDQTFCOEI7SUErQjFDQyxPQUFPLEVBQUUsQ0FDTDtNQUNJWixJQUFJLEVBQUUsYUFEVjtNQUVJYSxJQUFJLEVBQUUsYUFGVjtNQUdJQyxTQUFTLEVBQUUsS0FIZjtNQUlJQyxVQUFVLEVBQUU7SUFKaEIsQ0FESyxFQU9MO01BQ0lmLElBQUksRUFBRSxpQkFEVjtNQUVJYSxJQUFJLEVBQUUsaUJBRlY7TUFHSUMsU0FBUyxFQUFFO0lBSGYsQ0FQSyxFQVlMO01BQUVkLElBQUksRUFBRSxZQUFSO01BQXNCYSxJQUFJLEVBQUUsWUFBNUI7TUFBMENDLFNBQVMsRUFBRTtJQUFyRCxDQVpLLEVBYUw7TUFBRWQsSUFBSSxFQUFFLGFBQVI7TUFBdUJhLElBQUksRUFBRSxhQUE3QjtNQUE0Q0MsU0FBUyxFQUFFO0lBQXZELENBYkssRUFjTDtNQUFFZCxJQUFJLEVBQUUsV0FBUjtNQUFxQmEsSUFBSSxFQUFFLFdBQTNCO01BQXdDQyxTQUFTLEVBQUU7SUFBbkQsQ0FkSyxFQWVMO01BQUVkLElBQUksRUFBRSxjQUFSO01BQXdCYSxJQUFJLEVBQUUsY0FBOUI7TUFBOENDLFNBQVMsRUFBRTtJQUF6RCxDQWZLLEVBZ0JMO01BQUVkLElBQUksRUFBRSxhQUFSO01BQXVCYSxJQUFJLEVBQUUsYUFBN0I7TUFBNENDLFNBQVMsRUFBRTtJQUF2RCxDQWhCSyxFQWlCTDtNQUFFZCxJQUFJLEVBQUUsUUFBUjtNQUFrQmEsSUFBSSxFQUFFLFFBQXhCO01BQWtDQyxTQUFTLEVBQUU7SUFBN0MsQ0FqQkssRUFrQkw7TUFDSWQsSUFBSSxFQUFFLFFBRFY7TUFFSWEsSUFBSSxFQUFFLFFBRlY7TUFHSUMsU0FBUyxFQUFFLEtBSGY7TUFJSUMsVUFBVSxFQUFFO0lBSmhCLENBbEJLLENBL0JpQztJQXdEMUNDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBRCxFQUFJLE1BQUosQ0FBRCxDQXhEbUM7SUF3RHBCO0lBQ3RCQyxVQUFVLEVBQUUsRUF6RDhCO0lBMEQxQ0MsVUFBVSxFQUFFLElBMUQ4QjtJQTJEMUNDLFFBQVEsRUFBRSxJQTNEZ0M7SUE0RDFDQyxVQUFVLEVBQUU7RUE1RDhCLENBQWhDLENBQWQsQ0FUMkIsQ0F3RTNCOztFQUNBQyxtQkFBbUIsQ0FBQzFCLEtBQUQsQ0FBbkIsQ0F6RTJCLENBMkUzQjs7RUFDQTJCLHVCQUF1QixDQUFDM0IsS0FBRCxDQUF2QjtBQUNIOztBQUVELFNBQVMwQixtQkFBVCxDQUE2QjFCLEtBQTdCLEVBQW9DO0VBQ2hDO0VBQ0FoRCxDQUFDLENBQUMsWUFBRCxDQUFELENBQWdCMEMsRUFBaEIsQ0FBbUIsT0FBbkIsRUFBNEIsWUFBWTtJQUNwQ3ZDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHVCQUFaO0lBRUEsSUFBTXdFLFlBQVksR0FBRzVFLENBQUMsQ0FBQyxnQkFBRCxDQUFELENBQW9CNkMsR0FBcEIsRUFBckI7SUFDQSxJQUFNZ0MsUUFBUSxHQUFHN0UsQ0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQjZDLEdBQWhCLEVBQWpCO0lBQ0EsSUFBTWlDLE1BQU0sR0FBRzlFLENBQUMsQ0FBQyxVQUFELENBQUQsQ0FBYzZDLEdBQWQsRUFBZjtJQUVBMUMsT0FBTyxDQUFDQyxHQUFSLENBQVksaUJBQVosRUFBK0I7TUFDM0IyRSxNQUFNLEVBQUVILFlBRG1CO01BRTNCQyxRQUFRLEVBQVJBLFFBRjJCO01BRzNCQyxNQUFNLEVBQU5BO0lBSDJCLENBQS9CO0lBTUE5QixLQUFLLENBQUNHLElBQU4sQ0FBVzZCLE1BQVg7RUFDSCxDQWRELEVBRmdDLENBa0JoQzs7RUFDQWhGLENBQUMsQ0FBQyxXQUFELENBQUQsQ0FBZTBDLEVBQWYsQ0FBa0IsT0FBbEIsRUFBMkIsWUFBWTtJQUNuQ3ZDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHNCQUFaLEVBRG1DLENBR25DOztJQUNBSixDQUFDLENBQUMsZ0JBQUQsQ0FBRCxDQUFvQjZDLEdBQXBCLENBQXdCLEVBQXhCLEVBQTRCb0MsT0FBNUIsQ0FBb0MsUUFBcEMsRUFKbUMsQ0FJWTs7SUFDL0NqRixDQUFDLENBQUMsWUFBRCxDQUFELENBQWdCNkMsR0FBaEIsQ0FBb0IsRUFBcEI7SUFDQTdDLENBQUMsQ0FBQyxVQUFELENBQUQsQ0FBYzZDLEdBQWQsQ0FBa0IsRUFBbEIsRUFObUMsQ0FRbkM7O0lBQ0FxQyxrQkFBa0IsR0FUaUIsQ0FXbkM7O0lBQ0FsQyxLQUFLLENBQUNHLElBQU4sQ0FBVzZCLE1BQVg7RUFDSCxDQWJELEVBbkJnQyxDQWtDaEM7O0VBQ0FoRixDQUFDLENBQUMsc0JBQUQsQ0FBRCxDQUEwQjBDLEVBQTFCLENBQTZCLFVBQTdCLEVBQXlDLFVBQVV5QyxDQUFWLEVBQWE7SUFDbEQsSUFBSUEsQ0FBQyxDQUFDQyxLQUFGLEtBQVksRUFBaEIsRUFBb0I7TUFDaEI7TUFDQXBGLENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0JxRixLQUFoQjtJQUNIO0VBQ0osQ0FMRCxFQW5DZ0MsQ0EwQ2hDOztFQUNBckYsQ0FBQyxDQUFDLGdCQUFELENBQUQsQ0FBb0IwQyxFQUFwQixDQUF1QixRQUF2QixFQUFpQyxZQUFZO0lBQ3pDdkMsT0FBTyxDQUFDQyxHQUFSLENBQVksd0JBQVosRUFBc0NKLENBQUMsQ0FBQyxJQUFELENBQUQsQ0FBUTZDLEdBQVIsRUFBdEMsRUFEeUMsQ0FFekM7SUFDQTtFQUNILENBSkQ7QUFLSDs7QUFFRCxTQUFTcUMsa0JBQVQsR0FBOEI7RUFDMUI7RUFDQWxGLENBQUMsQ0FBQyxVQUFELENBQUQsQ0FBY21CLFVBQWQsQ0FBeUIsU0FBekIsRUFGMEIsQ0FJMUI7O0VBQ0FXLHVCQUF1QixHQUxHLENBTzFCOztFQUNBOUIsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxDQUFjK0IsSUFBZCxDQUFtQixVQUFuQixFQUErQixJQUEvQjtFQUVBNUIsT0FBTyxDQUFDQyxHQUFSLENBQVksb0NBQVo7QUFDSDs7QUFFRCxTQUFTdUUsdUJBQVQsQ0FBaUMzQixLQUFqQyxFQUF3QztFQUNwQztFQUNBQSxLQUFLLENBQUNOLEVBQU4sQ0FBUyxVQUFULEVBQXFCLFlBQVk7SUFDN0J2QyxPQUFPLENBQUNDLEdBQVIsQ0FBWSxnQkFBWixFQUE4QjRDLEtBQUssQ0FBQ3FCLEtBQU4sRUFBOUI7RUFDSCxDQUZELEVBRm9DLENBTXBDOztFQUNBckIsS0FBSyxDQUFDTixFQUFOLENBQVMsZUFBVCxFQUEwQixVQUFVeUMsQ0FBVixFQUFhRyxRQUFiLEVBQXVCckMsVUFBdkIsRUFBbUM7SUFDekQsSUFBSUEsVUFBSixFQUFnQjtNQUNaOUMsT0FBTyxDQUFDQyxHQUFSLENBQVksOEJBQVo7SUFDSCxDQUZELE1BRU87TUFDSEQsT0FBTyxDQUFDQyxHQUFSLENBQVksK0JBQVo7SUFDSDtFQUNKLENBTkQsRUFQb0MsQ0FlcEM7O0VBQ0FKLENBQUMsQ0FBQywyQkFBRCxDQUFELENBQStCMEMsRUFBL0IsQ0FBa0MsT0FBbEMsRUFBMkMsWUFBWTtJQUNuRCxJQUFNNkMsV0FBVyxHQUFHdkYsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRd0YsS0FBUixFQUFwQjtJQUNBckYsT0FBTyxDQUFDQyxHQUFSLENBQVksd0JBQVosRUFBc0NtRixXQUF0QyxFQUFtRHZGLENBQUMsQ0FBQyxJQUFELENBQUQsQ0FBUXlGLElBQVIsRUFBbkQsRUFGbUQsQ0FJbkQ7O0lBQ0EsSUFBSUYsV0FBVyxLQUFLLENBQWhCLElBQXFCQSxXQUFXLEtBQUssQ0FBekMsRUFBNEM7TUFDeENwRixPQUFPLENBQUNDLEdBQVIsQ0FBWSx1Q0FBWjtNQUNBO0lBQ0gsQ0FSa0QsQ0FVbkQ7OztJQUNBLElBQ0lKLENBQUMsQ0FBQyxJQUFELENBQUQsQ0FBUTBGLFFBQVIsQ0FBaUIsU0FBakIsS0FDQTFGLENBQUMsQ0FBQyxJQUFELENBQUQsQ0FBUTBGLFFBQVIsQ0FBaUIsYUFBakIsQ0FEQSxJQUVBMUYsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRMEYsUUFBUixDQUFpQixjQUFqQixDQUhKLEVBSUU7TUFDRXZGLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHFDQUFaO0lBQ0gsQ0FORCxNQU1PO01BQ0hELE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHNEQUFaLEVBREcsQ0FFSDs7TUFDQTRDLEtBQUssQ0FBQ3FCLEtBQU4sQ0FBWSxDQUFDa0IsV0FBRCxFQUFjLEtBQWQsQ0FBWixFQUFrQ0ksSUFBbEM7SUFDSDtFQUNKLENBdEJELEVBaEJvQyxDQXdDcEM7O0VBQ0EzRixDQUFDLENBQUNDLFFBQUQsQ0FBRCxDQUFZeUMsRUFBWixDQUFlLE9BQWYsRUFBd0IsYUFBeEIsRUFBdUMsWUFBWTtJQUMvQyxJQUFNa0QsVUFBVSxHQUFHNUYsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRcUQsSUFBUixDQUFhLElBQWIsQ0FBbkI7SUFDQXdDLG9CQUFvQixDQUFDRCxVQUFELEVBQWE1QyxLQUFiLENBQXBCO0VBQ0gsQ0FIRCxFQXpDb0MsQ0E4Q3BDOztFQUNBaEQsQ0FBQyxDQUFDQyxRQUFELENBQUQsQ0FBWXlDLEVBQVosQ0FBZSxRQUFmLEVBQXlCLGVBQXpCLEVBQTBDLFlBQVk7SUFDbEQxQyxDQUFDLENBQUMsSUFBRCxDQUFELENBQ0s4RixJQURMLENBQ1UsdUJBRFYsRUFFSy9ELElBRkwsQ0FFVSxVQUZWLEVBRXNCLElBRnRCLEVBR0tnRSxJQUhMLENBR1UsY0FIVjtFQUlILENBTEQsRUEvQ29DLENBc0RwQzs7RUFDQS9GLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVl5QyxFQUFaLENBQWUsT0FBZixFQUF3QixrQ0FBeEIsRUFBNEQsWUFBWTtJQUNwRXNELHFCQUFxQixDQUFDaEcsQ0FBQyxDQUFDLElBQUQsQ0FBRixDQUFyQjtFQUNILENBRkQ7QUFHSDs7QUFFRCxTQUFTNkYsb0JBQVQsQ0FBOEJELFVBQTlCLEVBQTBDNUMsS0FBMUMsRUFBaUQ7RUFDN0MsSUFBSSxPQUFPaUQsSUFBUCxLQUFnQixXQUFwQixFQUFpQztJQUM3QkEsSUFBSSxDQUFDQyxJQUFMLENBQVU7TUFDTkMsS0FBSyxFQUFFLGtCQUREO01BRU5WLElBQUksRUFBRSxpREFGQTtNQUdOVyxJQUFJLEVBQUUsU0FIQTtNQUlOQyxnQkFBZ0IsRUFBRSxJQUpaO01BS05DLGtCQUFrQixFQUFFLE1BTGQ7TUFNTkMsaUJBQWlCLEVBQUUsU0FOYjtNQU9OQyxpQkFBaUIsRUFBRSxjQVBiO01BUU5DLGdCQUFnQixFQUFFO0lBUlosQ0FBVixFQVNHQyxJQVRILENBU1EsVUFBQ0MsTUFBRCxFQUFZO01BQ2hCLElBQUlBLE1BQU0sQ0FBQ0MsV0FBWCxFQUF3QjtRQUNwQkMsY0FBYyxDQUFDakIsVUFBRCxFQUFhNUMsS0FBYixDQUFkO01BQ0g7SUFDSixDQWJEO0VBY0gsQ0FmRCxNQWVPO0lBQ0gsSUFBSThELE9BQU8sQ0FBQyxpREFBRCxDQUFYLEVBQWdFO01BQzVERCxjQUFjLENBQUNqQixVQUFELEVBQWE1QyxLQUFiLENBQWQ7SUFDSDtFQUNKO0FBQ0o7O0FBRUQsU0FBU2dELHFCQUFULENBQStCckQsS0FBL0IsRUFBc0M7RUFDbEMsSUFBTW9FLFFBQVEsR0FBR0MsVUFBVSxDQUFDckUsS0FBSyxDQUFDc0UsSUFBTixDQUFXLEtBQVgsQ0FBRCxDQUEzQjtFQUNBLElBQU1DLFlBQVksR0FBR0YsVUFBVSxDQUFDckUsS0FBSyxDQUFDRSxHQUFOLEVBQUQsQ0FBL0I7O0VBRUEsSUFBSWtFLFFBQVEsSUFBSUcsWUFBWSxHQUFHSCxRQUEvQixFQUF5QztJQUNyQ3BFLEtBQUssQ0FBQ0UsR0FBTixDQUFVa0UsUUFBVjtJQUNBcEUsS0FBSyxDQUFDd0UsUUFBTixDQUFlLFlBQWY7O0lBRUEsSUFBSSxDQUFDeEUsS0FBSyxDQUFDeUUsUUFBTixDQUFlLG1CQUFmLEVBQW9DQyxNQUF6QyxFQUFpRDtNQUM3QzFFLEtBQUssQ0FBQ0osS0FBTixDQUNJLGdGQURKO0lBR0g7RUFDSixDQVRELE1BU087SUFDSEksS0FBSyxDQUFDMkUsV0FBTixDQUFrQixZQUFsQjtJQUNBM0UsS0FBSyxDQUFDeUUsUUFBTixDQUFlLG1CQUFmLEVBQW9DL0UsTUFBcEM7RUFDSDtBQUNKOztBQUVELFNBQVN3RSxjQUFULENBQXdCakIsVUFBeEIsRUFBb0M1QyxLQUFwQyxFQUEyQztFQUN2Q2hELENBQUMsQ0FBQ21ELElBQUYsQ0FBTztJQUNIQyxHQUFHLEVBQUUsMEJBQTBCd0MsVUFBMUIsR0FBdUMsU0FEekM7SUFFSHRDLElBQUksRUFBRSxNQUZIO0lBR0hELElBQUksRUFBRTtNQUNGa0UsTUFBTSxFQUFFdkgsQ0FBQyxDQUFDLHlCQUFELENBQUQsQ0FBNkJpSCxJQUE3QixDQUFrQyxTQUFsQztJQUROLENBSEg7SUFNSE8sT0FBTyxFQUFFLGlCQUFVQyxRQUFWLEVBQW9CO01BQ3pCLElBQUksT0FBT3hCLElBQVAsS0FBZ0IsV0FBcEIsRUFBaUM7UUFDN0JBLElBQUksQ0FBQ0MsSUFBTCxDQUFVO1VBQ05DLEtBQUssRUFBRSxXQUREO1VBRU5WLElBQUksRUFBRSw0QkFGQTtVQUdOVyxJQUFJLEVBQUUsU0FIQTtVQUlOc0IsS0FBSyxFQUFFLElBSkQ7VUFLTkMsaUJBQWlCLEVBQUU7UUFMYixDQUFWO01BT0gsQ0FSRCxNQVFPO1FBQ0hDLEtBQUssQ0FBQyw0QkFBRCxDQUFMO01BQ0gsQ0FYd0IsQ0FhekI7OztNQUNBNUUsS0FBSyxDQUFDRyxJQUFOLENBQVc2QixNQUFYO0lBQ0gsQ0FyQkU7SUFzQkh6RSxLQUFLLEVBQUUsZUFBVW9ELEdBQVYsRUFBZTtNQUFBOztNQUNsQixJQUFNa0UsUUFBUSxHQUNWLHNCQUFBbEUsR0FBRyxDQUFDbUUsWUFBSix3RUFBa0JDLE9BQWxCLEtBQTZCLDBCQURqQzs7TUFHQSxJQUFJLE9BQU85QixJQUFQLEtBQWdCLFdBQXBCLEVBQWlDO1FBQzdCQSxJQUFJLENBQUNDLElBQUwsQ0FBVTtVQUNOQyxLQUFLLEVBQUUsUUFERDtVQUVOVixJQUFJLEVBQUVvQyxRQUZBO1VBR056QixJQUFJLEVBQUU7UUFIQSxDQUFWO01BS0gsQ0FORCxNQU1PO1FBQ0h3QixLQUFLLENBQUMsWUFBWUMsUUFBYixDQUFMO01BQ0g7SUFDSjtFQW5DRSxDQUFQO0FBcUNIIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL3dhcmVob3VzZV9tYW5hZ2VtZW50L211dGF0aW9ucy9pbmRleC5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/mutations/index.js\n");
/***/ })
diff --git a/public/js/warehouse_management/opnames/index.js b/public/js/warehouse_management/opnames/index.js
index a484886..88021ad 100755
--- a/public/js/warehouse_management/opnames/index.js
+++ b/public/js/warehouse_management/opnames/index.js
@@ -15,7 +15,7 @@
\************************************************************/
/***/ (() => {
-eval("$.ajaxSetup({\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\")\n }\n});\nvar tableContainer = $(\"#opnames-table\");\nvar url = tableContainer.data(\"url\");\nvar table = $(\"#opnames-table\").DataTable({\n processing: true,\n serverSide: true,\n ajax: url,\n order: [[0, \"desc\"]],\n columns: [{\n data: \"created_at\",\n name: \"created_at\",\n visible: false\n }, {\n data: \"opname_date\",\n name: \"opname_date\"\n }, {\n data: \"dealer_name\",\n name: \"dealer.name\"\n }, {\n data: \"user_name\",\n name: \"user.name\"\n }, {\n data: \"status\",\n name: \"status\"\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }]\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyIkIiwiYWpheFNldHVwIiwiaGVhZGVycyIsImF0dHIiLCJ0YWJsZUNvbnRhaW5lciIsInVybCIsImRhdGEiLCJ0YWJsZSIsIkRhdGFUYWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsIm9yZGVyIiwiY29sdW1ucyIsIm5hbWUiLCJ2aXNpYmxlIiwib3JkZXJhYmxlIiwic2VhcmNoYWJsZSJdLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvb3BuYW1lcy9pbmRleC5qcz9hNGM4Il0sInNvdXJjZXNDb250ZW50IjpbIiQuYWpheFNldHVwKHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiWC1DU1JGLVRPS0VOXCI6ICQoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5hdHRyKFwiY29udGVudFwiKSxcbiAgICB9LFxufSk7XG5cbmxldCB0YWJsZUNvbnRhaW5lciA9ICQoXCIjb3BuYW1lcy10YWJsZVwiKTtcbmxldCB1cmwgPSB0YWJsZUNvbnRhaW5lci5kYXRhKFwidXJsXCIpO1xubGV0IHRhYmxlID0gJChcIiNvcG5hbWVzLXRhYmxlXCIpLkRhdGFUYWJsZSh7XG4gICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICBzZXJ2ZXJTaWRlOiB0cnVlLFxuICAgIGFqYXg6IHVybCxcbiAgICBvcmRlcjogW1swLCBcImRlc2NcIl1dLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBkYXRhOiBcImNyZWF0ZWRfYXRcIiwgbmFtZTogXCJjcmVhdGVkX2F0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgIHsgZGF0YTogXCJvcG5hbWVfZGF0ZVwiLCBuYW1lOiBcIm9wbmFtZV9kYXRlXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcImRlYWxlcl9uYW1lXCIsIG5hbWU6IFwiZGVhbGVyLm5hbWVcIiB9LFxuICAgICAgICB7IGRhdGE6IFwidXNlcl9uYW1lXCIsIG5hbWU6IFwidXNlci5uYW1lXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcInN0YXR1c1wiLCBuYW1lOiBcInN0YXR1c1wiIH0sXG4gICAgICAgIHsgZGF0YTogXCJhY3Rpb25cIiwgbmFtZTogXCJhY3Rpb25cIiwgb3JkZXJhYmxlOiBmYWxzZSwgc2VhcmNoYWJsZTogZmFsc2UgfSxcbiAgICBdLFxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBQSxDQUFDLENBQUNDLFNBQUYsQ0FBWTtFQUNSQyxPQUFPLEVBQUU7SUFDTCxnQkFBZ0JGLENBQUMsQ0FBQyx5QkFBRCxDQUFELENBQTZCRyxJQUE3QixDQUFrQyxTQUFsQztFQURYO0FBREQsQ0FBWjtBQU1BLElBQUlDLGNBQWMsR0FBR0osQ0FBQyxDQUFDLGdCQUFELENBQXRCO0FBQ0EsSUFBSUssR0FBRyxHQUFHRCxjQUFjLENBQUNFLElBQWYsQ0FBb0IsS0FBcEIsQ0FBVjtBQUNBLElBQUlDLEtBQUssR0FBR1AsQ0FBQyxDQUFDLGdCQUFELENBQUQsQ0FBb0JRLFNBQXBCLENBQThCO0VBQ3RDQyxVQUFVLEVBQUUsSUFEMEI7RUFFdENDLFVBQVUsRUFBRSxJQUYwQjtFQUd0Q0MsSUFBSSxFQUFFTixHQUhnQztFQUl0Q08sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFELEVBQUksTUFBSixDQUFELENBSitCO0VBS3RDQyxPQUFPLEVBQUUsQ0FDTDtJQUFFUCxJQUFJLEVBQUUsWUFBUjtJQUFzQlEsSUFBSSxFQUFFLFlBQTVCO0lBQTBDQyxPQUFPLEVBQUU7RUFBbkQsQ0FESyxFQUVMO0lBQUVULElBQUksRUFBRSxhQUFSO0lBQXVCUSxJQUFJLEVBQUU7RUFBN0IsQ0FGSyxFQUdMO0lBQUVSLElBQUksRUFBRSxhQUFSO0lBQXVCUSxJQUFJLEVBQUU7RUFBN0IsQ0FISyxFQUlMO0lBQUVSLElBQUksRUFBRSxXQUFSO0lBQXFCUSxJQUFJLEVBQUU7RUFBM0IsQ0FKSyxFQUtMO0lBQUVSLElBQUksRUFBRSxRQUFSO0lBQWtCUSxJQUFJLEVBQUU7RUFBeEIsQ0FMSyxFQU1MO0lBQUVSLElBQUksRUFBRSxRQUFSO0lBQWtCUSxJQUFJLEVBQUUsUUFBeEI7SUFBa0NFLFNBQVMsRUFBRSxLQUE3QztJQUFvREMsVUFBVSxFQUFFO0VBQWhFLENBTks7QUFMNkIsQ0FBOUIsQ0FBWiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy93YXJlaG91c2VfbWFuYWdlbWVudC9vcG5hbWVzL2luZGV4LmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/opnames/index.js\n");
+eval("$(document).ready(function () {\n console.log(\"Opnames index.js loaded\"); // Check if required libraries are available\n\n if (typeof $.fn.DataTable === \"undefined\") {\n console.error(\"DataTables not available!\");\n return;\n } // Initialize components\n\n\n initializeSelect2();\n initializeDatepickers(); // Wait for DOM to be fully ready before initializing DataTable\n\n setTimeout(function () {\n initializeDataTable();\n }, 100);\n});\n/**\n * Initialize Select2 for dealer filter\n */\n\nfunction initializeSelect2() {\n console.log(\"Initializing Select2...\");\n\n if (typeof $.fn.select2 !== \"undefined\") {\n $(\"#dealer_filter\").select2({\n placeholder: \"Pilih Dealer\",\n allowClear: false,\n width: \"100%\",\n dropdownAutoWidth: true,\n minimumResultsForSearch: 5 // Show search box if more than 5 options\n\n });\n } else {\n console.warn(\"Select2 not available, using regular select\");\n }\n}\n/**\n * Initialize date pickers with validation\n */\n\n\nfunction initializeDatepickers() {\n console.log(\"Initializing datepickers...\"); // Initialize start date picker\n\n $(\"#date_from\").datepicker({\n dateFormat: \"yy-mm-dd\",\n changeMonth: true,\n changeYear: true,\n maxDate: new Date(),\n yearRange: \"-5:+0\",\n onSelect: function onSelect(selectedDate) {\n console.log(\"Start date selected:\", selectedDate);\n enableEndDatePicker(selectedDate);\n $(this).datepicker(\"hide\");\n },\n onClose: function onClose(selectedDate) {\n if (selectedDate) {\n console.log(\"Start date closed with value:\", selectedDate);\n enableEndDatePicker(selectedDate);\n }\n }\n }); // Initialize end date picker (initially disabled)\n\n initializeEndDatePicker(); // Initially disable end date input\n\n $(\"#date_to\").prop(\"disabled\", true); // Add calendar icons\n\n addCalendarIcons(); // Setup calendar icon click handlers\n\n setupIconClickHandlers(); // Setup change event handlers as backup\n\n setupChangeEventHandlers();\n}\n/**\n * Enable end date picker with minimum date constraint\n */\n\n\nfunction enableEndDatePicker(startDate) {\n console.log(\"Enabling end date picker with min date:\", startDate); // Enable the input\n\n $(\"#date_to\").prop(\"disabled\", false); // Destroy existing datepicker\n\n $(\"#date_to\").datepicker(\"destroy\"); // Re-initialize with new minDate\n\n $(\"#date_to\").datepicker({\n dateFormat: \"yy-mm-dd\",\n changeMonth: true,\n changeYear: true,\n maxDate: new Date(),\n yearRange: \"-5:+0\",\n minDate: new Date(startDate),\n // Convert to Date object for proper comparison\n onSelect: function onSelect(selectedDate) {\n console.log(\"End date selected:\", selectedDate);\n $(this).datepicker(\"hide\");\n }\n });\n console.log(\"End date picker enabled with minDate:\", startDate);\n}\n/**\n * Initialize end date picker without constraints\n */\n\n\nfunction initializeEndDatePicker() {\n $(\"#date_to\").datepicker({\n dateFormat: \"yy-mm-dd\",\n changeMonth: true,\n changeYear: true,\n maxDate: new Date(),\n yearRange: \"-5:+0\",\n onSelect: function onSelect(selectedDate) {\n console.log(\"End date selected:\", selectedDate);\n $(this).datepicker(\"hide\");\n }\n });\n}\n/**\n * Add calendar icons to date inputs\n */\n\n\nfunction addCalendarIcons() {\n // Remove any existing icons first\n $(\".input-icon\").remove(); // Add calendar icons with CSS classes\n\n var iconHtml = '';\n $(\"#date_from\").after(iconHtml);\n $(\"#date_to\").after(iconHtml); // Ensure parent containers have relative positioning\n\n $(\"#date_from, #date_to\").closest(\".form-group\").css(\"position\", \"relative\");\n}\n/**\n * Setup click handlers for calendar icons\n */\n\n\nfunction setupIconClickHandlers() {\n $(document).on(\"click\", \".input-icon\", function () {\n var input = $(this).prev(\"input\");\n\n if (!input.prop(\"disabled\")) {\n input.datepicker(\"show\");\n }\n });\n}\n/**\n * Setup change event handlers for date inputs\n */\n\n\nfunction setupChangeEventHandlers() {\n $(\"#date_from\").on(\"change\", function () {\n var selectedDate = $(this).val();\n\n if (selectedDate) {\n console.log(\"Start date change event:\", selectedDate);\n enableEndDatePicker(selectedDate);\n }\n });\n}\n/**\n * Initialize DataTable with server-side processing and filtering\n */\n\n\nfunction initializeDataTable() {\n console.log(\"Initializing DataTable...\"); // Destroy existing table if any\n\n if ($.fn.DataTable.isDataTable(\"#opnames-table\")) {\n $(\"#opnames-table\").DataTable().destroy();\n } // Initialize DataTable\n\n\n var table = $(\"#opnames-table\").DataTable({\n processing: true,\n serverSide: true,\n destroy: true,\n ajax: {\n url: $(\"#opnames-table\").data(\"url\"),\n type: \"GET\",\n data: function data(d) {\n // Add filter parameters\n d.dealer_filter = $(\"#dealer_filter\").val();\n d.date_from = $(\"#date_from\").val();\n d.date_to = $(\"#date_to\").val();\n console.log(\"AJAX data being sent:\", {\n dealer_filter: d.dealer_filter,\n date_from: d.date_from,\n date_to: d.date_to\n });\n return d;\n },\n error: function error(xhr, _error, code) {\n console.error(\"DataTables AJAX error:\", _error, code);\n console.error(\"Response:\", xhr.responseText);\n }\n },\n columnDefs: [{\n targets: 0,\n width: \"15%\"\n }, // Opname Date column\n {\n targets: 5,\n width: \"15%\",\n className: \"text-center\"\n } // Action column\n ],\n columns: [{\n data: \"created_at\",\n name: \"created_at\",\n orderable: true\n }, {\n data: \"opname_date\",\n name: \"opname_date\",\n orderable: true\n }, {\n data: \"dealer_name\",\n name: \"dealer.name\",\n orderable: true\n }, {\n data: \"user_name\",\n name: \"user.name\",\n orderable: true\n }, {\n data: \"status\",\n name: \"status\",\n orderable: true\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }],\n order: [[4, \"desc\"]],\n // Order by created_at desc\n pageLength: 10,\n responsive: true,\n ordering: true,\n orderMulti: false\n }); // Setup filter button handlers\n\n setupFilterHandlers(table); // Setup other event handlers\n\n setupTableEventHandlers(table);\n}\n/**\n * Setup filter and reset button handlers\n */\n\n\nfunction setupFilterHandlers(table) {\n // Handle Filter Search Button\n $(\"#kt_search\").on(\"click\", function () {\n console.log(\"Filter button clicked\");\n var dealerFilter = $(\"#dealer_filter\").val();\n var dateFrom = $(\"#date_from\").val();\n var dateTo = $(\"#date_to\").val();\n console.log(\"Filtering with:\", {\n dealer: dealerFilter,\n dateFrom: dateFrom,\n dateTo: dateTo\n });\n table.ajax.reload();\n }); // Handle Filter Reset Button\n\n $(\"#kt_reset\").on(\"click\", function () {\n console.log(\"Reset button clicked\"); // Clear all filters\n\n $(\"#dealer_filter\").val(\"\").trigger(\"change\"); // Reset Select2\n\n $(\"#date_from\").val(\"\");\n $(\"#date_to\").val(\"\"); // Reset end date picker and disable it\n\n resetEndDatePicker(); // Reload table\n\n table.ajax.reload();\n }); // Handle Enter key on date inputs\n\n $(\"#date_from, #date_to\").on(\"keypress\", function (e) {\n if (e.which === 13) {\n // Enter key\n $(\"#kt_search\").click();\n }\n }); // Optional: Auto-filter when dealer selection changes\n\n $(\"#dealer_filter\").on(\"change\", function () {\n console.log(\"Dealer filter changed:\", $(this).val()); // Uncomment the line below if you want auto-filter on dealer change\n // table.ajax.reload();\n });\n}\n/**\n * Reset end date picker to initial state\n */\n\n\nfunction resetEndDatePicker() {\n // Destroy existing datepicker\n $(\"#date_to\").datepicker(\"destroy\"); // Re-initialize without minDate constraint\n\n initializeEndDatePicker(); // Disable the input\n\n $(\"#date_to\").prop(\"disabled\", true);\n console.log(\"End date picker reset and disabled\");\n}\n/**\n * Setup additional table event handlers\n */\n\n\nfunction setupTableEventHandlers(table) {\n // Debug ordering events\n table.on(\"order.dt\", function () {\n console.log(\"Order changed:\", table.order());\n }); // Add loading indicator for processing\n\n table.on(\"processing.dt\", function (e, settings, processing) {\n if (processing) {\n console.log(\"DataTable processing started\");\n } else {\n console.log(\"DataTable processing finished\");\n }\n }); // Handle any custom button clicks here if needed\n // Example: $(document).on('click', '.custom-btn', function() { ... });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvb3BuYW1lcy9pbmRleC5qcyIsIm5hbWVzIjpbIiQiLCJkb2N1bWVudCIsInJlYWR5IiwiY29uc29sZSIsImxvZyIsImZuIiwiRGF0YVRhYmxlIiwiZXJyb3IiLCJpbml0aWFsaXplU2VsZWN0MiIsImluaXRpYWxpemVEYXRlcGlja2VycyIsInNldFRpbWVvdXQiLCJpbml0aWFsaXplRGF0YVRhYmxlIiwic2VsZWN0MiIsInBsYWNlaG9sZGVyIiwiYWxsb3dDbGVhciIsIndpZHRoIiwiZHJvcGRvd25BdXRvV2lkdGgiLCJtaW5pbXVtUmVzdWx0c0ZvclNlYXJjaCIsIndhcm4iLCJkYXRlcGlja2VyIiwiZGF0ZUZvcm1hdCIsImNoYW5nZU1vbnRoIiwiY2hhbmdlWWVhciIsIm1heERhdGUiLCJEYXRlIiwieWVhclJhbmdlIiwib25TZWxlY3QiLCJzZWxlY3RlZERhdGUiLCJlbmFibGVFbmREYXRlUGlja2VyIiwib25DbG9zZSIsImluaXRpYWxpemVFbmREYXRlUGlja2VyIiwicHJvcCIsImFkZENhbGVuZGFySWNvbnMiLCJzZXR1cEljb25DbGlja0hhbmRsZXJzIiwic2V0dXBDaGFuZ2VFdmVudEhhbmRsZXJzIiwic3RhcnREYXRlIiwibWluRGF0ZSIsInJlbW92ZSIsImljb25IdG1sIiwiYWZ0ZXIiLCJjbG9zZXN0IiwiY3NzIiwib24iLCJpbnB1dCIsInByZXYiLCJ2YWwiLCJpc0RhdGFUYWJsZSIsImRlc3Ryb3kiLCJ0YWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsInVybCIsImRhdGEiLCJ0eXBlIiwiZCIsImRlYWxlcl9maWx0ZXIiLCJkYXRlX2Zyb20iLCJkYXRlX3RvIiwieGhyIiwiY29kZSIsInJlc3BvbnNlVGV4dCIsImNvbHVtbkRlZnMiLCJ0YXJnZXRzIiwiY2xhc3NOYW1lIiwiY29sdW1ucyIsIm5hbWUiLCJvcmRlcmFibGUiLCJzZWFyY2hhYmxlIiwib3JkZXIiLCJwYWdlTGVuZ3RoIiwicmVzcG9uc2l2ZSIsIm9yZGVyaW5nIiwib3JkZXJNdWx0aSIsInNldHVwRmlsdGVySGFuZGxlcnMiLCJzZXR1cFRhYmxlRXZlbnRIYW5kbGVycyIsImRlYWxlckZpbHRlciIsImRhdGVGcm9tIiwiZGF0ZVRvIiwiZGVhbGVyIiwicmVsb2FkIiwidHJpZ2dlciIsInJlc2V0RW5kRGF0ZVBpY2tlciIsImUiLCJ3aGljaCIsImNsaWNrIiwic2V0dGluZ3MiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy93YXJlaG91c2VfbWFuYWdlbWVudC9vcG5hbWVzL2luZGV4LmpzP2E0YzgiXSwic291cmNlc0NvbnRlbnQiOlsiJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKFwiT3BuYW1lcyBpbmRleC5qcyBsb2FkZWRcIik7XG5cbiAgICAvLyBDaGVjayBpZiByZXF1aXJlZCBsaWJyYXJpZXMgYXJlIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgJC5mbi5EYXRhVGFibGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkRhdGFUYWJsZXMgbm90IGF2YWlsYWJsZSFcIik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbXBvbmVudHNcbiAgICBpbml0aWFsaXplU2VsZWN0MigpO1xuICAgIGluaXRpYWxpemVEYXRlcGlja2VycygpO1xuXG4gICAgLy8gV2FpdCBmb3IgRE9NIHRvIGJlIGZ1bGx5IHJlYWR5IGJlZm9yZSBpbml0aWFsaXppbmcgRGF0YVRhYmxlXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGluaXRpYWxpemVEYXRhVGFibGUoKTtcbiAgICB9LCAxMDApO1xufSk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBTZWxlY3QyIGZvciBkZWFsZXIgZmlsdGVyXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVTZWxlY3QyKCkge1xuICAgIGNvbnNvbGUubG9nKFwiSW5pdGlhbGl6aW5nIFNlbGVjdDIuLi5cIik7XG5cbiAgICBpZiAodHlwZW9mICQuZm4uc2VsZWN0MiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAkKFwiI2RlYWxlcl9maWx0ZXJcIikuc2VsZWN0Mih7XG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJQaWxpaCBEZWFsZXJcIixcbiAgICAgICAgICAgIGFsbG93Q2xlYXI6IGZhbHNlLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgICAgZHJvcGRvd25BdXRvV2lkdGg6IHRydWUsXG4gICAgICAgICAgICBtaW5pbXVtUmVzdWx0c0ZvclNlYXJjaDogNSwgLy8gU2hvdyBzZWFyY2ggYm94IGlmIG1vcmUgdGhhbiA1IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiU2VsZWN0MiBub3QgYXZhaWxhYmxlLCB1c2luZyByZWd1bGFyIHNlbGVjdFwiKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBkYXRlIHBpY2tlcnMgd2l0aCB2YWxpZGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVEYXRlcGlja2VycygpIHtcbiAgICBjb25zb2xlLmxvZyhcIkluaXRpYWxpemluZyBkYXRlcGlja2Vycy4uLlwiKTtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhcnQgZGF0ZSBwaWNrZXJcbiAgICAkKFwiI2RhdGVfZnJvbVwiKS5kYXRlcGlja2VyKHtcbiAgICAgICAgZGF0ZUZvcm1hdDogXCJ5eS1tbS1kZFwiLFxuICAgICAgICBjaGFuZ2VNb250aDogdHJ1ZSxcbiAgICAgICAgY2hhbmdlWWVhcjogdHJ1ZSxcbiAgICAgICAgbWF4RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgeWVhclJhbmdlOiBcIi01OiswXCIsXG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0YXJ0IGRhdGUgc2VsZWN0ZWQ6XCIsIHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICBlbmFibGVFbmREYXRlUGlja2VyKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICAkKHRoaXMpLmRhdGVwaWNrZXIoXCJoaWRlXCIpO1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiAoc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTdGFydCBkYXRlIGNsb3NlZCB3aXRoIHZhbHVlOlwiLCBzZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUVuZERhdGVQaWNrZXIoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgZW5kIGRhdGUgcGlja2VyIChpbml0aWFsbHkgZGlzYWJsZWQpXG4gICAgaW5pdGlhbGl6ZUVuZERhdGVQaWNrZXIoKTtcblxuICAgIC8vIEluaXRpYWxseSBkaXNhYmxlIGVuZCBkYXRlIGlucHV0XG4gICAgJChcIiNkYXRlX3RvXCIpLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblxuICAgIC8vIEFkZCBjYWxlbmRhciBpY29uc1xuICAgIGFkZENhbGVuZGFySWNvbnMoKTtcblxuICAgIC8vIFNldHVwIGNhbGVuZGFyIGljb24gY2xpY2sgaGFuZGxlcnNcbiAgICBzZXR1cEljb25DbGlja0hhbmRsZXJzKCk7XG5cbiAgICAvLyBTZXR1cCBjaGFuZ2UgZXZlbnQgaGFuZGxlcnMgYXMgYmFja3VwXG4gICAgc2V0dXBDaGFuZ2VFdmVudEhhbmRsZXJzKCk7XG59XG5cbi8qKlxuICogRW5hYmxlIGVuZCBkYXRlIHBpY2tlciB3aXRoIG1pbmltdW0gZGF0ZSBjb25zdHJhaW50XG4gKi9cbmZ1bmN0aW9uIGVuYWJsZUVuZERhdGVQaWNrZXIoc3RhcnREYXRlKSB7XG4gICAgY29uc29sZS5sb2coXCJFbmFibGluZyBlbmQgZGF0ZSBwaWNrZXIgd2l0aCBtaW4gZGF0ZTpcIiwgc3RhcnREYXRlKTtcblxuICAgIC8vIEVuYWJsZSB0aGUgaW5wdXRcbiAgICAkKFwiI2RhdGVfdG9cIikucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcblxuICAgIC8vIERlc3Ryb3kgZXhpc3RpbmcgZGF0ZXBpY2tlclxuICAgICQoXCIjZGF0ZV90b1wiKS5kYXRlcGlja2VyKFwiZGVzdHJveVwiKTtcblxuICAgIC8vIFJlLWluaXRpYWxpemUgd2l0aCBuZXcgbWluRGF0ZVxuICAgICQoXCIjZGF0ZV90b1wiKS5kYXRlcGlja2VyKHtcbiAgICAgICAgZGF0ZUZvcm1hdDogXCJ5eS1tbS1kZFwiLFxuICAgICAgICBjaGFuZ2VNb250aDogdHJ1ZSxcbiAgICAgICAgY2hhbmdlWWVhcjogdHJ1ZSxcbiAgICAgICAgbWF4RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgeWVhclJhbmdlOiBcIi01OiswXCIsXG4gICAgICAgIG1pbkRhdGU6IG5ldyBEYXRlKHN0YXJ0RGF0ZSksIC8vIENvbnZlcnQgdG8gRGF0ZSBvYmplY3QgZm9yIHByb3BlciBjb21wYXJpc29uXG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVuZCBkYXRlIHNlbGVjdGVkOlwiLCBzZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgJCh0aGlzKS5kYXRlcGlja2VyKFwiaGlkZVwiKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKFwiRW5kIGRhdGUgcGlja2VyIGVuYWJsZWQgd2l0aCBtaW5EYXRlOlwiLCBzdGFydERhdGUpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgZW5kIGRhdGUgcGlja2VyIHdpdGhvdXQgY29uc3RyYWludHNcbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZUVuZERhdGVQaWNrZXIoKSB7XG4gICAgJChcIiNkYXRlX3RvXCIpLmRhdGVwaWNrZXIoe1xuICAgICAgICBkYXRlRm9ybWF0OiBcInl5LW1tLWRkXCIsXG4gICAgICAgIGNoYW5nZU1vbnRoOiB0cnVlLFxuICAgICAgICBjaGFuZ2VZZWFyOiB0cnVlLFxuICAgICAgICBtYXhEYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB5ZWFyUmFuZ2U6IFwiLTU6KzBcIixcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRW5kIGRhdGUgc2VsZWN0ZWQ6XCIsIHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICAkKHRoaXMpLmRhdGVwaWNrZXIoXCJoaWRlXCIpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vKipcbiAqIEFkZCBjYWxlbmRhciBpY29ucyB0byBkYXRlIGlucHV0c1xuICovXG5mdW5jdGlvbiBhZGRDYWxlbmRhckljb25zKCkge1xuICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgaWNvbnMgZmlyc3RcbiAgICAkKFwiLmlucHV0LWljb25cIikucmVtb3ZlKCk7XG5cbiAgICAvLyBBZGQgY2FsZW5kYXIgaWNvbnMgd2l0aCBDU1MgY2xhc3Nlc1xuICAgIGNvbnN0IGljb25IdG1sID0gJzxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgaW5wdXQtaWNvblwiPjwvaT4nO1xuXG4gICAgJChcIiNkYXRlX2Zyb21cIikuYWZ0ZXIoaWNvbkh0bWwpO1xuICAgICQoXCIjZGF0ZV90b1wiKS5hZnRlcihpY29uSHRtbCk7XG5cbiAgICAvLyBFbnN1cmUgcGFyZW50IGNvbnRhaW5lcnMgaGF2ZSByZWxhdGl2ZSBwb3NpdGlvbmluZ1xuICAgICQoXCIjZGF0ZV9mcm9tLCAjZGF0ZV90b1wiKVxuICAgICAgICAuY2xvc2VzdChcIi5mb3JtLWdyb3VwXCIpXG4gICAgICAgIC5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xufVxuXG4vKipcbiAqIFNldHVwIGNsaWNrIGhhbmRsZXJzIGZvciBjYWxlbmRhciBpY29uc1xuICovXG5mdW5jdGlvbiBzZXR1cEljb25DbGlja0hhbmRsZXJzKCkge1xuICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIuaW5wdXQtaWNvblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gJCh0aGlzKS5wcmV2KFwiaW5wdXRcIik7XG4gICAgICAgIGlmICghaW5wdXQucHJvcChcImRpc2FibGVkXCIpKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRlcGlja2VyKFwic2hvd1wiKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIFNldHVwIGNoYW5nZSBldmVudCBoYW5kbGVycyBmb3IgZGF0ZSBpbnB1dHNcbiAqL1xuZnVuY3Rpb24gc2V0dXBDaGFuZ2VFdmVudEhhbmRsZXJzKCkge1xuICAgICQoXCIjZGF0ZV9mcm9tXCIpLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJTdGFydCBkYXRlIGNoYW5nZSBldmVudDpcIiwgc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIGVuYWJsZUVuZERhdGVQaWNrZXIoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgRGF0YVRhYmxlIHdpdGggc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBhbmQgZmlsdGVyaW5nXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVEYXRhVGFibGUoKSB7XG4gICAgY29uc29sZS5sb2coXCJJbml0aWFsaXppbmcgRGF0YVRhYmxlLi4uXCIpO1xuXG4gICAgLy8gRGVzdHJveSBleGlzdGluZyB0YWJsZSBpZiBhbnlcbiAgICBpZiAoJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoXCIjb3BuYW1lcy10YWJsZVwiKSkge1xuICAgICAgICAkKFwiI29wbmFtZXMtdGFibGVcIikuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgRGF0YVRhYmxlXG4gICAgY29uc3QgdGFibGUgPSAkKFwiI29wbmFtZXMtdGFibGVcIikuRGF0YVRhYmxlKHtcbiAgICAgICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICAgICAgc2VydmVyU2lkZTogdHJ1ZSxcbiAgICAgICAgZGVzdHJveTogdHJ1ZSxcbiAgICAgICAgYWpheDoge1xuICAgICAgICAgICAgdXJsOiAkKFwiI29wbmFtZXMtdGFibGVcIikuZGF0YShcInVybFwiKSxcbiAgICAgICAgICAgIHR5cGU6IFwiR0VUXCIsXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIC8vIEFkZCBmaWx0ZXIgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGQuZGVhbGVyX2ZpbHRlciA9ICQoXCIjZGVhbGVyX2ZpbHRlclwiKS52YWwoKTtcbiAgICAgICAgICAgICAgICBkLmRhdGVfZnJvbSA9ICQoXCIjZGF0ZV9mcm9tXCIpLnZhbCgpO1xuICAgICAgICAgICAgICAgIGQuZGF0ZV90byA9ICQoXCIjZGF0ZV90b1wiKS52YWwoKTtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQUpBWCBkYXRhIGJlaW5nIHNlbnQ6XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZGVhbGVyX2ZpbHRlcjogZC5kZWFsZXJfZmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBkYXRlX2Zyb206IGQuZGF0ZV9mcm9tLFxuICAgICAgICAgICAgICAgICAgICBkYXRlX3RvOiBkLmRhdGVfdG8sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhociwgZXJyb3IsIGNvZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRGF0YVRhYmxlcyBBSkFYIGVycm9yOlwiLCBlcnJvciwgY29kZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJlc3BvbnNlOlwiLCB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNvbHVtbkRlZnM6IFtcbiAgICAgICAgICAgIHsgdGFyZ2V0czogMCwgd2lkdGg6IFwiMTUlXCIgfSwgLy8gT3BuYW1lIERhdGUgY29sdW1uXG4gICAgICAgICAgICB7IHRhcmdldHM6IDUsIHdpZHRoOiBcIjE1JVwiLCBjbGFzc05hbWU6IFwidGV4dC1jZW50ZXJcIiB9LCAvLyBBY3Rpb24gY29sdW1uXG4gICAgICAgIF0sXG4gICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwib3BuYW1lX2RhdGVcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm9wbmFtZV9kYXRlXCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcImRlYWxlcl9uYW1lXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJkZWFsZXIubmFtZVwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJ1c2VyX25hbWVcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInVzZXIubmFtZVwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJzdGF0dXNcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcImFjdGlvblwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvcmRlcjogW1s0LCBcImRlc2NcIl1dLCAvLyBPcmRlciBieSBjcmVhdGVkX2F0IGRlc2NcbiAgICAgICAgcGFnZUxlbmd0aDogMTAsXG4gICAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICAgIG9yZGVyaW5nOiB0cnVlLFxuICAgICAgICBvcmRlck11bHRpOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIFNldHVwIGZpbHRlciBidXR0b24gaGFuZGxlcnNcbiAgICBzZXR1cEZpbHRlckhhbmRsZXJzKHRhYmxlKTtcblxuICAgIC8vIFNldHVwIG90aGVyIGV2ZW50IGhhbmRsZXJzXG4gICAgc2V0dXBUYWJsZUV2ZW50SGFuZGxlcnModGFibGUpO1xufVxuXG4vKipcbiAqIFNldHVwIGZpbHRlciBhbmQgcmVzZXQgYnV0dG9uIGhhbmRsZXJzXG4gKi9cbmZ1bmN0aW9uIHNldHVwRmlsdGVySGFuZGxlcnModGFibGUpIHtcbiAgICAvLyBIYW5kbGUgRmlsdGVyIFNlYXJjaCBCdXR0b25cbiAgICAkKFwiI2t0X3NlYXJjaFwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJGaWx0ZXIgYnV0dG9uIGNsaWNrZWRcIik7XG5cbiAgICAgICAgY29uc3QgZGVhbGVyRmlsdGVyID0gJChcIiNkZWFsZXJfZmlsdGVyXCIpLnZhbCgpO1xuICAgICAgICBjb25zdCBkYXRlRnJvbSA9ICQoXCIjZGF0ZV9mcm9tXCIpLnZhbCgpO1xuICAgICAgICBjb25zdCBkYXRlVG8gPSAkKFwiI2RhdGVfdG9cIikudmFsKCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJGaWx0ZXJpbmcgd2l0aDpcIiwge1xuICAgICAgICAgICAgZGVhbGVyOiBkZWFsZXJGaWx0ZXIsXG4gICAgICAgICAgICBkYXRlRnJvbTogZGF0ZUZyb20sXG4gICAgICAgICAgICBkYXRlVG86IGRhdGVUbyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBGaWx0ZXIgUmVzZXQgQnV0dG9uXG4gICAgJChcIiNrdF9yZXNldFwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJSZXNldCBidXR0b24gY2xpY2tlZFwiKTtcblxuICAgICAgICAvLyBDbGVhciBhbGwgZmlsdGVyc1xuICAgICAgICAkKFwiI2RlYWxlcl9maWx0ZXJcIikudmFsKFwiXCIpLnRyaWdnZXIoXCJjaGFuZ2VcIik7IC8vIFJlc2V0IFNlbGVjdDJcbiAgICAgICAgJChcIiNkYXRlX2Zyb21cIikudmFsKFwiXCIpO1xuICAgICAgICAkKFwiI2RhdGVfdG9cIikudmFsKFwiXCIpO1xuXG4gICAgICAgIC8vIFJlc2V0IGVuZCBkYXRlIHBpY2tlciBhbmQgZGlzYWJsZSBpdFxuICAgICAgICByZXNldEVuZERhdGVQaWNrZXIoKTtcblxuICAgICAgICAvLyBSZWxvYWQgdGFibGVcbiAgICAgICAgdGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFbnRlciBrZXkgb24gZGF0ZSBpbnB1dHNcbiAgICAkKFwiI2RhdGVfZnJvbSwgI2RhdGVfdG9cIikub24oXCJrZXlwcmVzc1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgICAgIC8vIEVudGVyIGtleVxuICAgICAgICAgICAgJChcIiNrdF9zZWFyY2hcIikuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gT3B0aW9uYWw6IEF1dG8tZmlsdGVyIHdoZW4gZGVhbGVyIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgJChcIiNkZWFsZXJfZmlsdGVyXCIpLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJEZWFsZXIgZmlsdGVyIGNoYW5nZWQ6XCIsICQodGhpcykudmFsKCkpO1xuICAgICAgICAvLyBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgaWYgeW91IHdhbnQgYXV0by1maWx0ZXIgb24gZGVhbGVyIGNoYW5nZVxuICAgICAgICAvLyB0YWJsZS5hamF4LnJlbG9hZCgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IGVuZCBkYXRlIHBpY2tlciB0byBpbml0aWFsIHN0YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc2V0RW5kRGF0ZVBpY2tlcigpIHtcbiAgICAvLyBEZXN0cm95IGV4aXN0aW5nIGRhdGVwaWNrZXJcbiAgICAkKFwiI2RhdGVfdG9cIikuZGF0ZXBpY2tlcihcImRlc3Ryb3lcIik7XG5cbiAgICAvLyBSZS1pbml0aWFsaXplIHdpdGhvdXQgbWluRGF0ZSBjb25zdHJhaW50XG4gICAgaW5pdGlhbGl6ZUVuZERhdGVQaWNrZXIoKTtcblxuICAgIC8vIERpc2FibGUgdGhlIGlucHV0XG4gICAgJChcIiNkYXRlX3RvXCIpLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblxuICAgIGNvbnNvbGUubG9nKFwiRW5kIGRhdGUgcGlja2VyIHJlc2V0IGFuZCBkaXNhYmxlZFwiKTtcbn1cblxuLyoqXG4gKiBTZXR1cCBhZGRpdGlvbmFsIHRhYmxlIGV2ZW50IGhhbmRsZXJzXG4gKi9cbmZ1bmN0aW9uIHNldHVwVGFibGVFdmVudEhhbmRsZXJzKHRhYmxlKSB7XG4gICAgLy8gRGVidWcgb3JkZXJpbmcgZXZlbnRzXG4gICAgdGFibGUub24oXCJvcmRlci5kdFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiT3JkZXIgY2hhbmdlZDpcIiwgdGFibGUub3JkZXIoKSk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3IgZm9yIHByb2Nlc3NpbmdcbiAgICB0YWJsZS5vbihcInByb2Nlc3NpbmcuZHRcIiwgZnVuY3Rpb24gKGUsIHNldHRpbmdzLCBwcm9jZXNzaW5nKSB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZSBwcm9jZXNzaW5nIHN0YXJ0ZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZSBwcm9jZXNzaW5nIGZpbmlzaGVkXCIpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgYW55IGN1c3RvbSBidXR0b24gY2xpY2tzIGhlcmUgaWYgbmVlZGVkXG4gICAgLy8gRXhhbXBsZTogJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5jdXN0b20tYnRuJywgZnVuY3Rpb24oKSB7IC4uLiB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUFBLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBWTtFQUMxQkMsT0FBTyxDQUFDQyxHQUFSLENBQVkseUJBQVosRUFEMEIsQ0FHMUI7O0VBQ0EsSUFBSSxPQUFPSixDQUFDLENBQUNLLEVBQUYsQ0FBS0MsU0FBWixLQUEwQixXQUE5QixFQUEyQztJQUN2Q0gsT0FBTyxDQUFDSSxLQUFSLENBQWMsMkJBQWQ7SUFDQTtFQUNILENBUHlC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\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/opnames/index.js\n");
/***/ })
diff --git a/public/js/warehouse_management/products/index.js b/public/js/warehouse_management/products/index.js
index 61097e9..60961f1 100755
--- a/public/js/warehouse_management/products/index.js
+++ b/public/js/warehouse_management/products/index.js
@@ -15,7 +15,7 @@
\*************************************************************/
/***/ (() => {
-eval("$(document).ready(function () {\n console.log(\"Products index.js loaded\"); // Check if DataTables is available\n\n if (typeof $.fn.DataTable === \"undefined\") {\n console.error(\"DataTables not available!\");\n return;\n } // Wait for DOM to be fully ready\n\n\n setTimeout(function () {\n initializeDataTable();\n }, 100);\n});\n\nfunction initializeDataTable() {\n console.log(\"Initializing DataTable...\"); // Destroy existing table if any\n\n if ($.fn.DataTable.isDataTable(\"#products-table\")) {\n $(\"#products-table\").DataTable().destroy();\n } // Initialize DataTable\n\n\n var table = $(\"#products-table\").DataTable({\n processing: true,\n serverSide: true,\n destroy: true,\n ajax: {\n url: $(\"#products-table\").data(\"url\"),\n type: \"GET\",\n data: function data(d) {\n console.log(\"DataTables request data:\", d);\n return d;\n },\n error: function error(xhr, _error, code) {\n console.error(\"DataTables AJAX error:\", _error, code);\n console.error(\"Response:\", xhr.responseText);\n }\n },\n columns: [{\n data: \"DT_RowIndex\",\n name: \"DT_RowIndex\",\n orderable: false,\n searchable: false\n }, {\n data: \"code\",\n name: \"code\",\n orderable: true\n }, {\n data: \"name\",\n name: \"name\",\n orderable: true\n }, {\n data: \"category_name\",\n name: \"category_name\",\n orderable: true\n }, {\n data: \"unit\",\n name: \"unit\",\n orderable: true\n }, {\n data: \"total_stock\",\n name: \"total_stock\",\n orderable: false\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }],\n order: [[1, \"asc\"]],\n // Order by code asc\n pageLength: 10,\n responsive: true,\n ordering: true,\n orderMulti: false\n });\n}\n\n$(document).on(\"click\", \".btn-destroy-product\", function () {\n var _this = this;\n\n Swal.fire({\n title: \"Hapus produk?\",\n text: \"Anda tidak akan bisa mengembalikannya!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Hapus\"\n }).then(function (result) {\n if (result.value) {\n var url = $(_this).data(\"action\");\n $.ajax({\n url: url,\n method: \"POST\",\n data: {\n _method: \"DELETE\",\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success() {\n Swal.fire(\"Berhasil!\", \"Produk berhasil dihapus.\", \"success\");\n\n try {\n if ($.fn.DataTable.isDataTable(\"#products-table\")) {\n $(\"#products-table\").DataTable().ajax.reload();\n }\n } catch (e) {\n console.error(\"Error reloading table:\", e);\n location.reload(); // Fallback to page reload\n }\n },\n error: function error(xhr) {\n Swal.fire(\"Error!\", \"Gagal menghapus produk.\", \"error\");\n console.error(xhr.responseText);\n }\n });\n }\n });\n});\n$(document).on(\"click\", \".btn-toggle-active\", function () {\n var button = $(this);\n var url = button.data(\"url\");\n Swal.fire({\n title: \"Status produk?\",\n text: \"Anda yakin ingin mengganti status produk!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Ya\"\n }).then(function (result) {\n if (result.value) {\n $.ajax({\n url: url,\n method: \"POST\",\n data: {\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success(response) {\n if (response.success) {\n try {\n if ($.fn.DataTable.isDataTable(\"#products-table\")) {\n $(\"#products-table\").DataTable().ajax.reload(null, false);\n }\n } catch (e) {\n console.error(\"Error reloading table:\", e);\n location.reload(); // Fallback to page reload\n }\n\n Swal.fire(\"Berhasil!\", response.message, \"success\");\n }\n },\n error: function error() {\n Swal.fire(\"Error!\", \"Gagal mengubah status produk.\", \"error\");\n }\n });\n }\n });\n});\n$(document).on(\"click\", \".btn-product-stock-dealers\", function () {\n var productId = $(this).data(\"id\");\n var productName = $(this).data(\"name\");\n var ajaxUrl = $(this).data(\"url\"); // Check if modal elements exist\n\n if ($(\"#product-name-title\").length === 0) {\n console.error(\"Modal title element not found\");\n return;\n }\n\n if ($(\"#dealer-stock-table\").length === 0) {\n console.error(\"Dealer stock table element not found\");\n return;\n } // Set product name in modal title\n\n\n $(\"#product-name-title\").text(productName); // Destroy existing DataTable if any\n\n if ($.fn.DataTable.isDataTable(\"#dealer-stock-table\")) {\n $(\"#dealer-stock-table\").DataTable().destroy();\n } // Initialize or reload DataTable inside modal\n\n\n $(\"#dealer-stock-table\").DataTable({\n destroy: true,\n processing: true,\n serverSide: true,\n ajax: {\n url: ajaxUrl,\n data: {\n product_id: productId\n },\n error: function error(xhr, _error2, thrown) {\n console.error(\"Dealer stock DataTables Ajax Error:\", _error2, thrown);\n console.error(\"Response:\", xhr.responseText);\n }\n },\n columns: [{\n data: \"dealer_name\",\n name: \"dealer_name\",\n orderable: true,\n searchable: true\n }, {\n data: \"quantity\",\n name: \"quantity\",\n orderable: true,\n searchable: false\n }],\n initComplete: function initComplete() {\n try {\n if ($(\"#dealerStockModal\").length > 0) {\n $(\"#dealerStockModal\").modal(\"show\");\n } else {\n console.error(\"Modal #dealerStockModal not found\");\n }\n } catch (e) {\n console.error(\"Error showing modal:\", e);\n }\n }\n });\n});\n$(document).on(\"click\", \"#dealerStockModal .close\", function () {\n $(\"#dealerStockModal\").modal(\"hide\");\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvaW5kZXguanMiLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsImNvbnNvbGUiLCJsb2ciLCJmbiIsIkRhdGFUYWJsZSIsImVycm9yIiwic2V0VGltZW91dCIsImluaXRpYWxpemVEYXRhVGFibGUiLCJpc0RhdGFUYWJsZSIsImRlc3Ryb3kiLCJ0YWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsInVybCIsImRhdGEiLCJ0eXBlIiwiZCIsInhociIsImNvZGUiLCJyZXNwb25zZVRleHQiLCJjb2x1bW5zIiwibmFtZSIsIm9yZGVyYWJsZSIsInNlYXJjaGFibGUiLCJvcmRlciIsInBhZ2VMZW5ndGgiLCJyZXNwb25zaXZlIiwib3JkZXJpbmciLCJvcmRlck11bHRpIiwib24iLCJTd2FsIiwiZmlyZSIsInRpdGxlIiwidGV4dCIsInNob3dDYW5jZWxCdXR0b24iLCJjb25maXJtQnV0dG9uQ29sb3IiLCJjYW5jZWxCdXR0b25Db2xvciIsImNvbmZpcm1CdXR0b25UZXh0IiwidGhlbiIsInJlc3VsdCIsInZhbHVlIiwibWV0aG9kIiwiX21ldGhvZCIsIl90b2tlbiIsImF0dHIiLCJzdWNjZXNzIiwicmVsb2FkIiwiZSIsImxvY2F0aW9uIiwiYnV0dG9uIiwicmVzcG9uc2UiLCJtZXNzYWdlIiwicHJvZHVjdElkIiwicHJvZHVjdE5hbWUiLCJhamF4VXJsIiwibGVuZ3RoIiwicHJvZHVjdF9pZCIsInRocm93biIsImluaXRDb21wbGV0ZSIsIm1vZGFsIl0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvaW5kZXguanM/ZmNkNiJdLCJzb3VyY2VzQ29udGVudCI6WyIkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgY29uc29sZS5sb2coXCJQcm9kdWN0cyBpbmRleC5qcyBsb2FkZWRcIik7XG5cbiAgICAvLyBDaGVjayBpZiBEYXRhVGFibGVzIGlzIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgJC5mbi5EYXRhVGFibGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkRhdGFUYWJsZXMgbm90IGF2YWlsYWJsZSFcIik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXYWl0IGZvciBET00gdG8gYmUgZnVsbHkgcmVhZHlcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5pdGlhbGl6ZURhdGFUYWJsZSgpO1xuICAgIH0sIDEwMCk7XG59KTtcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZURhdGFUYWJsZSgpIHtcbiAgICBjb25zb2xlLmxvZyhcIkluaXRpYWxpemluZyBEYXRhVGFibGUuLi5cIik7XG5cbiAgICAvLyBEZXN0cm95IGV4aXN0aW5nIHRhYmxlIGlmIGFueVxuICAgIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZShcIiNwcm9kdWN0cy10YWJsZVwiKSkge1xuICAgICAgICAkKFwiI3Byb2R1Y3RzLXRhYmxlXCIpLkRhdGFUYWJsZSgpLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIERhdGFUYWJsZVxuICAgIHZhciB0YWJsZSA9ICQoXCIjcHJvZHVjdHMtdGFibGVcIikuRGF0YVRhYmxlKHtcbiAgICAgICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICAgICAgc2VydmVyU2lkZTogdHJ1ZSxcbiAgICAgICAgZGVzdHJveTogdHJ1ZSxcbiAgICAgICAgYWpheDoge1xuICAgICAgICAgICAgdXJsOiAkKFwiI3Byb2R1Y3RzLXRhYmxlXCIpLmRhdGEoXCJ1cmxcIiksXG4gICAgICAgICAgICB0eXBlOiBcIkdFVFwiLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZXMgcmVxdWVzdCBkYXRhOlwiLCBkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhociwgZXJyb3IsIGNvZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRGF0YVRhYmxlcyBBSkFYIGVycm9yOlwiLCBlcnJvciwgY29kZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJlc3BvbnNlOlwiLCB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcIkRUX1Jvd0luZGV4XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJEVF9Sb3dJbmRleFwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwiY29kZVwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiY29kZVwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcImNhdGVnb3J5X25hbWVcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNhdGVnb3J5X25hbWVcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwidW5pdFwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJ0b3RhbF9zdG9ja1wiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwidG90YWxfc3RvY2tcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcImFjdGlvblwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiYWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG9yZGVyOiBbWzEsIFwiYXNjXCJdXSwgLy8gT3JkZXIgYnkgY29kZSBhc2NcbiAgICAgICAgcGFnZUxlbmd0aDogMTAsXG4gICAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICAgIG9yZGVyaW5nOiB0cnVlLFxuICAgICAgICBvcmRlck11bHRpOiBmYWxzZSxcbiAgICB9KTtcbn1cblxuJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5idG4tZGVzdHJveS1wcm9kdWN0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBTd2FsLmZpcmUoe1xuICAgICAgICB0aXRsZTogXCJIYXB1cyBwcm9kdWs/XCIsXG4gICAgICAgIHRleHQ6IFwiQW5kYSB0aWRhayBha2FuIGJpc2EgbWVuZ2VtYmFsaWthbm55YSFcIixcbiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiNkMzNcIixcbiAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6IFwiI2RlZGVkZVwiLFxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJIYXB1c1wiLFxuICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSAkKHRoaXMpLmRhdGEoXCJhY3Rpb25cIik7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBfbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgICAgICAgICBfdG9rZW46ICQoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5hdHRyKFwiY29udGVudFwiKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgU3dhbC5maXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJCZXJoYXNpbCFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJvZHVrIGJlcmhhc2lsIGRpaGFwdXMuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKFwiI3Byb2R1Y3RzLXRhYmxlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNwcm9kdWN0cy10YWJsZVwiKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVsb2FkaW5nIHRhYmxlOlwiLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOyAvLyBGYWxsYmFjayB0byBwYWdlIHJlbG9hZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhocikge1xuICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoXCJFcnJvciFcIiwgXCJHYWdhbCBtZW5naGFwdXMgcHJvZHVrLlwiLCBcImVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbiQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIuYnRuLXRvZ2dsZS1hY3RpdmVcIiwgZnVuY3Rpb24gKCkge1xuICAgIGxldCBidXR0b24gPSAkKHRoaXMpO1xuICAgIGxldCB1cmwgPSBidXR0b24uZGF0YShcInVybFwiKTtcblxuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBcIlN0YXR1cyBwcm9kdWs/XCIsXG4gICAgICAgIHRleHQ6IFwiQW5kYSB5YWtpbiBpbmdpbiBtZW5nZ2FudGkgc3RhdHVzIHByb2R1ayFcIixcbiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiNkMzNcIixcbiAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6IFwiI2RlZGVkZVwiLFxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJZYVwiLFxuICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBfdG9rZW46ICQoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5hdHRyKFwiY29udGVudFwiKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoXCIjcHJvZHVjdHMtdGFibGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNwcm9kdWN0cy10YWJsZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRhdGFUYWJsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWpheC5yZWxvYWQobnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVsb2FkaW5nIHRhYmxlOlwiLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsgLy8gRmFsbGJhY2sgdG8gcGFnZSByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZShcIkJlcmhhc2lsIVwiLCByZXNwb25zZS5tZXNzYWdlLCBcInN1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRXJyb3IhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkdhZ2FsIG1lbmd1YmFoIHN0YXR1cyBwcm9kdWsuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG4kKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmJ0bi1wcm9kdWN0LXN0b2NrLWRlYWxlcnNcIiwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHByb2R1Y3RJZCA9ICQodGhpcykuZGF0YShcImlkXCIpO1xuICAgIGNvbnN0IHByb2R1Y3ROYW1lID0gJCh0aGlzKS5kYXRhKFwibmFtZVwiKTtcbiAgICBjb25zdCBhamF4VXJsID0gJCh0aGlzKS5kYXRhKFwidXJsXCIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbW9kYWwgZWxlbWVudHMgZXhpc3RcbiAgICBpZiAoJChcIiNwcm9kdWN0LW5hbWUtdGl0bGVcIikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJNb2RhbCB0aXRsZSBlbGVtZW50IG5vdCBmb3VuZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgkKFwiI2RlYWxlci1zdG9jay10YWJsZVwiKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkRlYWxlciBzdG9jayB0YWJsZSBlbGVtZW50IG5vdCBmb3VuZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldCBwcm9kdWN0IG5hbWUgaW4gbW9kYWwgdGl0bGVcbiAgICAkKFwiI3Byb2R1Y3QtbmFtZS10aXRsZVwiKS50ZXh0KHByb2R1Y3ROYW1lKTtcblxuICAgIC8vIERlc3Ryb3kgZXhpc3RpbmcgRGF0YVRhYmxlIGlmIGFueVxuICAgIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZShcIiNkZWFsZXItc3RvY2stdGFibGVcIikpIHtcbiAgICAgICAgJChcIiNkZWFsZXItc3RvY2stdGFibGVcIikuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgb3IgcmVsb2FkIERhdGFUYWJsZSBpbnNpZGUgbW9kYWxcbiAgICAkKFwiI2RlYWxlci1zdG9jay10YWJsZVwiKS5EYXRhVGFibGUoe1xuICAgICAgICBkZXN0cm95OiB0cnVlLFxuICAgICAgICBwcm9jZXNzaW5nOiB0cnVlLFxuICAgICAgICBzZXJ2ZXJTaWRlOiB0cnVlLFxuICAgICAgICBhamF4OiB7XG4gICAgICAgICAgICB1cmw6IGFqYXhVcmwsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdF9pZDogcHJvZHVjdElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyLCBlcnJvciwgdGhyb3duKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJEZWFsZXIgc3RvY2sgRGF0YVRhYmxlcyBBamF4IEVycm9yOlwiLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgdGhyb3duXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVzcG9uc2U6XCIsIHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwiZGVhbGVyX25hbWVcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcImRlYWxlcl9uYW1lXCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwicXVhbnRpdHlcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInF1YW50aXR5XCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5pdENvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgkKFwiI2RlYWxlclN0b2NrTW9kYWxcIikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAkKFwiI2RlYWxlclN0b2NrTW9kYWxcIikubW9kYWwoXCJzaG93XCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJNb2RhbCAjZGVhbGVyU3RvY2tNb2RhbCBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzaG93aW5nIG1vZGFsOlwiLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn0pO1xuXG4kKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiI2RlYWxlclN0b2NrTW9kYWwgLmNsb3NlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAkKFwiI2RlYWxlclN0b2NrTW9kYWxcIikubW9kYWwoXCJoaWRlXCIpO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBQSxDQUFD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\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/products/index.js\n");
+eval("$(document).ready(function () {\n console.log(\"Products index.js loaded\"); // Check if DataTables is available\n\n if (typeof $.fn.DataTable === \"undefined\") {\n console.error(\"DataTables not available!\");\n return;\n } // Wait for DOM to be fully ready\n\n\n setTimeout(function () {\n initializeDataTable();\n }, 100);\n});\n\nfunction initializeDataTable() {\n console.log(\"Initializing DataTable...\"); // Destroy existing table if any\n\n if ($.fn.DataTable.isDataTable(\"#products-table\")) {\n $(\"#products-table\").DataTable().destroy();\n } // Initialize DataTable\n\n\n var table = $(\"#products-table\").DataTable({\n processing: true,\n serverSide: true,\n destroy: true,\n ajax: {\n url: $(\"#products-table\").data(\"url\"),\n type: \"GET\",\n data: function data(d) {\n console.log(\"DataTables request data:\", d);\n return d;\n },\n error: function error(xhr, _error, code) {\n console.error(\"DataTables AJAX error:\", _error, code);\n console.error(\"Response:\", xhr.responseText);\n }\n },\n columns: [{\n data: \"DT_RowIndex\",\n name: \"DT_RowIndex\",\n orderable: false,\n searchable: false\n }, {\n data: \"code\",\n name: \"code\",\n orderable: true\n }, {\n data: \"name\",\n name: \"name\",\n orderable: true\n }, {\n data: \"category_name\",\n name: \"category_name\",\n orderable: true\n }, {\n data: \"unit\",\n name: \"unit\",\n orderable: true\n }, {\n data: \"total_stock\",\n name: \"total_stock\",\n orderable: false\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }],\n order: [[1, \"asc\"]],\n // Order by code asc\n pageLength: 10,\n responsive: true,\n ordering: true,\n orderMulti: false\n });\n}\n\n$(document).on(\"click\", \".btn-destroy-product\", function () {\n var _this = this;\n\n Swal.fire({\n title: \"Hapus produk?\",\n text: \"Anda tidak akan bisa mengembalikannya!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Hapus\"\n }).then(function (result) {\n if (result.value) {\n var url = $(_this).data(\"action\");\n $.ajax({\n url: url,\n method: \"POST\",\n data: {\n _method: \"DELETE\",\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success() {\n Swal.fire(\"Berhasil!\", \"Produk berhasil dihapus.\", \"success\");\n\n try {\n if ($.fn.DataTable.isDataTable(\"#products-table\")) {\n $(\"#products-table\").DataTable().ajax.reload();\n }\n } catch (e) {\n console.error(\"Error reloading table:\", e);\n location.reload(); // Fallback to page reload\n }\n },\n error: function error(xhr) {\n Swal.fire(\"Error!\", \"Gagal menghapus produk.\", \"error\");\n console.error(xhr.responseText);\n }\n });\n }\n });\n});\n$(document).on(\"click\", \".btn-toggle-active\", function () {\n var button = $(this);\n var url = button.data(\"url\");\n Swal.fire({\n title: \"Status produk?\",\n text: \"Anda yakin ingin mengganti status produk!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Ya\"\n }).then(function (result) {\n if (result.value) {\n $.ajax({\n url: url,\n method: \"POST\",\n data: {\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success(response) {\n if (response.success) {\n try {\n if ($.fn.DataTable.isDataTable(\"#products-table\")) {\n $(\"#products-table\").DataTable().ajax.reload(null, false);\n }\n } catch (e) {\n console.error(\"Error reloading table:\", e);\n location.reload(); // Fallback to page reload\n }\n\n Swal.fire(\"Berhasil!\", response.message, \"success\");\n }\n },\n error: function error() {\n Swal.fire(\"Error!\", \"Gagal mengubah status produk.\", \"error\");\n }\n });\n }\n });\n});\n$(document).on(\"click\", \".btn-product-stock-dealers\", function () {\n var productId = $(this).data(\"id\");\n var productName = $(this).data(\"name\");\n var ajaxUrl = $(this).data(\"url\"); // Check if modal elements exist\n\n if ($(\"#product-name-title\").length === 0) {\n console.error(\"Modal title element not found\");\n return;\n }\n\n if ($(\"#dealer-stock-table\").length === 0) {\n console.error(\"Dealer stock table element not found\");\n return;\n } // Set product name in modal title\n\n\n $(\"#product-name-title\").text(productName); // Destroy existing DataTable if any\n\n if ($.fn.DataTable.isDataTable(\"#dealer-stock-table\")) {\n $(\"#dealer-stock-table\").DataTable().destroy();\n } // Initialize or reload DataTable inside modal\n\n\n $(\"#dealer-stock-table\").DataTable({\n destroy: true,\n processing: true,\n serverSide: true,\n ajax: {\n url: ajaxUrl,\n data: {\n product_id: productId\n },\n error: function error(xhr, _error2, thrown) {\n console.error(\"Dealer stock DataTables Ajax Error:\", _error2, thrown);\n console.error(\"Response:\", xhr.responseText);\n }\n },\n columns: [{\n data: \"dealer_name\",\n name: \"dealer_name\",\n orderable: true,\n searchable: true\n }, {\n data: \"quantity\",\n name: \"quantity\",\n orderable: true,\n searchable: false\n }],\n initComplete: function initComplete() {\n try {\n if ($(\"#dealerStockModal\").length > 0) {\n $(\"#dealerStockModal\").modal(\"show\");\n } else {\n console.error(\"Modal #dealerStockModal not found\");\n }\n } catch (e) {\n console.error(\"Error showing modal:\", e);\n }\n }\n });\n});\n$(document).on(\"click\", \"#dealerStockModal .close\", function () {\n $(\"#dealerStockModal\").modal(\"hide\");\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsImNvbnNvbGUiLCJsb2ciLCJmbiIsIkRhdGFUYWJsZSIsImVycm9yIiwic2V0VGltZW91dCIsImluaXRpYWxpemVEYXRhVGFibGUiLCJpc0RhdGFUYWJsZSIsImRlc3Ryb3kiLCJ0YWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsInVybCIsImRhdGEiLCJ0eXBlIiwiZCIsInhociIsImNvZGUiLCJyZXNwb25zZVRleHQiLCJjb2x1bW5zIiwibmFtZSIsIm9yZGVyYWJsZSIsInNlYXJjaGFibGUiLCJvcmRlciIsInBhZ2VMZW5ndGgiLCJyZXNwb25zaXZlIiwib3JkZXJpbmciLCJvcmRlck11bHRpIiwib24iLCJTd2FsIiwiZmlyZSIsInRpdGxlIiwidGV4dCIsInNob3dDYW5jZWxCdXR0b24iLCJjb25maXJtQnV0dG9uQ29sb3IiLCJjYW5jZWxCdXR0b25Db2xvciIsImNvbmZpcm1CdXR0b25UZXh0IiwidGhlbiIsInJlc3VsdCIsInZhbHVlIiwibWV0aG9kIiwiX21ldGhvZCIsIl90b2tlbiIsImF0dHIiLCJzdWNjZXNzIiwicmVsb2FkIiwiZSIsImxvY2F0aW9uIiwiYnV0dG9uIiwicmVzcG9uc2UiLCJtZXNzYWdlIiwicHJvZHVjdElkIiwicHJvZHVjdE5hbWUiLCJhamF4VXJsIiwibGVuZ3RoIiwicHJvZHVjdF9pZCIsInRocm93biIsImluaXRDb21wbGV0ZSIsIm1vZGFsIl0sInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy93YXJlaG91c2VfbWFuYWdlbWVudC9wcm9kdWN0cy9pbmRleC5qcz9mY2Q2Il0sInNvdXJjZXNDb250ZW50IjpbIiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZyhcIlByb2R1Y3RzIGluZGV4LmpzIGxvYWRlZFwiKTtcblxuICAgIC8vIENoZWNrIGlmIERhdGFUYWJsZXMgaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiAkLmZuLkRhdGFUYWJsZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRGF0YVRhYmxlcyBub3QgYXZhaWxhYmxlIVwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIERPTSB0byBiZSBmdWxseSByZWFkeVxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpbml0aWFsaXplRGF0YVRhYmxlKCk7XG4gICAgfSwgMTAwKTtcbn0pO1xuXG5mdW5jdGlvbiBpbml0aWFsaXplRGF0YVRhYmxlKCkge1xuICAgIGNvbnNvbGUubG9nKFwiSW5pdGlhbGl6aW5nIERhdGFUYWJsZS4uLlwiKTtcblxuICAgIC8vIERlc3Ryb3kgZXhpc3RpbmcgdGFibGUgaWYgYW55XG4gICAgaWYgKCQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKFwiI3Byb2R1Y3RzLXRhYmxlXCIpKSB7XG4gICAgICAgICQoXCIjcHJvZHVjdHMtdGFibGVcIikuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgRGF0YVRhYmxlXG4gICAgdmFyIHRhYmxlID0gJChcIiNwcm9kdWN0cy10YWJsZVwiKS5EYXRhVGFibGUoe1xuICAgICAgICBwcm9jZXNzaW5nOiB0cnVlLFxuICAgICAgICBzZXJ2ZXJTaWRlOiB0cnVlLFxuICAgICAgICBkZXN0cm95OiB0cnVlLFxuICAgICAgICBhamF4OiB7XG4gICAgICAgICAgICB1cmw6ICQoXCIjcHJvZHVjdHMtdGFibGVcIikuZGF0YShcInVybFwiKSxcbiAgICAgICAgICAgIHR5cGU6IFwiR0VUXCIsXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGF0YVRhYmxlcyByZXF1ZXN0IGRhdGE6XCIsIGQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyLCBlcnJvciwgY29kZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJEYXRhVGFibGVzIEFKQVggZXJyb3I6XCIsIGVycm9yLCBjb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVzcG9uc2U6XCIsIHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwiRFRfUm93SW5kZXhcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkRUX1Jvd0luZGV4XCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJjb2RlXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RlXCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcIm5hbWVcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwiY2F0ZWdvcnlfbmFtZVwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiY2F0ZWdvcnlfbmFtZVwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJ1bml0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJ1bml0XCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcInRvdGFsX3N0b2NrXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJ0b3RhbF9zdG9ja1wiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwiYWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3JkZXI6IFtbMSwgXCJhc2NcIl1dLCAvLyBPcmRlciBieSBjb2RlIGFzY1xuICAgICAgICBwYWdlTGVuZ3RoOiAxMCxcbiAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgICAgb3JkZXJpbmc6IHRydWUsXG4gICAgICAgIG9yZGVyTXVsdGk6IGZhbHNlLFxuICAgIH0pO1xufVxuXG4kKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmJ0bi1kZXN0cm95LXByb2R1Y3RcIiwgZnVuY3Rpb24gKCkge1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBcIkhhcHVzIHByb2R1az9cIixcbiAgICAgICAgdGV4dDogXCJBbmRhIHRpZGFrIGFrYW4gYmlzYSBtZW5nZW1iYWxpa2FubnlhIVwiLFxuICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZGVkZWRlXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIkhhcHVzXCIsXG4gICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9ICQodGhpcykuZGF0YShcImFjdGlvblwiKTtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIF9tZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICAgICAgICAgIF90b2tlbjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJlcmhhc2lsIVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQcm9kdWsgYmVyaGFzaWwgZGloYXB1cy5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoXCIjcHJvZHVjdHMtdGFibGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFwiI3Byb2R1Y3RzLXRhYmxlXCIpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWxvYWRpbmcgdGFibGU6XCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7IC8vIEZhbGxiYWNrIHRvIHBhZ2UgcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyKSB7XG4gICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZShcIkVycm9yIVwiLCBcIkdhZ2FsIG1lbmdoYXB1cyBwcm9kdWsuXCIsIFwiZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5idG4tdG9nZ2xlLWFjdGl2ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGJ1dHRvbiA9ICQodGhpcyk7XG4gICAgbGV0IHVybCA9IGJ1dHRvbi5kYXRhKFwidXJsXCIpO1xuXG4gICAgU3dhbC5maXJlKHtcbiAgICAgICAgdGl0bGU6IFwiU3RhdHVzIHByb2R1az9cIixcbiAgICAgICAgdGV4dDogXCJBbmRhIHlha2luIGluZ2luIG1lbmdnYW50aSBzdGF0dXMgcHJvZHVrIVwiLFxuICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZGVkZWRlXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIllhXCIsXG4gICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIF90b2tlbjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLmZuLkRhdGFUYWJsZS5pc0RhdGFUYWJsZShcIiNwcm9kdWN0cy10YWJsZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFwiI3Byb2R1Y3RzLXRhYmxlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRGF0YVRhYmxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hamF4LnJlbG9hZChudWxsLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWxvYWRpbmcgdGFibGU6XCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOyAvLyBGYWxsYmFjayB0byBwYWdlIHJlbG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgU3dhbC5maXJlKFwiQmVyaGFzaWwhXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgU3dhbC5maXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvciFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiR2FnYWwgbWVuZ3ViYWggc3RhdHVzIHByb2R1ay5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbiQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIuYnRuLXByb2R1Y3Qtc3RvY2stZGVhbGVyc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcHJvZHVjdElkID0gJCh0aGlzKS5kYXRhKFwiaWRcIik7XG4gICAgY29uc3QgcHJvZHVjdE5hbWUgPSAkKHRoaXMpLmRhdGEoXCJuYW1lXCIpO1xuICAgIGNvbnN0IGFqYXhVcmwgPSAkKHRoaXMpLmRhdGEoXCJ1cmxcIik7XG5cbiAgICAvLyBDaGVjayBpZiBtb2RhbCBlbGVtZW50cyBleGlzdFxuICAgIGlmICgkKFwiI3Byb2R1Y3QtbmFtZS10aXRsZVwiKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIk1vZGFsIHRpdGxlIGVsZW1lbnQgbm90IGZvdW5kXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCQoXCIjZGVhbGVyLXN0b2NrLXRhYmxlXCIpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRGVhbGVyIHN0b2NrIHRhYmxlIGVsZW1lbnQgbm90IGZvdW5kXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0IHByb2R1Y3QgbmFtZSBpbiBtb2RhbCB0aXRsZVxuICAgICQoXCIjcHJvZHVjdC1uYW1lLXRpdGxlXCIpLnRleHQocHJvZHVjdE5hbWUpO1xuXG4gICAgLy8gRGVzdHJveSBleGlzdGluZyBEYXRhVGFibGUgaWYgYW55XG4gICAgaWYgKCQuZm4uRGF0YVRhYmxlLmlzRGF0YVRhYmxlKFwiI2RlYWxlci1zdG9jay10YWJsZVwiKSkge1xuICAgICAgICAkKFwiI2RlYWxlci1zdG9jay10YWJsZVwiKS5EYXRhVGFibGUoKS5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBvciByZWxvYWQgRGF0YVRhYmxlIGluc2lkZSBtb2RhbFxuICAgICQoXCIjZGVhbGVyLXN0b2NrLXRhYmxlXCIpLkRhdGFUYWJsZSh7XG4gICAgICAgIGRlc3Ryb3k6IHRydWUsXG4gICAgICAgIHByb2Nlc3Npbmc6IHRydWUsXG4gICAgICAgIHNlcnZlclNpZGU6IHRydWUsXG4gICAgICAgIGFqYXg6IHtcbiAgICAgICAgICAgIHVybDogYWpheFVybCxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0X2lkOiBwcm9kdWN0SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIsIGVycm9yLCB0aHJvd24pIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkRlYWxlciBzdG9jayBEYXRhVGFibGVzIEFqYXggRXJyb3I6XCIsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICB0aHJvd25cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSZXNwb25zZTpcIiwgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJkZWFsZXJfbmFtZVwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiZGVhbGVyX25hbWVcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJxdWFudGl0eVwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwicXVhbnRpdHlcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpbml0Q29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCQoXCIjZGVhbGVyU3RvY2tNb2RhbFwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICQoXCIjZGVhbGVyU3RvY2tNb2RhbFwiKS5tb2RhbChcInNob3dcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk1vZGFsICNkZWFsZXJTdG9ja01vZGFsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNob3dpbmcgbW9kYWw6XCIsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xufSk7XG5cbiQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIjZGVhbGVyU3RvY2tNb2RhbCAuY2xvc2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICQoXCIjZGVhbGVyU3RvY2tNb2RhbFwiKS5tb2RhbChcImhpZGVcIik7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUFBLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBWTtFQUMxQkMsT0FBTyxDQUFDQyxHQUFSLENBQVksMEJBQVosRUFEMEIs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QyxtQkFBRCxDQUFELENBQXVCMEQsTUFBdkIsR0FBZ0MsQ0FBcEMsRUFBdUM7VUFDbkMxRCxDQUFDLENBQUMsbUJBQUQsQ0FBRCxDQUF1QjhELEtBQXZCLENBQTZCLE1BQTdCO1FBQ0gsQ0FGRCxNQUVPO1VBQ0gzRCxPQUFPLENBQUNJLEtBQVIsQ0FBYyxtQ0FBZDtRQUNIO01BQ0osQ0FORCxDQU1FLE9BQU8yQyxDQUFQLEVBQVU7UUFDUi9DLE9BQU8sQ0FBQ0ksS0FBUixDQUFjLHNCQUFkLEVBQXNDMkMsQ0FBdEM7TUFDSDtJQUNKO0VBMUM4QixDQUFuQztBQTRDSCxDQXJFRDtBQXVFQWxELENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVkrQixFQUFaLENBQWUsT0FBZixFQUF3QiwwQkFBeEIsRUFBb0QsWUFBWTtFQUM1RGhDLENBQUMsQ0FBQyxtQkFBRCxDQUFELENBQXVCOEQsS0FBdkIsQ0FBNkIsTUFBN0I7QUFDSCxDQUZEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL3dhcmVob3VzZV9tYW5hZ2VtZW50L3Byb2R1Y3RzL2luZGV4LmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/products/index.js\n");
/***/ })
diff --git a/resources/js/warehouse_management/mutations/index.js b/resources/js/warehouse_management/mutations/index.js
index 2f0fbd0..a134bb7 100755
--- a/resources/js/warehouse_management/mutations/index.js
+++ b/resources/js/warehouse_management/mutations/index.js
@@ -7,12 +7,147 @@ $(document).ready(function () {
return;
}
+ // Initialize components
+ initializeSelect2();
+ initializeDatepickers();
+
// Wait for DOM to be fully ready
setTimeout(function () {
initializeDataTable();
}, 100);
});
+function initializeSelect2() {
+ console.log("Initializing Select2...");
+
+ // Initialize Select2 for dealer filter
+ if (typeof $.fn.select2 !== "undefined") {
+ $("#dealer_filter").select2({
+ placeholder: "Pilih Dealer",
+ allowClear: false,
+ width: "100%",
+ dropdownAutoWidth: true,
+ minimumResultsForSearch: 5, // Show search box if more than 5 options
+ });
+ } else {
+ console.warn("Select2 not available, using regular select");
+ }
+}
+
+function initializeDatepickers() {
+ console.log("Initializing datepickers...");
+
+ // Initialize start date picker
+ $("#date_from").datepicker({
+ dateFormat: "yy-mm-dd",
+ changeMonth: true,
+ changeYear: true,
+ maxDate: new Date(),
+ yearRange: "-5:+0",
+ onSelect: function (selectedDate) {
+ console.log("Start date selected:", selectedDate);
+ enableEndDatePicker(selectedDate);
+ $(this).datepicker("hide");
+ },
+ onClose: function (selectedDate) {
+ if (selectedDate) {
+ console.log("Start date closed with value:", selectedDate);
+ enableEndDatePicker(selectedDate);
+ }
+ },
+ });
+
+ // Initialize end date picker (initially disabled)
+ initializeEndDatePicker();
+
+ // Initially disable end date input
+ $("#date_to").prop("disabled", true);
+
+ // Add calendar icons
+ addCalendarIcons();
+
+ // Setup calendar icon click handlers
+ setupIconClickHandlers();
+
+ // Backup: Listen to change event
+ setupChangeEventHandlers();
+}
+
+function enableEndDatePicker(startDate) {
+ console.log("Enabling end date picker with min date:", startDate);
+
+ // Enable the input
+ $("#date_to").prop("disabled", false);
+
+ // Destroy existing datepicker
+ $("#date_to").datepicker("destroy");
+
+ // Re-initialize with new minDate
+ $("#date_to").datepicker({
+ dateFormat: "yy-mm-dd",
+ changeMonth: true,
+ changeYear: true,
+ maxDate: new Date(),
+ yearRange: "-5:+0",
+ minDate: new Date(startDate), // Convert to Date object for proper comparison
+ onSelect: function (selectedDate) {
+ console.log("End date selected:", selectedDate);
+ $(this).datepicker("hide");
+ },
+ });
+
+ console.log("End date picker enabled with minDate:", startDate);
+}
+
+function initializeEndDatePicker() {
+ $("#date_to").datepicker({
+ dateFormat: "yy-mm-dd",
+ changeMonth: true,
+ changeYear: true,
+ maxDate: new Date(),
+ yearRange: "-5:+0",
+ onSelect: function (selectedDate) {
+ console.log("End date selected:", selectedDate);
+ $(this).datepicker("hide");
+ },
+ });
+}
+
+function addCalendarIcons() {
+ // Remove any existing icons first
+ $(".input-icon").remove();
+
+ // Add calendar icons with just the classes, no inline styles
+ const iconHtml = '';
+
+ $("#date_from").after(iconHtml);
+ $("#date_to").after(iconHtml);
+
+ // Ensure parent containers have relative positioning
+ $("#date_from, #date_to")
+ .closest(".form-group")
+ .css("position", "relative");
+}
+
+function setupIconClickHandlers() {
+ $(document).on("click", ".input-icon", function () {
+ const input = $(this).prev("input");
+ if (!input.prop("disabled")) {
+ input.datepicker("show");
+ }
+ });
+}
+
+function setupChangeEventHandlers() {
+ $("#date_from").on("change", function () {
+ const selectedDate = $(this).val();
+ if (selectedDate) {
+ console.log("Start date change event:", selectedDate);
+ enableEndDatePicker(selectedDate);
+ }
+ });
+}
+
function initializeDataTable() {
console.log("Initializing DataTable...");
@@ -22,7 +157,7 @@ function initializeDataTable() {
}
// Initialize DataTable
- var table = $("#mutations-table").DataTable({
+ const table = $("#mutations-table").DataTable({
processing: true,
serverSide: true,
destroy: true,
@@ -30,9 +165,17 @@ function initializeDataTable() {
url: $("#mutations-table").data("url"),
type: "GET",
data: function (d) {
- console.log("DataTables request data:", d);
- console.log("Order info:", d.order);
- console.log("Columns info:", d.columns);
+ // Add filter parameters
+ d.dealer_filter = $("#dealer_filter").val();
+ d.date_from = $("#date_from").val();
+ d.date_to = $("#date_to").val();
+
+ console.log("AJAX data being sent:", {
+ dealer_filter: d.dealer_filter,
+ date_from: d.date_from,
+ date_to: d.date_to,
+ });
+
return d;
},
error: function (xhr, error, code) {
@@ -41,19 +184,9 @@ function initializeDataTable() {
},
},
columnDefs: [
- {
- targets: 0, // No. column
- width: "5%",
- },
- {
- targets: 8, // Action column
- width: "20%",
- className: "text-center",
- },
- {
- targets: [6, 7], // Total Items and Status columns
- className: "text-center",
- },
+ { targets: 0, width: "5%" }, // No. column
+ { targets: 8, width: "20%", className: "text-center" }, // Action column
+ { targets: [6, 7], className: "text-center" }, // Total Items and Status columns
],
columns: [
{
@@ -67,36 +200,12 @@ function initializeDataTable() {
name: "mutation_number",
orderable: true,
},
- {
- data: "created_at",
- name: "created_at",
- orderable: true,
- },
- {
- data: "from_dealer",
- name: "from_dealer",
- orderable: true,
- },
- {
- data: "to_dealer",
- name: "to_dealer",
- orderable: true,
- },
- {
- data: "requested_by",
- name: "requested_by",
- orderable: true,
- },
- {
- data: "total_items",
- name: "total_items",
- orderable: true,
- },
- {
- data: "status",
- name: "status",
- orderable: true,
- },
+ { data: "created_at", name: "created_at", orderable: true },
+ { data: "from_dealer", name: "from_dealer", orderable: true },
+ { data: "to_dealer", name: "to_dealer", orderable: true },
+ { data: "requested_by", name: "requested_by", orderable: true },
+ { data: "total_items", name: "total_items", orderable: true },
+ { data: "status", name: "status", orderable: true },
{
data: "action",
name: "action",
@@ -104,13 +213,84 @@ function initializeDataTable() {
searchable: false,
},
],
- order: [[1, "desc"]], // Order by mutation_number desc (which follows ID order)
+ order: [[1, "desc"]], // Order by mutation_number desc
pageLength: 10,
responsive: true,
- ordering: true, // Enable column ordering
- orderMulti: false, // Single column ordering only
+ ordering: true,
+ orderMulti: false,
});
+ // Setup filter button handlers
+ setupFilterHandlers(table);
+
+ // Setup other event handlers
+ setupTableEventHandlers(table);
+}
+
+function setupFilterHandlers(table) {
+ // Handle Filter Search Button
+ $("#kt_search").on("click", function () {
+ console.log("Filter button clicked");
+
+ const dealerFilter = $("#dealer_filter").val();
+ const dateFrom = $("#date_from").val();
+ const dateTo = $("#date_to").val();
+
+ console.log("Filtering with:", {
+ dealer: dealerFilter,
+ dateFrom,
+ dateTo,
+ });
+
+ table.ajax.reload();
+ });
+
+ // Handle Filter Reset Button
+ $("#kt_reset").on("click", function () {
+ console.log("Reset button clicked");
+
+ // Clear all filters
+ $("#dealer_filter").val("").trigger("change"); // Reset Select2
+ $("#date_from").val("");
+ $("#date_to").val("");
+
+ // Reset end date picker and disable it
+ resetEndDatePicker();
+
+ // Reload table
+ table.ajax.reload();
+ });
+
+ // Handle Enter key on date inputs
+ $("#date_from, #date_to").on("keypress", function (e) {
+ if (e.which === 13) {
+ // Enter key
+ $("#kt_search").click();
+ }
+ });
+
+ // Auto-filter when dealer selection changes
+ $("#dealer_filter").on("change", function () {
+ console.log("Dealer filter changed:", $(this).val());
+ // Uncomment the line below if you want auto-filter on dealer change
+ // table.ajax.reload();
+ });
+}
+
+function resetEndDatePicker() {
+ // Destroy existing datepicker
+ $("#date_to").datepicker("destroy");
+
+ // Re-initialize without minDate constraint
+ initializeEndDatePicker();
+
+ // Disable the input
+ $("#date_to").prop("disabled", true);
+
+ console.log("End date picker reset and disabled");
+}
+
+function setupTableEventHandlers(table) {
// Debug ordering events
table.on("order.dt", function () {
console.log("Order changed:", table.order());
@@ -119,7 +299,7 @@ function initializeDataTable() {
// Add loading indicator for ordering
table.on("processing.dt", function (e, settings, processing) {
if (processing) {
- console.log("DataTable processing started (ordering/filtering)");
+ console.log("DataTable processing started");
} else {
console.log("DataTable processing finished");
}
@@ -127,7 +307,7 @@ function initializeDataTable() {
// Manual click handler for column headers (fallback)
$("#mutations-table thead th").on("click", function () {
- var columnIndex = $(this).index();
+ const columnIndex = $(this).index();
console.log("Column header clicked:", columnIndex, $(this).text());
// Skip if it's the first (No.) or last (Action) column
@@ -152,28 +332,8 @@ function initializeDataTable() {
// Handle Cancel Button Click with SweetAlert
$(document).on("click", ".btn-cancel", function () {
- var mutationId = $(this).data("id");
-
- if (typeof Swal !== "undefined") {
- Swal.fire({
- title: "Batalkan Mutasi?",
- text: "Apakah Anda yakin ingin membatalkan mutasi ini?",
- icon: "warning",
- showCancelButton: true,
- confirmButtonColor: "#d33",
- cancelButtonColor: "#3085d6",
- confirmButtonText: "Ya, Batalkan",
- cancelButtonText: "Batal",
- }).then((result) => {
- if (result.isConfirmed) {
- cancelMutation(mutationId);
- }
- });
- } else {
- if (confirm("Apakah Anda yakin ingin membatalkan mutasi ini?")) {
- cancelMutation(mutationId);
- }
- }
+ const mutationId = $(this).data("id");
+ handleCancelMutation(mutationId, table);
});
// Handle form submissions with loading state
@@ -186,25 +346,53 @@ function initializeDataTable() {
// Validate quantity approved in receive modal
$(document).on("input", 'input[name*="quantity_approved"]', function () {
- var maxValue = parseFloat($(this).attr("max"));
- var currentValue = parseFloat($(this).val());
-
- if (maxValue && currentValue > maxValue) {
- $(this).val(maxValue);
- $(this).addClass("is-invalid");
- if (!$(this).siblings(".invalid-feedback").length) {
- $(this).after(
- 'Quantity tidak boleh melebihi yang diminta
'
- );
- }
- } else {
- $(this).removeClass("is-invalid");
- $(this).siblings(".invalid-feedback").remove();
- }
+ validateQuantityInput($(this));
});
}
-function cancelMutation(mutationId) {
+function handleCancelMutation(mutationId, table) {
+ if (typeof Swal !== "undefined") {
+ Swal.fire({
+ title: "Batalkan Mutasi?",
+ text: "Apakah Anda yakin ingin membatalkan mutasi ini?",
+ icon: "warning",
+ showCancelButton: true,
+ confirmButtonColor: "#d33",
+ cancelButtonColor: "#3085d6",
+ confirmButtonText: "Ya, Batalkan",
+ cancelButtonText: "Batal",
+ }).then((result) => {
+ if (result.isConfirmed) {
+ cancelMutation(mutationId, table);
+ }
+ });
+ } else {
+ if (confirm("Apakah Anda yakin ingin membatalkan mutasi ini?")) {
+ cancelMutation(mutationId, table);
+ }
+ }
+}
+
+function validateQuantityInput(input) {
+ const maxValue = parseFloat(input.attr("max"));
+ const currentValue = parseFloat(input.val());
+
+ if (maxValue && currentValue > maxValue) {
+ input.val(maxValue);
+ input.addClass("is-invalid");
+
+ if (!input.siblings(".invalid-feedback").length) {
+ input.after(
+ 'Quantity tidak boleh melebihi yang diminta
'
+ );
+ }
+ } else {
+ input.removeClass("is-invalid");
+ input.siblings(".invalid-feedback").remove();
+ }
+}
+
+function cancelMutation(mutationId, table) {
$.ajax({
url: "/warehouse/mutations/" + mutationId + "/cancel",
type: "POST",
@@ -223,13 +411,14 @@ function cancelMutation(mutationId) {
} else {
alert("Mutasi berhasil dibatalkan");
}
- // Get table instance
- var table = $("#mutations-table").DataTable();
+
+ // Reload table
table.ajax.reload();
},
error: function (xhr) {
- var errorMsg =
+ const errorMsg =
xhr.responseJSON?.message || "Gagal membatalkan mutasi";
+
if (typeof Swal !== "undefined") {
Swal.fire({
title: "Error!",
diff --git a/resources/js/warehouse_management/opnames/index.js b/resources/js/warehouse_management/opnames/index.js
index b6cabfb..47f336f 100755
--- a/resources/js/warehouse_management/opnames/index.js
+++ b/resources/js/warehouse_management/opnames/index.js
@@ -1,22 +1,349 @@
-$.ajaxSetup({
- headers: {
- "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"),
- },
+$(document).ready(function () {
+ console.log("Opnames index.js loaded");
+
+ // Check if required libraries are available
+ if (typeof $.fn.DataTable === "undefined") {
+ console.error("DataTables not available!");
+ return;
+ }
+
+ // Initialize components
+ initializeSelect2();
+ initializeDatepickers();
+
+ // Wait for DOM to be fully ready before initializing DataTable
+ setTimeout(function () {
+ initializeDataTable();
+ }, 100);
});
-let tableContainer = $("#opnames-table");
-let url = tableContainer.data("url");
-let table = $("#opnames-table").DataTable({
- processing: true,
- serverSide: true,
- ajax: url,
- order: [[0, "desc"]],
- columns: [
- { data: "created_at", name: "created_at", visible: false },
- { data: "opname_date", name: "opname_date" },
- { data: "dealer_name", name: "dealer.name" },
- { data: "user_name", name: "user.name" },
- { data: "status", name: "status" },
- { data: "action", name: "action", orderable: false, searchable: false },
- ],
-});
+/**
+ * Initialize Select2 for dealer filter
+ */
+function initializeSelect2() {
+ console.log("Initializing Select2...");
+
+ if (typeof $.fn.select2 !== "undefined") {
+ $("#dealer_filter").select2({
+ placeholder: "Pilih Dealer",
+ allowClear: false,
+ width: "100%",
+ dropdownAutoWidth: true,
+ minimumResultsForSearch: 5, // Show search box if more than 5 options
+ });
+ } else {
+ console.warn("Select2 not available, using regular select");
+ }
+}
+
+/**
+ * Initialize date pickers with validation
+ */
+function initializeDatepickers() {
+ console.log("Initializing datepickers...");
+
+ // Initialize start date picker
+ $("#date_from").datepicker({
+ dateFormat: "yy-mm-dd",
+ changeMonth: true,
+ changeYear: true,
+ maxDate: new Date(),
+ yearRange: "-5:+0",
+ onSelect: function (selectedDate) {
+ console.log("Start date selected:", selectedDate);
+ enableEndDatePicker(selectedDate);
+ $(this).datepicker("hide");
+ },
+ onClose: function (selectedDate) {
+ if (selectedDate) {
+ console.log("Start date closed with value:", selectedDate);
+ enableEndDatePicker(selectedDate);
+ }
+ },
+ });
+
+ // Initialize end date picker (initially disabled)
+ initializeEndDatePicker();
+
+ // Initially disable end date input
+ $("#date_to").prop("disabled", true);
+
+ // Add calendar icons
+ addCalendarIcons();
+
+ // Setup calendar icon click handlers
+ setupIconClickHandlers();
+
+ // Setup change event handlers as backup
+ setupChangeEventHandlers();
+}
+
+/**
+ * Enable end date picker with minimum date constraint
+ */
+function enableEndDatePicker(startDate) {
+ console.log("Enabling end date picker with min date:", startDate);
+
+ // Enable the input
+ $("#date_to").prop("disabled", false);
+
+ // Destroy existing datepicker
+ $("#date_to").datepicker("destroy");
+
+ // Re-initialize with new minDate
+ $("#date_to").datepicker({
+ dateFormat: "yy-mm-dd",
+ changeMonth: true,
+ changeYear: true,
+ maxDate: new Date(),
+ yearRange: "-5:+0",
+ minDate: new Date(startDate), // Convert to Date object for proper comparison
+ onSelect: function (selectedDate) {
+ console.log("End date selected:", selectedDate);
+ $(this).datepicker("hide");
+ },
+ });
+
+ console.log("End date picker enabled with minDate:", startDate);
+}
+
+/**
+ * Initialize end date picker without constraints
+ */
+function initializeEndDatePicker() {
+ $("#date_to").datepicker({
+ dateFormat: "yy-mm-dd",
+ changeMonth: true,
+ changeYear: true,
+ maxDate: new Date(),
+ yearRange: "-5:+0",
+ onSelect: function (selectedDate) {
+ console.log("End date selected:", selectedDate);
+ $(this).datepicker("hide");
+ },
+ });
+}
+
+/**
+ * Add calendar icons to date inputs
+ */
+function addCalendarIcons() {
+ // Remove any existing icons first
+ $(".input-icon").remove();
+
+ // Add calendar icons with CSS classes
+ const iconHtml = '';
+
+ $("#date_from").after(iconHtml);
+ $("#date_to").after(iconHtml);
+
+ // Ensure parent containers have relative positioning
+ $("#date_from, #date_to")
+ .closest(".form-group")
+ .css("position", "relative");
+}
+
+/**
+ * Setup click handlers for calendar icons
+ */
+function setupIconClickHandlers() {
+ $(document).on("click", ".input-icon", function () {
+ const input = $(this).prev("input");
+ if (!input.prop("disabled")) {
+ input.datepicker("show");
+ }
+ });
+}
+
+/**
+ * Setup change event handlers for date inputs
+ */
+function setupChangeEventHandlers() {
+ $("#date_from").on("change", function () {
+ const selectedDate = $(this).val();
+ if (selectedDate) {
+ console.log("Start date change event:", selectedDate);
+ enableEndDatePicker(selectedDate);
+ }
+ });
+}
+
+/**
+ * Initialize DataTable with server-side processing and filtering
+ */
+function initializeDataTable() {
+ console.log("Initializing DataTable...");
+
+ // Destroy existing table if any
+ if ($.fn.DataTable.isDataTable("#opnames-table")) {
+ $("#opnames-table").DataTable().destroy();
+ }
+
+ // Initialize DataTable
+ const table = $("#opnames-table").DataTable({
+ processing: true,
+ serverSide: true,
+ destroy: true,
+ ajax: {
+ url: $("#opnames-table").data("url"),
+ type: "GET",
+ data: function (d) {
+ // Add filter parameters
+ d.dealer_filter = $("#dealer_filter").val();
+ d.date_from = $("#date_from").val();
+ d.date_to = $("#date_to").val();
+
+ console.log("AJAX data being sent:", {
+ dealer_filter: d.dealer_filter,
+ date_from: d.date_from,
+ date_to: d.date_to,
+ });
+
+ return d;
+ },
+ error: function (xhr, error, code) {
+ console.error("DataTables AJAX error:", error, code);
+ console.error("Response:", xhr.responseText);
+ },
+ },
+ columnDefs: [
+ { targets: 0, width: "15%" }, // Opname Date column
+ { targets: 5, width: "15%", className: "text-center" }, // Action column
+ ],
+ columns: [
+ {
+ data: "created_at",
+ name: "created_at",
+ orderable: true,
+ },
+ {
+ data: "opname_date",
+ name: "opname_date",
+ orderable: true,
+ },
+ {
+ data: "dealer_name",
+ name: "dealer.name",
+ orderable: true,
+ },
+ {
+ data: "user_name",
+ name: "user.name",
+ orderable: true,
+ },
+ {
+ data: "status",
+ name: "status",
+ orderable: true,
+ },
+ {
+ data: "action",
+ name: "action",
+ orderable: false,
+ searchable: false,
+ },
+ ],
+ order: [[4, "desc"]], // Order by created_at desc
+ pageLength: 10,
+ responsive: true,
+ ordering: true,
+ orderMulti: false,
+ });
+
+ // Setup filter button handlers
+ setupFilterHandlers(table);
+
+ // Setup other event handlers
+ setupTableEventHandlers(table);
+}
+
+/**
+ * Setup filter and reset button handlers
+ */
+function setupFilterHandlers(table) {
+ // Handle Filter Search Button
+ $("#kt_search").on("click", function () {
+ console.log("Filter button clicked");
+
+ const dealerFilter = $("#dealer_filter").val();
+ const dateFrom = $("#date_from").val();
+ const dateTo = $("#date_to").val();
+
+ console.log("Filtering with:", {
+ dealer: dealerFilter,
+ dateFrom: dateFrom,
+ dateTo: dateTo,
+ });
+
+ table.ajax.reload();
+ });
+
+ // Handle Filter Reset Button
+ $("#kt_reset").on("click", function () {
+ console.log("Reset button clicked");
+
+ // Clear all filters
+ $("#dealer_filter").val("").trigger("change"); // Reset Select2
+ $("#date_from").val("");
+ $("#date_to").val("");
+
+ // Reset end date picker and disable it
+ resetEndDatePicker();
+
+ // Reload table
+ table.ajax.reload();
+ });
+
+ // Handle Enter key on date inputs
+ $("#date_from, #date_to").on("keypress", function (e) {
+ if (e.which === 13) {
+ // Enter key
+ $("#kt_search").click();
+ }
+ });
+
+ // Optional: Auto-filter when dealer selection changes
+ $("#dealer_filter").on("change", function () {
+ console.log("Dealer filter changed:", $(this).val());
+ // Uncomment the line below if you want auto-filter on dealer change
+ // table.ajax.reload();
+ });
+}
+
+/**
+ * Reset end date picker to initial state
+ */
+function resetEndDatePicker() {
+ // Destroy existing datepicker
+ $("#date_to").datepicker("destroy");
+
+ // Re-initialize without minDate constraint
+ initializeEndDatePicker();
+
+ // Disable the input
+ $("#date_to").prop("disabled", true);
+
+ console.log("End date picker reset and disabled");
+}
+
+/**
+ * Setup additional table event handlers
+ */
+function setupTableEventHandlers(table) {
+ // Debug ordering events
+ table.on("order.dt", function () {
+ console.log("Order changed:", table.order());
+ });
+
+ // Add loading indicator for processing
+ table.on("processing.dt", function (e, settings, processing) {
+ if (processing) {
+ console.log("DataTable processing started");
+ } else {
+ console.log("DataTable processing finished");
+ }
+ });
+
+ // Handle any custom button clicks here if needed
+ // Example: $(document).on('click', '.custom-btn', function() { ... });
+}
diff --git a/resources/views/warehouse_management/mutations/index.blade.php b/resources/views/warehouse_management/mutations/index.blade.php
index 6e6b16e..78faa10 100755
--- a/resources/views/warehouse_management/mutations/index.blade.php
+++ b/resources/views/warehouse_management/mutations/index.blade.php
@@ -25,6 +25,45 @@
+
+
+
@@ -130,6 +169,249 @@ table.dataTable thead .sorting_desc:before {
top: 50%;
transform: translateY(-50%);
}
+
+/* Filter section styling */
+.form-label {
+ font-weight: 600;
+ color: #595d6e;
+ margin-bottom: 5px;
+ font-size: 12px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.form-group.mb-0 {
+ margin-bottom: 0 !important;
+}
+
+/* Date input container styling */
+.form-group {
+ position: relative;
+}
+
+/* Input styling for date fields */
+#date_from, #date_to {
+ padding-right: 40px; /* Make space for icon */
+}
+
+/* Date picker icon styling */
+.input-icon {
+ position: absolute;
+ right: 12px;
+ bottom: 9px; /* Position from bottom to align with input field */
+ cursor: pointer;
+ color: #74788d;
+ z-index: 5;
+ font-size: 14px;
+ pointer-events: auto;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 20px;
+ height: 20px;
+}
+
+.input-icon:hover {
+ color: #5d78ff;
+}
+
+/* Disabled input styling */
+input[disabled] {
+ background-color: #f8f9fa !important;
+ color: #6c757d !important;
+ cursor: not-allowed !important;
+ opacity: 0.65;
+}
+
+input[disabled] + .input-icon {
+ color: #ccc !important;
+ cursor: not-allowed !important;
+ opacity: 0.5;
+}
+
+/* Ensure Select2 container doesn't have conflicting padding */
+.select2-container .select2-selection--single .form-control {
+ padding-right: 12px !important;
+}
+
+/* Select2 styling */
+.select2-container {
+ z-index: 9999;
+}
+
+.select2-container--default .select2-selection--single {
+ height: 38px;
+ border: 1px solid #e2e5ec;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ padding: 0;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__rendered {
+ line-height: 36px;
+ padding-left: 12px;
+ padding-right: 30px; /* Make space for dropdown arrow */
+ color: #74788d;
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__placeholder {
+ color: #74788d;
+ line-height: 36px;
+}
+
+/* Dropdown arrow styling */
+.select2-container--default .select2-selection--single .select2-selection__arrow {
+ height: 36px;
+ right: 8px;
+ top: 1px;
+ width: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow b {
+ border-color: #74788d transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0;
+}
+
+/* Hide clear button (×) completely */
+.select2-container--default .select2-selection--single .select2-selection__clear {
+ display: none !important;
+}
+
+/* Dropdown styling */
+.select2-dropdown {
+ border: 1px solid #e2e5ec;
+ border-radius: 4px;
+ z-index: 9999 !important;
+ box-shadow: 0 2px 8px rgba(0,0,0,0.15);
+}
+
+/* Ensure dropdown container has proper positioning */
+.select2-container--open {
+ z-index: 9999 !important;
+}
+
+.select2-container--open .select2-dropdown {
+ z-index: 9999 !important;
+}
+
+.select2-results__option {
+ padding: 8px 12px;
+ line-height: 1.4;
+}
+
+.select2-results__option--highlighted {
+ background-color: #5d78ff;
+ color: white;
+}
+
+/* Focus states */
+.select2-container--default.select2-container--focus .select2-selection--single {
+ border-color: #5d78ff;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(93, 120, 255, 0.25);
+}
+
+/* Custom datepicker styles */
+.ui-datepicker {
+ background: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
+ font-size: 13px;
+ z-index: 9999 !important;
+}
+
+.ui-datepicker-header {
+ background: #f8f9fa;
+ border-bottom: 1px solid #dee2e6;
+ padding: 10px;
+ border-radius: 4px 4px 0 0;
+}
+
+.ui-datepicker-title {
+ font-weight: 600;
+ color: #495057;
+}
+
+.ui-datepicker-calendar {
+ border-collapse: collapse;
+ width: 100%;
+}
+
+.ui-datepicker-calendar td {
+ padding: 5px;
+ text-align: center;
+ border: 1px solid #f8f9fa;
+}
+
+.ui-datepicker-calendar td a {
+ display: block;
+ padding: 8px;
+ text-decoration: none;
+ color: #495057;
+ border-radius: 3px;
+ transition: all 0.2s;
+}
+
+.ui-datepicker-calendar td a:hover {
+ background: #e9ecef;
+ color: #212529;
+}
+
+.ui-datepicker-calendar .ui-datepicker-today a {
+ background: #007bff;
+ color: white;
+}
+
+.ui-datepicker-calendar .ui-datepicker-current-day a {
+ background: #28a745;
+ color: white;
+}
+
+@media (max-width: 768px) {
+ .row.align-items-end {
+ align-items: stretch !important;
+ }
+
+ .col-md-2, .col-md-4 {
+ margin-bottom: 15px;
+ }
+
+ .form-label {
+ margin-bottom: 8px;
+ }
+
+ .ui-datepicker {
+ font-size: 14px;
+ }
+}
+
+@media (max-width: 576px) {
+ .col-md-4:last-child .form-group {
+ text-align: center;
+ }
+
+ .col-md-4:last-child .btn {
+ width: 45%;
+ margin: 0 2.5%;
+ }
+}
@endsection
diff --git a/resources/views/warehouse_management/opnames/index.blade.php b/resources/views/warehouse_management/opnames/index.blade.php
index 3078681..868d6c6 100755
--- a/resources/views/warehouse_management/opnames/index.blade.php
+++ b/resources/views/warehouse_management/opnames/index.blade.php
@@ -23,26 +23,307 @@
-
-
-
-
-
- | Waktu Dibuat |
- Tanggal Opname |
- Dealer |
- Pengguna |
- Status |
- Aksi |
-
-
-
-
-
+
+
+
+
+
+
+
+ | Waktu Dibuat |
+ Tanggal Opname |
+ Dealer |
+ Pengguna |
+ Status |
+ Aksi |
+
+
+
+
+
@endsection
+@section('styles')
+
+@endsection
+
@section('javascripts')
@endsection
\ No newline at end of file