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+J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LnJlbW92ZUNsYXNzKFwiaXMtaW52YWxpZFwiKTtcbiAgICAgICAgaW5wdXQuc2libGluZ3MoXCIuaW52YWxpZC1mZWVkYmFja1wiKS5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbE11dGF0aW9uKG11dGF0aW9uSWQsIHRhYmxlKSB7XG4gICAgJC5hamF4KHtcbiAgICAgICAgdXJsOiBcIi93YXJlaG91c2UvbXV0YXRpb25zL1wiICsgbXV0YXRpb25JZCArIFwiL2NhbmNlbFwiLFxuICAgICAgICB0eXBlOiBcIlBPU1RcIixcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgX3Rva2VuOiAkKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuYXR0cihcImNvbnRlbnRcIiksXG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBTd2FsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiQmVyaGFzaWwhXCIsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IFwiTXV0YXNpIGJlcmhhc2lsIGRpYmF0YWxrYW5cIixcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVyOiAyMDAwLFxuICAgICAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFsZXJ0KFwiTXV0YXNpIGJlcmhhc2lsIGRpYmF0YWxrYW5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlbG9hZCB0YWJsZVxuICAgICAgICAgICAgdGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTXNnID1cbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VKU09OPy5tZXNzYWdlIHx8IFwiR2FnYWwgbWVtYmF0YWxrYW4gbXV0YXNpXCI7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU3dhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIkVycm9yIVwiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvck1zZyxcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbGVydChcIkVycm9yOiBcIiArIGVycm9yTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUFBLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBWTtFQUMxQkMsT0FBTyxDQUFDQyxHQUFSLENBQVksMkJBQVosRUFEMEIsQ0FHMUI7O0VBQ0EsSUFBSSxPQUFPSixDQUFDLENBQUNLLEVBQUYsQ0FBS0MsU0FBWixLQUEwQixXQUE5QixFQUEyQztJQUN2Q0gsT0FBTyxDQUFDSSxLQUFSLENBQWMsMkJBQWQ7SUFDQTtFQUNILENBUHlCLENBUzFCOzs7RUFDQUMsaUJBQWlCO0VBQ2pCQyxxQkFBcUIsR0FYSyxDQWExQjs7RUFDQUMsVUFBVSxDQUFDLFlBQVk7SUFDbkJDLG1CQUFtQjtFQUN0QixDQUZTLEVBRVAsR0FGTyxDQUFWO0FBR0gsQ0FqQkQ7O0FBbUJBLFNBQVNILGlCQUFULEdBQTZCO0VBQ3pCTCxPQUFPLENBQUNDLEdBQVIsQ0FBWSx5QkFBWixFQUR5QixDQUd6Qjs7RUFDQSxJQUFJLE9BQU9KLENBQUMsQ0FBQ0ssRUFBRixDQUFLTyxPQUFaLEtBQXdCLFdBQTVCLEVBQXlDO0lBQ3JDWixDQUFDLENBQUMsZ0JBQUQsQ0FBRCxDQUFvQlksT0FBcEIsQ0FBNEI7TUFDeEJDLFdBQVcsRUFB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QUFMO01BQ0gsQ0FYd0IsQ0FhekI7OztNQUNBNUUsS0FBSyxDQUFDRyxJQUFOLENBQVc2QixNQUFYO0lBQ0gsQ0FyQkU7SUFzQkh6RSxLQUFLLEVBQUUsZUFBVW9ELEdBQVYsRUFBZTtNQUFBOztNQUNsQixJQUFNa0UsUUFBUSxHQUNWLHNCQUFBbEUsR0FBRyxDQUFDbUUsWUFBSix3RUFBa0JDLE9BQWxCLEtBQTZCLDBCQURqQzs7TUFHQSxJQUFJLE9BQU85QixJQUFQLEtBQWdCLFdBQXBCLEVBQWlDO1FBQzdCQSxJQUFJLENBQUNDLElBQUwsQ0FBVTtVQUNOQyxLQUFLLEVBQUUsUUFERDtVQUVOVixJQUFJLEVBQUVvQyxRQUZBO1VBR056QixJQUFJLEVBQUU7UUFIQSxDQUFWO01BS0gsQ0FORCxNQU1PO1FBQ0h3QixLQUFLLENBQUMsWUFBWUMsUUFBYixDQUFMO01BQ0g7SUFDSjtFQW5DRSxDQUFQO0FBcUNIIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL3dhcmVob3VzZV9tYW5hZ2VtZW50L211dGF0aW9ucy9pbmRleC5qcyIsInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvb3BuYW1lcy9pbmRleC5qcyIsIm5hbWVzIjpbIiQiLCJkb2N1bWVudCIsInJlYWR5IiwiY29uc29sZSIsImxvZyIsImZuIiwiRGF0YVRhYmxlIiwiZXJyb3IiLCJpbml0aWFsaXplU2VsZWN0MiIsImluaXRpYWxpemVEYXRlcGlja2VycyIsInNldFRpbWVvdXQiLCJpbml0aWFsaXplRGF0YVRhYmxlIiwic2VsZWN0MiIsInBsYWNlaG9sZGVyIiwiYWxsb3dDbGVhciIsIndpZHRoIiwiZHJvcGRvd25BdXRvV2lkdGgiLCJtaW5pbXVtUmVzdWx0c0ZvclNlYXJjaCIsIndhcm4iLCJkYXRlcGlja2VyIiwiZGF0ZUZvcm1hdCIsImNoYW5nZU1vbnRoIiwiY2hhbmdlWWVhciIsIm1heERhdGUiLCJEYXRlIiwieWVhclJhbmdlIiwib25TZWxlY3QiLCJzZWxlY3RlZERhdGUiLCJlbmFibGVFbmREYXRlUGlja2VyIiwib25DbG9zZSIsImluaXRpYWxpemVFbmREYXRlUGlja2VyIiwicHJvcCIsImFkZENhbGVuZGFySWNvbnMiLCJzZXR1cEljb25DbGlja0hhbmRsZXJzIiwic2V0dXBDaGFuZ2VFdmVudEhhbmRsZXJzIiwic3RhcnREYXRlIiwibWluRGF0ZSIsInJlbW92ZSIsImljb25IdG1sIiwiYWZ0ZXIiLCJjbG9zZXN0IiwiY3NzIiwib24iLCJpbnB1dCIsInByZXYiLCJ2YWwiLCJpc0RhdGFUYWJsZSIsImRlc3Ryb3kiLCJ0YWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsInVybCIsImRhdGEiLCJ0eXBlIiwiZCIsImRlYWxlcl9maWx0ZXIiLCJkYXRlX2Zyb20iLCJkYXRlX3RvIiwieGhyIiwiY29kZSIsInJlc3BvbnNlVGV4dCIsImNvbHVtbkRlZnMiLCJ0YXJnZXRzIiwiY2xhc3NOYW1lIiwiY29sdW1ucyIsIm5hbWUiLCJvcmRlcmFibGUiLCJzZWFyY2hhYmxlIiwib3JkZXIiLCJwYWdlTGVuZ3RoIiwicmVzcG9uc2l2ZSIsIm9yZGVyaW5nIiwib3JkZXJNdWx0aSIsInNldHVwRmlsdGVySGFuZGxlcnMiLCJzZXR1cFRhYmxlRXZlbnRIYW5kbGVycyIsImRlYWxlckZpbHRlciIsImRhdGVGcm9tIiwiZGF0ZVRvIiwiZGVhbGVyIiwicmVsb2FkIiwidHJpZ2dlciIsInJlc2V0RW5kRGF0ZVBpY2tlciIsImUiLCJ3aGljaCIsImNsaWNrIiwic2V0dGluZ3MiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy93YXJlaG91c2VfbWFuYWdlbWVudC9vcG5hbWVzL2luZGV4LmpzP2E0YzgiXSwic291cmNlc0NvbnRlbnQiOlsiJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKFwiT3BuYW1lcyBpbmRleC5qcyBsb2FkZWRcIik7XG5cbiAgICAvLyBDaGVjayBpZiByZXF1aXJlZCBsaWJyYXJpZXMgYXJlIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgJC5mbi5EYXRhVGFibGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkRhdGFUYWJsZXMgbm90IGF2YWlsYWJsZSFcIik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbXBvbmVudHNcbiAgICBpbml0aWFsaXplU2VsZWN0MigpO1xuICAgIGluaXRpYWxpemVEYXRlcGlja2VycygpO1xuXG4gICAgLy8gV2FpdCBmb3IgRE9NIHRvIGJlIGZ1bGx5IHJlYWR5IGJlZm9yZSBpbml0aWFsaXppbmcgRGF0YVRhYmxlXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGluaXRpYWxpemVEYXRhVGFibGUoKTtcbiAgICB9LCAxMDApO1xufSk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBTZWxlY3QyIGZvciBkZWFsZXIgZmlsdGVyXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVTZWxlY3QyKCkge1xuICAgIGNvbnNvbGUubG9nKFwiSW5pdGlhbGl6aW5nIFNlbGVjdDIuLi5cIik7XG5cbiAgICBpZiAodHlwZW9mICQuZm4uc2VsZWN0MiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAkKFwiI2RlYWxlcl9maWx0ZXJcIikuc2VsZWN0Mih7XG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJQaWxpaCBEZWFsZXJcIixcbiAgICAgICAgICAgIGFsbG93Q2xlYXI6IGZhbHNlLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgICAgZHJvcGRvd25BdXRvV2lkdGg6IHRydWUsXG4gICAgICAgICAgICBtaW5pbXVtUmVzdWx0c0ZvclNlYXJjaDogNSwgLy8gU2hvdyBzZWFyY2ggYm94IGlmIG1vcmUgdGhhbiA1IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiU2VsZWN0MiBub3QgYXZhaWxhYmxlLCB1c2luZyByZWd1bGFyIHNlbGVjdFwiKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBkYXRlIHBpY2tlcnMgd2l0aCB2YWxpZGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVEYXRlcGlja2VycygpIHtcbiAgICBjb25zb2xlLmxvZyhcIkluaXRpYWxpemluZyBkYXRlcGlja2Vycy4uLlwiKTtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhcnQgZGF0ZSBwaWNrZXJcbiAgICAkKFwiI2RhdGVfZnJvbVwiKS5kYXRlcGlja2VyKHtcbiAgICAgICAgZGF0ZUZvcm1hdDogXCJ5eS1tbS1kZFwiLFxuICAgICAgICBjaGFuZ2VNb250aDogdHJ1ZSxcbiAgICAgICAgY2hhbmdlWWVhcjogdHJ1ZSxcbiAgICAgICAgbWF4RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgeWVhclJhbmdlOiBcIi01OiswXCIsXG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0YXJ0IGRhdGUgc2VsZWN0ZWQ6XCIsIHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICBlbmFibGVFbmREYXRlUGlja2VyKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICAkKHRoaXMpLmRhdGVwaWNrZXIoXCJoaWRlXCIpO1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiAoc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTdGFydCBkYXRlIGNsb3NlZCB3aXRoIHZhbHVlOlwiLCBzZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUVuZERhdGVQaWNrZXIoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgZW5kIGRhdGUgcGlja2VyIChpbml0aWFsbHkgZGlzYWJsZWQpXG4gICAgaW5pdGlhbGl6ZUVuZERhdGVQaWNrZXIoKTtcblxuICAgIC8vIEluaXRpYWxseSBkaXNhYmxlIGVuZCBkYXRlIGlucHV0XG4gICAgJChcIiNkYXRlX3RvXCIpLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblxuICAgIC8vIEFkZCBjYWxlbmRhciBpY29uc1xuICAgIGFkZENhbGVuZGFySWNvbnMoKTtcblxuICAgIC8vIFNldHVwIGNhbGVuZGFyIGljb24gY2xpY2sgaGFuZGxlcnNcbiAgICBzZXR1cEljb25DbGlja0hhbmRsZXJzKCk7XG5cbiAgICAvLyBTZXR1cCBjaGFuZ2UgZXZlbnQgaGFuZGxlcnMgYXMgYmFja3VwXG4gICAgc2V0dXBDaGFuZ2VFdmVudEhhbmRsZXJzKCk7XG59XG5cbi8qKlxuICogRW5hYmxlIGVuZCBkYXRlIHBpY2tlciB3aXRoIG1pbmltdW0gZGF0ZSBjb25zdHJhaW50XG4gKi9cbmZ1bmN0aW9uIGVuYWJsZUVuZERhdGVQaWNrZXIoc3RhcnREYXRlKSB7XG4gICAgY29uc29sZS5sb2coXCJFbmFibGluZyBlbmQgZGF0ZSBwaWNrZXIgd2l0aCBtaW4gZGF0ZTpcIiwgc3RhcnREYXRlKTtcblxuICAgIC8vIEVuYWJsZSB0aGUgaW5wdXRcbiAgICAkKFwiI2RhdGVfdG9cIikucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcblxuICAgIC8vIERlc3Ryb3kgZXhpc3RpbmcgZGF0ZXBpY2tlclxuICAgICQoXCIjZGF0ZV90b1wiKS5kYXRlcGlja2VyKFwiZGVzdHJveVwiKTtcblxuICAgIC8vIFJlLWluaXRpYWxpemUgd2l0aCBuZXcgbWluRGF0ZVxuICAgICQoXCIjZGF0ZV90b1wiKS5kYXRlcGlja2VyKHtcbiAgICAgICAgZGF0ZUZvcm1hdDogXCJ5eS1tbS1kZFwiLFxuICAgICAgICBjaGFuZ2VNb250aDogdHJ1ZSxcbiAgICAgICAgY2hhbmdlWWVhcjogdHJ1ZSxcbiAgICAgICAgbWF4RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgeWVhclJhbmdlOiBcIi01OiswXCIsXG4gICAgICAgIG1pbkRhdGU6IG5ldyBEYXRlKHN0YXJ0RGF0ZSksIC8vIENvbnZlcnQgdG8gRGF0ZSBvYmplY3QgZm9yIHByb3BlciBjb21wYXJpc29uXG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVuZCBkYXRlIHNlbGVjdGVkOlwiLCBzZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgJCh0aGlzKS5kYXRlcGlja2VyKFwiaGlkZVwiKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKFwiRW5kIGRhdGUgcGlja2VyIGVuYWJsZWQgd2l0aCBtaW5EYXRlOlwiLCBzdGFydERhdGUpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgZW5kIGRhdGUgcGlja2VyIHdpdGhvdXQgY29uc3RyYWludHNcbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZUVuZERhdGVQaWNrZXIoKSB7XG4gICAgJChcIiNkYXRlX3RvXCIpLmRhdGVwaWNrZXIoe1xuICAgICAgICBkYXRlRm9ybWF0OiBcInl5LW1tLWRkXCIsXG4gICAgICAgIGNoYW5nZU1vbnRoOiB0cnVlLFxuICAgICAgICBjaGFuZ2VZZWFyOiB0cnVlLFxuICAgICAgICBtYXhEYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB5ZWFyUmFuZ2U6IFwiLTU6KzBcIixcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRW5kIGRhdGUgc2VsZWN0ZWQ6XCIsIHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICAkKHRoaXMpLmRhdGVwaWNrZXIoXCJoaWRlXCIpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vKipcbiAqIEFkZCBjYWxlbmRhciBpY29ucyB0byBkYXRlIGlucHV0c1xuICovXG5mdW5jdGlvbiBhZGRDYWxlbmRhckljb25zKCkge1xuICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgaWNvbnMgZmlyc3RcbiAgICAkKFwiLmlucHV0LWljb25cIikucmVtb3ZlKCk7XG5cbiAgICAvLyBBZGQgY2FsZW5kYXIgaWNvbnMgd2l0aCBDU1MgY2xhc3Nlc1xuICAgIGNvbnN0IGljb25IdG1sID0gJzxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgaW5wdXQtaWNvblwiPjwvaT4nO1xuXG4gICAgJChcIiNkYXRlX2Zyb21cIikuYWZ0ZXIoaWNvbkh0bWwpO1xuICAgICQoXCIjZGF0ZV90b1wiKS5hZnRlcihpY29uSHRtbCk7XG5cbiAgICAvLyBFbnN1cmUgcGFyZW50IGNvbnRhaW5lcnMgaGF2ZSByZWxhdGl2ZSBwb3NpdGlvbmluZ1xuICAgICQoXCIjZGF0ZV9mcm9tLCAjZGF0ZV90b1wiKVxuICAgICAgICAuY2xvc2VzdChcIi5mb3JtLWdyb3VwXCIpXG4gICAgICAgIC5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xufVxuXG4vKipcbiAqIFNldHVwIGNsaWNrIGhhbmRsZXJzIGZvciBjYWxlbmRhciBpY29uc1xuICovXG5mdW5jdGlvbiBzZXR1cEljb25DbGlja0hhbmRsZXJzKCkge1xuICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIuaW5wdXQtaWNvblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gJCh0aGlzKS5wcmV2KFwiaW5wdXRcIik7XG4gICAgICAgIGlmICghaW5wdXQucHJvcChcImRpc2FibGVkXCIpKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRlcGlja2VyKFwic2hvd1wiKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIFNldHVwIGNoYW5nZSBldmVudCBoYW5kbGVycyBmb3IgZGF0ZSBpbnB1dHNcbiAqL1xuZnVuY3Rpb24gc2V0dXBDaGFuZ2VFdmVudEhhbmRsZXJzKCkge1xuICAgICQoXCIjZGF0ZV9mcm9tXCIpLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJTdGFydCBkYXRlIGNoYW5nZSBldmVudDpcIiwgc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIGVuYWJsZUVuZERhdGVQaWNrZXIoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgRGF0YVRhYmxlIHdpdGggc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBhbmQgZmlsdGVyaW5nXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVEYXRhVGFibGUoKSB7XG4gICAgY29uc29sZS5sb2coXCJJbml0aWFsaXppbmcgRGF0YVRhYmxlLi4uXCIpO1xuXG4gICAgLy8gRGVzdHJveSBleGlzdGluZyB0YWJsZSBpZiBhbnlcbiAgICBpZiAoJC5mbi5EYXRhVGFibGUuaXNEYXRhVGFibGUoXCIjb3BuYW1lcy10YWJsZVwiKSkge1xuICAgICAgICAkKFwiI29wbmFtZXMtdGFibGVcIikuRGF0YVRhYmxlKCkuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgRGF0YVRhYmxlXG4gICAgY29uc3QgdGFibGUgPSAkKFwiI29wbmFtZXMtdGFibGVcIikuRGF0YVRhYmxlKHtcbiAgICAgICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICAgICAgc2VydmVyU2lkZTogdHJ1ZSxcbiAgICAgICAgZGVzdHJveTogdHJ1ZSxcbiAgICAgICAgYWpheDoge1xuICAgICAgICAgICAgdXJsOiAkKFwiI29wbmFtZXMtdGFibGVcIikuZGF0YShcInVybFwiKSxcbiAgICAgICAgICAgIHR5cGU6IFwiR0VUXCIsXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIC8vIEFkZCBmaWx0ZXIgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGQuZGVhbGVyX2ZpbHRlciA9ICQoXCIjZGVhbGVyX2ZpbHRlclwiKS52YWwoKTtcbiAgICAgICAgICAgICAgICBkLmRhdGVfZnJvbSA9ICQoXCIjZGF0ZV9mcm9tXCIpLnZhbCgpO1xuICAgICAgICAgICAgICAgIGQuZGF0ZV90byA9ICQoXCIjZGF0ZV90b1wiKS52YWwoKTtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQUpBWCBkYXRhIGJlaW5nIHNlbnQ6XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZGVhbGVyX2ZpbHRlcjogZC5kZWFsZXJfZmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBkYXRlX2Zyb206IGQuZGF0ZV9mcm9tLFxuICAgICAgICAgICAgICAgICAgICBkYXRlX3RvOiBkLmRhdGVfdG8sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhociwgZXJyb3IsIGNvZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRGF0YVRhYmxlcyBBSkFYIGVycm9yOlwiLCBlcnJvciwgY29kZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJlc3BvbnNlOlwiLCB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNvbHVtbkRlZnM6IFtcbiAgICAgICAgICAgIHsgdGFyZ2V0czogMCwgd2lkdGg6IFwiMTUlXCIgfSwgLy8gT3BuYW1lIERhdGUgY29sdW1uXG4gICAgICAgICAgICB7IHRhcmdldHM6IDUsIHdpZHRoOiBcIjE1JVwiLCBjbGFzc05hbWU6IFwidGV4dC1jZW50ZXJcIiB9LCAvLyBBY3Rpb24gY29sdW1uXG4gICAgICAgIF0sXG4gICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IFwib3BuYW1lX2RhdGVcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm9wbmFtZV9kYXRlXCIsXG4gICAgICAgICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBcImRlYWxlcl9uYW1lXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJkZWFsZXIubmFtZVwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJ1c2VyX25hbWVcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInVzZXIubmFtZVwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJzdGF0dXNcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YTogXCJhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcImFjdGlvblwiLFxuICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvcmRlcjogW1s0LCBcImRlc2NcIl1dLCAvLyBPcmRlciBieSBjcmVhdGVkX2F0IGRlc2NcbiAgICAgICAgcGFnZUxlbmd0aDogMTAsXG4gICAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICAgIG9yZGVyaW5nOiB0cnVlLFxuICAgICAgICBvcmRlck11bHRpOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIFNldHVwIGZpbHRlciBidXR0b24gaGFuZGxlcnNcbiAgICBzZXR1cEZpbHRlckhhbmRsZXJzKHRhYmxlKTtcblxuICAgIC8vIFNldHVwIG90aGVyIGV2ZW50IGhhbmRsZXJzXG4gICAgc2V0dXBUYWJsZUV2ZW50SGFuZGxlcnModGFibGUpO1xufVxuXG4vKipcbiAqIFNldHVwIGZpbHRlciBhbmQgcmVzZXQgYnV0dG9uIGhhbmRsZXJzXG4gKi9cbmZ1bmN0aW9uIHNldHVwRmlsdGVySGFuZGxlcnModGFibGUpIHtcbiAgICAvLyBIYW5kbGUgRmlsdGVyIFNlYXJjaCBCdXR0b25cbiAgICAkKFwiI2t0X3NlYXJjaFwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJGaWx0ZXIgYnV0dG9uIGNsaWNrZWRcIik7XG5cbiAgICAgICAgY29uc3QgZGVhbGVyRmlsdGVyID0gJChcIiNkZWFsZXJfZmlsdGVyXCIpLnZhbCgpO1xuICAgICAgICBjb25zdCBkYXRlRnJvbSA9ICQoXCIjZGF0ZV9mcm9tXCIpLnZhbCgpO1xuICAgICAgICBjb25zdCBkYXRlVG8gPSAkKFwiI2RhdGVfdG9cIikudmFsKCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJGaWx0ZXJpbmcgd2l0aDpcIiwge1xuICAgICAgICAgICAgZGVhbGVyOiBkZWFsZXJGaWx0ZXIsXG4gICAgICAgICAgICBkYXRlRnJvbTogZGF0ZUZyb20sXG4gICAgICAgICAgICBkYXRlVG86IGRhdGVUbyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBGaWx0ZXIgUmVzZXQgQnV0dG9uXG4gICAgJChcIiNrdF9yZXNldFwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJSZXNldCBidXR0b24gY2xpY2tlZFwiKTtcblxuICAgICAgICAvLyBDbGVhciBhbGwgZmlsdGVyc1xuICAgICAgICAkKFwiI2RlYWxlcl9maWx0ZXJcIikudmFsKFwiXCIpLnRyaWdnZXIoXCJjaGFuZ2VcIik7IC8vIFJlc2V0IFNlbGVjdDJcbiAgICAgICAgJChcIiNkYXRlX2Zyb21cIikudmFsKFwiXCIpO1xuICAgICAgICAkKFwiI2RhdGVfdG9cIikudmFsKFwiXCIpO1xuXG4gICAgICAgIC8vIFJlc2V0IGVuZCBkYXRlIHBpY2tlciBhbmQgZGlzYWJsZSBpdFxuICAgICAgICByZXNldEVuZERhdGVQaWNrZXIoKTtcblxuICAgICAgICAvLyBSZWxvYWQgdGFibGVcbiAgICAgICAgdGFibGUuYWpheC5yZWxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFbnRlciBrZXkgb24gZGF0ZSBpbnB1dHNcbiAgICAkKFwiI2RhdGVfZnJvbSwgI2RhdGVfdG9cIikub24oXCJrZXlwcmVzc1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgICAgIC8vIEVudGVyIGtleVxuICAgICAgICAgICAgJChcIiNrdF9zZWFyY2hcIikuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gT3B0aW9uYWw6IEF1dG8tZmlsdGVyIHdoZW4gZGVhbGVyIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgJChcIiNkZWFsZXJfZmlsdGVyXCIpLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJEZWFsZXIgZmlsdGVyIGNoYW5nZWQ6XCIsICQodGhpcykudmFsKCkpO1xuICAgICAgICAvLyBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgaWYgeW91IHdhbnQgYXV0by1maWx0ZXIgb24gZGVhbGVyIGNoYW5nZVxuICAgICAgICAvLyB0YWJsZS5hamF4LnJlbG9hZCgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IGVuZCBkYXRlIHBpY2tlciB0byBpbml0aWFsIHN0YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc2V0RW5kRGF0ZVBpY2tlcigpIHtcbiAgICAvLyBEZXN0cm95IGV4aXN0aW5nIGRhdGVwaWNrZXJcbiAgICAkKFwiI2RhdGVfdG9cIikuZGF0ZXBpY2tlcihcImRlc3Ryb3lcIik7XG5cbiAgICAvLyBSZS1pbml0aWFsaXplIHdpdGhvdXQgbWluRGF0ZSBjb25zdHJhaW50XG4gICAgaW5pdGlhbGl6ZUVuZERhdGVQaWNrZXIoKTtcblxuICAgIC8vIERpc2FibGUgdGhlIGlucHV0XG4gICAgJChcIiNkYXRlX3RvXCIpLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblxuICAgIGNvbnNvbGUubG9nKFwiRW5kIGRhdGUgcGlja2VyIHJlc2V0IGFuZCBkaXNhYmxlZFwiKTtcbn1cblxuLyoqXG4gKiBTZXR1cCBhZGRpdGlvbmFsIHRhYmxlIGV2ZW50IGhhbmRsZXJzXG4gKi9cbmZ1bmN0aW9uIHNldHVwVGFibGVFdmVudEhhbmRsZXJzKHRhYmxlKSB7XG4gICAgLy8gRGVidWcgb3JkZXJpbmcgZXZlbnRzXG4gICAgdGFibGUub24oXCJvcmRlci5kdFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiT3JkZXIgY2hhbmdlZDpcIiwgdGFibGUub3JkZXIoKSk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3IgZm9yIHByb2Nlc3NpbmdcbiAgICB0YWJsZS5vbihcInByb2Nlc3NpbmcuZHRcIiwgZnVuY3Rpb24gKGUsIHNldHRpbmdzLCBwcm9jZXNzaW5nKSB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZSBwcm9jZXNzaW5nIHN0YXJ0ZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGFUYWJsZSBwcm9jZXNzaW5nIGZpbmlzaGVkXCIpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgYW55IGN1c3RvbSBidXR0b24gY2xpY2tzIGhlcmUgaWYgbmVlZGVkXG4gICAgLy8gRXhhbXBsZTogJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5jdXN0b20tYnRuJywgZnVuY3Rpb24oKSB7IC4uLiB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUFBLENBQUMsQ0FBQ0MsUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBWTtFQUMxQkMsT0FBTyxDQUFDQyxHQUFSLENBQVkseUJBQVosRUFEMEIsQ0FHMUI7O0VBQ0EsSUFBSSxPQUFPSixDQUFDLENBQUNLLEVBQUYsQ0FBS0MsU0FBWixLQUEwQixXQUE5QixFQUEyQztJQUN2Q0gsT0FBTyxDQUFDSSxLQUFSLENBQWMsMkJBQWQ7SUFDQTtFQUNILENBUHlCLENBUzFCOzs7RUFDQUMsaUJBQWlCO0VBQ2pCQyxxQkFBcUIsR0FYSyxDQWExQjs7RUFDQUMsVUFBVSxDQUFDLFlBQVk7SUFDbkJDLG1CQUFtQjtFQUN0QixDQUZTLEVBRVAsR0FGTyxDQUFWO0FBR0gsQ0FqQkQ7QUFtQkE7QUFDQTtBQUNBOztBQUNBLFNBQVNILGlCQUFULEdBQTZCO0VBQ3pCTCxPQUFPLENBQUNDLEdBQVIsQ0FBWSx5QkFBWjs7RUFFQSxJQUFJLE9BQU9KLENBQUMsQ0FBQ0ssRUFBRixDQUFLTyxPQUFaLEtBQXdCLFdBQTVCLEVBQXlDO0lBQ3JDWixDQUFDLENBQUMsZ0JBQUQsQ0FBRCxDQUFvQlksT0FBcEIsQ0FBNEI7TUFDeEJDLFdBQVcsRUFBRSxjQURXO01BRXhCQyxVQUFVLEVBQUUsS0FGWTtNQUd4QkMsS0FBSyxFQUFFLE1BSGlCO01BSXhCQyxpQkFBaUIsRUFBRSxJQUpLO01BS3hCQyx1QkFBdUIsRUFBRSxDQUxELENBS0k7O0lBTEosQ0FBNUI7RUFPSCxDQVJELE1BUU87SUFDSGQsT0FBTyxDQUFDZSxJQUFSLENBQWEsNkNBQWI7RUFDSDtBQUNKO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTVCxxQkFBVCxHQUFpQztFQUM3Qk4sT0FBTyxDQUFDQyxHQUFSLENBQVksNkJBQVosRUFENkIsQ0FHN0I7O0VBQ0FKLENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0JtQixVQUFoQixDQUEyQjtJQUN2QkMsVUFBVSxFQUFFLFVBRFc7SUFFdkJDLFdBQVcsRUFBRSxJQUZVO0lBR3ZCQyxVQUFVLEVBQUUsSUFIVztJQUl2QkMsT0FBTyxFQUFFLElBQUlDLElBQUosRUFKYztJQUt2QkMsU0FBUyxFQUFFLE9BTFk7SUFNdkJDLFFBQVEsRUFBRSxrQkFBVUMsWUFBVixFQUF3QjtNQUM5QnhCLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHNCQUFaLEVBQW9DdUIsWUFBcEM7TUFDQUMsbUJBQW1CLENBQUNELFlBQUQsQ0FBbkI7TUFDQTNCLENBQUMsQ0FBQyxJQUFELENBQUQsQ0FBUW1CLFVBQVIsQ0FBbUIsTUFBbkI7SUFDSCxDQVZzQjtJQVd2QlUsT0FBTyxFQUFFLGlCQUFVRixZQUFWLEVBQXdCO01BQzdCLElBQUlBLFlBQUosRUFBa0I7UUFDZHhCLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLCtCQUFaLEVBQTZDdUIsWUFBN0M7UUFDQUMsbUJBQW1CLENBQUNELFlBQUQsQ0FBbkI7TUFDSDtJQUNKO0VBaEJzQixDQUEzQixFQUo2QixDQXVCN0I7O0VBQ0FHLHVCQUF1QixHQXhCTSxDQTBCN0I7O0VBQ0E5QixDQUFDLENBQUMsVUFBRCxDQUFELENBQWMrQixJQUFkLENBQW1CLFVBQW5CLEVBQStCLElBQS9CLEVBM0I2QixDQTZCN0I7O0VBQ0FDLGdCQUFnQixHQTlCYSxDQWdDN0I7O0VBQ0FDLHNCQUFzQixHQWpDTyxDQW1DN0I7O0VBQ0FDLHdCQUF3QjtBQUMzQjtBQUVEO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU04sbUJBQVQsQ0FBNkJPLFNBQTdCLEVBQXdDO0VBQ3BDaEMsT0FBTyxDQUFDQyxHQUFSLENBQVkseUNBQVosRUFBdUQrQixTQUF2RCxFQURvQyxDQUdwQzs7RUFDQW5DLENBQUMsQ0FBQyxVQUFELENBQUQsQ0FBYytCLElBQWQsQ0FBbUIsVUFBbkIsRUFBK0IsS0FBL0IsRUFKb0MsQ0FNcEM7O0VBQ0EvQixDQUFDLENBQUMsVUFBRCxDQUFELENBQWNtQixVQUFkLENBQXlCLFNBQXpCLEVBUG9DLENBU3BDOztFQUNBbkIsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxDQUFjbUIsVUFBZCxDQUF5QjtJQUNyQkMsVUFBVSxFQUFFLFVBRFM7SUFFckJDLFdBQVcsRUFBRSxJQUZRO0lBR3JCQyxVQUFVLEVBQUUsSUFIUztJQUlyQkMsT0FBTyxFQUFFLElBQUlDLElBQUosRUFKWTtJQUtyQkMsU0FBUyxFQUFFLE9BTFU7SUFNckJXLE9BQU8sRUFBRSxJQUFJWixJQUFKLENBQVNXLFNBQVQsQ0FOWTtJQU1TO0lBQzlCVCxRQUFRLEVBQUUsa0JBQVVDLFlBQVYsRUFBd0I7TUFDOUJ4QixPQUFPLENBQUNDLEdBQVIsQ0FBWSxvQkFBWixFQUFrQ3VCLFlBQWxDO01BQ0EzQixDQUFDLENBQUMsSUFBRCxDQUFELENBQVFtQixVQUFSLENBQW1CLE1BQW5CO0lBQ0g7RUFWb0IsQ0FBekI7RUFhQWhCLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLHVDQUFaLEVBQXFEK0IsU0FBckQ7QUFDSDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU0wsdUJBQVQsR0FBbUM7RUFDL0I5QixDQUFDLENBQUMsVUFBRCxDQUFELENBQWNtQixVQUFkLENBQXlCO0lBQ3JCQyxVQUFVLEVBQUUsVUFEUztJQUVyQkMsV0FBVyxFQUFFLElBRlE7SUFHckJDLFVBQVUsRUFBRSxJQUhTO0lBSXJCQyxPQUFPLEVBQUUsSUFBSUMsSUFBSixFQUpZO0lBS3JCQyxTQUFTLEVBQUUsT0FMVTtJQU1yQkMsUUFBUSxFQUFFLGtCQUFVQyxZQUFWLEVBQXdCO01BQzlCeEIsT0FBTyxDQUFDQyxHQUFSLENBQVksb0JBQVosRUFBa0N1QixZQUFsQztNQUNBM0IsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRbUIsVUFBUixDQUFtQixNQUFuQjtJQUNIO0VBVG9CLENBQXpCO0FBV0g7QUFFRDtBQUNBO0FBQ0E7OztBQUNBLFNBQVNhLGdCQUFULEdBQTRCO0VBQ3hCO0VBQ0FoQyxDQUFDLENBQUMsYUFBRCxDQUFELENBQWlCcUMsTUFBakIsR0FGd0IsQ0FJeEI7O0VBQ0EsSUFBTUMsUUFBUSxHQUFHLDJDQUFqQjtFQUVBdEMsQ0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQnVDLEtBQWhCLENBQXNCRCxRQUF0QjtFQUNBdEMsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxDQUFjdUMsS0FBZCxDQUFvQkQsUUFBcEIsRUFSd0IsQ0FVeEI7O0VBQ0F0QyxDQUFDLENBQUMsc0JBQUQsQ0FBRCxDQUNLd0MsT0FETCxDQUNhLGFBRGIsRUFFS0MsR0FGTCxDQUVTLFVBRlQsRUFFcUIsVUFGckI7QUFHSDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU1Isc0JBQVQsR0FBa0M7RUFDOUJqQyxDQUFDLENBQUNDLFFBQUQsQ0FBRCxDQUFZeUMsRUFBWixDQUFlLE9BQWYsRUFBd0IsYUFBeEIsRUFBdUMsWUFBWTtJQUMvQyxJQUFNQyxLQUFLLEdBQUczQyxDQUFDLENBQUMsSUFBRCxDQUFELENBQVE0QyxJQUFSLENBQWEsT0FBYixDQUFkOztJQUNBLElBQUksQ0FBQ0QsS0FBSyxDQUFDWixJQUFOLENBQVcsVUFBWCxDQUFMLEVBQTZCO01BQ3pCWSxLQUFLLENBQUN4QixVQUFOLENBQWlCLE1BQWpCO0lBQ0g7RUFDSixDQUxEO0FBTUg7QUFFRDtBQUNBO0FBQ0E7OztBQUNBLFNBQVNlLHdCQUFULEdBQW9DO0VBQ2hDbEMsQ0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQjBDLEVBQWhCLENBQW1CLFFBQW5CLEVBQTZCLFlBQVk7SUFDckMsSUFBTWYsWUFBWSxHQUFHM0IsQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRNkMsR0FBUixFQUFyQjs7SUFDQSxJQUFJbEIsWUFBSixFQUFrQjtNQUNkeEIsT0FBTyxDQUFDQyxHQUFSLENBQVksMEJBQVosRUFBd0N1QixZQUF4QztNQUNBQyxtQkFBbUIsQ0FBQ0QsWUFBRCxDQUFuQjtJQUNIO0VBQ0osQ0FORDtBQU9IO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTaEIsbUJBQVQsR0FBK0I7RUFDM0JSLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLDJCQUFaLEVBRDJCLENBRzNCOztFQUNBLElBQUlKLENBQUMsQ0FBQ0ssRUFBRixDQUFLQyxTQUFMLENBQWV3QyxXQUFmLENBQTJCLGdCQUEzQixDQUFKLEVBQWtEO0lBQzlDOUMsQ0FBQyxDQUFDLGdCQUFELENBQUQsQ0FBb0JNLFNBQXBCLEdBQWdDeUMsT0FBaEM7RUFDSCxDQU4wQixDQVEzQjs7O0VBQ0EsSUFBTUMsS0FBSyxHQUFHaEQsQ0FBQyxDQUFDLGdCQUFELENBQUQsQ0FBb0JNLFNBQXBCLENBQThCO0lBQ3hDMkMsVUFBVSxFQUFFLElBRDRCO0lBRXhDQyxVQUFVLEVBQUUsSUFGNEI7SUFHeENILE9BQU8sRUFBRSxJQUgrQjtJQUl4Q0ksSUFBSSxFQUFFO01BQ0ZDLEdBQUcsRUFBRXBELENBQUMsQ0FBQyxnQkFBRCxDQUFELENBQW9CcUQsSUFBcEIsQ0FBeUIsS0FBekIsQ0FESDtNQUVGQyxJQUFJLEVBQUUsS0FGSjtNQUdGRCxJQUFJLEVBQUUsY0FBVUUsQ0FBVixFQUFhO1FBQ2Y7UUFDQUEsQ0FBQyxDQUFDQyxhQUFGLEdBQWtCeEQsQ0FBQyxDQUFDLGdCQUFELENBQUQsQ0FBb0I2QyxHQUFwQixFQUFsQjtRQUNBVSxDQUFDLENBQUNFLFNBQUYsR0FBY3pELENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0I2QyxHQUFoQixFQUFkO1FBQ0FVLENBQUMsQ0FBQ0csT0FBRixHQUFZMUQsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxDQUFjNkMsR0FBZCxFQUFaO1FBRUExQyxPQUFPLENBQUNDLEdBQVIsQ0FBWSx1QkFBWixFQUFxQztVQUNqQ29ELGFBQWEsRUFBRUQsQ0FBQyxDQUFDQyxhQURnQjtVQUVqQ0MsU0FBUyxFQUFFRixDQUFDLENBQUNFLFNBRm9CO1VBR2pDQyxPQUFPLEVBQUVILENBQUMsQ0FBQ0c7UUFIc0IsQ0FBckM7UUFNQSxPQUFPSCxDQUFQO01BQ0gsQ0FoQkM7TUFpQkZoRCxLQUFLLEVBQUUsZUFBVW9ELEdBQVYsRUFBZXBELE1BQWYsRUFBc0JxRCxJQUF0QixFQUE0QjtRQUMvQnpELE9BQU8sQ0FBQ0ksS0FBUixDQUFjLHdCQUFkLEVBQXdDQSxNQUF4QyxFQUErQ3FELElBQS9DO1FBQ0F6RCxPQUFPLENBQUNJLEtBQVIsQ0FBYyxXQUFkLEVBQTJCb0QsR0FBRyxDQUFDRSxZQUEvQjtNQUNIO0lBcEJDLENBSmtDO0lBMEJ4Q0MsVUFBVSxFQUFFLENBQ1I7TUFBRUMsT0FBTyxFQUFFLENBQVg7TUFBY2hELEtBQUssRUFBRTtJQUFyQixDQURRLEVBQ3NCO0lBQzlCO01BQUVnRCxPQUFPLEVBQUUsQ0FBWDtNQUFjaEQsS0FBSyxFQUFFLEtBQXJCO01BQTRCaUQsU0FBUyxFQUFFO0lBQXZDLENBRlEsQ0FFZ0Q7SUFGaEQsQ0ExQjRCO0lBOEJ4Q0MsT0FBTyxFQUFFLENBQ0w7TUFDSVosSUFBSSxFQUFFLFlBRFY7TUFFSWEsSUFBSSxFQUFFLFlBRlY7TUFHSUMsU0FBUyxFQUFFO0lBSGYsQ0FESyxFQU1MO01BQ0lkLElBQUksRUFBRSxhQURWO01BRUlhLElBQUksRUFBRSxhQUZWO01BR0lDLFNBQVMsRUFBRTtJQUhmLENBTkssRUFXTDtNQUNJZCxJQUFJLEVBQUUsYUFEVjtNQUVJYSxJQUFJLEVBQUUsYUFGVjtNQUdJQyxTQUFTLEVBQUU7SUFIZixDQVhLLEVBZ0JMO01BQ0lkLElBQUksRUFBRSxXQURWO01BRUlhLElBQUksRUFBRSxXQUZWO01BR0lDLFNBQVMsRUFBRTtJQUhmLENBaEJLLEVBcUJMO01BQ0lkLElBQUksRUFBRSxRQURWO01BRUlhLElBQUksRUFBRSxRQUZWO01BR0lDLFNBQVMsRUFBRTtJQUhmLENBckJLLEVBMEJMO01BQ0lkLElBQUksRUFBRSxRQURWO01BRUlhLElBQUksRUFBRSxRQUZWO01BR0lDLFNBQVMsRUFBRSxLQUhmO01BSUlDLFVBQVUsRUFBRTtJQUpoQixDQTFCSyxDQTlCK0I7SUErRHhDQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUQsRUFBSSxNQUFKLENBQUQsQ0EvRGlDO0lBK0RsQjtJQUN0QkMsVUFBVSxFQUFFLEVBaEU0QjtJQWlFeENDLFVBQVUsRUFBRSxJQWpFNEI7SUFrRXhDQyxRQUFRLEVBQUUsSUFsRThCO0lBbUV4Q0MsVUFBVSxFQUFFO0VBbkU0QixDQUE5QixDQUFkLENBVDJCLENBK0UzQjs7RUFDQUMsbUJBQW1CLENBQUMxQixLQUFELENBQW5CLENBaEYyQixDQWtGM0I7O0VBQ0EyQix1QkFBdUIsQ0FBQzNCLEtBQUQsQ0FBdkI7QUFDSDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBUzBCLG1CQUFULENBQTZCMUIsS0FBN0IsRUFBb0M7RUFDaEM7RUFDQWhELENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0IwQyxFQUFoQixDQUFtQixPQUFuQixFQUE0QixZQUFZO0lBQ3BDdkMsT0FBTyxDQUFDQyxHQUFSLENBQVksdUJBQVo7SUFFQSxJQUFNd0UsWUFBWSxHQUFHNUUsQ0FBQyxDQUFDLGdCQUFELENBQUQsQ0FBb0I2QyxHQUFwQixFQUFyQjtJQUNBLElBQU1nQyxRQUFRLEdBQUc3RSxDQUFDLENBQUMsWUFBRCxDQUFELENBQWdCNkMsR0FBaEIsRUFBakI7SUFDQSxJQUFNaUMsTUFBTSxHQUFHOUUsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxDQUFjNkMsR0FBZCxFQUFmO0lBRUExQyxPQUFPLENBQUNDLEdBQVIsQ0FBWSxpQkFBWixFQUErQjtNQUMzQjJFLE1BQU0sRUFBRUgsWUFEbUI7TUFFM0JDLFFBQVEsRUFBRUEsUUFGaUI7TUFHM0JDLE1BQU0sRUFBRUE7SUFIbUIsQ0FBL0I7SUFNQTlCLEtBQUssQ0FBQ0csSUFBTixDQUFXNkIsTUFBWDtFQUNILENBZEQsRUFGZ0MsQ0FrQmhDOztFQUNBaEYsQ0FBQyxDQUFDLFdBQUQsQ0FBRCxDQUFlMEMsRUFBZixDQUFrQixPQUFsQixFQUEyQixZQUFZO0lBQ25DdkMsT0FBTyxDQUFDQyxHQUFSLENBQVksc0JBQVosRUFEbUMsQ0FHbkM7O0lBQ0FKLENBQUMsQ0FBQyxnQkFBRCxDQUFELENBQW9CNkMsR0FBcEIsQ0FBd0IsRUFBeEIsRUFBNEJvQyxPQUE1QixDQUFvQyxRQUFwQyxFQUptQyxDQUlZOztJQUMvQ2pGLENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0I2QyxHQUFoQixDQUFvQixFQUFwQjtJQUNBN0MsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxDQUFjNkMsR0FBZCxDQUFrQixFQUFsQixFQU5tQyxDQVFuQzs7SUFDQXFDLGtCQUFrQixHQVRpQixDQVduQzs7SUFDQWxDLEtBQUssQ0FBQ0csSUFBTixDQUFXNkIsTUFBWDtFQUNILENBYkQsRUFuQmdDLENBa0NoQzs7RUFDQWhGLENBQUMsQ0FBQyxzQkFBRCxDQUFELENBQTBCMEMsRUFBMUIsQ0FBNkIsVUFBN0IsRUFBeUMsVUFBVXlDLENBQVYsRUFBYTtJQUNsRCxJQUFJQSxDQUFDLENBQUNDLEtBQUYsS0FBWSxFQUFoQixFQUFvQjtNQUNoQjtNQUNBcEYsQ0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQnFGLEtBQWhCO0lBQ0g7RUFDSixDQUxELEVBbkNnQyxDQTBDaEM7O0VBQ0FyRixDQUFDLENBQUMsZ0JBQUQsQ0FBRCxDQUFvQjBDLEVBQXBCLENBQXVCLFFBQXZCLEVBQWlDLFlBQVk7SUFDekN2QyxPQUFPLENBQUNDLEdBQVIsQ0FBWSx3QkFBWixFQUFzQ0osQ0FBQyxDQUFDLElBQUQsQ0FBRCxDQUFRNkMsR0FBUixFQUF0QyxFQUR5QyxDQUV6QztJQUNBO0VBQ0gsQ0FKRDtBQUtIO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTcUMsa0JBQVQsR0FBOEI7RUFDMUI7RUFDQWxGLENBQUMsQ0FBQyxVQUFELENBQUQsQ0FBY21CLFVBQWQsQ0FBeUIsU0FBekIsRUFGMEIsQ0FJMUI7O0VBQ0FXLHVCQUF1QixHQUxHLENBTzFCOztFQUNBOUIsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxDQUFjK0IsSUFBZCxDQUFtQixVQUFuQixFQUErQixJQUEvQjtFQUVBNUIsT0FBTyxDQUFDQyxHQUFSLENBQVksb0NBQVo7QUFDSDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU3VFLHVCQUFULENBQWlDM0IsS0FBakMsRUFBd0M7RUFDcEM7RUFDQUEsS0FBSyxDQUFDTixFQUFOLENBQVMsVUFBVCxFQUFxQixZQUFZO0lBQzdCdkMsT0FBTyxDQUFDQyxHQUFSLENBQVksZ0JBQVosRUFBOEI0QyxLQUFLLENBQUNxQixLQUFOLEVBQTlCO0VBQ0gsQ0FGRCxFQUZvQyxDQU1wQzs7RUFDQXJCLEtBQUssQ0FBQ04sRUFBTixDQUFTLGVBQVQsRUFBMEIsVUFBVXlDLENBQVYsRUFBYUcsUUFBYixFQUF1QnJDLFVBQXZCLEVBQW1DO0lBQ3pELElBQUlBLFVBQUosRUFBZ0I7TUFDWjlDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLDhCQUFaO0lBQ0gsQ0FGRCxNQUVPO01BQ0hELE9BQU8sQ0FBQ0MsR0FBUixDQUFZLCtCQUFaO0lBQ0g7RUFDSixDQU5ELEVBUG9DLENBZXBDO0VBQ0E7QUFDSCJ9\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 DibuatTanggal OpnameDealerPenggunaStatusAksi
- -
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + +
Waktu DibuatTanggal OpnameDealerPenggunaStatusAksi
+ +
@endsection +@section('styles') + +@endsection + @section('javascripts') @endsection \ No newline at end of file