Order prompts by default (#12268)

Nate Butler created

Prompts in the prompt library will be in A->Z order by default.

Release Notes:

- N/A

Change summary

crates/assistant/src/prompts/prompt_library.rs | 21 ++++++++++++++++++++
crates/assistant/src/prompts/prompt_manager.rs |  4 +-
2 files changed, 23 insertions(+), 2 deletions(-)

Detailed changes

crates/assistant/src/prompts/prompt_library.rs 🔗

@@ -15,6 +15,11 @@ use super::prompt::StaticPrompt;
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize)]
 pub struct PromptId(pub Uuid);
 
+#[derive(Debug, Clone, Copy, Eq, PartialEq)]
+pub enum SortOrder {
+    Alphabetical,
+}
+
 #[allow(unused)]
 impl PromptId {
     pub fn new() -> Self {
@@ -60,6 +65,22 @@ impl PromptLibrary {
             .collect()
     }
 
+    pub fn sorted_prompts(&self, sort_order: SortOrder) -> Vec<(PromptId, StaticPrompt)> {
+        let state = self.state.read();
+
+        let mut prompts = state
+            .prompts
+            .iter()
+            .map(|(id, prompt)| (*id, prompt.clone()))
+            .collect::<Vec<_>>();
+
+        match sort_order {
+            SortOrder::Alphabetical => prompts.sort_by(|(_, a), (_, b)| a.title().cmp(&b.title())),
+        };
+
+        prompts
+    }
+
     pub fn first_prompt_id(&self) -> Option<PromptId> {
         let state = self.state.read();
         state.prompts.keys().next().cloned()

crates/assistant/src/prompts/prompt_manager.rs 🔗

@@ -9,7 +9,7 @@ use ui::{prelude::*, IconButtonShape, ListItem, ListItemSpacing};
 use util::{ResultExt, TryFutureExt};
 use workspace::ModalView;
 
-use super::prompt_library::{PromptId, PromptLibrary};
+use super::prompt_library::{PromptId, PromptLibrary, SortOrder};
 use crate::prompts::prompt::StaticPrompt;
 
 pub struct PromptManager {
@@ -264,7 +264,7 @@ impl PickerDelegate for PromptManagerDelegate {
         let prompt_library = self.prompt_library.clone();
         cx.spawn(|picker, mut cx| async move {
             async {
-                let prompts = prompt_library.prompts();
+                let prompts = prompt_library.sorted_prompts(SortOrder::Alphabetical);
                 let matching_prompts = prompts
                     .into_iter()
                     .filter(|(_, prompt)| {