From 8ecb5b79eb8b42a7549adc16e8c4c55df69c264d Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Tue, 8 Apr 2025 23:01:43 +0200 Subject: [PATCH] Can change default account --- moneymgr_web/src/api/AccountApi.ts | 11 +++++ .../src/hooks/AccountsListProvider.tsx | 6 ++- moneymgr_web/src/routes/AccountsRoute.tsx | 41 +++++++++++++++++-- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/moneymgr_web/src/api/AccountApi.ts b/moneymgr_web/src/api/AccountApi.ts index e5501e3..eeaa2b6 100644 --- a/moneymgr_web/src/api/AccountApi.ts +++ b/moneymgr_web/src/api/AccountApi.ts @@ -14,6 +14,7 @@ export class AccountsList { constructor(list: Account[]) { this.list = list; + this.list.sort((a, b) => a.id - b.id); } /** @@ -38,4 +39,14 @@ export class AccountApi { return new AccountsList(array); } + + /** + * Set default account + */ + static async SetDefaultAccount(account: Account): Promise { + await APIClient.exec({ + uri: `/account/${account.id}/default`, + method: "PUT", + }); + } } diff --git a/moneymgr_web/src/hooks/AccountsListProvider.tsx b/moneymgr_web/src/hooks/AccountsListProvider.tsx index a01d15a..d01fef5 100644 --- a/moneymgr_web/src/hooks/AccountsListProvider.tsx +++ b/moneymgr_web/src/hooks/AccountsListProvider.tsx @@ -4,7 +4,7 @@ import { AsyncWidget } from "../widgets/AsyncWidget"; interface AccountContext { list: AccountsList; - reload: () => void; + reload: () => Promise; get(id: number): Account | null; } @@ -24,9 +24,10 @@ export function AccountsListProvider( }; const onReload = async () => { - loadKey.current += 1; setList(null); + loadKey.current += 1; + return new Promise((res) => { loadPromise.current = () => { res(); @@ -36,6 +37,7 @@ export function AccountsListProvider( return ( { + try { + snackbar("Default account successfully updated!"); + + AccountApi.SetDefaultAccount(account); + + await accounts.reload(); + + return accounts.get(account.id); + } catch (e) { + console.error("Failed to change default account!", e); + alert(`Failed to change default account! ${e}`); + return account; + } + }; + const columns: GridColDef<(typeof list)[number]>[] = [ { field: "id", headerName: "ID", flex: 1 }, { field: "name", headerName: "Name", flex: 6 }, @@ -36,6 +57,7 @@ export function AccountsRoute(): React.ReactElement { headerName: "Default", flex: 1, type: "boolean", + editable: true, }, ]; @@ -57,7 +79,18 @@ export function AccountsRoute(): React.ReactElement { } > - + + rows={list} + columns={columns} + disableRowSelectionOnClick + processRowUpdate={(updated, original) => { + if (updated.default_account && !original.default_account) { + return setDefaultAccount(updated); + } + + return original as any; + }} + /> ); }