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