Co-authored-by: Sharang Parnerkar <parnerkarsharang@gmail.com> Reviewed-on: #6
55 lines
1.6 KiB
Rust
55 lines
1.6 KiB
Rust
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<String>) -> 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")
|
|
}
|
|
}
|