Skip to main content

edc_web_components/components/
create_asset.rs

1use crate::contexts::use_edc_connector_context;
2use edc_connector_client::EdcConnectorApiVersion;
3use edc_connector_client::types::properties::ToValue;
4use edc_connector_client::types::{asset::NewAsset, data_address::DataAddress};
5use patternfly_yew::prelude::*;
6use std::collections::HashMap;
7use yew::platform::spawn_local;
8use yew::prelude::*;
9
10#[derive(Clone, Debug, PartialEq, Properties)]
11pub struct CreateAssetProps {
12  #[prop_or_default]
13  pub on_create: Callback<()>,
14}
15
16#[component]
17pub fn CreateAsset(props: &CreateAssetProps) -> Html {
18  let edc_connector_context = use_edc_connector_context();
19
20  let identifier = use_state(|| "".to_string());
21  let name = use_state(|| "".to_string());
22  let description = use_state(|| "".to_string());
23  let thumbnail_url = use_state(|| "".to_string());
24  let base_url = use_state(|| "".to_string());
25  let company_name = use_state(|| "".to_string());
26  let company_logo_url = use_state(|| "".to_string());
27  let content_type = use_state(|| "application/json".to_string());
28  let proxy_path = use_state(|| false);
29  let proxy_query_params = use_state(|| false);
30  let proxy_method = use_state(|| false);
31  let proxy_body = use_state(|| false);
32  let headers = use_state(HashMap::<String, String>::new);
33
34  let onsubmit = use_callback(
35    (
36      edc_connector_context.clone(),
37      identifier.clone(),
38      name.clone(),
39      base_url.clone(),
40      content_type.clone(),
41      proxy_path.clone(),
42      proxy_query_params.clone(),
43      proxy_method.clone(),
44      proxy_body.clone(),
45      headers.clone(),
46      props.on_create.clone(),
47    ),
48    |event: SubmitEvent,
49     (
50      edc_connector_context,
51      identifier,
52      name,
53      base_url,
54      content_type,
55      proxy_path,
56      proxy_query_params,
57      proxy_method,
58      proxy_body,
59      headers,
60      on_create,
61    )| {
62      event.prevent_default();
63
64      let identifier = (**identifier).clone();
65      let name = (**name).clone();
66      let base_url = (**base_url).clone();
67      let content_type = (**content_type).clone();
68      let proxy_path = **proxy_path;
69      let proxy_query_params = **proxy_query_params;
70      let proxy_method = **proxy_method;
71      let proxy_body = **proxy_body;
72      let headers = (**headers).clone();
73      let edc_connector_context = edc_connector_context.clone();
74      let on_create = on_create.clone();
75
76      spawn_local(async move {
77        let mut data_address_builder = DataAddress::builder()
78          .kind("HttpData")
79          .property("baseUrl", base_url)
80          .property("proxyPath", if proxy_path { "true" } else { "false" })
81          .property(
82            "proxyQueryParams",
83            if proxy_query_params { "true" } else { "false" },
84          )
85          .property("proxyMethod", if proxy_method { "true" } else { "false" })
86          .property("proxyBody", if proxy_body { "true" } else { "false" });
87
88        struct DcatService {
89          title: String,
90        }
91        impl ToValue for DcatService {
92          fn into_value(self) -> serde_json::Value {
93            serde_json::json!({
94              "@type": "http://www.w3.org/ns/dcat#DataService",
95              "dcterms:title": self.title
96            })
97          }
98        }
99
100        for (key, value) in &headers {
101          data_address_builder = data_address_builder.property(&format!("header:{key}"), value);
102        }
103
104        let data_address = data_address_builder.build().unwrap();
105
106        let new_asset = NewAsset::builder()
107          .id(&identifier)
108          .data_address(data_address)
109          .property("name", name)
110          .property("contenttype", content_type)
111          .property(
112            "http://www.w3.org/ns/dcat#service",
113            DcatService {
114              title: "test".to_string(),
115            },
116          )
117          .property(
118            "http://purl.org/dc/terms/title",
119            DcatService {
120              title: "test".to_string(),
121            },
122          )
123          .build();
124
125        if let Some(client) = edc_connector_context.get_client() {
126          if let Err(error) = client
127            .assets(EdcConnectorApiVersion::V4)
128            .create(&new_asset)
129            .await
130          {
131            log::error!("Error creating asset: {}", error);
132          } else {
133            on_create.emit(());
134          }
135        }
136      })
137    },
138  );
139
140  let onchange_identifier = use_callback(identifier.setter(), |value, identifier_setter| {
141    identifier_setter.set(value);
142  });
143
144  let onchange_name = use_callback(name.setter(), |value, name_setter| {
145    name_setter.set(value);
146  });
147
148  let onchange_description = use_callback(description.setter(), |value, description_setter| {
149    description_setter.set(value);
150  });
151
152  let onchange_thumbnail_url =
153    use_callback(thumbnail_url.setter(), |value, thumbnail_url_setter| {
154      thumbnail_url_setter.set(value);
155    });
156
157  let onchange_company_name = use_callback(company_name.setter(), |value, company_name_setter| {
158    company_name_setter.set(value);
159  });
160
161  let onchange_company_logo_url = use_callback(
162    company_logo_url.setter(),
163    |value, company_logo_url_setter| {
164      company_logo_url_setter.set(value);
165    },
166  );
167
168  let onchange_base_url = use_callback(base_url.setter(), |value, base_url_setter| {
169    base_url_setter.set(value);
170  });
171
172  let onchange_content_type = use_callback(content_type.setter(), |value, content_type_setter| {
173    content_type_setter.set(value);
174  });
175
176  let onchange_proxy_path = use_callback(proxy_path.setter(), |value, proxy_path_setter| {
177    proxy_path_setter.set(value);
178  });
179
180  let onchange_proxy_query_params = use_callback(
181    proxy_query_params.setter(),
182    |value, proxy_query_params_setter| {
183      proxy_query_params_setter.set(value);
184    },
185  );
186
187  let onchange_proxy_method = use_callback(proxy_method.setter(), |value, proxy_method_setter| {
188    proxy_method_setter.set(value);
189  });
190
191  let onchange_proxy_body = use_callback(proxy_body.setter(), |value, proxy_body_setter| {
192    proxy_body_setter.set(value);
193  });
194
195  let disabled = (*name).is_empty() || (*base_url).is_empty();
196
197  html!(
198    <Form {onsubmit}>
199      <FormGroup label="Identifier">
200        <TextInput required=true value={(*identifier).to_string()} onchange={onchange_identifier} />
201      </FormGroup>
202      <FormGroup label="Title" required=true>
203        <TextInput required=true value={(*name).to_string()} onchange={onchange_name} />
204      </FormGroup>
205      <FormGroup label="Description">
206        <TextArea required=true value={(*description).to_string()} onchange={onchange_description} />
207      </FormGroup>
208      <FormGroup label="Thumbnail URL">
209        <TextInput
210          required=true
211          value={(*thumbnail_url).to_string()}
212          onchange={onchange_thumbnail_url}
213        />
214      </FormGroup>
215      <FormGroup label="Company Name">
216        <TextArea
217          required=true
218          value={(*company_name).to_string()}
219          onchange={onchange_company_name}
220        />
221      </FormGroup>
222      <FormGroup label="Company Logo URL">
223        <TextInput
224          required=true
225          value={(*company_logo_url).to_string()}
226          onchange={onchange_company_logo_url}
227        />
228      </FormGroup>
229      <FormGroup label="Base URL" required=true>
230        <TextInput
231          required=true
232          value={(*base_url).to_string()}
233          onchange={onchange_base_url}
234          r#type={TextInputType::Url}
235        />
236      </FormGroup>
237      <FormGroup label="Content Type">
238        <TextInput value={(*content_type).to_string()} onchange={onchange_content_type} />
239      </FormGroup>
240      <FormGroup label="Proxy Path">
241        <Switch checked={*proxy_path} onchange={onchange_proxy_path} />
242      </FormGroup>
243      <FormGroup label="Proxy Query Parameters">
244        <Switch checked={*proxy_query_params} onchange={onchange_proxy_query_params} />
245      </FormGroup>
246      <FormGroup label="Proxy Method">
247        <Switch checked={*proxy_method} onchange={onchange_proxy_method} />
248      </FormGroup>
249      <FormGroup label="Proxy Body">
250        <Switch checked={*proxy_body} onchange={onchange_proxy_body} />
251      </FormGroup>
252      <ActionGroup>
253        <Button
254          variant={ButtonVariant::Primary}
255          label="Submit"
256          r#type={ButtonType::Submit}
257          {disabled}
258        />
259        <Button variant={ButtonVariant::Secondary} label="Reset" r#type={ButtonType::Reset} />
260      </ActionGroup>
261    </Form>
262  )
263}