fix login auto detect menu link, and partial update tchnician role dealer
This commit is contained in:
@@ -81,7 +81,7 @@
|
||||
<meta charset="utf-8" />
|
||||
|
||||
<title>POS | Login</title>
|
||||
<meta name="description" content="Login page example">
|
||||
<meta name="description" content="CKB POS Login Page">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="base-url" content="{{ url('/') }}">
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>Nama Role</th>
|
||||
<th>Dealer Tambahan</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -47,13 +48,30 @@
|
||||
<tr>
|
||||
<td>{{ $loop->iteration }}</td>
|
||||
<td>{{ $role->name }}</td>
|
||||
<td>
|
||||
@if($role->dealers->count() > 0)
|
||||
<div class="dealer-list">
|
||||
@foreach($role->dealers->take(3) as $dealer)
|
||||
<span class="badge badge-info mr-1 mb-1">{{ $dealer->name }}</span>
|
||||
@endforeach
|
||||
@if($role->dealers->count() > 3)
|
||||
<span class="badge badge-secondary">+{{ $role->dealers->count() - 3 }} more</span>
|
||||
@endif
|
||||
</div>
|
||||
@else
|
||||
<span class="text-muted">Tidak ada dealer tambahan untuk role ini</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
<div class="d-flex">
|
||||
@can('update', $menus['roleprivileges.index'])
|
||||
<button class="btn btn-sm btn-bold btn-warning mr-2" onclick="editRole({{$role->id}})"> Edit</button>
|
||||
@endcan
|
||||
@can('delete', $menus['roleprivileges.index'])
|
||||
<button class="btn btn-sm btn-bold btn-danger" onclick="deleteRole({{$role->id}}, '{{$role->name}}')">Hapus</button>
|
||||
<button class="btn btn-sm btn-bold btn-danger mr-2" onclick="deleteRole({{$role->id}}, '{{$role->name}}')">Hapus</button>
|
||||
@endcan
|
||||
@can('create', $menus['roleprivileges.index'])
|
||||
<button class="btn btn-sm btn-bold btn-success" onclick="assignDealer({{$role->id}})"> Tambah Dealer</button>
|
||||
@endcan
|
||||
</div>
|
||||
</td>
|
||||
@@ -183,6 +201,141 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="assignDealerModal" tabindex="-1" role="dialog" aria-labelledby="assignDealerModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg" role="document">
|
||||
<form id="assignDealerForm" method="POST">
|
||||
@csrf
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="assignDealerModalLabel">
|
||||
Assign Dealer ke Role
|
||||
</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="alert alert-light border">
|
||||
<strong>Petunjuk:</strong> Pilih dealer yang akan di-assign ke role ini. Dealer yang sudah di-assign akan otomatis tercentang.
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="font-weight-bold">
|
||||
Daftar Dealer
|
||||
</label>
|
||||
<div class="dealer-checkboxes border rounded p-3" style="max-height: 350px; overflow-y: auto;">
|
||||
<div class="row">
|
||||
@foreach ($dealers as $dealer)
|
||||
<div class="col-md-6 mb-2">
|
||||
<div class="form-check custom-checkbox">
|
||||
<input class="form-check-input dealer-checkbox" type="checkbox"
|
||||
name="dealers[]" value="{{ $dealer->id }}"
|
||||
id="dealer_{{ $dealer->id }}">
|
||||
<label class="form-check-label d-flex align-items-center" for="dealer_{{ $dealer->id }}">
|
||||
<div class="dealer-info">
|
||||
<div class="dealer-name font-weight-semibold">{{ $dealer->name }}</div>
|
||||
<div class="dealer-code text-muted small">
|
||||
<i class="fas fa-tag mr-1"></i>
|
||||
{{ $dealer->dealer_code }}
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-0">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<button type="button" class="btn btn-outline-primary btn-sm mr-2" onclick="selectAllDealers()">
|
||||
Pilih Semua
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="deselectAllDealers()">
|
||||
Hapus Semua
|
||||
</button>
|
||||
</div>
|
||||
<div class="text-muted small">
|
||||
<span id="selectedCount">0</span> dealer dipilih
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">
|
||||
Batal
|
||||
</button>
|
||||
<button type="submit" class="btn btn-primary" id="submitBtn">
|
||||
Simpan Perubahan
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('styles')
|
||||
<style>
|
||||
.custom-checkbox .form-check-label {
|
||||
cursor: pointer;
|
||||
padding: 0.5rem;
|
||||
border-radius: 0.25rem;
|
||||
transition: background-color 0.2s ease;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.custom-checkbox .form-check-label:hover {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.custom-checkbox .form-check-input:checked + .form-check-label {
|
||||
background-color: #e8f5e8;
|
||||
border-left: 3px solid #28a745;
|
||||
}
|
||||
|
||||
.dealer-info {
|
||||
flex: 1;
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
|
||||
.dealer-name {
|
||||
font-weight: 500;
|
||||
margin-bottom: 0.125rem;
|
||||
}
|
||||
|
||||
.dealer-code {
|
||||
font-size: 0.75rem;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.dealer-checkboxes::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
.dealer-checkboxes::-webkit-scrollbar-track {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
|
||||
.dealer-checkboxes::-webkit-scrollbar-thumb {
|
||||
background: #c1c1c1;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.dealer-checkboxes::-webkit-scrollbar-thumb:hover {
|
||||
background: #a8a8a8;
|
||||
}
|
||||
|
||||
/* Responsive improvements */
|
||||
@media (max-width: 768px) {
|
||||
.dealer-checkboxes .col-md-6 {
|
||||
flex: 0 0 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@endsection
|
||||
|
||||
@section('javascripts')
|
||||
@@ -296,17 +449,145 @@
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function assignDealer(roleId) {
|
||||
// Set form action
|
||||
let url = '{{ route("roleprivileges.assignDealer", ":id") }}'.replace(':id', roleId);
|
||||
$("#assignDealerForm").attr("action", url);
|
||||
|
||||
// Reset checkboxes and counter
|
||||
$('.dealer-checkbox').prop('checked', false);
|
||||
updateSelectedCount();
|
||||
|
||||
// Load existing assigned dealers
|
||||
$.ajax({
|
||||
url: '{{ route("roleprivileges.getAssignedDealers", ":id") }}'.replace(':id', roleId),
|
||||
type: 'GET',
|
||||
success: function(response) {
|
||||
if (response.assignedDealers) {
|
||||
response.assignedDealers.forEach(function(dealerId) {
|
||||
$(`#dealer_${dealerId}`).prop('checked', true);
|
||||
});
|
||||
}
|
||||
updateSelectedCount();
|
||||
},
|
||||
error: function() {
|
||||
console.log('Error loading assigned dealers');
|
||||
updateSelectedCount();
|
||||
}
|
||||
});
|
||||
|
||||
$("#assignDealerModal").modal("show");
|
||||
}
|
||||
|
||||
function selectAllDealers() {
|
||||
$('.dealer-checkbox').prop('checked', true);
|
||||
updateSelectedCount();
|
||||
}
|
||||
|
||||
function deselectAllDealers() {
|
||||
$('.dealer-checkbox').prop('checked', false);
|
||||
updateSelectedCount();
|
||||
}
|
||||
|
||||
function updateSelectedCount() {
|
||||
const selectedCount = $('.dealer-checkbox:checked').length;
|
||||
$('#selectedCount').text(selectedCount);
|
||||
|
||||
// Update submit button state
|
||||
if (selectedCount > 0) {
|
||||
$('#submitBtn').prop('disabled', false).removeClass('btn-secondary').addClass('btn-primary');
|
||||
} else {
|
||||
$('#submitBtn').prop('disabled', true).removeClass('btn-primary').addClass('btn-secondary');
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
// Add event handlers for modal close buttons
|
||||
$('.close, [data-dismiss="modal"]').on("click", function () {
|
||||
$("#roleModal").modal("hide");
|
||||
$("#roleEditModal").modal("hide");
|
||||
$("#assignDealerModal").modal("hide");
|
||||
});
|
||||
|
||||
// Also handle the "Close" button
|
||||
$('.btn-secondary[data-dismiss="modal"]').on("click", function () {
|
||||
$("#roleModal").modal("hide");
|
||||
$("#roleEditModal").modal("hide");
|
||||
$("#assignDealerModal").modal("hide");
|
||||
});
|
||||
|
||||
// Event listener for dealer checkboxes
|
||||
$(document).on('change', '.dealer-checkbox', function() {
|
||||
updateSelectedCount();
|
||||
});
|
||||
|
||||
// Handle form submission for assign dealer
|
||||
$("#assignDealerForm").on("submit", function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// Validate if at least one dealer is selected
|
||||
const selectedDealers = $('.dealer-checkbox:checked').length;
|
||||
if (selectedDealers === 0) {
|
||||
Swal.fire({
|
||||
title: 'Peringatan!',
|
||||
text: 'Silakan pilih minimal satu dealer',
|
||||
icon: 'warning',
|
||||
confirmButtonText: 'OK'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable submit button and show loading
|
||||
const submitBtn = $('#submitBtn');
|
||||
const originalText = submitBtn.html();
|
||||
submitBtn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin mr-1"></i>Menyimpan...');
|
||||
|
||||
let formData = new FormData(this);
|
||||
let url = $(this).attr("action");
|
||||
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'POST',
|
||||
data: formData,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success: function(response) {
|
||||
if (response.success) {
|
||||
Swal.fire({
|
||||
title: 'Berhasil!',
|
||||
text: response.message,
|
||||
icon: 'success',
|
||||
confirmButtonText: 'OK'
|
||||
}).then(() => {
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: 'Error!',
|
||||
text: response.message || 'Terjadi kesalahan',
|
||||
icon: 'error',
|
||||
confirmButtonText: 'OK'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr) {
|
||||
let message = 'Terjadi kesalahan';
|
||||
if (xhr.responseJSON && xhr.responseJSON.message) {
|
||||
message = xhr.responseJSON.message;
|
||||
}
|
||||
Swal.fire({
|
||||
title: 'Error!',
|
||||
text: message,
|
||||
icon: 'error',
|
||||
confirmButtonText: 'OK'
|
||||
});
|
||||
},
|
||||
complete: function() {
|
||||
// Re-enable submit button
|
||||
submitBtn.prop('disabled', false).html(originalText);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -153,7 +153,7 @@
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-12">
|
||||
<small class="form-text text-muted" id="default-dealer-info">Pilih dealer untuk memfilter data atau biarkan "Semua Dealer" untuk melihat data lengkap.</small>
|
||||
<small class="form-text text-muted" id="default-dealer-info">Filter diset ke "Semua Dealer" untuk melihat data lengkap. Pilih dealer untuk memfilter data.</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -283,14 +283,45 @@ $(document).ready(function() {
|
||||
// Initialize Select2 after populating options
|
||||
initializeSelect2();
|
||||
|
||||
// Default ke "Semua Dealer" (tidak ada dealer yang terselect)
|
||||
console.log('Default set to "Semua Dealer"');
|
||||
$('#default-dealer-info').text('Pilih dealer untuk memfilter data atau biarkan "Semua Dealer" untuk melihat data lengkap.');
|
||||
// Set default dealer if provided
|
||||
if (response.default_dealer && response.data.length > 0) {
|
||||
// Don't set default dealer - always show "Semua Dealer" on initial load
|
||||
$('#default-dealer-info').text('Filter diset ke "Semua Dealer" untuk melihat data lengkap. Pilih dealer untuk memfilter data.');
|
||||
|
||||
// Load initial data without dealer filter (show all dealers)
|
||||
if (!isInitialized) {
|
||||
console.log('Default dealer available but loading with "Semua Dealer" filter');
|
||||
loadInitialMechanics();
|
||||
}
|
||||
} else if (response.default_dealer === null && response.data.length > 0) {
|
||||
// Admin without default dealer - show all dealers without selection
|
||||
$('#default-dealer-info').text('Filter diset ke "Semua Dealer" untuk melihat data lengkap. Pilih dealer untuk memfilter data.');
|
||||
|
||||
// Load initial data without dealer filter
|
||||
if (!isInitialized) {
|
||||
console.log('Admin without default dealer, loading initial data');
|
||||
loadInitialMechanics();
|
||||
}
|
||||
} else if (response.data.length > 0) {
|
||||
$('#default-dealer-info').text('Filter diset ke "Semua Dealer" untuk melihat data lengkap. Pilih dealer untuk memfilter data.');
|
||||
|
||||
// Load initial data without dealer filter
|
||||
if (!isInitialized) {
|
||||
console.log('No default dealer, loading initial data');
|
||||
loadInitialMechanics();
|
||||
}
|
||||
} else {
|
||||
// No dealers available
|
||||
$('#default-dealer-info').text('Tidak ada dealer yang tersedia untuk Anda.');
|
||||
hideLoadingOverlay();
|
||||
}
|
||||
|
||||
// Load initial mechanics and then initialize DataTable
|
||||
if (!isInitialized) {
|
||||
console.log('Dealers loaded, loading initial mechanics...');
|
||||
loadInitialMechanics();
|
||||
// Check if user has access to any dealers
|
||||
if (response.data.length === 0) {
|
||||
toastr.warning('Anda tidak memiliki akses ke dealer manapun. Silakan hubungi administrator.');
|
||||
$('#default-dealer-info').text('Anda tidak memiliki akses ke dealer manapun.');
|
||||
hideLoadingOverlay();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
toastr.error('Gagal memuat data dealer');
|
||||
@@ -304,14 +335,14 @@ $(document).ready(function() {
|
||||
});
|
||||
}
|
||||
|
||||
function loadInitialMechanics() {
|
||||
// Get initial filter values (empty dealer, default dates)
|
||||
let dealerId = '';
|
||||
function loadDataWithDealer(dealerId) {
|
||||
// Show loading overlay
|
||||
showLoadingOverlay("Memuat data laporan teknisi...");
|
||||
|
||||
const startDate = $('#filter-start-date').val();
|
||||
const endDate = $('#filter-end-date').val();
|
||||
|
||||
// Show loading overlay
|
||||
showLoadingOverlay("Memuat data laporan teknisi...");
|
||||
console.log('Loading data with dealer:', dealerId, 'date range:', { startDate, endDate });
|
||||
|
||||
// Get mechanics first, then initialize DataTable
|
||||
$.ajax({
|
||||
@@ -319,9 +350,21 @@ $(document).ready(function() {
|
||||
type: 'GET',
|
||||
data: { dealer_id: dealerId, start_date: startDate, end_date: endDate },
|
||||
success: function(response) {
|
||||
console.log('Data response:', response);
|
||||
|
||||
if (response.status === 'success' && Array.isArray(response.mechanics)) {
|
||||
mechanics = response.mechanics;
|
||||
console.log('Initial mechanics loaded:', mechanics.length);
|
||||
console.log('Data loaded with dealer:', dealerId, 'mechanics:', mechanics.length);
|
||||
|
||||
// Check if user has access to any data
|
||||
if (response.data.length === 0 && response.mechanics.length === 0) {
|
||||
console.log('No data available for dealer:', dealerId);
|
||||
toastr.info('Tidak ada data yang tersedia untuk dealer yang dipilih. Silakan pilih dealer lain.');
|
||||
$('#default-dealer-info').text('Tidak ada data yang tersedia untuk dealer yang dipilih.');
|
||||
hideLoadingOverlay();
|
||||
return;
|
||||
}
|
||||
|
||||
// Now initialize DataTable with mechanics ready
|
||||
updateTableStructureWithMechanics();
|
||||
isInitialized = true;
|
||||
@@ -332,7 +375,70 @@ $(document).ready(function() {
|
||||
isInitialized = true;
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
error: function(xhr, status, error) {
|
||||
console.error('Error loading data with dealer:', error);
|
||||
console.error('Response:', xhr.responseText);
|
||||
|
||||
toastr.error('Gagal memuat data untuk dealer yang dipilih. Silakan coba lagi.');
|
||||
hideLoadingOverlay();
|
||||
|
||||
// Don't try fallback to avoid multiple notifications
|
||||
mechanics = [];
|
||||
updateTableStructureWithMechanics();
|
||||
isInitialized = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadInitialMechanics() {
|
||||
// Get initial filter values (empty dealer, default dates)
|
||||
let dealerId = '';
|
||||
const startDate = $('#filter-start-date').val();
|
||||
const endDate = $('#filter-end-date').val();
|
||||
|
||||
console.log('Loading initial mechanics without dealer filter, date range:', { startDate, endDate });
|
||||
|
||||
// Show loading overlay
|
||||
showLoadingOverlay("Memuat data laporan teknisi...");
|
||||
|
||||
// Get mechanics first, then initialize DataTable
|
||||
$.ajax({
|
||||
url: '{{ route("reports.technician.data") }}',
|
||||
type: 'GET',
|
||||
data: { dealer_id: dealerId, start_date: startDate, end_date: endDate },
|
||||
success: function(response) {
|
||||
console.log('Initial data response:', response);
|
||||
|
||||
if (response.status === 'success' && Array.isArray(response.mechanics)) {
|
||||
mechanics = response.mechanics;
|
||||
console.log('Initial mechanics loaded:', mechanics.length);
|
||||
|
||||
// Check if user has access to any data
|
||||
if (response.data.length === 0 && response.mechanics.length === 0) {
|
||||
console.log('No data available without dealer filter');
|
||||
// Don't show notification for initial load without dealer filter
|
||||
$('#default-dealer-info').text('Tidak ada data yang tersedia. Silakan pilih dealer untuk memfilter data.');
|
||||
hideLoadingOverlay();
|
||||
return;
|
||||
}
|
||||
|
||||
// Now initialize DataTable with mechanics ready
|
||||
updateTableStructureWithMechanics();
|
||||
isInitialized = true;
|
||||
} else {
|
||||
console.warn('Invalid mechanics data, using fallback');
|
||||
mechanics = [];
|
||||
updateTableStructureWithMechanics();
|
||||
isInitialized = true;
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error('Error loading initial mechanics:', error);
|
||||
console.error('Response:', xhr.responseText);
|
||||
|
||||
toastr.error('Gagal memuat data laporan teknisi. Silakan coba lagi.');
|
||||
hideLoadingOverlay();
|
||||
|
||||
console.warn('Error loading initial mechanics, using fallback');
|
||||
mechanics = [];
|
||||
updateTableStructureWithMechanics();
|
||||
@@ -382,6 +488,12 @@ $(document).ready(function() {
|
||||
mechanics = [];
|
||||
}
|
||||
|
||||
// Check if user has access to any data
|
||||
if (response.data.length === 0 && response.mechanics.length === 0) {
|
||||
toastr.info('Tidak ada data yang tersedia untuk filter yang dipilih atau Anda tidak memiliki akses ke data tersebut.');
|
||||
$('#default-dealer-info').text('Tidak ada data yang tersedia untuk filter yang dipilih.');
|
||||
}
|
||||
|
||||
} else {
|
||||
console.error('Server returned error status:', response);
|
||||
toastr.error('Gagal memuat data laporan teknisi');
|
||||
@@ -401,7 +513,7 @@ $(document).ready(function() {
|
||||
} else if (xhr.status === 404) {
|
||||
errorMessage = 'Endpoint tidak ditemukan';
|
||||
} else if (xhr.status === 403) {
|
||||
errorMessage = 'Akses ditolak';
|
||||
errorMessage = 'Akses ditolak - Anda tidak memiliki izin untuk mengakses data ini';
|
||||
}
|
||||
|
||||
toastr.error(errorMessage);
|
||||
@@ -500,6 +612,13 @@ $(document).ready(function() {
|
||||
dataSrc: function(json) {
|
||||
console.log('DataTable response:', json);
|
||||
|
||||
// Check for error response
|
||||
if (json.error) {
|
||||
console.error('DataTable error:', json.error);
|
||||
toastr.error('Error loading data: ' + json.error);
|
||||
return [];
|
||||
}
|
||||
|
||||
// Update mechanics from response
|
||||
if (json.mechanics && Array.isArray(json.mechanics)) {
|
||||
mechanics = json.mechanics;
|
||||
@@ -512,6 +631,27 @@ $(document).ready(function() {
|
||||
}
|
||||
|
||||
return json.data || [];
|
||||
},
|
||||
error: function(xhr, error, thrown) {
|
||||
console.error('DataTable AJAX error:', {
|
||||
xhr: xhr,
|
||||
error: error,
|
||||
thrown: thrown
|
||||
});
|
||||
|
||||
let errorMessage = 'Gagal memuat data';
|
||||
if (xhr.responseJSON && xhr.responseJSON.error) {
|
||||
errorMessage = xhr.responseJSON.error;
|
||||
} else if (xhr.status === 500) {
|
||||
errorMessage = 'Server error: ' + (xhr.responseText || 'Unknown error');
|
||||
} else if (xhr.status === 404) {
|
||||
errorMessage = 'Endpoint tidak ditemukan';
|
||||
} else if (xhr.status === 403) {
|
||||
errorMessage = 'Akses ditolak';
|
||||
}
|
||||
|
||||
toastr.error(errorMessage);
|
||||
hideLoadingOverlay();
|
||||
}
|
||||
},
|
||||
columns: [
|
||||
@@ -754,12 +894,40 @@ $(document).ready(function() {
|
||||
dataSrc: function(json) {
|
||||
console.log('DataTable response:', json);
|
||||
|
||||
// Check for error response
|
||||
if (json.error) {
|
||||
console.error('DataTable error:', json.error);
|
||||
toastr.error('Error loading data: ' + json.error);
|
||||
return [];
|
||||
}
|
||||
|
||||
// Don't update mechanics from datatable response - use existing mechanics
|
||||
// if (json.mechanics && Array.isArray(json.mechanics)) {
|
||||
// mechanics = json.mechanics;
|
||||
// }
|
||||
|
||||
return json.data || [];
|
||||
},
|
||||
error: function(xhr, error, thrown) {
|
||||
console.error('DataTable AJAX error:', {
|
||||
xhr: xhr,
|
||||
error: error,
|
||||
thrown: thrown
|
||||
});
|
||||
|
||||
let errorMessage = 'Gagal memuat data';
|
||||
if (xhr.responseJSON && xhr.responseJSON.error) {
|
||||
errorMessage = xhr.responseJSON.error;
|
||||
} else if (xhr.status === 500) {
|
||||
errorMessage = 'Server error: ' + (xhr.responseText || 'Unknown error');
|
||||
} else if (xhr.status === 404) {
|
||||
errorMessage = 'Endpoint tidak ditemukan';
|
||||
} else if (xhr.status === 403) {
|
||||
errorMessage = 'Akses ditolak';
|
||||
}
|
||||
|
||||
toastr.error(errorMessage);
|
||||
hideLoadingOverlay();
|
||||
}
|
||||
},
|
||||
columns: columns,
|
||||
@@ -1105,7 +1273,7 @@ $(document).ready(function() {
|
||||
$('#btn-reset').on('click', function() {
|
||||
console.log('Reset button clicked');
|
||||
|
||||
// Reset dealer selection
|
||||
// Reset dealer selection to "Semua Dealer"
|
||||
if (typeof $.fn.select2 !== 'undefined' && $('#filter-dealer').data('select2')) {
|
||||
$('#filter-dealer').val('').trigger('change');
|
||||
} else {
|
||||
@@ -1116,7 +1284,7 @@ $(document).ready(function() {
|
||||
$('#filter-start-date').val('{{ date('Y-m-d', strtotime('-30 days')) }}');
|
||||
$('#filter-end-date').val('{{ date('Y-m-d') }}');
|
||||
|
||||
console.log('Filters reset, reloading DataTable...');
|
||||
console.log('Filters reset to "Semua Dealer", reloading DataTable...');
|
||||
|
||||
// Reset initialization flag
|
||||
isInitialized = false;
|
||||
|
||||
Reference in New Issue
Block a user