Skip to main content

kimun_notes/components/note_browser/
link_results_provider.rs

1use 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
8/// A provider pre-populated with a fixed list of notes, used when following a
9/// link that resolves to several candidates.  The query is ignored.
10pub 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}