Can change default account

This commit is contained in:
Pierre HUBERT 2025-04-08 23:01:43 +02:00
parent 8defd9ad17
commit 8ecb5b79eb
3 changed files with 52 additions and 6 deletions

View File

@ -14,6 +14,7 @@ export class AccountsList {
constructor(list: Account[]) { constructor(list: Account[]) {
this.list = list; this.list = list;
this.list.sort((a, b) => a.id - b.id);
} }
/** /**
@ -38,4 +39,14 @@ export class AccountApi {
return new AccountsList(array); return new AccountsList(array);
} }
/**
* Set default account
*/
static async SetDefaultAccount(account: Account): Promise<void> {
await APIClient.exec({
uri: `/account/${account.id}/default`,
method: "PUT",
});
}
} }

View File

@ -4,7 +4,7 @@ import { AsyncWidget } from "../widgets/AsyncWidget";
interface AccountContext { interface AccountContext {
list: AccountsList; list: AccountsList;
reload: () => void; reload: () => Promise<void>;
get(id: number): Account | null; get(id: number): Account | null;
} }
@ -24,9 +24,10 @@ export function AccountsListProvider(
}; };
const onReload = async () => { const onReload = async () => {
loadKey.current += 1;
setList(null); setList(null);
loadKey.current += 1;
return new Promise<void>((res) => { return new Promise<void>((res) => {
loadPromise.current = () => { loadPromise.current = () => {
res(); res();
@ -36,6 +37,7 @@ export function AccountsListProvider(
return ( return (
<AsyncWidget <AsyncWidget
ready={list !== null}
loadKey={loadKey.current} loadKey={loadKey.current}
load={load} load={load}
errMsg="Failed to load the list of accounts!" errMsg="Failed to load the list of accounts!"

View File

@ -1,17 +1,38 @@
import { IconButton, Tooltip } from "@mui/material";
import AddIcon from "@mui/icons-material/Add"; import AddIcon from "@mui/icons-material/Add";
import DeleteIcon from "@mui/icons-material/DeleteOutlined";
import RefreshIcon from "@mui/icons-material/Refresh"; import RefreshIcon from "@mui/icons-material/Refresh";
import { MoneyMgrWebRouteContainer } from "../widgets/MoneyMgrWebRouteContainer"; import { IconButton, Tooltip } from "@mui/material";
import { DataGrid, GridColDef } from "@mui/x-data-grid"; import { DataGrid, GridColDef } from "@mui/x-data-grid";
import { Account, AccountApi } from "../api/AccountApi";
import { useAccounts } from "../hooks/AccountsListProvider"; import { useAccounts } from "../hooks/AccountsListProvider";
import { useAlert } from "../hooks/context_providers/AlertDialogProvider";
import { useSnackbar } from "../hooks/context_providers/SnackbarProvider";
import { MoneyMgrWebRouteContainer } from "../widgets/MoneyMgrWebRouteContainer";
import { TimeWidget } from "../widgets/TimeWidget"; import { TimeWidget } from "../widgets/TimeWidget";
export function AccountsRoute(): React.ReactElement { export function AccountsRoute(): React.ReactElement {
const alert = useAlert();
const snackbar = useSnackbar();
const accounts = useAccounts(); const accounts = useAccounts();
const list = accounts.list.list; const list = accounts.list.list;
const setDefaultAccount = async (account: Account) => {
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]>[] = [ const columns: GridColDef<(typeof list)[number]>[] = [
{ field: "id", headerName: "ID", flex: 1 }, { field: "id", headerName: "ID", flex: 1 },
{ field: "name", headerName: "Name", flex: 6 }, { field: "name", headerName: "Name", flex: 6 },
@ -36,6 +57,7 @@ export function AccountsRoute(): React.ReactElement {
headerName: "Default", headerName: "Default",
flex: 1, flex: 1,
type: "boolean", type: "boolean",
editable: true,
}, },
]; ];
@ -57,7 +79,18 @@ export function AccountsRoute(): React.ReactElement {
</span> </span>
} }
> >
<DataGrid rows={list} columns={columns} disableRowSelectionOnClick /> <DataGrid<Account>
rows={list}
columns={columns}
disableRowSelectionOnClick
processRowUpdate={(updated, original) => {
if (updated.default_account && !original.default_account) {
return setDefaultAccount(updated);
}
return original as any;
}}
/>
</MoneyMgrWebRouteContainer> </MoneyMgrWebRouteContainer>
); );
} }