Skip to main content

edc_web_components/pages/
policy_page.rs

1use 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}