Skip to main content

edc_web_components/components/
list_common_expression_language.rs

1use 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}