use futures::FutureExt;
use perspective_client::clone;
use perspective_js::utils::*;
use crate::config::ColumnConfigFieldUpdate;
use crate::renderer::{Renderer, StagedEdit};
use crate::session::{EditDelta, OpKind, Session};
pub fn send_column_config(
session: &Session,
renderer: &Renderer,
column_name: &str,
update: ColumnConfigFieldUpdate,
) {
let column = column_name.to_string();
let staged = renderer.stage(StagedEdit::ColumnField {
column: column.clone(),
update: update.clone(),
});
let kind = OpKind::Edit {
delta: EditDelta::Renderer,
swaps_plugin: false,
};
let ticket = session.submit(kind, {
clone!(session, renderer);
move |_ctx| {
Box::pin(async move {
let view_config = session.committed_view_config().clone();
renderer.update_columns_config_field(&view_config, &session, column, update);
drop(staged);
Ok(Some(
async move {
let view_config_snapshot = session.committed_view_config().clone();
let columns_configs = renderer
.all_columns_configs_materialized(&view_config_snapshot, &session)
.await;
let plugin_token = wasm_bindgen::JsValue::from_serde_ext(
&renderer.committed_plugin_config(),
)
.unwrap();
renderer
.ensure_plugin_selected()?
.restore(&plugin_token, Some(&columns_configs))?;
clone!(session);
renderer
.update_lazy(async move { Ok(session.get_view_with_dimensions()) })
.await?;
renderer
.columns_config_changed
.emit(columns_configs.clone());
renderer.column_style_changed.emit(columns_configs);
Ok(())
}
.boxed_local(),
))
})
}
});
ApiFuture::spawn(ticket.settle());
}