Skip to main content

edc_web_components/pages/
transfer_process_page.rs

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