Skip to main content

edc_web_ui/components/
list_transfer_processes.rs

1use 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}