perspective_viewer/model/
edit_expression.rs

1// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2// ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
3// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
4// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
5// ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
6// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7// ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
8// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9// ┃ This file is part of the Perspective library, distributed under the terms ┃
10// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
13use 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    /// Spawns a future which will update the expression.
42    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    /// Saves a new expression. Spawns a future.
62    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 {}