use crate::models::KnowledgeFile; use dioxus::prelude::*; /// Renders a table row for a knowledge base file. /// /// # Arguments /// /// * `file` - The knowledge file data to render /// * `on_delete` - Callback fired when the delete button is clicked #[component] pub fn FileRow(file: KnowledgeFile, on_delete: EventHandler) -> Element { // Format file size for human readability (Python devs: similar to humanize.naturalsize) let size_display = format_size(file.size_bytes); rsx! { tr { class: "file-row", td { class: "file-row-name", span { class: "file-row-icon", "{file.kind.icon()}" } "{file.name}" } td { "{file.kind.label()}" } td { "{size_display}" } td { "{file.chunk_count} chunks" } td { "{file.uploaded_at}" } td { button { class: "btn-icon btn-danger", onclick: { let id = file.id.clone(); move |_| on_delete.call(id.clone()) }, "Delete" } } } } } /// Formats a byte count into a human-readable string (e.g. "1.2 MB"). fn format_size(bytes: u64) -> String { const KB: u64 = 1024; const MB: u64 = KB * 1024; const GB: u64 = MB * 1024; if bytes >= GB { format!("{:.1} GB", bytes as f64 / GB as f64) } else if bytes >= MB { format!("{:.1} MB", bytes as f64 / MB as f64) } else if bytes >= KB { format!("{:.1} KB", bytes as f64 / KB as f64) } else { format!("{bytes} B") } }