1use std::collections::HashMap;
2use yew::prelude::*;
3
4#[derive(Properties, PartialEq, Clone, Default)]
5pub struct Column {
6 pub id: &'static str,
7 pub header: &'static str,
8 pub accessor: Callback<()>,
9 pub sortable: bool,
10 #[prop_or(100)]
11 pub min_width: u32,
12 #[prop_or_default]
13 pub class: Option<&'static str>,
14 #[prop_or_default]
15 pub style: Option<&'static str>,
16}
17
18#[derive(Clone, PartialEq)]
19pub enum SortOrder {
20 Asc,
21 Desc,
22}
23
24#[derive(Properties, PartialEq, Clone, Default)]
25pub struct TableClasses {
26 #[prop_or("table-container")]
27 pub container: &'static str,
28 #[prop_or("table")]
29 pub table: &'static str,
30 #[prop_or("thead")]
31 pub thead: &'static str,
32 #[prop_or("tbody")]
33 pub tbody: &'static str,
34 #[prop_or("pagination-controls")]
35 pub pagination: &'static str,
36 #[prop_or("search-input")]
37 pub search_input: &'static str,
38}
39
40#[derive(Properties, PartialEq)]
41pub struct TableProps {
42 pub data: Vec<HashMap<&'static str, String>>,
43 pub columns: Vec<Column>,
44 #[prop_or(10)]
45 pub page_size: usize,
46 #[prop_or(false)]
47 pub loading: bool,
48 #[prop_or_default]
49 pub classes: TableClasses,
50 #[prop_or_default]
51 pub styles: HashMap<&'static str, &'static str>,
52 #[prop_or(false)]
53 pub paginate: bool,
54 #[prop_or(false)]
55 pub search: bool,
56}
57
58#[derive(Properties, PartialEq)]
59pub struct HeaderProps {
60 pub columns: Vec<Column>,
61 pub sort_column: UseStateHandle<Option<&'static str>>,
62 pub sort_order: UseStateHandle<SortOrder>,
63 pub on_sort_column: Callback<&'static str>,
64 pub classes: TableClasses,
65}
66
67#[derive(Properties, PartialEq)]
68pub struct TableHeaderProps {
69 pub columns: Vec<Column>,
70 pub sort_column: UseStateHandle<Option<&'static str>>,
71 pub sort_order: UseStateHandle<SortOrder>,
72 pub on_sort_column: Callback<&'static str>,
73 pub classes: TableClasses,
74}
75
76#[derive(Properties, PartialEq)]
77pub struct PaginationControlsProps {
78 pub page: UseStateHandle<usize>,
79 pub total_pages: usize,
80}