Skip to main content

edc_web_components/components/show_policy/
policy_properties.rs

1use crate::components::{ConstraintRenderer, DidLabel, Identifier};
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    html!(
21      <HelperText>
22        <HelperTextItem variant={HelperTextItemVariant::Intermediate}>{ "None" }</HelperTextItem>
23      </HelperText>
24    )
25  } else {
26    props
27      .permissions
28      .iter()
29      .map(|permission| {
30        html! {
31          <ConstraintRenderer
32            action={permission.action().clone()}
33            constraints={permission.constraints().to_vec()}
34          />
35        }
36      })
37      .collect::<Html>()
38  };
39
40  let obligations = if props.obligations.is_empty() {
41    html!(
42      <HelperText>
43        <HelperTextItem variant={HelperTextItemVariant::Intermediate}>{ "None" }</HelperTextItem>
44      </HelperText>
45    )
46  } else {
47    props
48      .obligations
49      .iter()
50      .map(|obligation| {
51        html! {
52          <ConstraintRenderer
53            action={obligation.action().clone()}
54            constraints={obligation.constraints().to_vec()}
55          />
56        }
57      })
58      .collect::<Html>()
59  };
60
61  let prohibitions = if props.prohibitions.is_empty() {
62    html!(
63      <HelperText>
64        <HelperTextItem variant={HelperTextItemVariant::Intermediate}>{ "None" }</HelperTextItem>
65      </HelperText>
66    )
67  } else {
68    props
69      .prohibitions
70      .iter()
71      .map(|prohibition| {
72        html! {
73          <ConstraintRenderer
74            action={prohibition.action().clone()}
75            constraints={prohibition.constraints().to_vec()}
76          />
77        }
78      })
79      .collect::<Html>()
80  };
81
82  let extensible_properties = if props.extensible_properties.is_empty() {
83    None
84  } else {
85    let extensible_properties =
86      props
87        .extensible_properties
88        .iter()
89        .enumerate()
90        .map(|(index, (key, value))| {
91          html_nested! {
92            <SimpleListItem key={index}>
93              <Identifier id={key.clone()} />
94              <div>{ value.to_string() }</div>
95            </SimpleListItem>
96          }
97        });
98
99    Some(html_nested!(
100      <DescriptionGroup term="Extensible Properties">
101        <SimpleList>{ for extensible_properties }</SimpleList>
102      </DescriptionGroup>
103    ))
104  };
105
106  let assigner = props
107    .assigner
108    .as_ref()
109    .map(|assigner| {
110      Some(html_nested! {
111        <StackItem>
112          <DescriptionGroup term="Assigner">
113            <DidLabel did={assigner.clone()} />
114          </DescriptionGroup>
115        </StackItem>
116      })
117    })
118    .unwrap_or_default();
119
120  let assignee = props
121    .assignee
122    .as_ref()
123    .map(|assignee| {
124      Some(html_nested! {
125        <StackItem>
126          <DescriptionGroup term="Assignee">
127            <DidLabel did={assignee.clone()} />
128          </DescriptionGroup>
129        </StackItem>
130      })
131    })
132    .unwrap_or_default();
133
134  html!(
135    <>
136      <DescriptionGroup term="Permissions">{ permissions }</DescriptionGroup>
137      <DescriptionGroup term="Obligations">{ obligations }</DescriptionGroup>
138      <DescriptionGroup term="Prohibitions">{ prohibitions }</DescriptionGroup>
139      { extensible_properties }
140      { assigner }
141      { assignee }
142    </>
143  )
144}