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