edc_web_ui/components/
list_transfer_processes.rs1use crate::models::TransferProcessItem;
2use patternfly_yew::prelude::*;
3use std::rc::Rc;
4use yew::prelude::*;
5
6#[derive(Clone, Debug, PartialEq, Properties)]
7pub struct ListTransferProcessesProps {
8 pub transfer_processe_items: Vec<TransferProcessItem>,
9 pub offset: usize,
10 pub limit: usize,
11 pub onoffset: Callback<usize>,
12 pub onlimit: Callback<usize>,
13}
14
15#[component]
16pub fn ListTransferProcesses(props: &ListTransferProcessesProps) -> Html {
17 let header = html_nested! {
18 <TableHeader<Columns>>
19 <TableColumn<Columns> label="ID" index={Columns::Id} />
20 <TableColumn<Columns> label="State" index={Columns::State} />
21 <TableColumn<Columns> label="Asset ID" index={Columns::AssetId} />
22 <TableColumn<Columns> label="Contract ID" index={Columns::ContractId} />
23 <TableColumn<Columns> label="Transfer Type" index={Columns::TransferType} />
24 <TableColumn<Columns> label="Kind" index={Columns::Kind} />
25 </TableHeader<Columns>>
26 };
27
28 let total_entries: Option<usize> = None;
29
30 let nav_callback = use_callback(
31 (
32 props.offset,
33 props.limit,
34 total_entries,
35 props.onoffset.clone(),
36 ),
37 |page: Navigation, (offset, limit, total_entries, onoffset)| {
38 let offset = match page {
39 Navigation::First => 0,
40 Navigation::Last => (total_entries.unwrap_or_default().saturating_sub(1) / limit) * limit,
41 Navigation::Previous => *offset - limit,
42 Navigation::Next => *offset + limit,
43 Navigation::Page(n) => n * limit,
44 };
45 onoffset.emit(offset);
46 },
47 );
48
49 let rows = props
50 .transfer_processe_items
51 .iter()
52 .map(|transfer_process_item| ListTransferProcessRenderer(transfer_process_item.clone()))
53 .collect();
54
55 let (entries, _) = use_table_data(MemoizedTableModel::new(Rc::new(rows)));
56
57 html!(
58 <>
59 <Toolbar>
60 <ToolbarContent>
61 <ToolbarItem r#type={ToolbarItemType::Pagination}>
62 <Pagination
63 offset={props.offset}
64 entries_per_page_choices={vec![5, 10, 25, 50, 100]}
65 selected_choice={props.limit}
66 onlimit={&props.onlimit}
67 onnavigation={&nav_callback}
68 />
69 </ToolbarItem>
70 </ToolbarContent>
71 </Toolbar>
72 <Table<Columns, UseTableData<Columns, MemoizedTableModel<ListTransferProcessRenderer>>>
73 mode={TableMode::Compact}
74 {header}
75 {entries}
76 />
77 </>
78 )
79}
80
81#[derive(Clone, Debug, Eq, PartialEq)]
82enum Columns {
83 Id,
84 State,
85 AssetId,
86 ContractId,
87 TransferType,
88 Kind,
89}
90
91#[derive(Clone, Debug)]
92struct ListTransferProcessRenderer(TransferProcessItem);
93
94impl TableEntryRenderer<Columns> for ListTransferProcessRenderer {
95 fn render_cell(&self, context: CellContext<'_, Columns>) -> Cell {
96 match context.column {
97 Columns::Id => html! { self.0.id.to_string() },
98 Columns::State => html!(self.0.state.to_string()),
99 Columns::AssetId => html!(self.0.asset_id.to_string()),
100 Columns::ContractId => html! { self.0.contract_id.to_string() },
101 Columns::TransferType => html!(self.0.transfer_type.to_string()),
102 Columns::Kind => html!(self.0.kind.to_string()),
103 }
104 .into()
105 }
106}