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