From 5778bf947538c3c0b42372e80037afc5904b30cc Mon Sep 17 00:00:00 2001 From: yuvrajjsingh0 Date: Thu, 30 Jan 2025 23:44:19 +0530 Subject: [PATCH] feat: Create Experiments From Overrides --- .../frontend/src/components/context_card.rs | 13 ++++ .../src/components/experiment_form.rs | 19 +++-- crates/frontend/src/pages/context_override.rs | 71 ++++++++++++++++++- crates/frontend/src/pages/experiment.rs | 1 + crates/frontend/src/pages/experiment_list.rs | 1 + 5 files changed, 98 insertions(+), 7 deletions(-) diff --git a/crates/frontend/src/components/context_card.rs b/crates/frontend/src/components/context_card.rs index 7094e1e12..a37e51426 100644 --- a/crates/frontend/src/components/context_card.rs +++ b/crates/frontend/src/components/context_card.rs @@ -15,6 +15,10 @@ pub fn context_card( context: Context, overrides: Map, #[prop(default = true)] show_actions: bool, + #[prop(default=Callback::new(|_| {}))] handle_create_experiment: Callback< + (Context, Map), + (), + >, #[prop(default=Callback::new(|_| {}))] handle_edit: Callback< (Context, Map), (), @@ -65,6 +69,15 @@ pub fn context_card(
+ Vec<(String, VariantFormT)> { +fn default_variants_for_form( + overrides: Vec<(String, Value)>, +) -> Vec<(String, VariantFormT)> { vec![ ( "control-variant".to_string(), VariantFormT { id: "control".to_string(), variant_type: VariantType::CONTROL, - overrides: vec![], + overrides: overrides.clone(), }, ), ( @@ -35,15 +38,18 @@ fn default_variants_for_form() -> Vec<(String, VariantFormT)> { VariantFormT { id: "experimental".to_string(), variant_type: VariantType::EXPERIMENTAL, - overrides: vec![], + overrides: overrides.clone(), }, ), ] } -fn get_init_state(variants: &VariantFormTs) -> Vec<(String, VariantFormT)> { +fn get_init_state( + variants: &[VariantFormT], + overrides: Vec<(String, Value)>, +) -> Vec<(String, VariantFormT)> { let init_variants = if variants.is_empty() { - default_variants_for_form() + default_variants_for_form(overrides) } else { variants .iter() @@ -61,6 +67,7 @@ pub fn experiment_form( name: String, context: Conditions, variants: VariantFormTs, + overrides: Vec<(String, Value)>, handle_submit: NF, default_config: Vec, dimensions: Vec, @@ -70,7 +77,7 @@ pub fn experiment_form( where NF: Fn() + 'static + Clone, { - let init_variants = get_init_state(&variants); + let init_variants = get_init_state(&variants, overrides); let default_config = StoredValue::new(default_config); let tenant_rws = use_context::>().unwrap(); let org_rws = use_context::>().unwrap(); diff --git a/crates/frontend/src/pages/context_override.rs b/crates/frontend/src/pages/context_override.rs index f44f8acba..a4764c8a0 100644 --- a/crates/frontend/src/pages/context_override.rs +++ b/crates/frontend/src/pages/context_override.rs @@ -8,12 +8,12 @@ use superposition_types::{ Config, Context, }; -use crate::components::button::Button; use crate::components::context_card::ContextCard; use crate::components::context_form::utils::{create_context, update_context}; use crate::components::context_form::ContextForm; use crate::components::delete_modal::DeleteModal; use crate::components::drawer::{close_drawer, open_drawer, Drawer, DrawerBtn}; +use crate::components::experiment_form::ExperimentForm; use crate::components::override_form::OverrideForm; use crate::components::skeleton::{Skeleton, SkeletonVariant}; use crate::logic::{Condition, Conditions}; @@ -25,6 +25,7 @@ use crate::{ types::{OrganisationId, Tenant}, }; use crate::{components::alert::AlertType, schema::SchemaType}; +use crate::{components::button::Button, types::VariantFormTs}; #[derive(Clone, Debug, Default)] pub struct Data { @@ -277,6 +278,32 @@ pub fn context_override() -> impl IntoView { } }; }); + let handle_submit_experiment_form = move || { + page_resource.refetch(); + close_drawer("create_exp_drawer"); + }; + + let handle_create_experiment = + Callback::new(move |data: (Context, Map)| { + let (context, overrides) = data; + + match Conditions::from_context_json(&context.condition.into()) { + Ok(conditions) => { + selected_context_ws.set(Some(Data { + context: conditions, + overrides: overrides + .into_iter() + .collect::>(), + })); + + open_drawer("create_exp_drawer"); + } + Err(e) => { + logging::error!("Error parsing context: {}", e); + enqueue_alert(e.to_string(), AlertType::Error, 5000); + } + }; + }); let on_context_clone = Callback::new(move |data: (Context, Map)| { let (context, overrides) = data; @@ -342,6 +369,47 @@ pub fn context_override() -> impl IntoView { }>
+ {move || { + let PageResource { config: _, dimensions, default_config } = page_resource + .get() + .unwrap_or_default(); + let data = selected_context_rs.get(); + view! { + + + + {match data { + Some(data) => { + view! { + + } + .into_view() + } + None => { + view! {}.into_view() + } + }} + + + + } + }} + {move || { let PageResource { config: _, dimensions, default_config } = page_resource .get() @@ -450,6 +518,7 @@ pub fn context_override() -> impl IntoView { impl IntoView { id=experiment.id name=experiment_ef.name context=experiment_ef.context.clone() + overrides=vec![] variants=FromIterator::from_iter(experiment_ef.variants) default_config=default_config dimensions=dimensions diff --git a/crates/frontend/src/pages/experiment_list.rs b/crates/frontend/src/pages/experiment_list.rs index bb1faccf5..ae90beead 100644 --- a/crates/frontend/src/pages/experiment_list.rs +++ b/crates/frontend/src/pages/experiment_list.rs @@ -233,6 +233,7 @@ pub fn experiment_list() -> impl IntoView { name="".to_string() context=Conditions::default() variants=VariantFormTs::default() + overrides=vec![] dimensions=dim.clone() default_config=def_conf.clone() handle_submit=handle_submit_experiment_form