fix collapse menu
This commit is contained in:
@@ -23,10 +23,19 @@
|
||||
availableYears.push(currentYear - i);
|
||||
}
|
||||
|
||||
let initialLoadDone = false;
|
||||
|
||||
onMount(async () => {
|
||||
await loadFuelData();
|
||||
initialLoadDone = true;
|
||||
});
|
||||
|
||||
// Watch for year changes and reload data
|
||||
$: if (initialLoadDone && selectedYear) {
|
||||
loadFuelData();
|
||||
expandedMonths = new Set();
|
||||
}
|
||||
|
||||
async function loadFuelData() {
|
||||
if (!user) {
|
||||
error = 'Kullanıcı bilgisi bulunamadı.';
|
||||
@@ -38,10 +47,6 @@
|
||||
error = '';
|
||||
|
||||
try {
|
||||
// Get approved fuel slips for this goods manager for the selected year
|
||||
const startDate = `${selectedYear}-01-01`;
|
||||
const endDate = `${selectedYear}-12-31`;
|
||||
|
||||
const url = `/api/fuel-slips?manager_id=${user.id}&status=approved`;
|
||||
const response = await fetch(url);
|
||||
|
||||
@@ -55,15 +60,12 @@
|
||||
const slipDate = new Date(slip.date);
|
||||
return slipDate.getFullYear() === selectedYear;
|
||||
})
|
||||
.sort((a, b) => new Date(b.date) - new Date(a.date)); // Sort by date descending
|
||||
|
||||
console.log(`✅ Loaded ${fuelData.length} fuel slips for year ${selectedYear}`);
|
||||
.sort((a, b) => new Date(b.date) - new Date(a.date));
|
||||
} else {
|
||||
error = 'Yakıt verileri yüklenemedi.';
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Load fuel data error:', err);
|
||||
error = 'Bağlantı hatası.';
|
||||
error = `Bağlantı hatası: ${err.message}`;
|
||||
} finally {
|
||||
loading = false;
|
||||
}
|
||||
@@ -75,7 +77,7 @@
|
||||
} else {
|
||||
expandedMonths.add(monthIndex);
|
||||
}
|
||||
expandedMonths = expandedMonths; // Trigger reactivity
|
||||
expandedMonths = expandedMonths;
|
||||
}
|
||||
|
||||
function getMonthData(monthIndex) {
|
||||
@@ -114,13 +116,34 @@
|
||||
return getMonthData(monthIndex).length;
|
||||
}
|
||||
|
||||
$: monthlyData = Array.from({length: 12}, (_, i) => ({
|
||||
month: i,
|
||||
data: getMonthData(i),
|
||||
total: getMonthTotal(i),
|
||||
count: getSlipCount(i),
|
||||
isExpanded: expandedMonths.has(i)
|
||||
}));
|
||||
function getMonthDataSummary() {
|
||||
const months = ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'];
|
||||
return months.map((month, index) => ({
|
||||
month,
|
||||
count: getSlipCount(index),
|
||||
total: getMonthTotal(index)
|
||||
})).filter(m => m.count > 0);
|
||||
}
|
||||
|
||||
// Reactive statement that rebuilds when fuelData or expandedMonths changes
|
||||
$: monthlyData = (() => {
|
||||
const months = [];
|
||||
|
||||
// Show all 12 months for the selected year
|
||||
for (let i = 11; i >= 0; i--) {
|
||||
const data = getMonthData(i);
|
||||
const monthData = {
|
||||
month: i,
|
||||
data: data,
|
||||
total: getMonthTotal(i),
|
||||
count: data.length,
|
||||
isExpanded: expandedMonths.has(i)
|
||||
};
|
||||
months.push(monthData);
|
||||
}
|
||||
|
||||
return months;
|
||||
})();
|
||||
</script>
|
||||
|
||||
<div class="monthly-fuel-report">
|
||||
@@ -171,68 +194,66 @@
|
||||
<!-- Monthly Accordion -->
|
||||
<div class="months-container">
|
||||
{#each monthlyData as month (month.month)}
|
||||
{#if !isMonthInFuture(month.month)}
|
||||
<div class="month-card">
|
||||
<div
|
||||
class="month-header"
|
||||
class:has-data={month.count > 0}
|
||||
class:expanded={month.isExpanded}
|
||||
on:click={() => toggleMonth(month.month)}
|
||||
>
|
||||
<div class="month-info">
|
||||
<h3 class="month-name">
|
||||
{turkishMonths[month.month]} {selectedYear}
|
||||
</h3>
|
||||
{#if month.count > 0}
|
||||
<div class="month-stats">
|
||||
<span class="stat-badge">{month.count} Fiş</span>
|
||||
<span class="stat-badge">{formatLiters(month.total)}L</span>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="month-stats">
|
||||
<span class="stat-badge empty">Veri Yok</span>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="expand-icon">
|
||||
<i class="fa-solid fa-chevron-{month.isExpanded ? 'up' : 'down'}"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if month.isExpanded && month.count > 0}
|
||||
<div class="month-content">
|
||||
<div class="fuel-table-container">
|
||||
<table class="fuel-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>S.No</th>
|
||||
<th>Araç Plakası</th>
|
||||
<th>Tarih</th>
|
||||
<th>Yakıt Cinsi</th>
|
||||
<th>Miktar</th>
|
||||
<th>Teslim Alan</th>
|
||||
<th>Teslim Eden</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#each month.data.sort((a, b) => new Date(a.date) - new Date(b.date)) as slip, index}
|
||||
<tr>
|
||||
<td>{index + 1}</td>
|
||||
<td class="plate-cell">{slip.vehicle_info?.plate || '-'}</td>
|
||||
<td>{formatDate(slip.date)}</td>
|
||||
<td>{getFuelTypeLabel(slip.fuel_type)}</td>
|
||||
<td class="quantity-cell">{formatLiters(slip.liters)}</td>
|
||||
<td>{slip.personnel_info?.rank} {slip.personnel_info?.full_name || '-'}</td>
|
||||
<td>{slip.fuel_manager_info?.full_name || '-'}</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="month-card">
|
||||
<div
|
||||
class="month-header"
|
||||
class:has-data={month.count > 0}
|
||||
class:expanded={month.isExpanded}
|
||||
on:click={() => toggleMonth(month.month)}
|
||||
>
|
||||
<div class="month-info">
|
||||
<h3 class="month-name">
|
||||
{turkishMonths[month.month]} {selectedYear}
|
||||
</h3>
|
||||
{#if month.count > 0}
|
||||
<div class="month-stats">
|
||||
<span class="stat-badge">{month.count} Fiş</span>
|
||||
<span class="stat-badge">{formatLiters(month.total)}L</span>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<div class="month-stats">
|
||||
<span class="stat-badge empty">Veri Yok</span>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="expand-icon">
|
||||
<i class="fa-solid fa-chevron-{month.isExpanded ? 'up' : 'down'}"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if month.isExpanded && month.count > 0}
|
||||
<div class="month-content">
|
||||
<div class="fuel-table-container">
|
||||
<table class="fuel-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>S.No</th>
|
||||
<th>Araç Plakası</th>
|
||||
<th>Tarih</th>
|
||||
<th>Yakıt Cinsi</th>
|
||||
<th>Miktar</th>
|
||||
<th>Teslim Alan</th>
|
||||
<th>Teslim Eden</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#each month.data.sort((a, b) => new Date(a.date) - new Date(b.date)) as slip, index}
|
||||
<tr>
|
||||
<td>{index + 1}</td>
|
||||
<td class="plate-cell">{slip.vehicle_info?.plate || '-'}</td>
|
||||
<td>{formatDate(slip.date)}</td>
|
||||
<td>{getFuelTypeLabel(slip.fuel_type)}</td>
|
||||
<td class="quantity-cell">{formatLiters(slip.liters)}</td>
|
||||
<td>{slip.personnel_info?.rank} {slip.personnel_info?.full_name || '-'}</td>
|
||||
<td>{slip.fuel_manager_info?.full_name || '-'}</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
@@ -350,8 +371,9 @@
|
||||
gap: 2rem;
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
color: white;
|
||||
background: #E0E7FF;
|
||||
color: #4338CA;
|
||||
border: 1px solid #C7D2FE;
|
||||
}
|
||||
|
||||
.summary-item {
|
||||
|
||||
@@ -16,6 +16,7 @@ export async function GET({ request, url }) {
|
||||
const status = searchParams.get('status');
|
||||
const manager_id = searchParams.get('manager_id');
|
||||
const fuel_manager_id = searchParams.get('fuel_manager_id');
|
||||
|
||||
|
||||
return new Promise((resolve) => {
|
||||
const db = getDatabase();
|
||||
@@ -41,9 +42,14 @@ export async function GET({ request, url }) {
|
||||
params.push(fuel_manager_id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Tarihe göre ters sırala
|
||||
query += ' ORDER BY created_at DESC';
|
||||
|
||||
console.log(`🔍 API Query: ${query}`);
|
||||
console.log(`📋 API Parameters:`, params);
|
||||
|
||||
db.all(query, params, (err, rows) => {
|
||||
db.close();
|
||||
|
||||
@@ -53,6 +59,8 @@ export async function GET({ request, url }) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`📊 Database returned ${rows.length} rows`);
|
||||
|
||||
// JSON string olarak saklanan alanları parse et
|
||||
const fuelSlips = rows.map(row => ({
|
||||
...row,
|
||||
@@ -62,6 +70,16 @@ export async function GET({ request, url }) {
|
||||
fuel_manager_info: row.fuel_manager_info ? JSON.parse(row.fuel_manager_info) : null
|
||||
}));
|
||||
|
||||
console.log(`✅ Processed ${fuelSlips.length} fuel slips for API response`);
|
||||
console.log(`📋 Fuel slips summary:`, fuelSlips.map(s => ({
|
||||
id: s.id,
|
||||
date: s.date,
|
||||
goods_manager_id: s.goods_manager_id,
|
||||
status: s.status,
|
||||
liters: s.liters,
|
||||
vehicle: s.vehicle_info?.plate
|
||||
})));
|
||||
|
||||
resolve(json({ fuelSlips }));
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user