Skip to content

Commit bf0efcb

Browse files
committed
Fix workspace special casing
This fixes the special case for datagrids by forcing plugins to use perspective-select events rather than attempting to handle both click and selects. This also fixes some issues with global filtering on datagrids where selections overlapped with collapsing/expanding rows. Signed-off-by: Timothy Bess <timbessmail@gmail.com>
1 parent c86b9a6 commit bf0efcb

File tree

6 files changed

+137
-49
lines changed

6 files changed

+137
-49
lines changed

packages/viewer-d3fc/src/ts/tooltip/selectionEvent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const raiseEvent = (node, data, settings) => {
2222
const filter = settings.filter.concat(groupFilters).concat(splitFilters);
2323

2424
node.dispatchEvent(
25-
new CustomEvent("perspective-click", {
25+
new CustomEvent("perspective-select", {
2626
bubbles: true,
2727
composed: true,
2828
detail: {

packages/viewer-datagrid/src/js/event_handlers/row_select_click.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@ export async function selectionListener(
1616
regularTable,
1717
viewer,
1818
selected_rows_map,
19+
/** @type {MouseEvent} */
1920
event,
2021
) {
2122
const meta = regularTable.getMeta(event.target);
2223
if (!viewer.hasAttribute("selectable")) return;
2324
if (event.handled) return;
24-
if (event.which !== 1) {
25+
if (event.shiftKey) return;
26+
if (event.button !== 0) {
2527
return;
2628
}
29+
event.stopImmediatePropagation();
2730

2831
if (!meta) {
2932
return;

packages/viewer-datagrid/src/js/plugin/activate.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,6 @@ export async function activate(view) {
9191
click_listener.bind(this.model, this.regular_table),
9292
);
9393

94-
// tree collapse, expand, edit button headers
95-
this.regular_table.addEventListener(
96-
"mousedown",
97-
mousedown_listener.bind(this.model, this.regular_table, viewer),
98-
);
99-
10094
// (Legacy) Row selection
10195
const selected_rows_map = new WeakMap();
10296
this.regular_table.addStyleListener(
@@ -138,6 +132,12 @@ export async function activate(view) {
138132
),
139133
);
140134

135+
// tree collapse, expand, edit button headers
136+
this.regular_table.addEventListener(
137+
"mousedown",
138+
mousedown_listener.bind(this.model, this.regular_table, viewer),
139+
);
140+
141141
// Editing
142142
const selected_position_map = new WeakMap();
143143
this.regular_table.addStyleListener(

packages/workspace/src/ts/workspace/workspace.ts

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -358,11 +358,6 @@ export class PerspectiveWorkspace extends SplitPanel {
358358
this.onPerspectiveSelect.bind(this),
359359
);
360360

361-
widget.viewer.addEventListener(
362-
"perspective-click",
363-
this.onPerspectiveSelect.bind(this),
364-
);
365-
366361
// TODO remove event listener
367362
this.masterPanel.addWidget(widget);
368363
}
@@ -556,14 +551,7 @@ export class PerspectiveWorkspace extends SplitPanel {
556551
const config = await (
557552
event.target as HTMLPerspectiveViewerElement
558553
).save();
559-
// perspective-select is already handled for hypergrid
560554

561-
if (
562-
event.type === "perspective-click" &&
563-
(config.plugin === "Datagrid" || config.plugin === null)
564-
) {
565-
return;
566-
}
567555
const candidates = new Set([
568556
...(config["group_by"] || []),
569557
...(config["split_by"] || []),
@@ -595,11 +583,6 @@ export class PerspectiveWorkspace extends SplitPanel {
595583
this.masterPanel.addWidget(widget);
596584
widget.isHidden && widget.show();
597585
widget.viewer.restyleElement();
598-
widget.viewer.addEventListener(
599-
"perspective-click",
600-
this.onPerspectiveSelect.bind(this),
601-
);
602-
603586
widget.viewer.addEventListener(
604587
"perspective-select",
605588
this.onPerspectiveSelect.bind(this),
@@ -618,11 +601,6 @@ export class PerspectiveWorkspace extends SplitPanel {
618601
}
619602

620603
widget.viewer.restyleElement();
621-
widget.viewer.removeEventListener(
622-
"perspective-click",
623-
this.onPerspectiveSelect.bind(this),
624-
);
625-
626604
widget.viewer.removeEventListener(
627605
"perspective-select",
628606
this.onPerspectiveSelect.bind(this),

packages/workspace/test/js/global_filter.spec.js

Lines changed: 126 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -98,35 +98,142 @@ function tests(context, compare) {
9898
},
9999
};
100100

101-
const cfg = await page.evaluate(async (config) => {
101+
async function awaitConfigChange() {
102+
return await page.evaluate(async () => {
103+
let resolve;
104+
const timer = new Promise((x) => {
105+
resolve = x;
106+
});
107+
108+
workspace.addEventListener("workspace-layout-update", resolve);
109+
await timer;
110+
workspace.removeEventListener(
111+
"workspace-layout-update",
112+
resolve,
113+
);
114+
115+
return await workspace.save();
116+
});
117+
}
118+
119+
await page.evaluate(async (config) => {
102120
const workspace = document.getElementById("workspace");
103121
await workspace.restore(config);
104122
await workspace.flush();
105-
const event = new Event("mousedown", { bubbles: true });
106-
event.which = 1;
123+
}, config);
107124

108-
document
109-
.querySelector(
110-
".workspace-master-widget perspective-viewer-datagrid",
111-
)
112-
.shadowRoot.querySelector(
113-
"tbody tr:nth-child(6) th:last-of-type",
114-
)
115-
.dispatchEvent(event);
125+
let cfgPromise = awaitConfigChange();
126+
await page
127+
.locator(".workspace-master-widget perspective-viewer-datagrid")
128+
.locator("tbody tr:nth-child(6) th:last-of-type")
129+
.click();
130+
let cfg = await cfgPromise;
116131

117-
let resolve;
118-
const timer = new Promise((x) => {
119-
resolve = x;
120-
});
132+
expect(cfg.viewers.Two.filter).toEqual([["State", "==", "Colorado"]]);
121133

122-
workspace.addEventListener("workspace-layout-update", resolve);
123-
await timer;
134+
cfgPromise = awaitConfigChange();
135+
await page
136+
.locator(".workspace-master-widget perspective-viewer-datagrid")
137+
.locator("tbody tr:nth-child(6) th:last-of-type")
138+
.click();
139+
cfg = await cfgPromise;
124140

125-
return await workspace.save();
141+
expect(cfg.viewers.Two.filter).toEqual([]);
142+
143+
return compare(page, `${context}-datagrid-filters-work.txt`);
144+
});
145+
146+
test("Child classes of datagrid behave the same way", async ({ page }) => {
147+
const config = {
148+
viewers: {
149+
One: {
150+
table: "superstore",
151+
name: "Test",
152+
group_by: ["State"],
153+
columns: ["Sales"],
154+
plugin: "My Datagrid",
155+
},
156+
Two: { table: "superstore", name: "One" },
157+
},
158+
master: {
159+
widgets: ["One"],
160+
},
161+
detail: {
162+
main: {
163+
currentIndex: 0,
164+
type: "tab-area",
165+
widgets: ["Two"],
166+
},
167+
},
168+
};
169+
170+
await page.evaluate(async () => {
171+
class MyGrid extends customElements.get(
172+
"perspective-viewer-datagrid",
173+
) {
174+
get name() {
175+
return "My Datagrid";
176+
}
177+
}
178+
customElements.define("my-grid", MyGrid);
179+
customElements.get("perspective-viewer").registerPlugin("my-grid");
180+
});
181+
182+
async function awaitConfigChange() {
183+
return await page.evaluate(async () => {
184+
let resolve;
185+
const timer = new Promise((x) => {
186+
resolve = x;
187+
});
188+
189+
workspace.addEventListener("workspace-layout-update", resolve);
190+
await timer;
191+
workspace.removeEventListener(
192+
"workspace-layout-update",
193+
resolve,
194+
);
195+
196+
return await workspace.save();
197+
});
198+
}
199+
200+
await page.evaluate(async (config) => {
201+
const workspace = document.getElementById("workspace");
202+
await workspace.restore(config);
203+
await workspace.flush();
126204
}, config);
127205

206+
let cfgPromise = awaitConfigChange();
207+
await page
208+
.locator(".workspace-master-widget my-grid")
209+
.locator("tbody tr:nth-child(6) th:last-of-type")
210+
.click();
211+
let cfg = await cfgPromise;
212+
128213
expect(cfg.viewers.Two.filter).toEqual([["State", "==", "Colorado"]]);
129-
return compare(page, `${context}-datagrid-filters-work.txt`);
214+
215+
cfgPromise = awaitConfigChange();
216+
await page
217+
.locator(".workspace-master-widget my-grid")
218+
.locator("tbody tr:nth-child(6) th:last-of-type")
219+
.click({
220+
delay: 10,
221+
});
222+
cfg = await cfgPromise;
223+
224+
// console.log("OLD", cfg.viewers.Two.filter);
225+
// await page.evaluate(async () => {
226+
// await new Promise((r) => setTimeout(r, 5000));
227+
// });
228+
// cfg = await page.evaluate(async () => {
229+
// const cfg = await workspace.save();
230+
// console.log("NEW", JSON.stringify(cfg.viewers.Two.filter));
231+
// return cfg;
232+
// });
233+
234+
expect(cfg.viewers.Two.filter).toEqual([]);
235+
236+
return compare(page, `${context}-my-datagrid-filters-work.txt`);
130237
});
131238
}
132239

131 KB
Binary file not shown.

0 commit comments

Comments
 (0)