feat: 支持账单编辑(PATCH /api/bills/:id)
This commit is contained in:
@@ -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}>
|
||||
|
||||
Reference in New Issue
Block a user