Skip to content

Commit 33de0a8

Browse files
committed
Fix perspective-config-update to fire on config change
Signed-off-by: Andrew Stein <steinlink@gmail.com>
1 parent c906456 commit 33de0a8

4 files changed

Lines changed: 61 additions & 5 deletions

File tree

rust/perspective-viewer/src/rust/components/status_bar.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,8 @@ impl Component for StatusBar {
196196
},
197197
};
198198

199-
let oninput = ctx.link().callback({
200-
move |input: InputEvent| {
199+
let onchange = ctx.link().callback({
200+
move |input: Event| {
201201
let title = input
202202
.target()
203203
.unwrap()
@@ -239,7 +239,7 @@ impl Component for StatusBar {
239239
placeholder=" "
240240
value={ctx.props().presentation.get_title()}
241241
size="10"
242-
{oninput}
242+
{onchange}
243243
/>
244244
<span id="status-bar-placeholder" />
245245
</label>

rust/perspective-viewer/src/rust/custom_events.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use crate::*;
3434
/// on `CustomElements`, but when it is `drop()` the Custom Element will no
3535
/// longer dispatch events such as `"perspective-config-change"`.
3636
#[derive(Clone)]
37-
pub struct CustomEvents(Rc<(CustomEventsDataRc, [Subscription; 5])>);
37+
pub struct CustomEvents(Rc<(CustomEventsDataRc, [Subscription; 6])>);
3838

3939
impl ImplicitClone for CustomEvents {}
4040
impl PartialEq for CustomEvents {
@@ -113,12 +113,18 @@ impl CustomEvents {
113113
move |_| data.clone().dispatch_config_update()
114114
});
115115

116+
let title_sub = presentation.title_changed.add_listener({
117+
clone!(data);
118+
move |_| data.clone().dispatch_config_update()
119+
});
120+
116121
Self(Rc::new((data, [
117122
theme_sub,
118123
settings_sub,
119124
column_settings_sub,
120125
plugin_sub,
121126
view_sub,
127+
title_sub,
122128
])))
123129
}
124130

rust/perspective-viewer/test/js/events.spec.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
1111
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
1212

13-
import { test, expect } from "@finos/perspective-test";
13+
import { test, expect, shadow_type } from "@finos/perspective-test";
1414
import {
1515
compareContentsToSnapshot,
1616
API_VERSION,
@@ -93,6 +93,45 @@ test.describe("Events", () => {
9393
]);
9494
});
9595

96+
test("Editing the title fires the 'perspective-config-update' event", async ({
97+
page,
98+
}) => {
99+
await page.evaluate(async () => {
100+
const viewer = document.querySelector("perspective-viewer");
101+
window["acc"] = [];
102+
103+
await viewer!.restore({
104+
settings: true,
105+
});
106+
107+
viewer!.addEventListener("perspective-config-update", (event) => {
108+
window["acc"].push(event.detail);
109+
});
110+
});
111+
112+
await shadow_type(
113+
page,
114+
"New Title",
115+
true,
116+
"perspective-viewer",
117+
"#status_bar",
118+
"input"
119+
);
120+
121+
const result = await page.evaluate(async () => {
122+
return window["acc"];
123+
});
124+
125+
expect(result.map((x) => x.title)).toEqual(["New Title"]);
126+
127+
const config = await page.evaluate(async () => {
128+
const viewer = document.querySelector("perspective-viewer");
129+
return await viewer?.save();
130+
});
131+
132+
expect(config.title).toEqual("New Title");
133+
});
134+
96135
// NOTE: Previously skipped, kept for future reference
97136
// test.skip("restore with a 'plugin' field fires the 'perspective-plugin-update' event", async ({
98137
// page,

tools/perspective-test/src/js/utils.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,17 @@ export async function shadow_type(
296296

297297
triggerInputEvent(elem);
298298
}
299+
300+
if (is_incremental) {
301+
if (elem instanceof HTMLElement) {
302+
const event = new Event("change", {
303+
bubbles: true,
304+
cancelable: true,
305+
});
306+
307+
elem.dispatchEvent(event);
308+
}
309+
}
299310
},
300311
{ content, path, is_incremental }
301312
);

0 commit comments

Comments
 (0)