edc_web_components/components/show_policy/
policy_properties.rs1use 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}