edc_web_components/components/
list_common_expression_language.rs1use crate::models::CommonExpressionLanguageItem;
2use patternfly_yew::prelude::*;
3use std::rc::Rc;
4use yew::prelude::*;
5
6#[derive(Clone, Debug, PartialEq, Properties)]
7pub struct ListCommonExpressionLanguageProps {
8 pub common_expression_language_items: Vec<CommonExpressionLanguageItem>,
9 pub offset: usize,
10 pub limit: usize,
11 pub onoffset: Callback<usize>,
12 pub onlimit: Callback<usize>,
13 pub ondelete: Callback<String>,
14}
15
16#[component]
17pub fn ListCommonExpressionLanguage(props: &ListCommonExpressionLanguageProps) -> Html {
18 let header = html_nested! {
19 <TableHeader<Columns>>
20 <TableColumn<Columns> label="ID" index={Columns::Id} />
21 <TableColumn<Columns> label="Left Operand" index={Columns::LeftOperand} />
22 <TableColumn<Columns> label="Description" index={Columns::Description} />
23 <TableColumn<Columns> label="Scopes" index={Columns::Scopes} />
24 <TableColumn<Columns> label="Expression" index={Columns::Expression} />
25 <TableColumn<Columns> label="" index={Columns::Actions} />
26 </TableHeader<Columns>>
27 };
28
29 let total_entries: Option<usize> = None;
30
31 let nav_callback = use_callback(
32 (
33 props.offset,
34 props.limit,
35 total_entries,
36 props.onoffset.clone(),
37 ),
38 |page: Navigation, (offset, limit, total_entries, onoffset)| {
39 let offset = match page {
40 Navigation::First => 0,
41 Navigation::Last => (total_entries.unwrap_or_default().saturating_sub(1) / limit) * limit,
42 Navigation::Previous => *offset - limit,
43 Navigation::Next => *offset + limit,
44 Navigation::Page(n) => n * limit,
45 };
46
47 onoffset.emit(offset);
48 },
49 );
50
51 let rows = props
52 .common_expression_language_items
53 .iter()
54 .map(
55 |common_expression_language_item| ListCommonExpressionLanguageRenderer {
56 common_expression_language: common_expression_language_item.clone(),
57 ondelete: props.ondelete.clone(),
58 },
59 )
60 .collect();
61
62 let (entries, _) = use_table_data(MemoizedTableModel::new(Rc::new(rows)));
63
64 html!(
65 <>
66 <Toolbar>
67 <ToolbarContent>
68 <ToolbarItem r#type={ToolbarItemType::Pagination}>
69 <Pagination
70 offset={props.offset}
71 entries_per_page_choices={vec![5, 10, 25, 50, 100]}
72 selected_choice={props.limit}
73 onlimit={&props.onlimit}
74 onnavigation={&nav_callback}
75 />
76 </ToolbarItem>
77 </ToolbarContent>
78 </Toolbar>
79 <Table<Columns, UseTableData<Columns, MemoizedTableModel<ListCommonExpressionLanguageRenderer>>> mode={TableMode::Compact} {header} {entries} />
80 </>
81 )
82}
83
84#[derive(Clone, Debug, Eq, PartialEq)]
85enum Columns {
86 Id,
87 LeftOperand,
88 Description,
89 Scopes,
90 Expression,
91 Actions,
92}
93
94#[derive(Clone, Debug)]
95struct ListCommonExpressionLanguageRenderer {
96 common_expression_language: CommonExpressionLanguageItem,
97 ondelete: Callback<String>,
98}
99
100impl TableEntryRenderer<Columns> for ListCommonExpressionLanguageRenderer {
101 fn render_cell(&self, context: CellContext<'_, Columns>) -> Cell {
102 match context.column {
103 Columns::Id => html! { self.common_expression_language.id.to_owned() },
104 Columns::LeftOperand => html!(self.common_expression_language.left_operand.to_owned()),
105 Columns::Description => html!(
106 self
107 .common_expression_language
108 .description
109 .clone()
110 .unwrap_or_default()
111 ),
112 Columns::Scopes => html!(self.common_expression_language.scopes.to_owned().join(", ")),
113 Columns::Expression => html!(
114 <ShowExpression expression={self.common_expression_language.expression.to_owned()} />
115 ),
116 Columns::Actions => {
117 let common_expression_language_id = self.common_expression_language.id.to_string();
118
119 html!(
120 <DeleteCommonExpressionLanguage
121 {common_expression_language_id}
122 ondelete={self.ondelete.clone()}
123 />
124 )
125 }
126 }
127 .into()
128 }
129}
130
131#[derive(Clone, PartialEq, Properties)]
132pub struct ShowExpressionProps {
133 pub expression: String,
134}
135
136#[function_component]
137pub fn ShowExpression(props: &ShowExpressionProps) -> Html {
138 let backdropper = use_backdrop();
139
140 let onclick = use_callback(
141 (backdropper.clone(), props.expression.clone()),
142 |_, (backdropper, expression)| {
143 let expression = expression.clone();
144 if let Some(backdropper) = backdropper {
145 backdropper.open(html!(
146 <Bullseye>
147 <Modal variant={ModalVariant::Large} title="Common Expression Language">
148 <CodeBlock>
149 <CodeBlockCode>{ expression }</CodeBlockCode>
150 </CodeBlock>
151 </Modal>
152 </Bullseye>
153 ))
154 }
155 },
156 );
157
158 html!(<Button variant={ButtonVariant::Primary} icon={Icon::Eye} {onclick}>{ "Show" }</Button>)
159}
160
161#[derive(Clone, PartialEq, Properties)]
162pub struct DeleteCommonExpressionLanguageProps {
163 pub common_expression_language_id: String,
164 pub ondelete: Callback<String>,
165}
166
167#[function_component]
168pub fn DeleteCommonExpressionLanguage(props: &DeleteCommonExpressionLanguageProps) -> Html {
169 let onclick = use_callback(
170 (
171 props.common_expression_language_id.clone(),
172 props.ondelete.clone(),
173 ),
174 |_, (common_expression_language_id, ondelete)| {
175 ondelete.emit(common_expression_language_id.to_string());
176 },
177 );
178
179 html!(<Button variant={ButtonVariant::Danger} icon={Icon::Trash} {onclick}>{ "Delete" }</Button>)
180}