edc_web_components/components/
create_asset.rs1use 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}