@payloadcms/richtext-lexical 3.57.0-internal.1d2ebbc → 3.57.0-internal.2988185

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.
Files changed (46) hide show
  1. package/dist/exports/client/bundled.css +1 -1
  2. package/dist/exports/client/index.js +10 -10
  3. package/dist/exports/client/index.js.map +4 -4
  4. package/dist/features/heading/client/index.d.ts.map +1 -1
  5. package/dist/features/heading/client/index.js +60 -0
  6. package/dist/features/heading/client/index.js.map +1 -1
  7. package/dist/features/heading/server/index.d.ts.map +1 -1
  8. package/dist/features/heading/server/index.js +1 -0
  9. package/dist/features/heading/server/index.js.map +1 -1
  10. package/dist/features/upload/client/index.d.ts.map +1 -1
  11. package/dist/features/upload/client/index.js +1 -2
  12. package/dist/features/upload/client/index.js.map +1 -1
  13. package/dist/features/upload/client/nodes/UploadNode.d.ts +7 -2
  14. package/dist/features/upload/client/nodes/UploadNode.d.ts.map +1 -1
  15. package/dist/features/upload/client/nodes/UploadNode.js +27 -3
  16. package/dist/features/upload/client/nodes/UploadNode.js.map +1 -1
  17. package/dist/features/upload/client/plugin/index.d.ts.map +1 -1
  18. package/dist/features/upload/client/plugin/index.js +22 -269
  19. package/dist/features/upload/client/plugin/index.js.map +1 -1
  20. package/dist/features/upload/server/index.d.ts.map +1 -1
  21. package/dist/features/upload/server/index.js +1 -4
  22. package/dist/features/upload/server/index.js.map +1 -1
  23. package/dist/features/upload/server/nodes/UploadNode.d.ts +1 -0
  24. package/dist/features/upload/server/nodes/UploadNode.d.ts.map +1 -1
  25. package/dist/features/upload/server/nodes/UploadNode.js +37 -3
  26. package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
  27. package/dist/field/bundled.css +1 -1
  28. package/package.json +7 -7
  29. package/dist/exports/client/pendingComponent-WFSCE6LJ.js +0 -2
  30. package/dist/exports/client/pendingComponent-WFSCE6LJ.js.map +0 -7
  31. package/dist/features/upload/client/nodes/PendingUploadNode.d.ts +0 -17
  32. package/dist/features/upload/client/nodes/PendingUploadNode.d.ts.map +0 -1
  33. package/dist/features/upload/client/nodes/PendingUploadNode.js +0 -57
  34. package/dist/features/upload/client/nodes/PendingUploadNode.js.map +0 -1
  35. package/dist/features/upload/client/pendingComponent/index.d.ts +0 -7
  36. package/dist/features/upload/client/pendingComponent/index.d.ts.map +0 -1
  37. package/dist/features/upload/client/pendingComponent/index.js +0 -14
  38. package/dist/features/upload/client/pendingComponent/index.js.map +0 -1
  39. package/dist/features/upload/server/nodes/PendingUploadNode.d.ts +0 -42
  40. package/dist/features/upload/server/nodes/PendingUploadNode.d.ts.map +0 -1
  41. package/dist/features/upload/server/nodes/PendingUploadNode.js +0 -92
  42. package/dist/features/upload/server/nodes/PendingUploadNode.js.map +0 -1
  43. package/dist/features/upload/server/nodes/conversions.d.ts +0 -9
  44. package/dist/features/upload/server/nodes/conversions.d.ts.map +0 -1
  45. package/dist/features/upload/server/nodes/conversions.js +0 -53
  46. package/dist/features/upload/server/nodes/conversions.js.map +0 -1
@@ -3,148 +3,30 @@
3
3
  import { c as _c } from "react/compiler-runtime";
4
4
  import { jsx as _jsx } from "react/jsx-runtime";
