Skip to main content

edc_web_components/components/
show_policy_reference.rs

1use crate::components::ShowPolicy;
2use crate::contexts::{RedirectionAction, use_redirection_context};
3use edc_connector_client::types::policy::Policy;
4use patternfly_yew::prelude::*;
5use yew::prelude::*;
6
7#[derive(Clone, Debug, PartialEq, Properties)]
8pub struct ShowPolicyReferenceProps {
9  pub policy: Policy,
10}
11
12#[component]
13pub fn ShowPolicyReference(props: &ShowPolicyReferenceProps) -> Html {
14  let backdropper = use_backdrop();
15  let redirection_context = use_redirection_context();
16
17  let onclick = use_callback(
18    (
19      backdropper.clone(),
20      redirection_context.clone(),
21      props.policy.clone(),
22    ),
23    |_, (backdropper, redirection_context, policy)| {
24      if let Some(backdropper) = backdropper {
25        let policy_id = policy.id().cloned().unwrap_or_default();
26        let policy = policy.clone();
27
28        let button = if let Some(redirection_context) = redirection_context {
29          let backdropper = backdropper.clone();
30          let redirection_context = redirection_context.clone();
31
32          html!(
33            <Button
34              variant={ButtonVariant::Primary}
35              icon={Icon::Eye}
36              onclick={redirection_context.redirect_to().reform(move |_| {
37                backdropper.close();
38                RedirectionAction::Policy(policy_id.clone())
39              })}
40            >
41              { "Show" }
42            </Button>
43          )
44        } else {
45          html!()
46        };
47
48        backdropper.open(Backdrop::new(html!(
49          <Bullseye>
50            <Modal title="Policy" variant={ModalVariant::Medium}>
51              <Bullseye>
52                <Stack gutter=true>
53                  <StackItem>
54                    <ShowPolicy {policy} />
55                  </StackItem>
56                  <StackItem>{ button }</StackItem>
57                </Stack>
58              </Bullseye>
59            </Modal>
60          </Bullseye>
61        )));
62      }
63    },
64  );
65
66  html!(
67    <Button variant={ButtonVariant::InlineLink} {onclick}>
68      <Flex>
69        <FlexItem modifiers={[FlexModifier::Align(Alignment::Center).all()]}>
70          <yew_icons::Icon data={yew_icons::IconData::LUCIDE_SHIELD} />
71        </FlexItem>
72        <FlexItem modifiers={[FlexModifier::Align(Alignment::Center).all()]}>{ "Policy" }</FlexItem>
73      </Flex>
74    </Button>
75  )
76}