edc_web_components/components/
show_policy.rs1use 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 #[prop_or_default]
10 pub name: Option<String>,
11 #[prop_or_default]
12 pub hide_kind: bool,
13 #[prop_or_default]
14 pub hide_id: bool,
15 #[prop_or_default]
16 pub hide_name: bool,
17 #[prop_or_default]
18 pub hide_profiles: bool,
19 #[prop_or_default]
20 pub hide_extensible_properties: bool,
21}
22
23#[component]
24pub fn ShowPolicy(props: &ShowPolicyProps) -> Html {
25 let permissions = props.policy.permissions().iter().map(|permission| {
26 html! {
27 <ConstraintRenderer
28 action={permission.action().clone()}
29 constraints={permission.constraints().to_vec()}
30 />
31 }
32 });
33
34 let obligations = props.policy.obligations().iter().map(|obligation| {
35 html! {
36 <ConstraintRenderer
37 action={obligation.action().clone()}
38 constraints={obligation.constraints().to_vec()}
39 />
40 }
41 });
42
43 let prohibitions = props.policy.prohibitions().iter().map(|prohibition| {
44 html! {
45 <ConstraintRenderer
46 action={prohibition.action().clone()}
47 constraints={prohibition.constraints().to_vec()}
48 />
49 }
50 });
51
52 let id = if props.hide_id {
53 html!()
54 } else {
55 html!(<DescriptionGroup term="Id">{ props.policy.id() }</DescriptionGroup>)
56 };
57
58 let name = if props.hide_name {
59 html!()
60 } else {
61 html!(<DescriptionGroup term="Name">{ props.name.clone() }</DescriptionGroup>)
62 };
63
64 let kind = if props.hide_kind {
65 html!()
66 } else {
67 let kind = match props.policy.kind() {
68 PolicyKind::Set => "Set",
69 PolicyKind::Offer => "Offer",
70 PolicyKind::Agreement => "Agreement",
71 };
72
73 html!(<DescriptionGroup term="Kind">{ kind }</DescriptionGroup>)
74 };
75
76 let profiles = if props.hide_profiles {
77 html!()
78 } else {
79 let profiles = props.policy.profiles().iter().map(|profile| {
80 html_nested! {
81 <FlexItem>
82 <Label color={Color::Blue} label={profile.to_string()} />
83 </FlexItem>
84 }
85 });
86
87 html!(
88 <DescriptionGroup term="Profiles">
89 <Flex>{ for profiles }</Flex>
90 </DescriptionGroup>
91 )
92 };
93
94 let extensible_properties = if props.hide_extensible_properties {
95 html!()
96 } else {
97 let extensible_properties = props
98 .policy
99 .extensible_properties()
100 .iter()
101 .map(|(key, value)| {
102 html_nested! {
103 <StackItem>
104 <DescriptionGroup term={key.to_string()}>
105 <CodeBlock>
106 <CodeBlockCode>
107 { serde_json::to_string_pretty(value).unwrap_or_default() }
108 </CodeBlockCode>
109 </CodeBlock>
110 </DescriptionGroup>
111 </StackItem>
112 }
113 });
114
115 html!(
116 <DescriptionGroup term="Extensible Properties">
117 <DescriptionList mode={[DescriptionListMode::Horizontal]}>
118 { for extensible_properties }
119 </DescriptionList>
120 </DescriptionGroup>
121 )
122 };
123
124 html!(
125 <DescriptionList mode={[DescriptionListMode::Horizontal]}>
126 { id }
127 { name }
128 { kind }
129 <DescriptionGroup term="Assigner">
130 { props.policy.assigner().cloned().unwrap_or_default() }
131 </DescriptionGroup>
132 <DescriptionGroup term="Assignee">
133 { props.policy.assignee().cloned().unwrap_or_default() }
134 </DescriptionGroup>
135 <DescriptionGroup term="Permissions">{ for permissions }</DescriptionGroup>
136 <DescriptionGroup term="Obligations">{ for obligations }</DescriptionGroup>
137 <DescriptionGroup term="Prohibitions">{ for prohibitions }</DescriptionGroup>
138 { profiles }
139 { extensible_properties }
140 </DescriptionList>
141 )
142}