Skip to main content

edc_web_components/components/create_policy/
atomic_constraint_edit.rs

1mod cel_atomic_constraint_edit;
2mod default_atomic_constraint_edit;
3
4use cel_atomic_constraint_edit::CelAtomicConstraintEdit;
5use default_atomic_constraint_edit::DefaultAtomicConstraintEdit;
6use edc_connector_client::types::policy::{LeftOperand, Operator};
7use patternfly_yew::prelude::*;
8use serde_json::Value;
9use yew::prelude::*;
10
11#[derive(Clone, Copy, Debug, PartialEq)]
12pub enum ConstraintMode {
13  Default,
14  Cel,
15}
16
17#[derive(Clone, PartialEq, Properties)]
18pub struct AtomicConstraintEditProps {
19  pub index: usize,
20  pub constraint_mode: ConstraintMode,
21  pub left_operand: LeftOperand,
22  pub operator: Operator,
23  pub right_operand: Value,
24  pub onchange: Callback<(usize, ConstraintMode, LeftOperand, Operator, Value)>,
25  pub ondelete: Callback<usize>,
26}
27
28#[component]
29pub fn AtomicConstraintEdit(props: &AtomicConstraintEditProps) -> Html {
30  let onchange = use_callback(
31    (
32      props.index,
33      props.left_operand.clone(),
34      props.operator.clone(),
35      props.right_operand.clone(),
36      props.onchange.clone(),
37    ),
38    |constraint_mode: ConstraintMode, (index, left_operand, operator, right_operand, onchange)| {
39      onchange.emit((
40        *index,
41        constraint_mode,
42        left_operand.clone(),
43        operator.clone(),
44        right_operand.clone(),
45      ));
46    },
47  );
48
49  let label = match props.constraint_mode {
50    ConstraintMode::Default => "Default",
51    ConstraintMode::Cel => "CEL",
52  };
53
54  let on_change_cel = use_callback(
55    (props.index, props.onchange.clone()),
56    |cel_left_operand, (index, onchange)| {
57      onchange.emit((
58        *index,
59        ConstraintMode::Cel,
60        LeftOperand::Simple(cel_left_operand),
61        Operator::Simple("eq".to_string()),
62        Value::String("active".to_string()),
63      ));
64    },
65  );
66
67  let inner = match props.constraint_mode {
68    ConstraintMode::Default => {
69      html!(
70        <DefaultAtomicConstraintEdit
71          index={props.index}
72          left_operand={props.left_operand.clone()}
73          operator={props.operator.clone()}
74          right_operand={props.right_operand.clone()}
75          onchange={props.onchange.reform(|(index, left_operand, operator, right_operand)| {
76            (index, ConstraintMode::Default, left_operand, operator, right_operand)
77          })}
78        />
79      )
80    }
81    ConstraintMode::Cel => {
82      let cel_left_operand = match props.left_operand.clone() {
83        LeftOperand::Simple(value) => value,
84        LeftOperand::Id { id } => id,
85      };
86
87      html!(<CelAtomicConstraintEdit {cel_left_operand} on_change={on_change_cel} />)
88    }
89  };
90
91  let delete_constraint = use_callback(
92    (props.index, props.ondelete.clone()),
93    |_, (index, ondelete)| {
94      ondelete.emit(*index);
95    },
96  );
97
98  html!(
99    <Flex>
100      <FlexItem>
101        <Dropdown text={label}>
102          <MenuAction
103            selected={props.constraint_mode == ConstraintMode::Cel}
104            onclick={onchange.reform(move |_| ConstraintMode::Cel)}
105          >
106            { "CEL" }
107          </MenuAction>
108          <MenuAction
109            selected={props.constraint_mode == ConstraintMode::Default}
110            onclick={onchange.reform(move |_| ConstraintMode::Default)}
111          >
112            { "Default" }
113          </MenuAction>
114        </Dropdown>
115      </FlexItem>
116      <FlexItem modifiers={[FlexModifier::Flex1]}>{ inner }</FlexItem>
117      <FlexItem>
118        <Button
119          icon={Icon::Trash}
120          variant={ButtonVariant::DangerSecondary}
121          onclick={delete_constraint}
122        />
123      </FlexItem>
124    </Flex>
125  )
126}