fix: 404 при обновлении, стрелки периода, фильтры в URL, авто-категории и очистка истории

- Nginx: проксирование /api на backend (единая точка входа)
- История: стрелки ← → для переключения недель/месяцев/годов
- История: сохранение фильтров и пагинации в URL при F5
- Импорт: миграция 003 — дефолтные правила категорий (PYATEROCHK, AUCHAN и др.)
- Настройки: вкладка «Данные» с кнопкой «Очистить историю»
- Backend: DELETE /api/transactions для удаления всех транзакций
- ClearHistoryModal: подтверждение чекбоксами и вводом «УДАЛИТЬ»
This commit is contained in:
vakabunga
2026-03-10 06:53:56 +03:00
parent 792b4ca4ad
commit a895bb4b2f
23 changed files with 691 additions and 52 deletions

View File

@@ -26,8 +26,16 @@ async function request<T>(url: string, options: RequestInit = {}): Promise<T> {
});
if (res.status === 401) {
onUnauthorized?.();
throw new ApiException(401, { error: 'UNAUTHORIZED', message: 'Сессия истекла' });
let body: ApiError;
try {
body = await res.json();
} catch {
body = { error: 'UNAUTHORIZED', message: 'Сессия истекла' };
}
if (!url.includes('/api/auth/login')) {
onUnauthorized?.();
}
throw new ApiException(401, body);
}
if (!res.ok) {
@@ -59,4 +67,7 @@ export const api = {
patch: <T>(url: string, body: unknown) =>
request<T>(url, { method: 'PATCH', body: JSON.stringify(body) }),
delete: <T>(url: string) =>
request<T>(url, { method: 'DELETE' }),
};

View File

@@ -25,3 +25,7 @@ export async function updateTransaction(
): Promise<Transaction> {
return api.put<Transaction>(`/api/transactions/${id}`, data);
}
export async function clearAllTransactions(): Promise<{ deleted: number }> {
return api.delete<{ deleted: number }>('/api/transactions');
}