@payloadcms/richtext-lexical 3.0.0-beta.55 → 3.0.0-beta.56
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/bundled.css +1 -1
- package/dist/exports/client/chunk-OAQL5GDK.js +2 -0
- package/dist/exports/client/chunk-OAQL5GDK.js.map +7 -0
- package/dist/exports/client/component-V5QZ7EVZ.js +2 -0
- package/dist/exports/client/component-V5QZ7EVZ.js.map +7 -0
- package/dist/exports/client/{component-PEFMKIXI.js → component-YNZTTMBY.js} +2 -2
- package/dist/exports/client/component-YNZTTMBY.js.map +7 -0
- 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 +7 -7
- package/dist/exports/client/index.js.map +4 -4
- package/dist/features/blocks/component/index.js +1 -1
- package/dist/features/blocks/component/index.js.map +1 -1
- package/dist/features/blocks/feature.server.d.ts.map +1 -1
- package/dist/features/blocks/feature.server.js +1 -11
- package/dist/features/blocks/feature.server.js.map +1 -1
- package/dist/features/heading/feature.server.d.ts +5 -1
- package/dist/features/heading/feature.server.d.ts.map +1 -1
- package/dist/features/heading/feature.server.js.map +1 -1
- package/dist/features/link/feature.server.d.ts.map +1 -1
- package/dist/features/link/feature.server.js +1 -11
- package/dist/features/link/feature.server.js.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/LinkEditor/index.js +9 -5
- package/dist/features/link/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/heading/converter.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/heading/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/converter.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/converter.js.map +1 -1
- package/dist/features/upload/component/index.d.ts.map +1 -1
- package/dist/features/upload/component/index.js +34 -11
- package/dist/features/upload/component/index.js.map +1 -1
- package/dist/features/upload/feature.server.d.ts.map +1 -1
- package/dist/features/upload/feature.server.js +1 -11
- package/dist/features/upload/feature.server.js.map +1 -1
- package/dist/field/index.js +8 -8
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/nodeTypes.d.ts +11 -7
- package/dist/nodeTypes.d.ts.map +1 -1
- package/dist/nodeTypes.js.map +1 -1
- package/dist/utilities/fieldsDrawer/Drawer.d.ts +18 -0
- package/dist/utilities/fieldsDrawer/Drawer.d.ts.map +1 -0
- package/dist/utilities/fieldsDrawer/Drawer.js +26 -0
- package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -0
- package/dist/utilities/fieldsDrawer/DrawerContent.d.ts +4 -0
- package/dist/utilities/fieldsDrawer/DrawerContent.d.ts.map +1 -0
- package/dist/{features/link/drawer/index.js → utilities/fieldsDrawer/DrawerContent.js} +38 -40
- package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -0
- package/dist/utilities/generateSchemaMap.d.ts.map +1 -1
- package/dist/utilities/generateSchemaMap.js +9 -0
- package/dist/utilities/generateSchemaMap.js.map +1 -1
- package/dist/utilities/migrateSlateToLexical/index.js +2 -2
- package/dist/utilities/migrateSlateToLexical/index.js.map +1 -1
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.d.ts +9 -0
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.d.ts.map +1 -0
- package/dist/utilities/migrateSlateToLexical/{recurse.js → migrateDocumentFieldsRecursively.js} +7 -7
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js.map +1 -0
- package/dist/utilities/upgradeLexicalData/index.d.ts +11 -0
- package/dist/utilities/upgradeLexicalData/index.d.ts.map +1 -0
- package/dist/utilities/upgradeLexicalData/index.js +101 -0
- package/dist/utilities/upgradeLexicalData/index.js.map +1 -0
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.d.ts +9 -0
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.d.ts.map +1 -0
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js +74 -0
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js.map +1 -0
- package/package.json +9 -9
- package/dist/exports/client/chunk-5RJS5YZT.js +0 -2
- package/dist/exports/client/chunk-5RJS5YZT.js.map +0 -7
- package/dist/exports/client/component-F6V63OLD.js +0 -2
- package/dist/exports/client/component-F6V63OLD.js.map +0 -7
- package/dist/exports/client/component-PEFMKIXI.js.map +0 -7
- package/dist/features/link/drawer/index.d.ts +0 -5
- package/dist/features/link/drawer/index.d.ts.map +0 -1
- package/dist/features/link/drawer/index.js.map +0 -1
- package/dist/features/link/drawer/types.d.ts +0 -10
- package/dist/features/link/drawer/types.d.ts.map +0 -1
- package/dist/features/link/drawer/types.js +0 -3
- package/dist/features/link/drawer/types.js.map +0 -1
- package/dist/features/upload/component/ExtraFieldsDrawer/index.d.ts +0 -12
- package/dist/features/upload/component/ExtraFieldsDrawer/index.d.ts.map +0 -1
- package/dist/features/upload/component/ExtraFieldsDrawer/index.js +0 -123
- package/dist/features/upload/component/ExtraFieldsDrawer/index.js.map +0 -1
- package/dist/utilities/migrateSlateToLexical/recurse.d.ts +0 -9
- package/dist/utilities/migrateSlateToLexical/recurse.d.ts.map +0 -1
- package/dist/utilities/migrateSlateToLexical/recurse.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/features/blocks/component/index.tsx"],"sourcesContent":["'use client'\n\nimport type { FormProps } from '@payloadcms/ui'\n\nimport {\n Collapsible,\n Form,\n Pill,\n SectionTitle,\n ShimmerEffect,\n useConfig,\n useDocumentInfo,\n useFieldProps,\n useFormSubmitted,\n useTranslation,\n} from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { type BlockFields } from '../nodes/BlocksNode.js'\nconst baseClass = 'lexical-block'\nimport type { ReducedBlock } from '@payloadcms/ui/utilities/buildComponentMap'\nimport type { FormState } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { getFormState } from '@payloadcms/ui/shared'\nimport { v4 as uuid } from 'uuid'\n\nimport type { ClientComponentProps } from '../../typesClient.js'\nimport type { BlocksFeatureClientProps } from '../feature.client.js'\n\nimport { useEditorConfigContext } from '../../../lexical/config/client/EditorConfigProvider.js'\nimport { BlockContent } from './BlockContent.js'\nimport './index.scss'\n\ntype Props = {\n children?: React.ReactNode\n\n formData: BlockFields\n nodeKey?: string\n /**\n * This transformedFormData already comes wrapped in blockFieldWrapperName\n */\n transformedFormData: BlockFields\n}\n\nexport const BlockComponent: React.FC<Props> = (props) => {\n const { formData, nodeKey } = props\n const config = useConfig()\n const submitted = useFormSubmitted()\n const { id } = useDocumentInfo()\n const { path, schemaPath } = useFieldProps()\n const { editorConfig, field: parentLexicalRichTextField } = useEditorConfigContext()\n\n const [initialState, setInitialState] = useState<FormState | false>(false)\n const {\n field: { richTextComponentMap },\n } = useEditorConfigContext()\n\n const componentMapRenderedFieldsPath = `feature.blocks.fields.${formData?.blockType}`\n const schemaFieldsPath = `${schemaPath}.feature.blocks.${formData?.blockType}`\n\n const reducedBlock: ReducedBlock = (\n editorConfig?.resolvedFeatureMap?.get('blocks')\n ?.sanitizedClientFeatureProps as ClientComponentProps<BlocksFeatureClientProps>\n )?.reducedBlocks?.find((block) => block.slug === formData?.blockType)\n\n const fieldMap = richTextComponentMap.get(componentMapRenderedFieldsPath)\n // Field Schema\n useEffect(() => {\n const awaitInitialState = async () => {\n const state = await getFormState({\n apiRoute: config.routes.api,\n body: {\n id,\n data: JSON.parse(JSON.stringify(formData)),\n operation: 'update',\n schemaPath: schemaFieldsPath,\n },\n serverURL: config.serverURL,\n }) // Form State\n\n if (state) {\n setInitialState({\n ...state,\n blockName: {\n initialValue: '',\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n },\n })\n }\n }\n\n if (formData) {\n void awaitInitialState()\n }\n }, [config.routes.api, config.serverURL, schemaFieldsPath, id])\n\n const onChange: FormProps['onChange'][0] = useCallback(\n async ({ formState: prevFormState }) => {\n const formState = await getFormState({\n apiRoute: config.routes.api,\n body: {\n id,\n formState: prevFormState,\n operation: 'update',\n schemaPath: schemaFieldsPath,\n },\n serverURL: config.serverURL,\n })\n\n return {\n ...formState,\n blockName: {\n initialValue: '',\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n },\n }\n },\n\n [config.routes.api, config.serverURL, schemaFieldsPath, id, formData.blockName],\n )\n const { i18n } = useTranslation()\n\n const classNames = [`${baseClass}__row`, `${baseClass}__row--no-errors`].filter(Boolean).join(' ')\n\n // Memoized Form JSX\n const formContent = useMemo(() => {\n return reducedBlock && initialState !== false ? (\n <Form\n beforeSubmit={[onChange]}\n // @ts-expect-error TODO: Fix this\n fields={fieldMap}\n initialState={initialState}\n onChange={[onChange]}\n submitted={submitted}\n uuid={uuid()}\n >\n <BlockContent\n baseClass={baseClass}\n field={parentLexicalRichTextField}\n formData={formData}\n formSchema={Array.isArray(fieldMap) ? fieldMap : []}\n nodeKey={nodeKey}\n path={`${path}.feature.blocks.${formData.blockType}`}\n reducedBlock={reducedBlock}\n schemaPath={schemaFieldsPath}\n />\n </Form>\n ) : (\n <Collapsible\n className={classNames}\n collapsibleStyle=\"default\"\n header={\n <div className={`${baseClass}__block-header`}>\n <div>\n <Pill\n className={`${baseClass}__block-pill ${baseClass}__block-pill-${formData?.blockType}`}\n pillStyle=\"white\"\n >\n {typeof reducedBlock.labels.singular === 'string'\n ? getTranslation(reducedBlock.labels.singular, i18n)\n : '[Singular Label]'}\n </Pill>\n <SectionTitle path=\"blockName\" readOnly={parentLexicalRichTextField?.readOnly} />\n </div>\n </div>\n }\n key={0}\n >\n <ShimmerEffect height=\"35vh\" />\n </Collapsible>\n )\n }, [\n classNames,\n fieldMap,\n parentLexicalRichTextField,\n nodeKey,\n i18n,\n submitted,\n initialState,\n reducedBlock,\n onChange,\n schemaFieldsPath,\n path,\n ]) // Adding formData to the dependencies here might break it\n return <div className={baseClass + ' ' + baseClass + '-' + formData.blockType}>{formContent}</div>\n}\n"],"names":["Collapsible","Form","Pill","SectionTitle","ShimmerEffect","useConfig","useDocumentInfo","useFieldProps","useFormSubmitted","useTranslation","React","useCallback","useEffect","useMemo","useState","baseClass","getTranslation","getFormState","v4","uuid","useEditorConfigContext","BlockContent","BlockComponent","props","formData","nodeKey","config","submitted","id","path","schemaPath","editorConfig","field","parentLexicalRichTextField","initialState","setInitialState","richTextComponentMap","componentMapRenderedFieldsPath","blockType","schemaFieldsPath","reducedBlock","resolvedFeatureMap","get","sanitizedClientFeatureProps","reducedBlocks","find","block","slug","fieldMap","awaitInitialState","state","apiRoute","routes","api","body","data","JSON","parse","stringify","operation","serverURL","blockName","initialValue","passesCondition","valid","value","onChange","formState","prevFormState","i18n","classNames","filter","Boolean","join","formContent","beforeSubmit","fields","formSchema","Array","isArray","className","collapsibleStyle","header","div","pillStyle","labels","singular","readOnly","height"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/features/blocks/component/index.tsx"],"sourcesContent":["'use client'\n\nimport type { FormProps } from '@payloadcms/ui'\n\nimport {\n Collapsible,\n Form,\n Pill,\n SectionTitle,\n ShimmerEffect,\n useConfig,\n useDocumentInfo,\n useFieldProps,\n useFormSubmitted,\n useTranslation,\n} from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { type BlockFields } from '../nodes/BlocksNode.js'\nconst baseClass = 'lexical-block'\nimport type { ReducedBlock } from '@payloadcms/ui/utilities/buildComponentMap'\nimport type { FormState } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { getFormState } from '@payloadcms/ui/shared'\nimport { v4 as uuid } from 'uuid'\n\nimport type { ClientComponentProps } from '../../typesClient.js'\nimport type { BlocksFeatureClientProps } from '../feature.client.js'\n\nimport { useEditorConfigContext } from '../../../lexical/config/client/EditorConfigProvider.js'\nimport { BlockContent } from './BlockContent.js'\nimport './index.scss'\n\ntype Props = {\n children?: React.ReactNode\n\n formData: BlockFields\n nodeKey?: string\n /**\n * This transformedFormData already comes wrapped in blockFieldWrapperName\n */\n transformedFormData: BlockFields\n}\n\nexport const BlockComponent: React.FC<Props> = (props) => {\n const { formData, nodeKey } = props\n const config = useConfig()\n const submitted = useFormSubmitted()\n const { id } = useDocumentInfo()\n const { path, schemaPath } = useFieldProps()\n const { editorConfig, field: parentLexicalRichTextField } = useEditorConfigContext()\n\n const [initialState, setInitialState] = useState<FormState | false>(false)\n const {\n field: { richTextComponentMap },\n } = useEditorConfigContext()\n\n const componentMapRenderedFieldsPath = `feature.blocks.fields.${formData?.blockType}`\n const schemaFieldsPath = `${schemaPath}.feature.blocks.${formData?.blockType}`\n\n const reducedBlock: ReducedBlock = (\n editorConfig?.resolvedFeatureMap?.get('blocks')\n ?.sanitizedClientFeatureProps as ClientComponentProps<BlocksFeatureClientProps>\n )?.reducedBlocks?.find((block) => block.slug === formData?.blockType)\n\n const fieldMap = richTextComponentMap.get(componentMapRenderedFieldsPath)\n // Field Schema\n useEffect(() => {\n const awaitInitialState = async () => {\n const state = await getFormState({\n apiRoute: config.routes.api,\n body: {\n id,\n data: formData,\n operation: 'update',\n schemaPath: schemaFieldsPath,\n },\n serverURL: config.serverURL,\n }) // Form State\n\n if (state) {\n setInitialState({\n ...state,\n blockName: {\n initialValue: '',\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n },\n })\n }\n }\n\n if (formData) {\n void awaitInitialState()\n }\n }, [config.routes.api, config.serverURL, schemaFieldsPath, id])\n\n const onChange: FormProps['onChange'][0] = useCallback(\n async ({ formState: prevFormState }) => {\n const formState = await getFormState({\n apiRoute: config.routes.api,\n body: {\n id,\n formState: prevFormState,\n operation: 'update',\n schemaPath: schemaFieldsPath,\n },\n serverURL: config.serverURL,\n })\n\n return {\n ...formState,\n blockName: {\n initialValue: '',\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n },\n }\n },\n\n [config.routes.api, config.serverURL, schemaFieldsPath, id, formData.blockName],\n )\n const { i18n } = useTranslation()\n\n const classNames = [`${baseClass}__row`, `${baseClass}__row--no-errors`].filter(Boolean).join(' ')\n\n // Memoized Form JSX\n const formContent = useMemo(() => {\n return reducedBlock && initialState !== false ? (\n <Form\n beforeSubmit={[onChange]}\n // @ts-expect-error TODO: Fix this\n fields={fieldMap}\n initialState={initialState}\n onChange={[onChange]}\n submitted={submitted}\n uuid={uuid()}\n >\n <BlockContent\n baseClass={baseClass}\n field={parentLexicalRichTextField}\n formData={formData}\n formSchema={Array.isArray(fieldMap) ? fieldMap : []}\n nodeKey={nodeKey}\n path={`${path}.feature.blocks.${formData.blockType}`}\n reducedBlock={reducedBlock}\n schemaPath={schemaFieldsPath}\n />\n </Form>\n ) : (\n <Collapsible\n className={classNames}\n collapsibleStyle=\"default\"\n header={\n <div className={`${baseClass}__block-header`}>\n <div>\n <Pill\n className={`${baseClass}__block-pill ${baseClass}__block-pill-${formData?.blockType}`}\n pillStyle=\"white\"\n >\n {typeof reducedBlock.labels.singular === 'string'\n ? getTranslation(reducedBlock.labels.singular, i18n)\n : '[Singular Label]'}\n </Pill>\n <SectionTitle path=\"blockName\" readOnly={parentLexicalRichTextField?.readOnly} />\n </div>\n </div>\n }\n key={0}\n >\n <ShimmerEffect height=\"35vh\" />\n </Collapsible>\n )\n }, [\n classNames,\n fieldMap,\n parentLexicalRichTextField,\n nodeKey,\n i18n,\n submitted,\n initialState,\n reducedBlock,\n onChange,\n schemaFieldsPath,\n path,\n ]) // Adding formData to the dependencies here might break it\n return <div className={baseClass + ' ' + baseClass + '-' + formData.blockType}>{formContent}</div>\n}\n"],"names":["Collapsible","Form","Pill","SectionTitle","ShimmerEffect","useConfig","useDocumentInfo","useFieldProps","useFormSubmitted","useTranslation","React","useCallback","useEffect","useMemo","useState","baseClass","getTranslation","getFormState","v4","uuid","useEditorConfigContext","BlockContent","BlockComponent","props","formData","nodeKey","config","submitted","id","path","schemaPath","editorConfig","field","parentLexicalRichTextField","initialState","setInitialState","richTextComponentMap","componentMapRenderedFieldsPath","blockType","schemaFieldsPath","reducedBlock","resolvedFeatureMap","get","sanitizedClientFeatureProps","reducedBlocks","find","block","slug","fieldMap","awaitInitialState","state","apiRoute","routes","api","body","data","operation","serverURL","blockName","initialValue","passesCondition","valid","value","onChange","formState","prevFormState","i18n","classNames","filter","Boolean","join","formContent","beforeSubmit","fields","formSchema","Array","isArray","className","collapsibleStyle","header","div","pillStyle","labels","singular","readOnly","height"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../src/features/blocks/feature.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../src/features/blocks/feature.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,SAAS,CAAA;AAI/D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAWnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,aAAa,6HAsGxB,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { traverseFields } from '@payloadcms/ui/utilities/buildFieldSchemaMap/traverseFields';
|
|
2
1
|
import { baseBlockFields, fieldsToJSONSchema, formatLabels, sanitizeFields } from 'payload';
|
|
3
2
|
// eslint-disable-next-line payload/no-imports-from-exports-dir
|
|
4
3
|
import { BlocksFeatureClient } from '../../exports/client/index.js';
|
|
@@ -39,22 +38,13 @@ export const BlocksFeature = createServerFeature({
|
|
|
39
38
|
return {
|
|
40
39
|
ClientFeature: BlocksFeatureClient,
|
|
41
40
|
clientFeatureProps: clientProps,
|
|
42
|
-
generateSchemaMap: ({
|
|
43
|
-
const validRelationships = config.collections.map((c)=>c.slug) || [];
|
|
41
|
+
generateSchemaMap: ({ props })=>{
|
|
44
42
|
/**
|
|
45
43
|
* Add sub-fields to the schemaMap. E.g. if you have an array field as part of the block, and it runs addRow, it will request these
|
|
46
44
|
* sub-fields from the component map. Thus, we need to put them in the component map here.
|
|
47
45
|
*/ const schemaMap = new Map();
|
|
48
46
|
for (const block of props.blocks){
|
|
49
47
|
schemaMap.set(block.slug, block.fields || []);
|
|
50
|
-
traverseFields({
|
|
51
|
-
config,
|
|
52
|
-
fields: block.fields,
|
|
53
|
-
i18n,
|
|
54
|
-
schemaMap,
|
|
55
|
-
schemaPath: block.slug,
|
|
56
|
-
validRelationships
|
|
57
|
-
});
|
|
58
48
|
}
|
|
59
49
|
return schemaMap;
|
|
60
50
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/features/blocks/feature.server.ts"],"sourcesContent":["import type { Block, BlockField, Config, Field } from 'payload'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/features/blocks/feature.server.ts"],"sourcesContent":["import type { Block, BlockField, Config, Field } from 'payload'\n\nimport { baseBlockFields, fieldsToJSONSchema, formatLabels, sanitizeFields } from 'payload'\n\nimport type { BlocksFeatureClientProps } from './feature.client.js'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { BlocksFeatureClient } from '../../exports/client/index.js'\nimport { createServerFeature } from '../../utilities/createServerFeature.js'\nimport { createNode } from '../typeUtilities.js'\nimport { blockPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { BlockNode } from './nodes/BlocksNode.js'\nimport { blockValidationHOC } from './validate.js'\n\nexport type BlocksFeatureProps = {\n blocks: Block[]\n}\n\nexport const BlocksFeature = createServerFeature<\n BlocksFeatureProps,\n BlocksFeatureProps,\n BlocksFeatureClientProps\n>({\n feature: async ({ config: _config, isRoot, props }) => {\n if (props?.blocks?.length) {\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n for (const block of props.blocks) {\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n\n block.fields = await sanitizeFields({\n config: _config as unknown as Config,\n fields: block.fields,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n }\n }\n\n // Build clientProps\n const clientProps: BlocksFeatureClientProps = {\n reducedBlocks: [],\n }\n for (const block of props.blocks) {\n clientProps.reducedBlocks.push({\n slug: block.slug,\n fieldMap: [],\n imageAltText: block.imageAltText,\n imageURL: block.imageURL,\n labels: block.labels,\n })\n }\n\n return {\n ClientFeature: BlocksFeatureClient,\n clientFeatureProps: clientProps,\n generateSchemaMap: ({ props }) => {\n /**\n * Add sub-fields to the schemaMap. E.g. if you have an array field as part of the block, and it runs addRow, it will request these\n * sub-fields from the component map. Thus, we need to put them in the component map here.\n */\n const schemaMap = new Map<string, Field[]>()\n\n for (const block of props.blocks) {\n schemaMap.set(block.slug, block.fields || [])\n }\n\n return schemaMap\n },\n generatedTypes: {\n modifyOutputSchema: ({\n collectionIDFieldTypes,\n config,\n currentSchema,\n field,\n interfaceNameDefinitions,\n }) => {\n if (!props?.blocks?.length) {\n return currentSchema\n }\n\n const blocksField: BlockField = {\n name: field?.name + '_lexical_blocks',\n type: 'blocks',\n blocks: props.blocks,\n }\n // This is only done so that interfaceNameDefinitions sets those block's interfaceNames.\n // we don't actually use the JSON Schema itself in the generated types yet.\n fieldsToJSONSchema(\n collectionIDFieldTypes,\n [blocksField],\n interfaceNameDefinitions,\n config,\n )\n\n return currentSchema\n },\n },\n i18n,\n nodes: [\n createNode({\n getSubFields: ({ node }) => {\n const blockType = node.fields.blockType\n\n const block = props.blocks.find((block) => block.slug === blockType)\n return block?.fields\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [blockPopulationPromiseHOC(props)],\n node: BlockNode,\n validations: [blockValidationHOC(props)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'blocks',\n})\n"],"names":["baseBlockFields","fieldsToJSONSchema","formatLabels","sanitizeFields","BlocksFeatureClient","createServerFeature","createNode","blockPopulationPromiseHOC","i18n","BlockNode","blockValidationHOC","BlocksFeature","feature","config","_config","isRoot","props","blocks","length","validRelationships","collections","map","c","slug","block","fields","concat","labels","requireFieldLevelRichTextEditor","clientProps","reducedBlocks","push","fieldMap","imageAltText","imageURL","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","generatedTypes","modifyOutputSchema","collectionIDFieldTypes","currentSchema","field","interfaceNameDefinitions","blocksField","name","type","nodes","getSubFields","node","blockType","find","getSubFieldsData","graphQLPopulationPromises","validations","sanitizedServerFeatureProps","key"],"mappings":"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"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type { HeadingTagType } from '@lexical/rich-text';
|
|
1
|
+
import type { SerializedHeadingNode as _SerializedHeadingNode, HeadingTagType } from '@lexical/rich-text';
|
|
2
|
+
import type { Spread } from 'lexical';
|
|
3
|
+
export type SerializedHeadingNode = Spread<{
|
|
4
|
+
type: 'heading';
|
|
5
|
+
}, _SerializedHeadingNode>;
|
|
2
6
|
export type HeadingFeatureProps = {
|
|
3
7
|
enabledHeadingSizes?: HeadingTagType[];
|
|
4
8
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../src/features/heading/feature.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../src/features/heading/feature.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,IAAI,sBAAsB,EAC/C,cAAc,EACf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAYrC,MAAM,MAAM,qBAAqB,GAAG,MAAM,CACxC;IACE,IAAI,EAAE,SAAS,CAAA;CAChB,EACD,sBAAsB,CACvB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,mBAAmB,CAAC,EAAE,cAAc,EAAE,CAAA;CACvC,CAAA;AAED,eAAO,MAAM,cAAc,0HA4CzB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/features/heading/feature.server.ts"],"sourcesContent":["import type { HeadingTagType
|
|
1
|
+
{"version":3,"sources":["../../../src/features/heading/feature.server.ts"],"sourcesContent":["import type {\n SerializedHeadingNode as _SerializedHeadingNode,\n HeadingTagType,\n} from '@lexical/rich-text'\nimport type { Spread } from 'lexical'\n\nimport { HeadingNode } from '@lexical/rich-text'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { HeadingFeatureClient } from '../../exports/client/index.js'\nimport { createServerFeature } from '../../utilities/createServerFeature.js'\nimport { convertLexicalNodesToHTML } from '../converters/html/converter/index.js'\nimport { createNode } from '../typeUtilities.js'\nimport { i18n } from './i18n.js'\nimport { MarkdownTransformer } from './markdownTransformer.js'\n\nexport type SerializedHeadingNode = Spread<\n {\n type: 'heading'\n },\n _SerializedHeadingNode\n>\n\nexport type HeadingFeatureProps = {\n enabledHeadingSizes?: HeadingTagType[]\n}\n\nexport const HeadingFeature = createServerFeature<\n HeadingFeatureProps,\n HeadingFeatureProps,\n HeadingFeatureProps\n>({\n feature: ({ props }) => {\n if (!props) {\n props = {}\n }\n\n const { enabledHeadingSizes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] } = props\n\n return {\n ClientFeature: HeadingFeatureClient,\n clientFeatureProps: props,\n i18n,\n markdownTransformers: [MarkdownTransformer(enabledHeadingSizes)],\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({ converters, node, parent, req }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n lexicalNodes: node.children,\n parent: {\n ...node,\n parent,\n },\n req,\n })\n\n return '<' + node?.tag + '>' + childrenText + '</' + node?.tag + '>'\n },\n nodeTypes: [HeadingNode.getType()],\n },\n },\n node: HeadingNode,\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'heading',\n})\n"],"names":["HeadingNode","HeadingFeatureClient","createServerFeature","convertLexicalNodesToHTML","createNode","i18n","MarkdownTransformer","HeadingFeature","feature","props","enabledHeadingSizes","ClientFeature","clientFeatureProps","markdownTransformers","nodes","converters","html","converter","node","parent","req","childrenText","lexicalNodes","children","tag","nodeTypes","getType","sanitizedServerFeatureProps","key"],"mappings":"AAMA,SAASA,WAAW,QAAQ,qBAAoB;AAEhD,+DAA+D;AAC/D,SAASC,oBAAoB,QAAQ,gCAA+B;AACpE,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,UAAU,QAAQ,sBAAqB;AAChD,SAASC,IAAI,QAAQ,YAAW;AAChC,SAASC,mBAAmB,QAAQ,2BAA0B;AAa9D,OAAO,MAAMC,iBAAiBL,oBAI5B;IACAM,SAAS,CAAC,EAAEC,KAAK,EAAE;QACjB,IAAI,CAACA,OAAO;YACVA,QAAQ,CAAC;QACX;QAEA,MAAM,EAAEC,sBAAsB;YAAC;YAAM;YAAM;YAAM;YAAM;YAAM;SAAK,EAAE,GAAGD;QAEvE,OAAO;YACLE,eAAeV;YACfW,oBAAoBH;YACpBJ;YACAQ,sBAAsB;gBAACP,oBAAoBI;aAAqB;YAChEI,OAAO;gBACLV,WAAW;oBACTW,YAAY;wBACVC,MAAM;4BACJC,WAAW,OAAO,EAAEF,UAAU,EAAEG,IAAI,EAAEC,MAAM,EAAEC,GAAG,EAAE;gCACjD,MAAMC,eAAe,MAAMlB,0BAA0B;oCACnDY;oCACAO,cAAcJ,KAAKK,QAAQ;oCAC3BJ,QAAQ;wCACN,GAAGD,IAAI;wCACPC;oCACF;oCACAC;gCACF;gCAEA,OAAO,MAAMF,MAAMM,MAAM,MAAMH,eAAe,OAAOH,MAAMM,MAAM;4BACnE;4BACAC,WAAW;gCAACzB,YAAY0B,OAAO;6BAAG;wBACpC;oBACF;oBACAR,MAAMlB;gBACR;aACD;YACD2B,6BAA6BlB;QAC/B;IACF;IACAmB,KAAK;AACP,GAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../src/features/link/feature.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAU,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../src/features/link/feature.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAU,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAoBjG,MAAM,MAAM,6BAA6B,GACrC;IACE;;;QAGI;IACJ,mBAAmB,CAAC,EAAE,cAAc,EAAE,CAAA;IAGtC,kBAAkB,CAAC,EAAE,KAAK,CAAA;CAC3B,GACD;IAEE,mBAAmB,CAAC,EAAE,KAAK,CAAA;IAE3B;;;QAGI;IACJ,kBAAkB,CAAC,EAAE,cAAc,EAAE,CAAA;CACtC,CAAA;AAEL,MAAM,MAAM,sBAAsB,GAAG,6BAA6B,GAAG;IACnE;;;OAGG;IACH,MAAM,CAAC,EACH,CAAC,CAAC,IAAI,EAAE;QACN,MAAM,EAAE,eAAe,CAAA;QACvB,aAAa,EAAE,kBAAkB,EAAE,CAAA;KACpC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC,EAAE,CAAC,GACrC,KAAK,EAAE,CAAA;IACX;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,WAAW,0IAiItB,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { traverseFields } from '@payloadcms/ui/utilities/buildFieldSchemaMap/traverseFields';
|
|
2
1
|
import { sanitizeFields } from 'payload';
|
|
3
2
|
import { deepCopyObject } from 'payload/shared';
|
|
4
3
|
// eslint-disable-next-line payload/no-imports-from-exports-dir
|
|
@@ -37,21 +36,12 @@ export const LinkFeature = createServerFeature({
|
|
|
37
36
|
disabledCollections: props.disabledCollections,
|
|
38
37
|
enabledCollections: props.enabledCollections
|
|
39
38
|
},
|
|
40
|
-
generateSchemaMap: (
|
|
39
|
+
generateSchemaMap: ()=>{
|
|
41
40
|
if (!sanitizedFields || !Array.isArray(sanitizedFields) || sanitizedFields.length === 0) {
|
|
42
41
|
return null;
|
|
43
42
|
}
|
|
44
43
|
const schemaMap = new Map();
|
|
45
|
-
const validRelationships = config.collections.map((c)=>c.slug) || [];
|
|
46
44
|
schemaMap.set('fields', sanitizedFields);
|
|
47
|
-
traverseFields({
|
|
48
|
-
config,
|
|
49
|
-
fields: sanitizedFields,
|
|
50
|
-
i18n,
|
|
51
|
-
schemaMap,
|
|
52
|
-
schemaPath: 'fields',
|
|
53
|
-
validRelationships
|
|
54
|
-
});
|
|
55
45
|
return schemaMap;
|
|
56
46
|
},
|
|
57
47
|
i18n,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/features/link/feature.server.ts"],"sourcesContent":["import type { CollectionSlug, Config, Field, FieldAffectingData, SanitizedConfig } from 'payload'\n\nimport { traverseFields } from '@payloadcms/ui/utilities/buildFieldSchemaMap/traverseFields'\nimport { sanitizeFields } from 'payload'\nimport { deepCopyObject } from 'payload/shared'\n\nimport type { ClientProps } from './feature.client.js'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { LinkFeatureClient } from '../../exports/client/index.js'\nimport { createServerFeature } from '../../utilities/createServerFeature.js'\nimport { convertLexicalNodesToHTML } from '../converters/html/converter/index.js'\nimport { createNode } from '../typeUtilities.js'\nimport { linkPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { LinkMarkdownTransformer } from './markdownTransformer.js'\nimport { AutoLinkNode } from './nodes/AutoLinkNode.js'\nimport { LinkNode } from './nodes/LinkNode.js'\nimport { transformExtraFields } from './plugins/floatingLinkEditor/utilities.js'\nimport { linkValidation } from './validate.js'\n\nexport type ExclusiveLinkCollectionsProps =\n | {\n /**\n * The collections that should be disabled for internal linking. Overrides the `enableRichTextLink` property in the collection config.\n * When this property is set, `enabledCollections` will not be available.\n **/\n disabledCollections?: CollectionSlug[]\n\n // Ensures that enabledCollections is not available when disabledCollections is set\n enabledCollections?: never\n }\n | {\n // Ensures that disabledCollections is not available when enabledCollections is set\n disabledCollections?: never\n\n /**\n * The collections that should be enabled for internal linking. Overrides the `enableRichTextLink` property in the collection config\n * When this property is set, `disabledCollections` will not be available.\n **/\n enabledCollections?: CollectionSlug[]\n }\n\nexport type LinkFeatureServerProps = ExclusiveLinkCollectionsProps & {\n /**\n * A function or array defining additional fields for the link feature. These will be\n * displayed in the link editor drawer.\n */\n fields?:\n | ((args: {\n config: SanitizedConfig\n defaultFields: FieldAffectingData[]\n }) => (Field | FieldAffectingData)[])\n | Field[]\n /**\n * Sets a maximum population depth for the internal doc default field of link, regardless of the remaining depth when the field is reached.\n * This behaves exactly like the maxDepth properties of relationship and upload fields.\n *\n * {@link https://payloadcms.com/docs/getting-started/concepts#field-level-max-depth}\n */\n maxDepth?: number\n}\n\nexport const LinkFeature = createServerFeature<\n LinkFeatureServerProps,\n LinkFeatureServerProps,\n ClientProps\n>({\n feature: async ({ config: _config, isRoot, props }) => {\n if (!props) {\n props = {}\n }\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n const _transformedFields = transformExtraFields(\n deepCopyObject(props.fields),\n _config,\n props.enabledCollections,\n props.disabledCollections,\n props.maxDepth,\n )\n\n const sanitizedFields = await sanitizeFields({\n config: _config as unknown as Config,\n fields: _transformedFields,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n props.fields = sanitizedFields\n\n // the text field is not included in the node data.\n // Thus, for tasks like validation, we do not want to pass it a text field in the schema which will never have data.\n // Otherwise, it will cause a validation error (field is required).\n const sanitizedFieldsWithoutText = deepCopyObject(sanitizedFields).filter(\n (field) => field.name !== 'text',\n )\n\n return {\n ClientFeature: LinkFeatureClient,\n clientFeatureProps: {\n disabledCollections: props.disabledCollections,\n enabledCollections: props.enabledCollections,\n } as ExclusiveLinkCollectionsProps,\n generateSchemaMap: ({ config, i18n }) => {\n if (!sanitizedFields || !Array.isArray(sanitizedFields) || sanitizedFields.length === 0) {\n return null\n }\n\n const schemaMap = new Map<string, Field[]>()\n\n const validRelationships = config.collections.map((c) => c.slug) || []\n\n schemaMap.set('fields', sanitizedFields)\n\n traverseFields({\n config,\n fields: sanitizedFields,\n i18n,\n schemaMap,\n schemaPath: 'fields',\n validRelationships,\n })\n\n return schemaMap\n },\n i18n,\n markdownTransformers: [LinkMarkdownTransformer],\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({ converters, node, parent, req }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n lexicalNodes: node.children,\n parent: {\n ...node,\n parent,\n },\n req,\n })\n\n const rel: string = node.fields.newTab ? ' rel=\"noopener noreferrer\"' : ''\n const target: string = node.fields.newTab ? ' target=\"_blank\"' : ''\n\n let href: string = node.fields.url\n if (node.fields.linkType === 'internal') {\n href =\n typeof node.fields.doc?.value === 'string'\n ? node.fields.doc?.value\n : node.fields.doc?.value?.id\n }\n\n return `<a href=\"${href}\"${target}${rel}>${childrenText}</a>`\n },\n nodeTypes: [AutoLinkNode.getType()],\n },\n },\n node: AutoLinkNode,\n // Since AutoLinkNodes are just internal links, they need no hooks or graphQL population promises\n validations: [linkValidation(props, sanitizedFieldsWithoutText)],\n }),\n createNode({\n converters: {\n html: {\n converter: async ({ converters, node, parent, req }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n lexicalNodes: node.children,\n parent: {\n ...node,\n parent,\n },\n req,\n })\n\n const rel: string = node.fields.newTab ? ' rel=\"noopener noreferrer\"' : ''\n const target: string = node.fields.newTab ? ' target=\"_blank\"' : ''\n\n const href: string =\n node.fields.linkType === 'custom'\n ? node.fields.url\n : (node.fields.doc?.value as string)\n\n return `<a href=\"${href}\"${target}${rel}>${childrenText}</a>`\n },\n nodeTypes: [LinkNode.getType()],\n },\n },\n getSubFields: () => {\n return sanitizedFieldsWithoutText\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [linkPopulationPromiseHOC(props)],\n node: LinkNode,\n validations: [linkValidation(props, sanitizedFieldsWithoutText)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'link',\n})\n"],"names":["traverseFields","sanitizeFields","deepCopyObject","LinkFeatureClient","createServerFeature","convertLexicalNodesToHTML","createNode","linkPopulationPromiseHOC","i18n","LinkMarkdownTransformer","AutoLinkNode","LinkNode","transformExtraFields","linkValidation","LinkFeature","feature","config","_config","isRoot","props","validRelationships","collections","map","c","slug","_transformedFields","fields","enabledCollections","disabledCollections","maxDepth","sanitizedFields","requireFieldLevelRichTextEditor","sanitizedFieldsWithoutText","filter","field","name","ClientFeature","clientFeatureProps","generateSchemaMap","Array","isArray","length","schemaMap","Map","set","schemaPath","markdownTransformers","nodes","converters","html","converter","node","parent","req","childrenText","lexicalNodes","children","rel","newTab","target","href","url","linkType","doc","value","id","nodeTypes","getType","validations","getSubFields","getSubFieldsData","graphQLPopulationPromises","sanitizedServerFeatureProps","key"],"mappings":"AAEA,SAASA,cAAc,QAAQ,8DAA6D;AAC5F,SAASC,cAAc,QAAQ,UAAS;AACxC,SAASC,cAAc,QAAQ,iBAAgB;AAI/C,+DAA+D;AAC/D,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,UAAU,QAAQ,sBAAqB;AAChD,SAASC,wBAAwB,QAAQ,gCAA+B;AACxE,SAASC,IAAI,QAAQ,YAAW;AAChC,SAASC,uBAAuB,QAAQ,2BAA0B;AAClE,SAASC,YAAY,QAAQ,0BAAyB;AACtD,SAASC,QAAQ,QAAQ,sBAAqB;AAC9C,SAASC,oBAAoB,QAAQ,4CAA2C;AAChF,SAASC,cAAc,QAAQ,gBAAe;AA4C9C,OAAO,MAAMC,cAAcV,oBAIzB;IACAW,SAAS,OAAO,EAAEC,QAAQC,OAAO,EAAEC,MAAM,EAAEC,KAAK,EAAE;QAChD,IAAI,CAACA,OAAO;YACVA,QAAQ,CAAC;QACX;QACA,MAAMC,qBAAqBH,QAAQI,WAAW,CAACC,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAK,EAAE;QAEvE,MAAMC,qBAAqBb,qBACzBV,eAAeiB,MAAMO,MAAM,GAC3BT,SACAE,MAAMQ,kBAAkB,EACxBR,MAAMS,mBAAmB,EACzBT,MAAMU,QAAQ;QAGhB,MAAMC,kBAAkB,MAAM7B,eAAe;YAC3Ce,QAAQC;YACRS,QAAQD;YACRM,iCAAiCb;YACjCE;QACF;QACAD,MAAMO,MAAM,GAAGI;QAEf,mDAAmD;QACnD,oHAAoH;QACpH,mEAAmE;QACnE,MAAME,6BAA6B9B,eAAe4B,iBAAiBG,MAAM,CACvE,CAACC,QAAUA,MAAMC,IAAI,KAAK;QAG5B,OAAO;YACLC,eAAejC;YACfkC,oBAAoB;gBAClBT,qBAAqBT,MAAMS,mBAAmB;gBAC9CD,oBAAoBR,MAAMQ,kBAAkB;YAC9C;YACAW,mBAAmB,CAAC,EAAEtB,MAAM,EAAER,IAAI,EAAE;gBAClC,IAAI,CAACsB,mBAAmB,CAACS,MAAMC,OAAO,CAACV,oBAAoBA,gBAAgBW,MAAM,KAAK,GAAG;oBACvF,OAAO;gBACT;gBAEA,MAAMC,YAAY,IAAIC;gBAEtB,MAAMvB,qBAAqBJ,OAAOK,WAAW,CAACC,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAK,EAAE;gBAEtEkB,UAAUE,GAAG,CAAC,UAAUd;gBAExB9B,eAAe;oBACbgB;oBACAU,QAAQI;oBACRtB;oBACAkC;oBACAG,YAAY;oBACZzB;gBACF;gBAEA,OAAOsB;YACT;YACAlC;YACAsC,sBAAsB;gBAACrC;aAAwB;YAC/CsC,OAAO;gBACLzC,WAAW;oBACT0C,YAAY;wBACVC,MAAM;4BACJC,WAAW,OAAO,EAAEF,UAAU,EAAEG,IAAI,EAAEC,MAAM,EAAEC,GAAG,EAAE;gCACjD,MAAMC,eAAe,MAAMjD,0BAA0B;oCACnD2C;oCACAO,cAAcJ,KAAKK,QAAQ;oCAC3BJ,QAAQ;wCACN,GAAGD,IAAI;wCACPC;oCACF;oCACAC;gCACF;gCAEA,MAAMI,MAAcN,KAAKzB,MAAM,CAACgC,MAAM,GAAG,+BAA+B;gCACxE,MAAMC,SAAiBR,KAAKzB,MAAM,CAACgC,MAAM,GAAG,qBAAqB;gCAEjE,IAAIE,OAAeT,KAAKzB,MAAM,CAACmC,GAAG;gCAClC,IAAIV,KAAKzB,MAAM,CAACoC,QAAQ,KAAK,YAAY;oCACvCF,OACE,OAAOT,KAAKzB,MAAM,CAACqC,GAAG,EAAEC,UAAU,WAC9Bb,KAAKzB,MAAM,CAACqC,GAAG,EAAEC,QACjBb,KAAKzB,MAAM,CAACqC,GAAG,EAAEC,OAAOC;gCAChC;gCAEA,OAAO,CAAC,SAAS,EAAEL,KAAK,CAAC,EAAED,OAAO,EAAEF,IAAI,CAAC,EAAEH,aAAa,IAAI,CAAC;4BAC/D;4BACAY,WAAW;gCAACxD,aAAayD,OAAO;6BAAG;wBACrC;oBACF;oBACAhB,MAAMzC;oBACN,iGAAiG;oBACjG0D,aAAa;wBAACvD,eAAeM,OAAOa;qBAA4B;gBAClE;gBACA1B,WAAW;oBACT0C,YAAY;wBACVC,MAAM;4BACJC,WAAW,OAAO,EAAEF,UAAU,EAAEG,IAAI,EAAEC,MAAM,EAAEC,GAAG,EAAE;gCACjD,MAAMC,eAAe,MAAMjD,0BAA0B;oCACnD2C;oCACAO,cAAcJ,KAAKK,QAAQ;oCAC3BJ,QAAQ;wCACN,GAAGD,IAAI;wCACPC;oCACF;oCACAC;gCACF;gCAEA,MAAMI,MAAcN,KAAKzB,MAAM,CAACgC,MAAM,GAAG,+BAA+B;gCACxE,MAAMC,SAAiBR,KAAKzB,MAAM,CAACgC,MAAM,GAAG,qBAAqB;gCAEjE,MAAME,OACJT,KAAKzB,MAAM,CAACoC,QAAQ,KAAK,WACrBX,KAAKzB,MAAM,CAACmC,GAAG,GACdV,KAAKzB,MAAM,CAACqC,GAAG,EAAEC;gCAExB,OAAO,CAAC,SAAS,EAAEJ,KAAK,CAAC,EAAED,OAAO,EAAEF,IAAI,CAAC,EAAEH,aAAa,IAAI,CAAC;4BAC/D;4BACAY,WAAW;gCAACvD,SAASwD,OAAO;6BAAG;wBACjC;oBACF;oBACAE,cAAc;wBACZ,OAAOrC;oBACT;oBACAsC,kBAAkB,CAAC,EAAEnB,IAAI,EAAE;wBACzB,OAAOA,MAAMzB;oBACf;oBACA6C,2BAA2B;wBAAChE,yBAAyBY;qBAAO;oBAC5DgC,MAAMxC;oBACNyD,aAAa;wBAACvD,eAAeM,OAAOa;qBAA4B;gBAClE;aACD;YACDwC,6BAA6BrD;QAC/B;IACF;IACAsD,KAAK;AACP,GAAE"}
|
|
1
|
+
{"version":3,"sources":["../../../src/features/link/feature.server.ts"],"sourcesContent":["import type { CollectionSlug, Config, Field, FieldAffectingData, SanitizedConfig } from 'payload'\n\nimport { sanitizeFields } from 'payload'\nimport { deepCopyObject } from 'payload/shared'\n\nimport type { ClientProps } from './feature.client.js'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { LinkFeatureClient } from '../../exports/client/index.js'\nimport { createServerFeature } from '../../utilities/createServerFeature.js'\nimport { convertLexicalNodesToHTML } from '../converters/html/converter/index.js'\nimport { createNode } from '../typeUtilities.js'\nimport { linkPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { LinkMarkdownTransformer } from './markdownTransformer.js'\nimport { AutoLinkNode } from './nodes/AutoLinkNode.js'\nimport { LinkNode } from './nodes/LinkNode.js'\nimport { transformExtraFields } from './plugins/floatingLinkEditor/utilities.js'\nimport { linkValidation } from './validate.js'\n\nexport type ExclusiveLinkCollectionsProps =\n | {\n /**\n * The collections that should be disabled for internal linking. Overrides the `enableRichTextLink` property in the collection config.\n * When this property is set, `enabledCollections` will not be available.\n **/\n disabledCollections?: CollectionSlug[]\n\n // Ensures that enabledCollections is not available when disabledCollections is set\n enabledCollections?: never\n }\n | {\n // Ensures that disabledCollections is not available when enabledCollections is set\n disabledCollections?: never\n\n /**\n * The collections that should be enabled for internal linking. Overrides the `enableRichTextLink` property in the collection config\n * When this property is set, `disabledCollections` will not be available.\n **/\n enabledCollections?: CollectionSlug[]\n }\n\nexport type LinkFeatureServerProps = ExclusiveLinkCollectionsProps & {\n /**\n * A function or array defining additional fields for the link feature. These will be\n * displayed in the link editor drawer.\n */\n fields?:\n | ((args: {\n config: SanitizedConfig\n defaultFields: FieldAffectingData[]\n }) => (Field | FieldAffectingData)[])\n | Field[]\n /**\n * Sets a maximum population depth for the internal doc default field of link, regardless of the remaining depth when the field is reached.\n * This behaves exactly like the maxDepth properties of relationship and upload fields.\n *\n * {@link https://payloadcms.com/docs/getting-started/concepts#field-level-max-depth}\n */\n maxDepth?: number\n}\n\nexport const LinkFeature = createServerFeature<\n LinkFeatureServerProps,\n LinkFeatureServerProps,\n ClientProps\n>({\n feature: async ({ config: _config, isRoot, props }) => {\n if (!props) {\n props = {}\n }\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n const _transformedFields = transformExtraFields(\n deepCopyObject(props.fields),\n _config,\n props.enabledCollections,\n props.disabledCollections,\n props.maxDepth,\n )\n\n const sanitizedFields = await sanitizeFields({\n config: _config as unknown as Config,\n fields: _transformedFields,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n props.fields = sanitizedFields\n\n // the text field is not included in the node data.\n // Thus, for tasks like validation, we do not want to pass it a text field in the schema which will never have data.\n // Otherwise, it will cause a validation error (field is required).\n const sanitizedFieldsWithoutText = deepCopyObject(sanitizedFields).filter(\n (field) => field.name !== 'text',\n )\n\n return {\n ClientFeature: LinkFeatureClient,\n clientFeatureProps: {\n disabledCollections: props.disabledCollections,\n enabledCollections: props.enabledCollections,\n } as ExclusiveLinkCollectionsProps,\n generateSchemaMap: () => {\n if (!sanitizedFields || !Array.isArray(sanitizedFields) || sanitizedFields.length === 0) {\n return null\n }\n\n const schemaMap = new Map<string, Field[]>()\n schemaMap.set('fields', sanitizedFields)\n\n return schemaMap\n },\n i18n,\n markdownTransformers: [LinkMarkdownTransformer],\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({ converters, node, parent, req }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n lexicalNodes: node.children,\n parent: {\n ...node,\n parent,\n },\n req,\n })\n\n const rel: string = node.fields.newTab ? ' rel=\"noopener noreferrer\"' : ''\n const target: string = node.fields.newTab ? ' target=\"_blank\"' : ''\n\n let href: string = node.fields.url\n if (node.fields.linkType === 'internal') {\n href =\n typeof node.fields.doc?.value === 'string'\n ? node.fields.doc?.value\n : node.fields.doc?.value?.id\n }\n\n return `<a href=\"${href}\"${target}${rel}>${childrenText}</a>`\n },\n nodeTypes: [AutoLinkNode.getType()],\n },\n },\n node: AutoLinkNode,\n // Since AutoLinkNodes are just internal links, they need no hooks or graphQL population promises\n validations: [linkValidation(props, sanitizedFieldsWithoutText)],\n }),\n createNode({\n converters: {\n html: {\n converter: async ({ converters, node, parent, req }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n lexicalNodes: node.children,\n parent: {\n ...node,\n parent,\n },\n req,\n })\n\n const rel: string = node.fields.newTab ? ' rel=\"noopener noreferrer\"' : ''\n const target: string = node.fields.newTab ? ' target=\"_blank\"' : ''\n\n const href: string =\n node.fields.linkType === 'custom'\n ? node.fields.url\n : (node.fields.doc?.value as string)\n\n return `<a href=\"${href}\"${target}${rel}>${childrenText}</a>`\n },\n nodeTypes: [LinkNode.getType()],\n },\n },\n getSubFields: () => {\n return sanitizedFieldsWithoutText\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [linkPopulationPromiseHOC(props)],\n node: LinkNode,\n validations: [linkValidation(props, sanitizedFieldsWithoutText)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'link',\n})\n"],"names":["sanitizeFields","deepCopyObject","LinkFeatureClient","createServerFeature","convertLexicalNodesToHTML","createNode","linkPopulationPromiseHOC","i18n","LinkMarkdownTransformer","AutoLinkNode","LinkNode","transformExtraFields","linkValidation","LinkFeature","feature","config","_config","isRoot","props","validRelationships","collections","map","c","slug","_transformedFields","fields","enabledCollections","disabledCollections","maxDepth","sanitizedFields","requireFieldLevelRichTextEditor","sanitizedFieldsWithoutText","filter","field","name","ClientFeature","clientFeatureProps","generateSchemaMap","Array","isArray","length","schemaMap","Map","set","markdownTransformers","nodes","converters","html","converter","node","parent","req","childrenText","lexicalNodes","children","rel","newTab","target","href","url","linkType","doc","value","id","nodeTypes","getType","validations","getSubFields","getSubFieldsData","graphQLPopulationPromises","sanitizedServerFeatureProps","key"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAcvE,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAcvE,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CA2UvF"}
|
|
@@ -9,7 +9,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
|
9
9
|
import { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js';
|
|
10
10
|
import { getSelectedNode } from '../../../../../lexical/utils/getSelectedNode.js';
|
|
11
11
|
import { setFloatingElemPositionForLinkEditor } from '../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js';
|
|
12
|
-
import {
|
|
12
|
+
import { FieldsDrawer } from '../../../../../utilities/fieldsDrawer/Drawer.js';
|
|
13
13
|
import { $isAutoLinkNode } from '../../../nodes/AutoLinkNode.js';
|
|
14
14
|
import { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js';
|
|
15
15
|
import { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js';
|
|
@@ -22,7 +22,7 @@ export function LinkEditor({ anchorElem }) {
|
|
|
22
22
|
const config = useConfig();
|
|
23
23
|
const { i18n, t } = useTranslation();
|
|
24
24
|
const [stateData, setStateData] = useState({});
|
|
25
|
-
const { closeModal,
|
|
25
|
+
const { closeModal, toggleModal } = useModal();
|
|
26
26
|
const editDepth = useEditDepth();
|
|
27
27
|
const [isLink, setIsLink] = useState(false);
|
|
28
28
|
const [selectedNodes, setSelectedNodes] = useState([]);
|
|
@@ -251,9 +251,13 @@ export function LinkEditor({ anchorElem }) {
|
|
|
251
251
|
]
|
|
252
252
|
})
|
|
253
253
|
}),
|
|
254
|
-
|
|
254
|
+
/*#__PURE__*/ _jsx(FieldsDrawer, {
|
|
255
|
+
className: "lexical-link-edit-drawer",
|
|
256
|
+
data: stateData,
|
|
255
257
|
drawerSlug: drawerSlug,
|
|
256
|
-
|
|
258
|
+
drawerTitle: t('fields:editLink'),
|
|
259
|
+
featureKey: "link",
|
|
260
|
+
handleDrawerSubmit: (fields, data)=>{
|
|
257
261
|
closeModal(drawerSlug);
|
|
258
262
|
const newLinkPayload = data;
|
|
259
263
|
const bareLinkFields = {
|
|
@@ -286,7 +290,7 @@ export function LinkEditor({ anchorElem }) {
|
|
|
286
290
|
text: newLinkPayload.text
|
|
287
291
|
});
|
|
288
292
|
},
|
|
289
|
-
|
|
293
|
+
schemaPathSuffix: "fields"
|
|
290
294
|
})
|
|
291
295
|
]
|
|
292
296
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatDrawerSlug, useConfig, useEditDepth, useModal, useTranslation } from '@payloadcms/ui'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getSelectedNode } from '../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { LinkDrawer } from '../../../drawer/index.js'\nimport { $isAutoLinkNode } from '../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const [linkUrl, setLinkUrl] = useState(null)\n const [linkLabel, setLinkLabel] = useState(null)\n\n const { uuid } = useEditorConfigContext()\n\n const config = useConfig()\n\n const { i18n, t } = useTranslation()\n\n const [stateData, setStateData] = useState<{} | (LinkFields & { id?: string; text: string })>({})\n\n const { closeModal, isModalOpen, toggleModal } = useModal()\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData({})\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined = null\n\n if (!$isRangeSelection(selection) || !selection) {\n setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent: LinkNode = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setNotLink()\n return\n }\n\n // Initial state:\n const data: LinkFields & { text: string } = {\n doc: undefined,\n linkType: undefined,\n newTab: undefined,\n url: '',\n ...focusLinkParent.getFields(),\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (focusLinkParent.getFields()?.linkType === 'custom') {\n setLinkUrl(focusLinkParent.getFields()?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `/admin/collections/${focusLinkParent.getFields()?.doc?.relationTo}/${\n focusLinkParent.getFields()?.doc?.value\n }`,\n )\n\n const relatedField = config.collections.find(\n (coll) => coll.slug === focusLinkParent.getFields()?.doc?.relationTo,\n )\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(\n focusLinkParent.getFields()?.label ? String(focusLinkParent.getFields()?.label) : null,\n )\n setLinkUrl(\n focusLinkParent.getFields()?.url ? String(focusLinkParent.getFields()?.url) : null,\n )\n } else {\n const label = t('fields:linkedTo', {\n label: getTranslation(relatedField.labels.singular, i18n),\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n }\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n\n const editorElem = editorRef.current\n const nativeSelection = window.getSelection()\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n setFloatingElemPositionForLinkEditor(selectedNodeDomRect, editorElem, anchorElem)\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [editor, setNotLink, config.collections, t, i18n, anchorElem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n $updateLinkEditor()\n toggleModal(drawerSlug)\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleModal, drawerSlug])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void $updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n void $updateLinkEditor()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }, [editor, $updateLinkEditor])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" ref={editorRef}>\n <div className=\"link-input\">\n {linkUrl && linkUrl.length > 0 ? (\n <a href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n ) : null}\n\n {editor.isEditable() && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={() => {\n toggleModal(drawerSlug)\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n tabIndex={0}\n type=\"button\"\n />\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n tabIndex={0}\n type=\"button\"\n />\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n {isModalOpen(drawerSlug) && (\n <LinkDrawer\n drawerSlug={drawerSlug}\n handleModalSubmit={(fields: FormState, data: Data) => {\n closeModal(drawerSlug)\n\n const newLinkPayload = data as LinkFields & { text: string }\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0].getParent()\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n stateData={stateData}\n />\n )}\n </React.Fragment>\n )\n}\n"],"names":["useLexicalComposerContext","$findMatchingParent","mergeRegister","getTranslation","formatDrawerSlug","useConfig","useEditDepth","useModal","useTranslation","$getSelection","$isLineBreakNode","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","LinkDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","LinkEditor","anchorElem","editor","editorRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","uuid","config","i18n","t","stateData","setStateData","closeModal","isModalOpen","toggleModal","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","setNotLink","current","style","opacity","transform","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","linkNode","is","data","doc","undefined","linkType","newTab","url","getFields","id","getID","text","getTextContent","relationTo","value","relatedField","collections","coll","label","String","labels","singular","replace","editorElem","nativeSelection","window","getSelection","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","addEventListener","removeEventListener","registerUpdateListener","editorState","Fragment","div","ref","length","a","href","rel","target","span","isEditable","button","aria-label","onClick","onMouseDown","event","preventDefault","tabIndex","type","handleModalSubmit","fields","newLinkPayload","bareLinkFields","linkParent","getParent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatDrawerSlug, useConfig, useEditDepth, useModal, useTranslation } from '@payloadcms/ui'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getSelectedNode } from '../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { FieldsDrawer } from '../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { $isAutoLinkNode } from '../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const [linkUrl, setLinkUrl] = useState(null)\n const [linkLabel, setLinkLabel] = useState(null)\n\n const { uuid } = useEditorConfigContext()\n\n const config = useConfig()\n\n const { i18n, t } = useTranslation()\n\n const [stateData, setStateData] = useState<{} | (LinkFields & { id?: string; text: string })>({})\n\n const { closeModal, toggleModal } = useModal()\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData({})\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined = null\n\n if (!$isRangeSelection(selection) || !selection) {\n setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent: LinkNode = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setNotLink()\n return\n }\n\n // Initial state:\n const data: LinkFields & { text: string } = {\n doc: undefined,\n linkType: undefined,\n newTab: undefined,\n url: '',\n ...focusLinkParent.getFields(),\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (focusLinkParent.getFields()?.linkType === 'custom') {\n setLinkUrl(focusLinkParent.getFields()?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `/admin/collections/${focusLinkParent.getFields()?.doc?.relationTo}/${\n focusLinkParent.getFields()?.doc?.value\n }`,\n )\n\n const relatedField = config.collections.find(\n (coll) => coll.slug === focusLinkParent.getFields()?.doc?.relationTo,\n )\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(\n focusLinkParent.getFields()?.label ? String(focusLinkParent.getFields()?.label) : null,\n )\n setLinkUrl(\n focusLinkParent.getFields()?.url ? String(focusLinkParent.getFields()?.url) : null,\n )\n } else {\n const label = t('fields:linkedTo', {\n label: getTranslation(relatedField.labels.singular, i18n),\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n }\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n\n const editorElem = editorRef.current\n const nativeSelection = window.getSelection()\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n setFloatingElemPositionForLinkEditor(selectedNodeDomRect, editorElem, anchorElem)\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [editor, setNotLink, config.collections, t, i18n, anchorElem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n $updateLinkEditor()\n toggleModal(drawerSlug)\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleModal, drawerSlug])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void $updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n void $updateLinkEditor()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }, [editor, $updateLinkEditor])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" ref={editorRef}>\n <div className=\"link-input\">\n {linkUrl && linkUrl.length > 0 ? (\n <a href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n ) : null}\n\n {editor.isEditable() && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={() => {\n toggleModal(drawerSlug)\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n tabIndex={0}\n type=\"button\"\n />\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n tabIndex={0}\n type=\"button\"\n />\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n closeModal(drawerSlug)\n\n const newLinkPayload = data as LinkFields & { text: string }\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0].getParent()\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"names":["useLexicalComposerContext","$findMatchingParent","mergeRegister","getTranslation","formatDrawerSlug","useConfig","useEditDepth","useModal","useTranslation","$getSelection","$isLineBreakNode","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","LinkEditor","anchorElem","editor","editorRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","uuid","config","i18n","t","stateData","setStateData","closeModal","toggleModal","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","setNotLink","current","style","opacity","transform","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","linkNode","is","data","doc","undefined","linkType","newTab","url","getFields","id","getID","text","getTextContent","relationTo","value","relatedField","collections","coll","label","String","labels","singular","replace","editorElem","nativeSelection","window","getSelection","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","addEventListener","removeEventListener","registerUpdateListener","editorState","Fragment","div","ref","length","a","href","rel","target","span","isEditable","button","aria-label","onClick","onMouseDown","event","preventDefault","tabIndex","type","drawerTitle","featureKey","handleDrawerSubmit","fields","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/migrations/lexicalPluginToLexical/converter/converters/heading/converter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/migrations/lexicalPluginToLexical/converter/converters/heading/converter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAIhE,eAAO,MAAM,iBAAiB,EAAE,0BAc/B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/features/migrations/lexicalPluginToLexical/converter/converters/heading/converter.ts"],"sourcesContent":["import type { SerializedHeadingNode } from '
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/features/migrations/lexicalPluginToLexical/converter/converters/heading/converter.ts"],"sourcesContent":["import type { SerializedHeadingNode } from '../../../../../heading/feature.server.js'\nimport type { LexicalPluginNodeConverter } from '../../types.js'\n\nimport { convertLexicalPluginNodesToLexical } from '../../index.js'\n\nexport const _HeadingConverter: LexicalPluginNodeConverter = {\n converter({ converters, lexicalPluginNode }) {\n return {\n ...lexicalPluginNode,\n type: 'heading',\n children: convertLexicalPluginNodesToLexical({\n converters,\n lexicalPluginNodes: lexicalPluginNode.children,\n parentNodeType: 'heading',\n }),\n version: 1,\n } as const as SerializedHeadingNode\n },\n nodeTypes: ['heading'],\n}\n"],"names":["convertLexicalPluginNodesToLexical","_HeadingConverter","converter","converters","lexicalPluginNode","type","children","lexicalPluginNodes","parentNodeType","version","nodeTypes"],"mappings":"AAGA,SAASA,kCAAkC,QAAQ,iBAAgB;AAEnE,OAAO,MAAMC,oBAAgD;IAC3DC,WAAU,EAAEC,UAAU,EAAEC,iBAAiB,EAAE;QACzC,OAAO;YACL,GAAGA,iBAAiB;YACpBC,MAAM;YACNC,UAAUN,mCAAmC;gBAC3CG;gBACAI,oBAAoBH,kBAAkBE,QAAQ;gBAC9CE,gBAAgB;YAClB;YACAC,SAAS;QACX;IACF;IACAC,WAAW;QAAC;KAAU;AACxB,EAAC"}
|
package/dist/features/migrations/slateToLexical/converter/converters/heading/converter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/migrations/slateToLexical/converter/converters/heading/converter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/migrations/slateToLexical/converter/converters/heading/converter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAIxD,eAAO,MAAM,sBAAsB,EAAE,kBAkBpC,CAAA"}
|
package/dist/features/migrations/slateToLexical/converter/converters/heading/converter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/features/migrations/slateToLexical/converter/converters/heading/converter.ts"],"sourcesContent":["import type { SerializedHeadingNode } from '
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/features/migrations/slateToLexical/converter/converters/heading/converter.ts"],"sourcesContent":["import type { SerializedHeadingNode } from '../../../../../heading/feature.server.js'\nimport type { SlateNodeConverter } from '../../types.js'\n\nimport { convertSlateNodesToLexical } from '../../index.js'\n\nexport const _SlateHeadingConverter: SlateNodeConverter = {\n converter({ converters, slateNode }) {\n return {\n type: 'heading',\n children: convertSlateNodesToLexical({\n canContainParagraphs: false,\n converters,\n parentNodeType: 'heading',\n slateNodes: slateNode.children,\n }),\n direction: 'ltr',\n format: '',\n indent: 0,\n tag: slateNode.type as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6', // Slate puts the tag (h1 / h2 / ...) inside of node.type\n version: 1,\n } as const as SerializedHeadingNode\n },\n nodeTypes: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n}\n"],"names":["convertSlateNodesToLexical","_SlateHeadingConverter","converter","converters","slateNode","type","children","canContainParagraphs","parentNodeType","slateNodes","direction","format","indent","tag","version","nodeTypes"],"mappings":"AAGA,SAASA,0BAA0B,QAAQ,iBAAgB;AAE3D,OAAO,MAAMC,yBAA6C;IACxDC,WAAU,EAAEC,UAAU,EAAEC,SAAS,EAAE;QACjC,OAAO;YACLC,MAAM;YACNC,UAAUN,2BAA2B;gBACnCO,sBAAsB;gBACtBJ;gBACAK,gBAAgB;gBAChBC,YAAYL,UAAUE,QAAQ;YAChC;YACAI,WAAW;YACXC,QAAQ;YACRC,QAAQ;YACRC,KAAKT,UAAUC,IAAI;YACnBS,SAAS;QACX;IACF;IACAC,WAAW;QAAC;QAAM;QAAM;QAAM;QAAM;QAAM;KAAK;AACjD,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/component/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/component/index.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAA+D,MAAM,OAAO,CAAA;AAInF,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,wBAAwB,CAAA;AAOpE,OAAO,cAAc,CAAA;AAQrB,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,UAAU,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAkOD,eAAO,MAAM,eAAe,UAAW,YAAY,KAAG,KAAK,CAAC,SAM3D,CAAA"}
|
|
@@ -4,14 +4,14 @@ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext
|
|
|
4
4
|
import { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection.js';
|
|
5
5
|
import { mergeRegister } from '@lexical/utils';
|
|
6
6
|
import { getTranslation } from '@payloadcms/translations';
|
|
7
|
-
import { Button, DrawerToggler, File, useConfig, useDocumentDrawer, useDrawerSlug, usePayloadAPI, useTranslation } from '@payloadcms/ui';
|
|
7
|
+
import { Button, DrawerToggler, File, useConfig, useDocumentDrawer, useDrawerSlug, useModal, usePayloadAPI, useTranslation } from '@payloadcms/ui';
|
|
8
8
|
import { $getNodeByKey, $getSelection, $isNodeSelection, CLICK_COMMAND, COMMAND_PRIORITY_LOW, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND } from 'lexical';
|
|
9
9
|
import React, { useCallback, useEffect, useReducer, useRef, useState } from 'react';
|
|
10
10
|
import { useEditorConfigContext } from '../../../lexical/config/client/EditorConfigProvider.js';
|
|
11
|
+
import { FieldsDrawer } from '../../../utilities/fieldsDrawer/Drawer.js';
|
|
11
12
|
import { EnabledRelationshipsCondition } from '../../relationship/utils/EnabledRelationshipsCondition.js';
|
|
12
13
|
import { INSERT_UPLOAD_WITH_DRAWER_COMMAND } from '../drawer/commands.js';
|
|
13
14
|
import { $isUploadNode } from '../nodes/UploadNode.js';
|
|
14
|
-
import { ExtraFieldsUploadDrawer } from './ExtraFieldsDrawer/index.js';
|
|
15
15
|
const baseClass = 'lexical-upload';
|
|
16
16
|
const initialParams = {
|
|
17
17
|
depth: 0
|
|
@@ -20,12 +20,13 @@ const Component = (props)=>{
|
|
|
20
20
|
const { data: { fields, relationTo, value }, nodeKey } = props;
|
|
21
21
|
const { collections, routes: { api }, serverURL } = useConfig();
|
|
22
22
|
const uploadRef = useRef(null);
|
|
23
|
+
const { closeModal } = useModal();
|
|
23
24
|
const [editor] = useLexicalComposerContext();
|
|
24
25
|
const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);
|
|
25
26
|
const { editorConfig, field } = useEditorConfigContext();
|
|
26
27
|
const { i18n, t } = useTranslation();
|
|
27
28
|
const [cacheBust, dispatchCacheBust] = useReducer((state)=>state + 1, 0);
|
|
28
|
-
const [relatedCollection
|
|
29
|
+
const [relatedCollection] = useState(()=>collections.find((coll)=>coll.slug === relationTo));
|
|
29
30
|
const drawerSlug = useDrawerSlug('upload-drawer');
|
|
30
31
|
const [DocumentDrawer, DocumentDrawerToggler, { closeDrawer }] = useDocumentDrawer({
|
|
31
32
|
id: value,
|
|
@@ -44,7 +45,7 @@ const Component = (props)=>{
|
|
|
44
45
|
editor,
|
|
45
46
|
nodeKey
|
|
46
47
|
]);
|
|
47
|
-
const updateUpload = useCallback((
|
|
48
|
+
const updateUpload = useCallback((data)=>{
|
|
48
49
|
setParams({
|
|
49
50
|
...initialParams,
|
|
50
51
|
cacheBust
|
|
@@ -56,9 +57,8 @@ const Component = (props)=>{
|
|
|
56
57
|
cacheBust,
|
|
57
58
|
closeDrawer
|
|
58
59
|
]);
|
|
59
|
-
const $onDelete = useCallback((
|
|
60
|
+
const $onDelete = useCallback((event)=>{
|
|
60
61
|
if (isSelected && $isNodeSelection($getSelection())) {
|
|
61
|
-
const event = payload;
|
|
62
62
|
event.preventDefault();
|
|
63
63
|
const node = $getNodeByKey(nodeKey);
|
|
64
64
|
if ($isUploadNode(node)) {
|
|
@@ -71,8 +71,7 @@ const Component = (props)=>{
|
|
|
71
71
|
isSelected,
|
|
72
72
|
nodeKey
|
|
73
73
|
]);
|
|
74
|
-
const onClick = useCallback((
|
|
75
|
-
const event = payload;
|
|
74
|
+
const onClick = useCallback((event)=>{
|
|
76
75
|
// Check if uploadRef.target or anything WITHIN uploadRef.target was clicked
|
|
77
76
|
if (event.target === uploadRef.current || uploadRef.current?.contains(event.target)) {
|
|
78
77
|
if (event.shiftKey) {
|
|
@@ -103,6 +102,25 @@ const Component = (props)=>{
|
|
|
103
102
|
onClick
|
|
104
103
|
]);
|
|
105
104
|
const hasExtraFields = editorConfig?.resolvedFeatureMap?.get('upload')?.sanitizedClientFeatureProps.collections?.[relatedCollection.slug]?.hasExtraFields;
|
|
105
|
+
const onExtraFieldsDrawerSubmit = useCallback((_, data)=>{
|
|
106
|
+
// Update lexical node (with key nodeKey) with new data
|
|
107
|
+
editor.update(()=>{
|
|
108
|
+
const uploadNode = $getNodeByKey(nodeKey);
|
|
109
|
+
if (uploadNode) {
|
|
110
|
+
const newData = {
|
|
111
|
+
...uploadNode.getData(),
|
|
112
|
+
fields: data
|
|
113
|
+
};
|
|
114
|
+
uploadNode.setData(newData);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
closeModal(drawerSlug);
|
|
118
|
+
}, [
|
|
119
|
+
closeModal,
|
|
120
|
+
editor,
|
|
121
|
+
drawerSlug,
|
|
122
|
+
nodeKey
|
|
123
|
+
]);
|
|
106
124
|
return /*#__PURE__*/ _jsxs("div", {
|
|
107
125
|
className: [
|
|
108
126
|
baseClass,
|
|
@@ -198,10 +216,15 @@ const Component = (props)=>{
|
|
|
198
216
|
value && /*#__PURE__*/ _jsx(DocumentDrawer, {
|
|
199
217
|
onSave: updateUpload
|
|
200
218
|
}),
|
|
201
|
-
hasExtraFields ? /*#__PURE__*/ _jsx(
|
|
219
|
+
hasExtraFields ? /*#__PURE__*/ _jsx(FieldsDrawer, {
|
|
220
|
+
data: fields,
|
|
202
221
|
drawerSlug: drawerSlug,
|
|
203
|
-
|
|
204
|
-
|
|
222
|
+
drawerTitle: t('general:editLabel', {
|
|
223
|
+
label: getTranslation(relatedCollection.labels.singular, i18n)
|
|
224
|
+
}),
|
|
225
|
+
featureKey: "upload",
|
|
226
|
+
handleDrawerSubmit: onExtraFieldsDrawerSubmit,
|
|
227
|
+
schemaPathSuffix: relatedCollection.slug
|
|
205
228
|
}) : null
|
|
206
229
|
]
|
|
207
230
|
});
|