edc_web_components/pages/
common_expression_language_page.rs1use 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 .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}