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