Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
3c5c82371a | |||
fb46626cff |
661
moneymgr_backend/Cargo.lock
generated
661
moneymgr_backend/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -6,33 +6,34 @@ edition = "2024"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
env_logger = "0.11.8"
|
env_logger = "0.11.8"
|
||||||
log = "0.4.27"
|
log = "0.4.27"
|
||||||
diesel = { version = "2.2.0", features = ["postgres", "r2d2"] }
|
diesel = { version = "2.2.10", features = ["postgres", "r2d2"] }
|
||||||
diesel_migrations = "2.1.0"
|
diesel_migrations = "2.1.0"
|
||||||
clap = { version = "4.5.35", features = ["env", "derive"] }
|
clap = { version = "4.5.38", features = ["env", "derive"] }
|
||||||
actix-web = "4"
|
actix-web = "4.11.0"
|
||||||
actix-cors = "0.7.0"
|
actix-cors = "0.7.1"
|
||||||
actix-multipart = "0.7.0"
|
actix-multipart = "0.7.2"
|
||||||
actix-remote-ip = "0.1.0"
|
actix-remote-ip = "0.1.0"
|
||||||
actix-session = { version = "0.10.0", features = ["redis-session"] }
|
actix-session = { version = "0.10.0", features = ["redis-session"] }
|
||||||
actix-files = "0.6.6"
|
actix-files = "0.6.6"
|
||||||
lazy_static = "1.5.0"
|
lazy_static = "1.5.0"
|
||||||
anyhow = "1.0.97"
|
anyhow = "1.0.98"
|
||||||
serde = { version = "1.0.219", features = ["derive"] }
|
serde = { version = "1.0.219", features = ["derive"] }
|
||||||
rust-s3 = "0.36.0-beta.2"
|
rust-s3 = "0.36.0-beta.2"
|
||||||
thiserror = "2.0.12"
|
thiserror = "2.0.12"
|
||||||
tokio = "1.44.1"
|
tokio = "1.45.0"
|
||||||
futures-util = "0.3.31"
|
futures-util = "0.3.31"
|
||||||
serde_json = "1.0.140"
|
serde_json = "1.0.140"
|
||||||
light-openid = "1.0.4"
|
light-openid = "1.0.4"
|
||||||
rand = "0.9.0"
|
rand = "0.9.1"
|
||||||
ipnet = { version = "2.11.0", features = ["serde"] }
|
ipnet = { version = "2.11.0", features = ["serde"] }
|
||||||
lazy-regex = "3.4.1"
|
lazy-regex = "3.4.1"
|
||||||
jwt-simple = { version = "0.12.11", default-features = false, features = ["pure-rust"] }
|
jwt-simple = { version = "0.12.11", default-features = false, features = ["pure-rust"] }
|
||||||
mime_guess = "2.0.5"
|
mime_guess = "2.0.5"
|
||||||
rust-embed = { version = "8.6.0" }
|
rust-embed = { version = "8.7.2" }
|
||||||
sha2 = "0.10.8"
|
sha2 = "0.11.0-pre.5"
|
||||||
|
base16ct = "0.2.0"
|
||||||
httpdate = "1.0.3"
|
httpdate = "1.0.3"
|
||||||
chrono = "0.4.41"
|
chrono = "0.4.41"
|
||||||
tempfile = "3.19.1"
|
tempfile = "3.20.0"
|
||||||
zip = "2.6.1"
|
zip = "3.0.0"
|
||||||
rust_xlsxwriter = "0.86.1"
|
rust_xlsxwriter = "0.87.0"
|
@ -5,5 +5,5 @@ pub fn sha512(bytes: &[u8]) -> String {
|
|||||||
let mut hasher = Sha512::new();
|
let mut hasher = Sha512::new();
|
||||||
hasher.update(bytes);
|
hasher.update(bytes);
|
||||||
let h = hasher.finalize();
|
let h = hasher.finalize();
|
||||||
format!("{:x}", h)
|
base16ct::lower::encode_string(h.as_slice())
|
||||||
}
|
}
|
||||||
|
2375
moneymgr_web/package-lock.json
generated
2375
moneymgr_web/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -16,34 +16,34 @@
|
|||||||
"@jsonjoy.com/base64": "^1.1.2",
|
"@jsonjoy.com/base64": "^1.1.2",
|
||||||
"@mdi/js": "^7.4.47",
|
"@mdi/js": "^7.4.47",
|
||||||
"@mdi/react": "^1.6.1",
|
"@mdi/react": "^1.6.1",
|
||||||
"@mui/icons-material": "^7.0.1",
|
"@mui/icons-material": "^7.1.0",
|
||||||
"@mui/material": "^7.0.1",
|
"@mui/material": "^7.1.0",
|
||||||
"@mui/x-charts": "^8.2.0",
|
"@mui/x-charts": "^8.3.1",
|
||||||
"@mui/x-data-grid": "^7.28.3",
|
"@mui/x-data-grid": "^8.3.1",
|
||||||
"@mui/x-date-pickers": "^8.0.0-beta.3",
|
"@mui/x-date-pickers": "^8.3.1",
|
||||||
"date-and-time": "^3.6.0",
|
"date-and-time": "^3.6.0",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"filesize": "^10.1.6",
|
"filesize": "^10.1.6",
|
||||||
"qrcode.react": "^4.2.0",
|
"qrcode.react": "^4.2.0",
|
||||||
"react": "^19.1.0",
|
"react": "^19.1.0",
|
||||||
"react-dom": "^19.1.0",
|
"react-dom": "^19.1.0",
|
||||||
"react-router": "^7.4.1",
|
"react-router": "^7.6.0",
|
||||||
"react-router-dom": "^7.4.1",
|
"react-router-dom": "^7.6.0",
|
||||||
"ts-pattern": "^5.7.0"
|
"ts-pattern": "^5.7.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.23.0",
|
"@eslint/js": "^9.26.0",
|
||||||
"@types/react": "^19.1.0",
|
"@types/react": "^19.1.4",
|
||||||
"@types/react-dom": "^19.1.1",
|
"@types/react-dom": "^19.1.5",
|
||||||
"@vitejs/plugin-react": "^4.3.4",
|
"@vitejs/plugin-react": "^4.4.1",
|
||||||
"eslint": "^9.23.0",
|
"eslint": "^9.26.0",
|
||||||
"eslint-plugin-react-dom": "^1.40.2",
|
"eslint-plugin-react-dom": "^1.49.0",
|
||||||
"eslint-plugin-react-hooks": "^5.1.0",
|
"eslint-plugin-react-hooks": "^5.1.0",
|
||||||
"eslint-plugin-react-refresh": "^0.4.19",
|
"eslint-plugin-react-refresh": "^00.4.20",
|
||||||
"eslint-plugin-react-x": "^1.40.2",
|
"eslint-plugin-react-x": "^1.49.0",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.1.0",
|
||||||
"typescript": "~5.8.2",
|
"typescript": "~5.8.3",
|
||||||
"typescript-eslint": "^8.29.0",
|
"typescript-eslint": "^8.32.1",
|
||||||
"vite": "^6.2.5"
|
"vite": "^6.3.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,7 +130,7 @@ function MovementsTable(p: {
|
|||||||
}, [p.movements, labelFilter]);
|
}, [p.movements, labelFilter]);
|
||||||
|
|
||||||
const [rowSelectionModel, setRowSelectionModel] =
|
const [rowSelectionModel, setRowSelectionModel] =
|
||||||
React.useState<GridRowSelectionModel>([]);
|
React.useState<GridRowSelectionModel>({ type: "include", ids: new Set() });
|
||||||
|
|
||||||
// Set uploaded file
|
// Set uploaded file
|
||||||
const setUploadedFile = async (
|
const setUploadedFile = async (
|
||||||
@ -216,7 +216,7 @@ function MovementsTable(p: {
|
|||||||
const moveMultiple = async () => {
|
const moveMultiple = async () => {
|
||||||
try {
|
try {
|
||||||
const movements = p.movements.filter((m) =>
|
const movements = p.movements.filter((m) =>
|
||||||
rowSelectionModel.includes(m.id)
|
rowSelectionModel.ids.has(m.id)
|
||||||
);
|
);
|
||||||
|
|
||||||
const targetAccount = await chooseAccount(
|
const targetAccount = await chooseAccount(
|
||||||
@ -260,7 +260,7 @@ function MovementsTable(p: {
|
|||||||
const deleteMultiple = async () => {
|
const deleteMultiple = async () => {
|
||||||
try {
|
try {
|
||||||
const movements = p.movements.filter((m) =>
|
const movements = p.movements.filter((m) =>
|
||||||
rowSelectionModel.includes(m.id)
|
rowSelectionModel.ids.has(m.id)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -393,15 +393,19 @@ function MovementsTable(p: {
|
|||||||
/>
|
/>
|
||||||
<span style={{ flex: 1 }}></span>
|
<span style={{ flex: 1 }}></span>
|
||||||
<Tooltip title="Refresh table">
|
<Tooltip title="Refresh table">
|
||||||
<IconButton onClick={() => { p.needReload(false); }}>
|
<IconButton
|
||||||
|
onClick={() => {
|
||||||
|
p.needReload(false);
|
||||||
|
}}
|
||||||
|
>
|
||||||
<RefreshIcon />
|
<RefreshIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip title="Move all the selected entries to another account">
|
<Tooltip title="Move all the selected entries to another account">
|
||||||
<IconButton
|
<IconButton
|
||||||
disabled={
|
disabled={
|
||||||
rowSelectionModel.length === 0 ||
|
rowSelectionModel.ids.size === 0 ||
|
||||||
rowSelectionModel.length === p.movements.length
|
rowSelectionModel.ids.size === p.movements.length
|
||||||
}
|
}
|
||||||
onClick={moveMultiple}
|
onClick={moveMultiple}
|
||||||
>
|
>
|
||||||
@ -411,8 +415,8 @@ function MovementsTable(p: {
|
|||||||
<Tooltip title="Delete all the selected entries">
|
<Tooltip title="Delete all the selected entries">
|
||||||
<IconButton
|
<IconButton
|
||||||
disabled={
|
disabled={
|
||||||
rowSelectionModel.length === 0 ||
|
rowSelectionModel.ids.size === 0 ||
|
||||||
rowSelectionModel.length === p.movements.length
|
rowSelectionModel.ids.size === p.movements.length
|
||||||
}
|
}
|
||||||
onClick={deleteMultiple}
|
onClick={deleteMultiple}
|
||||||
>
|
>
|
||||||
|
@ -133,7 +133,7 @@ function InboxTable(p: {
|
|||||||
}, [p.entries, labelFilter]);
|
}, [p.entries, labelFilter]);
|
||||||
|
|
||||||
const [rowSelectionModel, setRowSelectionModel] =
|
const [rowSelectionModel, setRowSelectionModel] =
|
||||||
React.useState<GridRowSelectionModel>([]);
|
React.useState<GridRowSelectionModel>({ type: "include", ids: new Set() });
|
||||||
|
|
||||||
const [attaching, setAttaching] = React.useState<InboxEntry | undefined>();
|
const [attaching, setAttaching] = React.useState<InboxEntry | undefined>();
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ function InboxTable(p: {
|
|||||||
|
|
||||||
// Find the entry to map
|
// Find the entry to map
|
||||||
const entries = p.entries.filter(
|
const entries = p.entries.filter(
|
||||||
(m) => rowSelectionModel.includes(m.id) && !m.movement_id
|
(m) => rowSelectionModel.ids.has(m.id) && !m.movement_id
|
||||||
);
|
);
|
||||||
const movements: Movement[][] = [];
|
const movements: Movement[][] = [];
|
||||||
|
|
||||||
@ -324,7 +324,7 @@ function InboxTable(p: {
|
|||||||
const deleteMultiple = async () => {
|
const deleteMultiple = async () => {
|
||||||
try {
|
try {
|
||||||
const deletedEntries = p.entries.filter((m) =>
|
const deletedEntries = p.entries.filter((m) =>
|
||||||
rowSelectionModel.includes(m.id)
|
rowSelectionModel.ids.has(m.id)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -437,7 +437,9 @@ function InboxTable(p: {
|
|||||||
icon={<SearchIcon />}
|
icon={<SearchIcon />}
|
||||||
label="Attach entry to movement"
|
label="Attach entry to movement"
|
||||||
color="inherit"
|
color="inherit"
|
||||||
onClick={() => { handleAttachClick(params.row); }}
|
onClick={() => {
|
||||||
|
handleAttachClick(params.row);
|
||||||
|
}}
|
||||||
disabled={!!params.row.movement_id}
|
disabled={!!params.row.movement_id}
|
||||||
/>
|
/>
|
||||||
</Tooltip>,
|
</Tooltip>,
|
||||||
@ -496,7 +498,7 @@ function InboxTable(p: {
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip title="Attach all the selected inbox entries to movements">
|
<Tooltip title="Attach all the selected inbox entries to movements">
|
||||||
<IconButton
|
<IconButton
|
||||||
disabled={rowSelectionModel.length === 0}
|
disabled={rowSelectionModel.ids.size === 0}
|
||||||
onClick={attachMultiple}
|
onClick={attachMultiple}
|
||||||
>
|
>
|
||||||
<SearchIcon />
|
<SearchIcon />
|
||||||
@ -505,8 +507,8 @@ function InboxTable(p: {
|
|||||||
<Tooltip title="Delete all the selected inbox entries">
|
<Tooltip title="Delete all the selected inbox entries">
|
||||||
<IconButton
|
<IconButton
|
||||||
disabled={
|
disabled={
|
||||||
rowSelectionModel.length === 0 ||
|
rowSelectionModel.ids.size === 0 ||
|
||||||
rowSelectionModel.length === p.entries.length
|
rowSelectionModel.ids.size === p.entries.length
|
||||||
}
|
}
|
||||||
onClick={deleteMultiple}
|
onClick={deleteMultiple}
|
||||||
>
|
>
|
||||||
|
Reference in New Issue
Block a user