mirror of
https://github.com/dat515-2025/Group-8.git
synced 2026-03-22 06:57:47 +01:00
feat(frontend): improved Dashboard.tsx, added transaction date
This commit is contained in:
@@ -16,6 +16,7 @@ export type Transaction = {
|
||||
amount: number;
|
||||
description?: string | null;
|
||||
category_ids: number[];
|
||||
date?: string | null; // ISO date (YYYY-MM-DD)
|
||||
};
|
||||
|
||||
function getBaseUrl() {
|
||||
@@ -84,6 +85,7 @@ export type CreateTransactionInput = {
|
||||
amount: number;
|
||||
description?: string;
|
||||
category_ids?: number[];
|
||||
date?: string; // YYYY-MM-DD
|
||||
};
|
||||
|
||||
export async function createTransaction(input: CreateTransactionInput): Promise<Transaction> {
|
||||
@@ -99,8 +101,13 @@ export async function createTransaction(input: CreateTransactionInput): Promise<
|
||||
return res.json();
|
||||
}
|
||||
|
||||
export async function getTransactions(): Promise<Transaction[]> {
|
||||
const res = await fetch(`${getBaseUrl()}/transactions/`, {
|
||||
export async function getTransactions(start_date?: string, end_date?: string): Promise<Transaction[]> {
|
||||
const params = new URLSearchParams();
|
||||
if (start_date) params.set('start_date', start_date);
|
||||
if (end_date) params.set('end_date', end_date);
|
||||
const qs = params.toString();
|
||||
const url = `${getBaseUrl()}/transactions/${qs ? `?${qs}` : ''}`;
|
||||
const res = await fetch(url, {
|
||||
headers: getHeaders(),
|
||||
});
|
||||
if (!res.ok) throw new Error('Failed to load transactions');
|
||||
@@ -153,3 +160,68 @@ export async function deleteMe(): Promise<void> {
|
||||
export function logout() {
|
||||
localStorage.removeItem('token');
|
||||
}
|
||||
|
||||
// Categories
|
||||
export type CreateCategoryInput = { name: string; description?: string };
|
||||
export async function createCategory(input: CreateCategoryInput): Promise<Category> {
|
||||
const res = await fetch(`${getBaseUrl()}/categories/create`, {
|
||||
method: 'POST',
|
||||
headers: getHeaders(),
|
||||
body: JSON.stringify(input),
|
||||
});
|
||||
if (!res.ok) {
|
||||
const text = await res.text();
|
||||
throw new Error(text || 'Failed to create category');
|
||||
}
|
||||
return res.json();
|
||||
}
|
||||
|
||||
export type UpdateCategoryInput = { name?: string; description?: string };
|
||||
export async function updateCategory(category_id: number, input: UpdateCategoryInput): Promise<Category> {
|
||||
const res = await fetch(`${getBaseUrl()}/categories/${category_id}`, {
|
||||
method: 'PATCH',
|
||||
headers: getHeaders(),
|
||||
body: JSON.stringify(input),
|
||||
});
|
||||
if (!res.ok) {
|
||||
const text = await res.text();
|
||||
throw new Error(text || 'Failed to update category');
|
||||
}
|
||||
return res.json();
|
||||
}
|
||||
|
||||
// Transactions update
|
||||
export type UpdateTransactionInput = {
|
||||
amount?: number;
|
||||
description?: string;
|
||||
date?: string;
|
||||
category_ids?: number[];
|
||||
};
|
||||
export async function updateTransaction(id: number, input: UpdateTransactionInput): Promise<Transaction> {
|
||||
const res = await fetch(`${getBaseUrl()}/transactions/${id}/edit`, {
|
||||
method: 'PATCH',
|
||||
headers: getHeaders(),
|
||||
body: JSON.stringify(input),
|
||||
});
|
||||
if (!res.ok) {
|
||||
const text = await res.text();
|
||||
throw new Error(text || 'Failed to update transaction');
|
||||
}
|
||||
return res.json();
|
||||
}
|
||||
|
||||
// Balance series
|
||||
export type BalancePoint = { date: string; balance: number };
|
||||
export async function getBalanceSeries(start_date?: string, end_date?: string): Promise<BalancePoint[]> {
|
||||
const params = new URLSearchParams();
|
||||
if (start_date) params.set('start_date', start_date);
|
||||
if (end_date) params.set('end_date', end_date);
|
||||
const qs = params.toString();
|
||||
const url = `${getBaseUrl()}/transactions/balance_series${qs ? `?${qs}` : ''}`;
|
||||
const res = await fetch(url, { headers: getHeaders() });
|
||||
if (!res.ok) {
|
||||
const text = await res.text();
|
||||
throw new Error(text || 'Failed to load balance series');
|
||||
}
|
||||
return res.json();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user