edc_web_components/pages/
show_asset_page.rs1use crate::contexts::use_edc_connector_context;
2use crate::models::AssetItem;
3use edc_connector_client::EdcConnectorApiVersion;
4use patternfly_yew::prelude::*;
5use yew::platform::spawn_local;
6use yew::prelude::*;
7use yew::suspense::use_future_with;
8
9#[derive(Clone, Debug, PartialEq, Properties)]
10pub struct ShowAssetPageProps {
11 pub asset_id: String,
12 pub on_deleted: Callback<()>,
13 pub dcterm_types: Vec<(String, String)>,
14}
15
16#[component]
17pub fn ShowAssetPage(props: &ShowAssetPageProps) -> Html {
18 html!(
19 <>
20 <Title level={Level::H2} size={Size::XXXLarge}>{ "Show Asset" }</Title>
21 <Suspense fallback="Loading ...">
22 <ShowAssetPageInner
23 asset_id={props.asset_id.clone()}
24 on_deleted={props.on_deleted.clone()}
25 dcterm_types={props.dcterm_types.clone()}
26 />
27 </Suspense>
28 </>
29 )
30}
31
32#[component]
33pub fn ShowAssetPageInner(props: &ShowAssetPageProps) -> HtmlResult {
34 let edc_connector_client = use_edc_connector_context();
35
36 let asset = use_future_with(
37 (props.asset_id.clone(), edc_connector_client.clone()),
38 |properties| async move {
39 let (asset_id, edc_connector_client) = (*properties).clone();
40
41 if let Some(client) = edc_connector_client.get_client() {
42 client
43 .assets(EdcConnectorApiVersion::V4)
44 .get(&asset_id)
45 .await
46 .ok()
47 .map(AssetItem::from)
48 } else {
49 None
50 }
51 },
52 )?;
53
54 let asset = (*asset).clone();
55
56 let edc_connector_context = use_edc_connector_context();
57
58 let ondelete = use_callback(
59 (
60 props.asset_id.clone(),
61 edc_connector_context,
62 props.on_deleted.clone(),
63 ),
64 |_, (asset_id, edc_connector_context, on_deleted)| {
65 let edc_connector_context = edc_connector_context.clone();
66 let asset_id = asset_id.clone();
67 let on_deleted = on_deleted.clone();
68
69 spawn_local(async move {
70 if let Some(client) = edc_connector_context.get_client()
71 && client
72 .assets(EdcConnectorApiVersion::V4)
73 .delete(&asset_id)
74 .await
75 .is_ok()
76 {
77 on_deleted.emit(());
78 }
79 });
80 },
81 );
82
83 if let Some(asset_item) = asset {
84 let keywords = asset_item
85 .keywords
86 .iter()
87 .map(|keyword| html! { <Label label={keyword.to_string()} color={Color::Blue} /> });
88
89 let dcterm_types = if !asset_item.dcterm_types.is_empty() {
90 let labels = asset_item
91 .dcterm_types
92 .iter()
93 .map(|dcterm_type| {
94 props
95 .dcterm_types
96 .iter()
97 .find(|(dcterm_type_name, _)| dcterm_type_name == dcterm_type)
98 .map(|(_, dcterm_type_label)| dcterm_type_label.to_string())
99 .unwrap_or(dcterm_type.to_string())
100 })
101 .map(|dcterm_type| {
102 html_nested!(
103 <FlexItem>
104 <Label label={dcterm_type} />
105 </FlexItem>
106 )
107 });
108
109 html!(
110 <DescriptionGroup term="Dataset Type(s)">
111 <Flex>{ for labels }</Flex>
112 </DescriptionGroup>
113 )
114 } else {
115 html!()
116 };
117
118 Ok(html!(
119 <>
120 <Card>
121 <CardBody>
122 <DescriptionList>
123 <DescriptionGroup term="ID">{ asset_item.id }</DescriptionGroup>
124 </DescriptionList>
125 </CardBody>
126 </Card>
127 <Card>
128 <CardHeader>
129 <Title level={Level::H2} size={Size::XXXLarge}>{ "Provider Information" }</Title>
130 </CardHeader>
131 <CardBody>
132 <DescriptionList>
133 <DescriptionGroup term="Company Name">
134 { asset_item.creator.clone().and_then(|creator| creator.name).unwrap_or_default() }
135 </DescriptionGroup>
136 <DescriptionGroup term="Company Logo URL">
137 { asset_item.creator.and_then(|creator| creator.thumbnail).and_then(|thumbnail| thumbnail.resource).unwrap_or_default() }
138 </DescriptionGroup>
139 </DescriptionList>
140 </CardBody>
141 </Card>
142 <Card>
143 <CardHeader>
144 <Title level={Level::H2} size={Size::XXXLarge}>{ "Dataset Description" }</Title>
145 </CardHeader>
146 <CardBody>
147 <DescriptionList>
148 <DescriptionGroup term="Title">{ asset_item.name }</DescriptionGroup>
149 <DescriptionGroup term="Version">
150 { asset_item.version.map(|version| version.to_string()).unwrap_or_default() }
151 </DescriptionGroup>
152 <DescriptionGroup term="Description">
153 { asset_item.description.unwrap_or_default() }
154 </DescriptionGroup>
155 <DescriptionGroup term="Keywords">{ for keywords }</DescriptionGroup>
156 { dcterm_types }
157 </DescriptionList>
158 </CardBody>
159 </Card>
160 <Card>
161 <CardHeader>
162 <Title level={Level::H2} size={Size::XXXLarge}>{ "Dataset Source" }</Title>
163 </CardHeader>
164 <CardBody>
165 <DescriptionList>
166 <DescriptionGroup term="Base URL">{ asset_item.base_url }</DescriptionGroup>
167 <DescriptionGroup term="Proxy Path">
168 <Switch disabled=true checked={asset_item.proxy_path} />
169 </DescriptionGroup>
170 <DescriptionGroup term="Proxy Query Parameters">
171 <Switch disabled=true checked={asset_item.proxy_query_params} />
172 </DescriptionGroup>
173 <DescriptionGroup term="Proxy Method">
174 <Switch disabled=true checked={asset_item.proxy_method} />
175 </DescriptionGroup>
176 <DescriptionGroup term="Proxy Body">
177 <Switch disabled=true checked={asset_item.proxy_body} />
178 </DescriptionGroup>
179 </DescriptionList>
180 </CardBody>
181 </Card>
182 <Flex>
183 <FlexItem modifiers={[FlexModifier::Grow.all()]} />
184 <FlexItem>
185 <Button variant={ButtonVariant::Danger} onclick={ondelete.clone()}>
186 { "Delete Asset" }
187 </Button>
188 </FlexItem>
189 </Flex>
190 </>
191 ))
192 } else {
193 Ok(html!(
194 format!(
195 "Asset with id {} not found.",
196 props.asset_id
197 )
198 ))
199 }
200}