Skip to content

Commit c67fd54

Browse files
committed
Fix datagrid editing and add tests
Signed-off-by: Andrew Stein <steinlink@gmail.com>
1 parent 855a37a commit c67fd54

3 files changed

Lines changed: 100 additions & 2 deletions

File tree

packages/perspective-viewer-datagrid/src/js/event_handlers/header_click.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export async function mousedown_listener(regularTable, viewer, event) {
3030
}
3131
}
3232

33-
event.preventDefault();
3433
if (target.classList.contains("psp-tree-label")) {
3534
expandCollapseHandler.call(this, regularTable, event);
3635
return;

packages/perspective-viewer-datagrid/test/js/superstore.spec.js

Lines changed: 86 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 } from "@finos/perspective-test";
13+
import { shadow_type, test } from "@finos/perspective-test";
1414
import {
1515
compareContentsToSnapshot,
1616
run_standard_tests,
@@ -120,6 +120,91 @@ test.describe("Datagrid with superstore data set", () => {
120120
"a-filtered-to-empty-dataset-with-group-by-and-split-by-does-not-error-internally.txt"
121121
);
122122
});
123+
124+
test("An editable datagrid is editable through mouse interaction", async ({
125+
page,
126+
}) => {
127+
await page.goto("/tools/perspective-test/src/html/basic-test.html");
128+
await page.evaluate(async () => {
129+
while (!window["__TEST_PERSPECTIVE_READY__"]) {
130+
await new Promise((x) => setTimeout(x, 10));
131+
}
132+
});
133+
134+
await page.evaluate(async () => {
135+
await document.querySelector("perspective-viewer").restore({
136+
plugin: "Datagrid",
137+
plugin_config: {
138+
edit_mode: "EDIT",
139+
},
140+
columns: ["State", "City", "Customer ID"],
141+
});
142+
});
143+
144+
await shadow_type(
145+
page,
146+
"Test",
147+
false,
148+
"perspective-viewer-datagrid",
149+
"table",
150+
"tbody",
151+
"tr",
152+
"td"
153+
);
154+
155+
const result = await page.evaluate(async () => {
156+
const view = await document
157+
.querySelector("perspective-viewer")
158+
.getView();
159+
const json = await view.to_json_string({ end_row: 4 });
160+
return json;
161+
});
162+
163+
test.expect(result).toEqual(
164+
'[{"State":"Test","City":"Henderson","Customer ID":"CG-12520"},{"State":"Kentucky","City":"Henderson","Customer ID":"CG-12520"},{"State":"California","City":"Los Angeles","Customer ID":"DV-13045"},{"State":"Florida","City":"Fort Lauderdale","Customer ID":"SO-20335"}]'
165+
);
166+
});
167+
168+
test("An editable datagrid gets contenteditable focus when a cell is clicked", async ({
169+
page,
170+
}) => {
171+
await page.goto("/tools/perspective-test/src/html/basic-test.html");
172+
await page.evaluate(async () => {
173+
while (!window["__TEST_PERSPECTIVE_READY__"]) {
174+
await new Promise((x) => setTimeout(x, 10));
175+
}
176+
});
177+
178+
const td = await page.evaluateHandle(async () => {
179+
await document.querySelector("perspective-viewer").restore({
180+
plugin: "Datagrid",
181+
plugin_config: {
182+
edit_mode: "EDIT",
183+
},
184+
columns: ["State", "City", "Customer ID"],
185+
});
186+
187+
return document
188+
.querySelector("perspective-viewer-datagrid")
189+
.shadowRoot.querySelector("table tbody tr td");
190+
});
191+
192+
await td.click();
193+
await td.asElement().fill("Test");
194+
await page.evaluate(() => document.activeElement.blur());
195+
196+
const result = await page.evaluate(async () => {
197+
const view = await document
198+
.querySelector("perspective-viewer")
199+
.getView();
200+
const json = await view.to_json_string({ end_row: 4 });
201+
return json;
202+
});
203+
204+
test.expect(result).toEqual(
205+
'[{"State":"Test","City":"Henderson","Customer ID":"CG-12520"},{"State":"Kentucky","City":"Henderson","Customer ID":"CG-12520"},{"State":"California","City":"Los Angeles","Customer ID":"DV-13045"},{"State":"Florida","City":"Fort Lauderdale","Customer ID":"SO-20335"}]'
206+
);
207+
});
123208
});
124209

125210
test.describe("Datagrid with superstore arrow data set", () => {

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,14 +287,25 @@ export async function shadow_type(
287287
while (content.length > 0) {
288288
if (elem instanceof HTMLInputElement) {
289289
elem.value += content[0];
290+
} else if (
291+
elem instanceof HTMLElement &&
292+
elem.hasAttribute("contenteditable")
293+
) {
294+
elem.textContent = content;
290295
}
296+
291297
triggerInputEvent(elem);
292298
await new Promise(requestAnimationFrame);
293299
content = content.slice(1);
294300
}
295301
} else {
296302
if (elem instanceof HTMLInputElement) {
297303
elem.value = content;
304+
} else if (
305+
elem instanceof HTMLElement &&
306+
elem.hasAttribute("contenteditable")
307+
) {
308+
elem.textContent = content;
298309
}
299310

300311
triggerInputEvent(elem);
@@ -310,6 +321,9 @@ export async function shadow_type(
310321
elem.dispatchEvent(event);
311322
}
312323
}
324+
325+
// @ts-ignore
326+
document.activeElement.blur();
313327
},
314328
{ content, path, is_incremental }
315329
);

0 commit comments

Comments
 (0)