diff --git a/plate-tool-lib/src/csv/auto.rs b/plate-tool-lib/src/csv/auto.rs index a35c6ce..3b2da65 100644 --- a/plate-tool-lib/src/csv/auto.rs +++ b/plate-tool-lib/src/csv/auto.rs @@ -24,7 +24,7 @@ const W384_ROW_MAX: u8 = 16; const W1536_COL_MAX: u8 = 48; const W1536_ROW_MAX: u8 = 32; -pub fn auto(records: &Vec) -> AutoOutput { +pub fn auto(records: &[TransferRecord]) -> AutoOutput { let unique_plates = find_unique_plates(records); let transfers = get_transfer_for_all_pairs(records, &unique_plates); diff --git a/plate-tool-web/src/components/callbacks/import_csv_callbacks.rs b/plate-tool-web/src/components/callbacks/import_csv_callbacks.rs index 6d6a08c..a7f15b8 100644 --- a/plate-tool-web/src/components/callbacks/import_csv_callbacks.rs +++ b/plate-tool-web/src/components/callbacks/import_csv_callbacks.rs @@ -1,22 +1,19 @@ use std::collections::HashSet; -use lazy_static::lazy_static; -use regex::Regex; use wasm_bindgen::{prelude::*, JsCast}; use web_sys::{ - FileReader, HtmlButtonElement, HtmlDialogElement, HtmlFormElement, HtmlInputElement, - HtmlOptionElement, HtmlSelectElement, + FileReader, HtmlButtonElement, HtmlDialogElement, HtmlElement, HtmlFormElement, + HtmlInputElement, HtmlOptionElement, HtmlSelectElement, }; use yew::prelude::*; use yewdux::prelude::*; use crate::components::states::MainState; -use plate_tool_lib::util::letters_to_num; use plate_tool_lib::transfer::Transfer; use plate_tool_lib::transfer_region::{Region, TransferRegion}; -use plate_tool_lib::csv::{TransferRecord, string_well_to_pt}; +use plate_tool_lib::csv::{auto, string_well_to_pt, TransferRecord}; use super::main_window_callbacks::create_close_button; @@ -115,6 +112,17 @@ pub fn import_transfer_csv_onload_callback( let window = web_sys::window().unwrap(); let document = window.document().unwrap(); + + let auto_button = document + .create_element("button") + .unwrap() + .dyn_into::() + .unwrap(); + auto_button.set_inner_text("Auto"); + let auto_button_callback = auto_callback(main_dispatch.clone(), &records); + auto_button.set_onclick(Some(auto_button_callback.as_ref().unchecked_ref())); + auto_button_callback.forget(); + let form = document .create_element("form") .unwrap() @@ -211,6 +219,7 @@ pub fn import_transfer_csv_onload_callback( form.append_child(&to_dest).unwrap(); modal.append_child(&submit).unwrap(); modal.append_child(&form).unwrap(); + modal.append_child(&auto_button).unwrap(); } }) } @@ -236,7 +245,7 @@ pub fn import_transfer_csv_submit_callback( .map(|record| { ( string_well_to_pt(&record.source_well).unwrap(), - string_well_to_pt(&record.destination_well).unwrap() + string_well_to_pt(&record.destination_well).unwrap(), ) }) .collect(); @@ -277,3 +286,20 @@ pub fn import_transfer_csv_submit_callback( }); }) } + +fn auto_callback( + main_dispatch: Dispatch, + records: &[TransferRecord], +) -> Closure { + let records = Vec::from(records); + Closure::::new(move |_| { + let res = auto(&records); + main_dispatch.reduce_mut(|state| { + state.source_plates.extend(res.sources.into_iter()); + state + .destination_plates + .extend(res.destinations.into_iter()); + state.transfers.extend(res.transfers.into_iter()); + }); + }) +}