Skip to content

Commit f733b6e

Browse files
committed
Fix perspective-workspace restore call on errored table
Signed-off-by: Andrew Stein <[email protected]>
1 parent e9b6cfa commit f733b6e

File tree

7 files changed

+76
-18
lines changed

7 files changed

+76
-18
lines changed

packages/perspective-viewer-datagrid/src/js/model/toolbar.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,21 @@ export function toggle_edit_mode(mode = undefined) {
2626
];
2727
}
2828

29-
this.model._edit_mode = mode;
30-
this.parentElement?.setSelection();
31-
this.model._selection_state = {
32-
selected_areas: [],
33-
dirty: true,
34-
};
29+
if (this.model) {
30+
this.model._edit_mode = mode;
31+
this.parentElement?.setSelection();
32+
this.model._selection_state = {
33+
selected_areas: [],
34+
dirty: true,
35+
};
3536

36-
this._edit_mode = mode;
37-
this.dataset.editMode = mode;
38-
if (this._edit_button !== undefined) {
39-
this._edit_button.dataset.editMode = mode;
37+
this._edit_mode = mode;
38+
if (this._edit_button !== undefined) {
39+
this._edit_button.dataset.editMode = mode;
40+
}
4041
}
42+
43+
this.dataset.editMode = mode;
4144
}
4245

4346
export function toggle_scroll_lock(force = undefined) {

packages/perspective-workspace/test/js/table.spec.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,57 @@ function tests(context, compare) {
5858

5959
return compare(page, `${context}-replace-table-frees-table.txt`);
6060
});
61+
62+
test("replaceTable() works when previous table errored", async ({
63+
page,
64+
}) => {
65+
const config = {
66+
viewers: {
67+
One: { table: "errored", name: "One" },
68+
},
69+
detail: {
70+
main: {
71+
currentIndex: 0,
72+
type: "tab-area",
73+
widgets: ["One"],
74+
},
75+
},
76+
};
77+
78+
const result = await page.evaluate(async (config) => {
79+
const workspace = document.getElementById("workspace");
80+
await workspace.addTable(
81+
"errored",
82+
new Promise((_, reject) => setTimeout(reject, 50))
83+
);
84+
85+
try {
86+
await workspace.restore(config);
87+
} catch (e) {
88+
console.error(e);
89+
return e.toString();
90+
}
91+
}, config);
92+
93+
// NOTE This is the error message we expect when `restore()` is called
94+
// without a `Table`, subject to change.
95+
expect(result).toEqual("Error: `restore()` called before `load()`");
96+
await page.evaluate(async () => {
97+
await workspace.replaceTable(
98+
"errored",
99+
window.__WORKER__.table("x\n1")
100+
);
101+
});
102+
103+
await page.evaluate(async () => {
104+
await workspace.flush();
105+
});
106+
107+
return compare(
108+
page,
109+
`${context}-replace-table-works-with-errored-table.txt`
110+
);
111+
});
61112
}
62113

63114
test.describe("Workspace table functions", () => {

rust/perspective-viewer/src/rust/components/column_settings_sidebar/style_tab.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl StyleTabProps {
5252
.presentation
5353
.update_columns_config_value(props.column_name.clone(), update);
5454
let columns_configs = props.presentation.all_columns_configs();
55-
let plugin_config = props.renderer.get_active_plugin()?.save();
55+
let plugin_config = props.renderer.get_active_plugin()?.save()?;
5656
props
5757
.renderer
5858
.get_active_plugin()?

rust/perspective-viewer/src/rust/js/plugin.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ extern "C" {
6161
#[wasm_bindgen(method, catch)]
6262
pub fn column_style_controls(this: &JsPerspectiveViewerPlugin, view_type: &str, group: Option<&str>) -> ApiResult<JsValue>;
6363

64-
#[wasm_bindgen(method)]
65-
pub fn save(this: &JsPerspectiveViewerPlugin) -> JsValue;
64+
#[wasm_bindgen(method, catch)]
65+
pub fn save(this: &JsPerspectiveViewerPlugin) -> ApiResult<JsValue>;
6666

67-
#[wasm_bindgen(method, js_name=restore)]
68-
pub fn _restore(this: &JsPerspectiveViewerPlugin, token: &JsValue, columns_config: &JsValue);
67+
#[wasm_bindgen(method, js_name=restore, catch)]
68+
pub fn _restore(this: &JsPerspectiveViewerPlugin, token: &JsValue, columns_config: &JsValue) -> ApiResult<()>;
6969

7070
#[wasm_bindgen(method)]
7171
pub fn delete(this: &JsPerspectiveViewerPlugin);
@@ -103,7 +103,11 @@ extern "C" {
103103
}
104104

105105
impl JsPerspectiveViewerPlugin {
106-
pub fn restore(&self, token: &JsValue, columns_config: Option<&ColumnConfigMap>) {
106+
pub fn restore(
107+
&self,
108+
token: &JsValue,
109+
columns_config: Option<&ColumnConfigMap>,
110+
) -> ApiResult<()> {
107111
let columns_config = JsValue::from_serde_ext(&columns_config).unwrap();
108112
self._restore(token, &columns_config)
109113
}

rust/perspective-viewer/src/rust/model/get_viewer_config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub trait GetViewerConfigModel: HasSession + HasRenderer + HasPresentation {
5454
let js_plugin = renderer.get_active_plugin()?;
5555
let settings = presentation.is_settings_open();
5656
let plugin = js_plugin.name();
57-
let plugin_config: serde_json::Value = js_plugin.save().into_serde_ext()?;
57+
let plugin_config: serde_json::Value = js_plugin.save()?.into_serde_ext()?;
5858
let theme = presentation.get_selected_theme_name().await;
5959
let title = presentation.get_title();
6060
let columns_config = presentation.all_columns_configs();

rust/perspective-viewer/src/rust/model/restore_and_render.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ pub trait RestoreAndRender: HasRenderer + HasSession + HasPresentation {
8181
let plugin_update = if let Some(x) = plugin_config {
8282
wasm_bindgen::JsValue::from_serde_ext(&*x).unwrap()
8383
} else {
84-
plugin.save()
84+
plugin.save()?
8585
};
8686

8787
presentation.update_columns_configs(columns_config);
70 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)