From b27687576a0d5114dec32c90ec2692b2177b4430 Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Thu, 26 Dec 2024 02:54:29 +0800 Subject: [PATCH 01/15] dummy UI for app settings --- src/app.rs | 17 ++++++++++++--- src/component/drawer.rs | 46 +++++++++++++++++++++++++++++++++++++++++ src/component/mod.rs | 1 + 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 src/component/drawer.rs diff --git a/src/app.rs b/src/app.rs index 514ced2..0ce61b0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,19 +1,21 @@ use leptos::ev::MouseEvent; use leptos::prelude::*; use leptos::task::spawn_local; -use thaw::*; - +use md_minutes_generator_ui::component::drawer::drawer; use md_minutes_generator_ui::component::message_bar::FileStatus; use md_minutes_generator_ui::handler::drag_drop::drag_drop; use md_minutes_generator_ui::handler::generate::generate; use md_minutes_generator_ui::handler::select_input::select_input; use md_minutes_generator_ui::handler::select_output::select_output; use md_minutes_generator_ui::handler::setup_output_options; +use thaw::*; #[component] pub fn App() -> impl IntoView { let toaster = ToasterInjection::expect_context(); + let open_settings = RwSignal::new(false); + let file_path = RwSignal::new(String::new()); let markdown_path = RwSignal::new(String::new()); let worksheet_options = RwSignal::new(Vec::new()); @@ -61,7 +63,16 @@ pub fn App() -> impl IntoView { view! {
-

"Powered by Tauri + Leptos"

+ + +

"Powered by Tauri + Leptos"

+
+ + + +
+ + {drawer(open_settings)}
diff --git a/src/component/drawer.rs b/src/component/drawer.rs new file mode 100644 index 0000000..f6b5d41 --- /dev/null +++ b/src/component/drawer.rs @@ -0,0 +1,46 @@ +use leptos::prelude::*; +use leptos::{view, IntoView}; +use thaw::*; + +pub fn drawer(open_settings: RwSignal) -> impl IntoView { + view! { + + + + + + + "App Settings" + + + + +

"Language"

+ +
+ +

"Direct Generation"

+ +

+ "Note: " + "Turn on Direct Generation will generate markdown at selected output path " + "instantly " + "when worksheet with name matching today's date has been found." +

+
+ + + +
+
+ } +} diff --git a/src/component/mod.rs b/src/component/mod.rs index 545e0ef..59548da 100644 --- a/src/component/mod.rs +++ b/src/component/mod.rs @@ -1,2 +1,3 @@ +pub mod drawer; pub mod message_bar; pub mod toast; From 95d173886c9e7f762329d88e8929d46a63d5173a Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Thu, 26 Dec 2024 05:10:48 +0800 Subject: [PATCH 02/15] dummy UI for app settings (fix icon) --- Cargo.lock | 30 ++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/app.rs | 27 ++++++++++++++++----------- src/component/drawer.rs | 8 ++++---- styles.css | 4 +++- 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5b78e65..5ce7c08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1808,6 +1808,17 @@ dependencies = [ "png", ] +[[package]] +name = "icondata" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805a2a031c06a768407b774240192b0ad82ddb94554bb5b52053453f2f6b0bf1" +dependencies = [ + "icondata_cg", + "icondata_core", + "icondata_oc", +] + [[package]] name = "icondata_ai" version = "0.0.10" @@ -1817,12 +1828,30 @@ dependencies = [ "icondata_core", ] +[[package]] +name = "icondata_cg" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eba691ca17a43ffc8ebbcf200cd3ea54ad75837f210a6a6ace87a491be8314" +dependencies = [ + "icondata_core", +] + [[package]] name = "icondata_core" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c97be924215abd5e630d84e95a47c710138a6559b4c55039f4f33aa897fa859" +[[package]] +name = "icondata_oc" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be19499912a05d5db89ccb88dbe3c459ca4100bda3dbcbddff69f2dcf71d305" +dependencies = [ + "icondata_core", +] + [[package]] name = "icu_collections" version = "1.5.0" @@ -2470,6 +2499,7 @@ version = "0.2.0" dependencies = [ "chrono", "console_error_panic_hook", + "icondata", "js-sys", "leptos", "serde", diff --git a/Cargo.toml b/Cargo.toml index 6c7a9bf..f9e2cd1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dependencies] chrono = "0.4" console_error_panic_hook = "0.1" +icondata = { version = "0.5", default-features = false, features = ["css-gg", "github-octicons"] } js-sys = "0.3" leptos = { version = "0.7", features = ["csr"] } serde = { version = "1.0", features = ["derive"] } diff --git a/src/app.rs b/src/app.rs index 0ce61b0..40ec3b1 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,14 +1,15 @@ use leptos::ev::MouseEvent; use leptos::prelude::*; use leptos::task::spawn_local; -use md_minutes_generator_ui::component::drawer::drawer; +use thaw::*; + +use md_minutes_generator_ui::component::drawer::AppSetting; use md_minutes_generator_ui::component::message_bar::FileStatus; use md_minutes_generator_ui::handler::drag_drop::drag_drop; use md_minutes_generator_ui::handler::generate::generate; use md_minutes_generator_ui::handler::select_input::select_input; use md_minutes_generator_ui::handler::select_output::select_output; use md_minutes_generator_ui::handler::setup_output_options; -use thaw::*; #[component] pub fn App() -> impl IntoView { @@ -63,16 +64,20 @@ pub fn App() -> impl IntoView { view! {
- - -

"Powered by Tauri + Leptos"

