Skip to content

Commit 8a9b51b

Browse files
fix: paste multiple line to table issue
Signed-off-by: Luka Trovic <[email protected]>
1 parent 1b31539 commit 8a9b51b

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

cypress/e2e/nodes/Table.spec.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,24 @@ describe('table plugin', () => {
119119
.should('have.length', 3)
120120
.each(td => cy.wrap(td).should('have.css', 'text-align', 'center'))
121121
})
122+
123+
it('Creates table and add multilines', function() {
124+
const multilinesContent = 'Line 1\nLine 2\nLine 3'
125+
126+
cy.getActionEntry('table').click()
127+
cy.getContent()
128+
.find('table:nth-of-type(1) tr:nth-child(2) td:nth-child(1)')
129+
.click()
130+
131+
cy.getContent()
132+
.type(multilinesContent)
133+
134+
cy.getContent()
135+
.find('table:nth-of-type(1) tr:nth-child(2) td:nth-child(1) .content')
136+
.then(($el) => {
137+
expect($el.get(0).innerHTML).to.equal(multilinesContent.replace(/\n/g, '<br>'))
138+
})
139+
})
122140
})
123141

124142
describe('Table extension integrated in the editor', () => {

cypress/e2e/workspace.spec.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ describe('Workspace', function() {
298298
checkContent()
299299
})
300300
})
301+
301302
})
302303

303304
const openSidebar = filename => {

src/nodes/Table/TableCell.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { TableCell } from '@tiptap/extension-table-cell'
2+
import { Plugin } from '@tiptap/pm/state'
3+
import { Fragment } from '@tiptap/pm/model'
24

35
export default TableCell.extend({
46
content: 'inline*',
@@ -30,4 +32,35 @@ export default TableCell.extend({
3032
},
3133
}
3234
},
35+
36+
addProseMirrorPlugins() {
37+
return [
38+
new Plugin({
39+
props: {
40+
// Special-treat empty lines in pasted content to prevent jumping out of cell
41+
handlePaste: (view, event, slice) => {
42+
if (slice.content.childCount > 1) {
43+
const state = view.state
44+
const childCount = slice.content.childCount
45+
const childNodes = []
46+
for (let i = 0; i < childCount; i++) {
47+
if (i === 0) {
48+
childNodes.push(state.schema.text('\n'))
49+
}
50+
51+
// Ignore empty children (i.e. empty lines)
52+
if (!slice.content.child(i).firstChild) {
53+
continue
54+
}
55+
56+
childNodes.push(state.schema.text(slice.content.child(i).textContent, slice.content.child(i).firstChild.marks))
57+
}
58+
const newNode = view.state.schema.node('paragraph', [], childNodes)
59+
slice.content = Fragment.empty.addToStart(newNode)
60+
}
61+
},
62+
},
63+
}),
64+
]
65+
},
3366
})

0 commit comments

Comments
 (0)