Compare commits
11 Commits
1.0.5
...
9e365be73e
Author | SHA1 | Date | |
---|---|---|---|
9e365be73e | |||
1237c9706e | |||
1add0b4cfe | |||
6920d6d9b0 | |||
27e92660f1 | |||
743e5ba410 | |||
8039b1c807 | |||
9ef84ba63a | |||
56e5ae6629 | |||
4443131516 | |||
365d7589b1 |
@@ -12,7 +12,7 @@ steps:
|
|||||||
|
|
||||||
# Frontend
|
# Frontend
|
||||||
- name: web_build
|
- name: web_build
|
||||||
image: node:23
|
image: node:24
|
||||||
depends_on:
|
depends_on:
|
||||||
- fetch
|
- fetch
|
||||||
volumes:
|
volumes:
|
||||||
|
8
moneymgr_backend/Cargo.lock
generated
8
moneymgr_backend/Cargo.lock
generated
@@ -87,7 +87,7 @@ dependencies = [
|
|||||||
"mime",
|
"mime",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rand 0.9.1",
|
"rand 0.9.2",
|
||||||
"sha1",
|
"sha1",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"tokio",
|
"tokio",
|
||||||
@@ -2298,7 +2298,7 @@ dependencies = [
|
|||||||
"light-openid",
|
"light-openid",
|
||||||
"log",
|
"log",
|
||||||
"mime_guess",
|
"mime_guess",
|
||||||
"rand 0.9.1",
|
"rand 0.9.2",
|
||||||
"rust-embed",
|
"rust-embed",
|
||||||
"rust-s3",
|
"rust-s3",
|
||||||
"rust_xlsxwriter",
|
"rust_xlsxwriter",
|
||||||
@@ -2741,9 +2741,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.9.1"
|
version = "0.9.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
|
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand_chacha 0.9.0",
|
"rand_chacha 0.9.0",
|
||||||
"rand_core 0.9.3",
|
"rand_core 0.9.3",
|
||||||
|
@@ -24,7 +24,7 @@ tokio = "1.45.1"
|
|||||||
futures-util = "0.3.31"
|
futures-util = "0.3.31"
|
||||||
serde_json = "1.0.141"
|
serde_json = "1.0.141"
|
||||||
light-openid = "1.0.4"
|
light-openid = "1.0.4"
|
||||||
rand = "0.9.1"
|
rand = "0.9.2"
|
||||||
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.12", default-features = false, features = ["pure-rust"] }
|
jwt-simple = { version = "0.12.12", default-features = false, features = ["pure-rust"] }
|
||||||
|
@@ -126,6 +126,14 @@ pub struct AppConfig {
|
|||||||
/// Redis password
|
/// Redis password
|
||||||
#[clap(long, env, default_value = "secretredis")]
|
#[clap(long, env, default_value = "secretredis")]
|
||||||
redis_password: String,
|
redis_password: String,
|
||||||
|
|
||||||
|
/// Application download URL
|
||||||
|
#[clap(
|
||||||
|
long,
|
||||||
|
env,
|
||||||
|
default_value = "https://gitea.communiquons.org/pierre/MoneyMgr/releases/download/latest/moneymgr_mobile_arm64-v8a.apk"
|
||||||
|
)]
|
||||||
|
pub apk_download_url: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
|
@@ -70,6 +70,7 @@ impl Default for ServerConstraints {
|
|||||||
struct ServerConfig {
|
struct ServerConfig {
|
||||||
auth_disabled: bool,
|
auth_disabled: bool,
|
||||||
oidc_provider_name: &'static str,
|
oidc_provider_name: &'static str,
|
||||||
|
apk_download_url: &'static str,
|
||||||
accounts_types: &'static [AccountTypeDesc],
|
accounts_types: &'static [AccountTypeDesc],
|
||||||
constraints: ServerConstraints,
|
constraints: ServerConstraints,
|
||||||
}
|
}
|
||||||
@@ -79,6 +80,7 @@ impl Default for ServerConfig {
|
|||||||
Self {
|
Self {
|
||||||
auth_disabled: AppConfig::get().is_auth_disabled(),
|
auth_disabled: AppConfig::get().is_auth_disabled(),
|
||||||
oidc_provider_name: AppConfig::get().openid_provider().name,
|
oidc_provider_name: AppConfig::get().openid_provider().name,
|
||||||
|
apk_download_url: AppConfig::get().apk_download_url.as_str(),
|
||||||
constraints: Default::default(),
|
constraints: Default::default(),
|
||||||
accounts_types: &ACCOUNT_TYPES,
|
accounts_types: &ACCOUNT_TYPES,
|
||||||
}
|
}
|
||||||
|
@@ -36,8 +36,8 @@ class ScanScreen extends HookConsumerWidget {
|
|||||||
|
|
||||||
restartScan() async {
|
restartScan() async {
|
||||||
try {
|
try {
|
||||||
final val = ref.refresh(_scanDocumentProvider);
|
ref.invalidate(_scanDocumentProvider);
|
||||||
Logger.root.info("Load again startup result: $val");
|
Logger.root.info("Load again startup");
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Logger.root.shout("Failed to try again startup loading! $e $s");
|
Logger.root.shout("Failed to try again startup loading! $e $s");
|
||||||
}
|
}
|
||||||
|
@@ -40,6 +40,15 @@ class ExpenseEditor extends HookConsumerWidget {
|
|||||||
|
|
||||||
final (:pending, :snapshot, :hasError) = useAsyncTask();
|
final (:pending, :snapshot, :hasError) = useAsyncTask();
|
||||||
|
|
||||||
|
// Force refresh of field if required
|
||||||
|
final previousData = useState<BaseExpenseInfo?>(null);
|
||||||
|
if (initialData != previousData.value) {
|
||||||
|
previousData.value = initialData;
|
||||||
|
labelController.text = initialData?.label ?? "";
|
||||||
|
costController.text = initialData?.cost.toString() ?? "";
|
||||||
|
timeController.value = initialData?.time ?? DateTime.now();
|
||||||
|
}
|
||||||
|
|
||||||
// Clear cost value
|
// Clear cost value
|
||||||
handleClearCost() {
|
handleClearCost() {
|
||||||
costController.text = "";
|
costController.text = "";
|
||||||
|
1048
moneymgr_web/package-lock.json
generated
1048
moneymgr_web/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -18,8 +18,8 @@
|
|||||||
"@mdi/react": "^1.6.1",
|
"@mdi/react": "^1.6.1",
|
||||||
"@mui/icons-material": "^7.1.2",
|
"@mui/icons-material": "^7.1.2",
|
||||||
"@mui/material": "^7.1.2",
|
"@mui/material": "^7.1.2",
|
||||||
"@mui/x-charts": "^8.8.0",
|
"@mui/x-charts": "^8.9.0",
|
||||||
"@mui/x-data-grid": "^8.8.0",
|
"@mui/x-data-grid": "^8.9.1",
|
||||||
"@mui/x-date-pickers": "^8.8.0",
|
"@mui/x-date-pickers": "^8.8.0",
|
||||||
"date-and-time": "^3.6.0",
|
"date-and-time": "^3.6.0",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"@types/react": "^19.1.8",
|
"@types/react": "^19.1.8",
|
||||||
"@types/react-dom": "^19.1.6",
|
"@types/react-dom": "^19.1.6",
|
||||||
"@vitejs/plugin-react": "^4.6.0",
|
"@vitejs/plugin-react": "^4.6.0",
|
||||||
"eslint": "^9.26.0",
|
"eslint": "^9.31.0",
|
||||||
"eslint-plugin-react-dom": "^1.49.0",
|
"eslint-plugin-react-dom": "^1.49.0",
|
||||||
"eslint-plugin-react-hooks": "^5.2.0",
|
"eslint-plugin-react-hooks": "^5.2.0",
|
||||||
"eslint-plugin-react-refresh": "^00.4.20",
|
"eslint-plugin-react-refresh": "^00.4.20",
|
||||||
|
@@ -3,6 +3,7 @@ import { APIClient } from "./ApiClient";
|
|||||||
export interface ServerConfig {
|
export interface ServerConfig {
|
||||||
auth_disabled: boolean;
|
auth_disabled: boolean;
|
||||||
oidc_provider_name: string;
|
oidc_provider_name: string;
|
||||||
|
apk_download_url: string;
|
||||||
accounts_types: AccountType[];
|
accounts_types: AccountType[];
|
||||||
constraints: ServerConstraints;
|
constraints: ServerConstraints;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { mdiApi, mdiCash } from "@mdi/js";
|
import { mdiApi, mdiCash } from "@mdi/js";
|
||||||
import Icon from "@mdi/react";
|
import Icon from "@mdi/react";
|
||||||
|
import AndroidIcon from "@mui/icons-material/Android";
|
||||||
import CloudDownloadIcon from "@mui/icons-material/CloudDownload";
|
import CloudDownloadIcon from "@mui/icons-material/CloudDownload";
|
||||||
import LogoutIcon from "@mui/icons-material/Logout";
|
import LogoutIcon from "@mui/icons-material/Logout";
|
||||||
import SettingsIcon from "@mui/icons-material/Settings";
|
import SettingsIcon from "@mui/icons-material/Settings";
|
||||||
@@ -10,6 +11,7 @@ import MenuItem from "@mui/material/MenuItem";
|
|||||||
import Toolbar from "@mui/material/Toolbar";
|
import Toolbar from "@mui/material/Toolbar";
|
||||||
import Typography from "@mui/material/Typography";
|
import Typography from "@mui/material/Typography";
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
|
import { ServerApi } from "../api/ServerApi";
|
||||||
import { useAuthInfo } from "./BaseAuthenticatedPage";
|
import { useAuthInfo } from "./BaseAuthenticatedPage";
|
||||||
import { DarkThemeButton } from "./DarkThemeButtonWidget";
|
import { DarkThemeButton } from "./DarkThemeButtonWidget";
|
||||||
import { PublicModeButton } from "./PublicModeButtonWidget";
|
import { PublicModeButton } from "./PublicModeButtonWidget";
|
||||||
@@ -100,6 +102,18 @@ export function MoneyWebAppBar(p: {
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
|
|
||||||
|
{/* APK download */}
|
||||||
|
<RouterLink to={ServerApi.Config.apk_download_url}>
|
||||||
|
<MenuItem>
|
||||||
|
<ListItemIcon>
|
||||||
|
<AndroidIcon />
|
||||||
|
</ListItemIcon>
|
||||||
|
<ListItemText secondary="Scan expenses from your smartphone">
|
||||||
|
Mobile Application
|
||||||
|
</ListItemText>
|
||||||
|
</MenuItem>
|
||||||
|
</RouterLink>
|
||||||
|
|
||||||
<Divider />
|
<Divider />
|
||||||
|
|
||||||
{/* Sign out */}
|
{/* Sign out */}
|
||||||
|
Reference in New Issue
Block a user