Skip to main content

edc_web_components/components/
policy_card.rs

1use 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}