edc_web_ui/components/
create_contract_definition.rs1use crate::components::criterion_edit::CriterionEdit;
2use crate::contexts::use_edc_connector_context;
3use edc_connector_client::types::contract_definition::NewContractDefinition;
4use edc_connector_client::types::query::Criterion;
5use patternfly_yew::prelude::*;
6use yew::platform::spawn_local;
7use yew::prelude::*;
8
9#[function_component]
10pub fn CreateContractDefinition() -> Html {
11 let edc_connector_context = use_edc_connector_context();
12
13 let identifier = use_state(|| "".to_string());
14 let access_policy_id = use_state(|| "".to_string());
15 let contract_policy_id = use_state(|| "".to_string());
16 let asset_selector = use_state(|| (String::new(), String::new(), String::new()));
17
18 let onsubmit =
19 use_callback(
20 (
21 edc_connector_context.clone(),
22 identifier.clone(),
23 access_policy_id.clone(),
24 contract_policy_id.clone(),
25 asset_selector.clone(),
26 ),
27 |event: SubmitEvent,
28 (
29 edc_connector_context,
30 identifier,
31 access_policy_id,
32 contract_policy_id,
33 asset_selector,
34 )| {
35 event.prevent_default();
36
37 let edc_connector_context = edc_connector_context.clone();
38 let identifier = (**identifier).clone();
39 let access_policy_id = (**access_policy_id).clone();
40 let contract_policy_id = (**contract_policy_id).clone();
41 let asset_selector = (**asset_selector).clone();
42
43 spawn_local(async move {
44 let new_contract_definition = NewContractDefinition::builder()
45 .id(&identifier)
46 .access_policy_id(access_policy_id)
47 .contract_policy_id(contract_policy_id);
48
49 let (left, operator, right) = asset_selector;
50 let new_contract_definition =
51 if !left.is_empty() && !operator.is_empty() && !right.is_empty() {
52 new_contract_definition.asset_selector(Criterion::new(&left, &operator, &right))
53 } else {
54 new_contract_definition
55 };
56
57 let new_contract_definition = new_contract_definition.build();
58
59 if let Some(client) = edc_connector_context.get_client() {
60 let _ = client
61 .contract_definitions()
62 .create(&new_contract_definition)
63 .await;
64 }
65 })
66 },
67 );
68
69 let onchange_identifier = {
70 let identifier = identifier.clone();
71
72 use_callback((), move |value, _| {
73 identifier.set(value);
74 })
75 };
76
77 let onchange_access_policy_id = {
78 let access_policy_id = access_policy_id.clone();
79
80 use_callback((), move |value, _| {
81 access_policy_id.set(value);
82 })
83 };
84
85 let onchange_contract_policy_id = {
86 let contract_policy_id = contract_policy_id.clone();
87
88 use_callback((), move |value, _| {
89 contract_policy_id.set(value);
90 })
91 };
92
93 let disabled = false;
94
95 let (operand_left, operator, operand_right) = (*asset_selector).clone();
96
97 let onchange_asset_selection = {
98 let asset_selector = asset_selector.clone();
99
100 use_callback((), move |value, _| {
101 asset_selector.set(value);
102 })
103 };
104
105 html!(
106 <Form {onsubmit}>
107 <FormGroup
108 label={"Identifier"}
109 required={true}
110 >
111 <TextInput
112 required={true}
113 value={(*identifier).to_string()}
114 onchange={onchange_identifier}
115 />
116 </FormGroup>
117
118 <FormGroup
119 label={"Access Policy ID"}
120 required={true}
121 >
122 <TextInput
123 required={true}
124 value={(*access_policy_id).to_string()}
125 onchange={onchange_access_policy_id}
126 />
127 </FormGroup>
128
129 <FormGroup
130 label={"Contract Policy ID"}
131 required={true}
132 >
133 <TextInput
134 required={true}
135 value={(*contract_policy_id).to_string()}
136 onchange={onchange_contract_policy_id}
137 />
138 </FormGroup>
139
140 <FormGroup
141 label={"Asset Selector"}
142 >
143 <CriterionEdit
144 {operand_left}
145 {operator}
146 {operand_right}
147 onchange={onchange_asset_selection} />
148 </FormGroup>
149
150 <ActionGroup>
151 <Button
152 variant={ButtonVariant::Primary}
153 label="Submit"
154 r#type={ButtonType::Submit}
155 {disabled}
156 />
157 <Button variant={ButtonVariant::Secondary} label="Reset" r#type={ButtonType::Reset}/>
158 </ActionGroup>
159 </Form>
160 )
161}