diff --git a/assets/scss/default_theme/components/_transfer_menu.scss b/assets/scss/default_theme/components/_transfer_menu.scss index b34c4f6..be7ae4f 100644 --- a/assets/scss/default_theme/components/_transfer_menu.scss +++ b/assets/scss/default_theme/components/_transfer_menu.scss @@ -58,4 +58,7 @@ input { &[type="number"] { width: 2em; } + &.volume_input { + width: 4em; + } } diff --git a/src/components/states.rs b/src/components/states.rs index 26ee615..6d02efc 100644 --- a/src/components/states.rs +++ b/src/components/states.rs @@ -9,11 +9,13 @@ use crate::data::transfer::Transfer; #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, Store)] #[store(storage = "session")] +#[non_exhaustive] pub struct CurrentTransfer { pub transfer: Transfer, } #[derive(Default, PartialEq, Clone, Serialize, Deserialize)] +#[non_exhaustive] pub struct MainState { pub source_plates: Vec, pub destination_plates: Vec, diff --git a/src/components/transfer_menu.rs b/src/components/transfer_menu.rs index 54d3ddc..10aad29 100644 --- a/src/components/transfer_menu.rs +++ b/src/components/transfer_menu.rs @@ -134,6 +134,20 @@ pub fn TransferMenu() -> Html { }) }; + let on_volume_change = { + let ct_dispatch = ct_dispatch.clone(); + + Callback::from(move |e: Event| { + let input = e.target().expect("Event must have target") + .dyn_into::().ok().expect("Must have been emitted by input"); + if let Ok(num) = input.value().parse::() { + ct_dispatch.reduce_mut(|state| { + state.transfer.volume = num; + }); + } + }) + }; + let new_transfer_button_callback = { let main_dispatch = main_dispatch.clone(); let main_state = main_state.clone(); @@ -267,6 +281,13 @@ pub fn TransferMenu() -> Html { onchange={on_dest_interleave_y_change} value={ct_state.transfer.transfer_region.interleave_dest.1.to_string()}/> +
+ + +
diff --git a/src/data/csv.rs b/src/data/csv.rs index 749ad05..6cedab9 100644 --- a/src/data/csv.rs +++ b/src/data/csv.rs @@ -16,9 +16,9 @@ struct TransferRecord { #[serde(rename = "Destination Well")] destination_well: String, #[serde(rename = "Volume")] - volume: f64, + volume: f32, #[serde(rename = "Concentration")] - concentration: Option, + concentration: Option, } pub fn state_to_csv(state: &MainState) -> Result> { @@ -62,7 +62,7 @@ fn transfer_to_records( source_well: format!("{}{}", num_to_letters(s_well.0).unwrap(), s_well.1), destination_plate: dest_barcode.to_string(), destination_well: format!("{}{}", num_to_letters(d_well.0).unwrap(), d_well.1), - volume: 2.5, // Default value since not yet implemented + volume: tr.volume, concentration: None, }) } diff --git a/src/data/transfer.rs b/src/data/transfer.rs index f65b36d..d2dcb31 100644 --- a/src/data/transfer.rs +++ b/src/data/transfer.rs @@ -5,12 +5,19 @@ use serde::Serialize; use uuid::Uuid; #[derive(PartialEq, Clone, Default, Debug, Serialize, Deserialize)] +#[non_exhaustive] pub struct Transfer { pub source_id: Uuid, pub dest_id: Uuid, pub name: String, id: Uuid, pub transfer_region: TransferRegion, + #[serde(default = "default_volume")] + pub volume: f32, +} + +fn default_volume() -> f32 { + 2.5f32 } impl Transfer { @@ -26,6 +33,7 @@ impl Transfer { name, id: Uuid::new_v4(), transfer_region: tr, + volume: 2.5, } }