edc_web_components/pages/
policy_page.rs1use crate::components::ListPolicies;
2use crate::contexts::use_edc_connector_context;
3use crate::models::PolicyDefinitionItem;
4use edc_connector_client::EdcConnectorApiVersion;
5use edc_connector_client::types::query::Query;
6use patternfly_yew::prelude::*;
7use yew::platform::spawn_local;
8use yew::prelude::*;
9use yew::suspense::use_future_with;
10
11#[derive(Clone, Debug, PartialEq, Properties)]
12pub struct PolicyPageProps {
13 pub on_new_policy: Callback<()>,
14 pub onshow: Callback<String>,
15}
16
17#[component]
18pub fn PolicyPage(props: &PolicyPageProps) -> 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 let edc_connector_context = use_edc_connector_context();
40
41 let ondelete = use_callback(
42 (refresh.clone(), edc_connector_context),
43 |policy_id: String, (refresh, edc_connector_context)| {
44 let refresh = refresh.clone();
45 let edc_connector_context = edc_connector_context.clone();
46 let policy_id = policy_id.clone();
47
48 spawn_local(async move {
49 if let Some(client) = edc_connector_context.get_client() {
50 let _ = client
51 .policies(EdcConnectorApiVersion::V4)
52 .delete(&policy_id)
53 .await;
54 log::warn!("Deleted policy {} - {}", policy_id, *refresh + 1);
55 refresh.set(*refresh + 1);
56 }
57 });
58 },
59 );
60
61 let onclick = use_callback(props.on_new_policy.clone(), |_, on_new_policy| {
62 on_new_policy.emit(());
63 });
64
65 html!(
66 <Stack gutter=true>
67 <StackItem>
68 <Split gutter=true>
69 <SplitItem fill=true>
70 <Title level={Level::H3} size={Size::XXLarge}>{ "List Policies" }</Title>
71 </SplitItem>
72 <SplitItem>
73 <Button icon={Icon::Plus} {onclick} variant={ButtonVariant::Primary}>
74 { "Create a Policy" }
75 </Button>
76 </SplitItem>
77 </Split>
78 </StackItem>
79 <StackItem>
80 <Suspense>
81 <PolicyPageInner
82 offset={*offset}
83 limit={*limit}
84 {onoffset}
85 {onlimit}
86 {ondelete}
87 onshow={props.onshow.clone()}
88 force_refresh={*refresh}
89 />
90 </Suspense>
91 </StackItem>
92 </Stack>
93 )
94}
95
96#[derive(Clone, Debug, PartialEq, Properties)]
97pub struct PolicyPageInnerProps {
98 pub offset: usize,
99 pub limit: usize,
100 pub onoffset: Callback<usize>,
101 pub onlimit: Callback<usize>,
102 pub ondelete: Callback<String>,
103 pub onshow: Callback<String>,
104 pub force_refresh: usize,
105}
106
107#[component]
108pub fn PolicyPageInner(props: &PolicyPageInnerProps) -> HtmlResult {
109 let edc_connector_context = use_edc_connector_context();
110
111 let policy_definition_items = use_future_with(
112 (
113 edc_connector_context,
114 props.limit,
115 props.offset,
116 props.force_refresh,
117 ),
118 |parameters| async move {
119 let (edc_connector_context, limit, offset, _) = (*parameters).clone();
120
121 let query = Query::builder()
122 .limit(limit as u32)
123 .offset(offset as u32)
124 .build();
125
126 if let Some(client) = edc_connector_context.get_client() {
127 client
128 .policies(EdcConnectorApiVersion::V4)
129 .query(query)
130 .await
131 .unwrap_or_default()
132 .into_iter()
133 .map(PolicyDefinitionItem::from)
134 .collect::<Vec<_>>()
135 } else {
136 vec![]
137 }
138 },
139 )?;
140
141 let policy_definition_items = (*policy_definition_items).clone();
142
143 Ok(html!(
144 <ListPolicies
145 policy_definition_items={policy_definition_items}
146 offset={props.offset}
147 limit={props.limit}
148 onoffset={props.onoffset.clone()}
149 onlimit={props.onlimit.clone()}
150 ondelete={props.ondelete.clone()}
151 onshow={props.onshow.clone()}
152 />
153 ))
154}