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              <DescriptionGroup term="Landing Page">
157                { asset_item.landing_page.unwrap_or_default() }
158              </DescriptionGroup>
159              { dcterm_types }
160            </DescriptionList>
161          </CardBody>
162        </Card>
163        <Card>
164          <CardHeader>
165            <Title level={Level::H2} size={Size::XXXLarge}>{ "Dataset Source" }</Title>
166          </CardHeader>
167          <CardBody>
168            <Split gutter=true>
169              <SplitItem fill=true>
170                <DescriptionList>
171                  <DescriptionGroup term="Base URL">{ asset_item.base_url }</DescriptionGroup>
172                  <DescriptionGroup term="Proxy Path">
173                    <Switch disabled=true checked={asset_item.proxy_path} />
174                  </DescriptionGroup>
175                  <DescriptionGroup term="Proxy Query Parameters">
176                    <Switch disabled=true checked={asset_item.proxy_query_params} />
177                  </DescriptionGroup>
178                  <DescriptionGroup term="Proxy Method">
179                    <Switch disabled=true checked={asset_item.proxy_method} />
180                  </DescriptionGroup>
181                  <DescriptionGroup term="Proxy Body">
182                    <Switch disabled=true checked={asset_item.proxy_body} />
183                  </DescriptionGroup>
184                </DescriptionList>
185              </SplitItem>
186              <SplitItem fill=true>
187                <DescriptionList>
188                  <DescriptionGroup term="OpenID Client ID">
189                    { asset_item.oauth2_client_id }
190                  </DescriptionGroup>
191                  <DescriptionGroup term="OpenID Client Secret Key">
192                    { asset_item.oauth2_client_secret_key }
193                  </DescriptionGroup>
194                  <DescriptionGroup term="OpenID Token URL">
195                    { asset_item.oauth2_token_url }
196                  </DescriptionGroup>
197                  <DescriptionGroup term="OpenID Scopes">
198                    { asset_item.oauth2_scope }
199                  </DescriptionGroup>
200                </DescriptionList>
201              </SplitItem>
202            </Split>
203          </CardBody>
204        </Card>
205        <Flex>
206          <FlexItem modifiers={[FlexModifier::Grow.all()]} />
207          <FlexItem>
208            <Button variant={ButtonVariant::Danger} onclick={ondelete.clone()}>
209              { "Delete Asset" }
210            </Button>
211          </FlexItem>
212        </Flex>
213      </>
214    ))
215  } else {
216    Ok(html!(
217      format!(
218      "Asset with id {} not found.",
219      props.asset_id
220    )
221    ))
222  }
223}