feat(richtext-lexical): Slate to Lexical converter: add blockquote conversion, convert custom link fields (#4486)

This commit is contained in:
Alessio Gravili
2023-12-13 13:16:58 +01:00
committed by GitHub
parent f868799404
commit 31f8f3cac6
6 changed files with 84 additions and 2 deletions

View File

@@ -0,0 +1,24 @@
import type { SerializedQuoteNode } from '@lexical/rich-text'
import type { SlateNodeConverter } from '../types'
import { convertSlateNodesToLexical } from '../index'
export const SlateBlockquoteConverter: SlateNodeConverter = {
converter({ converters, slateNode }) {
return {
children: convertSlateNodesToLexical({
canContainParagraphs: false,
converters,
parentNodeType: 'quote',
slateNodes: slateNode.children || [],
}),
direction: 'ltr',
format: '',
indent: 0,
type: 'quote',
version: 1,
} as const as SerializedQuoteNode
},
nodeTypes: ['blockquote'],
}

View File

@@ -14,7 +14,8 @@ export const SlateLinkConverter: SlateNodeConverter = {
}),
direction: 'ltr',
fields: {
doc: slateNode.doc || undefined,
...(slateNode.fields || {}),
doc: slateNode.doc || null,
linkType: slateNode.linkType || 'custom',
newTab: slateNode.newTab || false,
url: slateNode.url || undefined,

View File

@@ -1,5 +1,6 @@
import type { SlateNodeConverter } from './types'
import { SlateBlockquoteConverter } from './converters/blockquote'
import { SlateHeadingConverter } from './converters/heading'
import { SlateIndentConverter } from './converters/indent'
import { SlateLinkConverter } from './converters/link'
@@ -18,6 +19,7 @@ export const defaultSlateConverters: SlateNodeConverter[] = [
SlateRelationshipConverter,
SlateListItemConverter,
SlateLinkConverter,
SlateBlockquoteConverter,
SlateHeadingConverter,
SlateIndentConverter,
]

View File

@@ -277,10 +277,12 @@ export { OrderedListFeature } from './field/features/lists/OrderedList'
export { UnorderedListFeature } from './field/features/lists/UnorderedList'
export { LexicalPluginToLexicalFeature } from './field/features/migrations/LexicalPluginToLexical'
export { SlateToLexicalFeature } from './field/features/migrations/SlateToLexical'
export { SlateHeadingConverter } from './field/features/migrations/SlateToLexical/converter/converters/heading'
export { SlateBlockquoteConverter } from './field/features/migrations/SlateToLexical/converter/converters/blockquote'
export { SlateHeadingConverter } from './field/features/migrations/SlateToLexical/converter/converters/heading'
export { SlateIndentConverter } from './field/features/migrations/SlateToLexical/converter/converters/indent'
export { SlateLinkConverter } from './field/features/migrations/SlateToLexical/converter/converters/link'
export { SlateListItemConverter } from './field/features/migrations/SlateToLexical/converter/converters/listItem'
export { SlateOrderedListConverter } from './field/features/migrations/SlateToLexical/converter/converters/orderedList'
export { SlateRelationshipConverter } from './field/features/migrations/SlateToLexical/converter/converters/relationship'

View File

@@ -1,8 +1,20 @@
import { generateSlateRichText } from '../RichText/generateSlateRichText'
import { payloadPluginLexicalData } from './generatePayloadPluginLexicalData'
export const lexicalMigrateDocData = {
title: 'Rich Text',
lexicalWithLexicalPluginData: payloadPluginLexicalData,
lexicalWithSlateData: [
...generateSlateRichText(),
{
children: [
{
text: 'Some block quote',
},
],
type: 'blockquote',
},
],
arrayWithLexicalField: [
{
lexicalInArrayField: getSimpleLexicalData('array 1'),

View File

@@ -4,6 +4,7 @@ import {
HTMLConverterFeature,
LexicalPluginToLexicalFeature,
LinkFeature,
SlateToLexicalFeature,
TreeviewFeature,
UploadFeature,
lexicalEditor,
@@ -67,6 +68,46 @@ export const LexicalMigrateFields: CollectionConfig = {
],
}),
},
{
name: 'lexicalWithSlateData',
type: 'richText',
editor: lexicalEditor({
features: ({ defaultFeatures }) => [
...defaultFeatures,
SlateToLexicalFeature(),
TreeviewFeature(),
HTMLConverterFeature(),
LinkFeature({
fields: [
{
name: 'rel',
label: 'Rel Attribute',
type: 'select',
hasMany: true,
options: ['noopener', 'noreferrer', 'nofollow'],
admin: {
description:
'The rel attribute defines the relationship between a linked resource and the current document. This is a custom link field.',
},
},
],
}),
UploadFeature({
collections: {
uploads: {
fields: [
{
name: 'caption',
type: 'richText',
editor: lexicalEditor(),
},
],
},
},
}),
],
}),
},
{
name: 'lexicalSimple',
type: 'richText',