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}
14
15#[component]
16pub fn ShowAssetPage(props: &ShowAssetPageProps) -> Html {
17 html!(
18 <>
19 <Title level={Level::H2} size={Size::XXXLarge}>{ "Show Asset" }</Title>
20 <Suspense fallback="Loading ...">
21 <ShowAssetPageInner
22 asset_id={props.asset_id.clone()}
23 on_deleted={props.on_deleted.clone()}
24 />
25 </Suspense>
26 </>
27 )
28}
29
30#[component]
31pub fn ShowAssetPageInner(props: &ShowAssetPageProps) -> HtmlResult {
32 let edc_connector_client = use_edc_connector_context();
33
34 let asset = use_future_with(
35 (props.asset_id.clone(), edc_connector_client.clone()),
36 |properties| async move {
37 let (asset_id, edc_connector_client) = (*properties).clone();
38
39 if let Some(client) = edc_connector_client.get_client() {
40 client
41 .assets(EdcConnectorApiVersion::V4)
42 .get(&asset_id)
43 .await
44 .ok()
45 .map(AssetItem::from)
46 } else {
47 None
48 }
49 },
50 )?;
51
52 let asset = (*asset).clone();
53
54 let edc_connector_context = use_edc_connector_context();
55
56 let ondelete = use_callback(
57 (
58 props.asset_id.clone(),
59 edc_connector_context,
60 props.on_deleted.clone(),
61 ),
62 |_, (asset_id, edc_connector_context, on_deleted)| {
63 let edc_connector_context = edc_connector_context.clone();
64 let asset_id = asset_id.clone();
65 let on_deleted = on_deleted.clone();
66
67 spawn_local(async move {
68 if let Some(client) = edc_connector_context.get_client()
69 && client
70 .assets(EdcConnectorApiVersion::V4)
71 .delete(&asset_id)
72 .await
73 .is_ok()
74 {
75 on_deleted.emit(());
76 }
77 });
78 },
79 );
80
81 if let Some(asset_item) = asset {
82 let keywords = asset_item
83 .keywords
84 .iter()
85 .map(|keyword| html! { <Label label={keyword.to_string()} color={Color::Blue} /> });
86
87 Ok(html!(
88 <>
89 <Card>
90 <CardBody>
91 <DescriptionList>
92 <DescriptionGroup term="ID">{ asset_item.id }</DescriptionGroup>
93 </DescriptionList>
94 </CardBody>
95 </Card>
96 <Card>
97 <CardHeader>
98 <Title level={Level::H2} size={Size::XXXLarge}>{ "Provider Information" }</Title>
99 </CardHeader>
100 <CardBody>
101 <DescriptionList>
102 <DescriptionGroup term="Company Name">
103 { asset_item.creator.clone().and_then(|creator| creator.name).unwrap_or_default() }
104 </DescriptionGroup>
105 <DescriptionGroup term="Company Logo URL">
106 { asset_item.creator.and_then(|creator| creator.thumbnail).and_then(|thumbnail| thumbnail.resource).unwrap_or_default() }
107 </DescriptionGroup>
108 </DescriptionList>
109 </CardBody>
110 </Card>
111 <Card>
112 <CardHeader>
113 <Title level={Level::H2} size={Size::XXXLarge}>{ "Dataset Description" }</Title>
114 </CardHeader>
115 <CardBody>
116 <DescriptionList>
117 <DescriptionGroup term="Title">{ asset_item.name }</DescriptionGroup>
118 <DescriptionGroup term="Version">
119 { asset_item.version.map(|version| version.to_string()).unwrap_or_default() }
120 </DescriptionGroup>
121 <DescriptionGroup term="Description">
122 { asset_item.description.unwrap_or_default() }
123 </DescriptionGroup>
124 <DescriptionGroup term="Keywords">{ for keywords }</DescriptionGroup>
125 </DescriptionList>
126 </CardBody>
127 </Card>
128 <Card>
129 <CardHeader>
130 <Title level={Level::H2} size={Size::XXXLarge}>{ "Dataset Source" }</Title>
131 </CardHeader>
132 <CardBody>
133 <DescriptionList>
134 <DescriptionGroup term="Base URL">{ asset_item.base_url }</DescriptionGroup>
135 <DescriptionGroup term="Proxy Path">
136 <Switch disabled=true checked={asset_item.proxy_path} />
137 </DescriptionGroup>
138 <DescriptionGroup term="Proxy Query Parameters">
139 <Switch disabled=true checked={asset_item.proxy_query_params} />
140 </DescriptionGroup>
141 <DescriptionGroup term="Proxy Method">
142 <Switch disabled=true checked={asset_item.proxy_method} />
143 </DescriptionGroup>
144 <DescriptionGroup term="Proxy Body">
145 <Switch disabled=true checked={asset_item.proxy_body} />
146 </DescriptionGroup>
147 </DescriptionList>
148 </CardBody>
149 </Card>
150 <Flex>
151 <FlexItem modifiers={[FlexModifier::Grow.all()]} />
152 <FlexItem>
153 <Button variant={ButtonVariant::Danger} onclick={ondelete.clone()}>
154 { "Delete Asset" }
155 </Button>
156 </FlexItem>
157 </Flex>
158 </>
159 ))
160 } else {
161 Ok(html!(
162 format!(
163 "Asset with id {} not found.",
164 props.asset_id
165 )
166 ))
167 }
168}