Skip to main content

edc_web_components/pages/
contract_agreement_page.rs

1use crate::components::ListContractAgreements;
2use crate::contexts::use_edc_connector_context;
3use crate::models::ContractAgreementItem;
4use edc_connector_client::EdcConnectorApiVersion;
5use edc_connector_client::types::query::{Query, SortOrder};
6use patternfly_yew::prelude::*;
7use yew::prelude::*;
8use yew::suspense::use_future_with;
9
10#[derive(Clone, Debug, PartialEq, Properties)]
11pub struct ContractAgreementPageProps {
12  #[prop_or_default]
13  pub onshow: Callback<String>,
14  #[prop_or("List Contract Agreements".to_string())]
15  pub title: String,
16  #[prop_or(Some("A contract agreement is the finalized, legally binding contract signed between parties after successful negotiation.".to_string()))]
17  pub tag_line: Option<String>,
18}
19
20#[component]
21pub fn ContractAgreementPage(props: &ContractAgreementPageProps) -> Html {
22  let refresh = use_state(|| 0usize);
23  let offset = use_state(|| 0usize);
24  let limit = use_state(|| 10usize);
25
26  let onoffset = use_callback(
27    (refresh.clone(), offset.setter()),
28    |offset, (refresh, offset_setter)| {
29      offset_setter.set(offset);
30      refresh.set(**refresh + 1);
31    },
32  );
33
34  let onlimit = use_callback(
35    (refresh.clone(), limit.setter()),
36    |limit, (refresh, limit_setter)| {
37      limit_setter.set(limit);
38      refresh.set(**refresh + 1);
39    },
40  );
41
42  let tag_line = props
43    .tag_line
44    .as_ref()
45    .map(|tag_line| html!(<p>{ tag_line }</p>))
46    .unwrap_or_default();
47
48  html!(
49    <Stack gutter=true>
50      <StackItem>
51        <Title level={Level::H3} size={Size::XXLarge}>{ &props.title }</Title>
52        { tag_line }
53      </StackItem>
54      <StackItem>
55        <Suspense>
56          <ContractAgreementPageInner
57            offset={*offset}
58            limit={*limit}
59            {onoffset}
60            {onlimit}
61            force_refresh={*refresh}
62            onshow={props.onshow.clone()}
63          />
64        </Suspense>
65      </StackItem>
66    </Stack>
67  )
68}
69
70#[derive(Clone, Debug, PartialEq, Properties)]
71pub struct ContractAgreementPageInnerProps {
72  pub offset: usize,
73  pub limit: usize,
74  pub onoffset: Callback<usize>,
75  pub onlimit: Callback<usize>,
76  pub force_refresh: usize,
77  pub onshow: Callback<String>,
78}
79
80#[component]
81pub fn ContractAgreementPageInner(props: &ContractAgreementPageInnerProps) -> HtmlResult {
82  let edc_connector_context = use_edc_connector_context();
83
84  let contract_agreement_items = use_future_with(
85    (
86      edc_connector_context,
87      props.limit,
88      props.offset,
89      props.force_refresh,
90    ),
91    |parameters| async move {
92      let (edc_connector_context, limit, offset, _) = (*parameters).clone();
93
94      let query = Query::builder()
95        .limit(limit as u32)
96        .offset(offset as u32)
97        .sort("contractSigningDate", SortOrder::Desc)
98        .build();
99
100      if let Some(client) = edc_connector_context.get_client() {
101        client
102          .contract_agreements(EdcConnectorApiVersion::V4)
103          .query(query)
104          .await
105          .unwrap_or_default()
106          .into_iter()
107          .map(ContractAgreementItem::from)
108          .collect::<Vec<_>>()
109      } else {
110        vec![]
111      }
112    },
113  )?;
114
115  let contract_agreement_items = (*contract_agreement_items).clone();
116
117  Ok(html!(
118    <ListContractAgreements
119      contract_agreement_items={contract_agreement_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}