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