Skip to content

Commit fbd90ac

Browse files
danilsomsikovDevtools-frontend LUCI CQ
authored andcommitted
Support editing in the data grid web component
Bug: 394287937 Change-Id: I459ad00a4c2d5a51ccb27b1e24b096fe501c277f Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6230035 Commit-Queue: Danil Somsikov <[email protected]> Auto-Submit: Danil Somsikov <[email protected]> Commit-Queue: Benedikt Meurer <[email protected]> Reviewed-by: Benedikt Meurer <[email protected]>
1 parent 7055c56 commit fbd90ac

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

front_end/ui/legacy/components/data_grid/DataGrid.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ const elementToIndexMap = new WeakMap<Element, number>();
131131
export class DataGridImpl<T> extends Common.ObjectWrapper.ObjectWrapper<EventTypes<T>> {
132132
element: HTMLDivElement;
133133
displayName: string;
134-
private editCallback: ((arg0: any, arg1: string, arg2: any, arg3: any) => void)|undefined;
135-
private readonly deleteCallback: ((arg0: any) => void)|undefined;
134+
editCallback: ((arg0: any, arg1: string, arg2: any, arg3: any) => void)|undefined;
135+
deleteCallback: ((arg0: any) => void)|undefined;
136136
private readonly refreshCallback: (() => void)|undefined;
137137
private dataTableHeaders: {
138138
[x: string]: Element,
@@ -204,9 +204,7 @@ export class DataGridImpl<T> extends Common.ObjectWrapper.ObjectWrapper<EventTyp
204204

205205
// FIXME: Add a createCallback which is different from editCallback and has different
206206
// behavior when creating a new node.
207-
if (editCallback) {
208-
this.dataTable.addEventListener('dblclick', this.ondblclick.bind(this), false);
209-
}
207+
this.dataTable.addEventListener('dblclick', this.ondblclick.bind(this), false);
210208
this.dataTable.addEventListener('mousedown', this.mouseDownInDataTable.bind(this));
211209
this.dataTable.addEventListener('click', this.clickInDataTable.bind(this), true);
212210

@@ -565,7 +563,7 @@ export class DataGridImpl<T> extends Common.ObjectWrapper.ObjectWrapper<EventTyp
565563
}
566564

567565
private ondblclick(event: Event): void {
568-
if (this.editing || this.editingNode) {
566+
if (!this.editCallback || this.editing || this.editingNode) {
569567
return;
570568
}
571569

front_end/ui/legacy/components/data_grid/DataGridElement.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,31 @@ describeWithEnvironment('DataGrid', () => {
157157
sendKeydown(element, 'ArrowDown');
158158
assert.strictEqual(getAccessibleText(element), 'Display Name Row Column 1: Value 3, Column 2: Value 4');
159159
});
160+
161+
it('supports editable columns', async () => {
162+
const editCallback = sinon.stub();
163+
const element = await renderDataGrid(html`
164+
<devtools-data-grid striped name=${'Display Name'} @edit=${editCallback as Function}>
165+
<table>
166+
<tr>
167+
<th id="column-1" editable>Column 1</th>
168+
<th id="column-2">Column 2</th>
169+
</tr>
170+
<tr>
171+
<td>Value 1</td>
172+
<td>Value 2</td>
173+
</tr>
174+
</table>
175+
</devtools-data-grid>`);
176+
sendKeydown(element, 'ArrowDown');
177+
sendKeydown(element, 'Enter');
178+
getFocusedElement()!.textContent = 'New Value';
179+
sendKeydown(element, 'Enter');
180+
assert.isTrue(editCallback.calledOnce);
181+
assert.isTrue(editCallback.firstCall.args[0].detail.node.textContent.includes('Value 1'));
182+
assert.isTrue(editCallback.firstCall.args[0].detail.node.textContent.includes('Value 2'));
183+
assert.strictEqual(editCallback.firstCall.args[0].detail.columnId, 'column-1');
184+
assert.strictEqual(editCallback.firstCall.args[0].detail.valueBeforeEditing, 'Value 1');
185+
assert.strictEqual(editCallback.firstCall.args[0].detail.newText, 'New Value');
186+
});
160187
});

front_end/ui/legacy/components/data_grid/DataGridElement.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ class DataGridElement extends HTMLElement {
152152
}
153153
this.#hideableColumns.clear();
154154
this.#columnsOrder = [];
155+
let hasEditableColumn = false;
155156
for (const column of this.querySelectorAll('th[id]') || []) {
156157
const id = column.id as Lowercase<string>;
157158
this.#columnsOrder.push(id);
@@ -172,6 +173,10 @@ class DataGridElement extends HTMLElement {
172173
align = undefined;
173174
}
174175
const weight = parseFloat(column.getAttribute('weight') || '') ?? undefined;
176+
const editable = column.hasAttribute('editable');
177+
if (editable) {
178+
hasEditableColumn = true;
179+
}
175180
this.#dataGrid.addColumn({
176181
id,
177182
title: title as Platform.UIString.LocalizedString,
@@ -180,7 +185,8 @@ class DataGridElement extends HTMLElement {
180185
fixedWidth,
181186
width,
182187
align,
183-
weight
188+
weight,
189+
editable
184190
});
185191
if (column.hasAttribute('hideable')) {
186192
this.#hideableColumns.add(id);
@@ -190,6 +196,8 @@ class DataGridElement extends HTMLElement {
190196
if (visibleColumns.size) {
191197
this.#dataGrid.setColumnsVisibility(visibleColumns);
192198
}
199+
this.#dataGrid.editCallback = hasEditableColumn ? this.#editCallback.bind(this) : undefined;
200+
this.#dataGrid.deleteCallback = hasEditableColumn ? this.#deleteCallback.bind(this) : undefined;
193201
}
194202

195203
#needUpdateColumns(mutationList: MutationRecord[]): boolean {
@@ -251,6 +259,15 @@ class DataGridElement extends HTMLElement {
251259
this.#updateNode(mutation.target);
252260
}
253261
}
262+
263+
#editCallback(node: DataGridElementNode, columnId: string, valueBeforeEditing: string, newText: string): void {
264+
this.dispatchEvent(
265+
new CustomEvent('edit', {detail: {node: node.configElement, columnId, valueBeforeEditing, newText}}));
266+
}
267+
268+
#deleteCallback(node: DataGridElementNode): void {
269+
this.dispatchEvent(new CustomEvent('delete', {detail: node.configElement}));
270+
}
254271
}
255272

256273
class DataGridElementNode extends SortableDataGridNode<DataGridElementNode> {

0 commit comments

Comments
 (0)