fix login auto detect menu link, and partial update tchnician role dealer

This commit is contained in:
2025-07-09 18:32:49 +07:00
parent e468672bbe
commit e59841fd23
14 changed files with 1362 additions and 103 deletions

View File

@@ -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;