edc_web_components/components/create_policy/
operator_selector.rs1use 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}