perspective_viewer/model/
edit_expression.rs1use perspective_client::config::{Expression, ViewConfigUpdate};
14
15use super::UpdateAndRender;
16use super::structural::*;
17use crate::components::column_settings_sidebar::ColumnSettingsTab;
18use crate::components::viewer::ColumnLocator;
19use crate::presentation::{OpenColumnSettings, Presentation};
20use crate::renderer::Renderer;
21use crate::session::Session;
22use crate::*;
23
24#[derive(PartialEq)]
25pub struct ExpressionUpdater {
26 presentation: Presentation,
27 renderer: Renderer,
28 session: Session,
29}
30derive_model!(Presentation, Renderer, Session for ExpressionUpdater);
31
32pub trait EditExpression: HasPresentation + HasRenderer + HasSession + UpdateAndRender {
33 fn get_expression_updater(&self) -> ExpressionUpdater {
34 ExpressionUpdater {
35 presentation: self.presentation().clone(),
36 renderer: self.renderer().clone(),
37 session: self.session().clone(),
38 }
39 }
40
41 fn update_expr(&self, old_name: String, new_expr: Expression<'static>) {
43 let this = self.get_expression_updater();
44 ApiFuture::spawn(async move {
45 let update = this
46 .session
47 .create_replace_expression_update(&old_name, &new_expr)
48 .await;
49
50 this.presentation
51 .set_open_column_settings(Some(OpenColumnSettings {
52 locator: Some(ColumnLocator::Expression(new_expr.name.to_string())),
53 tab: Some(ColumnSettingsTab::Attributes),
54 }));
55
56 this.update_and_render(update)?.await?;
57 Ok(())
58 });
59 }
60
61 fn save_expr(&self, expr: Expression) -> ApiResult<()> {
63 let task = {
64 let mut serde_exprs = self.session().get_view_config().expressions.clone();
65 serde_exprs.insert(&expr);
66 self.presentation()
67 .set_open_column_settings(Some(OpenColumnSettings {
68 locator: Some(ColumnLocator::Expression(expr.name.clone().into())),
69 tab: Some(ColumnSettingsTab::Attributes),
70 }));
71 self.update_and_render(ViewConfigUpdate {
72 expressions: Some(serde_exprs),
73 ..Default::default()
74 })
75 }?;
76
77 ApiFuture::spawn(task);
78 Ok(())
79 }
80
81 fn delete_expr(&self, expr_name: &str) -> ApiResult<()> {
82 let mut serde_exprs = self.session().get_view_config().expressions.clone();
83 serde_exprs.remove(expr_name);
84 let config = ViewConfigUpdate {
85 expressions: Some(serde_exprs),
86 ..ViewConfigUpdate::default()
87 };
88
89 let task = self.update_and_render(config)?;
90 ApiFuture::spawn(task);
91 Ok(())
92 }
93}
94
95impl<T: HasRenderer + HasSession + HasPresentation + UpdateAndRender> EditExpression for T {}