2 Commits
1.0.0 ... 1.0.1

Author SHA1 Message Date
3c5c82371a Fix mui-grid issue after update
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-05-15 21:51:12 +02:00
fb46626cff Update project dependencies
Some checks failed
continuous-integration/drone/push Build is failing
2025-05-15 21:45:36 +02:00
7 changed files with 2080 additions and 1059 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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"

View File

@ -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())
} }

File diff suppressed because it is too large Load Diff

View File

@ -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"
} }
} }

View File

@ -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}
> >

View File

@ -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}
> >