From 087eeb01a25e3218bc5a9f96c124cee173f9d8df Mon Sep 17 00:00:00 2001 From: James Date: Mon, 19 Dec 2022 23:02:39 -0500 Subject: [PATCH] chore: rich text type declarations --- .../components/forms/field-types/RichText/RichText.tsx | 9 +++------ .../forms/field-types/RichText/elements/indent/index.tsx | 1 + .../RichText/elements/isLastSelectedElementEmpty.ts | 2 ++ src/admin/components/forms/field-types/RichText/types.ts | 9 ++++++++- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/admin/components/forms/field-types/RichText/RichText.tsx b/src/admin/components/forms/field-types/RichText/RichText.tsx index 2d3553abcb..b873dc92c0 100644 --- a/src/admin/components/forms/field-types/RichText/RichText.tsx +++ b/src/admin/components/forms/field-types/RichText/RichText.tsx @@ -17,7 +17,7 @@ import enablePlugins from './enablePlugins'; import defaultValue from '../../../../../fields/richText/defaultValue'; import FieldDescription from '../../FieldDescription'; import withHTML from './plugins/withHTML'; -import { Props } from './types'; +import { ElementNode, TextNode, Props } from './types'; import { RichTextElement, RichTextLeaf } from '../../../../../fields/config/types'; import listTypes from './elements/listTypes'; import mergeCustomFunctions from './mergeCustomFunctions'; @@ -30,15 +30,12 @@ const defaultElements: RichTextElement[] = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', const defaultLeaves: RichTextLeaf[] = ['bold', 'italic', 'underline', 'strikethrough', 'code']; const baseClass = 'rich-text'; -type CustomText = { text: string;[x: string]: unknown } - -type CustomElement = { type?: string; children: (CustomText | CustomElement)[] } declare module 'slate' { interface CustomTypes { Editor: BaseEditor & ReactEditor & HistoryEditor - Element: CustomElement - Text: CustomText + Element: ElementNode + Text: TextNode } } diff --git a/src/admin/components/forms/field-types/RichText/elements/indent/index.tsx b/src/admin/components/forms/field-types/RichText/elements/indent/index.tsx index 78cd147a75..a9ab2b3df8 100644 --- a/src/admin/components/forms/field-types/RichText/elements/indent/index.tsx +++ b/src/admin/components/forms/field-types/RichText/elements/indent/index.tsx @@ -100,6 +100,7 @@ const indent = { ], { at: previousNodePath, + select: true, }, ); } diff --git a/src/admin/components/forms/field-types/RichText/elements/isLastSelectedElementEmpty.ts b/src/admin/components/forms/field-types/RichText/elements/isLastSelectedElementEmpty.ts index bb4b4de877..a6e977e860 100644 --- a/src/admin/components/forms/field-types/RichText/elements/isLastSelectedElementEmpty.ts +++ b/src/admin/components/forms/field-types/RichText/elements/isLastSelectedElementEmpty.ts @@ -1,4 +1,5 @@ import { Editor, Element } from 'slate'; +import { nodeIsTextNode } from '../types'; export const isLastSelectedElementEmpty = (editor: Editor): boolean => { const currentlySelectedNodes = Array.from(Editor.nodes(editor, { @@ -10,5 +11,6 @@ export const isLastSelectedElementEmpty = (editor: Editor): boolean => { return lastSelectedNode && Element.isElement(lastSelectedNode[0]) && (!lastSelectedNode[0].type || lastSelectedNode[0].type === 'p') + && nodeIsTextNode(lastSelectedNode[0].children?.[0]) && lastSelectedNode[0].children?.[0].text === ''; }; diff --git a/src/admin/components/forms/field-types/RichText/types.ts b/src/admin/components/forms/field-types/RichText/types.ts index ca1bc16113..9b609f7b0a 100644 --- a/src/admin/components/forms/field-types/RichText/types.ts +++ b/src/admin/components/forms/field-types/RichText/types.ts @@ -1,6 +1,13 @@ -import { BaseEditor, Selection } from 'slate'; import { RichTextField } from '../../../../../fields/config/types'; export type Props = Omit & { path?: string } + +export type TextNode = { text: string;[x: string]: unknown } + +export type ElementNode = { type?: string; children: (TextNode | ElementNode)[] } + +export function nodeIsTextNode(node: TextNode | ElementNode): node is TextNode { + return 'text' in node; +}