feat: 支持账单编辑(PATCH /api/bills/:id)

This commit is contained in:
clz
2026-01-18 20:17:19 +08:00
parent 339b8afe98
commit f5afb0c135
8 changed files with 326 additions and 37 deletions

View File

@@ -15,7 +15,7 @@
import Tag from '@lucide/svelte/icons/tag';
import FileText from '@lucide/svelte/icons/file-text';
import CreditCard from '@lucide/svelte/icons/credit-card';
import type { BillRecord } from '$lib/api';
import { updateBill, type BillRecord } from '$lib/api';
interface Props {
records: BillRecord[];
@@ -29,6 +29,7 @@
let selectedRecord = $state<BillRecord | null>(null);
let selectedRank = $state(0);
let isEditing = $state(false);
let isSaving = $state(false);
// 编辑表单数据
let editForm = $state({
@@ -62,8 +63,11 @@
isEditing = false;
}
function saveEdit() {
async function saveEdit() {
if (!selectedRecord) return;
if (isSaving) return;
isSaving = true;
// 更新记录
const updatedRecord: BillRecord = {
@@ -74,18 +78,42 @@
description: editForm.description,
payment_method: editForm.payment_method
};
// 更新本地数据
const index = records.findIndex(r => r === selectedRecord);
if (index !== -1) {
records[index] = updatedRecord;
try {
const billId = (selectedRecord as unknown as { id?: string }).id;
if (billId) {
const resp = await updateBill(billId, {
merchant: editForm.merchant,
category: editForm.category,
amount: Number(editForm.amount),
description: editForm.description,
pay_method: editForm.payment_method,
});
if (resp.result && resp.data) {
updatedRecord.amount = String(resp.data.amount);
updatedRecord.merchant = resp.data.merchant;
updatedRecord.category = resp.data.category;
updatedRecord.description = resp.data.description || '';
updatedRecord.payment_method = resp.data.pay_method || '';
updatedRecord.time = resp.data.time;
}
}
// 更新本地数据
const index = records.findIndex(r => r === selectedRecord);
if (index !== -1) {
records[index] = updatedRecord;
}
selectedRecord = updatedRecord;
isEditing = false;
// 通知父组件
onUpdate?.(updatedRecord);
} finally {
isSaving = false;
}
selectedRecord = updatedRecord;
isEditing = false;
// 通知父组件
onUpdate?.(updatedRecord);
}
function handleCategoryChange(value: string | undefined) {
@@ -135,7 +163,7 @@
<!-- 账单详情弹窗 -->
<Drawer.Root bind:open={dialogOpen}>
<Drawer.Content class="sm:max-w-[450px]">
<Drawer.Content class="md:max-w-[450px]">
<Drawer.Header>
<Drawer.Title class="flex items-center gap-2">
<Receipt class="h-5 w-5" />
@@ -271,9 +299,9 @@
<X class="h-4 w-4 mr-2" />
取消
</Button>
<Button onclick={saveEdit}>
<Button onclick={saveEdit} disabled={isSaving}>
<Save class="h-4 w-4 mr-2" />
保存
{isSaving ? '保存中…' : '保存'}
</Button>
{:else}
<Button variant="outline" onclick={() => dialogOpen = false}>