Skip to main content

edc_web_components/components/
policy_reference.rs

1use crate::components::ShowPolicyReference;
2use crate::contexts::{RedirectionAction, use_edc_connector_context, use_redirection_context};
3use crate::models::PolicyDefinitionItem;
4use edc_connector_client::EdcConnectorApiVersion;
5use patternfly_yew::prelude::*;
6use yew::prelude::*;
7use yew::suspense::use_future_with;
8
9#[derive(Clone, Debug, PartialEq, Properties)]
10pub struct PolicyReferenceProps {
11  pub policy_id: String,
12  #[prop_or_default]
13  pub show_with_modal: bool,
14}
15
16#[component]
17pub fn PolicyReference(props: &PolicyReferenceProps) -> Html {
18  html! {
19    <Suspense fallback={html! {<Bullseye><Spinner size={SpinnerSize::Sm} /></Bullseye>}}>
20      <PolicyReferenceInner
21        policy_id={props.policy_id.clone()}
22        show_with_modal={props.show_with_modal}
23      />
24    </Suspense>
25  }
26}
27
28#[component]
29pub fn PolicyReferenceInner(props: &PolicyReferenceProps) -> HtmlResult {
30  let edc_connector_context = use_edc_connector_context();
31  let redirection_context = use_redirection_context();
32
33  let policy_definition = use_future_with(
34    (props.policy_id.clone(), edc_connector_context.clone()),
35    async move |parameters| {
36      let (policy_id, edc_connector_context) = (*parameters).clone();
37
38      if let Some(edc_connector_client) = edc_connector_context.get_client() {
39        edc_connector_client
40          .policies(EdcConnectorApiVersion::V4)
41          .get(&policy_id)
42          .await
43          .ok()
44      } else {
45        None
46      }
47    },
48  )?;
49
50  let policy_definition = (*policy_definition).clone();
51
52  if props.show_with_modal
53    && let Some(policy_definition) = policy_definition
54  {
55    Ok(html!(<ShowPolicyReference policy={policy_definition.policy().clone()} />))
56  } else {
57    let label = if let Some(policy) = policy_definition.map(PolicyDefinitionItem::from) {
58      policy.name
59    } else {
60      "Policy".to_string()
61    };
62
63    let onclick = redirection_context
64      .map(|redirection_context| {
65        let policy_id = props.policy_id.clone();
66
67        redirection_context
68          .redirect_to()
69          .reform(move |_| RedirectionAction::Policy(policy_id.clone()))
70      })
71      .unwrap_or_default();
72
73    Ok(html!(
74      <Button variant={ButtonVariant::InlineLink} {onclick}>
75        <Flex>
76          <FlexItem modifiers={[FlexModifier::Align(Alignment::Center).all()]}>
77            <yew_icons::Icon data={yew_icons::IconData::LUCIDE_SHIELD} />
78          </FlexItem>
79          <FlexItem modifiers={[FlexModifier::Align(Alignment::Center).all()]}>{ label }</FlexItem>
80        </Flex>
81      </Button>
82    ))
83  }
84}