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}
12
13#[component]
14pub fn ShowPolicy(props: &ShowPolicyProps) -> Html {
15 let kind = match props.policy.kind() {
16 PolicyKind::Set => "Set",
17 PolicyKind::Offer => "Offer",
18 PolicyKind::Agreement => "Agreement",
19 };
20
21 let permissions = props.policy.permissions().iter().map(|permission| {
22 html! {
23 <ConstraintRenderer
24 action={permission.action().clone()}
25 constraints={permission.constraints().to_vec()}
26 />
27 }
28 });
29
30 let obligations = props.policy.obligations().iter().map(|obligation| {
31 html! {
32 <ConstraintRenderer
33 action={obligation.action().clone()}
34 constraints={obligation.constraints().to_vec()}
35 />
36 }
37 });
38
39 let prohibitions = props.policy.prohibitions().iter().map(|prohibition| {
40 html! {
41 <ConstraintRenderer
42 action={prohibition.action().clone()}
43 constraints={prohibition.constraints().to_vec()}
44 />
45 }
46 });
47
48 let profiles = props.policy.profiles().iter().map(|profile| {
49 html_nested! {
50 <FlexItem>
51 <Label color={Color::Blue} label={profile.to_string()} />
52 </FlexItem>
53 }
54 });
55
56 let extensible_properties = props
57 .policy
58 .extensible_properties()
59 .iter()
60 .map(|(key, value)| {
61 html_nested! {
62 <StackItem>
63 <DescriptionGroup term={key.to_string()}>
64 <CodeBlock>
65 <CodeBlockCode>
66 { serde_json::to_string_pretty(value).unwrap_or_default() }
67 </CodeBlockCode>
68 </CodeBlock>
69 </DescriptionGroup>
70 </StackItem>
71 }
72 });
73
74 html!(
75 <DescriptionList mode={[DescriptionListMode::Horizontal]}>
76 <DescriptionGroup term="Id">{ props.policy.id() }</DescriptionGroup>
77 <DescriptionGroup term="Name">{ props.name.clone() }</DescriptionGroup>
78 <DescriptionGroup term="Kind">{ kind }</DescriptionGroup>
79 <DescriptionGroup term="Assigner">
80 { props.policy.assigner().cloned().unwrap_or_default() }
81 </DescriptionGroup>
82 <DescriptionGroup term="Assignee">
83 { props.policy.assignee().cloned().unwrap_or_default() }
84 </DescriptionGroup>
85 <DescriptionGroup term="Permissions">{ for permissions }</DescriptionGroup>
86 <DescriptionGroup term="Obligations">{ for obligations }</DescriptionGroup>
87 <DescriptionGroup term="Prohibitions">{ for prohibitions }</DescriptionGroup>
88 <DescriptionGroup term="Profiles">
89 <Flex>{ for profiles }</Flex>
90 </DescriptionGroup>
91 <DescriptionGroup term="Extensible Properties">
92 <DescriptionList mode={[DescriptionListMode::Horizontal]}>
93 { for extensible_properties }
94 </DescriptionList>
95 </DescriptionGroup>
96 </DescriptionList>
97 )
98}