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 #[prop_or("selectable-policy".to_string())]
14 pub policy_selection_group_id: String,
15 pub on_click: Callback<()>,
16}
17
18#[component]
19pub fn PolicyCard(props: &PolicyCardProps) -> Html {
20 let permissions = props
21 .policy_definition_item
22 .permissions
23 .iter()
24 .map(|permission| {
25 html! {
26 <ConstraintRenderer
27 action={permission.action().clone()}
28 constraints={permission.constraints().to_vec()}
29 />
30 }
31 });
32
33 let obligations = props
34 .policy_definition_item
35 .obligations
36 .iter()
37 .map(|obligation| {
38 html! {
39 <ConstraintRenderer
40 action={obligation.action().clone()}
41 constraints={obligation.constraints().to_vec()}
42 />
43 }
44 });
45
46 let prohibitions = props
47 .policy_definition_item
48 .prohibitions
49 .iter()
50 .map(|prohibition| {
51 html! {
52 <ConstraintRenderer
53 action={prohibition.action().clone()}
54 constraints={prohibition.constraints().to_vec()}
55 />
56 }
57 });
58
59 let selectable_actions = yew::props!(CardSelectableActionsObjectProperties {
60 action: CardSelectableActionsVariant::SingleSelect {
61 onchange: Some(props.on_click.reform(move |_| ())),
62 },
63 base: yew::props!(CardSelectableActionsObjectBase {
64 name: props.policy_selection_group_id.clone()
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}