Skip to content

Commit 99185f6

Browse files
luka-nextcloudjuliusknorr
authored andcommitted
fix: paste multiple line to table issue
Signed-off-by: Luka Trovic <luka@nextcloud.com>
1 parent 5d1095c commit 99185f6

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

cypress/e2e/nodes/Table.spec.js

+18
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

+1
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ describe('Workspace', function() {
299299
checkContent()
300300
})
301301
})
302+
302303
})
303304

304305
const openSidebar = filename => {

src/nodes/Table/TableCell.js

+33
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)