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