-
- - - -
+ - {drawer(open_settings)} + + +
+ /> "App Settings" diff --git a/styles.css b/styles.css index d4f920e..e87f6dd 100644 --- a/styles.css +++ b/styles.css @@ -16,7 +16,9 @@ .container { margin: 0; - padding-top: 10vh; + padding-top: 5vh; + padding-left: 5vh; + padding-right: 5vh; display: flex; flex-direction: column; justify-content: center; From 0e06a0a8cff59109ff16e08cc73988cb061bce28 Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sat, 28 Dec 2024 07:20:11 +0800 Subject: [PATCH 03/15] add direct generation feature (wip) --- Cargo.lock | 414 +++++++++++++++++++++++++++- Cargo.toml | 5 + locales/en.json | 3 + locales/jp.json | 3 + locales/sc.json | 3 + src-tauri/Cargo.toml | 1 + src-tauri/capabilities/default.json | 3 +- src-tauri/src/command/mod.rs | 1 + src-tauri/src/command/settings.rs | 54 ++++ src-tauri/src/lib.rs | 28 +- src/app.rs | 23 +- src/component/drawer.rs | 42 ++- src/handler/mod.rs | 15 + src/handler/settings.rs | 41 +++ src/main.rs | 16 +- 15 files changed, 628 insertions(+), 24 deletions(-) create mode 100644 locales/en.json create mode 100644 locales/jp.json create mode 100644 locales/sc.json create mode 100644 src-tauri/src/command/mod.rs create mode 100644 src-tauri/src/command/settings.rs create mode 100644 src/handler/settings.rs diff --git a/Cargo.lock b/Cargo.lock index 5ce7c08..b719062 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -376,6 +376,16 @@ dependencies = [ "zip", ] +[[package]] +name = "calendrical_calculations" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ca2b6e2f7d75f43e001ded6f25e79b80bded5abbe764cbdf78c25a3051f4b" +dependencies = [ + "core_maths", + "displaydoc", +] + [[package]] name = "camino" version = "1.1.9" @@ -626,6 +636,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" dependencies = [ + "percent-encoding", "time", "version_check", ] @@ -670,6 +681,15 @@ dependencies = [ "libc", ] +[[package]] +name = "core_maths" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3" +dependencies = [ + "libm", +] + [[package]] name = "cpufeatures" version = "0.2.16" @@ -799,6 +819,18 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "default-struct-builder" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0df63c21a4383f94bd5388564829423f35c316aed85dc4f8427aded372c7c0d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "deranged" version = "0.3.11" @@ -1130,6 +1162,18 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "fixed_decimal" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0febbeb1118a9ecdee6e4520ead6b54882e843dd0592ad233247dbee84c53db8" +dependencies = [ + "displaydoc", + "ryu", + "smallvec", + "writeable", +] + [[package]] name = "flate2" version = "1.0.35" @@ -1852,6 +1896,29 @@ dependencies = [ "icondata_core", ] +[[package]] +name = "icu_calendar" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7265b2137f9a36f7634a308d91f984574bbdba8cfd95ceffe1c345552275a8ff" +dependencies = [ + "calendrical_calculations", + "displaydoc", + "icu_calendar_data", + "icu_locid", + "icu_locid_transform", + "icu_provider", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_calendar_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e009b7f0151ee6fb28c40b1283594397e0b7183820793e9ace3dcd13db126d0" + [[package]] name = "icu_collections" version = "1.5.0" @@ -1864,6 +1931,75 @@ dependencies = [ "zerovec", ] +[[package]] +name = "icu_datetime" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d115efb85e08df3fd77e77f52e7e087545a783fffba8be80bfa2102f306b1780" +dependencies = [ + "displaydoc", + "either", + "fixed_decimal", + "icu_calendar", + "icu_datetime_data", + "icu_decimal", + "icu_locid", + "icu_locid_transform", + "icu_plurals", + "icu_provider", + "icu_timezone", + "smallvec", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_datetime_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ba7e7f7a01269b9afb0a39eff4f8676f693b55f509b3120e43a0350a9f88bea" + +[[package]] +name = "icu_decimal" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb8fd98f86ec0448d85e1edf8884e4e318bb2e121bd733ec929a05c0a5e8b0eb" +dependencies = [ + "displaydoc", + "fixed_decimal", + "icu_decimal_data", + "icu_locid_transform", + "icu_provider", + "writeable", +] + +[[package]] +name = "icu_decimal_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d424c994071c6f5644f999925fc868c85fec82295326e75ad5017bc94b41523" + +[[package]] +name = "icu_list" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfeda1d7775b6548edd4e8b7562304a559a91ed56ab56e18961a053f367c365" +dependencies = [ + "displaydoc", + "icu_list_data", + "icu_locid_transform", + "icu_provider", + "regex-automata 0.2.0", + "writeable", +] + +[[package]] +name = "icu_list_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1825170d2c6679cb20dbd96a589d034e49f698aed9a2ef4fafc9a0101ed298f" + [[package]] name = "icu_locid" version = "1.5.0" @@ -1921,6 +2057,26 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +[[package]] +name = "icu_plurals" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a70e7c025dbd5c501b0a5c188cd11666a424f0dadcd4f0a95b7dafde3b114" +dependencies = [ + "displaydoc", + "fixed_decimal", + "icu_locid_transform", + "icu_plurals_data", + "icu_provider", + "zerovec", +] + +[[package]] +name = "icu_plurals_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3e8f775b215d45838814a090a2227247a7431d74e9156407d9c37f6ef0f208" + [[package]] name = "icu_properties" version = "1.5.1" @@ -1970,6 +2126,27 @@ dependencies = [ "syn 2.0.91", ] +[[package]] +name = "icu_timezone" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa91ba6a585939a020c787235daa8aee856d9bceebd6355e283c0c310bc6de96" +dependencies = [ + "displaydoc", + "icu_calendar", + "icu_provider", + "icu_timezone_data", + "tinystr", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_timezone_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c588878c508a3e2ace333b3c50296053e6483c6a7541251b546cc59dcd6ced8e" + [[package]] name = "ident_case" version = "1.0.1" @@ -2156,6 +2333,17 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "jsonptr" version = "0.6.3" @@ -2231,6 +2419,27 @@ dependencies = [ "web-sys", ] +[[package]] +name = "leptos-use" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8c662337494d17491e482b4c9263282b02992006e71f4985dabb553fb085c2" +dependencies = [ + "cfg-if", + "codee", + "cookie", + "default-struct-builder", + "js-sys", + "lazy_static", + "leptos", + "paste", + "send_wrapper", + "thiserror 2.0.9", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "leptos_config" version = "0.7.2" @@ -2277,6 +2486,67 @@ dependencies = [ "walkdir", ] +[[package]] +name = "leptos_i18n" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "787405b03feadebcd9319dea519f9f280745f0717335b9317a01b8b8a3060087" +dependencies = [ + "codee", + "default-struct-builder", + "icu_calendar", + "icu_datetime", + "icu_decimal", + "icu_list", + "icu_locid", + "icu_plurals", + "leptos", + "leptos-use", + "leptos_i18n_macro", + "leptos_meta", + "serde", + "typed-builder", + "wasm-bindgen", + "writeable", +] + +[[package]] +name = "leptos_i18n_macro" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51e6dc29db91c94ea5b697657bf4c1548918a02fcc5300771eacfb0cf656406e" +dependencies = [ + "fixed_decimal", + "icu_locid", + "icu_locid_transform", + "leptos_i18n_parser", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.91", + "toml 0.8.19", +] + +[[package]] +name = "leptos_i18n_parser" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f96bfcab8d80d9aa85d585c5f4bc9b509dbf4dec03d0ad6174189b191e2af0e8" +dependencies = [ + "fixed_decimal", + "icu_locid", + "icu_plurals", + "json5", + "proc-macro2", + "quote", + "serde", + "serde_json", + "serde_yaml", + "syn 2.0.91", + "toml 0.8.19", +] + [[package]] name = "leptos_macro" version = "0.7.2" @@ -2299,6 +2569,22 @@ dependencies = [ "uuid", ] +[[package]] +name = "leptos_meta" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446afa35482822d4a50a4af2cae11ac447193d769140e780701807ee5a9e2596" +dependencies = [ + "futures", + "indexmap 2.7.0", + "leptos", + "once_cell", + "or_poisoned", + "send_wrapper", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "leptos_server" version = "0.7.2" @@ -2369,6 +2655,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + [[package]] name = "libredox" version = "0.1.3" @@ -2491,6 +2783,7 @@ dependencies = [ "tauri-plugin-dialog", "tauri-plugin-fs", "tauri-plugin-shell", + "tauri-plugin-store", ] [[package]] @@ -2502,6 +2795,7 @@ dependencies = [ "icondata", "js-sys", "leptos", + "leptos_i18n", "serde", "serde-wasm-bindgen", "thaw", @@ -3086,6 +3380,51 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +dependencies = [ + "memchr", + "thiserror 2.0.9", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "pest_meta" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "phf" version = "0.8.0" @@ -3651,10 +3990,19 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", + "regex-automata 0.4.9", "regex-syntax", ] +[[package]] +name = "regex-automata" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9368763f5a9b804326f3af749e16f9abf378d227bcdee7634b13d8f17793782" +dependencies = [ + "memchr", +] + [[package]] name = "regex-automata" version = "0.4.9" @@ -4011,6 +4359,19 @@ dependencies = [ "syn 2.0.91", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.7.0", + "itoa 1.0.14", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "serialize-to-javascript" version = "0.1.1" @@ -4629,6 +4990,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "tauri-plugin-store" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c0c08fae6995909f5e9a0da6038273b750221319f2c0f3b526d6de1cde21505" +dependencies = [ + "dunce", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.9", + "tokio", + "tracing", +] + [[package]] name = "tauri-runtime" version = "2.2.0" @@ -4917,10 +5294,22 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "socket2", + "tokio-macros", "tracing", "windows-sys 0.52.0", ] +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "tokio-util" version = "0.7.13" @@ -5100,6 +5489,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uds_windows" version = "1.1.0" @@ -5170,6 +5565,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "url" version = "2.5.4" @@ -6123,6 +6524,17 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zerotrie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb594dd55d87335c5f60177cee24f19457a5ec10a065e0a3014722ad252d0a1f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" version = "0.10.4" diff --git a/Cargo.toml b/Cargo.toml index f9e2cd1..f8a8edc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,11 +10,16 @@ console_error_panic_hook = "0.1" icondata = { version = "0.5", default-features = false, features = ["css-gg", "github-octicons"] } js-sys = "0.3" leptos = { version = "0.7", features = ["csr"] } +leptos_i18n = { version = "0.5", features = ["csr"] } serde = { version = "1.0", features = ["derive"] } serde-wasm-bindgen = "0.6" thaw = { version = "0.4", features = ["csr"] } wasm-bindgen = "0.2" wasm-bindgen-futures = "0.4" +[package.metadata.leptos-i18n] +default = "en" +locales = ["en", "jp", "sc"] + [workspace] members = ["src-tauri"] diff --git a/locales/en.json b/locales/en.json new file mode 100644 index 0000000..50981ec --- /dev/null +++ b/locales/en.json @@ -0,0 +1,3 @@ +{ + "usage_guide": "

Click the button to select your input path
OR
Drag & dropyour file to the App window

" +} diff --git a/locales/jp.json b/locales/jp.json new file mode 100644 index 0000000..b96e10a --- /dev/null +++ b/locales/jp.json @@ -0,0 +1,3 @@ +{ + "usage_guide": "

ボタンをクリックして入力ファイルを選んでください
または
アプリウインドウに入力ファイルをドラッグ&ドロップしてください

" +} diff --git a/locales/sc.json b/locales/sc.json new file mode 100644 index 0000000..4c8d156 --- /dev/null +++ b/locales/sc.json @@ -0,0 +1,3 @@ +{ + "usage_guide": "

点击按钮选择输入文件路径

直接拖拽文件至应用窗口

" +} diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index ddb6499..36a5146 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -27,3 +27,4 @@ tauri = { version = "2.1", features = [] } tauri-plugin-dialog = "2.2" tauri-plugin-fs = "2.2" tauri-plugin-shell = "2.2" +tauri-plugin-store = "2.2" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 5e92e40..b616522 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -10,6 +10,7 @@ "shell:allow-open", "dialog:default", "fs:allow-create", - "fs:allow-write" + "fs:allow-write", + "store:default" ] } \ No newline at end of file diff --git a/src-tauri/src/command/mod.rs b/src-tauri/src/command/mod.rs new file mode 100644 index 0000000..6e98cef --- /dev/null +++ b/src-tauri/src/command/mod.rs @@ -0,0 +1 @@ +pub mod settings; diff --git a/src-tauri/src/command/settings.rs b/src-tauri/src/command/settings.rs new file mode 100644 index 0000000..afe3293 --- /dev/null +++ b/src-tauri/src/command/settings.rs @@ -0,0 +1,54 @@ +use serde::{Deserialize, Serialize}; +use serde_json::json; +use tauri::AppHandle; +use tauri_plugin_store::StoreExt; + +#[derive(Serialize, Deserialize)] +pub struct AppSettings { + language: String, + direct_generation: bool, +} + +#[tauri::command] +pub fn get_app_settings(app_handle: AppHandle) -> AppSettings { + let store = app_handle.store("store.json").unwrap(); + + let language = store + .get("language") + .expect("No language setting is found."); + let direct_generation = store + .get("direct_generation") + .expect("No direct generation setting is found."); + + AppSettings { + language: language.get("value").unwrap().to_string(), + direct_generation: direct_generation.get("value").unwrap().as_bool().unwrap(), + } +} + +#[tauri::command] +pub fn reset_app_settings(app_handle: AppHandle) -> AppSettings { + let store = app_handle.store("store.json").unwrap(); + + store.reset(); + + let language = store + .get("language") + .expect("No language setting is found."); + let direct_generation = store + .get("direct_generation") + .expect("No direct generation setting is found."); + + AppSettings { + language: language.get("value").unwrap().to_string(), + direct_generation: direct_generation.get("value").unwrap().as_bool().unwrap(), + } +} + +#[tauri::command] +pub fn set_app_settings(app_handle: AppHandle, language: String, direct_generation: bool) { + let store = app_handle.store("store.json").unwrap(); + + store.set("language", json!({"value": language})); + store.set("direct_generation", json!({"value": direct_generation})); +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 9127b41..a726115 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,7 +1,13 @@ +mod command; mod file_process; use directories::UserDirs; +use serde_json::json; +use tauri::AppHandle; use tauri_plugin_dialog::DialogExt; +use tauri_plugin_store::StoreBuilder; + +use crate::command::settings::*; #[tauri::command] fn get_desktop_dir() -> String { @@ -19,7 +25,7 @@ fn get_desktop_dir() -> String { } #[tauri::command] -async fn select_file(app_handle: tauri::AppHandle) -> String { +async fn select_file(app_handle: AppHandle) -> String { if let Some(user_dirs) = UserDirs::new() { let file_path = app_handle .dialog() @@ -38,7 +44,7 @@ async fn select_file(app_handle: tauri::AppHandle) -> String { } #[tauri::command] -async fn select_path(app_handle: tauri::AppHandle) -> String { +async fn select_path(app_handle: AppHandle) -> String { if let Some(user_dirs) = UserDirs::new() { let file_path = app_handle .dialog() @@ -65,7 +71,7 @@ fn read_excel(input: &str, _: Option<&str>, _: Option<&str>) -> Vec { } #[tauri::command] -fn generate_markdown(app_handle: tauri::AppHandle, input: &str, output: &str, sheet: &str) -> bool { +fn generate_markdown(app_handle: AppHandle, input: &str, output: &str, sheet: &str) -> bool { if output.is_empty() || sheet.is_empty() { return false; } @@ -79,12 +85,24 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_store::Builder::default().build()) + .setup(|app| { + StoreBuilder::new(app, "store.json") + .default("language", json!({"value": "en"})) + .default("direct_generation", json!({"value": false})) + .build()?; + + Ok(()) + }) .invoke_handler(tauri::generate_handler![ + generate_markdown, + get_app_settings, get_desktop_dir, + read_excel, + reset_app_settings, select_file, select_path, - read_excel, - generate_markdown + set_app_settings, ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src/app.rs b/src/app.rs index 40ec3b1..faf15c0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,3 +1,4 @@ +use chrono::Local; use leptos::ev::MouseEvent; use leptos::prelude::*; use leptos::task::spawn_local; @@ -9,19 +10,24 @@ use md_minutes_generator_ui::handler::drag_drop::drag_drop; use md_minutes_generator_ui::handler::generate::generate; use md_minutes_generator_ui::handler::select_input::select_input; use md_minutes_generator_ui::handler::select_output::select_output; -use md_minutes_generator_ui::handler::setup_output_options; +use md_minutes_generator_ui::handler::settings::get_app_settings; +use md_minutes_generator_ui::handler::{is_date_matched, setup_output_options}; #[component] pub fn App() -> impl IntoView { let toaster = ToasterInjection::expect_context(); let open_settings = RwSignal::new(false); + let language = RwSignal::new(String::new()); + let direct_generation = RwSignal::new(false); let file_path = RwSignal::new(String::new()); let markdown_path = RwSignal::new(String::new()); let worksheet_options = RwSignal::new(Vec::new()); let selected_worksheet = RwSignal::new(None::); + spawn_local(get_app_settings(language, direct_generation)); + // Drag & drop handler spawn_local(drag_drop(file_path)); @@ -41,6 +47,17 @@ pub fn App() -> impl IntoView { selected_worksheet, ) .await; + + if direct_generation.get_untracked() + && is_date_matched(selected_worksheet, Local::now()) + { + spawn_local(generate( + file_path, + markdown_path, + selected_worksheet, + toaster, + )); + } }); } }); @@ -59,12 +76,12 @@ pub fn App() -> impl IntoView { markdown_path, selected_worksheet, toaster, - )) + )); }; view! {
- + diff --git a/src/component/drawer.rs b/src/component/drawer.rs index db3cfdf..9dbbcb1 100644 --- a/src/component/drawer.rs +++ b/src/component/drawer.rs @@ -1,9 +1,32 @@ +use leptos::ev::MouseEvent; +use leptos::leptos_dom::logging::console_log; use leptos::prelude::*; +use leptos::task::spawn_local; use leptos::{view, IntoView}; use thaw::*; +use crate::handler::settings::{reset_app_settings, set_app_settings}; + #[component] -pub fn AppSetting(open_settings: RwSignal) -> impl IntoView { +pub fn AppSetting( + open_settings: RwSignal, + language: RwSignal, + direct_generation: RwSignal, +) -> impl IntoView { + let reset_settings = move |ev: MouseEvent| { + ev.prevent_default(); + spawn_local(reset_app_settings(language, direct_generation)); + }; + + let save_settings = move |ev: MouseEvent| { + ev.prevent_default(); + + // TODO: delete console log after feature finished + console_log(language.get_untracked().as_str()); + + spawn_local(set_app_settings(language, direct_generation)); + }; + view! { @@ -21,15 +44,15 @@ pub fn AppSetting(open_settings: RwSignal) -> impl IntoView {

"Language"

- + + + + +

"Direct Generation"

- +

"Note: " "Turn on Direct Generation will generate markdown at selected output path " @@ -37,8 +60,9 @@ pub fn AppSetting(open_settings: RwSignal) -> impl IntoView { "when worksheet with name matching today's date has been found."

- - + + +
diff --git a/src/handler/mod.rs b/src/handler/mod.rs index ff46756..0c90eee 100644 --- a/src/handler/mod.rs +++ b/src/handler/mod.rs @@ -2,7 +2,9 @@ pub mod drag_drop; pub mod generate; pub mod select_input; pub mod select_output; +pub mod settings; +use chrono::{DateTime, Local}; use js_sys::try_iter; use leptos::prelude::{GetUntracked, RwSignal, Set}; use serde::{Deserialize, Serialize}; @@ -49,6 +51,19 @@ struct Position { y: u32, } +pub fn is_date_matched( + selected_worksheet: RwSignal>, + date: DateTime, +) -> bool { + if let Some(worksheet_name) = selected_worksheet.get_untracked() { + if worksheet_name == date.format("%Y%m%d").to_string() { + return true; + } + } + + false +} + pub async fn setup_output_options( selected_file: &str, markdown_path: RwSignal, diff --git a/src/handler/settings.rs b/src/handler/settings.rs new file mode 100644 index 0000000..c3af427 --- /dev/null +++ b/src/handler/settings.rs @@ -0,0 +1,41 @@ +use leptos::leptos_dom::logging::console_log; +use leptos::prelude::{GetUntracked, RwSignal, Set}; +use serde::{Deserialize, Serialize}; +use serde_wasm_bindgen::{from_value, to_value}; + +use crate::handler::{invoke, invoke_without_args}; + +#[derive(Serialize, Deserialize)] +struct SettingArgs { + language: String, + #[serde(rename(serialize = "directGeneration"))] + direct_generation: bool, +} + +pub async fn get_app_settings(language: RwSignal, direct_generation: RwSignal) { + let js_value = invoke_without_args("get_app_settings").await; + let settings: SettingArgs = from_value(js_value).unwrap(); + + language.set(settings.language); + direct_generation.set(settings.direct_generation); +} + +pub async fn reset_app_settings(language: RwSignal, direct_generation: RwSignal) { + let js_value = invoke_without_args("reset_app_settings").await; + let settings: SettingArgs = from_value(js_value).unwrap(); + + console_log(format!("direct_generation is {}", settings.direct_generation).as_str()); + + language.set(settings.language); + direct_generation.set(settings.direct_generation); +} + +pub async fn set_app_settings(language: RwSignal, direct_generation: RwSignal) { + let args = to_value(&SettingArgs { + language: language.get_untracked(), + direct_generation: direct_generation.get_untracked(), + }) + .unwrap(); + + invoke("set_app_settings", args).await; +} diff --git a/src/main.rs b/src/main.rs index 38d894f..29e3abe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +// leptos_i18n::load_locales!(); + mod app; use leptos::prelude::mount_to_body; @@ -5,16 +7,20 @@ use leptos::*; use thaw::{ConfigProvider, ToasterProvider}; use app::*; +// use i18n::*; fn main() { console_error_panic_hook::set_once(); + mount_to_body(|| { view! { - - - - - + // + + + + + + // } }) } From 5be1c347182c7987e84eafcdc6337bf2f98c781a Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sat, 28 Dec 2024 10:37:21 +0800 Subject: [PATCH 04/15] update dependencies --- Cargo.lock | 188 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 105 insertions(+), 83 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5b78e65..b5b9b40 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -114,9 +114,9 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ "event-listener", "event-listener-strategy", @@ -143,7 +143,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -154,7 +154,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -191,7 +191,7 @@ dependencies = [ "manyhow", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -207,7 +207,7 @@ dependencies = [ "proc-macro2", "quote", "quote-use", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -420,9 +420,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" dependencies = [ "shlex", ] @@ -737,7 +737,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -747,7 +747,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -771,7 +771,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -782,7 +782,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -817,7 +817,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -828,7 +828,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -841,7 +841,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -898,7 +898,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -930,7 +930,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -989,9 +989,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "either_of" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d1e2e7b8b6deaf1ae68f1d8796dec8732cff85d27fdbf4bc4460145a067ed0b" +checksum = "e2dc0006c5cf511f802ddcffc0a6df9dcc1912f5f0e448f6641b3b035f14f43d" dependencies = [ "pin-project-lite", ] @@ -1049,7 +1049,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -1164,7 +1164,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -1249,7 +1249,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -1496,7 +1496,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -1609,7 +1609,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -1938,7 +1938,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -2244,7 +2244,7 @@ dependencies = [ "quote", "rstml", "serde", - "syn 2.0.91", + "syn 2.0.92", "walkdir", ] @@ -2266,7 +2266,7 @@ dependencies = [ "quote", "rstml", "server_fn_macro", - "syn 2.0.91", + "syn 2.0.92", "uuid", ] @@ -2414,7 +2414,7 @@ dependencies = [ "manyhow-macros", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -2661,7 +2661,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -2981,7 +2981,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3160,7 +3160,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3207,7 +3207,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3282,7 +3282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3356,7 +3356,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3393,7 +3393,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "version_check", "yansi", ] @@ -3428,9 +3428,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -3454,7 +3454,7 @@ dependencies = [ "proc-macro-utils", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3590,7 +3590,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3644,9 +3644,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "7fe060fe50f524be480214aba758c71f99f90ee8c83c5a36b5e9e1d568eb4eb3" dependencies = [ "base64 0.22.1", "bytes", @@ -3670,6 +3670,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -3712,7 +3713,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.91", + "syn 2.0.92", "syn_derive", "thiserror 1.0.69", ] @@ -3790,7 +3791,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3845,9 +3846,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -3876,13 +3877,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3893,7 +3894,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3927,7 +3928,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -3953,9 +3954,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", @@ -3971,14 +3972,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -4043,7 +4044,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "xxhash-rust", ] @@ -4054,7 +4055,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a734ef90a83ee9517468b38a017f602a869b382c18e8e8b4118f3f1b88f2856c" dependencies = [ "server_fn_macro", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -4265,9 +4266,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.91" +version = "2.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "70ae51629bf965c5c098cc9e87908a3df5301051a9e087d6f9bef5c9771ed126" dependencies = [ "proc-macro2", "quote", @@ -4283,7 +4284,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -4303,7 +4304,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -4398,7 +4399,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -4497,7 +4498,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "syn 2.0.91", + "syn 2.0.92", "tauri-utils", "thiserror 2.0.9", "time", @@ -4515,7 +4516,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "tauri-codegen", "tauri-utils", ] @@ -4760,7 +4761,7 @@ checksum = "5af50a5123e480e7ee8961e6456f63530816875d0a19cb73060b8e61dd2a95fb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -4810,7 +4811,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -4821,7 +4822,7 @@ checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -4974,6 +4975,27 @@ dependencies = [ "winnow 0.6.20", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -4999,7 +5021,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -5055,7 +5077,7 @@ checksum = "560b82d656506509d43abe30e0ba64c56b1953ab3d4fe7ba5902747a7a3cedd5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -5283,7 +5305,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "wasm-bindgen-shared", ] @@ -5318,7 +5340,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5478,7 +5500,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -5577,7 +5599,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -5588,7 +5610,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -5960,9 +5982,9 @@ dependencies = [ [[package]] name = "xxhash-rust" -version = "0.8.13" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08fd76779ae1883bbf1e46c2c46a75a0c4e37c445e68a24b01479d438f26ae6" +checksum = "d7d48f1b18be023c95e7b75f481cac649d74be7c507ff4a407c55cfb957f7934" [[package]] name = "yansi" @@ -5990,7 +6012,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "synstructure", ] @@ -6033,7 +6055,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "zbus_names", "zvariant", "zvariant_utils", @@ -6069,7 +6091,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -6089,7 +6111,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "synstructure", ] @@ -6112,7 +6134,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -6171,7 +6193,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", "zvariant_utils", ] @@ -6185,6 +6207,6 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.91", + "syn 2.0.92", "winnow 0.6.20", ] From f9cbb4d326bceeab48348f4cf2ff7bb84b19d0e3 Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sat, 28 Dec 2024 10:39:29 +0800 Subject: [PATCH 05/15] update dependencies --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 978e1ca..a71cfbe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -828,7 +828,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -2524,7 +2524,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.91", + "syn 2.0.92", "toml 0.8.19", ] @@ -2543,7 +2543,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "syn 2.0.91", + "syn 2.0.92", "toml 0.8.19", ] @@ -3411,7 +3411,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] @@ -5308,7 +5308,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.92", ] [[package]] From 215b26192e2d30331fd034192e9003e72f360a76 Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sun, 29 Dec 2024 04:55:09 +0800 Subject: [PATCH 06/15] fix json unwrap --- src-tauri/src/command/settings.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/command/settings.rs b/src-tauri/src/command/settings.rs index afe3293..b3dc1de 100644 --- a/src-tauri/src/command/settings.rs +++ b/src-tauri/src/command/settings.rs @@ -21,7 +21,7 @@ pub fn get_app_settings(app_handle: AppHandle) -> AppSettings { .expect("No direct generation setting is found."); AppSettings { - language: language.get("value").unwrap().to_string(), + language: language.get("value").unwrap().as_str().unwrap().to_string(), direct_generation: direct_generation.get("value").unwrap().as_bool().unwrap(), } } @@ -46,7 +46,7 @@ pub fn reset_app_settings(app_handle: AppHandle) -> AppSettings { } #[tauri::command] -pub fn set_app_settings(app_handle: AppHandle, language: String, direct_generation: bool) { +pub fn set_app_settings(app_handle: AppHandle, language: &str, direct_generation: bool) { let store = app_handle.store("store.json").unwrap(); store.set("language", json!({"value": language})); From 55f52aed0c0f991185d6800c354d0f0c68cb141b Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sun, 29 Dec 2024 04:55:56 +0800 Subject: [PATCH 07/15] test Combobox & Select component --- src/component/drawer.rs | 10 ++++++++++ src/handler/settings.rs | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/component/drawer.rs b/src/component/drawer.rs index 9dbbcb1..9aedb8c 100644 --- a/src/component/drawer.rs +++ b/src/component/drawer.rs @@ -13,6 +13,8 @@ pub fn AppSetting( language: RwSignal, direct_generation: RwSignal, ) -> impl IntoView { + console_log(format!("language is set to: {}", language.get_untracked()).as_str()); + let reset_settings = move |ev: MouseEvent| { ev.prevent_default(); spawn_local(reset_app_settings(language, direct_generation)); @@ -27,6 +29,8 @@ pub fn AppSetting( spawn_local(set_app_settings(language, direct_generation)); }; + // let test_language = RwSignal::new(String::from("sc")); + view! { @@ -49,6 +53,12 @@ pub fn AppSetting( + // + //

"Direct Generation"

diff --git a/src/handler/settings.rs b/src/handler/settings.rs index c3af427..3fe8915 100644 --- a/src/handler/settings.rs +++ b/src/handler/settings.rs @@ -18,6 +18,8 @@ pub async fn get_app_settings(language: RwSignal, direct_generation: RwS language.set(settings.language); direct_generation.set(settings.direct_generation); + + console_log(format!("language is set to: {}", language.get_untracked()).as_str()); } pub async fn reset_app_settings(language: RwSignal, direct_generation: RwSignal) { From 42d3b949821273df20248f3e79721b5b704f139a Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sun, 29 Dec 2024 11:57:14 +0800 Subject: [PATCH 08/15] update CHANGELOG --- CHANGELOG | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 86b1062..ff0b0ca 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,10 @@ -# ver. 0.5 - - Add drag & drop support (simply drag-drop input file to the window) +# v0.5.1 + - Add pipeline for package release + - Minor UI adjustment -# ver. 0.4 +# v0.5.0 + - Add drag & drop support (simply drag-drop input file to the App window) + - UI adjustment + +# v0.4.0 - Add basic UI to select input path, output path and worksheet From fac90325f57203220ed256029ee75ead8e88dac6 Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sun, 29 Dec 2024 12:05:08 +0800 Subject: [PATCH 09/15] code refactoring (backend) --- src-tauri/src/command/file.rs | 21 +++++ src-tauri/src/command/mod.rs | 2 + src-tauri/src/command/path.rs | 55 +++++++++++++ src-tauri/src/lib.rs | 81 ++----------------- .../src/{file_process.rs => tool/excel.rs} | 3 +- src-tauri/src/tool/mod.rs | 1 + src/handler/select_input.rs | 2 +- src/handler/select_output.rs | 2 +- src/handler/settings.rs | 2 + 9 files changed, 90 insertions(+), 79 deletions(-) create mode 100644 src-tauri/src/command/file.rs create mode 100644 src-tauri/src/command/path.rs rename src-tauri/src/{file_process.rs => tool/excel.rs} (98%) create mode 100644 src-tauri/src/tool/mod.rs diff --git a/src-tauri/src/command/file.rs b/src-tauri/src/command/file.rs new file mode 100644 index 0000000..cb19b38 --- /dev/null +++ b/src-tauri/src/command/file.rs @@ -0,0 +1,21 @@ +use tauri::AppHandle; + +use crate::tool::excel; + +#[tauri::command] +pub fn generate_markdown(app_handle: AppHandle, input: &str, output: &str, sheet: &str) -> bool { + if output.is_empty() || sheet.is_empty() { + return false; + } + + excel::generate_markdown(app_handle, input, output, sheet).is_ok() +} + +#[tauri::command] +pub fn read_excel(input: &str, _: Option<&str>, _: Option<&str>) -> Vec { + if let Ok(sheet_names) = excel::read_excel(input) { + return sheet_names; + } + + vec![] +} diff --git a/src-tauri/src/command/mod.rs b/src-tauri/src/command/mod.rs index 6e98cef..072128e 100644 --- a/src-tauri/src/command/mod.rs +++ b/src-tauri/src/command/mod.rs @@ -1 +1,3 @@ +pub mod file; +pub mod path; pub mod settings; diff --git a/src-tauri/src/command/path.rs b/src-tauri/src/command/path.rs new file mode 100644 index 0000000..2d4e7a0 --- /dev/null +++ b/src-tauri/src/command/path.rs @@ -0,0 +1,55 @@ +use directories::UserDirs; +use tauri::AppHandle; +use tauri_plugin_dialog::DialogExt; + +#[tauri::command] +pub fn get_desktop_dir() -> String { + if let Some(user_dirs) = UserDirs::new() { + if let Some(desktop_dir) = user_dirs.desktop_dir() { + return desktop_dir + .to_path_buf() + .into_os_string() + .into_string() + .unwrap(); + } + } + + String::new() +} + +#[tauri::command] +pub async fn select_input(app_handle: AppHandle) -> String { + if let Some(user_dirs) = UserDirs::new() { + let file_path = app_handle + .dialog() + .file() + .set_directory(user_dirs.home_dir()) + .add_filter("Excel", &["xlsx", "xls"]) + .blocking_pick_file(); + + return match file_path { + None => String::new(), + Some(file_path) => file_path.to_string(), + }; + }; + + String::new() +} + +#[tauri::command] +pub async fn select_output(app_handle: AppHandle) -> String { + if let Some(user_dirs) = UserDirs::new() { + let file_path = app_handle + .dialog() + .file() + .set_directory(user_dirs.home_dir()) + .blocking_pick_folder(); + + return match file_path { + None => String::new(), + Some(file_path) => file_path.to_string(), + }; + }; + + String::new() +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a726115..0c591ba 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,84 +1,13 @@ mod command; -mod file_process; +mod tool; -use directories::UserDirs; use serde_json::json; -use tauri::AppHandle; -use tauri_plugin_dialog::DialogExt; use tauri_plugin_store::StoreBuilder; +use crate::command::file::*; +use crate::command::path::*; use crate::command::settings::*; -#[tauri::command] -fn get_desktop_dir() -> String { - if let Some(user_dirs) = UserDirs::new() { - if let Some(desktop_dir) = user_dirs.desktop_dir() { - return desktop_dir - .to_path_buf() - .into_os_string() - .into_string() - .unwrap(); - } - } - - String::new() -} - -#[tauri::command] -async fn select_file(app_handle: AppHandle) -> String { - if let Some(user_dirs) = UserDirs::new() { - let file_path = app_handle - .dialog() - .file() - .set_directory(user_dirs.home_dir()) - .add_filter("Excel", &["xlsx", "xls"]) - .blocking_pick_file(); - - return match file_path { - None => String::new(), - Some(file_path) => file_path.to_string(), - }; - }; - - String::new() -} - -#[tauri::command] -async fn select_path(app_handle: AppHandle) -> String { - if let Some(user_dirs) = UserDirs::new() { - let file_path = app_handle - .dialog() - .file() - .set_directory(user_dirs.home_dir()) - .blocking_pick_folder(); - - return match file_path { - None => String::new(), - Some(file_path) => file_path.to_string(), - }; - }; - - String::new() -} - -#[tauri::command] -fn read_excel(input: &str, _: Option<&str>, _: Option<&str>) -> Vec { - if let Ok(sheet_names) = file_process::read_excel(input) { - return sheet_names; - } - - vec![] -} - -#[tauri::command] -fn generate_markdown(app_handle: AppHandle, input: &str, output: &str, sheet: &str) -> bool { - if output.is_empty() || sheet.is_empty() { - return false; - } - - file_process::generate_markdown(app_handle, input, output, sheet).is_ok() -} - #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() @@ -100,8 +29,8 @@ pub fn run() { get_desktop_dir, read_excel, reset_app_settings, - select_file, - select_path, + select_input, + select_output, set_app_settings, ]) .run(tauri::generate_context!()) diff --git a/src-tauri/src/file_process.rs b/src-tauri/src/tool/excel.rs similarity index 98% rename from src-tauri/src/file_process.rs rename to src-tauri/src/tool/excel.rs index 5033edc..3d4e5db 100644 --- a/src-tauri/src/file_process.rs +++ b/src-tauri/src/tool/excel.rs @@ -5,6 +5,7 @@ use std::path::Path; use anyhow::{anyhow, Context}; use calamine::{open_workbook, RangeDeserializerBuilder, Reader, Xlsx}; +use tauri::AppHandle; use tauri_plugin_fs::{FsExt, OpenOptions}; pub fn read_excel(input_path: &str) -> anyhow::Result> { @@ -27,7 +28,7 @@ pub fn read_excel(input_path: &str) -> anyhow::Result> { } pub fn generate_markdown( - app_handle: tauri::AppHandle, + app_handle: AppHandle, input_path: &str, output_path: &str, sheet_name: &str, diff --git a/src-tauri/src/tool/mod.rs b/src-tauri/src/tool/mod.rs new file mode 100644 index 0000000..8bfbeee --- /dev/null +++ b/src-tauri/src/tool/mod.rs @@ -0,0 +1 @@ +pub mod excel; diff --git a/src/handler/select_input.rs b/src/handler/select_input.rs index bd74de3..b1ee61d 100644 --- a/src/handler/select_input.rs +++ b/src/handler/select_input.rs @@ -3,7 +3,7 @@ use leptos::prelude::{RwSignal, Set}; use crate::handler::invoke_without_args; pub async fn select_input(file_path: RwSignal) { - let selected_file = invoke_without_args("select_file") + let selected_file = invoke_without_args("select_input") .await .as_string() .unwrap(); diff --git a/src/handler/select_output.rs b/src/handler/select_output.rs index 1ef4182..030bfaa 100644 --- a/src/handler/select_output.rs +++ b/src/handler/select_output.rs @@ -3,7 +3,7 @@ use leptos::prelude::{RwSignal, Set}; use crate::handler::invoke_without_args; pub async fn select_output(markdown_path: RwSignal) { - let selected_path = invoke_without_args("select_path") + let selected_path = invoke_without_args("select_output") .await .as_string() .unwrap(); diff --git a/src/handler/settings.rs b/src/handler/settings.rs index 3fe8915..91b4a47 100644 --- a/src/handler/settings.rs +++ b/src/handler/settings.rs @@ -19,6 +19,7 @@ pub async fn get_app_settings(language: RwSignal, direct_generation: RwS language.set(settings.language); direct_generation.set(settings.direct_generation); + // TODO: remove console log after feature completed console_log(format!("language is set to: {}", language.get_untracked()).as_str()); } @@ -26,6 +27,7 @@ pub async fn reset_app_settings(language: RwSignal, direct_generation: R let js_value = invoke_without_args("reset_app_settings").await; let settings: SettingArgs = from_value(js_value).unwrap(); + // TODO: remove console log after feature completed console_log(format!("direct_generation is {}", settings.direct_generation).as_str()); language.set(settings.language); From 28911a3a0909e8b4ffd1a77baabf9b68bf4ff7fc Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sun, 29 Dec 2024 13:38:26 +0800 Subject: [PATCH 10/15] code refactoring (frontend) (wip) --- Cargo.toml | 3 ++ src/app.rs | 20 ++++++------ src/component/message_bar.rs | 21 +++++++----- src/handler/drag_drop.rs | 25 +++++++++++++-- src/handler/mod.rs | 39 ++++++++--------------- src/handler/{select_output.rs => path.rs} | 9 ++++++ src/handler/select_input.rs | 12 ------- src/lib.rs | 2 -- src/main.rs | 4 +-- 9 files changed, 73 insertions(+), 62 deletions(-) rename src/handler/{select_output.rs => path.rs} (60%) delete mode 100644 src/handler/select_input.rs delete mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index f8a8edc..a6e51a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,9 @@ version = "0.2.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +path = "src/app.rs" + [dependencies] chrono = "0.4" console_error_panic_hook = "0.1" diff --git a/src/app.rs b/src/app.rs index faf15c0..ca6fdd8 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,17 +1,19 @@ +mod component; +mod handler; + use chrono::Local; use leptos::ev::MouseEvent; use leptos::prelude::*; use leptos::task::spawn_local; use thaw::*; -use md_minutes_generator_ui::component::drawer::AppSetting; -use md_minutes_generator_ui::component::message_bar::FileStatus; -use md_minutes_generator_ui::handler::drag_drop::drag_drop; -use md_minutes_generator_ui::handler::generate::generate; -use md_minutes_generator_ui::handler::select_input::select_input; -use md_minutes_generator_ui::handler::select_output::select_output; -use md_minutes_generator_ui::handler::settings::get_app_settings; -use md_minutes_generator_ui::handler::{is_date_matched, setup_output_options}; +use crate::component::drawer::AppSetting; +use crate::component::message_bar::FileStatus; +use crate::handler::drag_drop::drag_drop; +use crate::handler::generate::generate; +use crate::handler::path::{select_input, select_output}; +use crate::handler::settings::get_app_settings; +use crate::handler::{match_worksheet, setup_output_options, MatchResult}; #[component] pub fn App() -> impl IntoView { @@ -49,7 +51,7 @@ pub fn App() -> impl IntoView { .await; if direct_generation.get_untracked() - && is_date_matched(selected_worksheet, Local::now()) + && match_worksheet(selected_worksheet, Local::now()) == MatchResult::Match { spawn_local(generate( file_path, diff --git a/src/component/message_bar.rs b/src/component/message_bar.rs index d05c81f..f5889ce 100644 --- a/src/component/message_bar.rs +++ b/src/component/message_bar.rs @@ -1,8 +1,11 @@ use chrono::Local; -use leptos::prelude::{Effect, Get, RwSignal, Set}; +use leptos::leptos_dom::logging::console_warn; +use leptos::prelude::{Effect, RwSignal, Set}; use leptos::{component, view, IntoView}; use thaw::{MessageBar, MessageBarBody, MessageBarIntent, MessageBarTitle}; +use crate::handler::{match_worksheet, MatchResult}; + #[component] pub fn FileStatus(selected_worksheet: RwSignal>) -> impl IntoView { let message_intent = RwSignal::new(MessageBarIntent::Info); @@ -11,26 +14,28 @@ pub fn FileStatus(selected_worksheet: RwSignal>) -> impl IntoView "No excel has been found, please select one to proceed.", )); - Effect::new(move || { - if let Some(selected_worksheet) = selected_worksheet.get() { - if selected_worksheet == Local::now().format("%Y%m%d").to_string() { + Effect::new( + move || match match_worksheet(selected_worksheet, Local::now()) { + MatchResult::Match => { message_intent.set(MessageBarIntent::Success); message_title.set(String::from("Date matched")); message_body.set(String::from( "Today's worksheet has been found, you can generate now.", )); - } else { + } + MatchResult::Mismatch => { message_intent.set(MessageBarIntent::Warning); message_title.set(String::from("Date mismatched")); message_body.set(String::from( "No worksheet matches today, please choose one to generate.", )); } - } - }); + MatchResult::WorksheetNotFound => console_warn("No worksheet has been found."), + }, + ); view! { - + {message_title} {message_body} diff --git a/src/handler/drag_drop.rs b/src/handler/drag_drop.rs index 840d793..8b31e76 100644 --- a/src/handler/drag_drop.rs +++ b/src/handler/drag_drop.rs @@ -1,16 +1,35 @@ use leptos::logging; use leptos::prelude::{RwSignal, Set}; +use serde::{Deserialize, Serialize}; use serde_wasm_bindgen::from_value; use wasm_bindgen::closure::Closure; use wasm_bindgen::{JsCast, JsValue}; -use crate::handler::{listen, Object}; +use crate::handler::listen; + +#[derive(Debug, Serialize, Deserialize)] +struct EventData { + id: u32, + event: String, + payload: Payload, +} + +#[derive(Debug, Serialize, Deserialize)] +struct Payload { + paths: Vec, + position: Position, +} + +#[derive(Debug, Serialize, Deserialize)] +struct Position { + x: u32, + y: u32, +} pub async fn drag_drop(file_path: RwSignal) { let closure = Closure::::new(move |js_value: JsValue| { - match from_value::(js_value) { + match from_value::(js_value) { Ok(data) => { - // logging::log!("recv event: {:?}", data); if let Some(path) = data.payload.paths.first() { file_path.set(path.to_owned()); } diff --git a/src/handler/mod.rs b/src/handler/mod.rs index 0c90eee..ea80fb6 100644 --- a/src/handler/mod.rs +++ b/src/handler/mod.rs @@ -1,12 +1,11 @@ pub mod drag_drop; pub mod generate; -pub mod select_input; -pub mod select_output; +pub mod path; pub mod settings; use chrono::{DateTime, Local}; use js_sys::try_iter; -use leptos::prelude::{GetUntracked, RwSignal, Set}; +use leptos::prelude::{Get, GetUntracked, RwSignal, Set}; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::JsValue; @@ -32,36 +31,26 @@ struct FileArgs<'a> { sheet: &'a str, } -#[derive(Debug, Serialize, Deserialize)] -struct Object { - id: u32, - event: String, - payload: Payload, +#[derive(PartialEq)] +pub enum MatchResult { + Match, + Mismatch, + WorksheetNotFound, } -#[derive(Debug, Serialize, Deserialize)] -struct Payload { - paths: Vec, - position: Position, -} - -#[derive(Debug, Serialize, Deserialize)] -struct Position { - x: u32, - y: u32, -} - -pub fn is_date_matched( +pub fn match_worksheet( selected_worksheet: RwSignal>, date: DateTime, -) -> bool { - if let Some(worksheet_name) = selected_worksheet.get_untracked() { +) -> MatchResult { + if let Some(worksheet_name) = selected_worksheet.get() { if worksheet_name == date.format("%Y%m%d").to_string() { - return true; + return MatchResult::Match; } + + return MatchResult::Mismatch; } - false + MatchResult::WorksheetNotFound } pub async fn setup_output_options( diff --git a/src/handler/select_output.rs b/src/handler/path.rs similarity index 60% rename from src/handler/select_output.rs rename to src/handler/path.rs index 030bfaa..95fc62f 100644 --- a/src/handler/select_output.rs +++ b/src/handler/path.rs @@ -2,6 +2,15 @@ use leptos::prelude::{RwSignal, Set}; use crate::handler::invoke_without_args; +pub async fn select_input(file_path: RwSignal) { + let selected_file = invoke_without_args("select_input") + .await + .as_string() + .unwrap(); + + file_path.set(selected_file.to_owned()); +} + pub async fn select_output(markdown_path: RwSignal) { let selected_path = invoke_without_args("select_output") .await diff --git a/src/handler/select_input.rs b/src/handler/select_input.rs deleted file mode 100644 index b1ee61d..0000000 --- a/src/handler/select_input.rs +++ /dev/null @@ -1,12 +0,0 @@ -use leptos::prelude::{RwSignal, Set}; - -use crate::handler::invoke_without_args; - -pub async fn select_input(file_path: RwSignal) { - let selected_file = invoke_without_args("select_input") - .await - .as_string() - .unwrap(); - - file_path.set(selected_file.to_owned()); -} diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 45b9042..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod component; -pub mod handler; diff --git a/src/main.rs b/src/main.rs index 29e3abe..502533c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,11 @@ // leptos_i18n::load_locales!(); -mod app; - use leptos::prelude::mount_to_body; use leptos::*; use thaw::{ConfigProvider, ToasterProvider}; -use app::*; // use i18n::*; +use md_minutes_generator_ui::App; fn main() { console_error_panic_hook::set_once(); From b68ab3290ffc6b0b5c177f9c7547f80b728dec0f Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sun, 29 Dec 2024 20:45:16 +0800 Subject: [PATCH 11/15] code refactoring & UI adjustment --- src-tauri/src/command/file.rs | 11 ++++++--- src/app.rs | 22 +++++++++--------- src/component/message_bar.rs | 6 ++--- src/handler/generate.rs | 35 +++++++++++++---------------- src/handler/mod.rs | 42 ++++++++++++++++++----------------- src/handler/settings.rs | 8 +++---- 6 files changed, 63 insertions(+), 61 deletions(-) diff --git a/src-tauri/src/command/file.rs b/src-tauri/src/command/file.rs index cb19b38..3e228cb 100644 --- a/src-tauri/src/command/file.rs +++ b/src-tauri/src/command/file.rs @@ -3,12 +3,17 @@ use tauri::AppHandle; use crate::tool::excel; #[tauri::command] -pub fn generate_markdown(app_handle: AppHandle, input: &str, output: &str, sheet: &str) -> bool { - if output.is_empty() || sheet.is_empty() { +pub fn generate_markdown( + app_handle: AppHandle, + input: &str, + output: Option<&str>, + sheet: Option<&str>, +) -> bool { + if output.is_none() || sheet.is_none() { return false; } - excel::generate_markdown(app_handle, input, output, sheet).is_ok() + excel::generate_markdown(app_handle, input, output.unwrap(), sheet.unwrap()).is_ok() } #[tauri::command] diff --git a/src/app.rs b/src/app.rs index ca6fdd8..f54110b 100644 --- a/src/app.rs +++ b/src/app.rs @@ -10,10 +10,10 @@ use thaw::*; use crate::component::drawer::AppSetting; use crate::component::message_bar::FileStatus; use crate::handler::drag_drop::drag_drop; -use crate::handler::generate::generate; +use crate::handler::generate::generate_markdown; use crate::handler::path::{select_input, select_output}; use crate::handler::settings::get_app_settings; -use crate::handler::{match_worksheet, setup_output_options, MatchResult}; +use crate::handler::{load_output_options, match_worksheet_name, MatchResult}; #[component] pub fn App() -> impl IntoView { @@ -26,7 +26,7 @@ pub fn App() -> impl IntoView { let file_path = RwSignal::new(String::new()); let markdown_path = RwSignal::new(String::new()); let worksheet_options = RwSignal::new(Vec::new()); - let selected_worksheet = RwSignal::new(None::); + let selected_worksheet = RwSignal::new(String::new()); spawn_local(get_app_settings(language, direct_generation)); @@ -42,8 +42,8 @@ pub fn App() -> impl IntoView { Effect::new(move |_| { if !file_path.get().is_empty() { spawn_local(async move { - setup_output_options( - &file_path.get_untracked(), + load_output_options( + file_path, markdown_path, worksheet_options, selected_worksheet, @@ -51,9 +51,9 @@ pub fn App() -> impl IntoView { .await; if direct_generation.get_untracked() - && match_worksheet(selected_worksheet, Local::now()) == MatchResult::Match + && match_worksheet_name(selected_worksheet, Local::now()) == MatchResult::Match { - spawn_local(generate( + spawn_local(generate_markdown( file_path, markdown_path, selected_worksheet, @@ -73,7 +73,7 @@ pub fn App() -> impl IntoView { // Generate markdown let generate_markdown = move |ev: MouseEvent| { ev.prevent_default(); - spawn_local(generate( + spawn_local(generate_markdown( file_path, markdown_path, selected_worksheet, @@ -127,17 +127,17 @@ pub fn App() -> impl IntoView { - + diff --git a/src/component/message_bar.rs b/src/component/message_bar.rs index f5889ce..fd10c8c 100644 --- a/src/component/message_bar.rs +++ b/src/component/message_bar.rs @@ -4,10 +4,10 @@ use leptos::prelude::{Effect, RwSignal, Set}; use leptos::{component, view, IntoView}; use thaw::{MessageBar, MessageBarBody, MessageBarIntent, MessageBarTitle}; -use crate::handler::{match_worksheet, MatchResult}; +use crate::handler::{match_worksheet_name, MatchResult}; #[component] -pub fn FileStatus(selected_worksheet: RwSignal>) -> impl IntoView { +pub fn FileStatus(selected_worksheet: RwSignal) -> impl IntoView { let message_intent = RwSignal::new(MessageBarIntent::Info); let message_title = RwSignal::new(String::from("Excel not found")); let message_body = RwSignal::new(String::from( @@ -15,7 +15,7 @@ pub fn FileStatus(selected_worksheet: RwSignal>) -> impl IntoView )); Effect::new( - move || match match_worksheet(selected_worksheet, Local::now()) { + move || match match_worksheet_name(selected_worksheet, Local::now()) { MatchResult::Match => { message_intent.set(MessageBarIntent::Success); message_title.set(String::from("Date matched")); diff --git a/src/handler/generate.rs b/src/handler/generate.rs index ccc24e8..33259f8 100644 --- a/src/handler/generate.rs +++ b/src/handler/generate.rs @@ -3,31 +3,26 @@ use thaw::*; use wasm_bindgen::JsValue; use crate::component::toast::dispatch_toast; -use crate::handler::{invoke, FileArgs}; +use crate::handler::{invoke, GenerationOptions}; -pub async fn generate( +pub async fn generate_markdown( file_path: RwSignal, markdown_path: RwSignal, - selected_worksheet: RwSignal>, + selected_worksheet: RwSignal, toaster: ToasterInjection, ) { - let selected_file = file_path.get_untracked(); - let selected_path = markdown_path.get_untracked(); + let args = serde_wasm_bindgen::to_value(&GenerationOptions { + input: file_path.get_untracked(), + output: Some(markdown_path.get_untracked()), + sheet: Some(selected_worksheet.get_untracked()), + }) + .unwrap(); - if let Some(selected_sheet) = selected_worksheet.get_untracked() { - let args = serde_wasm_bindgen::to_value(&FileArgs { - input: selected_file.as_str(), - output: selected_path.as_str(), - sheet: selected_sheet.as_str(), - }) - .unwrap(); + let js_value: JsValue = invoke("generate_markdown", args).await; - let js_value: JsValue = invoke("generate_markdown", args).await; - - if js_value.as_bool().unwrap_or(false) { - dispatch_toast(toaster, ToastIntent::Success); - } else { - dispatch_toast(toaster, ToastIntent::Error); - } - }; + if js_value.as_bool().unwrap_or(false) { + dispatch_toast(toaster, ToastIntent::Success); + } else { + dispatch_toast(toaster, ToastIntent::Error); + } } diff --git a/src/handler/mod.rs b/src/handler/mod.rs index ea80fb6..17cd35a 100644 --- a/src/handler/mod.rs +++ b/src/handler/mod.rs @@ -25,10 +25,10 @@ extern "C" { } #[derive(Serialize, Deserialize)] -struct FileArgs<'a> { - input: &'a str, - output: &'a str, - sheet: &'a str, +struct GenerationOptions { + input: String, + output: Option, + sheet: Option, } #[derive(PartialEq)] @@ -38,26 +38,28 @@ pub enum MatchResult { WorksheetNotFound, } -pub fn match_worksheet( - selected_worksheet: RwSignal>, +pub fn match_worksheet_name( + selected_worksheet: RwSignal, date: DateTime, ) -> MatchResult { - if let Some(worksheet_name) = selected_worksheet.get() { - if worksheet_name == date.format("%Y%m%d").to_string() { - return MatchResult::Match; - } + let selected_worksheet = selected_worksheet.get(); + + if selected_worksheet.is_empty() { + return MatchResult::WorksheetNotFound; + } - return MatchResult::Mismatch; + if selected_worksheet == date.format("%Y%m%d").to_string() { + return MatchResult::Match; } - MatchResult::WorksheetNotFound + MatchResult::Mismatch } -pub async fn setup_output_options( - selected_file: &str, +pub async fn load_output_options( + selected_file: RwSignal, markdown_path: RwSignal, worksheet_options: RwSignal>, - selected_worksheet: RwSignal>, + selected_worksheet: RwSignal, ) { if markdown_path.get_untracked().is_empty() { markdown_path.set( @@ -68,10 +70,10 @@ pub async fn setup_output_options( ); } - let args = serde_wasm_bindgen::to_value(&FileArgs { - input: selected_file, - output: "", - sheet: "", + let args = serde_wasm_bindgen::to_value(&GenerationOptions { + input: selected_file.get_untracked(), + output: None, + sheet: None, }) .unwrap(); let js_value: JsValue = invoke("read_excel", args).await; @@ -82,7 +84,7 @@ pub async fn setup_output_options( .collect(); if let Some(first_option) = options.first() { - selected_worksheet.set(Some(first_option.to_owned())); + selected_worksheet.set(first_option.to_owned()); } worksheet_options.set(options); diff --git a/src/handler/settings.rs b/src/handler/settings.rs index 91b4a47..a2a1aab 100644 --- a/src/handler/settings.rs +++ b/src/handler/settings.rs @@ -6,7 +6,7 @@ use serde_wasm_bindgen::{from_value, to_value}; use crate::handler::{invoke, invoke_without_args}; #[derive(Serialize, Deserialize)] -struct SettingArgs { +struct AppSettings { language: String, #[serde(rename(serialize = "directGeneration"))] direct_generation: bool, @@ -14,7 +14,7 @@ struct SettingArgs { pub async fn get_app_settings(language: RwSignal, direct_generation: RwSignal) { let js_value = invoke_without_args("get_app_settings").await; - let settings: SettingArgs = from_value(js_value).unwrap(); + let settings: AppSettings = from_value(js_value).unwrap(); language.set(settings.language); direct_generation.set(settings.direct_generation); @@ -25,7 +25,7 @@ pub async fn get_app_settings(language: RwSignal, direct_generation: RwS pub async fn reset_app_settings(language: RwSignal, direct_generation: RwSignal) { let js_value = invoke_without_args("reset_app_settings").await; - let settings: SettingArgs = from_value(js_value).unwrap(); + let settings: AppSettings = from_value(js_value).unwrap(); // TODO: remove console log after feature completed console_log(format!("direct_generation is {}", settings.direct_generation).as_str()); @@ -35,7 +35,7 @@ pub async fn reset_app_settings(language: RwSignal, direct_generation: R } pub async fn set_app_settings(language: RwSignal, direct_generation: RwSignal) { - let args = to_value(&SettingArgs { + let args = to_value(&AppSettings { language: language.get_untracked(), direct_generation: direct_generation.get_untracked(), }) From 41b47f54be3434190afd711c31171f20e9f1983f Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Sun, 29 Dec 2024 22:41:09 +0800 Subject: [PATCH 12/15] fix language selector display --- src-tauri/src/command/settings.rs | 18 ++---------------- src/component/drawer.rs | 25 +++++-------------------- src/handler/mod.rs | 14 +++++++------- src/handler/settings.rs | 14 ++------------ 4 files changed, 16 insertions(+), 55 deletions(-) diff --git a/src-tauri/src/command/settings.rs b/src-tauri/src/command/settings.rs index b3dc1de..8173090 100644 --- a/src-tauri/src/command/settings.rs +++ b/src-tauri/src/command/settings.rs @@ -27,22 +27,8 @@ pub fn get_app_settings(app_handle: AppHandle) -> AppSettings { } #[tauri::command] -pub fn reset_app_settings(app_handle: AppHandle) -> AppSettings { - let store = app_handle.store("store.json").unwrap(); - - store.reset(); - - let language = store - .get("language") - .expect("No language setting is found."); - let direct_generation = store - .get("direct_generation") - .expect("No direct generation setting is found."); - - AppSettings { - language: language.get("value").unwrap().to_string(), - direct_generation: direct_generation.get("value").unwrap().as_bool().unwrap(), - } +pub fn reset_app_settings(app_handle: AppHandle) { + app_handle.store("store.json").unwrap().reset(); } #[tauri::command] diff --git a/src/component/drawer.rs b/src/component/drawer.rs index 9aedb8c..0461e6a 100644 --- a/src/component/drawer.rs +++ b/src/component/drawer.rs @@ -1,5 +1,4 @@ use leptos::ev::MouseEvent; -use leptos::leptos_dom::logging::console_log; use leptos::prelude::*; use leptos::task::spawn_local; use leptos::{view, IntoView}; @@ -13,8 +12,6 @@ pub fn AppSetting( language: RwSignal, direct_generation: RwSignal, ) -> impl IntoView { - console_log(format!("language is set to: {}", language.get_untracked()).as_str()); - let reset_settings = move |ev: MouseEvent| { ev.prevent_default(); spawn_local(reset_app_settings(language, direct_generation)); @@ -22,15 +19,9 @@ pub fn AppSetting( let save_settings = move |ev: MouseEvent| { ev.prevent_default(); - - // TODO: delete console log after feature finished - console_log(language.get_untracked().as_str()); - spawn_local(set_app_settings(language, direct_generation)); }; - // let test_language = RwSignal::new(String::from("sc")); - view! { @@ -48,17 +39,11 @@ pub fn AppSetting(

"Language"

- - - - - - // - // +

"Direct Generation"

diff --git a/src/handler/mod.rs b/src/handler/mod.rs index 17cd35a..0108a23 100644 --- a/src/handler/mod.rs +++ b/src/handler/mod.rs @@ -24,13 +24,6 @@ extern "C" { async fn listen(event: &str, handler: &js_sys::Function) -> JsValue; } -#[derive(Serialize, Deserialize)] -struct GenerationOptions { - input: String, - output: Option, - sheet: Option, -} - #[derive(PartialEq)] pub enum MatchResult { Match, @@ -55,6 +48,13 @@ pub fn match_worksheet_name( MatchResult::Mismatch } +#[derive(Serialize, Deserialize)] +struct GenerationOptions { + input: String, + output: Option, + sheet: Option, +} + pub async fn load_output_options( selected_file: RwSignal, markdown_path: RwSignal, diff --git a/src/handler/settings.rs b/src/handler/settings.rs index a2a1aab..4c8fdfc 100644 --- a/src/handler/settings.rs +++ b/src/handler/settings.rs @@ -1,4 +1,3 @@ -use leptos::leptos_dom::logging::console_log; use leptos::prelude::{GetUntracked, RwSignal, Set}; use serde::{Deserialize, Serialize}; use serde_wasm_bindgen::{from_value, to_value}; @@ -18,20 +17,11 @@ pub async fn get_app_settings(language: RwSignal, direct_generation: RwS language.set(settings.language); direct_generation.set(settings.direct_generation); - - // TODO: remove console log after feature completed - console_log(format!("language is set to: {}", language.get_untracked()).as_str()); } pub async fn reset_app_settings(language: RwSignal, direct_generation: RwSignal) { - let js_value = invoke_without_args("reset_app_settings").await; - let settings: AppSettings = from_value(js_value).unwrap(); - - // TODO: remove console log after feature completed - console_log(format!("direct_generation is {}", settings.direct_generation).as_str()); - - language.set(settings.language); - direct_generation.set(settings.direct_generation); + invoke_without_args("reset_app_settings").await; + get_app_settings(language, direct_generation).await; } pub async fn set_app_settings(language: RwSignal, direct_generation: RwSignal) { From ee3c9f2dec74c806e9fff305a809eb8ad19b048a Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Thu, 2 Jan 2025 12:38:38 +0800 Subject: [PATCH 13/15] add app settings & multi languages support --- CHANGELOG | 5 + Cargo.lock | 160 +++++++++++++++---------------- Cargo.toml | 5 +- locales/en.json | 26 ++++- locales/jp.json | 26 ++++- locales/sc.json | 26 ++++- src-tauri/Cargo.toml | 4 +- src-tauri/tauri.conf.json | 2 +- src/app.rs | 152 ------------------------------ src/component/app.rs | 177 +++++++++++++++++++++++++++++++++++ src/component/drawer.rs | 19 ++-- src/component/message_bar.rs | 22 ++--- src/component/mod.rs | 1 + src/component/toast.rs | 17 +++- src/handler/generate.rs | 7 +- src/handler/settings.rs | 13 ++- src/lib.rs | 4 + src/main.rs | 10 +- 18 files changed, 396 insertions(+), 280 deletions(-) delete mode 100644 src/app.rs create mode 100644 src/component/app.rs create mode 100644 src/lib.rs diff --git a/CHANGELOG b/CHANGELOG index ff0b0ca..2b7de22 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +# v0.6.0 + - Add App Settings + - Add EN, JP, CN language support + - UI adjustment + # v0.5.1 - Add pipeline for package release - Minor UI adjustment diff --git a/Cargo.lock b/Cargo.lock index a71cfbe..4f4bc6e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -143,7 +143,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -154,7 +154,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -191,7 +191,7 @@ dependencies = [ "manyhow", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -207,7 +207,7 @@ dependencies = [ "proc-macro2", "quote", "quote-use", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -757,7 +757,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -767,7 +767,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -791,7 +791,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -802,7 +802,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -828,7 +828,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -849,7 +849,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -860,7 +860,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -873,7 +873,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -930,7 +930,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -962,7 +962,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -1081,7 +1081,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -1208,7 +1208,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -1293,7 +1293,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -1540,7 +1540,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -1555,9 +1555,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "gloo-net" @@ -1653,7 +1653,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -2123,7 +2123,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -2482,15 +2482,15 @@ dependencies = [ "quote", "rstml", "serde", - "syn 2.0.92", + "syn 2.0.93", "walkdir", ] [[package]] name = "leptos_i18n" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "787405b03feadebcd9319dea519f9f280745f0717335b9317a01b8b8a3060087" +checksum = "8fc83193d862474f837b09121d2480062b409d3ab75bfbdf0ad9adce4337c2fa" dependencies = [ "codee", "default-struct-builder", @@ -2512,9 +2512,9 @@ dependencies = [ [[package]] name = "leptos_i18n_macro" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e6dc29db91c94ea5b697657bf4c1548918a02fcc5300771eacfb0cf656406e" +checksum = "db1bd1a3667885c59c91555c5a3b689ea755b16bda5d570837b48ef948b6dc85" dependencies = [ "fixed_decimal", "icu_locid", @@ -2524,15 +2524,15 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.92", + "syn 2.0.93", "toml 0.8.19", ] [[package]] name = "leptos_i18n_parser" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f96bfcab8d80d9aa85d585c5f4bc9b509dbf4dec03d0ad6174189b191e2af0e8" +checksum = "a350022bed7810e89926c32f574084cf3dcb20db2b362bffd2b05a8093480835" dependencies = [ "fixed_decimal", "icu_locid", @@ -2543,7 +2543,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "syn 2.0.92", + "syn 2.0.93", "toml 0.8.19", ] @@ -2565,7 +2565,7 @@ dependencies = [ "quote", "rstml", "server_fn_macro", - "syn 2.0.92", + "syn 2.0.93", "uuid", ] @@ -2735,7 +2735,7 @@ dependencies = [ "manyhow-macros", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -2771,7 +2771,7 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "md-minutes-generator" -version = "0.5.1" +version = "0.6.0" dependencies = [ "anyhow", "calamine", @@ -2788,7 +2788,7 @@ dependencies = [ [[package]] name = "md-minutes-generator-ui" -version = "0.2.0" +version = "0.6.0" dependencies = [ "chrono", "console_error_panic_hook", @@ -2985,7 +2985,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -3305,7 +3305,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -3411,7 +3411,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -3529,7 +3529,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -3576,7 +3576,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -3651,7 +3651,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -3725,7 +3725,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -3762,7 +3762,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "version_check", "yansi", ] @@ -3823,7 +3823,7 @@ dependencies = [ "proc-macro-utils", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -3959,7 +3959,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4091,7 +4091,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.92", + "syn 2.0.93", "syn_derive", "thiserror 1.0.69", ] @@ -4169,7 +4169,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4261,7 +4261,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4272,7 +4272,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4306,7 +4306,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4357,7 +4357,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4435,7 +4435,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "xxhash-rust", ] @@ -4446,7 +4446,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a734ef90a83ee9517468b38a017f602a869b382c18e8e8b4118f3f1b88f2856c" dependencies = [ "server_fn_macro", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4657,9 +4657,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.92" +version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ae51629bf965c5c098cc9e87908a3df5301051a9e087d6f9bef5c9771ed126" +checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ "proc-macro2", "quote", @@ -4675,7 +4675,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4695,7 +4695,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4790,7 +4790,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -4889,7 +4889,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "syn 2.0.92", + "syn 2.0.93", "tauri-utils", "thiserror 2.0.9", "time", @@ -4907,7 +4907,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "tauri-codegen", "tauri-utils", ] @@ -5168,7 +5168,7 @@ checksum = "5af50a5123e480e7ee8961e6456f63530816875d0a19cb73060b8e61dd2a95fb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -5218,7 +5218,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -5229,7 +5229,7 @@ checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -5308,7 +5308,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -5440,7 +5440,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -5496,7 +5496,7 @@ checksum = "560b82d656506509d43abe30e0ba64c56b1953ab3d4fe7ba5902747a7a3cedd5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -5736,7 +5736,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "wasm-bindgen-shared", ] @@ -5771,7 +5771,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5931,7 +5931,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -6030,7 +6030,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -6041,7 +6041,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -6413,9 +6413,9 @@ dependencies = [ [[package]] name = "xxhash-rust" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d48f1b18be023c95e7b75f481cac649d74be7c507ff4a407c55cfb957f7934" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" [[package]] name = "yansi" @@ -6443,7 +6443,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "synstructure", ] @@ -6486,7 +6486,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "zbus_names", "zvariant", "zvariant_utils", @@ -6522,7 +6522,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -6542,7 +6542,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "synstructure", ] @@ -6576,7 +6576,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", ] [[package]] @@ -6635,7 +6635,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.92", + "syn 2.0.93", "zvariant_utils", ] @@ -6649,6 +6649,6 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.92", + "syn 2.0.93", "winnow 0.6.20", ] diff --git a/Cargo.toml b/Cargo.toml index a6e51a5..77cb7f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,9 @@ [package] name = "md-minutes-generator-ui" -version = "0.2.0" +version = "0.6.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[lib] -path = "src/app.rs" - [dependencies] chrono = "0.4" console_error_panic_hook = "0.1" diff --git a/locales/en.json b/locales/en.json index 50981ec..4a4d674 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1,3 +1,27 @@ { - "usage_guide": "

Click the button to select your input path
OR
Drag & dropyour file to the App window

" + "usage_guide_1": "Click the button to select your input path", + "or": "OR", + "usage_guide_2": "Drag & drop your file to the App window", + "input_path_button": "Input Path", + "output_path_button": "Output Path", + "generate_button": "Generate", + "input_path_placeholder": "Select input excel path...", + "output_path_placeholder": "Select output markdown path...", + "target_worksheet_placeholder": "Select target worksheet...", + "app_setting_title": "App Settings", + "app_setting_language": "Language", + "app_setting_direct_generation": "Direct Generation", + "app_setting_note": "Note: Turn on Direct Generation will generate markdown at selected output path instantly if any worksheet with name that matching today's date has been found.", + "app_setting_save_button": "Save", + "app_setting_reset_button": "Reset", + "message_bar_title_info": "Excel not found", + "message_bar_body_info": "No excel has been found, please select one to proceed.", + "message_bar_title_success": "Date matched", + "message_bar_body_success": "Today's worksheet has been found, you can generate now.", + "message_bar_title_warning": "Date mismatched", + "message_bar_body_warning": "No worksheet matches today, please choose one to generate.", + "toast_title_success": "Completed!", + "toast_body_success": "Markdown generation succeeded.", + "toast_title_error": "Failed!", + "toast_body_error": "Markdown generation has been cancelled." } diff --git a/locales/jp.json b/locales/jp.json index b96e10a..370be41 100644 --- a/locales/jp.json +++ b/locales/jp.json @@ -1,3 +1,27 @@ { - "usage_guide": "

ボタンをクリックして入力ファイルを選んでください
または
アプリウインドウに入力ファイルをドラッグ&ドロップしてください

" + "usage_guide_1": "ボタンをクリックして入力ファイルを選んでください", + "or": "または", + "usage_guide_2": "入力ファイルをドラッグ&ドロップしてください", + "input_path_button": "入力パス", + "output_path_button": "出力パス", + "generate_button": "作成開始", + "input_path_placeholder": "入力ファイルのパスを選んでください...", + "output_path_placeholder": "出力ファイルのパスを選んでください...", + "target_worksheet_placeholder": "対象ワークシートを選んでください...", + "app_setting_title": "アプリ設定", + "app_setting_language": "言語", + "app_setting_direct_generation": "自動生成", + "app_setting_note": "注意:自動生成をオンにした場合、 本日の日付と一致するワークシートが見つかり次第確認不要でファイルを自動生成します。", + "app_setting_save_button": "保存", + "app_setting_reset_button": "初期化", + "message_bar_title_info": "Excelなし", + "message_bar_body_info": "Excelが見つかりません。入力ファイルを選んでください。", + "message_bar_title_success": "日付一致", + "message_bar_body_success": "本日のワークシートが見つかりました。直接生成可能です。", + "message_bar_title_warning": "日付不一致", + "message_bar_body_warning": "本日のワークシートが見つかりません。生成前にもう一度確認してください。", + "toast_title_success": "生成完了", + "toast_body_success": "Markdownの生成は成功しました。", + "toast_title_error": "生成失敗", + "toast_body_error": "Markdownの生成は取り消されました。" } diff --git a/locales/sc.json b/locales/sc.json index 4c8d156..d348b9f 100644 --- a/locales/sc.json +++ b/locales/sc.json @@ -1,3 +1,27 @@ { - "usage_guide": "

点击按钮选择输入文件路径

直接拖拽文件至应用窗口

" + "usage_guide_1": "点击按钮选择输入文件路径", + "or": "或", + "usage_guide_2": "拖拽输入文件至应用窗口", + "input_path_button": "输入文件", + "output_path_button": "输出文件", + "generate_button": "开始生成", + "input_path_placeholder": "请选择输入文件路径...", + "output_path_placeholder": "请选择输出文件路径...", + "target_worksheet_placeholder": "请选择目标工作表...", + "app_setting_title": "应用设定", + "app_setting_language": "语言", + "app_setting_direct_generation": "自动生成", + "app_setting_note": "注意:打开自动生成选项,将会在发现与今天日期一致的工作表后,无需用户确认立即自动生成文件。", + "app_setting_save_button": "保存", + "app_setting_reset_button": "重置", + "message_bar_title_info": "Excel缺失", + "message_bar_body_info": "未发现Excel文件,请选择文件后继续。", + "message_bar_title_success": "日期一致", + "message_bar_body_success": "发现本日的工作表,可以点击按钮直接生成。", + "message_bar_title_warning": "日期不一致", + "message_bar_body_warning": "未发现本日的工作表,生成前请再次确认对象。", + "toast_title_success": "完成", + "toast_body_success": "Markdown生成成功。", + "toast_title_error": "失败", + "toast_body_error": "Markdown生成已取消。" } diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 36a5146..a3e3503 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "md-minutes-generator" -version = "0.5.1" -description = "A Tauri App" +version = "0.6.0" +description = "Generate mardown meeting minutes from Excel" authors = ["Jaeson Fan - sergefan@live.com"] edition = "2021" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 425923c..bfdca67 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "md-minutes-generator", - "version": "0.5.1", + "version": "0.6.0", "identifier": "com.md-minutes-generator.app", "build": { "beforeDevCommand": "trunk serve", diff --git a/src/app.rs b/src/app.rs deleted file mode 100644 index f54110b..0000000 --- a/src/app.rs +++ /dev/null @@ -1,152 +0,0 @@ -mod component; -mod handler; - -use chrono::Local; -use leptos::ev::MouseEvent; -use leptos::prelude::*; -use leptos::task::spawn_local; -use thaw::*; - -use crate::component::drawer::AppSetting; -use crate::component::message_bar::FileStatus; -use crate::handler::drag_drop::drag_drop; -use crate::handler::generate::generate_markdown; -use crate::handler::path::{select_input, select_output}; -use crate::handler::settings::get_app_settings; -use crate::handler::{load_output_options, match_worksheet_name, MatchResult}; - -#[component] -pub fn App() -> impl IntoView { - let toaster = ToasterInjection::expect_context(); - - let open_settings = RwSignal::new(false); - let language = RwSignal::new(String::new()); - let direct_generation = RwSignal::new(false); - - let file_path = RwSignal::new(String::new()); - let markdown_path = RwSignal::new(String::new()); - let worksheet_options = RwSignal::new(Vec::new()); - let selected_worksheet = RwSignal::new(String::new()); - - spawn_local(get_app_settings(language, direct_generation)); - - // Drag & drop handler - spawn_local(drag_drop(file_path)); - - // File select handler - let select_file = move |ev: MouseEvent| { - ev.prevent_default(); - spawn_local(select_input(file_path)); - }; - - Effect::new(move |_| { - if !file_path.get().is_empty() { - spawn_local(async move { - load_output_options( - file_path, - markdown_path, - worksheet_options, - selected_worksheet, - ) - .await; - - if direct_generation.get_untracked() - && match_worksheet_name(selected_worksheet, Local::now()) == MatchResult::Match - { - spawn_local(generate_markdown( - file_path, - markdown_path, - selected_worksheet, - toaster, - )); - } - }); - } - }); - - // Select output path - let select_path = move |ev: MouseEvent| { - ev.prevent_default(); - spawn_local(select_output(markdown_path)); - }; - - // Generate markdown - let generate_markdown = move |ev: MouseEvent| { - ev.prevent_default(); - spawn_local(generate_markdown( - file_path, - markdown_path, - selected_worksheet, - toaster, - )); - }; - - view! { -
- - - - - - - - - - - - - - - - } - } - /> - - - - - -
- - - - -
- } -} diff --git a/src/component/app.rs b/src/component/app.rs new file mode 100644 index 0000000..224cc3f --- /dev/null +++ b/src/component/app.rs @@ -0,0 +1,177 @@ +use chrono::Local; +use leptos::ev::MouseEvent; +use leptos::prelude::*; +use leptos::task::spawn_local; +use thaw::*; + +use crate::component::drawer::AppSetting; +use crate::component::message_bar::FileStatus; +use crate::handler::drag_drop::drag_drop; +use crate::handler::generate::generate_markdown; +use crate::handler::path::{select_input, select_output}; +use crate::handler::settings::get_app_settings; +use crate::handler::{load_output_options, match_worksheet_name, MatchResult}; +use crate::i18n::*; + +#[component] +pub fn App() -> impl IntoView { + let i18n = use_i18n(); + let toaster = ToasterInjection::expect_context(); + + let open_settings = RwSignal::new(false); + let language = RwSignal::new(String::new()); + let direct_generation = RwSignal::new(false); + + let file_path = RwSignal::new(String::new()); + let markdown_path = RwSignal::new(String::new()); + let worksheet_options = RwSignal::new(Vec::new()); + let selected_worksheet = RwSignal::new(String::new()); + + let settings = LocalResource::new(move || get_app_settings(language, direct_generation)); + + // Drag & drop handler + spawn_local(drag_drop(file_path)); + + // File select handler + let select_file = move |ev: MouseEvent| { + ev.prevent_default(); + spawn_local(select_input(file_path)); + }; + + Effect::new(move |_| { + if !file_path.get().is_empty() { + spawn_local(async move { + load_output_options( + file_path, + markdown_path, + worksheet_options, + selected_worksheet, + ) + .await; + + if direct_generation.get_untracked() + && match_worksheet_name(selected_worksheet, Local::now()) == MatchResult::Match + { + spawn_local(generate_markdown( + file_path, + markdown_path, + selected_worksheet, + i18n, + toaster, + )); + } + }); + } + }); + + // Select output path + let select_path = move |ev: MouseEvent| { + ev.prevent_default(); + spawn_local(select_output(markdown_path)); + }; + + // Generate markdown + let generate_markdown = move |ev: MouseEvent| { + ev.prevent_default(); + spawn_local(generate_markdown( + file_path, + markdown_path, + selected_worksheet, + i18n, + toaster, + )); + }; + + view! { +
+ + {move || {settings.read().as_deref().map(|a| { + match a.language.as_str() { + "en" => i18n.set_locale(Locale::en), + "jp" => i18n.set_locale(Locale::jp), + "sc" => i18n.set_locale(Locale::sc), + _ => i18n.set_locale(Locale::en), + }; + + view! { + + + + + + + + + + + + + + + + } + } + /> + + // + + + + +
+ + + + + } + })}} +
+
+ } +} diff --git a/src/component/drawer.rs b/src/component/drawer.rs index 0461e6a..1de1994 100644 --- a/src/component/drawer.rs +++ b/src/component/drawer.rs @@ -2,9 +2,11 @@ use leptos::ev::MouseEvent; use leptos::prelude::*; use leptos::task::spawn_local; use leptos::{view, IntoView}; +use leptos_i18n::t; use thaw::*; use crate::handler::settings::{reset_app_settings, set_app_settings}; +use crate::i18n::use_i18n; #[component] pub fn AppSetting( @@ -12,6 +14,8 @@ pub fn AppSetting( language: RwSignal, direct_generation: RwSignal, ) -> impl IntoView { + let i18n = use_i18n(); + let reset_settings = move |ev: MouseEvent| { ev.prevent_default(); spawn_local(reset_app_settings(language, direct_generation)); @@ -33,12 +37,12 @@ pub fn AppSetting( on_click=move |_| open_settings.set(false) /> - "App Settings" + {t!(i18n, app_setting_title)}
-

"Language"

+

{t!(i18n, app_setting_language)}

-

"Direct Generation"

+

{t!(i18n, app_setting_direct_generation)}

- "Note: " - "Turn on Direct Generation will generate markdown at selected output path " - "instantly " - "when worksheet with name matching today's date has been found." + {t!(i18n, app_setting_note, = )}

- - + +
diff --git a/src/component/message_bar.rs b/src/component/message_bar.rs index fd10c8c..5353baa 100644 --- a/src/component/message_bar.rs +++ b/src/component/message_bar.rs @@ -2,33 +2,31 @@ use chrono::Local; use leptos::leptos_dom::logging::console_warn; use leptos::prelude::{Effect, RwSignal, Set}; use leptos::{component, view, IntoView}; +use leptos_i18n::t_string; use thaw::{MessageBar, MessageBarBody, MessageBarIntent, MessageBarTitle}; use crate::handler::{match_worksheet_name, MatchResult}; +use crate::i18n::use_i18n; #[component] pub fn FileStatus(selected_worksheet: RwSignal) -> impl IntoView { + let i18n = use_i18n(); + let message_intent = RwSignal::new(MessageBarIntent::Info); - let message_title = RwSignal::new(String::from("Excel not found")); - let message_body = RwSignal::new(String::from( - "No excel has been found, please select one to proceed.", - )); + let message_title = RwSignal::new(t_string!(i18n, message_bar_title_info)); + let message_body = RwSignal::new(t_string!(i18n, message_bar_body_info)); Effect::new( move || match match_worksheet_name(selected_worksheet, Local::now()) { MatchResult::Match => { message_intent.set(MessageBarIntent::Success); - message_title.set(String::from("Date matched")); - message_body.set(String::from( - "Today's worksheet has been found, you can generate now.", - )); + message_title.set(t_string!(i18n, message_bar_title_success)); + message_body.set(t_string!(i18n, message_bar_body_success)); } MatchResult::Mismatch => { message_intent.set(MessageBarIntent::Warning); - message_title.set(String::from("Date mismatched")); - message_body.set(String::from( - "No worksheet matches today, please choose one to generate.", - )); + message_title.set(t_string!(i18n, message_bar_title_warning)); + message_body.set(t_string!(i18n, message_bar_body_warning)); } MatchResult::WorksheetNotFound => console_warn("No worksheet has been found."), }, diff --git a/src/component/mod.rs b/src/component/mod.rs index 59548da..2c4ae97 100644 --- a/src/component/mod.rs +++ b/src/component/mod.rs @@ -1,3 +1,4 @@ +pub mod app; pub mod drawer; pub mod message_bar; pub mod toast; diff --git a/src/component/toast.rs b/src/component/toast.rs index 01bb5f3..07f3265 100644 --- a/src/component/toast.rs +++ b/src/component/toast.rs @@ -1,9 +1,16 @@ use std::time::Duration; use leptos::view; +use leptos_i18n::{t, I18nContext}; use thaw::*; -pub fn dispatch_toast(toaster: ToasterInjection, toast_intent: ToastIntent) { +use crate::i18n::Locale; + +pub fn dispatch_toast( + i18n: I18nContext, + toaster: ToasterInjection, + toast_intent: ToastIntent, +) { let toast_option = ToastOptions::default() .with_intent(toast_intent) .with_position(ToastPosition::Top) @@ -15,8 +22,8 @@ pub fn dispatch_toast(toaster: ToasterInjection, toast_intent: ToastIntent) { move || { view! { - "Completed!" - "Markdown generation succeeded." + {t!(i18n, toast_title_success)} + {t!(i18n, toast_body_success)} } }, @@ -28,8 +35,8 @@ pub fn dispatch_toast(toaster: ToasterInjection, toast_intent: ToastIntent) { move || { view! { - "Failed!" - "Markdown generation has been cancelled." + {t!(i18n, toast_title_error)} + {t!(i18n, toast_body_error)} } }, diff --git a/src/handler/generate.rs b/src/handler/generate.rs index 33259f8..b1827b2 100644 --- a/src/handler/generate.rs +++ b/src/handler/generate.rs @@ -1,14 +1,17 @@ use leptos::prelude::{GetUntracked, RwSignal}; +use leptos_i18n::I18nContext; use thaw::*; use wasm_bindgen::JsValue; use crate::component::toast::dispatch_toast; use crate::handler::{invoke, GenerationOptions}; +use crate::i18n::Locale; pub async fn generate_markdown( file_path: RwSignal, markdown_path: RwSignal, selected_worksheet: RwSignal, + i18n: I18nContext, toaster: ToasterInjection, ) { let args = serde_wasm_bindgen::to_value(&GenerationOptions { @@ -21,8 +24,8 @@ pub async fn generate_markdown( let js_value: JsValue = invoke("generate_markdown", args).await; if js_value.as_bool().unwrap_or(false) { - dispatch_toast(toaster, ToastIntent::Success); + dispatch_toast(i18n, toaster, ToastIntent::Success); } else { - dispatch_toast(toaster, ToastIntent::Error); + dispatch_toast(i18n, toaster, ToastIntent::Error); } } diff --git a/src/handler/settings.rs b/src/handler/settings.rs index 4c8fdfc..f86c0cf 100644 --- a/src/handler/settings.rs +++ b/src/handler/settings.rs @@ -5,18 +5,23 @@ use serde_wasm_bindgen::{from_value, to_value}; use crate::handler::{invoke, invoke_without_args}; #[derive(Serialize, Deserialize)] -struct AppSettings { - language: String, +pub struct AppSettings { + pub(crate) language: String, #[serde(rename(serialize = "directGeneration"))] direct_generation: bool, } -pub async fn get_app_settings(language: RwSignal, direct_generation: RwSignal) { +pub async fn get_app_settings( + language: RwSignal, + direct_generation: RwSignal, +) -> AppSettings { let js_value = invoke_without_args("get_app_settings").await; let settings: AppSettings = from_value(js_value).unwrap(); - language.set(settings.language); + language.set(settings.language.to_owned()); direct_generation.set(settings.direct_generation); + + settings } pub async fn reset_app_settings(language: RwSignal, direct_generation: RwSignal) { diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..1ff1bf4 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,4 @@ +leptos_i18n::load_locales!(); + +pub mod component; +pub mod handler; diff --git a/src/main.rs b/src/main.rs index 502533c..5196d06 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,24 +1,22 @@ -// leptos_i18n::load_locales!(); - use leptos::prelude::mount_to_body; use leptos::*; use thaw::{ConfigProvider, ToasterProvider}; -// use i18n::*; -use md_minutes_generator_ui::App; +use md_minutes_generator_ui::component::app::App; +use md_minutes_generator_ui::i18n::I18nContextProvider; fn main() { console_error_panic_hook::set_once(); mount_to_body(|| { view! { - // + - // + } }) } From 8931f0fda2762ea278795a0853506b540e4c989b Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Thu, 2 Jan 2025 12:40:44 +0800 Subject: [PATCH 14/15] fix typo --- src-tauri/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index a3e3503..4b4ecf6 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "md-minutes-generator" version = "0.6.0" -description = "Generate mardown meeting minutes from Excel" +description = "Generate markdown meeting minutes from Excel" authors = ["Jaeson Fan - sergefan@live.com"] edition = "2021" From 594e5aae1978369d9a881534ce92d3a192411ab9 Mon Sep 17 00:00:00 2001 From: Jaeson Fan Date: Fri, 3 Jan 2025 00:40:06 +0800 Subject: [PATCH 15/15] add confirm dialog --- Cargo.lock | 11 +++++++++ locales/en.json | 6 ++++- locales/jp.json | 6 ++++- locales/sc.json | 6 ++++- src-tauri/Cargo.toml | 1 + src-tauri/capabilities/default.json | 1 + src-tauri/src/command/settings.rs | 3 +++ src-tauri/src/lib.rs | 1 + src/component/dialog.rs | 37 +++++++++++++++++++++++++++++ src/component/drawer.rs | 30 +++++++++++++++++++++-- src/component/mod.rs | 1 + 11 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 src/component/dialog.rs diff --git a/Cargo.lock b/Cargo.lock index 4f4bc6e..df13052 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2782,6 +2782,7 @@ dependencies = [ "tauri-build", "tauri-plugin-dialog", "tauri-plugin-fs", + "tauri-plugin-process", "tauri-plugin-shell", "tauri-plugin-store", ] @@ -4970,6 +4971,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "tauri-plugin-process" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40cc553ab29581c8c43dfa5fb0c9d5aee8ba962ad3b42908eea26c79610441b7" +dependencies = [ + "tauri", + "tauri-plugin", +] + [[package]] name = "tauri-plugin-shell" version = "2.2.0" diff --git a/locales/en.json b/locales/en.json index 4a4d674..c2c3317 100644 --- a/locales/en.json +++ b/locales/en.json @@ -23,5 +23,9 @@ "toast_title_success": "Completed!", "toast_body_success": "Markdown generation succeeded.", "toast_title_error": "Failed!", - "toast_body_error": "Markdown generation has been cancelled." + "toast_body_error": "Markdown generation has been cancelled.", + "dialog_title": "Caution", + "dialog_body": "Manually restart App to apply the settings. Do you want to continue?", + "dialog_button_confirm": "Confirm", + "dialog_button_cancel": "Cancel" } diff --git a/locales/jp.json b/locales/jp.json index 370be41..7e98561 100644 --- a/locales/jp.json +++ b/locales/jp.json @@ -23,5 +23,9 @@ "toast_title_success": "生成完了", "toast_body_success": "Markdownの生成は成功しました。", "toast_title_error": "生成失敗", - "toast_body_error": "Markdownの生成は取り消されました。" + "toast_body_error": "Markdownの生成は取り消されました。", + "dialog_title": "注意", + "dialog_body": "設定を反映するためにマニュアルの再起動が必要です。よろしいでしょうか?", + "dialog_button_confirm": "はい", + "dialog_button_cancel": "いいえ" } diff --git a/locales/sc.json b/locales/sc.json index d348b9f..3612931 100644 --- a/locales/sc.json +++ b/locales/sc.json @@ -23,5 +23,9 @@ "toast_title_success": "完成", "toast_body_success": "Markdown生成成功。", "toast_title_error": "失败", - "toast_body_error": "Markdown生成已取消。" + "toast_body_error": "Markdown生成已取消。", + "dialog_title": "注意", + "dialog_body": "为了反映设定内容需手动重启应用。是否确定?", + "dialog_button_confirm": "是", + "dialog_button_cancel": "否" } diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 4b4ecf6..48eda4e 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -26,5 +26,6 @@ serde_json = "1.0" tauri = { version = "2.1", features = [] } tauri-plugin-dialog = "2.2" tauri-plugin-fs = "2.2" +tauri-plugin-process = "2.2" tauri-plugin-shell = "2.2" tauri-plugin-store = "2.2" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index b616522..53be9c2 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -11,6 +11,7 @@ "dialog:default", "fs:allow-create", "fs:allow-write", + "process:default", "store:default" ] } \ No newline at end of file diff --git a/src-tauri/src/command/settings.rs b/src-tauri/src/command/settings.rs index 8173090..738f3e2 100644 --- a/src-tauri/src/command/settings.rs +++ b/src-tauri/src/command/settings.rs @@ -29,6 +29,7 @@ pub fn get_app_settings(app_handle: AppHandle) -> AppSettings { #[tauri::command] pub fn reset_app_settings(app_handle: AppHandle) { app_handle.store("store.json").unwrap().reset(); + app_handle.exit(0); } #[tauri::command] @@ -37,4 +38,6 @@ pub fn set_app_settings(app_handle: AppHandle, language: &str, direct_generation store.set("language", json!({"value": language})); store.set("direct_generation", json!({"value": direct_generation})); + + app_handle.exit(0); } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 0c591ba..ba9394e 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -13,6 +13,7 @@ pub fn run() { tauri::Builder::default() .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_fs::init()) + .plugin(tauri_plugin_process::init()) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_store::Builder::default().build()) .setup(|app| { diff --git a/src/component/dialog.rs b/src/component/dialog.rs new file mode 100644 index 0000000..a8bc925 --- /dev/null +++ b/src/component/dialog.rs @@ -0,0 +1,37 @@ +use leptos::ev::MouseEvent; +use leptos::prelude::*; +use leptos::{view, IntoView}; +use leptos_i18n::t; +use thaw::*; + +use crate::i18n::use_i18n; + +#[component] +pub fn ApplySettingDialog(open: RwSignal, action: RwSignal) -> impl IntoView { + let i18n = use_i18n(); + + let apply_settings = move |ev: MouseEvent| { + ev.prevent_default(); + open.set(false); + action.set(true); + }; + + view! { + + + + {t!(i18n, dialog_title)} + + {t!(i18n, dialog_body)} + + + + + + + + + + + } +} diff --git a/src/component/drawer.rs b/src/component/drawer.rs index 1de1994..6176f1e 100644 --- a/src/component/drawer.rs +++ b/src/component/drawer.rs @@ -5,9 +5,17 @@ use leptos::{view, IntoView}; use leptos_i18n::t; use thaw::*; +use crate::component::dialog::ApplySettingDialog; use crate::handler::settings::{reset_app_settings, set_app_settings}; use crate::i18n::use_i18n; +#[derive(Clone)] +enum SavePattern { + Save, + Reset, + Cancel, +} + #[component] pub fn AppSetting( open_settings: RwSignal, @@ -16,16 +24,32 @@ pub fn AppSetting( ) -> impl IntoView { let i18n = use_i18n(); + let open_dialog = RwSignal::new(false); + let save_pattern = RwSignal::new(SavePattern::Cancel); + let save_action = RwSignal::new(false); + let reset_settings = move |ev: MouseEvent| { ev.prevent_default(); - spawn_local(reset_app_settings(language, direct_generation)); + open_dialog.set(true); + save_pattern.set(SavePattern::Reset); }; let save_settings = move |ev: MouseEvent| { ev.prevent_default(); - spawn_local(set_app_settings(language, direct_generation)); + open_dialog.set(true); + save_pattern.set(SavePattern::Save); }; + Effect::new(move || { + if save_action.get() { + match save_pattern.get() { + SavePattern::Save => spawn_local(set_app_settings(language, direct_generation)), + SavePattern::Reset => spawn_local(reset_app_settings(language, direct_generation)), + SavePattern::Cancel => {} + } + } + }); + view! { @@ -62,5 +86,7 @@ pub fn AppSetting( + + } } diff --git a/src/component/mod.rs b/src/component/mod.rs index 2c4ae97..797caa8 100644 --- a/src/component/mod.rs +++ b/src/component/mod.rs @@ -1,4 +1,5 @@ pub mod app; +pub mod dialog; pub mod drawer; pub mod message_bar; pub mod toast;