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| { 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 { 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, }, ] }