3 Commits

Author SHA1 Message Date
369517f305 Update Node.js to v24
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-22 00:20:15 +00:00
4443131516 Can download APK from web app
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-21 19:48:32 +02:00
365d7589b1 Force refresh of expenses editor
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-20 19:55:18 +02:00
7 changed files with 37 additions and 3 deletions

View File

@@ -12,7 +12,7 @@ steps:
# Frontend
- name: web_build
image: node:23
image: node:24
depends_on:
- fetch
volumes:

View File

@@ -126,6 +126,14 @@ pub struct AppConfig {
/// Redis password
#[clap(long, env, default_value = "secretredis")]
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! {

View File

@@ -70,6 +70,7 @@ impl Default for ServerConstraints {
struct ServerConfig {
auth_disabled: bool,
oidc_provider_name: &'static str,
apk_download_url: &'static str,
accounts_types: &'static [AccountTypeDesc],
constraints: ServerConstraints,
}
@@ -79,6 +80,7 @@ impl Default for ServerConfig {
Self {
auth_disabled: AppConfig::get().is_auth_disabled(),
oidc_provider_name: AppConfig::get().openid_provider().name,
apk_download_url: AppConfig::get().apk_download_url.as_str(),
constraints: Default::default(),
accounts_types: &ACCOUNT_TYPES,
}

View File

@@ -36,8 +36,8 @@ class ScanScreen extends HookConsumerWidget {
restartScan() async {
try {
final val = ref.refresh(_scanDocumentProvider);
Logger.root.info("Load again startup result: $val");
ref.invalidate(_scanDocumentProvider);
Logger.root.info("Load again startup");
} catch (e, s) {
Logger.root.shout("Failed to try again startup loading! $e $s");
}

View File

@@ -40,6 +40,15 @@ class ExpenseEditor extends HookConsumerWidget {
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
handleClearCost() {
costController.text = "";

View File

@@ -3,6 +3,7 @@ import { APIClient } from "./ApiClient";
export interface ServerConfig {
auth_disabled: boolean;
oidc_provider_name: string;
apk_download_url: string;
accounts_types: AccountType[];
constraints: ServerConstraints;
}

View File

@@ -1,5 +1,6 @@
import { mdiApi, mdiCash } from "@mdi/js";
import Icon from "@mdi/react";
import AndroidIcon from "@mui/icons-material/Android";
import CloudDownloadIcon from "@mui/icons-material/CloudDownload";
import LogoutIcon from "@mui/icons-material/Logout";
import SettingsIcon from "@mui/icons-material/Settings";
@@ -10,6 +11,7 @@ import MenuItem from "@mui/material/MenuItem";
import Toolbar from "@mui/material/Toolbar";
import Typography from "@mui/material/Typography";
import * as React from "react";
import { ServerApi } from "../api/ServerApi";
import { useAuthInfo } from "./BaseAuthenticatedPage";
import { DarkThemeButton } from "./DarkThemeButtonWidget";
import { PublicModeButton } from "./PublicModeButtonWidget";
@@ -100,6 +102,18 @@ export function MoneyWebAppBar(p: {
</MenuItem>
</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 />
{/* Sign out */}