edc-web-components 0.5.7

A Rust Web Components with patternfly-yew client for EDC
Documentation
use crate::components::ConstraintRenderer;
use crate::models::PolicyDefinitionItem;
use patternfly_yew::prelude::*;
use yew::prelude::*;

#[derive(Clone, Debug, PartialEq, Properties)]
pub struct PolicyCardProps {
  pub policy_definition_item: PolicyDefinitionItem,
  #[prop_or_default]
  pub selected: bool,
  #[prop_or_default]
  pub disabled: bool,
  #[prop_or("selectable-policy".to_string())]
  pub policy_selection_group_id: String,
  pub on_click: Callback<()>,
}

#[component]
pub fn PolicyCard(props: &PolicyCardProps) -> Html {
  let permissions = props
    .policy_definition_item
    .permissions
    .iter()
    .map(|permission| {
      html! {
        <ConstraintRenderer
          action={permission.action().clone()}
          constraints={permission.constraints().to_vec()}
        />
      }
    });

  let obligations = props
    .policy_definition_item
    .obligations
    .iter()
    .map(|obligation| {
      html! {
        <ConstraintRenderer
          action={obligation.action().clone()}
          constraints={obligation.constraints().to_vec()}
        />
      }
    });

  let prohibitions = props
    .policy_definition_item
    .prohibitions
    .iter()
    .map(|prohibition| {
      html! {
        <ConstraintRenderer
          action={prohibition.action().clone()}
          constraints={prohibition.constraints().to_vec()}
        />
      }
    });

  let selectable_actions = yew::props!(CardSelectableActionsObjectProperties {
    action: CardSelectableActionsVariant::SingleSelect {
      onchange: Some(props.on_click.reform(move |_| ())),
    },
    base: yew::props!(CardSelectableActionsObjectBase {
      name: props.policy_selection_group_id.clone()
    })
  });

  let extensible_properties = props
    .policy_definition_item
    .extensible_properties
    .iter()
    .map(|(key, value)| {
      html! { <DescriptionGroup term={key.clone()}>{ value.to_string() }</DescriptionGroup> }
    });

  html!(
    <Card selectable=true disabled={props.disabled} selected={props.selected}>
      <CardHeader {selectable_actions}>
        <div>{ &props.policy_definition_item.name }</div>
      </CardHeader>
      <CardBody>
        <DescriptionList>
          <DescriptionGroup term="Permissions">{ for permissions }</DescriptionGroup>
          <DescriptionGroup term="Obligations">{ for obligations }</DescriptionGroup>
          <DescriptionGroup term="Prohibitions">{ for prohibitions }</DescriptionGroup>
          <DescriptionGroup term="Extensible Properties">
            <DescriptionList mode={[DescriptionListMode::Horizontal]}>
              { for extensible_properties }
            </DescriptionList>
          </DescriptionGroup>
        </DescriptionList>
      </CardBody>
    </Card>
  )
}