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