plate-tool/src/components/main_window.rs

115 lines
4.2 KiB
Rust
Raw Normal View History

2023-05-21 16:45:12 +00:00
#![allow(non_snake_case)]
use yew::prelude::*;
2023-05-24 15:42:54 +00:00
use yewdux::prelude::*;
2023-06-05 18:25:47 +00:00
use wasm_bindgen::{JsValue, JsCast};
use web_sys::{Blob, Url, HtmlAnchorElement};
use js_sys::Array;
2023-05-24 15:42:54 +00:00
2023-06-01 17:04:03 +00:00
use super::new_plate_dialog::NewPlateDialog;
2023-05-21 16:45:12 +00:00
use super::plates::plate_container::PlateContainer;
2023-06-01 17:04:03 +00:00
use super::states::{CurrentTransfer, MainState};
2023-05-21 16:45:12 +00:00
use super::transfer_menu::TransferMenu;
2023-06-01 17:04:03 +00:00
use super::tree::Tree;
2023-05-21 16:45:12 +00:00
2023-05-24 15:42:54 +00:00
use crate::data::plate_instances::PlateInstance;
2023-06-05 18:25:47 +00:00
use crate::data::csv::state_to_csv;
2023-05-24 15:42:54 +00:00
#[function_component]
pub fn MainWindow() -> Html {
2023-05-24 15:42:54 +00:00
let (main_state, main_dispatch) = use_store::<MainState>();
2023-05-24 22:39:38 +00:00
let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>();
2023-05-24 15:42:54 +00:00
2023-06-01 17:04:03 +00:00
let source_plate_instance: Option<PlateInstance> = main_state
.source_plates
.iter()
.find(|spi| spi.get_uuid() == main_state.selected_source_plate)
2023-05-24 20:10:33 +00:00
.cloned();
2023-05-24 22:39:38 +00:00
if let Some(spi) = source_plate_instance.clone() {
2023-06-01 17:04:03 +00:00
ct_dispatch.reduce_mut(|state| {
state.transfer.transfer_region.source_plate = spi.plate;
2023-05-24 22:39:38 +00:00
});
}
2023-06-01 17:04:03 +00:00
let destination_plate_instance: Option<PlateInstance> = main_state
.destination_plates
.iter()
.find(|dpi| dpi.get_uuid() == main_state.selected_dest_plate)
2023-05-24 20:10:33 +00:00
.cloned();
2023-05-24 22:39:38 +00:00
if let Some(dpi) = destination_plate_instance.clone() {
2023-06-01 17:04:03 +00:00
ct_dispatch.reduce_mut(|state| {
state.transfer.transfer_region.dest_plate = dpi.plate;
2023-05-24 22:39:38 +00:00
});
}
2023-05-24 15:42:54 +00:00
2023-05-22 22:31:02 +00:00
let new_plate_dialog_is_open = use_state_eq(|| false);
let new_plate_dialog_callback = {
let new_plate_dialog_is_open = new_plate_dialog_is_open.clone();
Callback::from(move |_| {
new_plate_dialog_is_open.set(false);
})
};
let open_new_plate_dialog_callback = {
let new_plate_dialog_is_open = new_plate_dialog_is_open.clone();
Callback::from(move |_| {
new_plate_dialog_is_open.set(true);
})
};
2023-06-05 18:38:29 +00:00
let new_button_callback = {
let main_dispatch = main_dispatch.clone();
let ct_dispatch = ct_dispatch.clone();
Callback::from(move |_| {
let window = web_sys::window().unwrap();
let confirm = window.confirm_with_message("This will reset all plates and transfers. Proceed?");
if let Ok(confirm) = confirm {
if confirm {
main_dispatch.set(MainState::default());
ct_dispatch.set(CurrentTransfer::default());
}
}
})
};
2023-06-05 18:25:47 +00:00
let save_button_callback = {
let main_state = main_state.clone();
Callback::from(move |_| {
if let Ok(csv) = state_to_csv(&main_state) {
let csv: &str = &csv;
let blob = Blob::new_with_str_sequence(
&Array::from_iter(std::iter::once(JsValue::from_str(csv))));
if let Ok(blob) = blob {
let url = Url::create_object_url_with_blob(&blob).expect("We have a blob, why not URL?");
// Beneath is the cool hack to download files
let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let anchor = document.create_element("a").unwrap()
.dyn_into::<HtmlAnchorElement>().unwrap();
anchor.set_download("transfers.csv");
anchor.set_href(&url);
anchor.click();
}
}
})
};
2023-06-01 17:04:03 +00:00
html! {
2023-06-05 18:25:47 +00:00
<>
<div class="upper_menu">
<div class="dropdown">
<button>{"File"}</button>
2023-06-05 18:38:29 +00:00
<button onclick={new_button_callback}>{"New"}</button>
<button onclick={save_button_callback}>{"Export"}</button>
2023-06-05 18:25:47 +00:00
</div>
</div>
<div class="main_container">
2023-05-22 22:31:02 +00:00
<Tree open_new_plate_callback={open_new_plate_dialog_callback}/>
<TransferMenu />
2023-05-24 20:10:33 +00:00
<PlateContainer source_dims={source_plate_instance}
destination_dims={destination_plate_instance}/>
2023-05-22 22:31:02 +00:00
if {*new_plate_dialog_is_open} {
<NewPlateDialog close_callback={new_plate_dialog_callback}/>
}
</div>
2023-06-05 18:25:47 +00:00
</>
}
2023-05-21 16:45:12 +00:00
}