edc_web_components/pages/
transfer_process_page.rs1use crate::components::ListTransferProcesses;
2use crate::contexts::use_edc_connector_context;
3use crate::models::TransferProcessItem;
4use edc_connector_client::types::query::SortOrder;
5use edc_connector_client::{EdcConnectorApiVersion, types::query::Query};
6use patternfly_yew::prelude::*;
7use yew::prelude::*;
8use yew::suspense::use_future_with;
9
10#[derive(Clone, Debug, PartialEq, Properties)]
11pub struct TransferProcessPageProps {
12 #[prop_or("Transfers".to_string())]
13 pub title: String,
14 #[prop_or(None)]
15 pub tag_line: Option<String>,
16 #[prop_or_default]
17 pub contract_agreement_id: Option<String>,
18 #[prop_or_default]
19 pub onshow: Callback<String>,
20}
21
22#[component]
23pub fn TransferProcessPage(props: &TransferProcessPageProps) -> Html {
24 let tag_line = props
25 .tag_line
26 .as_ref()
27 .map(|tag_line| html!(<p>{ tag_line }</p>))
28 .unwrap_or_default();
29
30 let refresh = use_state(|| 0usize);
31 let offset = use_state(|| 0usize);
32 let limit = use_state(|| 10usize);
33
34 let onoffset = use_callback(
35 (refresh.clone(), offset.setter()),
36 |offset, (refresh, offset_setter)| {
37 offset_setter.set(offset);
38 refresh.set(**refresh + 1);
39 },
40 );
41
42 let onlimit = use_callback(
43 (refresh.clone(), limit.setter()),
44 |limit, (refresh, limit_setter)| {
45 limit_setter.set(limit);
46 refresh.set(**refresh + 1);
47 },
48 );
49
50 html!(
51 <Stack gutter=true>
52 <StackItem>
53 <Title level={Level::H3} size={Size::XXLarge}>{ &props.title }</Title>
54 { tag_line }
55 </StackItem>
56 <StackItem>
57 <Suspense>
58 <TransferProcessPageInner
59 offset={*offset}
60 limit={*limit}
61 {onoffset}
62 {onlimit}
63 contract_agreement_id={props.contract_agreement_id.clone()}
64 force_refresh={*refresh}
65 onshow={props.onshow.clone()}
66 />
67 </Suspense>
68 </StackItem>
69 </Stack>
70 )
71}
72
73#[derive(Clone, Debug, PartialEq, Properties)]
74pub struct TransferProcessPageInnerProps {
75 pub offset: usize,
76 pub limit: usize,
77 pub onoffset: Callback<usize>,
78 pub onlimit: Callback<usize>,
79 pub contract_agreement_id: Option<String>,
80 pub force_refresh: usize,
81 pub onshow: Callback<String>,
82}
83
84#[component]
85pub fn TransferProcessPageInner(props: &TransferProcessPageInnerProps) -> HtmlResult {
86 let edc_connector_context = use_edc_connector_context();
87
88 let transfer_processe_items = use_future_with(
89 (
90 edc_connector_context,
91 props.limit,
92 props.offset,
93 props.contract_agreement_id.clone(),
94 props.force_refresh,
95 ),
96 |parameters| async move {
97 let (edc_connector_context, limit, offset, contract_agreement_id, _) = (*parameters).clone();
98
99 let query_builder = Query::builder().limit(limit as u32).offset(offset as u32);
100
101 let query_builder = if let Some(contract_agreement_id) = contract_agreement_id {
102 query_builder.filter("contractId", "=", contract_agreement_id)
103 } else {
104 query_builder
105 };
106
107 let query = query_builder
108 .sort("stateTimestamp", SortOrder::Desc)
109 .build();
110
111 if let Some(client) = edc_connector_context.get_client() {
112 client
113 .transfer_processes(EdcConnectorApiVersion::V4)
114 .query(query)
115 .await
116 .unwrap_or_default()
117 .into_iter()
118 .map(TransferProcessItem::from)
119 .collect::<Vec<_>>()
120 } else {
121 vec![]
122 }
123 },
124 )?;
125
126 let transfer_processe_items = (*transfer_processe_items).clone();
127
128 Ok(html!(
129 <ListTransferProcesses
130 transfer_processe_items={transfer_processe_items}
131 offset={props.offset}
132 limit={props.limit}
133 onoffset={props.onoffset.clone()}
134 onlimit={props.onlimit.clone()}
135 onshow={props.onshow.clone()}
136 />
137 ))
138}