edc_web_components/pages/
contract_agreement_page.rs1use 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}