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  #[prop_or_default]
12  pub hide_kind: bool,
13  #[prop_or_default]
14  pub hide_id: bool,
15  #[prop_or_default]
16  pub hide_name: bool,
17  #[prop_or_default]
18  pub hide_profiles: bool,
19  #[prop_or_default]
20  pub hide_extensible_properties: bool,
21}
22
23#[component]
24pub fn ShowPolicy(props: &ShowPolicyProps) -> Html {
25  let permissions = props.policy.permissions().iter().map(|permission| {
26    html! {
27      <ConstraintRenderer
28        action={permission.action().clone()}
29        constraints={permission.constraints().to_vec()}
30      />
31    }
32  });
33
34  let obligations = props.policy.obligations().iter().map(|obligation| {
35    html! {
36      <ConstraintRenderer
37        action={obligation.action().clone()}
38        constraints={obligation.constraints().to_vec()}
39      />
40    }
41  });
42
43  let prohibitions = props.policy.prohibitions().iter().map(|prohibition| {
44    html! {
45      <ConstraintRenderer
46        action={prohibition.action().clone()}
47        constraints={prohibition.constraints().to_vec()}
48      />
49    }
50  });
51
52  let id = if props.hide_id {
53    html!()
54  } else {
55    html!(<DescriptionGroup term="Id">{ props.policy.id() }</DescriptionGroup>)
56  };
57
58  let name = if props.hide_name {
59    html!()
60  } else {
61    html!(<DescriptionGroup term="Name">{ props.name.clone() }</DescriptionGroup>)
62  };
63
64  let kind = if props.hide_kind {
65    html!()
66  } else {
67    let kind = match props.policy.kind() {
68      PolicyKind::Set => "Set",
69      PolicyKind::Offer => "Offer",
70      PolicyKind::Agreement => "Agreement",
71    };
72
73    html!(<DescriptionGroup term="Kind">{ kind }</DescriptionGroup>)
74  };
75
76  let profiles = if props.hide_profiles {
77    html!()
78  } else {
79    let profiles = props.policy.profiles().iter().map(|profile| {
80      html_nested! {
81        <FlexItem>
82          <Label color={Color::Blue} label={profile.to_string()} />
83        </FlexItem>
84      }
85    });
86
87    html!(
88      <DescriptionGroup term="Profiles">
89        <Flex>{ for profiles }</Flex>
90      </DescriptionGroup>
91    )
92  };
93
94  let extensible_properties = if props.hide_extensible_properties {
95    html!()
96  } else {
97    let extensible_properties = props
98      .policy
99      .extensible_properties()
100      .iter()
101      .map(|(key, value)| {
102        html_nested! {
103          <StackItem>
104            <DescriptionGroup term={key.to_string()}>
105              <CodeBlock>
106                <CodeBlockCode>
107                  { serde_json::to_string_pretty(value).unwrap_or_default() }
108                </CodeBlockCode>
109              </CodeBlock>
110            </DescriptionGroup>
111          </StackItem>
112        }
113      });
114
115    html!(
116      <DescriptionGroup term="Extensible Properties">
117        <DescriptionList mode={[DescriptionListMode::Horizontal]}>
118          { for extensible_properties }
119        </DescriptionList>
120      </DescriptionGroup>
121    )
122  };
123
124  html!(
125    <DescriptionList mode={[DescriptionListMode::Horizontal]}>
126      { id }
127      { name }
128      { kind }
129      <DescriptionGroup term="Assigner">
130        { props.policy.assigner().cloned().unwrap_or_default() }
131      </DescriptionGroup>
132      <DescriptionGroup term="Assignee">
133        { props.policy.assignee().cloned().unwrap_or_default() }
134      </DescriptionGroup>
135      <DescriptionGroup term="Permissions">{ for permissions }</DescriptionGroup>
136      <DescriptionGroup term="Obligations">{ for obligations }</DescriptionGroup>
137      <DescriptionGroup term="Prohibitions">{ for prohibitions }</DescriptionGroup>
138      { profiles }
139      { extensible_properties }
140    </DescriptionList>
141  )
142}