edc_web_components/components/
policy_reference.rs1use 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}