@payloadcms/richtext-lexical 3.68.0-internal-debug.35482da → 3.68.0-internal-debug.654e4ad
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/exports/client/index.d.ts +1 -0
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +1 -0
- package/dist/exports/client/index.js.map +1 -1
- package/dist/exports/client/internal-client.d.ts +3 -0
- package/dist/exports/client/internal-client.d.ts.map +1 -0
- package/dist/exports/client/internal-client.js +4 -0
- package/dist/exports/client/internal-client.js.map +1 -0
- package/dist/exports/react/index.d.ts +1 -1
- package/dist/exports/react/index.d.ts.map +1 -1
- package/dist/exports/react/index.js.map +1 -1
- package/dist/features/blocks/client/component/index.js +2 -2
- package/dist/features/blocks/client/component/index.js.map +1 -1
- package/dist/features/blocks/client/componentInline/index.js +2 -2
- package/dist/features/blocks/client/componentInline/index.js.map +1 -1
- package/dist/features/blocks/server/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/server/nodes/InlineBlocksNode.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/Component/index.d.ts +2 -14
- package/dist/features/converters/lexicalToJSX/Component/index.d.ts.map +1 -1
- package/dist/features/converters/lexicalToJSX/Component/index.js +4 -9
- package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/index.d.ts +16 -1
- package/dist/features/converters/lexicalToJSX/converter/index.d.ts.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/index.js +87 -5
- package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/types.d.ts +14 -10
- package/dist/features/converters/lexicalToJSX/converter/types.d.ts.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/types.js.map +1 -1
- package/dist/features/debug/jsxConverter/client/plugin/index.js +1 -1
- package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
- package/dist/features/link/nodes/LinkNode.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/relationship/server/nodes/RelationshipNode.js.map +1 -1
- package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
- package/dist/field/Field.d.ts.map +1 -1
- package/dist/field/Field.js +37 -21
- package/dist/field/Field.js.map +1 -1
- package/dist/field/RichTextViewProvider.d.ts +83 -0
- package/dist/field/RichTextViewProvider.d.ts.map +1 -0
- package/dist/field/RichTextViewProvider.js +102 -0
- package/dist/field/RichTextViewProvider.js.map +1 -0
- package/dist/field/ViewSelector.d.ts +4 -0
- package/dist/field/ViewSelector.d.ts.map +1 -0
- package/dist/field/ViewSelector.js +90 -0
- package/dist/field/ViewSelector.js.map +1 -0
- package/dist/field/ViewSelector.scss +34 -0
- package/dist/field/index.d.ts +1 -0
- package/dist/field/index.d.ts.map +1 -1
- package/dist/field/index.js +41 -16
- package/dist/field/index.js.map +1 -1
- package/dist/field/index.scss +12 -0
- package/dist/field/rscEntry.d.ts +1 -1
- package/dist/field/rscEntry.d.ts.map +1 -1
- package/dist/field/rscEntry.js +13 -1
- package/dist/field/rscEntry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lexical/LexicalEditor.d.ts.map +1 -1
- package/dist/lexical/LexicalEditor.js +34 -28
- package/dist/lexical/LexicalEditor.js.map +1 -1
- package/dist/lexical/LexicalProvider.d.ts.map +1 -1
- package/dist/lexical/LexicalProvider.js +19 -11
- package/dist/lexical/LexicalProvider.js.map +1 -1
- package/dist/lexical/config/client/sanitize.d.ts +1 -1
- package/dist/lexical/config/client/sanitize.d.ts.map +1 -1
- package/dist/lexical/config/client/sanitize.js +3 -2
- package/dist/lexical/config/client/sanitize.js.map +1 -1
- package/dist/lexical/config/types.d.ts +4 -0
- package/dist/lexical/config/types.d.ts.map +1 -1
- package/dist/lexical/config/types.js +3 -1
- package/dist/lexical/config/types.js.map +1 -1
- package/dist/lexical/nodes/index.d.ts +12 -2
- package/dist/lexical/nodes/index.d.ts.map +1 -1
- package/dist/lexical/nodes/index.js +187 -2
- package/dist/lexical/nodes/index.js.map +1 -1
- package/dist/lexical/plugins/NodeViewOverridePlugin/index.d.ts +2 -0
- package/dist/lexical/plugins/NodeViewOverridePlugin/index.d.ts.map +1 -0
- package/dist/lexical/plugins/NodeViewOverridePlugin/index.js +31 -0
- package/dist/lexical/plugins/NodeViewOverridePlugin/index.js.map +1 -0
- package/dist/lexical/utils/point.js.map +1 -1
- package/dist/lexical/utils/rect.js.map +1 -1
- package/dist/types.d.ts +152 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -1
- package/dist/utilities/fieldsDrawer/DrawerContent.js +2 -2
- package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
- package/dist/utilities/generateImportMap.d.ts.map +1 -1
- package/dist/utilities/generateImportMap.js +1 -0
- package/dist/utilities/generateImportMap.js.map +1 -1
- package/dist/validate/hasText.d.ts +6 -1
- package/dist/validate/hasText.d.ts.map +1 -1
- package/dist/validate/hasText.js +10 -4
- package/dist/validate/hasText.js.map +1 -1
- package/package.json +13 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.tsx"],"sourcesContent":["import type { EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\nimport * as React from 'react'\n\nexport type UnknownConvertedNodeData = {\n nodeData: unknown\n nodeType: string\n}\n\nexport type SerializedUnknownConvertedNode = Spread<\n {\n data: UnknownConvertedNodeData\n },\n SerializedLexicalNode\n>\n\nconst Component = React.lazy(() =>\n import('./Component.js').then((module) => ({\n default: module.UnknownConvertedNodeComponent,\n })),\n)\n\n/** @noInheritDoc */\nexport class UnknownConvertedNode extends DecoratorNode<JSX.Element> {\n __data: UnknownConvertedNodeData\n\n constructor({ data, key }: { data: UnknownConvertedNodeData; key?: NodeKey }) {\n super(key)\n this.__data = data\n }\n\n static override clone(node: UnknownConvertedNode): UnknownConvertedNode {\n return new this({\n data: node.__data,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'unknownConverted'\n }\n\n static override importJSON(serializedNode: SerializedUnknownConvertedNode): UnknownConvertedNode {\n const node = $createUnknownConvertedNode({ data: serializedNode.data })\n return node\n }\n\n canInsertTextAfter(): true {\n return true\n }\n\n canInsertTextBefore(): true {\n return true\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, 'unknownConverted')\n return element\n }\n\n override decorate(): JSX.Element {\n return <Component data={this.__data} />\n }\n\n override exportJSON(): SerializedUnknownConvertedNode {\n return {\n type: this.getType(),\n data: this.__data,\n version: 1,\n }\n }\n\n // Mutation\n\n override isInline(): boolean {\n return true\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement): boolean {\n return false\n }\n}\n\nexport function $createUnknownConvertedNode({\n data,\n}: {\n data: UnknownConvertedNodeData\n}): UnknownConvertedNode {\n return $applyNodeReplacement(\n new UnknownConvertedNode({\n data,\n }),\n )\n}\n\nexport function $isUnknownConvertedNode(\n node: LexicalNode | null | undefined,\n): node is UnknownConvertedNode {\n return node instanceof UnknownConvertedNode\n}\n"],"names":["addClassNamesToElement","$applyNodeReplacement","DecoratorNode","React","Component","lazy","then","module","default","UnknownConvertedNodeComponent","UnknownConvertedNode","__data","
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.tsx"],"sourcesContent":["import type { EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\nimport * as React from 'react'\n\nexport type UnknownConvertedNodeData = {\n nodeData: unknown\n nodeType: string\n}\n\nexport type SerializedUnknownConvertedNode = Spread<\n {\n data: UnknownConvertedNodeData\n },\n SerializedLexicalNode\n>\n\nconst Component = React.lazy(() =>\n import('./Component.js').then((module) => ({\n default: module.UnknownConvertedNodeComponent,\n })),\n)\n\n/** @noInheritDoc */\nexport class UnknownConvertedNode extends DecoratorNode<JSX.Element> {\n __data: UnknownConvertedNodeData\n\n constructor({ data, key }: { data: UnknownConvertedNodeData; key?: NodeKey }) {\n super(key)\n this.__data = data\n }\n\n static override clone(node: UnknownConvertedNode): UnknownConvertedNode {\n return new this({\n data: node.__data,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'unknownConverted'\n }\n\n static override importJSON(serializedNode: SerializedUnknownConvertedNode): UnknownConvertedNode {\n const node = $createUnknownConvertedNode({ data: serializedNode.data })\n return node\n }\n\n canInsertTextAfter(): true {\n return true\n }\n\n canInsertTextBefore(): true {\n return true\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, 'unknownConverted')\n return element\n }\n\n override decorate(): JSX.Element {\n return <Component data={this.__data} />\n }\n\n override exportJSON(): SerializedUnknownConvertedNode {\n return {\n type: this.getType(),\n data: this.__data,\n version: 1,\n }\n }\n\n // Mutation\n\n override isInline(): boolean {\n return true\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement): boolean {\n return false\n }\n}\n\nexport function $createUnknownConvertedNode({\n data,\n}: {\n data: UnknownConvertedNodeData\n}): UnknownConvertedNode {\n return $applyNodeReplacement(\n new UnknownConvertedNode({\n data,\n }),\n )\n}\n\nexport function $isUnknownConvertedNode(\n node: LexicalNode | null | undefined,\n): node is UnknownConvertedNode {\n return node instanceof UnknownConvertedNode\n}\n"],"names":["addClassNamesToElement","$applyNodeReplacement","DecoratorNode","React","Component","lazy","then","module","default","UnknownConvertedNodeComponent","UnknownConvertedNode","__data","data","key","clone","node","__key","getType","importJSON","serializedNode","$createUnknownConvertedNode","canInsertTextAfter","canInsertTextBefore","createDOM","config","element","document","createElement","decorate","exportJSON","type","version","isInline","updateDOM","prevNode","dom","$isUnknownConvertedNode"],"mappings":";AAGA,SAASA,sBAAsB,QAAQ,iBAAgB;AACvD,SAASC,qBAAqB,EAAEC,aAAa,QAAQ,UAAS;AAC9D,YAAYC,WAAW,QAAO;AAc9B,MAAMC,0BAAYD,MAAME,IAAI,CAAC,IAC3B,MAAM,CAAC,kBAAkBC,IAAI,CAAC,CAACC,SAAY,CAAA;YACzCC,SAASD,OAAOE,6BAA6B;QAC/C,CAAA;AAGF,kBAAkB,GAClB,OAAO,MAAMC,6BAA6BR;IACxCS,OAAgC;IAEhC,YAAY,EAAEC,IAAI,EAAEC,GAAG,EAAqD,CAAE;QAC5E,KAAK,CAACA;QACN,IAAI,CAACF,MAAM,GAAGC;IAChB;IAEA,OAAgBE,MAAMC,IAA0B,EAAwB;QACtE,OAAO,IAAI,IAAI,CAAC;YACdH,MAAMG,KAAKJ,MAAM;YACjBE,KAAKE,KAAKC,KAAK;QACjB;IACF;IAEA,OAAgBC,UAAkB;QAChC,OAAO;IACT;IAEA,OAAgBC,WAAWC,cAA8C,EAAwB;QAC/F,MAAMJ,OAAOK,4BAA4B;YAAER,MAAMO,eAAeP,IAAI;QAAC;QACrE,OAAOG;IACT;IAEAM,qBAA2B;QACzB,OAAO;IACT;IAEAC,sBAA4B;QAC1B,OAAO;IACT;IAESC,UAAUC,MAAoB,EAAe;QACpD,MAAMC,UAAUC,SAASC,aAAa,CAAC;QACvC3B,uBAAuByB,SAAS;QAChC,OAAOA;IACT;IAESG,WAAwB;QAC/B,qBAAO,QAACxB;YAAUQ,MAAM,IAAI,CAACD,MAAM;;;;;;IACrC;IAESkB,aAA6C;QACpD,OAAO;YACLC,MAAM,IAAI,CAACb,OAAO;YAClBL,MAAM,IAAI,CAACD,MAAM;YACjBoB,SAAS;QACX;IACF;IAEA,WAAW;IAEFC,WAAoB;QAC3B,OAAO;IACT;IAESC,UAAUC,QAAc,EAAEC,GAAgB,EAAW;QAC5D,OAAO;IACT;AACF;AAEA,OAAO,SAASf,4BAA4B,EAC1CR,IAAI,EAGL;IACC,OAAOX,sBACL,IAAIS,qBAAqB;QACvBE;IACF;AAEJ;AAEA,OAAO,SAASwB,wBACdrB,IAAoC;IAEpC,OAAOA,gBAAgBL;AACzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/features/relationship/server/nodes/RelationshipNode.tsx"],"sourcesContent":["import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type { CollectionSlug, DataFromCollectionSlug } from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport {\n $applyNodeReplacement,\n type DOMConversionMap,\n type DOMConversionOutput,\n type DOMExportOutput,\n type EditorConfig,\n type ElementFormatType,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n} from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nexport type RelationshipData = {\n [TCollectionSlug in CollectionSlug]: {\n relationTo: TCollectionSlug\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\nexport type SerializedRelationshipNode = RelationshipData &\n StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'relationship'>\n\nfunction $relationshipElementToServerNode(domNode: HTMLDivElement): DOMConversionOutput | null {\n const id = domNode.getAttribute('data-lexical-relationship-id')\n const relationTo = domNode.getAttribute('data-lexical-relationship-relationTo')\n\n if (id != null && relationTo != null) {\n const node = $createServerRelationshipNode({\n relationTo,\n value: id,\n })\n return { node }\n }\n return null\n}\n\nexport class RelationshipServerNode extends DecoratorBlockNode {\n __data: RelationshipData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: RelationshipData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: RelationshipServerNode): RelationshipServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'relationship'\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {\n div: (domNode: HTMLDivElement) => {\n if (\n !domNode.hasAttribute('data-lexical-relationship-relationTo') ||\n !domNode.hasAttribute('data-lexical-relationship-id')\n ) {\n return null\n }\n return {\n conversion: $relationshipElementToServerNode,\n priority: 2,\n }\n },\n }\n }\n\n static override importJSON(serializedNode: SerializedRelationshipNode): RelationshipServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n\n const importedData: RelationshipData = {\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n const node = $createServerRelationshipNode(importedData)\n node.setFormat(serializedNode.format)\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.relationship)\n return element\n }\n\n override decorate(_editor: LexicalEditor, _config: EditorConfig): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('div')\n element.setAttribute(\n 'data-lexical-relationship-id',\n String(typeof this.__data?.value === 'object' ? this.__data?.value?.id : this.__data?.value),\n )\n element.setAttribute('data-lexical-relationship-relationTo', this.__data?.relationTo)\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n override exportJSON(): SerializedRelationshipNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'relationship',\n version: 2,\n }\n }\n\n getData(): RelationshipData {\n return this.getLatest().__data\n }\n\n override getTextContent(): string {\n return `${this.__data?.relationTo} relation to ${typeof this.__data?.value === 'object' ? this.__data?.value?.id : this.__data?.value}`\n }\n\n setData(data: RelationshipData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n}\n\nexport function $createServerRelationshipNode(data: RelationshipData): RelationshipServerNode {\n return $applyNodeReplacement(\n new RelationshipServerNode({\n data,\n }),\n )\n}\n\nexport function $isServerRelationshipNode(\n node: LexicalNode | null | RelationshipServerNode | undefined,\n): node is RelationshipServerNode {\n return node instanceof RelationshipServerNode\n}\n"],"names":["DecoratorBlockNode","addClassNamesToElement","$applyNodeReplacement","$relationshipElementToServerNode","domNode","id","getAttribute","relationTo","node","$createServerRelationshipNode","value","RelationshipServerNode","__data","
|
|
1
|
+
{"version":3,"sources":["../../../../../src/features/relationship/server/nodes/RelationshipNode.tsx"],"sourcesContent":["import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type { CollectionSlug, DataFromCollectionSlug } from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport {\n $applyNodeReplacement,\n type DOMConversionMap,\n type DOMConversionOutput,\n type DOMExportOutput,\n type EditorConfig,\n type ElementFormatType,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n} from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nexport type RelationshipData = {\n [TCollectionSlug in CollectionSlug]: {\n relationTo: TCollectionSlug\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\nexport type SerializedRelationshipNode = RelationshipData &\n StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'relationship'>\n\nfunction $relationshipElementToServerNode(domNode: HTMLDivElement): DOMConversionOutput | null {\n const id = domNode.getAttribute('data-lexical-relationship-id')\n const relationTo = domNode.getAttribute('data-lexical-relationship-relationTo')\n\n if (id != null && relationTo != null) {\n const node = $createServerRelationshipNode({\n relationTo,\n value: id,\n })\n return { node }\n }\n return null\n}\n\nexport class RelationshipServerNode extends DecoratorBlockNode {\n __data: RelationshipData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: RelationshipData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: RelationshipServerNode): RelationshipServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'relationship'\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {\n div: (domNode: HTMLDivElement) => {\n if (\n !domNode.hasAttribute('data-lexical-relationship-relationTo') ||\n !domNode.hasAttribute('data-lexical-relationship-id')\n ) {\n return null\n }\n return {\n conversion: $relationshipElementToServerNode,\n priority: 2,\n }\n },\n }\n }\n\n static override importJSON(serializedNode: SerializedRelationshipNode): RelationshipServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n\n const importedData: RelationshipData = {\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n const node = $createServerRelationshipNode(importedData)\n node.setFormat(serializedNode.format)\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.relationship)\n return element\n }\n\n override decorate(_editor: LexicalEditor, _config: EditorConfig): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('div')\n element.setAttribute(\n 'data-lexical-relationship-id',\n String(typeof this.__data?.value === 'object' ? this.__data?.value?.id : this.__data?.value),\n )\n element.setAttribute('data-lexical-relationship-relationTo', this.__data?.relationTo)\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n override exportJSON(): SerializedRelationshipNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'relationship',\n version: 2,\n }\n }\n\n getData(): RelationshipData {\n return this.getLatest().__data\n }\n\n override getTextContent(): string {\n return `${this.__data?.relationTo} relation to ${typeof this.__data?.value === 'object' ? this.__data?.value?.id : this.__data?.value}`\n }\n\n setData(data: RelationshipData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n}\n\nexport function $createServerRelationshipNode(data: RelationshipData): RelationshipServerNode {\n return $applyNodeReplacement(\n new RelationshipServerNode({\n data,\n }),\n )\n}\n\nexport function $isServerRelationshipNode(\n node: LexicalNode | null | RelationshipServerNode | undefined,\n): node is RelationshipServerNode {\n return node instanceof RelationshipServerNode\n}\n"],"names":["DecoratorBlockNode","addClassNamesToElement","$applyNodeReplacement","$relationshipElementToServerNode","domNode","id","getAttribute","relationTo","node","$createServerRelationshipNode","value","RelationshipServerNode","__data","data","format","key","clone","__format","__key","getType","importDOM","div","hasAttribute","conversion","priority","importJSON","serializedNode","version","importedData","setFormat","isInline","createDOM","config","element","document","createElement","theme","relationship","decorate","_editor","_config","exportDOM","setAttribute","String","text","createTextNode","getTextContent","append","exportJSON","getData","type","getLatest","setData","writable","getWritable","$isServerRelationshipNode"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"sourcesContent":["import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n} from 'lexical'\nimport type {\n CollectionSlug,\n DataFromCollectionSlug,\n JsonObject,\n TypedUploadCollection,\n UploadCollectionSlug,\n} from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nimport { $convertUploadElement } from './conversions.js'\n\nexport type UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in CollectionSlug]: {\n fields: TUploadExtraFieldsData\n /**\n * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n */\n id: string\n relationTo: TCollectionSlug\n /**\n * Value can be just the document ID, or the full, populated document\n */\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\n/**\n * Internal use only - UploadData type that can contain a pending state\n * @internal\n */\nexport type Internal_UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n pending?: {\n /**\n * ID that corresponds to the bulk upload form ID\n */\n formID: string\n /**\n * src value of the image dom element\n */\n src: string\n }\n} & UploadData<TUploadExtraFieldsData>\n\n/**\n * UploadDataImproved is a more precise type, and will replace UploadData in Payload v4.\n * This type is for internal use only as it will be deprecated in the future.\n * @internal\n *\n * @todo Replace UploadData with UploadDataImproved in 4.0\n */\nexport type UploadDataImproved<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in UploadCollectionSlug]: {\n fields: TUploadExtraFieldsData\n /**\n * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n */\n id: string\n relationTo: TCollectionSlug\n /**\n * Value can be just the document ID, or the full, populated document\n */\n value: number | string | TypedUploadCollection[TCollectionSlug]\n }\n}[UploadCollectionSlug]\n\nexport type SerializedUploadNode = StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'upload'> &\n UploadData\n\nexport class UploadServerNode extends DecoratorBlockNode {\n __data: UploadData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: UploadData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: UploadServerNode): UploadServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'upload'\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadServerNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadServerNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.upload)\n return element\n }\n\n override decorate(): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n const data = this.__data as Internal_UploadData\n if (data.pending) {\n element.setAttribute('data-lexical-pending-upload-form-id', String(data?.pending?.formID))\n element.setAttribute('src', data?.pending?.src || '')\n } else {\n element.setAttribute('data-lexical-upload-id', String(data?.value))\n element.setAttribute('data-lexical-upload-relation-to', data?.relationTo)\n }\n\n return { element }\n }\n\n override exportJSON(): SerializedUploadNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'upload',\n version: 3,\n }\n }\n\n getData(): UploadData {\n return this.getLatest().__data\n }\n\n setData(data: UploadData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n\n override updateDOM(): false {\n return false\n }\n}\n\nexport function $createUploadServerNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadServerNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n return $applyNodeReplacement(new UploadServerNode({ data: data as UploadData }))\n}\n\nexport function $isUploadServerNode(\n node: LexicalNode | null | undefined,\n): node is UploadServerNode {\n return node instanceof UploadServerNode\n}\n"],"names":["DecoratorBlockNode","addClassNamesToElement","ObjectID","$applyNodeReplacement","$convertUploadElement","UploadServerNode","__data","
|
|
1
|
+
{"version":3,"sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"sourcesContent":["import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n} from 'lexical'\nimport type {\n CollectionSlug,\n DataFromCollectionSlug,\n JsonObject,\n TypedUploadCollection,\n UploadCollectionSlug,\n} from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nimport { $convertUploadElement } from './conversions.js'\n\nexport type UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in CollectionSlug]: {\n fields: TUploadExtraFieldsData\n /**\n * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n */\n id: string\n relationTo: TCollectionSlug\n /**\n * Value can be just the document ID, or the full, populated document\n */\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\n/**\n * Internal use only - UploadData type that can contain a pending state\n * @internal\n */\nexport type Internal_UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n pending?: {\n /**\n * ID that corresponds to the bulk upload form ID\n */\n formID: string\n /**\n * src value of the image dom element\n */\n src: string\n }\n} & UploadData<TUploadExtraFieldsData>\n\n/**\n * UploadDataImproved is a more precise type, and will replace UploadData in Payload v4.\n * This type is for internal use only as it will be deprecated in the future.\n * @internal\n *\n * @todo Replace UploadData with UploadDataImproved in 4.0\n */\nexport type UploadDataImproved<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in UploadCollectionSlug]: {\n fields: TUploadExtraFieldsData\n /**\n * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n */\n id: string\n relationTo: TCollectionSlug\n /**\n * Value can be just the document ID, or the full, populated document\n */\n value: number | string | TypedUploadCollection[TCollectionSlug]\n }\n}[UploadCollectionSlug]\n\nexport type SerializedUploadNode = StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'upload'> &\n UploadData\n\nexport class UploadServerNode extends DecoratorBlockNode {\n __data: UploadData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: UploadData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: UploadServerNode): UploadServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'upload'\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadServerNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadServerNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.upload)\n return element\n }\n\n override decorate(): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n const data = this.__data as Internal_UploadData\n if (data.pending) {\n element.setAttribute('data-lexical-pending-upload-form-id', String(data?.pending?.formID))\n element.setAttribute('src', data?.pending?.src || '')\n } else {\n element.setAttribute('data-lexical-upload-id', String(data?.value))\n element.setAttribute('data-lexical-upload-relation-to', data?.relationTo)\n }\n\n return { element }\n }\n\n override exportJSON(): SerializedUploadNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'upload',\n version: 3,\n }\n }\n\n getData(): UploadData {\n return this.getLatest().__data\n }\n\n setData(data: UploadData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n\n override updateDOM(): false {\n return false\n }\n}\n\nexport function $createUploadServerNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadServerNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n return $applyNodeReplacement(new UploadServerNode({ data: data as UploadData }))\n}\n\nexport function $isUploadServerNode(\n node: LexicalNode | null | undefined,\n): node is UploadServerNode {\n return node instanceof UploadServerNode\n}\n"],"names":["DecoratorBlockNode","addClassNamesToElement","ObjectID","$applyNodeReplacement","$convertUploadElement","UploadServerNode","__data","data","format","key","clone","node","__format","__key","getType","importDOM","img","conversion","domNode","$createUploadServerNode","priority","importJSON","serializedNode","version","value","id","default","toHexString","importedData","fields","pending","relationTo","setFormat","isInline","createDOM","config","element","document","createElement","theme","upload","decorate","exportDOM","setAttribute","String","formID","src","exportJSON","getData","type","getLatest","setData","writable","getWritable","updateDOM","$isUploadServerNode"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/field/Field.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAGxE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAE7E,OAAO,mCAAmC,CAAA;AAC1C,OAAO,eAAe,CAAA;AACtB,OAAO,cAAc,CAAA;AAErB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/field/Field.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAGxE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAE7E,OAAO,mCAAmC,CAAA;AAC1C,OAAO,eAAe,CAAA;AACtB,OAAO,cAAc,CAAA;AAErB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAQ5D,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAC/B;IACE,QAAQ,CAAC,YAAY,EAAE,2BAA2B,CAAA;CACnD,GAAG,yBAAyB,CAsL9B,CAAA;AAaD,eAAO,MAAM,QAAQ,EAAE,OAAO,iBAAqC,CAAA"}
|
package/dist/field/Field.js
CHANGED
|
@@ -10,6 +10,7 @@ import './bundled.css';
|
|
|
10
10
|
import './index.scss';
|
|
11
11
|
import { LexicalProvider } from '../lexical/LexicalProvider.js';
|
|
12
12
|
import { useRunDeprioritized } from '../utilities/useRunDeprioritized.js';
|
|
13
|
+
import { ViewSelector } from './ViewSelector.js';
|
|
13
14
|
const baseClass = 'rich-text-lexical';
|
|
14
15
|
const RichTextComponent = // With rendered features n stuff
|
|
15
16
|
(props)=>{
|
|
@@ -58,8 +59,8 @@ const RichTextComponent = // With rendered features n stuff
|
|
|
58
59
|
isSmallWidthViewport
|
|
59
60
|
]);
|
|
60
61
|
const classes = [
|
|
61
|
-
baseClass,
|
|
62
62
|
'field-type',
|
|
63
|
+
baseClass,
|
|
63
64
|
className,
|
|
64
65
|
showError && 'error',
|
|
65
66
|
disabled && `${baseClass}--read-only`,
|
|
@@ -111,6 +112,7 @@ const RichTextComponent = // With rendered features n stuff
|
|
|
111
112
|
]);
|
|
112
113
|
return /*#__PURE__*/ _jsxDEV("div", {
|
|
113
114
|
className: classes,
|
|
115
|
+
"data-lexical-view": editorConfig?.view,
|
|
114
116
|
style: styles,
|
|
115
117
|
children: [
|
|
116
118
|
/*#__PURE__*/ _jsxDEV(RenderCustomComponent, {
|
|
@@ -120,23 +122,37 @@ const RichTextComponent = // With rendered features n stuff
|
|
|
120
122
|
showError: showError
|
|
121
123
|
}, void 0, false, {
|
|
122
124
|
fileName: "src/field/Field.tsx",
|
|
123
|
-
lineNumber:
|
|
125
|
+
lineNumber: 185,
|
|
124
126
|
columnNumber: 19
|
|
125
127
|
}, void 0)
|
|
126
128
|
}, void 0, false, {
|
|
127
129
|
fileName: "src/field/Field.tsx",
|
|
128
|
-
lineNumber:
|
|
130
|
+
lineNumber: 183,
|
|
129
131
|
columnNumber: 7
|
|
130
132
|
}, this),
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
133
|
+
/*#__PURE__*/ _jsxDEV("div", {
|
|
134
|
+
className: `${baseClass}__label-row`,
|
|
135
|
+
children: [
|
|
136
|
+
Label || /*#__PURE__*/ _jsxDEV(FieldLabel, {
|
|
137
|
+
label: label,
|
|
138
|
+
localized: localized,
|
|
139
|
+
path: path,
|
|
140
|
+
required: required
|
|
141
|
+
}, void 0, false, {
|
|
142
|
+
fileName: "src/field/Field.tsx",
|
|
143
|
+
lineNumber: 189,
|
|
144
|
+
columnNumber: 11
|
|
145
|
+
}, this),
|
|
146
|
+
/*#__PURE__*/ _jsxDEV(ViewSelector, {}, void 0, false, {
|
|
147
|
+
fileName: "src/field/Field.tsx",
|
|
148
|
+
lineNumber: 191,
|
|
149
|
+
columnNumber: 9
|
|
150
|
+
}, this)
|
|
151
|
+
]
|
|
152
|
+
}, void 0, true, {
|
|
137
153
|
fileName: "src/field/Field.tsx",
|
|
138
|
-
lineNumber:
|
|
139
|
-
columnNumber:
|
|
154
|
+
lineNumber: 187,
|
|
155
|
+
columnNumber: 7
|
|
140
156
|
}, this),
|
|
141
157
|
/*#__PURE__*/ _jsxDEV("div", {
|
|
142
158
|
className: `${baseClass}__wrap`,
|
|
@@ -163,19 +179,19 @@ const RichTextComponent = // With rendered features n stuff
|
|
|
163
179
|
rerenderProviderKey
|
|
164
180
|
}), false, {
|
|
165
181
|
fileName: "src/field/Field.tsx",
|
|
166
|
-
lineNumber:
|
|
182
|
+
lineNumber: 199,
|
|
167
183
|
columnNumber: 13
|
|
168
184
|
}, this)
|
|
169
185
|
}, void 0, false, {
|
|
170
186
|
fileName: "src/field/Field.tsx",
|
|
171
|
-
lineNumber:
|
|
187
|
+
lineNumber: 198,
|
|
172
188
|
columnNumber: 11
|
|
173
189
|
}, this),
|
|
174
190
|
AfterInput
|
|
175
191
|
]
|
|
176
192
|
}, void 0, true, {
|
|
177
193
|
fileName: "src/field/Field.tsx",
|
|
178
|
-
lineNumber:
|
|
194
|
+
lineNumber: 194,
|
|
179
195
|
columnNumber: 9
|
|
180
196
|
}, this),
|
|
181
197
|
/*#__PURE__*/ _jsxDEV(RenderCustomComponent, {
|
|
@@ -185,24 +201,24 @@ const RichTextComponent = // With rendered features n stuff
|
|
|
185
201
|
path: path
|
|
186
202
|
}, void 0, false, {
|
|
187
203
|
fileName: "src/field/Field.tsx",
|
|
188
|
-
lineNumber:
|
|
204
|
+
lineNumber: 214,
|
|
189
205
|
columnNumber: 21
|
|
190
206
|
}, void 0)
|
|
191
207
|
}, void 0, false, {
|
|
192
208
|
fileName: "src/field/Field.tsx",
|
|
193
|
-
lineNumber:
|
|
209
|
+
lineNumber: 212,
|
|
194
210
|
columnNumber: 9
|
|
195
211
|
}, this)
|
|
196
212
|
]
|
|
197
213
|
}, void 0, true, {
|
|
198
214
|
fileName: "src/field/Field.tsx",
|
|
199
|
-
lineNumber:
|
|
215
|
+
lineNumber: 193,
|
|
200
216
|
columnNumber: 7
|
|
201
217
|
}, this)
|
|
202
218
|
]
|
|
203
219
|
}, pathWithEditDepth, true, {
|
|
204
220
|
fileName: "src/field/Field.tsx",
|
|
205
|
-
lineNumber:
|
|
221
|
+
lineNumber: 177,
|
|
206
222
|
columnNumber: 5
|
|
207
223
|
}, this);
|
|
208
224
|
};
|
|
@@ -216,7 +232,7 @@ function fallbackRender({ error }) {
|
|
|
216
232
|
children: "Something went wrong:"
|
|
217
233
|
}, void 0, false, {
|
|
218
234
|
fileName: "src/field/Field.tsx",
|
|
219
|
-
lineNumber:
|
|
235
|
+
lineNumber: 226,
|
|
220
236
|
columnNumber: 7
|
|
221
237
|
}, this),
|
|
222
238
|
/*#__PURE__*/ _jsxDEV("pre", {
|
|
@@ -226,13 +242,13 @@ function fallbackRender({ error }) {
|
|
|
226
242
|
children: error.message
|
|
227
243
|
}, void 0, false, {
|
|
228
244
|
fileName: "src/field/Field.tsx",
|
|
229
|
-
lineNumber:
|
|
245
|
+
lineNumber: 227,
|
|
230
246
|
columnNumber: 7
|
|
231
247
|
}, this)
|
|
232
248
|
]
|
|
233
249
|
}, void 0, true, {
|
|
234
250
|
fileName: "src/field/Field.tsx",
|
|
235
|
-
lineNumber:
|
|
251
|
+
lineNumber: 225,
|
|
236
252
|
columnNumber: 5
|
|
237
253
|
}, this);
|
|
238
254
|
}
|
package/dist/field/Field.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/field/Field.tsx"],"sourcesContent":["'use client'\nimport type { EditorState, SerializedEditorState } from 'lexical'\n\nimport {\n BulkUploadProvider,\n FieldDescription,\n FieldError,\n FieldLabel,\n RenderCustomComponent,\n useEditDepth,\n useEffectEvent,\n useField,\n} from '@payloadcms/ui'\nimport { mergeFieldStyles } from '@payloadcms/ui/shared'\nimport { dequal } from 'dequal/lite'\nimport { type Validate } from 'payload'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\n\nimport type { SanitizedClientEditorConfig } from '../lexical/config/types.js'\n\nimport '../lexical/theme/EditorTheme.scss'\nimport './bundled.css'\nimport './index.scss'\n\nimport type { LexicalRichTextFieldProps } from '../types.js'\n\nimport { LexicalProvider } from '../lexical/LexicalProvider.js'\nimport { useRunDeprioritized } from '../utilities/useRunDeprioritized.js'\n\nconst baseClass = 'rich-text-lexical'\n\nconst RichTextComponent: React.FC<\n {\n readonly editorConfig: SanitizedClientEditorConfig // With rendered features n stuff\n } & LexicalRichTextFieldProps\n> = (props) => {\n const {\n editorConfig,\n field,\n field: {\n admin: { className, description, readOnly: readOnlyFromAdmin } = {},\n label,\n localized,\n required,\n },\n path: pathFromProps,\n readOnly: readOnlyFromTopLevelProps,\n validate, // Users can pass in client side validation if they WANT to, but it's not required anymore\n } = props\n\n const readOnlyFromProps = readOnlyFromTopLevelProps || readOnlyFromAdmin\n\n const editDepth = useEditDepth()\n\n const memoizedValidate = useCallback<Validate>(\n (value, validationOptions) => {\n if (typeof validate === 'function') {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n return validate(value, { ...validationOptions, required })\n }\n return true\n },\n // Important: do not add props to the dependencies array.\n // This would cause an infinite loop and endless re-rendering.\n // Removing props from the dependencies array fixed this issue: https://github.com/payloadcms/payload/issues/3709\n [validate, required],\n )\n\n const {\n customComponents: { AfterInput, BeforeInput, Description, Error, Label } = {},\n disabled: disabledFromField,\n initialValue,\n path,\n setValue,\n showError,\n value,\n } = useField<SerializedEditorState>({\n potentiallyStalePath: pathFromProps,\n validate: memoizedValidate,\n })\n\n const disabled = readOnlyFromProps || disabledFromField\n\n const [isSmallWidthViewport, setIsSmallWidthViewport] = useState<boolean>(false)\n const [rerenderProviderKey, setRerenderProviderKey] = useState<Date>()\n\n const prevInitialValueRef = React.useRef<SerializedEditorState | undefined>(initialValue)\n const prevValueRef = React.useRef<SerializedEditorState | undefined>(value)\n\n useEffect(() => {\n const updateViewPortWidth = () => {\n const isNextSmallWidthViewport = window.matchMedia('(max-width: 768px)').matches\n\n if (isNextSmallWidthViewport !== isSmallWidthViewport) {\n setIsSmallWidthViewport(isNextSmallWidthViewport)\n }\n }\n updateViewPortWidth()\n window.addEventListener('resize', updateViewPortWidth)\n\n return () => {\n window.removeEventListener('resize', updateViewPortWidth)\n }\n }, [isSmallWidthViewport])\n\n const classes = [\n baseClass,\n 'field-type',\n className,\n showError && 'error',\n disabled && `${baseClass}--read-only`,\n editorConfig?.admin?.hideGutter !== true && !isSmallWidthViewport\n ? `${baseClass}--show-gutter`\n : null,\n ]\n .filter(Boolean)\n .join(' ')\n\n const pathWithEditDepth = `${path}.${editDepth}`\n\n const runDeprioritized = useRunDeprioritized() // defaults to 500 ms timeout\n\n const handleChange = useCallback(\n (editorState: EditorState) => {\n // Capture `editorState` in the closure so we can safely run later.\n const updateFieldValue = () => {\n const newState = editorState.toJSON()\n prevValueRef.current = newState\n setValue(newState)\n }\n\n // Queue the update for the browser’s idle time (or Safari shim)\n // and let the hook handle debouncing/cancellation.\n void runDeprioritized(updateFieldValue)\n },\n [setValue, runDeprioritized], // `runDeprioritized` is stable (useCallback inside hook)\n )\n\n const styles = useMemo(() => mergeFieldStyles(field), [field])\n\n const handleInitialValueChange = useEffectEvent(\n (initialValue: SerializedEditorState | undefined) => {\n // Object deep equality check here, as re-mounting the editor if\n // the new value is the same as the old one is not necessary.\n // In postgres, the order of keys in JSON objects is not guaranteed to be preserved,\n // so we need to do a deep equality check here that does not care about key order => we use dequal.\n // If we used JSON.stringify, the editor would re-mount every time you save the document, as the order of keys changes => change detected => re-mount.\n if (\n prevValueRef.current !== value &&\n !dequal(\n prevValueRef.current != null\n ? JSON.parse(JSON.stringify(prevValueRef.current))\n : prevValueRef.current,\n value,\n )\n ) {\n prevInitialValueRef.current = initialValue\n prevValueRef.current = value\n setRerenderProviderKey(new Date())\n }\n },\n )\n\n useEffect(() => {\n // Needs to trigger for object reference changes - otherwise,\n // reacting to the same initial value change twice will cause\n // the second change to be ignored, even though the value has changed.\n // That's because initialValue is not kept up-to-date\n if (!Object.is(initialValue, prevInitialValueRef.current)) {\n handleInitialValueChange(initialValue)\n }\n }, [initialValue])\n\n return (\n <div className={classes} key={pathWithEditDepth} style={styles}>\n <RenderCustomComponent\n CustomComponent={Error}\n Fallback={<FieldError path={path} showError={showError} />}\n />\n {Label || <FieldLabel label={label} localized={localized} path={path} required={required} />}\n <div className={`${baseClass}__wrap`}>\n <ErrorBoundary fallbackRender={fallbackRender} onReset={() => {}}>\n {BeforeInput}\n {/* Lexical may be in a drawer. We need to define another BulkUploadProvider to ensure that the bulk upload drawer\n is rendered in the correct depth (not displayed *behind* the current drawer)*/}\n <BulkUploadProvider drawerSlugPrefix={path}>\n <LexicalProvider\n composerKey={pathWithEditDepth}\n editorConfig={editorConfig}\n fieldProps={props}\n isSmallWidthViewport={isSmallWidthViewport}\n key={JSON.stringify({ path, rerenderProviderKey })} // makes sure lexical is completely re-rendered when initialValue changes, bypassing the lexical-internal value memoization. That way, external changes to the form will update the editor. More infos in PR description (https://github.com/payloadcms/payload/pull/5010)\n onChange={handleChange}\n readOnly={disabled}\n value={value}\n />\n </BulkUploadProvider>\n {AfterInput}\n </ErrorBoundary>\n <RenderCustomComponent\n CustomComponent={Description}\n Fallback={<FieldDescription description={description} path={path} />}\n />\n </div>\n </div>\n )\n}\n\nfunction fallbackRender({ error }: { error: Error }) {\n // Call resetErrorBoundary() to reset the error boundary and retry the render.\n\n return (\n <div className=\"errorBoundary\" role=\"alert\">\n <p>Something went wrong:</p>\n <pre style={{ color: 'red' }}>{error.message}</pre>\n </div>\n )\n}\n\nexport const RichText: typeof RichTextComponent = RichTextComponent\n"],"names":["BulkUploadProvider","FieldDescription","FieldError","FieldLabel","RenderCustomComponent","useEditDepth","useEffectEvent","useField","mergeFieldStyles","dequal","React","useCallback","useEffect","useMemo","useState","ErrorBoundary","LexicalProvider","useRunDeprioritized","baseClass","RichTextComponent","props","editorConfig","field","admin","className","description","readOnly","readOnlyFromAdmin","label","localized","required","path","pathFromProps","readOnlyFromTopLevelProps","validate","readOnlyFromProps","editDepth","memoizedValidate","value","validationOptions","customComponents","AfterInput","BeforeInput","Description","Error","Label","disabled","disabledFromField","initialValue","setValue","showError","potentiallyStalePath","isSmallWidthViewport","setIsSmallWidthViewport","rerenderProviderKey","setRerenderProviderKey","prevInitialValueRef","useRef","prevValueRef","updateViewPortWidth","isNextSmallWidthViewport","window","matchMedia","matches","addEventListener","removeEventListener","classes","hideGutter","filter","Boolean","join","pathWithEditDepth","runDeprioritized","handleChange","editorState","updateFieldValue","newState","toJSON","current","styles","handleInitialValueChange","JSON","parse","stringify","Date","Object","is","div","style","CustomComponent","Fallback","fallbackRender","onReset","drawerSlugPrefix","composerKey","fieldProps","onChange","error","role","p","pre","color","message","RichText"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/field/Field.tsx"],"sourcesContent":["'use client'\nimport type { EditorState, SerializedEditorState } from 'lexical'\n\nimport {\n BulkUploadProvider,\n FieldDescription,\n FieldError,\n FieldLabel,\n RenderCustomComponent,\n useEditDepth,\n useEffectEvent,\n useField,\n} from '@payloadcms/ui'\nimport { mergeFieldStyles } from '@payloadcms/ui/shared'\nimport { dequal } from 'dequal/lite'\nimport { type Validate } from 'payload'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\n\nimport type { SanitizedClientEditorConfig } from '../lexical/config/types.js'\n\nimport '../lexical/theme/EditorTheme.scss'\nimport './bundled.css'\nimport './index.scss'\n\nimport type { LexicalRichTextFieldProps } from '../types.js'\n\nimport { LexicalProvider } from '../lexical/LexicalProvider.js'\nimport { useRunDeprioritized } from '../utilities/useRunDeprioritized.js'\nimport { ViewSelector } from './ViewSelector.js'\n\nconst baseClass = 'rich-text-lexical'\n\nconst RichTextComponent: React.FC<\n {\n readonly editorConfig: SanitizedClientEditorConfig // With rendered features n stuff\n } & LexicalRichTextFieldProps\n> = (props) => {\n const {\n editorConfig,\n field,\n field: {\n admin: { className, description, readOnly: readOnlyFromAdmin } = {},\n label,\n localized,\n required,\n },\n path: pathFromProps,\n readOnly: readOnlyFromTopLevelProps,\n validate, // Users can pass in client side validation if they WANT to, but it's not required anymore\n } = props\n\n const readOnlyFromProps = readOnlyFromTopLevelProps || readOnlyFromAdmin\n\n const editDepth = useEditDepth()\n\n const memoizedValidate = useCallback<Validate>(\n (value, validationOptions) => {\n if (typeof validate === 'function') {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n return validate(value, { ...validationOptions, required })\n }\n return true\n },\n // Important: do not add props to the dependencies array.\n // This would cause an infinite loop and endless re-rendering.\n // Removing props from the dependencies array fixed this issue: https://github.com/payloadcms/payload/issues/3709\n [validate, required],\n )\n\n const {\n customComponents: { AfterInput, BeforeInput, Description, Error, Label } = {},\n disabled: disabledFromField,\n initialValue,\n path,\n setValue,\n showError,\n value,\n } = useField<SerializedEditorState>({\n potentiallyStalePath: pathFromProps,\n validate: memoizedValidate,\n })\n\n const disabled = readOnlyFromProps || disabledFromField\n\n const [isSmallWidthViewport, setIsSmallWidthViewport] = useState<boolean>(false)\n const [rerenderProviderKey, setRerenderProviderKey] = useState<Date>()\n\n const prevInitialValueRef = React.useRef<SerializedEditorState | undefined>(initialValue)\n const prevValueRef = React.useRef<SerializedEditorState | undefined>(value)\n\n useEffect(() => {\n const updateViewPortWidth = () => {\n const isNextSmallWidthViewport = window.matchMedia('(max-width: 768px)').matches\n\n if (isNextSmallWidthViewport !== isSmallWidthViewport) {\n setIsSmallWidthViewport(isNextSmallWidthViewport)\n }\n }\n updateViewPortWidth()\n window.addEventListener('resize', updateViewPortWidth)\n\n return () => {\n window.removeEventListener('resize', updateViewPortWidth)\n }\n }, [isSmallWidthViewport])\n\n const classes = [\n 'field-type',\n baseClass,\n className,\n showError && 'error',\n disabled && `${baseClass}--read-only`,\n editorConfig?.admin?.hideGutter !== true && !isSmallWidthViewport\n ? `${baseClass}--show-gutter`\n : null,\n ]\n .filter(Boolean)\n .join(' ')\n\n const pathWithEditDepth = `${path}.${editDepth}`\n\n const runDeprioritized = useRunDeprioritized() // defaults to 500 ms timeout\n\n const handleChange = useCallback(\n (editorState: EditorState) => {\n // Capture `editorState` in the closure so we can safely run later.\n const updateFieldValue = () => {\n const newState = editorState.toJSON()\n prevValueRef.current = newState\n setValue(newState)\n }\n\n // Queue the update for the browser’s idle time (or Safari shim)\n // and let the hook handle debouncing/cancellation.\n void runDeprioritized(updateFieldValue)\n },\n [setValue, runDeprioritized], // `runDeprioritized` is stable (useCallback inside hook)\n )\n\n const styles = useMemo(() => mergeFieldStyles(field), [field])\n\n const handleInitialValueChange = useEffectEvent(\n (initialValue: SerializedEditorState | undefined) => {\n // Object deep equality check here, as re-mounting the editor if\n // the new value is the same as the old one is not necessary.\n // In postgres, the order of keys in JSON objects is not guaranteed to be preserved,\n // so we need to do a deep equality check here that does not care about key order => we use dequal.\n // If we used JSON.stringify, the editor would re-mount every time you save the document, as the order of keys changes => change detected => re-mount.\n if (\n prevValueRef.current !== value &&\n !dequal(\n prevValueRef.current != null\n ? JSON.parse(JSON.stringify(prevValueRef.current))\n : prevValueRef.current,\n value,\n )\n ) {\n prevInitialValueRef.current = initialValue\n prevValueRef.current = value\n setRerenderProviderKey(new Date())\n }\n },\n )\n\n useEffect(() => {\n // Needs to trigger for object reference changes - otherwise,\n // reacting to the same initial value change twice will cause\n // the second change to be ignored, even though the value has changed.\n // That's because initialValue is not kept up-to-date\n if (!Object.is(initialValue, prevInitialValueRef.current)) {\n handleInitialValueChange(initialValue)\n }\n }, [initialValue])\n\n return (\n <div\n className={classes}\n data-lexical-view={editorConfig?.view}\n key={pathWithEditDepth}\n style={styles}\n >\n <RenderCustomComponent\n CustomComponent={Error}\n Fallback={<FieldError path={path} showError={showError} />}\n />\n <div className={`${baseClass}__label-row`}>\n {Label || (\n <FieldLabel label={label} localized={localized} path={path} required={required} />\n )}\n <ViewSelector />\n </div>\n <div className={`${baseClass}__wrap`}>\n <ErrorBoundary fallbackRender={fallbackRender} onReset={() => {}}>\n {BeforeInput}\n {/* Lexical may be in a drawer. We need to define another BulkUploadProvider to ensure that the bulk upload drawer\n is rendered in the correct depth (not displayed *behind* the current drawer)*/}\n <BulkUploadProvider drawerSlugPrefix={path}>\n <LexicalProvider\n composerKey={pathWithEditDepth}\n editorConfig={editorConfig}\n fieldProps={props}\n isSmallWidthViewport={isSmallWidthViewport}\n key={JSON.stringify({ path, rerenderProviderKey })} // makes sure lexical is completely re-rendered when initialValue changes, bypassing the lexical-internal value memoization. That way, external changes to the form will update the editor. More infos in PR description (https://github.com/payloadcms/payload/pull/5010)\n onChange={handleChange}\n readOnly={disabled}\n value={value}\n />\n </BulkUploadProvider>\n {AfterInput}\n </ErrorBoundary>\n <RenderCustomComponent\n CustomComponent={Description}\n Fallback={<FieldDescription description={description} path={path} />}\n />\n </div>\n </div>\n )\n}\n\nfunction fallbackRender({ error }: { error: Error }) {\n // Call resetErrorBoundary() to reset the error boundary and retry the render.\n\n return (\n <div className=\"errorBoundary\" role=\"alert\">\n <p>Something went wrong:</p>\n <pre style={{ color: 'red' }}>{error.message}</pre>\n </div>\n )\n}\n\nexport const RichText: typeof RichTextComponent = RichTextComponent\n"],"names":["BulkUploadProvider","FieldDescription","FieldError","FieldLabel","RenderCustomComponent","useEditDepth","useEffectEvent","useField","mergeFieldStyles","dequal","React","useCallback","useEffect","useMemo","useState","ErrorBoundary","LexicalProvider","useRunDeprioritized","ViewSelector","baseClass","RichTextComponent","props","editorConfig","field","admin","className","description","readOnly","readOnlyFromAdmin","label","localized","required","path","pathFromProps","readOnlyFromTopLevelProps","validate","readOnlyFromProps","editDepth","memoizedValidate","value","validationOptions","customComponents","AfterInput","BeforeInput","Description","Error","Label","disabled","disabledFromField","initialValue","setValue","showError","potentiallyStalePath","isSmallWidthViewport","setIsSmallWidthViewport","rerenderProviderKey","setRerenderProviderKey","prevInitialValueRef","useRef","prevValueRef","updateViewPortWidth","isNextSmallWidthViewport","window","matchMedia","matches","addEventListener","removeEventListener","classes","hideGutter","filter","Boolean","join","pathWithEditDepth","runDeprioritized","handleChange","editorState","updateFieldValue","newState","toJSON","current","styles","handleInitialValueChange","JSON","parse","stringify","Date","Object","is","div","data-lexical-view","view","style","CustomComponent","Fallback","fallbackRender","onReset","drawerSlugPrefix","composerKey","fieldProps","onChange","error","role","p","pre","color","message","RichText"],"mappings":"AAAA;;AAGA,SACEA,kBAAkB,EAClBC,gBAAgB,EAChBC,UAAU,EACVC,UAAU,EACVC,qBAAqB,EACrBC,YAAY,EACZC,cAAc,EACdC,QAAQ,QACH,iBAAgB;AACvB,SAASC,gBAAgB,QAAQ,wBAAuB;AACxD,SAASC,MAAM,QAAQ,cAAa;AAEpC,OAAOC,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AACxE,SAASC,aAAa,QAAQ,uBAAsB;AAIpD,OAAO,oCAAmC;AAC1C,OAAO,gBAAe;AACtB,OAAO,eAAc;AAIrB,SAASC,eAAe,QAAQ,gCAA+B;AAC/D,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,MAAMC,YAAY;AAElB,MAAMC,oBAEiD,iCAAiC;AAEpF,CAACC;IACH,MAAM,EACJC,YAAY,EACZC,KAAK,EACLA,OAAO,EACLC,OAAO,EAAEC,SAAS,EAAEC,WAAW,EAAEC,UAAUC,iBAAiB,EAAE,GAAG,CAAC,CAAC,EACnEC,KAAK,EACLC,SAAS,EACTC,QAAQ,EACT,EACDC,MAAMC,aAAa,EACnBN,UAAUO,yBAAyB,EACnCC,QAAQ,EACT,GADW,0FAA0F;IAClGd;IAEJ,MAAMe,oBAAoBF,6BAA6BN;IAEvD,MAAMS,YAAYhC;IAElB,MAAMiC,mBAAmB3B,YACvB,CAAC4B,OAAOC;QACN,IAAI,OAAOL,aAAa,YAAY;YAClC,oFAAoF;YACpF,OAAOA,SAASI,OAAO;gBAAE,GAAGC,iBAAiB;gBAAET;YAAS;QAC1D;QACA,OAAO;IACT,GACA,yDAAyD;IACzD,8DAA8D;IAC9D,iHAAiH;IACjH;QAACI;QAAUJ;KAAS;IAGtB,MAAM,EACJU,kBAAkB,EAAEC,UAAU,EAAEC,WAAW,EAAEC,WAAW,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAG,CAAC,CAAC,EAC7EC,UAAUC,iBAAiB,EAC3BC,YAAY,EACZjB,IAAI,EACJkB,QAAQ,EACRC,SAAS,EACTZ,KAAK,EACN,GAAGhC,SAAgC;QAClC6C,sBAAsBnB;QACtBE,UAAUG;IACZ;IAEA,MAAMS,WAAWX,qBAAqBY;IAEtC,MAAM,CAACK,sBAAsBC,wBAAwB,GAAGxC,SAAkB;IAC1E,MAAM,CAACyC,qBAAqBC,uBAAuB,GAAG1C;IAEtD,MAAM2C,sBAAsB/C,MAAMgD,MAAM,CAAoCT;IAC5E,MAAMU,eAAejD,MAAMgD,MAAM,CAAoCnB;IAErE3B,UAAU;QACR,MAAMgD,sBAAsB;YAC1B,MAAMC,2BAA2BC,OAAOC,UAAU,CAAC,sBAAsBC,OAAO;YAEhF,IAAIH,6BAA6BR,sBAAsB;gBACrDC,wBAAwBO;YAC1B;QACF;QACAD;QACAE,OAAOG,gBAAgB,CAAC,UAAUL;QAElC,OAAO;YACLE,OAAOI,mBAAmB,CAAC,UAAUN;QACvC;IACF,GAAG;QAACP;KAAqB;IAEzB,MAAMc,UAAU;QACd;QACAhD;QACAM;QACA0B,aAAa;QACbJ,YAAY,GAAG5B,UAAU,WAAW,CAAC;QACrCG,cAAcE,OAAO4C,eAAe,QAAQ,CAACf,uBACzC,GAAGlC,UAAU,aAAa,CAAC,GAC3B;KACL,CACEkD,MAAM,CAACC,SACPC,IAAI,CAAC;IAER,MAAMC,oBAAoB,GAAGxC,KAAK,CAAC,EAAEK,WAAW;IAEhD,MAAMoC,mBAAmBxD;IAAsB,6BAA6B;IAE5E,MAAMyD,eAAe/D,YACnB,CAACgE;QACC,mEAAmE;QACnE,MAAMC,mBAAmB;YACvB,MAAMC,WAAWF,YAAYG,MAAM;YACnCnB,aAAaoB,OAAO,GAAGF;YACvB3B,SAAS2B;QACX;QAEA,gEAAgE;QAChE,mDAAmD;QACnD,KAAKJ,iBAAiBG;IACxB,GACA;QAAC1B;QAAUuB;KAAiB;IAAE,yDAAyD;IAGzF,MAAMO,SAASnE,QAAQ,IAAML,iBAAiBe,QAAQ;QAACA;KAAM;IAE7D,MAAM0D,2BAA2B3E,eAC/B,CAAC2C;QACC,gEAAgE;QAChE,6DAA6D;QAC7D,oFAAoF;QACpF,mGAAmG;QACnG,sJAAsJ;QACtJ,IACEU,aAAaoB,OAAO,KAAKxC,SACzB,CAAC9B,OACCkD,aAAaoB,OAAO,IAAI,OACpBG,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACzB,aAAaoB,OAAO,KAC9CpB,aAAaoB,OAAO,EACxBxC,QAEF;YACAkB,oBAAoBsB,OAAO,GAAG9B;YAC9BU,aAAaoB,OAAO,GAAGxC;YACvBiB,uBAAuB,IAAI6B;QAC7B;IACF;IAGFzE,UAAU;QACR,6DAA6D;QAC7D,6DAA6D;QAC7D,sEAAsE;QACtE,qDAAqD;QACrD,IAAI,CAAC0E,OAAOC,EAAE,CAACtC,cAAcQ,oBAAoBsB,OAAO,GAAG;YACzDE,yBAAyBhC;QAC3B;IACF,GAAG;QAACA;KAAa;IAEjB,qBACE,QAACuC;QACC/D,WAAW0C;QACXsB,qBAAmBnE,cAAcoE;QAEjCC,OAAOX;;0BAEP,QAAC5E;gBACCwF,iBAAiB/C;gBACjBgD,wBAAU,QAAC3F;oBAAW8B,MAAMA;oBAAMmB,WAAWA;;;;;;;;;;;0BAE/C,QAACqC;gBAAI/D,WAAW,GAAGN,UAAU,WAAW,CAAC;;oBACtC2B,uBACC,QAAC3C;wBAAW0B,OAAOA;wBAAOC,WAAWA;wBAAWE,MAAMA;wBAAMD,UAAUA;;;;;;kCAExE,QAACb;;;;;;;;;;;0BAEH,QAACsE;gBAAI/D,WAAW,GAAGN,UAAU,MAAM,CAAC;;kCAClC,QAACJ;wBAAc+E,gBAAgBA;wBAAgBC,SAAS,KAAO;;4BAC5DpD;4BACA;sFAC2E,iBAC5E,QAAC3C;gCAAmBgG,kBAAkBhE;0CACpC,cAAA,QAAChB;oCACCiF,aAAazB;oCACblD,cAAcA;oCACd4E,YAAY7E;oCACZgC,sBAAsBA;oCAC8B,0QAA0Q;oCAC9T8C,UAAUzB;oCACV/C,UAAUoB;oCACVR,OAAOA;mCAHF2C,KAAKE,SAAS,CAAC;oCAAEpD;oCAAMuB;gCAAoB;;;;;;;;;;4BAMnDb;;;;;;;kCAEH,QAACtC;wBACCwF,iBAAiBhD;wBACjBiD,wBAAU,QAAC5F;4BAAiByB,aAAaA;4BAAaM,MAAMA;;;;;;;;;;;;;;;;;;OAlC3DwC;;;;;AAuCX;AAEA,SAASsB,eAAe,EAAEM,KAAK,EAAoB;IACjD,8EAA8E;IAE9E,qBACE,QAACZ;QAAI/D,WAAU;QAAgB4E,MAAK;;0BAClC,QAACC;0BAAE;;;;;;0BACH,QAACC;gBAAIZ,OAAO;oBAAEa,OAAO;gBAAM;0BAAIJ,MAAMK,OAAO;;;;;;;;;;;;AAGlD;AAEA,OAAO,MAAMC,WAAqCtF,kBAAiB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { LexicalEditorNodeMap, LexicalEditorViewMap } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Context type for rich text view management.
|
|
5
|
+
*/
|
|
6
|
+
type RichTextViewContextType = {
|
|
7
|
+
/**
|
|
8
|
+
* The name of the currently active view (e.g., 'default', 'frontend', 'debug')
|
|
9
|
+
*/
|
|
10
|
+
currentView: string;
|
|
11
|
+
/**
|
|
12
|
+
* The node map for the currently active view, containing rendering overrides for each node type.
|
|
13
|
+
* This is the resolved view from the views map based on currentView.
|
|
14
|
+
*/
|
|
15
|
+
currentViewMap?: LexicalEditorNodeMap;
|
|
16
|
+
/**
|
|
17
|
+
* If true, the current view will be inherited by nested richtext editors.
|
|
18
|
+
*/
|
|
19
|
+
inheritable?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Function to change the current view.
|
|
22
|
+
*/
|
|
23
|
+
setCurrentView: (view: string) => void;
|
|
24
|
+
/**
|
|
25
|
+
* The complete map of all available views for this field.
|
|
26
|
+
*/
|
|
27
|
+
views?: LexicalEditorViewMap;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Provider component for rich text view context.
|
|
31
|
+
*
|
|
32
|
+
* This provider manages the current view state internally and makes it accessible to child components
|
|
33
|
+
* via the useRichTextView hook. It automatically resolves the current view's node map
|
|
34
|
+
* based on the active view name.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <RichTextViewProvider
|
|
39
|
+
* currentView="frontend"
|
|
40
|
+
* views={myViews}
|
|
41
|
+
* >
|
|
42
|
+
* <MyEditor />
|
|
43
|
+
* </RichTextViewProvider>
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare const RichTextViewProvider: React.FC<{
|
|
47
|
+
children: React.ReactNode;
|
|
48
|
+
currentView?: string;
|
|
49
|
+
inheritable?: boolean;
|
|
50
|
+
views?: LexicalEditorViewMap;
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Hook to access the current rich text view context.
|
|
54
|
+
*
|
|
55
|
+
* Use this hook to access the currently active view and its node map,
|
|
56
|
+
* or to programmatically switch between views.
|
|
57
|
+
*
|
|
58
|
+
* @returns An object containing:
|
|
59
|
+
* - `currentView`: The name of the active view
|
|
60
|
+
* - `currentViewMap`: The node overrides for the current view
|
|
61
|
+
* - `setCurrentView`: Function to change views
|
|
62
|
+
* - `views`: All available views
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```tsx
|
|
66
|
+
* function MyComponent() {
|
|
67
|
+
* const { currentView, currentViewMap, setCurrentView } = useRichTextView()
|
|
68
|
+
*
|
|
69
|
+
* return (
|
|
70
|
+
* <div>
|
|
71
|
+
* <p>Current view: {currentView}</p>
|
|
72
|
+
* {currentViewMap?.heading && <p>Heading overrides are active</p>}
|
|
73
|
+
* <button onClick={() => setCurrentView('frontend')}>
|
|
74
|
+
* Switch to frontend view
|
|
75
|
+
* </button>
|
|
76
|
+
* </div>
|
|
77
|
+
* )
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function useRichTextView(): RichTextViewContextType;
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=RichTextViewProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextViewProvider.d.ts","sourceRoot":"","sources":["../../src/field/RichTextViewProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAE1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAE7E;;GAEG;AACH,KAAK,uBAAuB,GAAG;IAC7B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAA;IACrC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;OAEG;IACH,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC;;OAEG;IACH,KAAK,CAAC,EAAE,oBAAoB,CAAA;CAC7B,CAAA;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,oBAAoB,CAAA;CAC7B,CA6BA,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,eAAe,IAAI,uBAAuB,CAEzD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
|
|
3
|
+
import { useControllableState } from '@payloadcms/ui';
|
|
4
|
+
import React, { createContext, use, useMemo } from 'react';
|
|
5
|
+
/**
|
|
6
|
+
* Context type for rich text view management.
|
|
7
|
+
*/ /**
|
|
8
|
+
* The name of the currently active view (e.g., 'default', 'frontend', 'debug')
|
|
9
|
+
*/ /**
|
|
10
|
+
* The node map for the currently active view, containing rendering overrides for each node type.
|
|
11
|
+
* This is the resolved view from the views map based on currentView.
|
|
12
|
+
*/ /**
|
|
13
|
+
* If true, the current view will be inherited by nested richtext editors.
|
|
14
|
+
*/ /**
|
|
15
|
+
* Function to change the current view.
|
|
16
|
+
*/ /**
|
|
17
|
+
* The complete map of all available views for this field.
|
|
18
|
+
*/ const RichTextViewContext = /*#__PURE__*/ createContext({
|
|
19
|
+
currentView: 'default',
|
|
20
|
+
inheritable: false,
|
|
21
|
+
setCurrentView: ()=>{}
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Provider component for rich text view context.
|
|
25
|
+
*
|
|
26
|
+
* This provider manages the current view state internally and makes it accessible to child components
|
|
27
|
+
* via the useRichTextView hook. It automatically resolves the current view's node map
|
|
28
|
+
* based on the active view name.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* <RichTextViewProvider
|
|
33
|
+
* currentView="frontend"
|
|
34
|
+
* views={myViews}
|
|
35
|
+
* >
|
|
36
|
+
* <MyEditor />
|
|
37
|
+
* </RichTextViewProvider>
|
|
38
|
+
* ```
|
|
39
|
+
*/ export const RichTextViewProvider = (args)=>{
|
|
40
|
+
const parentContext = useRichTextView();
|
|
41
|
+
const { children, currentView: currentViewFromProps, inheritable, views } = parentContext.inheritable ? {
|
|
42
|
+
...parentContext,
|
|
43
|
+
...args
|
|
44
|
+
} : args;
|
|
45
|
+
const [currentView, setCurrentView] = useControllableState(currentViewFromProps, 'default');
|
|
46
|
+
const value = useMemo(()=>{
|
|
47
|
+
const currentViewMap = views ? views[currentView] || views.default : undefined;
|
|
48
|
+
return {
|
|
49
|
+
currentView,
|
|
50
|
+
currentViewMap,
|
|
51
|
+
inheritable,
|
|
52
|
+
setCurrentView,
|
|
53
|
+
views
|
|
54
|
+
};
|
|
55
|
+
}, [
|
|
56
|
+
currentView,
|
|
57
|
+
inheritable,
|
|
58
|
+
setCurrentView,
|
|
59
|
+
views
|
|
60
|
+
]);
|
|
61
|
+
return /*#__PURE__*/ _jsxDEV(RichTextViewContext, {
|
|
62
|
+
value: value,
|
|
63
|
+
children: children
|
|
64
|
+
}, void 0, false, {
|
|
65
|
+
fileName: "src/field/RichTextViewProvider.tsx",
|
|
66
|
+
lineNumber: 90,
|
|
67
|
+
columnNumber: 10
|
|
68
|
+
}, this);
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Hook to access the current rich text view context.
|
|
72
|
+
*
|
|
73
|
+
* Use this hook to access the currently active view and its node map,
|
|
74
|
+
* or to programmatically switch between views.
|
|
75
|
+
*
|
|
76
|
+
* @returns An object containing:
|
|
77
|
+
* - `currentView`: The name of the active view
|
|
78
|
+
* - `currentViewMap`: The node overrides for the current view
|
|
79
|
+
* - `setCurrentView`: Function to change views
|
|
80
|
+
* - `views`: All available views
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```tsx
|
|
84
|
+
* function MyComponent() {
|
|
85
|
+
* const { currentView, currentViewMap, setCurrentView } = useRichTextView()
|
|
86
|
+
*
|
|
87
|
+
* return (
|
|
88
|
+
* <div>
|
|
89
|
+
* <p>Current view: {currentView}</p>
|
|
90
|
+
* {currentViewMap?.heading && <p>Heading overrides are active</p>}
|
|
91
|
+
* <button onClick={() => setCurrentView('frontend')}>
|
|
92
|
+
* Switch to frontend view
|
|
93
|
+
* </button>
|
|
94
|
+
* </div>
|
|
95
|
+
* )
|
|
96
|
+
* }
|
|
97
|
+
* ```
|
|
98
|
+
*/ export function useRichTextView() {
|
|
99
|
+
return use(RichTextViewContext);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=RichTextViewProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/field/RichTextViewProvider.tsx"],"sourcesContent":["'use client'\nimport { useControllableState } from '@payloadcms/ui'\nimport React, { createContext, use, useMemo } from 'react'\n\nimport type { LexicalEditorNodeMap, LexicalEditorViewMap } from '../types.js'\n\n/**\n * Context type for rich text view management.\n */\ntype RichTextViewContextType = {\n /**\n * The name of the currently active view (e.g., 'default', 'frontend', 'debug')\n */\n currentView: string\n /**\n * The node map for the currently active view, containing rendering overrides for each node type.\n * This is the resolved view from the views map based on currentView.\n */\n currentViewMap?: LexicalEditorNodeMap\n /**\n * If true, the current view will be inherited by nested richtext editors.\n */\n inheritable?: boolean\n /**\n * Function to change the current view.\n */\n setCurrentView: (view: string) => void\n /**\n * The complete map of all available views for this field.\n */\n views?: LexicalEditorViewMap\n}\n\nconst RichTextViewContext = createContext<RichTextViewContextType>({\n currentView: 'default',\n inheritable: false,\n setCurrentView: () => {},\n})\n\n/**\n * Provider component for rich text view context.\n *\n * This provider manages the current view state internally and makes it accessible to child components\n * via the useRichTextView hook. It automatically resolves the current view's node map\n * based on the active view name.\n *\n * @example\n * ```tsx\n * <RichTextViewProvider\n * currentView=\"frontend\"\n * views={myViews}\n * >\n * <MyEditor />\n * </RichTextViewProvider>\n * ```\n */\nexport const RichTextViewProvider: React.FC<{\n children: React.ReactNode\n currentView?: string\n inheritable?: boolean\n views?: LexicalEditorViewMap\n}> = (args) => {\n const parentContext = useRichTextView()\n\n const {\n children,\n currentView: currentViewFromProps,\n inheritable,\n views,\n } = parentContext.inheritable\n ? {\n ...parentContext,\n ...args,\n }\n : args\n\n const [currentView, setCurrentView] = useControllableState(currentViewFromProps, 'default')\n\n const value = useMemo(() => {\n const currentViewMap = views ? views[currentView] || views.default : undefined\n return {\n currentView,\n currentViewMap,\n inheritable,\n setCurrentView,\n views,\n }\n }, [currentView, inheritable, setCurrentView, views])\n\n return <RichTextViewContext value={value}>{children}</RichTextViewContext>\n}\n\n/**\n * Hook to access the current rich text view context.\n *\n * Use this hook to access the currently active view and its node map,\n * or to programmatically switch between views.\n *\n * @returns An object containing:\n * - `currentView`: The name of the active view\n * - `currentViewMap`: The node overrides for the current view\n * - `setCurrentView`: Function to change views\n * - `views`: All available views\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { currentView, currentViewMap, setCurrentView } = useRichTextView()\n *\n * return (\n * <div>\n * <p>Current view: {currentView}</p>\n * {currentViewMap?.heading && <p>Heading overrides are active</p>}\n * <button onClick={() => setCurrentView('frontend')}>\n * Switch to frontend view\n * </button>\n * </div>\n * )\n * }\n * ```\n */\nexport function useRichTextView(): RichTextViewContextType {\n return use(RichTextViewContext)\n}\n"],"names":["useControllableState","React","createContext","use","useMemo","RichTextViewContext","currentView","inheritable","setCurrentView","RichTextViewProvider","args","parentContext","useRichTextView","children","currentViewFromProps","views","value","currentViewMap","default","undefined"],"mappings":"AAAA;;AACA,SAASA,oBAAoB,QAAQ,iBAAgB;AACrD,OAAOC,SAASC,aAAa,EAAEC,GAAG,EAAEC,OAAO,QAAQ,QAAO;AAI1D;;CAEC,GAEC;;GAEC,GAED;;;GAGC,GAED;;GAEC,GAED;;GAEC,GAED;;GAEC,GAIH,MAAMC,oCAAsBH,cAAuC;IACjEI,aAAa;IACbC,aAAa;IACbC,gBAAgB,KAAO;AACzB;AAEA;;;;;;;;;;;;;;;;CAgBC,GACD,OAAO,MAAMC,uBAKR,CAACC;IACJ,MAAMC,gBAAgBC;IAEtB,MAAM,EACJC,QAAQ,EACRP,aAAaQ,oBAAoB,EACjCP,WAAW,EACXQ,KAAK,EACN,GAAGJ,cAAcJ,WAAW,GACzB;QACE,GAAGI,aAAa;QAChB,GAAGD,IAAI;IACT,IACAA;IAEJ,MAAM,CAACJ,aAAaE,eAAe,GAAGR,qBAAqBc,sBAAsB;IAEjF,MAAME,QAAQZ,QAAQ;QACpB,MAAMa,iBAAiBF,QAAQA,KAAK,CAACT,YAAY,IAAIS,MAAMG,OAAO,GAAGC;QACrE,OAAO;YACLb;YACAW;YACAV;YACAC;YACAO;QACF;IACF,GAAG;QAACT;QAAaC;QAAaC;QAAgBO;KAAM;IAEpD,qBAAO,QAACV;QAAoBW,OAAOA;kBAAQH;;;;;;AAC7C,EAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BC,GACD,OAAO,SAASD;IACd,OAAOT,IAAIE;AACb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewSelector.d.ts","sourceRoot":"","sources":["../../src/field/ViewSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,qBAAqB,CAAA;AAE5B,wBAAgB,YAAY,IAAI,IAAI,GAAG,KAAK,CAAC,YAAY,CAyDxD"}
|