Co-authored-by: Sharang Parnerkar <parnerkarsharang@gmail.com> Reviewed-on: #6
125 lines
3.9 KiB
Rust
125 lines
3.9 KiB
Rust
use dioxus::prelude::*;
|
|
|
|
use crate::components::{FileRow, PageHeader};
|
|
use crate::models::{FileKind, KnowledgeFile};
|
|
|
|
/// Knowledge Base page with file explorer table and upload controls.
|
|
///
|
|
/// Displays uploaded documents used for RAG retrieval with their
|
|
/// metadata, chunk counts, and management actions.
|
|
#[component]
|
|
pub fn KnowledgePage() -> Element {
|
|
let mut files = use_signal(mock_files);
|
|
let mut search_query = use_signal(String::new);
|
|
|
|
// Filter files by search query (case-insensitive name match)
|
|
let query = search_query.read().to_lowercase();
|
|
let filtered: Vec<_> = files
|
|
.read()
|
|
.iter()
|
|
.filter(|f| query.is_empty() || f.name.to_lowercase().contains(&query))
|
|
.cloned()
|
|
.collect();
|
|
|
|
// Remove a file by ID
|
|
let on_delete = move |id: String| {
|
|
files.write().retain(|f| f.id != id);
|
|
};
|
|
|
|
rsx! {
|
|
section { class: "knowledge-page",
|
|
PageHeader {
|
|
title: "Knowledge Base".to_string(),
|
|
subtitle: "Manage documents for RAG retrieval".to_string(),
|
|
actions: rsx! {
|
|
button { class: "btn-primary", "Upload File" }
|
|
},
|
|
}
|
|
div { class: "knowledge-toolbar",
|
|
input {
|
|
class: "form-input knowledge-search",
|
|
r#type: "text",
|
|
placeholder: "Search files...",
|
|
value: "{search_query}",
|
|
oninput: move |evt: Event<FormData>| {
|
|
search_query.set(evt.value());
|
|
},
|
|
}
|
|
}
|
|
div { class: "knowledge-table-wrapper",
|
|
table { class: "knowledge-table",
|
|
thead {
|
|
tr {
|
|
th { "Name" }
|
|
th { "Type" }
|
|
th { "Size" }
|
|
th { "Chunks" }
|
|
th { "Uploaded" }
|
|
th { "Actions" }
|
|
}
|
|
}
|
|
tbody {
|
|
for file in filtered {
|
|
FileRow { key: "{file.id}", file, on_delete }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Returns mock knowledge base files.
|
|
fn mock_files() -> Vec<KnowledgeFile> {
|
|
vec![
|
|
KnowledgeFile {
|
|
id: "f1".into(),
|
|
name: "company-handbook.pdf".into(),
|
|
kind: FileKind::Pdf,
|
|
size_bytes: 2_450_000,
|
|
uploaded_at: "2026-02-15".into(),
|
|
chunk_count: 142,
|
|
},
|
|
KnowledgeFile {
|
|
id: "f2".into(),
|
|
name: "api-reference.md".into(),
|
|
kind: FileKind::Text,
|
|
size_bytes: 89_000,
|
|
uploaded_at: "2026-02-14".into(),
|
|
chunk_count: 34,
|
|
},
|
|
KnowledgeFile {
|
|
id: "f3".into(),
|
|
name: "sales-data-q4.csv".into(),
|
|
kind: FileKind::Spreadsheet,
|
|
size_bytes: 1_200_000,
|
|
uploaded_at: "2026-02-12".into(),
|
|
chunk_count: 67,
|
|
},
|
|
KnowledgeFile {
|
|
id: "f4".into(),
|
|
name: "deployment-guide.pdf".into(),
|
|
kind: FileKind::Pdf,
|
|
size_bytes: 540_000,
|
|
uploaded_at: "2026-02-10".into(),
|
|
chunk_count: 28,
|
|
},
|
|
KnowledgeFile {
|
|
id: "f5".into(),
|
|
name: "onboarding-checklist.md".into(),
|
|
kind: FileKind::Text,
|
|
size_bytes: 12_000,
|
|
uploaded_at: "2026-02-08".into(),
|
|
chunk_count: 8,
|
|
},
|
|
KnowledgeFile {
|
|
id: "f6".into(),
|
|
name: "architecture-diagram.png".into(),
|
|
kind: FileKind::Image,
|
|
size_bytes: 3_800_000,
|
|
uploaded_at: "2026-02-05".into(),
|
|
chunk_count: 1,
|
|
},
|
|
]
|
|
}
|