Skip to main content

edc_web_components/components/show_policy/
policy_properties.rs

1use crate::components::{ConstraintRenderer, DidLabel};
2use edc_connector_client::types::policy::{Obligation, Permission, Prohibition};
3use patternfly_yew::prelude::*;
4use std::collections::HashMap;
5use yew::prelude::*;
6
7#[derive(Clone, Debug, PartialEq, Properties)]
8pub struct PolicyPropertiesProps {
9  pub permissions: Vec<Permission>,
10  pub obligations: Vec<Obligation>,
11  pub prohibitions: Vec<Prohibition>,
12  pub extensible_properties: HashMap<String, serde_json::Value>,
13  pub assigner: Option<String>,
14  pub assignee: Option<String>,
15}
16
17#[component]
18pub fn PolicyProperties(props: &PolicyPropertiesProps) -> Html {
19  let permissions = if props.permissions.is_empty() {
20    None
21  } else {
22    let permissions = props.permissions.iter().map(|permission| {
23      html! {
24        <ConstraintRenderer
25          action={permission.action().clone()}
26          constraints={permission.constraints().to_vec()}
27        />
28      }
29    });
30
31    Some(html_nested!(<DescriptionGroup term="Permissions">{ for permissions }</DescriptionGroup>))
32  };
33
34  let obligations = if props.obligations.is_empty() {
35    None
36  } else {
37    let obligations = props.obligations.iter().map(|obligation| {
38      html! {
39        <ConstraintRenderer
40          action={obligation.action().clone()}
41          constraints={obligation.constraints().to_vec()}
42        />
43      }
44    });
45
46    Some(html_nested!(<DescriptionGroup term="Obligations">{ for obligations }</DescriptionGroup>))
47  };
48
49  let prohibitions = if props.prohibitions.is_empty() {
50    None
51  } else {
52    let prohibitions = props.prohibitions.iter().map(|prohibition| {
53      html! {
54        <ConstraintRenderer
55          action={prohibition.action().clone()}
56          constraints={prohibition.constraints().to_vec()}
57        />
58      }
59    });
60
61    Some(
62      html_nested!(<DescriptionGroup term="Prohibitions">{ for prohibitions }</DescriptionGroup>),
63    )
64  };
65
66  let extensible_properties = if props.extensible_properties.is_empty() {
67    None
68  } else {
69    let extensible_properties = props.extensible_properties.iter().map(|(key, value)| {
70      html! { <DescriptionGroup term={key.clone()}>{ value.to_string() }</DescriptionGroup> }
71    });
72
73    Some(html_nested!(
74      <DescriptionGroup term="Extensible Properties">
75        <DescriptionList mode={[DescriptionListMode::Horizontal]}>
76          { for extensible_properties }
77        </DescriptionList>
78      </DescriptionGroup>
79    ))
80  };
81
82  let assigner = props
83    .assigner
84    .as_ref()
85    .map(|assigner| {
86      Some(html_nested! {
87        <StackItem>
88          <DescriptionGroup term="Assigner">
89            <DidLabel did={assigner.clone()} />
90          </DescriptionGroup>
91        </StackItem>
92      })
93    })
94    .unwrap_or_default();
95
96  let assignee = props
97    .assignee
98    .as_ref()
99    .map(|assignee| {
100      Some(html_nested! {
101        <StackItem>
102          <DescriptionGroup term="Assignee">
103            <DidLabel did={assignee.clone()} />
104          </DescriptionGroup>
105        </StackItem>
106      })
107    })
108    .unwrap_or_default();
109
110  html!(
111    <>
112      { permissions }
113      { obligations }
114      { prohibitions }
115      { extensible_properties }
116      { assigner }
117      { assignee }
118    </>
119  )
120}