diff --git a/app/src/protyle/util/table.ts b/app/src/protyle/util/table.ts index bc12ac441..13a738775 100644 --- a/app/src/protyle/util/table.ts +++ b/app/src/protyle/util/table.ts @@ -69,31 +69,39 @@ export const setTableAlign = (protyle: IProtyle, cellElements: HTMLElement[], no }; export const insertRow = (protyle: IProtyle, range: Range, cellElement: HTMLElement, nodeElement: Element) => { - range.insertNode(document.createElement("wbr")); + const wbrElement = document.createElement("wbr") + range.insertNode(wbrElement); const html = nodeElement.outerHTML; + wbrElement.remove(); let rowHTML = ""; for (let m = 0; m < cellElement.parentElement.childElementCount; m++) { rowHTML += ` `; } + let newRowElememt: HTMLTableRowElement; if (cellElement.tagName === "TH") { const tbodyElement = nodeElement.querySelector("tbody"); if (tbodyElement) { tbodyElement.insertAdjacentHTML("afterbegin", `${rowHTML}`); + newRowElememt = tbodyElement.firstElementChild as HTMLTableRowElement; } else { cellElement.parentElement.parentElement.insertAdjacentHTML("afterend", `${rowHTML}`); + newRowElememt = cellElement.parentElement.parentElement.nextElementSibling.firstElementChild as HTMLTableRowElement; } } else { cellElement.parentElement.insertAdjacentHTML("afterend", `${rowHTML}`); + newRowElememt = cellElement.parentElement.nextElementSibling as HTMLTableRowElement; } + range.selectNodeContents(newRowElememt.cells[getColIndex(cellElement)]); + range.collapse(true); updateTransaction(protyle, nodeElement.getAttribute("data-node-id"), nodeElement.outerHTML, html); - nodeElement.querySelector("wbr").remove(); }; export const insertRowAbove = (protyle: IProtyle, range: Range, cellElement: HTMLElement, nodeElement: Element) => { - range.insertNode(document.createElement("wbr")); + const wbrElement = document.createElement("wbr") + range.insertNode(wbrElement); const html = nodeElement.outerHTML; - + wbrElement.remove(); let rowHTML = ""; let hasNone = false; @@ -123,33 +131,41 @@ export const insertRowAbove = (protyle: IProtyle, range: Range, cellElement: HTM previousTrElement = previousTrElement.previousElementSibling; } } - + let newRowElememt: HTMLTableRowElement if (cellElement.parentElement.parentElement.tagName === "THEAD" && !cellElement.parentElement.previousElementSibling) { cellElement.parentElement.parentElement.insertAdjacentHTML("beforebegin", `${rowHTML}`); + newRowElememt = nodeElement.querySelector("thead tr") cellElement.parentElement.parentElement.nextElementSibling.insertAdjacentHTML("afterbegin", cellElement.parentElement.parentElement.innerHTML); cellElement.parentElement.parentElement.remove(); } else { cellElement.parentElement.insertAdjacentHTML("beforebegin", `${rowHTML}`); + newRowElememt = cellElement.parentElement.previousElementSibling as HTMLTableRowElement; } + range.selectNodeContents(newRowElememt.cells[getColIndex(cellElement)]); + range.collapse(true); updateTransaction(protyle, nodeElement.getAttribute("data-node-id"), nodeElement.outerHTML, html); - focusByWbr(protyle.wysiwyg.element, range); }; export const insertColumn = (protyle: IProtyle, nodeElement: Element, cellElement: HTMLElement, type: InsertPosition, range: Range) => { - range.insertNode(document.createElement("wbr")); + const wbrElement = document.createElement("wbr") + range.insertNode(wbrElement); const html = nodeElement.outerHTML; + wbrElement.remove(); const index = getColIndex(cellElement); const tableElement = nodeElement.querySelector("table"); for (let i = 0; i < tableElement.rows.length; i++) { - if (i === 0) { - tableElement.rows[i].cells[index].insertAdjacentHTML(type, ""); + const colCellElement = tableElement.rows[i].cells[index] + const newCellElement = document.createElement(colCellElement.tagName) + if (colCellElement.isSameNode(cellElement)) { + newCellElement.innerHTML = " "; } else { - tableElement.rows[i].cells[index].insertAdjacentHTML(type, ""); + newCellElement.textContent = " "; } + colCellElement.insertAdjacentElement(type, newCellElement); } tableElement.querySelectorAll("col")[index].insertAdjacentHTML(type, ""); + focusByWbr(nodeElement, range); updateTransaction(protyle, nodeElement.getAttribute("data-node-id"), nodeElement.outerHTML, html); - nodeElement.querySelector("wbr").remove(); }; export const deleteRow = (protyle: IProtyle, range: Range, cellElement: HTMLElement, nodeElement: Element) => { @@ -361,7 +377,7 @@ export const fixTable = (protyle: IProtyle, event: KeyboardEvent, range: Range) if (event.key === "ArrowRight" && range.toString() === "" && !nodeElement.nextElementSibling && cellElement.isSameNode(nodeElement.querySelector("table").lastElementChild.lastElementChild.lastElementChild) && - getSelectionOffset(cellElement, protyle.wysiwyg.element, range).start === cellElement.textContent.length ) { + getSelectionOffset(cellElement, protyle.wysiwyg.element, range).start === cellElement.textContent.length) { event.preventDefault(); insertEmptyBlock(protyle, "afterend", nodeElement.getAttribute("data-node-id")); return true;