use std::collections::HashMap;
use yew::prelude::*;
#[derive(Properties, PartialEq, Clone, Default)]
pub struct Column {
#[prop_or("")]
pub id: &'static str,
#[prop_or("")]
pub header: &'static str,
#[prop_or(Callback::noop())]
pub accessor: Callback<()>,
#[prop_or(false)]
pub sortable: bool,
#[prop_or(100)]
pub min_width: u32,
#[prop_or(Some("padding: 8px; font-weight: 600; text-align: left;"))]
pub style: Option<&'static str>,
#[prop_or(Some("table-header-cell"))]
pub class: Option<&'static str>,
}
#[derive(Clone, PartialEq, Default)]
pub enum SortOrder {
#[default]
Asc,
Desc,
}
#[derive(Properties, PartialEq, Clone)]
pub struct TableClasses {
#[prop_or("table-container")]
pub container: &'static str,
#[prop_or("table")]
pub table: &'static str,
#[prop_or("thead")]
pub thead: &'static str,
#[prop_or("tbody")]
pub tbody: &'static str,
#[prop_or("pagination-controls")]
pub pagination: &'static str,
#[prop_or("search-input")]
pub search_input: &'static str,
#[prop_or("th")]
pub header_cell: &'static str,
#[prop_or("td")]
pub body_cell: &'static str,
#[prop_or("tr")]
pub row: &'static str,
#[prop_or("loading-row")]
pub loading_row: &'static str,
#[prop_or("empty-row")]
pub empty_row: &'static str,
#[prop_or("pagination-button")]
pub pagination_button: &'static str,
}
impl Default for TableClasses {
fn default() -> Self {
Self {
container: "table-container",
table: "table",
thead: "thead",
tbody: "tbody",
pagination: "pagination-controls",
search_input: "search-input",
header_cell: "th",
body_cell: "td",
row: "tr",
loading_row: "loading-row",
empty_row: "empty-row",
pagination_button: "pagination-button",
}
}
}
#[derive(Properties, PartialEq, Clone)]
pub struct TableTexts {
#[prop_or("Loading...")]
pub loading: &'static str,
#[prop_or("No results found")]
pub empty: &'static str,
#[prop_or("Search...")]
pub search_placeholder: &'static str,
#[prop_or("Previous")]
pub previous_button: &'static str,
#[prop_or("Next")]
pub next_button: &'static str,
#[prop_or("Page {current} of {total}")]
pub page_indicator: &'static str,
}
impl Default for TableTexts {
fn default() -> Self {
Self {
loading: "Loading...",
empty: "No results found",
search_placeholder: "Search...",
previous_button: "Previous",
next_button: "Next",
page_indicator: "Page {current} of {total}",
}
}
}
#[derive(Properties, PartialEq, Clone)]
pub struct TableProps {
#[prop_or_default]
pub data: Vec<HashMap<&'static str, String>>,
#[prop_or_default]
pub columns: Vec<Column>,
#[prop_or(10)]
pub page_size: usize,
#[prop_or(false)]
pub loading: bool,
#[prop_or_default]
pub classes: TableClasses,
#[prop_or_default]
pub styles: HashMap<&'static str, &'static str>,
#[prop_or(false)]
pub paginate: bool,
#[prop_or(false)]
pub search: bool,
#[prop_or_default]
pub texts: TableTexts,
}
#[derive(Properties, PartialEq, Clone)]
pub struct HeaderProps {
#[prop_or_default]
pub columns: Vec<Column>,
pub sort_column: UseStateHandle<Option<&'static str>>,
pub sort_order: UseStateHandle<SortOrder>,
#[prop_or(Callback::noop())]
pub on_sort_column: Callback<&'static str>,
#[prop_or_default]
pub classes: TableClasses,
}
#[derive(Properties, PartialEq, Clone)]
pub struct TableHeaderProps {
#[prop_or_default]
pub columns: Vec<Column>,
pub sort_column: UseStateHandle<Option<&'static str>>,
pub sort_order: UseStateHandle<SortOrder>,
#[prop_or(Callback::noop())]
pub on_sort_column: Callback<&'static str>,
#[prop_or_default]
pub classes: TableClasses,
}
#[derive(Properties, PartialEq, Clone)]
pub struct PaginationControlsProps {
pub page: UseStateHandle<usize>,
#[prop_or(1)]
pub total_pages: usize,
#[prop_or_default]
pub classes: TableClasses,
#[prop_or_default]
pub texts: TableTexts,
}
#[derive(Properties, PartialEq, Clone)]
pub struct TableBodyProps {
#[prop_or_default]
pub columns: Vec<Column>,
#[prop_or_default]
pub rows: Vec<HashMap<&'static str, String>>,
#[prop_or(false)]
pub loading: bool,
#[prop_or_default]
pub classes: TableClasses,
#[prop_or_default]
pub texts: TableTexts,
}