Can create new movement when performing mapping

This commit is contained in:
Pierre HUBERT 2025-05-14 19:44:37 +02:00
parent 7c1cd96691
commit cc512e648c
2 changed files with 149 additions and 75 deletions

View File

@ -130,7 +130,7 @@ export function UpdateMovementDialog(p: {
setMovement((m) => { setMovement((m) => {
return { return {
...m, ...m,
amount: m.amount, amount: l,
}; };
}) })
} }

View File

@ -1,6 +1,15 @@
import { ListItem, ListItemButton, Paper, Typography } from "@mui/material"; import AddIcon from "@mui/icons-material/Add";
import {
Fab,
ListItem,
ListItemButton,
Paper,
Tooltip,
Typography,
} from "@mui/material";
import React from "react"; import React from "react";
import { Movement, MovementApi } from "../api/MovementsApi"; import { Movement, MovementApi } from "../api/MovementsApi";
import { UpdateMovementDialog } from "../dialogs/UpdateMovementDialog";
import { AsyncWidget } from "./AsyncWidget"; import { AsyncWidget } from "./AsyncWidget";
import { AccountInput } from "./forms/AccountInput"; import { AccountInput } from "./forms/AccountInput";
import { AmountInput } from "./forms/AmountInput"; import { AmountInput } from "./forms/AmountInput";
@ -18,6 +27,8 @@ export function SelectMovementWidget(p: {
label?: string; label?: string;
}; };
}): React.ReactElement { }): React.ReactElement {
const loadKey = React.useRef(1);
const [amount, setAmount] = React.useState<number | undefined>( const [amount, setAmount] = React.useState<number | undefined>(
p.initialValues?.amount p.initialValues?.amount
); );
@ -48,10 +59,42 @@ export function SelectMovementWidget(p: {
else setList(undefined); else setList(undefined);
}; };
const [creating, setCreating] = React.useState(false);
const handleStartCreateNewMovement = () => {
setCreating(true);
};
const handleCloseCreateNewMovement = () => {
setCreating(false);
};
const handleCreatedNewMovement = (m: Movement) => {
setAmount(m.amount);
setAccountId(m.account_id);
setTime(m.time);
setLabel(m.label);
p.onChange(m);
loadKey.current += 1;
setCreating(false);
};
return ( return (
<Paper style={{ padding: "10px", flex: 1 }}> <>
<Paper
style={{
padding: "10px",
flex: 1,
display: "flex",
flexDirection: "column",
}}
>
<div <div
style={{ display: "flex", flexDirection: "row", alignItems: "center" }} style={{
display: "flex",
flexDirection: "row",
alignItems: "center",
}}
> >
<AccountInput <AccountInput
value={accountId} value={accountId}
@ -88,8 +131,11 @@ export function SelectMovementWidget(p: {
/> />
</div> </div>
<div style={{ flex: 1 }}>
<AsyncWidget <AsyncWidget
loadKey={accountId + "/" + JSON.stringify(filters)} loadKey={
loadKey.current + "/" + accountId + "/" + JSON.stringify(filters)
}
load={load} load={load}
errMsg="Failed to load the list of movements!" errMsg="Failed to load the list of movements!"
build={() => { build={() => {
@ -122,6 +168,34 @@ export function SelectMovementWidget(p: {
); );
}} }}
/> />
</div>
<div style={{ textAlign: "right" }}>
<Tooltip title="Create a new movement">
<Fab
color="primary"
aria-label="Create a new movement"
onClick={handleStartCreateNewMovement}
>
<AddIcon />
</Fab>
</Tooltip>
</div>
</Paper> </Paper>
{creating && accountId && (
<UpdateMovementDialog
open
initial={{
account_id: accountId,
amount: amount ?? 0,
checked: false,
label: label ?? "",
time: time ?? 0,
}}
onClose={handleCloseCreateNewMovement}
onFinished={handleCreatedNewMovement}
/>
)}
</>
); );
} }