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