Skip to main content

edc_web_components/components/create_policy/
operator_selector.rs

1use edc_connector_client::types::policy::Operator;
2use patternfly_yew::prelude::*;
3use yew::prelude::*;
4
5static OPERATORS: [(&str, &str); 13] = [
6  ("Equal", "eq"),
7  ("Not equal", "neq"),
8  ("Greater than", "gt"),
9  ("Greater than or equal", "gteq"),
10  ("Less than", "lt"),
11  ("Less than or equal", "lteq"),
12  ("Term less than or equal", "term-lteq"),
13  ("Has part", "hasPart"),
14  ("Is a", "isA"),
15  ("Is all of", "isAllOf"),
16  ("Is any of", "isAnyOf"),
17  ("Is none of", "isNoneOf"),
18  ("Is part of", "isPärtOf"),
19];
20
21#[derive(Clone, PartialEq, Properties)]
22pub struct OperatorSelectorProps {
23  pub operator: Operator,
24  pub onchange: Callback<Operator>,
25}
26
27#[component]
28pub fn OperatorSelector(props: &OperatorSelectorProps) -> Html {
29  let operators = OPERATORS.iter().map(|(name, operator)| {
30    let name = name.to_string();
31    let operator = Operator::Simple(operator.to_string());
32    let onchange = props.onchange.clone();
33
34    html_nested!(
35      <MenuAction selected=false onclick={onchange.reform(move |_| operator.clone())}>
36        { name }
37      </MenuAction>
38    )
39  });
40
41  let label = match &props.operator {
42    Operator::Simple(operator) => OPERATORS
43      .iter()
44      .find(|(_, operator_value)| *operator_value == operator)
45      .map(|(operator_name, _)| operator_name.to_string())
46      .unwrap_or(operator.to_string()),
47    Operator::Id { id } => id.to_string(),
48  };
49
50  html!(<Dropdown text={label}>{ for operators }</Dropdown>)
51}