use perspective_client::clone;
use perspective_js::utils::{ApiFuture, ApiResult};
use super::pipeline::RunOrigin;
use super::transactional_restore::restore_in_place;
use crate::config::{
ColumnConfigUpdate, OptionalUpdate, PluginConfigUpdate, PluginUpdate, ViewerConfigUpdate,
};
use crate::presentation::Presentation;
use crate::renderer::Renderer;
use crate::session::{OpKind, ResetOptions, Session};
pub fn reset_all(
session: &Session,
renderer: &Renderer,
presentation: &Presentation,
all: bool,
) -> ApiFuture<()> {
presentation.set_open_column_settings(None);
let ticket = session.submit(OpKind::Restore { update: None }, {
clone!(session, renderer, presentation);
move |_ctx| {
Box::pin(async move {
reset_all_step(&session, &renderer, &presentation, all).await?;
Ok(None)
})
}
});
ApiFuture::new(ticket.settle())
}
async fn reset_all_step(
session: &Session,
renderer: &Renderer,
presentation: &Presentation,
all: bool,
) -> ApiResult<()> {
{
session
.reset(ResetOptions {
config: true,
expressions: all,
..ResetOptions::default()
})
.await?;
presentation.reset_available_themes(None).await;
if all {
presentation.reset_theme().await?;
renderer.commit_theme(presentation.get_default_theme_name().await);
}
let (columns_config, plugin_config) = if all {
(
ColumnConfigUpdate::SetDefault,
PluginConfigUpdate::SetDefault,
)
} else {
(OptionalUpdate::Missing, OptionalUpdate::Missing)
};
let update = ViewerConfigUpdate {
plugin: PluginUpdate::SetDefault,
plugin_config,
columns_config,
..Default::default()
};
restore_in_place(session, renderer, presentation, RunOrigin::Public, update).await?;
renderer.reset_changed.emit(());
Ok(())
}
}