1use std::collections::HashMap;
2use yew::prelude::*;
3
4#[derive(Properties, PartialEq, Clone, Default)]
6pub struct Column {
7 #[prop_or("")]
9 pub id: &'static str,
10
11 #[prop_or("")]
13 pub header: &'static str,
14
15 #[prop_or(Callback::noop())]
17 pub accessor: Callback<()>,
18
19 #[prop_or(false)]
21 pub sortable: bool,
22
23 #[prop_or(100)]
25 pub min_width: u32,
26
27 #[prop_or(Some("padding: 8px; font-weight: 600; text-align: left;"))]
29 pub style: Option<&'static str>,
30
31 #[prop_or(Some("table-header-cell"))]
33 pub class: Option<&'static str>,
34}
35
36#[derive(Clone, PartialEq, Default)]
38pub enum SortOrder {
39 #[default]
41 Asc,
42
43 Desc,
45}
46
47#[derive(Properties, PartialEq, Clone)]
49pub struct TableClasses {
50 #[prop_or("table-container")]
52 pub container: &'static str,
53
54 #[prop_or("table")]
56 pub table: &'static str,
57
58 #[prop_or("thead")]
60 pub thead: &'static str,
61
62 #[prop_or("tbody")]
64 pub tbody: &'static str,
65
66 #[prop_or("pagination-controls")]
68 pub pagination: &'static str,
69
70 #[prop_or("search-input")]
72 pub search_input: &'static str,
73
74 #[prop_or("th")]
76 pub header_cell: &'static str,
77
78 #[prop_or("td")]
80 pub body_cell: &'static str,
81
82 #[prop_or("tr")]
84 pub row: &'static str,
85
86 #[prop_or("loading-row")]
88 pub loading_row: &'static str,
89
90 #[prop_or("empty-row")]
92 pub empty_row: &'static str,
93
94 #[prop_or("pagination-button")]
96 pub pagination_button: &'static str,
97}
98
99impl Default for TableClasses {
100 fn default() -> Self {
101 Self {
102 container: "table-container",
103 table: "table",
104 thead: "thead",
105 tbody: "tbody",
106 pagination: "pagination-controls",
107 search_input: "search-input",
108 header_cell: "th",
109 body_cell: "td",
110 row: "tr",
111 loading_row: "loading-row",
112 empty_row: "empty-row",
113 pagination_button: "pagination-button",
114 }
115 }
116}
117
118#[derive(Properties, PartialEq, Clone)]
120pub struct TableTexts {
121 #[prop_or("Loading...")]
123 pub loading: &'static str,
124
125 #[prop_or("No results found")]
127 pub empty: &'static str,
128
129 #[prop_or("Search...")]
131 pub search_placeholder: &'static str,
132
133 #[prop_or("Previous")]
135 pub previous_button: &'static str,
136
137 #[prop_or("Next")]
139 pub next_button: &'static str,
140
141 #[prop_or("Page {current} of {total}")]
143 pub page_indicator: &'static str,
144}
145
146impl Default for TableTexts {
147 fn default() -> Self {
148 Self {
149 loading: "Loading...",
150 empty: "No results found",
151 search_placeholder: "Search...",
152 previous_button: "Previous",
153 next_button: "Next",
154 page_indicator: "Page {current} of {total}",
155 }
156 }
157}
158
159#[derive(Properties, PartialEq, Clone)]
161pub struct TableProps {
162 #[prop_or_default]
164 pub data: Vec<HashMap<&'static str, String>>,
165
166 #[prop_or_default]
168 pub columns: Vec<Column>,
169
170 #[prop_or(10)]
172 pub page_size: usize,
173
174 #[prop_or(false)]
176 pub loading: bool,
177
178 #[prop_or_default]
180 pub classes: TableClasses,
181
182 #[prop_or_default]
184 pub styles: HashMap<&'static str, &'static str>,
185
186 #[prop_or(false)]
188 pub paginate: bool,
189
190 #[prop_or(false)]
192 pub search: bool,
193
194 #[prop_or_default]
196 pub texts: TableTexts,
197}
198
199#[derive(Properties, PartialEq, Clone)]
201pub struct HeaderProps {
202 #[prop_or_default]
204 pub columns: Vec<Column>,
205
206 pub sort_column: UseStateHandle<Option<&'static str>>,
208
209 pub sort_order: UseStateHandle<SortOrder>,
211
212 #[prop_or(Callback::noop())]
214 pub on_sort_column: Callback<&'static str>,
215
216 #[prop_or_default]
218 pub classes: TableClasses,
219}
220
221#[derive(Properties, PartialEq, Clone)]
223pub struct TableHeaderProps {
224 #[prop_or_default]
226 pub columns: Vec<Column>,
227
228 pub sort_column: UseStateHandle<Option<&'static str>>,
230
231 pub sort_order: UseStateHandle<SortOrder>,
233
234 #[prop_or(Callback::noop())]
236 pub on_sort_column: Callback<&'static str>,
237
238 #[prop_or_default]
240 pub classes: TableClasses,
241}
242
243#[derive(Properties, PartialEq, Clone)]
245pub struct PaginationControlsProps {
246 pub page: UseStateHandle<usize>,
248
249 #[prop_or(1)]
251 pub total_pages: usize,
252
253 #[prop_or_default]
255 pub classes: TableClasses,
256
257 #[prop_or_default]
259 pub texts: TableTexts,
260}
261
262#[derive(Properties, PartialEq, Clone)]
264pub struct TableBodyProps {
265 #[prop_or_default]
267 pub columns: Vec<Column>,
268
269 #[prop_or_default]
271 pub rows: Vec<HashMap<&'static str, String>>,
272
273 #[prop_or(false)]
275 pub loading: bool,
276
277 #[prop_or_default]
279 pub classes: TableClasses,
280
281 #[prop_or_default]
283 pub texts: TableTexts,
284}