[WIKI-498] regression: table bugs #7631

This commit is contained in:
Aaryan Khandelwal 2025-08-26 02:13:27 +05:30 committed by GitHub
parent eb5ac2fc2d
commit 34e231230f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 58 additions and 18 deletions

View file

@ -14,6 +14,9 @@ import { ColumnDragHandle, ColumnDragHandleProps } from "./drag-handle";
type TableColumnDragHandlePluginState = { type TableColumnDragHandlePluginState = {
decorations?: DecorationSet; decorations?: DecorationSet;
// track table structure to detect changes
tableWidth?: number;
tableNodePos?: number;
}; };
const TABLE_COLUMN_DRAG_HANDLE_PLUGIN_KEY = new PluginKey("tableColumnHandlerDecorationPlugin"); const TABLE_COLUMN_DRAG_HANDLE_PLUGIN_KEY = new PluginKey("tableColumnHandlerDecorationPlugin");
@ -31,7 +34,13 @@ export const TableColumnDragHandlePlugin = (editor: Editor): Plugin<TableColumnD
const tableMap = TableMap.get(table.node); const tableMap = TableMap.get(table.node);
let isStale = false; // Check if table structure changed (width or position)
const tableStructureChanged = prev.tableWidth !== tableMap.width || prev.tableNodePos !== table.pos;
let isStale = tableStructureChanged;
// Only do position-based stale check if structure hasn't changed
if (!isStale) {
const mapped = prev.decorations?.map(tr.mapping, tr.doc); const mapped = prev.decorations?.map(tr.mapping, tr.doc);
for (let col = 0; col < tableMap.width; col++) { for (let col = 0; col < tableMap.width; col++) {
const pos = getTableCellWidgetDecorationPos(table, tableMap, col); const pos = getTableCellWidgetDecorationPos(table, tableMap, col);
@ -40,11 +49,18 @@ export const TableColumnDragHandlePlugin = (editor: Editor): Plugin<TableColumnD
break; break;
} }
} }
if (!isStale) {
return { decorations: mapped };
} }
if (!isStale) {
const mapped = prev.decorations?.map(tr.mapping, tr.doc);
return {
decorations: mapped,
tableWidth: tableMap.width,
tableNodePos: table.pos,
};
}
// recreate all decorations
const decorations: Decoration[] = []; const decorations: Decoration[] = [];
for (let col = 0; col < tableMap.width; col++) { for (let col = 0; col < tableMap.width; col++) {
@ -63,6 +79,8 @@ export const TableColumnDragHandlePlugin = (editor: Editor): Plugin<TableColumnD
return { return {
decorations: DecorationSet.create(newState.doc, decorations), decorations: DecorationSet.create(newState.doc, decorations),
tableWidth: tableMap.width,
tableNodePos: table.pos,
}; };
}, },
}, },

View file

@ -14,6 +14,9 @@ import { RowDragHandle, RowDragHandleProps } from "./drag-handle";
type TableRowDragHandlePluginState = { type TableRowDragHandlePluginState = {
decorations?: DecorationSet; decorations?: DecorationSet;
// track table structure to detect changes
tableHeight?: number;
tableNodePos?: number;
}; };
const TABLE_ROW_DRAG_HANDLE_PLUGIN_KEY = new PluginKey("tableRowDragHandlePlugin"); const TABLE_ROW_DRAG_HANDLE_PLUGIN_KEY = new PluginKey("tableRowDragHandlePlugin");
@ -31,7 +34,13 @@ export const TableRowDragHandlePlugin = (editor: Editor): Plugin<TableRowDragHan
const tableMap = TableMap.get(table.node); const tableMap = TableMap.get(table.node);
let isStale = false; // Check if table structure changed (height or position)
const tableStructureChanged = prev.tableHeight !== tableMap.height || prev.tableNodePos !== table.pos;
let isStale = tableStructureChanged;
// Only do position-based stale check if structure hasn't changed
if (!isStale) {
const mapped = prev.decorations?.map(tr.mapping, tr.doc); const mapped = prev.decorations?.map(tr.mapping, tr.doc);
for (let row = 0; row < tableMap.height; row++) { for (let row = 0; row < tableMap.height; row++) {
const pos = getTableCellWidgetDecorationPos(table, tableMap, row * tableMap.width); const pos = getTableCellWidgetDecorationPos(table, tableMap, row * tableMap.width);
@ -40,11 +49,18 @@ export const TableRowDragHandlePlugin = (editor: Editor): Plugin<TableRowDragHan
break; break;
} }
} }
if (!isStale) {
return { decorations: mapped };
} }
if (!isStale) {
const mapped = prev.decorations?.map(tr.mapping, tr.doc);
return {
decorations: mapped,
tableHeight: tableMap.height,
tableNodePos: table.pos,
};
}
// recreate all decorations
const decorations: Decoration[] = []; const decorations: Decoration[] = [];
for (let row = 0; row < tableMap.height; row++) { for (let row = 0; row < tableMap.height; row++) {
@ -61,7 +77,11 @@ export const TableRowDragHandlePlugin = (editor: Editor): Plugin<TableRowDragHan
decorations.push(Decoration.widget(pos, () => dragHandleComponent.element)); decorations.push(Decoration.widget(pos, () => dragHandleComponent.element));
} }
return { decorations: DecorationSet.create(newState.doc, decorations) }; return {
decorations: DecorationSet.create(newState.doc, decorations),
tableHeight: tableMap.height,
tableNodePos: table.pos,
};
}, },
}, },
props: { props: {

View file

@ -379,7 +379,9 @@ const handleNodeSelection = (
let draggedNodePos = nodePosAtDOM(node, view, options); let draggedNodePos = nodePosAtDOM(node, view, options);
if (draggedNodePos == null || draggedNodePos < 0) return; if (draggedNodePos == null || draggedNodePos < 0) return;
if (node.matches("blockquote")) { if (node.matches("table")) {
draggedNodePos = draggedNodePos - 2;
} else if (node.matches("blockquote")) {
draggedNodePos = nodePosAtDOMForBlockQuotes(node, view); draggedNodePos = nodePosAtDOMForBlockQuotes(node, view);
if (draggedNodePos === null || draggedNodePos === undefined) return; if (draggedNodePos === null || draggedNodePos === undefined) return;
} else { } else {