edc_web_ui/components/
create_contract_definition.rs

1use 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}