Skip to content

Commit 9bccdfd

Browse files
committed
feat(richtext-lexical): add HTML converter to table feature
1 parent eb27b84 commit 9bccdfd

File tree

1 file changed

+68
-6
lines changed

1 file changed

+68
-6
lines changed

packages/richtext-lexical/src/features/experimental_table/feature.server.ts

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { sanitizeFields } from 'payload'
66
// eslint-disable-next-line payload/no-imports-from-exports-dir
77
import { TableFeatureClient } from '../../exports/client/index.js'
88
import { createServerFeature } from '../../utilities/createServerFeature.js'
9+
import { convertLexicalNodesToHTML } from '../converters/html/converter/index.js'
10+
import { createNode } from '../typeUtilities.js'
911

1012
const fields: Field[] = [
1113
{
@@ -41,15 +43,75 @@ export const EXPERIMENTAL_TableFeature = createServerFeature({
4143
return schemaMap
4244
},
4345
nodes: [
44-
{
46+
createNode({
47+
converters: {
48+
html: {
49+
converter: async ({ converters, node, parent, req }) => {
50+
const childrenText = await convertLexicalNodesToHTML({
51+
converters,
52+
lexicalNodes: node.children,
53+
parent: {
54+
...node,
55+
parent,
56+
},
57+
req,
58+
})
59+
return `<table class="lexical-table" style="border-collapse: collapse;">${childrenText}</table>`
60+
},
61+
nodeTypes: [TableNode.getType()],
62+
},
63+
},
4564
node: TableNode,
46-
},
47-
{
65+
}),
66+
createNode({
67+
converters: {
68+
html: {
69+
converter: async ({ converters, node, parent, req }) => {
70+
const childrenText = await convertLexicalNodesToHTML({
71+
converters,
72+
lexicalNodes: node.children,
73+
parent: {
74+
...node,
75+
parent,
76+
},
77+
req,
78+
})
79+
80+
const tagName = node.headerState > 0 ? 'th' : 'td'
81+
const headerStateClass = `lexical-table-cell-header-${node.headerState}`
82+
const backgroundColor = node.backgroundColor
83+
? `background-color: ${node.backgroundColor};`
84+
: ''
85+
const colSpan = node.colSpan > 1 ? `colspan="${node.colSpan}"` : ''
86+
const rowSpan = node.rowSpan > 1 ? `rowspan="${node.rowSpan}"` : ''
87+
88+
return `<${tagName} class="lexical-table-cell ${headerStateClass}" style="border: 1px solid #ccc; padding: 8px; ${backgroundColor}" ${colSpan} ${rowSpan}>${childrenText}</${tagName}>`
89+
},
90+
nodeTypes: [TableCellNode.getType()],
91+
},
92+
},
4893
node: TableCellNode,
49-
},
50-
{
94+
}),
95+
createNode({
96+
converters: {
97+
html: {
98+
converter: async ({ converters, node, parent, req }) => {
99+
const childrenText = await convertLexicalNodesToHTML({
100+
converters,
101+
lexicalNodes: node.children,
102+
parent: {
103+
...node,
104+
parent,
105+
},
106+
req,
107+
})
108+
return `<tr class="lexical-table-row">${childrenText}</tr>`
109+
},
110+
nodeTypes: [TableRowNode.getType()],
111+
},
112+
},
51113
node: TableRowNode,
52-
},
114+
}),
53115
],
54116
}
55117
},

0 commit comments

Comments
 (0)