5
5
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
6
- import { $dfsIterator, $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils';
7
- import { useBulkUpload, useConfig, useEffectEvent, useModal } from '@payloadcms/ui';
8
- import ObjectID from 'bson-objectid';
9
- import { $getPreviousSelection, $getSelection, $isParagraphNode, $isRangeSelection, COMMAND_PRIORITY_EDITOR, COMMAND_PRIORITY_LOW, createCommand, DROP_COMMAND, PASTE_COMMAND } from 'lexical';
6
+ import { $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils';
7
+ import { useConfig } from '@payloadcms/ui';
8
+ import { $getPreviousSelection, $getSelection, $isParagraphNode, $isRangeSelection, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical';
10
9
  import React, { useEffect } from 'react';
11
10
  import { UploadDrawer } from '../drawer/index.js';
12
- import { $isPendingUploadNode, PendingUploadNode } from '../nodes/PendingUploadNode.js';
13
11
  import { $createUploadNode, UploadNode } from '../nodes/UploadNode.js';
14
12
  export const INSERT_UPLOAD_COMMAND = createCommand('INSERT_UPLOAD_COMMAND');
15
- export const UploadPlugin = () => {
16
- const $ = _c(18);
13
+ export const UploadPlugin = t0 => {
14
+ const $ = _c(5);
17
15
  const [editor] = useLexicalComposerContext();
18
16
  const {
19
- config: t0
17
+ config: t1
20
18
  } = useConfig();
21
19
  const {
22
20
  collections
23
- } = t0;
24
- const {
25
- drawerSlug: bulkUploadDrawerSlug,
26
- setCollectionSlug,
27
- setInitialForms,
28
- setOnCancel,
29
- setOnSuccess,
30
- setSelectableCollections
31
- } = useBulkUpload();
32
- const {
33
- isModalOpen,
34
- openModal
35
- } = useModal();
36
- let t1;
37
- if ($[0] !== bulkUploadDrawerSlug || $[1] !== collections || $[2] !== editor || $[3] !== isModalOpen || $[4] !== openModal || $[5] !== setCollectionSlug || $[6] !== setInitialForms || $[7] !== setOnCancel || $[8] !== setOnSuccess || $[9] !== setSelectableCollections) {
38
- t1 = t2 => {
39
- const {
40
- files
41
- } = t2;
42
- if (files?.length === 0) {
43
- return;
44
- }
45
- setInitialForms(initialForms => [...(initialForms ?? []), ...files.map(_temp)]);
46
- if (!isModalOpen(bulkUploadDrawerSlug)) {
47
- const uploadCollections = collections.filter(_temp2).map(_temp3);
48
- if (!uploadCollections.length || !uploadCollections[0]) {
49
- return;
50
- }
51
- setCollectionSlug(uploadCollections[0]);
52
- setSelectableCollections(uploadCollections);
53
- setOnCancel(() => {
54
- editor.update(_temp4);
55
- });
56
- setOnSuccess(newDocs => {
57
- const newDocsMap = new Map(newDocs.map(_temp5));
58
- editor.update(() => {
59
- for (const dfsNode_0 of $dfsIterator()) {
60
- const node_0 = dfsNode_0.node;
61
- if ($isPendingUploadNode(node_0)) {
62
- const newDoc = newDocsMap.get(node_0.getData().formID);
63
- if (newDoc) {
64
- node_0.replace($createUploadNode({
65
- data: {
66
- id: new ObjectID.default().toHexString(),
67
- fields: newDoc.doc,
68
- relationTo: newDoc.collectionSlug,
69
- value: newDoc.doc.id
70
- }
71
- }));
72
- }
73
- }
74
- }
75
- });
76
- });
77
- openModal(bulkUploadDrawerSlug);
78
- }
79
- };
80
- $[0] = bulkUploadDrawerSlug;
81
- $[1] = collections;
82
- $[2] = editor;
83
- $[3] = isModalOpen;
84
- $[4] = openModal;
85
- $[5] = setCollectionSlug;
86
- $[6] = setInitialForms;
87
- $[7] = setOnCancel;
88
- $[8] = setOnSuccess;
89
- $[9] = setSelectableCollections;
90
- $[10] = t1;
91
- } else {
92
- t1 = $[10];
93
- }
94
- const openBulkUpload = useEffectEvent(t1);
21
+ } = t1;
95
22
  let t2;
96
- if ($[11] !== editor || $[12] !== openBulkUpload) {
23
+ let t3;
24
+ if ($[0] !== editor) {
97
25
  t2 = () => {
98
26
  if (!editor.hasNodes([UploadNode])) {
99
27
  throw new Error("UploadPlugin: UploadNode not registered on editor");
100
28
  }
101
- return mergeRegister(editor.registerNodeTransform(PendingUploadNode, node_1 => {
102
- const nodeData = node_1.getData();
103
- const upload_0 = async function upload() {
104
- let transformedImage = null;
105
- const src = nodeData.src;
106
- const formID = nodeData.formID;
107
- if (src.startsWith("data:")) {
108
- const mimeMatch = src.match(/data:(image\/[a-zA-Z]+);base64,/);
109
- const mimeType = mimeMatch ? mimeMatch[1] : "image/png";
110
- const base64Data = src.replace(/^data:image\/[a-zA-Z]+;base64,/, "");
111
- const byteCharacters = atob(base64Data);
112
- const byteNumbers = new Array(byteCharacters.length);
113
- for (let i = 0; i < byteCharacters.length; i++) {
114
- byteNumbers[i] = byteCharacters.charCodeAt(i);
115
- }
116
- const byteArray = new Uint8Array(byteNumbers);
117
- const file_0 = new File([byteArray], "pasted-image." + mimeType?.split("/")[1], {
118
- type: mimeType
119
- });
120
- transformedImage = {
121
- alt: undefined,
122
- file: file_0,
123
- formID
124
- };
125
- } else {
126
- if (src.startsWith("http") || src.startsWith("https")) {
127
- const res = await fetch(src);
128
- const blob = await res.blob();
129
- const file_1 = new File([blob], "pasted-image." + blob.type.split("/")[1], {
130
- type: blob.type
131
- });
132
- transformedImage = {
133
- alt: undefined,
134
- file: file_1,
135
- formID
136
- };
137
- }
138
- }
139
- if (!transformedImage) {
140
- return;
141
- }
142
- openBulkUpload({
143
- files: [transformedImage]
144
- });
145
- };
146
- upload_0();
147
- }), editor.registerCommand(INSERT_UPLOAD_COMMAND, payload => {
29
+ return mergeRegister(editor.registerCommand(INSERT_UPLOAD_COMMAND, payload => {
148
30
  editor.update(() => {
149
31
  const selection = $getSelection() || $getPreviousSelection();
150
32
  if ($isRangeSelection(selection)) {
@@ -167,162 +49,33 @@ export const UploadPlugin = () => {
167
49
  }
168
50
  });
169
51
  return true;
170
- }, COMMAND_PRIORITY_EDITOR), editor.registerCommand(PASTE_COMMAND, event => {
171
- if (!(event instanceof ClipboardEvent)) {
172
- return false;
173
- }
174
- const clipboardData = event.clipboardData;
175
- if (!clipboardData?.types?.length || clipboardData?.types?.includes("text/html")) {
176
- return false;
177
- }
178
- const files_0 = [];
179
- if (clipboardData?.files?.length) {
180
- Array.from(clipboardData.files).forEach(file_2 => {
181
- files_0.push({
182
- alt: "",
183
- file: file_2,
184
- formID: new ObjectID.default().toHexString()
185
- });
186
- });
187
- }
188
- if (files_0.length) {
189
- editor.update(() => {
190
- const selection_0 = $getSelection() || $getPreviousSelection();
191
- if ($isRangeSelection(selection_0)) {
192
- for (const file_3 of files_0) {
193
- const pendingUploadNode = new PendingUploadNode({
194
- data: {
195
- formID: file_3.formID,
196
- src: URL.createObjectURL(file_3.file)
197
- }
198
- });
199
- const {
200
- focus: focus_0
201
- } = selection_0;
202
- const focusNode_0 = focus_0.getNode();
203
- $insertNodeToNearestRoot(pendingUploadNode);
204
- if ($isParagraphNode(focusNode_0) && !focusNode_0.__first) {
205
- focusNode_0.remove();
206
- }
207
- }
208
- }
209
- });
210
- openBulkUpload({
211
- files: files_0
212
- });
213
- return true;
214
- }
215
- return false;
216
- }, COMMAND_PRIORITY_LOW), editor.registerCommand(DROP_COMMAND, event_0 => {
217
- if (!(event_0 instanceof DragEvent)) {
218
- return false;
219
- }
220
- const dt = event_0.dataTransfer;
221
- if (!dt?.types?.length) {
222
- return false;
223
- }
224
- const files_1 = [];
225
- if (dt?.files?.length) {
226
- Array.from(dt.files).forEach(file_4 => {
227
- files_1.push({
228
- alt: "",
229
- file: file_4,
230
- formID: new ObjectID.default().toHexString()
231
- });
232
- });
233
- }
234
- if (files_1.length) {
235
- event_0.preventDefault();
236
- event_0.stopPropagation();
237
- editor.update(() => {
238
- const selection_1 = $getSelection() || $getPreviousSelection();
239
- if ($isRangeSelection(selection_1)) {
240
- for (const file_5 of files_1) {
241
- const pendingUploadNode_0 = new PendingUploadNode({
242
- data: {
243
- formID: file_5.formID,
244
- src: URL.createObjectURL(file_5.file)
245
- }
246
- });
247
- const {
248
- focus: focus_1
249
- } = selection_1;
250
- const focusNode_1 = focus_1.getNode();
251
- $insertNodeToNearestRoot(pendingUploadNode_0);
252
- if ($isParagraphNode(focusNode_1) && !focusNode_1.__first) {
253
- focusNode_1.remove();
254
- }
255
- }
256
- }
257
- });
258
- openBulkUpload({
259
- files: files_1
260
- });
261
- return true;
262
- }
263
- return false;
264
- }, COMMAND_PRIORITY_LOW));
52
+ }, COMMAND_PRIORITY_EDITOR));
265
53
  };
266
- $[11] = editor;
267
- $[12] = openBulkUpload;
268
- $[13] = t2;
269
- } else {
270
- t2 = $[13];
271
- }
272
- let t3;
273
- if ($[14] !== editor) {
274
54
  t3 = [editor];
275
- $[14] = editor;
276
- $[15] = t3;
55
+ $[0] = editor;
56
+ $[1] = t2;
57
+ $[2] = t3;
277
58
  } else {
278
- t3 = $[15];
59
+ t2 = $[1];
60
+ t3 = $[2];
279
61
  }
280
62
  useEffect(t2, t3);
281
63
  let t4;
282
- if ($[16] !== collections) {
64
+ if ($[3] !== collections) {
283
65
  t4 = _jsx(UploadDrawer, {
284
- enabledCollectionSlugs: collections.map(_temp6)
66
+ enabledCollectionSlugs: collections.map(_temp)
285
67
  });
286
- $[16] = collections;
287
- $[17] = t4;
68
+ $[3] = collections;
69
+ $[4] = t4;
288
70
  } else {
289
- t4 = $[17];
71
+ t4 = $[4];
290
72
  }
291
73
  return t4;
292
74
  };
293
- function _temp(file) {
294
- return {
295
- file: file.file,
296
- formID: file.formID
297
- };
298
- }
299
- function _temp2(t0) {
300
- const {
301
- upload
302
- } = t0;
303
- return !!upload;
304
- }
305
- function _temp3(t0) {
75
+ function _temp(t0) {
306
76
  const {
307
77
  slug
308
78
  } = t0;
309
79
  return slug;
310
80
  }
311
- function _temp4() {
312
- for (const dfsNode of $dfsIterator()) {
313
- const node = dfsNode.node;
314
- if ($isPendingUploadNode(node)) {
315
- node.remove();
316
- }
317
- }
318
- }
319
- function _temp5(doc) {
320
- return [doc.formID, doc];
321
- }
322
- function _temp6(t0) {
323
- const {
324
- slug: slug_0
325
- } = t0;
326
- return slug_0;
327
- }
328
81
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$dfsIterator","$insertNodeToNearestRoot","mergeRegister","useBulkUpload","useConfig","useEffectEvent","useModal","ObjectID","$getPreviousSelection","$getSelection","$isParagraphNode","$isRangeSelection","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","createCommand","DROP_COMMAND","PASTE_COMMAND","React","useEffect","UploadDrawer","$isPendingUploadNode","PendingUploadNode","$createUploadNode","UploadNode","INSERT_UPLOAD_COMMAND","UploadPlugin","$","editor","config","t0","collections","drawerSlug","bulkUploadDrawerSlug","setCollectionSlug","setInitialForms","setOnCancel","setOnSuccess","setSelectableCollections","isModalOpen","openModal","t1","t2","files","length","initialForms","map","_temp","uploadCollections","filter","_temp2","_temp3","update","_temp4","newDocs","newDocsMap","Map","_temp5","dfsNode_0","node_0","dfsNode","node","newDoc","get","getData","formID","replace","data","id","default","toHexString","fields","doc","relationTo","collectionSlug","value","openBulkUpload","hasNodes","Error","registerNodeTransform","node_1","nodeData","upload_0","upload","transformedImage","src","startsWith","mimeMatch","match","mimeType","base64Data","byteCharacters","atob","byteNumbers","Array","i","charCodeAt","byteArray","Uint8Array","file_0","File","split","type","file","res","fetch","blob","file_1","registerCommand","payload","selection","uploadNode","focus","focusNode","getNode","__first","remove","event","ClipboardEvent","clipboardData","types","includes","files_0","from","forEach","file_2","push","alt","selection_0","file_3","pendingUploadNode","URL","createObjectURL","focus_0","focusNode_0","event_0","DragEvent","dt","dataTransfer","files_1","file_4","preventDefault","stopPropagation","selection_1","file_5","pendingUploadNode_0","focus_1","focusNode_1","t3","t4","_jsx","enabledCollectionSlugs","_temp6","slug","slug_0"],"sources":["../../../../../src/features/upload/client/plugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $dfsIterator, $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils'\nimport { useBulkUpload, useConfig, useEffectEvent, useModal } from '@payloadcms/ui'\nimport ObjectID from 'bson-objectid'\nimport {\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n COMMAND_PRIORITY_EDITOR,\n COMMAND_PRIORITY_LOW,\n createCommand,\n DROP_COMMAND,\n PASTE_COMMAND,\n} from 'lexical'\nimport React, { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { UploadData } from '../../server/nodes/UploadNode.js'\nimport type { UploadFeaturePropsClient } from '../index.js'\n\nimport { UploadDrawer } from '../drawer/index.js'\nimport { $isPendingUploadNode, PendingUploadNode } from '../nodes/PendingUploadNode.js'\nimport { $createUploadNode, UploadNode } from '../nodes/UploadNode.js'\n\nexport type InsertUploadPayload = Readonly<Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>>\n\nexport const INSERT_UPLOAD_COMMAND: LexicalCommand<InsertUploadPayload> =\n createCommand('INSERT_UPLOAD_COMMAND')\n\ntype FileToUpload = {\n alt?: string\n file: File\n /**\n * Bulk Upload Form ID that should be created, which can then be matched\n * against the node formID if the upload is successful\n */\n formID: string\n}\n\nexport const UploadPlugin: PluginComponent<UploadFeaturePropsClient> = () => {\n const [editor] = useLexicalComposerContext()\n const {\n config: { collections },\n } = useConfig()\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug,\n setInitialForms,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n } = useBulkUpload()\n\n const { isModalOpen, openModal } = useModal()\n\n const openBulkUpload = useEffectEvent(({ files }: { files: FileToUpload[] }) => {\n if (files?.length === 0) {\n return\n }\n\n setInitialForms((initialForms) => [\n ...(initialForms ?? []),\n ...files.map((file) => ({\n file: file.file,\n formID: file.formID,\n })),\n ])\n\n if (!isModalOpen(bulkUploadDrawerSlug)) {\n const uploadCollections = collections.filter(({ upload }) => !!upload).map(({ slug }) => slug)\n if (!uploadCollections.length || !uploadCollections[0]) {\n return\n }\n\n setCollectionSlug(uploadCollections[0])\n setSelectableCollections(uploadCollections)\n\n setOnCancel(() => {\n // Remove all the pending upload nodes that were added but not uploaded\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n\n if ($isPendingUploadNode(node)) {\n node.remove()\n }\n }\n })\n })\n\n setOnSuccess((newDocs) => {\n const newDocsMap = new Map(newDocs.map((doc) => [doc.formID, doc]))\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n if ($isPendingUploadNode(node)) {\n const newDoc = newDocsMap.get(node.getData().formID)\n if (newDoc) {\n node.replace(\n $createUploadNode({\n data: {\n id: new ObjectID.default().toHexString(),\n fields: newDoc.doc,\n relationTo: newDoc.collectionSlug,\n value: newDoc.doc.id,\n },\n }),\n )\n }\n }\n }\n })\n })\n\n openModal(bulkUploadDrawerSlug)\n }\n })\n\n useEffect(() => {\n if (!editor.hasNodes([UploadNode])) {\n throw new Error('UploadPlugin: UploadNode not registered on editor')\n }\n\n return mergeRegister(\n /**\n * Handle auto-uploading files if you copy & paste an image dom element from the clipboard\n */\n editor.registerNodeTransform(PendingUploadNode, (node) => {\n const nodeData = node.getData()\n async function upload() {\n let transformedImage: FileToUpload | null = null\n\n const src = nodeData.src\n const formID = nodeData.formID\n\n if (src.startsWith('data:')) {\n // It's a base64-encoded image\n const mimeMatch = src.match(/data:(image\\/[a-zA-Z]+);base64,/)\n const mimeType = mimeMatch ? mimeMatch[1] : 'image/png' // Default to PNG if MIME type not found\n const base64Data = src.replace(/^data:image\\/[a-zA-Z]+;base64,/, '')\n const byteCharacters = atob(base64Data)\n const byteNumbers = new Array(byteCharacters.length)\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i)\n }\n const byteArray = new Uint8Array(byteNumbers)\n const file = new File([byteArray], 'pasted-image.' + mimeType?.split('/')[1], {\n type: mimeType,\n })\n transformedImage = { alt: undefined, file, formID }\n } else if (src.startsWith('http') || src.startsWith('https')) {\n // It's an image URL\n const res = await fetch(src)\n const blob = await res.blob()\n const file = new File([blob], 'pasted-image.' + blob.type.split('/')[1], {\n type: blob.type,\n })\n\n transformedImage = { alt: undefined, file, formID }\n }\n\n if (!transformedImage) {\n return\n }\n\n openBulkUpload({ files: [transformedImage] })\n }\n void upload()\n }),\n editor.registerCommand<InsertUploadPayload>(\n INSERT_UPLOAD_COMMAND,\n (payload: InsertUploadPayload) => {\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const uploadNode = $createUploadNode({\n data: {\n id: payload.id,\n fields: payload.fields,\n relationTo: payload.relationTo,\n value: payload.value,\n },\n })\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(uploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n // PendingUploadNodes are automatically created when importDOM is called. However, if you paste a file from your computer\n // directly, importDOM won't be called, as it's not a HTML dom element. So we need to handle that case here.\n\n if (!(event instanceof ClipboardEvent)) {\n return false\n }\n const clipboardData = event.clipboardData\n\n if (!clipboardData?.types?.length || clipboardData?.types?.includes('text/html')) {\n // HTML is handled through importDOM => registerNodeTransform for PendingUploadNode\n return false\n }\n\n const files: FileToUpload[] = []\n if (clipboardData?.files?.length) {\n Array.from(clipboardData.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Insert a PendingUploadNode for each image\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n for (const file of files) {\n const pendingUploadNode = new PendingUploadNode({\n data: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n // Handle drag & drop of files from the desktop into the editor\n editor.registerCommand(\n DROP_COMMAND,\n (event) => {\n if (!(event instanceof DragEvent)) {\n return false\n }\n\n const dt = event.dataTransfer\n\n if (!dt?.types?.length) {\n return false\n }\n\n const files: FileToUpload[] = []\n if (dt?.files?.length) {\n Array.from(dt.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Prevent the default browser drop handling, which would open the file in the browser\n event.preventDefault()\n event.stopPropagation()\n\n // Insert a PendingUploadNode for each image\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n for (const file of files) {\n const pendingUploadNode = new PendingUploadNode({\n data: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor])\n\n return <UploadDrawer enabledCollectionSlugs={collections.map(({ slug }) => slug)} />\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$insertNodeToNearestRoot","mergeRegister","useConfig","$getPreviousSelection","$getSelection","$isParagraphNode","$isRangeSelection","COMMAND_PRIORITY_EDITOR","createCommand","React","useEffect","UploadDrawer","$createUploadNode","UploadNode","INSERT_UPLOAD_COMMAND","UploadPlugin","t0","$","editor","config","t1","collections","t2","t3","hasNodes","Error","registerCommand","payload","update","selection","uploadNode","data","id","fields","relationTo","value","focus","focusNode","getNode","__first","remove","t4","_jsx","enabledCollectionSlugs","map","_temp","slug"],"sources":["../../../../../src/features/upload/client/plugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils'\nimport { useConfig } from '@payloadcms/ui'\nimport {\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n COMMAND_PRIORITY_EDITOR,\n createCommand,\n} from 'lexical'\nimport React, { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { UploadData } from '../../server/nodes/UploadNode.js'\nimport type { UploadFeaturePropsClient } from '../index.js'\n\nimport { UploadDrawer } from '../drawer/index.js'\nimport { $createUploadNode, UploadNode } from '../nodes/UploadNode.js'\n\nexport type InsertUploadPayload = Readonly<Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>>\n\nexport const INSERT_UPLOAD_COMMAND: LexicalCommand<InsertUploadPayload> =\n createCommand('INSERT_UPLOAD_COMMAND')\n\nexport const UploadPlugin: PluginComponent<UploadFeaturePropsClient> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n const {\n config: { collections },\n } = useConfig()\n\n useEffect(() => {\n if (!editor.hasNodes([UploadNode])) {\n throw new Error('UploadPlugin: UploadNode not registered on editor')\n }\n\n return mergeRegister(\n editor.registerCommand<InsertUploadPayload>(\n INSERT_UPLOAD_COMMAND,\n (payload: InsertUploadPayload) => {\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const uploadNode = $createUploadNode({\n data: {\n id: payload.id,\n fields: payload.fields,\n relationTo: payload.relationTo,\n value: payload.value,\n },\n })\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(uploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n )\n }, [editor])\n\n return <UploadDrawer enabledCollectionSlugs={collections.map(({ slug }) => slug)} />\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAGA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,wBAAwB,EAAEC,aAAa,QAAQ;AACxD,SAASC,SAAS,QAAQ;AAC1B,SACEC,qBAAqB,EACrBC,aAAa,EACbC,gBAAgB,EAChBC,iBAAiB,EACjBC,uBAAuB,EACvBC,aAAa,QACR;AACP,OAAOC,KAAA,IAASC,SAAS,QAAQ;AAMjC,SAASC,YAAY,QAAQ;AAC7B,SAASC,iBAAiB,EAAEC,UAAU,QAAQ;AAI9C,OAAO,MAAMC,qBAAA,GACXN,aAAA,CAAc;AAEhB,OAAO,MAAMO,YAAA,GAA0DC,EAAA;EAAA,MAAAC,CAAA,GAAAnB,EAAA;EACrE,OAAAoB,MAAA,IAAiBnB,yBAAA;EACjB;IAAAoB,MAAA,EAAAC;EAAA,IAEIlB,SAAA;EADM;IAAAmB;EAAA,IAAAD,EAAe;EAAA,IAAAE,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAN,CAAA,QAAAC,MAAA;IAGfI,EAAA,GAAAA,CAAA;MAAA,KACHJ,MAAA,CAAAM,QAAA,EAAAX,UAAA,CAA4B;QAAA,UAAAY,KAAA,CACf;MAAA;MAAA,OAGXxB,aAAA,CACLiB,MAAA,CAAAQ,eAAA,CAAAZ,qBAAA,EAAAa,OAAA;QAGIT,MAAA,CAAAU,MAAA;UACE,MAAAC,SAAA,GAAkBzB,aAAA,MAAmBD,qBAAA;UAAA,IAEjCG,iBAAA,CAAkBuB,SAAA;YACpB,MAAAC,UAAA,GAAmBlB,iBAAA;cAAAmB,IAAA;gBAAAC,EAAA,EAEXL,OAAA,CAAAK,EAAA;gBAAAC,MAAA,EACIN,OAAA,CAAAM,MAAA;gBAAAC,UAAA,EACIP,OAAA,CAAAO,UAAA;gBAAAC,KAAA,EACLR,OAAA,CAAAQ;cAAA;YAAA,CAEX;YAEA;cAAAC;YAAA,IAAkBP,SAAA;YAClB,MAAAQ,SAAA,GAAkBD,KAAA,CAAAE,OAAA,CAAa;YAE/BtC,wBAAA,CAAyB8B,UAAA;YAAA,IAGrBzB,gBAAA,CAAiBgC,SAAA,MAAeA,SAAA,CAAAE,OAAiB;cACnDF,SAAA,CAAAG,MAAA,CAAgB;YAAA;UAAA;QAAA,CAGtB;QAAA;MAAA,GAAAjC,uBAIF;IAAA;IAGHgB,EAAA,IAACL,MAAA;IAAOD,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAK,EAAA;IAAAL,CAAA,MAAAM,EAAA;EAAA;IAAAD,EAAA,GAAAL,CAAA;IAAAM,EAAA,GAAAN,CAAA;EAAA;EAvCXP,SAAA,CAAUY,EAuCV,EAAGC,EAAQ;EAAA,IAAAkB,EAAA;EAAA,IAAAxB,CAAA,QAAAI,WAAA;IAEJoB,EAAA,GAAAC,IAAA,CAAA/B,YAAA;MAAAgC,sBAAA,EAAsCtB,WAAA,CAAAuB,GAAA,CAAAC,KAA8B;IAAA,C;;;;;;SAApEJ,E;CACT;AAhDuE,SAAAI,MAAA7B,EAAA;EA+CP;IAAA8B;EAAA,IAAA9B,EAAQ;EAAA,OAAK8B,IAAA;AAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,KAAK,EAMN,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAWlE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,UAAU,EAAE,cAAc,GAAG;YAC5B,MAAM,EAAE,KAAK,EAAE,CAAA;SAChB,CAAA;KACF,CAAA;IACD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AASD,eAAO,MAAM,aAAa,gIAoPxB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,KAAK,EAMN,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAUlE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,UAAU,EAAE,cAAc,GAAG;YAC5B,MAAM,EAAE,KAAK,EAAE,CAAA;SAChB,CAAA;KACF,CAAA;IACD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AASD,eAAO,MAAM,aAAa,gIAiPxB,CAAA"}
@@ -4,7 +4,6 @@ import { createServerFeature } from '../../../utilities/createServerFeature.js';
4
4
  import { createNode } from '../../typeUtilities.js';
5
5
  import { uploadPopulationPromiseHOC } from './graphQLPopulationPromise.js';
6
6
  import { i18n } from './i18n.js';
7
- import { PendingUploadServerNode } from './nodes/PendingUploadNode.js';
8
7
  import { UploadServerNode } from './nodes/UploadNode.js';
9
8
  import { uploadValidation } from './validate.js';
10
9
  /**
@@ -212,9 +211,7 @@ export const UploadFeature = createServerFeature({
212
211
  },
213
212
  node: UploadServerNode,
214
213
  validations: [uploadValidation(props)]
215
- }), {
216
- node: PendingUploadServerNode
217
- }],
214
+ })],
218
215
  sanitizedServerFeatureProps: props
219
216
  };
220
217
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["sanitizeFields","populate","createServerFeature","createNode","uploadPopulationPromiseHOC","i18n","PendingUploadServerNode","UploadServerNode","uploadValidation","getAbsoluteURL","url","payload","startsWith","config","serverURL","UploadFeature","feature","_config","isRoot","parentIsLocalized","props","collections","clientProps","collection","hasExtraFields","fields","length","validRelationships","map","c","slug","collectionKey","requireFieldLevelRichTextEditor","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","nodes","converters","html","converter","currentDepth","depth","draft","node","overrideAccess","req","showHiddenFields","id","value","uploadDocument","collectionSlug","relationTo","data","key","ignored","console","error","mimeType","filename","sizes","Object","keys","width","height","pictureHTML","size","imageSize","filesize","imageSizeURL","nodeTypes","getType","getSubFields","allSubFields","collectionFields","concat","collectionFieldSchema","Array","isArray","getSubFieldsData","graphQLPopulationPromises","hooks","afterRead","populateArg","populationPromises","populateDepth","maxDepth","undefined","push","select","defaultPopulate","validations","sanitizedServerFeatureProps"],"sources":["../../../../src/features/upload/server/index.ts"],"sourcesContent":["import type {\n CollectionSlug,\n Config,\n Field,\n FieldSchemaMap,\n FileData,\n FileSizeImproved,\n Payload,\n TypeWithID,\n} from 'payload'\n\nimport { sanitizeFields } from 'payload'\n\nimport type { UploadFeaturePropsClient } from '../client/index.js'\n\nimport { populate } from '../../../populateGraphQL/populate.js'\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { uploadPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { PendingUploadServerNode } from './nodes/PendingUploadNode.js'\nimport { UploadServerNode } from './nodes/UploadNode.js'\nimport { uploadValidation } from './validate.js'\n\nexport type UploadFeatureProps = {\n collections?: {\n [collection: CollectionSlug]: {\n fields: Field[]\n }\n }\n /**\n * Sets a maximum population depth for this upload (not the fields for this upload), regardless of the remaining depth when the respective 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\n/**\n * Get the absolute URL for an upload URL by potentially prepending the serverURL\n */\nfunction getAbsoluteURL(url: string, payload: Payload): string {\n return url?.startsWith('http') ? url : (payload?.config?.serverURL || '') + url\n}\n\nexport const UploadFeature = createServerFeature<\n UploadFeatureProps,\n UploadFeatureProps,\n UploadFeaturePropsClient\n>({\n feature: async ({ config: _config, isRoot, parentIsLocalized, props }) => {\n if (!props) {\n props = { collections: {} }\n }\n\n const clientProps: UploadFeaturePropsClient = {\n collections: {},\n }\n if (props.collections) {\n for (const collection in props.collections) {\n clientProps.collections[collection] = {\n hasExtraFields: props.collections[collection]!.fields.length >= 1,\n }\n }\n }\n\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n collection.fields = await sanitizeFields({\n config: _config as unknown as Config,\n fields: collection.fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n }\n }\n\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#UploadFeatureClient',\n clientFeatureProps: clientProps,\n generateSchemaMap: ({ props }) => {\n if (!props?.collections) {\n return null\n }\n\n const schemaMap: FieldSchemaMap = new Map()\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n schemaMap.set(collectionKey, {\n fields: collection.fields,\n })\n }\n }\n\n return schemaMap\n },\n i18n,\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n req,\n showHiddenFields,\n }) => {\n // @ts-expect-error - for backwards-compatibility\n const id = node?.value?.id || node?.value\n\n if (req?.payload) {\n const uploadDocument: {\n value?: FileData & TypeWithID\n } = {}\n\n try {\n await populate({\n id,\n collectionSlug: node.relationTo,\n currentDepth,\n data: uploadDocument,\n depth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n showHiddenFields,\n })\n } catch (ignored) {\n // eslint-disable-next-line no-console\n console.error(\n 'Lexical upload node HTML converter: error fetching upload file',\n ignored,\n 'Node:',\n node,\n )\n return `<img />`\n }\n\n const url = getAbsoluteURL(uploadDocument?.value?.url ?? '', req?.payload)\n\n /**\n * If the upload is not an image, return a link to the upload\n */\n if (!uploadDocument?.value?.mimeType?.startsWith('image')) {\n return `<a href=\"${url}\" rel=\"noopener noreferrer\">${uploadDocument.value?.filename}</a>`\n }\n\n /**\n * If the upload is a simple image with no different sizes, return a simple img tag\n */\n if (\n !uploadDocument?.value?.sizes ||\n !Object.keys(uploadDocument?.value?.sizes).length\n ) {\n return `<img src=\"${url}\" alt=\"${uploadDocument?.value?.filename}\" width=\"${uploadDocument?.value?.width}\" height=\"${uploadDocument?.value?.height}\"/>`\n }\n\n /**\n * If the upload is an image with different sizes, return a picture element\n */\n let pictureHTML = '<picture>'\n\n // Iterate through each size in the data.sizes object\n for (const size in uploadDocument.value?.sizes) {\n const imageSize = uploadDocument.value.sizes[size] as FileSizeImproved\n\n // Skip if any property of the size object is null\n if (\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n const imageSizeURL = getAbsoluteURL(imageSize?.url, req?.payload)\n\n pictureHTML += `<source srcset=\"${imageSizeURL}\" media=\"(max-width: ${imageSize.width}px)\" type=\"${imageSize.mimeType}\">`\n }\n\n // Add the default img tag\n pictureHTML += `<img src=\"${url}\" alt=\"Image\" width=\"${uploadDocument.value?.width}\" height=\"${uploadDocument.value?.height}\">`\n pictureHTML += '</picture>'\n return pictureHTML\n } else {\n return `<img src=\"${id}\" />`\n }\n },\n nodeTypes: [UploadServerNode.getType()],\n },\n },\n getSubFields: ({ node, req }) => {\n if (!node) {\n let allSubFields: Field[] = []\n for (const collection in props?.collections) {\n const collectionFields = props.collections[collection]!.fields\n allSubFields = allSubFields.concat(collectionFields)\n }\n return allSubFields\n }\n const collection = req ? req.payload.collections[node?.relationTo] : null\n\n if (collection) {\n const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields\n\n if (Array.isArray(collectionFieldSchema)) {\n if (!collectionFieldSchema?.length) {\n return null\n }\n return collectionFieldSchema\n }\n }\n return null\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [uploadPopulationPromiseHOC(props)],\n hooks: {\n afterRead: [\n ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n populateArg,\n populationPromises,\n req,\n showHiddenFields,\n }) => {\n if (!node?.value) {\n return node\n }\n const collection = req.payload.collections[node?.relationTo]\n\n if (!collection) {\n return node\n }\n // @ts-expect-error - Fix in Payload v4\n const id = node?.value?.id || node?.value // for backwards-compatibility\n\n const populateDepth =\n props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth\n\n populationPromises.push(\n populate({\n id,\n collectionSlug: collection.config.slug,\n currentDepth,\n data: node,\n depth: populateDepth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n select:\n populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,\n showHiddenFields,\n }),\n )\n\n return node\n },\n ],\n },\n node: UploadServerNode,\n validations: [uploadValidation(props)],\n }),\n {\n node: PendingUploadServerNode,\n },\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'upload',\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["sanitizeFields","populate","createServerFeature","createNode","uploadPopulationPromiseHOC","i18n","UploadServerNode","uploadValidation","getAbsoluteURL","url","payload","startsWith","config","serverURL","UploadFeature","feature","_config","isRoot","parentIsLocalized","props","collections","clientProps","collection","hasExtraFields","fields","length","validRelationships","map","c","slug","collectionKey","requireFieldLevelRichTextEditor","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","nodes","converters","html","converter","currentDepth","depth","draft","node","overrideAccess","req","showHiddenFields","id","value","uploadDocument","collectionSlug","relationTo","data","key","ignored","console","error","mimeType","filename","sizes","Object","keys","width","height","pictureHTML","size","imageSize","filesize","imageSizeURL","nodeTypes","getType","getSubFields","allSubFields","collectionFields","concat","collectionFieldSchema","Array","isArray","getSubFieldsData","graphQLPopulationPromises","hooks","afterRead","populateArg","populationPromises","populateDepth","maxDepth","undefined","push","select","defaultPopulate","validations","sanitizedServerFeatureProps"],"sources":["../../../../src/features/upload/server/index.ts"],"sourcesContent":["import type {\n CollectionSlug,\n Config,\n Field,\n FieldSchemaMap,\n FileData,\n FileSizeImproved,\n Payload,\n TypeWithID,\n} from 'payload'\n\nimport { sanitizeFields } from 'payload'\n\nimport type { UploadFeaturePropsClient } from '../client/index.js'\n\nimport { populate } from '../../../populateGraphQL/populate.js'\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { uploadPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { UploadServerNode } from './nodes/UploadNode.js'\nimport { uploadValidation } from './validate.js'\n\nexport type UploadFeatureProps = {\n collections?: {\n [collection: CollectionSlug]: {\n fields: Field[]\n }\n }\n /**\n * Sets a maximum population depth for this upload (not the fields for this upload), regardless of the remaining depth when the respective 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\n/**\n * Get the absolute URL for an upload URL by potentially prepending the serverURL\n */\nfunction getAbsoluteURL(url: string, payload: Payload): string {\n return url?.startsWith('http') ? url : (payload?.config?.serverURL || '') + url\n}\n\nexport const UploadFeature = createServerFeature<\n UploadFeatureProps,\n UploadFeatureProps,\n UploadFeaturePropsClient\n>({\n feature: async ({ config: _config, isRoot, parentIsLocalized, props }) => {\n if (!props) {\n props = { collections: {} }\n }\n\n const clientProps: UploadFeaturePropsClient = {\n collections: {},\n }\n if (props.collections) {\n for (const collection in props.collections) {\n clientProps.collections[collection] = {\n hasExtraFields: props.collections[collection]!.fields.length >= 1,\n }\n }\n }\n\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n collection.fields = await sanitizeFields({\n config: _config as unknown as Config,\n fields: collection.fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n }\n }\n\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#UploadFeatureClient',\n clientFeatureProps: clientProps,\n generateSchemaMap: ({ props }) => {\n if (!props?.collections) {\n return null\n }\n\n const schemaMap: FieldSchemaMap = new Map()\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n schemaMap.set(collectionKey, {\n fields: collection.fields,\n })\n }\n }\n\n return schemaMap\n },\n i18n,\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n req,\n showHiddenFields,\n }) => {\n // @ts-expect-error - for backwards-compatibility\n const id = node?.value?.id || node?.value\n\n if (req?.payload) {\n const uploadDocument: {\n value?: FileData & TypeWithID\n } = {}\n\n try {\n await populate({\n id,\n collectionSlug: node.relationTo,\n currentDepth,\n data: uploadDocument,\n depth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n showHiddenFields,\n })\n } catch (ignored) {\n // eslint-disable-next-line no-console\n console.error(\n 'Lexical upload node HTML converter: error fetching upload file',\n ignored,\n 'Node:',\n node,\n )\n return `<img />`\n }\n\n const url = getAbsoluteURL(uploadDocument?.value?.url ?? '', req?.payload)\n\n /**\n * If the upload is not an image, return a link to the upload\n */\n if (!uploadDocument?.value?.mimeType?.startsWith('image')) {\n return `<a href=\"${url}\" rel=\"noopener noreferrer\">${uploadDocument.value?.filename}</a>`\n }\n\n /**\n * If the upload is a simple image with no different sizes, return a simple img tag\n */\n if (\n !uploadDocument?.value?.sizes ||\n !Object.keys(uploadDocument?.value?.sizes).length\n ) {\n return `<img src=\"${url}\" alt=\"${uploadDocument?.value?.filename}\" width=\"${uploadDocument?.value?.width}\" height=\"${uploadDocument?.value?.height}\"/>`\n }\n\n /**\n * If the upload is an image with different sizes, return a picture element\n */\n let pictureHTML = '<picture>'\n\n // Iterate through each size in the data.sizes object\n for (const size in uploadDocument.value?.sizes) {\n const imageSize = uploadDocument.value.sizes[size] as FileSizeImproved\n\n // Skip if any property of the size object is null\n if (\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n const imageSizeURL = getAbsoluteURL(imageSize?.url, req?.payload)\n\n pictureHTML += `<source srcset=\"${imageSizeURL}\" media=\"(max-width: ${imageSize.width}px)\" type=\"${imageSize.mimeType}\">`\n }\n\n // Add the default img tag\n pictureHTML += `<img src=\"${url}\" alt=\"Image\" width=\"${uploadDocument.value?.width}\" height=\"${uploadDocument.value?.height}\">`\n pictureHTML += '</picture>'\n return pictureHTML\n } else {\n return `<img src=\"${id}\" />`\n }\n },\n nodeTypes: [UploadServerNode.getType()],\n },\n },\n getSubFields: ({ node, req }) => {\n if (!node) {\n let allSubFields: Field[] = []\n for (const collection in props?.collections) {\n const collectionFields = props.collections[collection]!.fields\n allSubFields = allSubFields.concat(collectionFields)\n }\n return allSubFields\n }\n const collection = req ? req.payload.collections[node?.relationTo] : null\n\n if (collection) {\n const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields\n\n if (Array.isArray(collectionFieldSchema)) {\n if (!collectionFieldSchema?.length) {\n return null\n }\n return collectionFieldSchema\n }\n }\n return null\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [uploadPopulationPromiseHOC(props)],\n hooks: {\n afterRead: [\n ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n populateArg,\n populationPromises,\n req,\n showHiddenFields,\n }) => {\n if (!node?.value) {\n return node\n }\n const collection = req.payload.collections[node?.relationTo]\n\n if (!collection) {\n return node\n }\n // @ts-expect-error - Fix in Payload v4\n const id = node?.value?.id || node?.value // for backwards-compatibility\n\n const populateDepth =\n props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth\n\n populationPromises.push(\n populate({\n id,\n collectionSlug: collection.config.slug,\n currentDepth,\n data: node,\n depth: populateDepth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n select:\n populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,\n showHiddenFields,\n }),\n )\n\n return node\n },\n ],\n },\n node: UploadServerNode,\n validations: [uploadValidation(props)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'upload',\n})\n"],"mappings":"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","ignoreList":[]}
@@ -38,6 +38,7 @@ export type UploadDataImproved<TUploadExtraFieldsData extends JsonObject = JsonO
38
38
  value: number | string | TypedUploadCollection[TCollectionSlug];
39
39
  };
40
40
  }[UploadCollectionSlug];
41
+ export declare function isGoogleDocCheckboxImg(img: HTMLImageElement): boolean;
41
42
  export type SerializedUploadNode = {
42
43
  children?: never;
43
44
  type: 'upload';
@@ -1 +1 @@
1
- {"version":3,"file":"UploadNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAA;AAC/F,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,OAAO,EACP,MAAM,EACP,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAA;AAMhF,MAAM,MAAM,UAAU,CAAC,sBAAsB,SAAS,UAAU,GAAG,UAAU,IAAI;KAC9E,eAAe,IAAI,cAAc,GAAG;QACnC,MAAM,EAAE,sBAAsB,CAAA;QAC9B;;WAEG;QACH,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B;;WAEG;QACH,KAAK,EAAE,sBAAsB,CAAC,eAAe,CAAC,GAAG,MAAM,GAAG,MAAM,CAAA;KACjE;CACF,CAAC,cAAc,CAAC,CAAA;AAEjB;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,CAAC,sBAAsB,SAAS,UAAU,GAAG,UAAU,IAAI;KACtF,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,sBAAsB,CAAA;QAC9B;;WAEG;QACH,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B;;WAEG;QACH,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAA;KAChE;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;CACf,GAAG,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAA;AAEpD,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,MAAM,EAAE,UAAU,CAAA;gBAEN,EACV,IAAI,EACJ,MAAM,EACN,GAAG,GACJ,EAAE;QACD,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,CAAC,EAAE,iBAAiB,CAAA;QAC1B,GAAG,CAAC,EAAE,OAAO,CAAA;KACd;WAKe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB;WAQ/C,OAAO,IAAI,MAAM;WAIjB,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;WAS/C,UAAU,CAAC,cAAc,EAAE,oBAAoB,GAAG,gBAAgB;IAsBlF,MAAM,CAAC,QAAQ,IAAI,KAAK;IAIf,QAAQ,IAAI,GAAG,CAAC,OAAO;IAIvB,SAAS,IAAI,eAAe;IAQ5B,UAAU,IAAI,oBAAoB;IAS3C,OAAO,IAAI,UAAU;IAIrB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKtB,SAAS,IAAI,KAAK;CAG5B;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;CAC/D,GAAG,gBAAgB,CAKnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACnC,IAAI,IAAI,gBAAgB,CAE1B"}
1
+ {"version":3,"file":"UploadNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAA;AAC/F,OAAO,KAAK,EACV,gBAAgB,EAEhB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,OAAO,EACP,MAAM,EACP,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAA;AAKhF,MAAM,MAAM,UAAU,CAAC,sBAAsB,SAAS,UAAU,GAAG,UAAU,IAAI;KAC9E,eAAe,IAAI,cAAc,GAAG;QACnC,MAAM,EAAE,sBAAsB,CAAA;QAC9B;;WAEG;QACH,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B;;WAEG;QACH,KAAK,EAAE,sBAAsB,CAAC,eAAe,CAAC,GAAG,MAAM,GAAG,MAAM,CAAA;KACjE;CACF,CAAC,cAAc,CAAC,CAAA;AAEjB;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,CAAC,sBAAsB,SAAS,UAAU,GAAG,UAAU,IAAI;KACtF,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,sBAAsB,CAAA;QAC9B;;WAEG;QACH,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B;;WAEG;QACH,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAA;KAChE;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAOrE;AA8BD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;CACf,GAAG,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAA;AAEpD,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,MAAM,EAAE,UAAU,CAAA;gBAEN,EACV,IAAI,EACJ,MAAM,EACN,GAAG,GACJ,EAAE;QACD,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,CAAC,EAAE,iBAAiB,CAAA;QAC1B,GAAG,CAAC,EAAE,OAAO,CAAA;KACd;WAKe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB;WAQ/C,OAAO,IAAI,MAAM;WAIjB,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;WAS/C,UAAU,CAAC,cAAc,EAAE,oBAAoB,GAAG,gBAAgB;IAsBlF,MAAM,CAAC,QAAQ,IAAI,KAAK;IAIf,QAAQ,IAAI,GAAG,CAAC,OAAO;IAKvB,SAAS,IAAI,eAAe;IAQ5B,UAAU,IAAI,oBAAoB;IAS3C,OAAO,IAAI,UAAU;IAIrB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKtB,SAAS,IAAI,KAAK;CAG5B;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;CAC/D,GAAG,gBAAgB,CAKnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACnC,IAAI,IAAI,gBAAgB,CAE1B"}
@@ -1,7 +1,36 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  import { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js';
2
3
  import ObjectID from 'bson-objectid';
3
4
  import { $applyNodeReplacement } from 'lexical';
4
- import { $convertUploadElement } from './conversions.js';
5
+ import * as React from 'react';
6
+ export function isGoogleDocCheckboxImg(img) {
7
+ return img.parentElement != null && img.parentElement.tagName === 'LI' && img.previousSibling === null && img.getAttribute('aria-roledescription') === 'checkbox';
8
+ }
9
+ function $convertUploadServerElement(domNode) {
10
+ if (domNode.hasAttribute('data-lexical-upload-relation-to') && domNode.hasAttribute('data-lexical-upload-id')) {
11
+ const id = domNode.getAttribute('data-lexical-upload-id');
12
+ const relationTo = domNode.getAttribute('data-lexical-upload-relation-to');
13
+ if (id != null && relationTo != null) {
14
+ const node = $createUploadServerNode({
15
+ data: {
16
+ fields: {},
17
+ relationTo,
18
+ value: id
19
+ }
20
+ });
21
+ return {
22
+ node
23
+ };
24
+ }
25
+ }
26
+ const img = domNode;
27
+ if (img.src.startsWith('file:///') || isGoogleDocCheckboxImg(img)) {
28
+ return null;
29
+ }
30
+ // TODO: Auto-upload functionality here!
31
+ //}
32
+ return null;
33
+ }
5
34
  export class UploadServerNode extends DecoratorBlockNode {
6
35
  __data;
7
36
  constructor({
@@ -25,7 +54,7 @@ export class UploadServerNode extends DecoratorBlockNode {
25
54
  static importDOM() {
26
55
  return {
27
56
  img: node => ({
28
- conversion: domNode => $convertUploadElement(domNode, $createUploadServerNode),
57
+ conversion: $convertUploadServerElement,
29
58
  priority: 0
30
59
  })
31
60
  };
@@ -54,7 +83,12 @@ export class UploadServerNode extends DecoratorBlockNode {
54
83
  return false;
55
84
  }
56
85
  decorate() {
57
- return null;
86
+ // @ts-expect-error
87
+ return /*#__PURE__*/_jsx(RawUploadComponent, {
88
+ data: this.__data,
89
+ format: this.__format,
90
+ nodeKey: this.getKey()
91
+ });
58
92
  }
59
93
  exportDOM() {
60
94
  const element = document.createElement('img');
@@ -1 +1 @@
1
- {"version":3,"file":"UploadNode.js","names":["DecoratorBlockNode","ObjectID","$applyNodeReplacement","$convertUploadElement","UploadServerNode","__data","constructor","data","format","key","clone","node","__format","__key","getType","importDOM","img","conversion","domNode","$createUploadServerNode","priority","importJSON","serializedNode","version","value","id","default","toHexString","importedData","fields","relationTo","setFormat","isInline","decorate","exportDOM","element","document","createElement","setAttribute","String","exportJSON","getData","type","getLatest","setData","writable","getWritable","updateDOM","$isUploadServerNode"],"sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"sourcesContent":["import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type {\n DOMConversionMap,\n DOMExportOutput,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n Spread,\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 ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\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 * 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 = {\n children?: never // required so that our typed editor state doesn't automatically add children\n type: 'upload'\n} & Spread<UploadData, SerializedDecoratorBlockNode>\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: UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\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 decorate(): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n element.setAttribute('data-lexical-upload-id', String(this.__data?.value))\n element.setAttribute('data-lexical-upload-relation-to', this.__data?.relationTo)\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"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"UploadNode.js","names":["DecoratorBlockNode","ObjectID","$applyNodeReplacement","React","isGoogleDocCheckboxImg","img","parentElement","tagName","previousSibling","getAttribute","$convertUploadServerElement","domNode","hasAttribute","id","relationTo","node","$createUploadServerNode","data","fields","value","src","startsWith","UploadServerNode","__data","constructor","format","key","clone","__format","__key","getType","importDOM","conversion","priority","importJSON","serializedNode","version","default","toHexString","importedData","setFormat","isInline","decorate","_jsx","RawUploadComponent","nodeKey","getKey","exportDOM","element","document","createElement","setAttribute","String","exportJSON","getData","type","getLatest","setData","writable","getWritable","updateDOM","$isUploadServerNode"],"sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"sourcesContent":["import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n Spread,\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 ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\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 * 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 function isGoogleDocCheckboxImg(img: HTMLImageElement): boolean {\n return (\n img.parentElement != null &&\n img.parentElement.tagName === 'LI' &&\n img.previousSibling === null &&\n img.getAttribute('aria-roledescription') === 'checkbox'\n )\n}\n\nfunction $convertUploadServerElement(domNode: HTMLImageElement): DOMConversionOutput | null {\n if (\n domNode.hasAttribute('data-lexical-upload-relation-to') &&\n domNode.hasAttribute('data-lexical-upload-id')\n ) {\n const id = domNode.getAttribute('data-lexical-upload-id')\n const relationTo = domNode.getAttribute('data-lexical-upload-relation-to')\n\n if (id != null && relationTo != null) {\n const node = $createUploadServerNode({\n data: {\n fields: {},\n relationTo,\n value: id,\n },\n })\n return { node }\n }\n }\n const img = domNode\n if (img.src.startsWith('file:///') || isGoogleDocCheckboxImg(img)) {\n return null\n }\n // TODO: Auto-upload functionality here!\n //}\n return null\n}\n\nexport type SerializedUploadNode = {\n children?: never // required so that our typed editor state doesn't automatically add children\n type: 'upload'\n} & Spread<UploadData, SerializedDecoratorBlockNode>\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: $convertUploadServerElement,\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: UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\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 decorate(): JSX.Element {\n // @ts-expect-error\n return <RawUploadComponent data={this.__data} format={this.__format} nodeKey={this.getKey()} />\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n element.setAttribute('data-lexical-upload-id', String(this.__data?.value))\n element.setAttribute('data-lexical-upload-relation-to', this.__data?.relationTo)\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"],"mappings":"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","ignoreList":[]}