edc_web_components/components/
policy_card.rs1use crate::components::ConstraintRenderer;
2use crate::models::PolicyDefinitionItem;
3use patternfly_yew::prelude::*;
4use yew::prelude::*;
5
6#[derive(Clone, Debug, PartialEq, Properties)]
7pub struct PolicyCardProps {
8 pub policy_definition_item: PolicyDefinitionItem,
9 #[prop_or_default]
10 pub selected: bool,
11 #[prop_or_default]
12 pub disabled: bool,
13 pub on_click: Callback<()>,
14}
15
16#[component]
17pub fn PolicyCard(props: &PolicyCardProps) -> Html {
18 let permissions = props
19 .policy_definition_item
20 .permissions
21 .iter()
22 .map(|permission| {
23 html! {
24 <ConstraintRenderer
25 action={permission.action().clone()}
26 constraints={permission.constraints().to_vec()}
27 />
28 }
29 });
30
31 let obligations = props
32 .policy_definition_item
33 .obligations
34 .iter()
35 .map(|obligation| {
36 html! {
37 <ConstraintRenderer
38 action={obligation.action().clone()}
39 constraints={obligation.constraints().to_vec()}
40 />
41 }
42 });
43
44 let prohibitions = props
45 .policy_definition_item
46 .prohibitions
47 .iter()
48 .map(|prohibition| {
49 html! {
50 <ConstraintRenderer
51 action={prohibition.action().clone()}
52 constraints={prohibition.constraints().to_vec()}
53 />
54 }
55 });
56
57 let selectable_actions = {
58 let name = props.policy_definition_item.id.clone();
59
60 yew::props!(CardSelectableActionsObjectProperties {
61 action: CardSelectableActionsVariant::SingleSelect {
62 onchange: Some(props.on_click.reform(move |_| ())),
63 },
64 base: yew::props!(CardSelectableActionsObjectBase { name })
65 })
66 };
67
68 let extensible_properties = props
69 .policy_definition_item
70 .extensible_properties
71 .iter()
72 .map(|(key, value)| {
73 html! { <DescriptionGroup term={key.clone()}>{ value.to_string() }</DescriptionGroup> }
74 });
75
76 html!(
77 <Card selectable=true disabled={props.disabled} selected={props.selected}>
78 <CardHeader {selectable_actions}>
79 <div>{ &props.policy_definition_item.name }</div>
80 </CardHeader>
81 <CardBody>
82 <DescriptionList>
83 <DescriptionGroup term="Permissions">{ for permissions }</DescriptionGroup>
84 <DescriptionGroup term="Obligations">{ for obligations }</DescriptionGroup>
85 <DescriptionGroup term="Prohibitions">{ for prohibitions }</DescriptionGroup>
86 <DescriptionGroup term="Extensible Properties">
87 <DescriptionList mode={[DescriptionListMode::Horizontal]}>
88 { for extensible_properties }
89 </DescriptionList>
90 </DescriptionGroup>
91 </DescriptionList>
92 </CardBody>
93 </Card>
94 )
95}