edc_web_components/components/create_policy/
atomic_constraint_edit.rs1mod 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}