Skip to main content

edc_web_components/pages/
show_asset_page.rs

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