Skip to main content

edc_web_components/components/
show_policy.rs

1use crate::components::ConstraintRenderer;
2use edc_connector_client::types::policy::{Policy, PolicyKind};
3use patternfly_yew::prelude::*;
4use yew::prelude::*;
5
6#[derive(Clone, Debug, PartialEq, Properties)]
7pub struct ShowPolicyProps {
8  pub policy: Policy,
9  #[prop_or_default]
10  pub name: Option<String>,
11}
12
13#[component]
14pub fn ShowPolicy(props: &ShowPolicyProps) -> Html {
15  let kind = match props.policy.kind() {
16    PolicyKind::Set => "Set",
17    PolicyKind::Offer => "Offer",
18    PolicyKind::Agreement => "Agreement",
19  };
20
21  let permissions = props.policy.permissions().iter().map(|permission| {
22    html! {
23      <ConstraintRenderer
24        action={permission.action().clone()}
25        constraints={permission.constraints().to_vec()}
26      />
27    }
28  });
29
30  let obligations = props.policy.obligations().iter().map(|obligation| {
31    html! {
32      <ConstraintRenderer
33        action={obligation.action().clone()}
34        constraints={obligation.constraints().to_vec()}
35      />
36    }
37  });
38
39  let prohibitions = props.policy.prohibitions().iter().map(|prohibition| {
40    html! {
41      <ConstraintRenderer
42        action={prohibition.action().clone()}
43        constraints={prohibition.constraints().to_vec()}
44      />
45    }
46  });
47
48  let profiles = props.policy.profiles().iter().map(|profile| {
49    html_nested! {
50      <FlexItem>
51        <Label color={Color::Blue} label={profile.to_string()} />
52      </FlexItem>
53    }
54  });
55
56  let extensible_properties = props
57    .policy
58    .extensible_properties()
59    .iter()
60    .map(|(key, value)| {
61      html_nested! {
62        <StackItem>
63          <DescriptionGroup term={key.to_string()}>
64            <CodeBlock>
65              <CodeBlockCode>
66                { serde_json::to_string_pretty(value).unwrap_or_default() }
67              </CodeBlockCode>
68            </CodeBlock>
69          </DescriptionGroup>
70        </StackItem>
71      }
72    });
73
74  html!(
75    <DescriptionList mode={[DescriptionListMode::Horizontal]}>
76      <DescriptionGroup term="Id">{ props.policy.id() }</DescriptionGroup>
77      <DescriptionGroup term="Name">{ props.name.clone() }</DescriptionGroup>
78      <DescriptionGroup term="Kind">{ kind }</DescriptionGroup>
79      <DescriptionGroup term="Assigner">
80        { props.policy.assigner().cloned().unwrap_or_default() }
81      </DescriptionGroup>
82      <DescriptionGroup term="Assignee">
83        { props.policy.assignee().cloned().unwrap_or_default() }
84      </DescriptionGroup>
85      <DescriptionGroup term="Permissions">{ for permissions }</DescriptionGroup>
86      <DescriptionGroup term="Obligations">{ for obligations }</DescriptionGroup>
87      <DescriptionGroup term="Prohibitions">{ for prohibitions }</DescriptionGroup>
88      <DescriptionGroup term="Profiles">
89        <Flex>{ for profiles }</Flex>
90      </DescriptionGroup>
91      <DescriptionGroup term="Extensible Properties">
92        <DescriptionList mode={[DescriptionListMode::Horizontal]}>
93          { for extensible_properties }
94        </DescriptionList>
95      </DescriptionGroup>
96    </DescriptionList>
97  )
98}