feat: add free-form tags on transactions

Third of the four ideas picked from the Maybe/Sure feature audit. Tags are
orthogonal to categories (category = what kind of spend, tag = which
event/project) — many-to-many, created inline while typing in the
transaction form, filterable from the Transactions page.

Also adds tests/test_backup.py, the first test coverage the backup
export/import path has ever had, and fixes a MissingGreenlet bug it
surfaced in restore_backup's tag-wiring.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
ZProger
2026-08-25 02:38:04 +03:00
parent 09a0e383e0
commit 94782ee073
24 changed files with 585 additions and 10 deletions

14
frontend/src/api/tags.ts Normal file
View File

@@ -0,0 +1,14 @@
import { api } from "@/api/client";
import type { Tag } from "@/types";
export function fetchTags() {
return api.get<Tag[]>("/tags");
}
export function createTag(name: string) {
return api.post<Tag>("/tags", { name });
}
export function deleteTag(id: number) {
return api.delete<void>(`/tags/${id}`);
}

View File

@@ -10,6 +10,7 @@ export interface TransactionFilters {
end_date?: string;
account_id?: number;
category_id?: number;
tag_id?: number;
type?: string;
search?: string;
sort?: TransactionSort;