Lines
0 %
Functions
Branches
100 %
use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;
pub mod autocomplete;
pub mod data_attrs;
pub mod htmx;
pub mod transaction;
pub mod types;
pub use transaction::{add_split_tag, get_split_count, remove_split_tag};
pub use types::*;
#[derive(Serialize, Deserialize)]
pub struct WasmStatus {
loaded: bool,
version: String,
message: String,
}
#[wasm_bindgen]
#[must_use]
pub fn get_wasm_status() -> JsValue {
let status = WasmStatus {
loaded: true,
version: env!("CARGO_PKG_VERSION").to_string(),
message: "WASM module loaded successfully".to_string(),
};
serde_wasm_bindgen::to_value(&status).unwrap()
#[cfg(feature = "auto-init")]
#[wasm_bindgen(start)]
pub fn main() {
console_error_panic_hook::set_once();
register_global_functions();
htmx::setup_htmx_validation();
setup_htmx_listener();
let Some(document) = web_sys::window().and_then(|w| w.document()) else {
return;
if document.ready_state() == "loading" {
let callback = wasm_bindgen::closure::Closure::wrap(Box::new(|| {
autocomplete::init_all();
init_transaction_form();
}) as Box<dyn Fn()>);
let _ = document.add_event_listener_with_callback(
"DOMContentLoaded",
callback.as_ref().unchecked_ref(),
);
callback.forget();
} else {
fn register_global_functions() {
use wasm_bindgen::JsCast;
let Some(window) = web_sys::window() else {
let get_split_count = Closure::wrap(Box::new(get_split_count) as Box<dyn Fn() -> u32>);
let _ = js_sys::Reflect::set(
&window,
&"getSplitCount".into(),
get_split_count.as_ref().unchecked_ref(),
get_split_count.forget();
let add_split_tag = Closure::wrap(Box::new(|el: web_sys::HtmlElement| {
add_split_tag(&el);
}) as Box<dyn Fn(web_sys::HtmlElement)>);
&"addSplitTag".into(),
add_split_tag.as_ref().unchecked_ref(),
add_split_tag.forget();
let remove_split_tag = Closure::wrap(Box::new(|el: web_sys::HtmlElement| {
remove_split_tag(&el);
&"removeSplitTag".into(),
remove_split_tag.as_ref().unchecked_ref(),
remove_split_tag.forget();
fn init_transaction_form() {
let is_transaction_page = document
.query_selector("#splits-container")
.ok()
.flatten()
.is_some();
if is_transaction_page {
transaction::setup_field_validation();
transaction::setup_form_submit_handler();
transaction::setup_split_handlers();
transaction::initialize_transaction_form();
fn setup_htmx_listener() {
let callback = Closure::wrap(Box::new(|_: web_sys::Event| {
}) as Box<dyn FnMut(_)>);
let _ = document
.add_event_listener_with_callback("htmx:afterSwap", callback.as_ref().unchecked_ref());