Skip to main content

edc_web_components/pages/
common_expression_language_page.rs

1use crate::components::ListCommonExpressionLanguage;
2use crate::contexts::use_edc_connector_context;
3use crate::models::CommonExpressionLanguageItem;
4use edc_connector_client::EdcConnectorApiVersion;
5use edc_connector_client::types::query::Query;
6use patternfly_yew::prelude::*;
7use yew::platform::spawn_local;
8use yew::prelude::*;
9use yew::suspense::use_future_with;
10
11#[derive(Clone, Debug, PartialEq, Properties)]
12pub struct CommonExpressionLanguagePageProps {
13  pub on_new_cel: Callback<()>,
14  #[prop_or("Common Expression Language Library".to_string())]
15  pub title: String,
16  #[prop_or(None)]
17  pub tag_line: Option<String>,
18  #[prop_or("Create a CEL Expression".to_string())]
19  pub create_title: String,
20}
21#[component]
22pub fn CommonExpressionLanguagePage(props: &CommonExpressionLanguagePageProps) -> Html {
23  let refresh = use_state(|| 0usize);
24  let offset = use_state(|| 0usize);
25  let limit = use_state(|| 10usize);
26
27  let onoffset = use_callback(
28    (refresh.clone(), offset.setter()),
29    |offset, (refresh, offset_setter)| {
30      offset_setter.set(offset);
31      refresh.set(**refresh + 1);
32    },
33  );
34
35  let onlimit = use_callback(
36    (refresh.clone(), limit.setter()),
37    |limit, (refresh, limit_setter)| {
38      limit_setter.set(limit);
39      refresh.set(**refresh + 1);
40    },
41  );
42
43  let edc_connector_context = use_edc_connector_context();
44
45  let ondelete = use_callback(
46    (refresh.clone(), edc_connector_context),
47    |asset_id: String, (refresh, edc_connector_context)| {
48      let refresh = refresh.clone();
49      let edc_connector_context = edc_connector_context.clone();
50      let asset_id = asset_id.clone();
51
52      spawn_local(async move {
53        if let Some(client) = edc_connector_context.get_client() {
54          let _ = client
55            .common_expression_language(EdcConnectorApiVersion::V5Beta)
56            .delete(&asset_id)
57            .await;
58        }
59        refresh.set(*refresh + 1);
60      });
61    },
62  );
63
64  let onclick = use_callback(props.on_new_cel.clone(), |_, on_new_cel| {
65    on_new_cel.emit(());
66  });
67
68  let tag_line = props
69    .tag_line
70    .as_ref()
71    .map(|tag_line| html!(<p>{ tag_line }</p>))
72    .unwrap_or_default();
73
74  html!(
75    <Stack gutter=true>
76      <StackItem>
77        <Split gutter=true>
78          <SplitItem fill=true>
79            <Title level={Level::H3} size={Size::XXLarge}>{ &props.title }</Title>
80            { tag_line }
81          </SplitItem>
82          <SplitItem>
83            <Button icon={Icon::Plus} {onclick} variant={ButtonVariant::Primary}>
84              { &props.create_title }
85            </Button>
86          </SplitItem>
87        </Split>
88      </StackItem>
89      <StackItem>
90        <Suspense>
91          <CommonExpressionLanguagePageInner
92            offset={*offset}
93            limit={*limit}
94            {onoffset}
95            {onlimit}
96            {ondelete}
97            force_refresh={*refresh}
98          />
99        </Suspense>
100      </StackItem>
101    </Stack>
102  )
103}
104
105#[derive(Clone, Debug, PartialEq, Properties)]
106pub struct CommonExpressionLanguagePageInnerProps {
107  pub offset: usize,
108  pub limit: usize,
109  pub onoffset: Callback<usize>,
110  pub onlimit: Callback<usize>,
111  pub ondelete: Callback<String>,
112  pub force_refresh: usize,
113}
114
115#[component]
116pub fn CommonExpressionLanguagePageInner(
117  props: &CommonExpressionLanguagePageInnerProps,
118) -> HtmlResult {
119  let edc_connector_context = use_edc_connector_context();
120
121  let common_expression_language_items = use_future_with(
122    (
123      edc_connector_context,
124      props.limit,
125      props.offset,
126      props.force_refresh,
127    ),
128    |parameters| async move {
129      let (edc_connector_context, limit, offset, _) = (*parameters).clone();
130
131      let query = Query::builder()
132        .limit(limit as u32)
133        .offset(offset as u32)
134        // .filter("https://w3id.org/edc/v0.0.1/ns/master-catalog-company-id", "=", "424F9F7A-BBC8-4BAD-B128-C3D0A693ABBA")
135        .build();
136
137      if let Some(client) = edc_connector_context.get_client() {
138        client
139          .common_expression_language(EdcConnectorApiVersion::V5Beta)
140          .query(query)
141          .await
142          .map_err(|error| {
143            log::error!("Error: {}", error);
144            error
145          })
146          .unwrap_or_default()
147          .into_iter()
148          .map(CommonExpressionLanguageItem::from)
149          .collect::<Vec<_>>()
150      } else {
151        vec![]
152      }
153    },
154  )?;
155
156  let common_expression_language_items = (*common_expression_language_items).clone();
157
158  Ok(html!(
159    <ListCommonExpressionLanguage
160      common_expression_language_items={common_expression_language_items}
161      offset={props.offset}
162      limit={props.limit}
163      onoffset={props.onoffset.clone()}
164      onlimit={props.onlimit.clone()}
165      ondelete={props.ondelete.clone()}
166    />
167  ))
168}