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 #[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}