Skip to main content

edc_web_components/pages/
asset_page.rs

1use crate::components::ListAssets;
2use crate::contexts::use_edc_connector_context;
3use crate::models::AssetItem;
4use edc_connector_client::EdcConnectorApiVersion;
5use edc_connector_client::types::query::Query;
6use patternfly_yew::prelude::*;
7use yew::prelude::*;
8use yew::suspense::use_future_with;
9
10#[derive(Clone, Debug, PartialEq, Properties)]
11pub struct AssetPageProps {
12  pub on_new_asset: Callback<()>,
13  pub onshow: Callback<String>,
14}
15
16#[component]
17pub fn AssetPage(props: &AssetPageProps) -> Html {
18  let refresh = use_state(|| 0usize);
19  let offset = use_state(|| 0usize);
20  let limit = use_state(|| 10usize);
21
22  let onoffset = use_callback(
23    (refresh.clone(), offset.setter()),
24    |offset, (refresh, offset_setter)| {
25      offset_setter.set(offset);
26      refresh.set(**refresh + 1);
27    },
28  );
29
30  let onlimit = use_callback(
31    (refresh.clone(), limit.setter()),
32    |limit, (refresh, limit_setter)| {
33      limit_setter.set(limit);
34      refresh.set(**refresh + 1);
35    },
36  );
37
38  let onclick = use_callback(props.on_new_asset.clone(), |_, on_new_asset| {
39    on_new_asset.emit(());
40  });
41
42  html!(
43    <Stack gutter=true>
44      <StackItem>
45        <Split gutter=true>
46          <SplitItem fill=true>
47            <Title level={Level::H3} size={Size::XXLarge}>{ "List Assets" }</Title>
48          </SplitItem>
49          <SplitItem>
50            <Button icon={Icon::Plus} {onclick} variant={ButtonVariant::Primary}>
51              { "Create an Asset" }
52            </Button>
53          </SplitItem>
54        </Split>
55      </StackItem>
56      <StackItem>
57        <Suspense>
58          <AssetPageInner
59            offset={*offset}
60            limit={*limit}
61            {onoffset}
62            {onlimit}
63            onshow={props.onshow.clone()}
64            force_refresh={*refresh}
65          />
66        </Suspense>
67      </StackItem>
68    </Stack>
69  )
70}
71
72#[derive(Clone, Debug, PartialEq, Properties)]
73pub struct AssetPageInnerProps {
74  pub offset: usize,
75  pub limit: usize,
76  pub onoffset: Callback<usize>,
77  pub onlimit: Callback<usize>,
78  pub onshow: Callback<String>,
79  pub force_refresh: usize,
80}
81
82#[component]
83pub fn AssetPageInner(props: &AssetPageInnerProps) -> HtmlResult {
84  let edc_connector_context = use_edc_connector_context();
85
86  let asset_items = use_future_with(
87    (
88      edc_connector_context,
89      props.limit,
90      props.offset,
91      props.force_refresh,
92    ),
93    |parameters| async move {
94      let (edc_connector_context, limit, offset, _) = (*parameters).clone();
95
96      let query = Query::builder()
97        .limit(limit as u32)
98        .offset(offset as u32)
99        .build();
100
101      if let Some(client) = edc_connector_context.get_client() {
102        let items = client
103          .assets(EdcConnectorApiVersion::V4)
104          .query(query)
105          .await
106          .map_err(|error| {
107            log::error!("Error: {}", error);
108            error
109          })
110          .unwrap_or_default();
111
112        items.into_iter().map(AssetItem::from).collect::<Vec<_>>()
113      } else {
114        vec![]
115      }
116    },
117  )?;
118
119  let asset_items = (*asset_items).clone();
120
121  Ok(html!(
122    <ListAssets
123      asset_items={asset_items}
124      offset={props.offset}
125      limit={props.limit}
126      onoffset={props.onoffset.clone()}
127      onlimit={props.onlimit.clone()}
128      onshow={props.onshow.clone()}
129    />
130  ))
131}