diff --git a/app/src/settings_view/platform/create_api_key_modal.rs b/app/src/settings_view/platform/create_api_key_modal.rs index 42cc6d71520..952426ddb52 100644 --- a/app/src/settings_view/platform/create_api_key_modal.rs +++ b/app/src/settings_view/platform/create_api_key_modal.rs @@ -308,6 +308,13 @@ impl CreateApiKeyModal { } fn populate_agent_dropdown(&mut self, ctx: &mut ViewContext) { + if self.selected_agent_uid.is_none() { + self.selected_agent_uid = self + .agents + .iter() + .find(|agent| agent.available) + .map(|agent| agent.uid.clone()); + } let items: Vec> = self .agents .iter() @@ -321,6 +328,12 @@ impl CreateApiKeyModal { .collect(); self.agent_dropdown.update(ctx, |dropdown, ctx| { dropdown.set_items(items, ctx); + if let Some(selected_agent_uid) = &self.selected_agent_uid { + dropdown.set_selected_by_action( + CreateApiKeyModalAction::SelectAgent(selected_agent_uid.clone()), + ctx, + ); + } }); } @@ -431,6 +444,9 @@ impl CreateApiKeyModal { self.raw_key_copied = false; self.raw_key = None; self.selected_agent_uid = None; + self.agent_dropdown.update(ctx, |dropdown, ctx| { + dropdown.clear_filter(ctx); + }); self.name_editor.update(ctx, |editor, ctx| { editor.clear_buffer_and_reset_undo_stack(ctx); }); @@ -480,6 +496,11 @@ impl CreateApiKeyModal { } } + fn is_create_disabled(&self, selected_key_type: ApiKeyType) -> bool { + self.request_state == RequestState::Pending + || (selected_key_type == ApiKeyType::Agent + && (self.selected_agent_uid.is_none() || self.is_loading_agents)) + } fn render_success_content(&self, app: &AppContext) -> Box { let appearance = Appearance::as_ref(app); let theme = appearance.theme(); @@ -651,10 +672,7 @@ impl View for CreateApiKeyModal { .finish(); let is_pending = self.request_state == RequestState::Pending; - - let is_create_disabled = is_pending - || (selected_key_type == ApiKeyType::Agent - && (self.selected_agent_uid.is_none() || self.is_loading_agents)); + let is_create_disabled = self.is_create_disabled(selected_key_type); let mut cancel_button_hover = appearance .ui_builder() diff --git a/app/src/settings_view/platform/create_api_key_modal_tests.rs b/app/src/settings_view/platform/create_api_key_modal_tests.rs index aed0cb9d943..6aa2933029a 100644 --- a/app/src/settings_view/platform/create_api_key_modal_tests.rs +++ b/app/src/settings_view/platform/create_api_key_modal_tests.rs @@ -3,7 +3,7 @@ use warp_server_client::auth::AgentIdentity; use warpui::App; use warpui::platform::WindowStyle; -use super::CreateApiKeyModal; +use super::{ApiKeyType, CreateApiKeyModal}; use crate::auth::AuthStateProvider; use crate::server::telemetry::context_provider::AppTelemetryContextProvider; use crate::settings_view::keybindings::KeybindingChangedNotifier; @@ -105,3 +105,59 @@ fn test_agent_dropdown_is_searchable() { assert_eq!(restored, 3); }) } + +#[test] +fn default_agent_selection_is_restored_after_modal_reset() { + App::test((), |mut app| async move { + initialize_settings_for_tests(&mut app); + app.add_singleton_model(|_| AuthStateProvider::new_for_test()); + app.add_singleton_model(AppTelemetryContextProvider::new_context_provider); + app.add_singleton_model(|_| Appearance::mock()); + app.add_singleton_model(|_| SyncedInputState::mock()); + app.add_singleton_model(|_| VimRegisters::new()); + app.add_singleton_model(|_| KeybindingChangedNotifier::mock()); + app.add_singleton_model(UserWorkspaces::default_mock); + + let (_, view) = app.add_window(WindowStyle::NotStealFocus, CreateApiKeyModal::new); + + view.update(&mut app, |modal, ctx| { + modal.set_agents_for_test( + vec![ + agent("1", "Default Service Account", true), + agent("2", "Ben's Agent", true), + ], + ctx, + ); + modal.agent_dropdown.update(ctx, |dropdown, ctx| { + dropdown.set_filter_query_for_test("Ben", ctx); + }); + }); + + view.read(&app, |modal, ctx| { + assert_eq!( + modal.agent_dropdown.as_ref(ctx).selected_item_label(), + Some("Ben's Agent".to_string()) + ); + }); + + view.update(&mut app, |modal, ctx| { + modal.on_close(ctx); + modal.set_agents_for_test( + vec![ + agent("1", "Default Service Account", true), + agent("2", "Ben's Agent", true), + ], + ctx, + ); + }); + + view.read(&app, |modal, ctx| { + assert_eq!(modal.selected_agent_uid.as_deref(), Some("1")); + assert_eq!( + modal.agent_dropdown.as_ref(ctx).selected_item_label(), + Some("Default Service Account".to_string()) + ); + assert!(!modal.is_create_disabled(ApiKeyType::Agent)); + }); + }) +}