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 super::NoteBrowserProvider;
6use crate::components::file_list::FileListEntry;
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 }
31 })
32 .collect();
33 Self { entries }
34 }
35}
36
37#[async_trait]
38impl NoteBrowserProvider for LinkResultsProvider {
39 async fn load(&self, query: &str) -> Vec<FileListEntry> {
40 if query.is_empty() {
41 return self.entries.clone();
42 }
43 let q = query.to_lowercase();
44 self.entries
45 .iter()
46 .filter(|e| match e {
47 FileListEntry::Note {
48 title,
49 filename,
50 path,
51 ..
52 } => {
53 title.to_lowercase().contains(&q)
54 || filename.to_lowercase().contains(&q)
55 || path.to_string().to_lowercase().contains(&q)
56 }
57 _ => false,
58 })
59 .cloned()
60 .collect()
61 }
62}