kimun_notes/components/note_browser/
link_results_provider.rs1use async_trait::async_trait;
2use kimun_core::nfs::NoteEntryData;
3use kimun_core::note::NoteContentData;
4
5use crate::components::file_list::FileListEntry;
6use crate::components::search_list::{Emit, RowSource};
7
8pub struct LinkResultsProvider {
11 entries: Vec<FileListEntry>,
12}
13
14impl LinkResultsProvider {
15 pub fn from_results(results: Vec<(NoteEntryData, NoteContentData)>) -> Self {
16 let entries = results
17 .into_iter()
18 .map(|(entry, content)| {
19 let filename = entry.path.get_parent_path().1;
20 let title = if content.title.trim().is_empty() {
21 "<no title>".to_string()
22 } else {
23 content.title
24 };
25 FileListEntry::Note {
26 path: entry.path,
27 title,
28 filename,
29 journal_date: None,
30 is_open: false,
31 }
32 })
33 .collect();
34 Self { entries }
35 }
36}
37
38#[async_trait]
39impl RowSource<FileListEntry> for LinkResultsProvider {
40 async fn load(&self, query: &str, emit: Emit<FileListEntry>) {
41 if query.is_empty() {
42 emit.replace(self.entries.clone());
43 return;
44 }
45 let q = query.to_lowercase();
46 let entries: Vec<FileListEntry> = self
47 .entries
48 .iter()
49 .filter(|e| match e {
50 FileListEntry::Note {
51 title,
52 filename,
53 path,
54 ..
55 } => {
56 title.to_lowercase().contains(&q)
57 || filename.to_lowercase().contains(&q)
58 || path.to_string().to_lowercase().contains(&q)
59 }
60 _ => false,
61 })
62 .cloned()
63 .collect();
64 emit.replace(entries);
65 }
66}