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 #[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 .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}