@payloadcms/richtext-lexical 3.29.0-internal.2984e42 → 3.29.0-internal.9400be9

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 (31) hide show
  1. package/dist/exports/client/{Field-5SZDDPZE.js → Field-MAUKSOAP.js} +2 -2
  2. package/dist/exports/client/bundled.css +1 -1
  3. package/dist/exports/client/chunk-DOZWITPU.js +12 -0
  4. package/dist/exports/client/chunk-DOZWITPU.js.map +7 -0
  5. package/dist/exports/client/index.js +10 -10
  6. package/dist/exports/client/index.js.map +4 -4
  7. package/dist/features/converters/lexicalToHtml/async/converters/upload.js.map +1 -1
  8. package/dist/features/converters/lexicalToHtml/sync/converters/upload.js.map +1 -1
  9. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.d.ts.map +1 -1
  10. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +2 -3
  11. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  12. package/dist/features/indent/client/index.d.ts +2 -1
  13. package/dist/features/indent/client/index.d.ts.map +1 -1
  14. package/dist/features/indent/client/index.js +41 -19
  15. package/dist/features/indent/client/index.js.map +1 -1
  16. package/dist/field/bundled.css +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/packages/@lexical/markdown/MarkdownExport.js +4 -0
  21. package/dist/packages/@lexical/markdown/MarkdownExport.js.map +1 -1
  22. package/dist/packages/@lexical/markdown/MarkdownImport.d.ts.map +1 -1
  23. package/dist/packages/@lexical/markdown/MarkdownImport.js +8 -6
  24. package/dist/packages/@lexical/markdown/MarkdownImport.js.map +1 -1
  25. package/dist/packages/@lexical/markdown/importTextTransformers.d.ts.map +1 -1
  26. package/dist/packages/@lexical/markdown/importTextTransformers.js +4 -5
  27. package/dist/packages/@lexical/markdown/importTextTransformers.js.map +1 -1
  28. package/package.json +18 -18
  29. package/dist/exports/client/chunk-XO6X2M3F.js +0 -12
  30. package/dist/exports/client/chunk-XO6X2M3F.js.map +0 -7
  31. /package/dist/exports/client/{Field-5SZDDPZE.js.map → Field-MAUKSOAP.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","names":["UploadHTMLConverterAsync","upload","node","populate","providedStyleTag","uploadNode","uploadDoc","undefined","value","id","collectionSlug","relationTo","url","mimeType","startsWith","filename","sizes","Object","keys","length","height","width","pictureHTML","size","imageSize","filesize"],"sources":["../../../../../../src/features/converters/lexicalToHtml/async/converters/upload.ts"],"sourcesContent":["import type { FileData, FileSizeImproved, TypeWithID } from 'payload'\n\nimport type { SerializedUploadNode } from '../../../../../nodeTypes.js'\nimport type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.jsx'\nimport type { HTMLConvertersAsync } from '../types.js'\n\nexport const UploadHTMLConverterAsync: HTMLConvertersAsync<SerializedUploadNode> = {\n upload: async ({ node, populate, providedStyleTag }) => {\n const uploadNode = node as UploadDataImproved\n\n let uploadDoc: (FileData & TypeWithID) | undefined = undefined\n\n // If there's no valid upload data, populate return an empty string\n if (typeof uploadNode.value !== 'object') {\n if (!populate) {\n return ''\n }\n uploadDoc = await populate<FileData & TypeWithID>({\n id: uploadNode.value,\n collectionSlug: uploadNode.relationTo,\n })\n } else {\n uploadDoc = uploadNode.value as unknown as FileData & TypeWithID\n }\n\n if (!uploadDoc) {\n return ''\n }\n\n const url = uploadDoc.url\n\n // 1) If upload is NOT an image, return a link\n if (!uploadDoc.mimeType.startsWith('image')) {\n return `<a${providedStyleTag} href=\"${url}\" rel=\"noopener noreferrer\">${uploadDoc.filename}</a$>`\n }\n\n // 2) If image has no different sizes, return a simple <img />\n if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) {\n return `\n <img${providedStyleTag}\n alt=\"${uploadDoc.filename}\"\n height=\"${uploadDoc.height}\"\n src=\"${url}\"\n width=\"${uploadDoc.width}\"\n />\n `\n }\n\n // 3) If image has different sizes, build a <picture> element with <source> tags\n let pictureHTML = ''\n\n for (const size in uploadDoc.sizes) {\n const imageSize = uploadDoc.sizes[size] as FileSizeImproved\n\n if (\n !imageSize ||\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n\n pictureHTML += `\n <source\n media=\"(max-width: ${imageSize.width}px)\"\n srcset=\"${imageSize.url}\"\n type=\"${imageSize.mimeType}\"\n />\n `\n }\n\n pictureHTML += `\n <img\n alt=\"${uploadDoc.filename}\"\n height=\"${uploadDoc.height}\"\n src=\"${url}\"\n width=\"${uploadDoc.width}\"\n />\n `\n\n return `<picture${providedStyleTag}>${pictureHTML}</picture$>`\n },\n}\n"],"mappings":"AAMA,OAAO,MAAMA,wBAAA,GAAsE;EACjFC,MAAA,EAAQ,MAAAA,CAAO;IAAEC,IAAI;IAAEC,QAAQ;IAAEC;EAAgB,CAAE;IACjD,MAAMC,UAAA,GAAaH,IAAA;IAEnB,IAAII,SAAA,GAAiDC,SAAA;IAErD;IACA,IAAI,OAAOF,UAAA,CAAWG,KAAK,KAAK,UAAU;MACxC,IAAI,CAACL,QAAA,EAAU;QACb,OAAO;MACT;MACAG,SAAA,GAAY,MAAMH,QAAA,CAAgC;QAChDM,EAAA,EAAIJ,UAAA,CAAWG,KAAK;QACpBE,cAAA,EAAgBL,UAAA,CAAWM;MAC7B;IACF,OAAO;MACLL,SAAA,GAAYD,UAAA,CAAWG,KAAK;IAC9B;IAEA,IAAI,CAACF,SAAA,EAAW;MACd,OAAO;IACT;IAEA,MAAMM,GAAA,GAAMN,SAAA,CAAUM,GAAG;IAEzB;IACA,IAAI,CAACN,SAAA,CAAUO,QAAQ,CAACC,UAAU,CAAC,UAAU;MAC3C,OAAO,KAAKV,gBAAA,UAA0BQ,GAAA,+BAAkCN,SAAA,CAAUS,QAAQ,OAAO;IACnG;IAEA;IACA,IAAI,CAACT,SAAA,CAAUU,KAAK,IAAI,CAACC,MAAA,CAAOC,IAAI,CAACZ,SAAA,CAAUU,KAAK,EAAEG,MAAM,EAAE;MAC5D,OAAO;cACCf,gBAAA;iBACGE,SAAA,CAAUS,QAAQ;oBACfT,SAAA,CAAUc,MAAM;iBACnBR,GAAA;mBACEN,SAAA,CAAUe,KAAK;;OAE3B;IACH;IAEA;IACA,IAAIC,WAAA,GAAc;IAElB,KAAK,MAAMC,IAAA,IAAQjB,SAAA,CAAUU,KAAK,EAAE;MAClC,MAAMQ,SAAA,GAAYlB,SAAA,CAAUU,KAAK,CAACO,IAAA,CAAK;MAEvC,IACE,CAACC,SAAA,IACD,CAACA,SAAA,CAAUH,KAAK,IAChB,CAACG,SAAA,CAAUJ,MAAM,IACjB,CAACI,SAAA,CAAUX,QAAQ,IACnB,CAACW,SAAA,CAAUC,QAAQ,IACnB,CAACD,SAAA,CAAUT,QAAQ,IACnB,CAACS,SAAA,CAAUZ,GAAG,EACd;QACA;MACF;MAEAU,WAAA,IAAe;;+BAEUE,SAAA,CAAUH,KAAK;oBAC1BG,SAAA,CAAUZ,GAAG;kBACfY,SAAA,CAAUX,QAAQ;;OAE7B;IACH;IAEAS,WAAA,IAAe;;eAEJhB,SAAA,CAAUS,QAAQ;kBACfT,SAAA,CAAUc,MAAM;eACnBR,GAAA;iBACEN,SAAA,CAAUe,KAAK;;KAE3B;IAED,OAAO,WAAWjB,gBAAA,IAAoBkB,WAAA,aAAwB;EAChE;AACF","ignoreList":[]}
1
+ {"version":3,"file":"upload.js","names":["UploadHTMLConverterAsync","upload","node","populate","providedStyleTag","uploadNode","uploadDoc","undefined","value","id","collectionSlug","relationTo","url","mimeType","startsWith","filename","sizes","Object","keys","length","height","width","pictureHTML","size","imageSize","filesize"],"sources":["../../../../../../src/features/converters/lexicalToHtml/async/converters/upload.ts"],"sourcesContent":["import type { FileData, FileSizeImproved, TypeWithID } from 'payload'\n\nimport type { SerializedUploadNode } from '../../../../../nodeTypes.js'\nimport type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js'\nimport type { HTMLConvertersAsync } from '../types.js'\n\nexport const UploadHTMLConverterAsync: HTMLConvertersAsync<SerializedUploadNode> = {\n upload: async ({ node, populate, providedStyleTag }) => {\n const uploadNode = node as UploadDataImproved\n\n let uploadDoc: (FileData & TypeWithID) | undefined = undefined\n\n // If there's no valid upload data, populate return an empty string\n if (typeof uploadNode.value !== 'object') {\n if (!populate) {\n return ''\n }\n uploadDoc = await populate<FileData & TypeWithID>({\n id: uploadNode.value,\n collectionSlug: uploadNode.relationTo,\n })\n } else {\n uploadDoc = uploadNode.value as unknown as FileData & TypeWithID\n }\n\n if (!uploadDoc) {\n return ''\n }\n\n const url = uploadDoc.url\n\n // 1) If upload is NOT an image, return a link\n if (!uploadDoc.mimeType.startsWith('image')) {\n return `<a${providedStyleTag} href=\"${url}\" rel=\"noopener noreferrer\">${uploadDoc.filename}</a$>`\n }\n\n // 2) If image has no different sizes, return a simple <img />\n if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) {\n return `\n <img${providedStyleTag}\n alt=\"${uploadDoc.filename}\"\n height=\"${uploadDoc.height}\"\n src=\"${url}\"\n width=\"${uploadDoc.width}\"\n />\n `\n }\n\n // 3) If image has different sizes, build a <picture> element with <source> tags\n let pictureHTML = ''\n\n for (const size in uploadDoc.sizes) {\n const imageSize = uploadDoc.sizes[size] as FileSizeImproved\n\n if (\n !imageSize ||\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n\n pictureHTML += `\n <source\n media=\"(max-width: ${imageSize.width}px)\"\n srcset=\"${imageSize.url}\"\n type=\"${imageSize.mimeType}\"\n />\n `\n }\n\n pictureHTML += `\n <img\n alt=\"${uploadDoc.filename}\"\n height=\"${uploadDoc.height}\"\n src=\"${url}\"\n width=\"${uploadDoc.width}\"\n />\n `\n\n return `<picture${providedStyleTag}>${pictureHTML}</picture$>`\n },\n}\n"],"mappings":"AAMA,OAAO,MAAMA,wBAAA,GAAsE;EACjFC,MAAA,EAAQ,MAAAA,CAAO;IAAEC,IAAI;IAAEC,QAAQ;IAAEC;EAAgB,CAAE;IACjD,MAAMC,UAAA,GAAaH,IAAA;IAEnB,IAAII,SAAA,GAAiDC,SAAA;IAErD;IACA,IAAI,OAAOF,UAAA,CAAWG,KAAK,KAAK,UAAU;MACxC,IAAI,CAACL,QAAA,EAAU;QACb,OAAO;MACT;MACAG,SAAA,GAAY,MAAMH,QAAA,CAAgC;QAChDM,EAAA,EAAIJ,UAAA,CAAWG,KAAK;QACpBE,cAAA,EAAgBL,UAAA,CAAWM;MAC7B;IACF,OAAO;MACLL,SAAA,GAAYD,UAAA,CAAWG,KAAK;IAC9B;IAEA,IAAI,CAACF,SAAA,EAAW;MACd,OAAO;IACT;IAEA,MAAMM,GAAA,GAAMN,SAAA,CAAUM,GAAG;IAEzB;IACA,IAAI,CAACN,SAAA,CAAUO,QAAQ,CAACC,UAAU,CAAC,UAAU;MAC3C,OAAO,KAAKV,gBAAA,UAA0BQ,GAAA,+BAAkCN,SAAA,CAAUS,QAAQ,OAAO;IACnG;IAEA;IACA,IAAI,CAACT,SAAA,CAAUU,KAAK,IAAI,CAACC,MAAA,CAAOC,IAAI,CAACZ,SAAA,CAAUU,KAAK,EAAEG,MAAM,EAAE;MAC5D,OAAO;cACCf,gBAAA;iBACGE,SAAA,CAAUS,QAAQ;oBACfT,SAAA,CAAUc,MAAM;iBACnBR,GAAA;mBACEN,SAAA,CAAUe,KAAK;;OAE3B;IACH;IAEA;IACA,IAAIC,WAAA,GAAc;IAElB,KAAK,MAAMC,IAAA,IAAQjB,SAAA,CAAUU,KAAK,EAAE;MAClC,MAAMQ,SAAA,GAAYlB,SAAA,CAAUU,KAAK,CAACO,IAAA,CAAK;MAEvC,IACE,CAACC,SAAA,IACD,CAACA,SAAA,CAAUH,KAAK,IAChB,CAACG,SAAA,CAAUJ,MAAM,IACjB,CAACI,SAAA,CAAUX,QAAQ,IACnB,CAACW,SAAA,CAAUC,QAAQ,IACnB,CAACD,SAAA,CAAUT,QAAQ,IACnB,CAACS,SAAA,CAAUZ,GAAG,EACd;QACA;MACF;MAEAU,WAAA,IAAe;;+BAEUE,SAAA,CAAUH,KAAK;oBAC1BG,SAAA,CAAUZ,GAAG;kBACfY,SAAA,CAAUX,QAAQ;;OAE7B;IACH;IAEAS,WAAA,IAAe;;eAEJhB,SAAA,CAAUS,QAAQ;kBACfT,SAAA,CAAUc,MAAM;eACnBR,GAAA;iBACEN,SAAA,CAAUe,KAAK;;KAE3B;IAED,OAAO,WAAWjB,gBAAA,IAAoBkB,WAAA,aAAwB;EAChE;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","names":["UploadHTMLConverter","upload","node","providedStyleTag","uploadNode","uploadDoc","undefined","value","url","mimeType","startsWith","filename","sizes","Object","keys","length","height","width","pictureHTML","size","imageSize","filesize"],"sources":["../../../../../../src/features/converters/lexicalToHtml/sync/converters/upload.ts"],"sourcesContent":["import type { FileData, FileSizeImproved, TypeWithID } from 'payload'\n\nimport type { SerializedUploadNode } from '../../../../../nodeTypes.js'\nimport type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.jsx'\nimport type { HTMLConverters } from '../types.js'\n\nexport const UploadHTMLConverter: HTMLConverters<SerializedUploadNode> = {\n upload: ({ node, providedStyleTag }) => {\n const uploadNode = node as UploadDataImproved\n\n let uploadDoc: (FileData & TypeWithID) | undefined = undefined\n\n // If there's no valid upload data, populate return an empty string\n if (typeof uploadNode.value !== 'object') {\n return ''\n } else {\n uploadDoc = uploadNode.value as unknown as FileData & TypeWithID\n }\n\n if (!uploadDoc) {\n return ''\n }\n\n const url = uploadDoc.url\n\n // 1) If upload is NOT an image, return a link\n if (!uploadDoc.mimeType.startsWith('image')) {\n return `<a${providedStyleTag} href=\"${url}\" rel=\"noopener noreferrer\">${uploadDoc.filename}</a$>`\n }\n\n // 2) If image has no different sizes, return a simple <img />\n if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) {\n return `\n <img${providedStyleTag}\n alt=\"${uploadDoc.filename}\"\n height=\"${uploadDoc.height}\"\n src=\"${url}\"\n width=\"${uploadDoc.width}\"\n />\n `\n }\n\n // 3) If image has different sizes, build a <picture> element with <source> tags\n let pictureHTML = ''\n\n for (const size in uploadDoc.sizes) {\n const imageSize = uploadDoc.sizes[size] as FileSizeImproved\n\n if (\n !imageSize ||\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n\n pictureHTML += `\n <source\n media=\"(max-width: ${imageSize.width}px)\"\n srcset=\"${imageSize.url}\"\n type=\"${imageSize.mimeType}\"\n />\n `\n }\n\n pictureHTML += `\n <img\n alt=\"${uploadDoc.filename}\"\n height=\"${uploadDoc.height}\"\n src=\"${url}\"\n width=\"${uploadDoc.width}\"\n />\n `\n\n return `<picture${providedStyleTag}>${pictureHTML}</picture$>`\n },\n}\n"],"mappings":"AAMA,OAAO,MAAMA,mBAAA,GAA4D;EACvEC,MAAA,EAAQA,CAAC;IAAEC,IAAI;IAAEC;EAAgB,CAAE;IACjC,MAAMC,UAAA,GAAaF,IAAA;IAEnB,IAAIG,SAAA,GAAiDC,SAAA;IAErD;IACA,IAAI,OAAOF,UAAA,CAAWG,KAAK,KAAK,UAAU;MACxC,OAAO;IACT,OAAO;MACLF,SAAA,GAAYD,UAAA,CAAWG,KAAK;IAC9B;IAEA,IAAI,CAACF,SAAA,EAAW;MACd,OAAO;IACT;IAEA,MAAMG,GAAA,GAAMH,SAAA,CAAUG,GAAG;IAEzB;IACA,IAAI,CAACH,SAAA,CAAUI,QAAQ,CAACC,UAAU,CAAC,UAAU;MAC3C,OAAO,KAAKP,gBAAA,UAA0BK,GAAA,+BAAkCH,SAAA,CAAUM,QAAQ,OAAO;IACnG;IAEA;IACA,IAAI,CAACN,SAAA,CAAUO,KAAK,IAAI,CAACC,MAAA,CAAOC,IAAI,CAACT,SAAA,CAAUO,KAAK,EAAEG,MAAM,EAAE;MAC5D,OAAO;cACCZ,gBAAA;iBACGE,SAAA,CAAUM,QAAQ;oBACfN,SAAA,CAAUW,MAAM;iBACnBR,GAAA;mBACEH,SAAA,CAAUY,KAAK;;OAE3B;IACH;IAEA;IACA,IAAIC,WAAA,GAAc;IAElB,KAAK,MAAMC,IAAA,IAAQd,SAAA,CAAUO,KAAK,EAAE;MAClC,MAAMQ,SAAA,GAAYf,SAAA,CAAUO,KAAK,CAACO,IAAA,CAAK;MAEvC,IACE,CAACC,SAAA,IACD,CAACA,SAAA,CAAUH,KAAK,IAChB,CAACG,SAAA,CAAUJ,MAAM,IACjB,CAACI,SAAA,CAAUX,QAAQ,IACnB,CAACW,SAAA,CAAUC,QAAQ,IACnB,CAACD,SAAA,CAAUT,QAAQ,IACnB,CAACS,SAAA,CAAUZ,GAAG,EACd;QACA;MACF;MAEAU,WAAA,IAAe;;+BAEUE,SAAA,CAAUH,KAAK;oBAC1BG,SAAA,CAAUZ,GAAG;kBACfY,SAAA,CAAUX,QAAQ;;OAE7B;IACH;IAEAS,WAAA,IAAe;;eAEJb,SAAA,CAAUM,QAAQ;kBACfN,SAAA,CAAUW,MAAM;eACnBR,GAAA;iBACEH,SAAA,CAAUY,KAAK;;KAE3B;IAED,OAAO,WAAWd,gBAAA,IAAoBe,WAAA,aAAwB;EAChE;AACF","ignoreList":[]}
1
+ {"version":3,"file":"upload.js","names":["UploadHTMLConverter","upload","node","providedStyleTag","uploadNode","uploadDoc","undefined","value","url","mimeType","startsWith","filename","sizes","Object","keys","length","height","width","pictureHTML","size","imageSize","filesize"],"sources":["../../../../../../src/features/converters/lexicalToHtml/sync/converters/upload.ts"],"sourcesContent":["import type { FileData, FileSizeImproved, TypeWithID } from 'payload'\n\nimport type { SerializedUploadNode } from '../../../../../nodeTypes.js'\nimport type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js'\nimport type { HTMLConverters } from '../types.js'\n\nexport const UploadHTMLConverter: HTMLConverters<SerializedUploadNode> = {\n upload: ({ node, providedStyleTag }) => {\n const uploadNode = node as UploadDataImproved\n\n let uploadDoc: (FileData & TypeWithID) | undefined = undefined\n\n // If there's no valid upload data, populate return an empty string\n if (typeof uploadNode.value !== 'object') {\n return ''\n } else {\n uploadDoc = uploadNode.value as unknown as FileData & TypeWithID\n }\n\n if (!uploadDoc) {\n return ''\n }\n\n const url = uploadDoc.url\n\n // 1) If upload is NOT an image, return a link\n if (!uploadDoc.mimeType.startsWith('image')) {\n return `<a${providedStyleTag} href=\"${url}\" rel=\"noopener noreferrer\">${uploadDoc.filename}</a$>`\n }\n\n // 2) If image has no different sizes, return a simple <img />\n if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) {\n return `\n <img${providedStyleTag}\n alt=\"${uploadDoc.filename}\"\n height=\"${uploadDoc.height}\"\n src=\"${url}\"\n width=\"${uploadDoc.width}\"\n />\n `\n }\n\n // 3) If image has different sizes, build a <picture> element with <source> tags\n let pictureHTML = ''\n\n for (const size in uploadDoc.sizes) {\n const imageSize = uploadDoc.sizes[size] as FileSizeImproved\n\n if (\n !imageSize ||\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n\n pictureHTML += `\n <source\n media=\"(max-width: ${imageSize.width}px)\"\n srcset=\"${imageSize.url}\"\n type=\"${imageSize.mimeType}\"\n />\n `\n }\n\n pictureHTML += `\n <img\n alt=\"${uploadDoc.filename}\"\n height=\"${uploadDoc.height}\"\n src=\"${url}\"\n width=\"${uploadDoc.width}\"\n />\n `\n\n return `<picture${providedStyleTag}>${pictureHTML}</picture$>`\n },\n}\n"],"mappings":"AAMA,OAAO,MAAMA,mBAAA,GAA4D;EACvEC,MAAA,EAAQA,CAAC;IAAEC,IAAI;IAAEC;EAAgB,CAAE;IACjC,MAAMC,UAAA,GAAaF,IAAA;IAEnB,IAAIG,SAAA,GAAiDC,SAAA;IAErD;IACA,IAAI,OAAOF,UAAA,CAAWG,KAAK,KAAK,UAAU;MACxC,OAAO;IACT,OAAO;MACLF,SAAA,GAAYD,UAAA,CAAWG,KAAK;IAC9B;IAEA,IAAI,CAACF,SAAA,EAAW;MACd,OAAO;IACT;IAEA,MAAMG,GAAA,GAAMH,SAAA,CAAUG,GAAG;IAEzB;IACA,IAAI,CAACH,SAAA,CAAUI,QAAQ,CAACC,UAAU,CAAC,UAAU;MAC3C,OAAO,KAAKP,gBAAA,UAA0BK,GAAA,+BAAkCH,SAAA,CAAUM,QAAQ,OAAO;IACnG;IAEA;IACA,IAAI,CAACN,SAAA,CAAUO,KAAK,IAAI,CAACC,MAAA,CAAOC,IAAI,CAACT,SAAA,CAAUO,KAAK,EAAEG,MAAM,EAAE;MAC5D,OAAO;cACCZ,gBAAA;iBACGE,SAAA,CAAUM,QAAQ;oBACfN,SAAA,CAAUW,MAAM;iBACnBR,GAAA;mBACEH,SAAA,CAAUY,KAAK;;OAE3B;IACH;IAEA;IACA,IAAIC,WAAA,GAAc;IAElB,KAAK,MAAMC,IAAA,IAAQd,SAAA,CAAUO,KAAK,EAAE;MAClC,MAAMQ,SAAA,GAAYf,SAAA,CAAUO,KAAK,CAACO,IAAA,CAAK;MAEvC,IACE,CAACC,SAAA,IACD,CAACA,SAAA,CAAUH,KAAK,IAChB,CAACG,SAAA,CAAUJ,MAAM,IACjB,CAACI,SAAA,CAAUX,QAAQ,IACnB,CAACW,SAAA,CAAUC,QAAQ,IACnB,CAACD,SAAA,CAAUT,QAAQ,IACnB,CAACS,SAAA,CAAUZ,GAAG,EACd;QACA;MACF;MAEAU,WAAA,IAAe;;+BAEUE,SAAA,CAAUH,KAAK;oBAC1BG,SAAA,CAAUZ,GAAG;kBACfY,SAAA,CAAUX,QAAQ;;OAE7B;IACH;IAEAS,WAAA,IAAe;;eAEJb,SAAA,CAAUM,QAAQ;kBACfN,SAAA,CAAUW,MAAM;eACnBR,GAAA;iBACEH,SAAA,CAAUY,KAAK;;KAE3B;IAED,OAAO,WAAWd,gBAAA,IAAoBe,WAAA,aAAwB;EAChE;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAE3E,OAAO,cAAc,CAAA;AAovBrB,eAAO,MAAM,qBAAqB,EAAE,yBAQnC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAE3E,OAAO,cAAc,CAAA;AAmvBrB,eAAO,MAAM,qBAAqB,EAAE,yBAQnC,CAAA"}
@@ -7,7 +7,7 @@ import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
7
7
  import { $computeTableMapSkipCellCheck, $deleteTableColumn__EXPERIMENTAL, $deleteTableRow__EXPERIMENTAL, $getNodeTriplet, $getTableCellNodeFromLexicalNode, $getTableColumnIndexFromTableCellNode, $getTableNodeFromLexicalNodeOrThrow, $getTableRowIndexFromTableCellNode, $insertTableColumn__EXPERIMENTAL, $insertTableRow__EXPERIMENTAL, $isTableCellNode, $isTableSelection, $unmergeCell, getTableElement, getTableObserverFromTableElement, TableCellHeaderStates, TableCellNode } from '@lexical/table';
8
8
  import { mergeRegister } from '@lexical/utils';
9
9
  import { useScrollInfo } from '@payloadcms/ui';
10
- import { $createParagraphNode, $getRoot, $getSelection, $isElementNode, $isParagraphNode, $isRangeSelection, $isTextNode, COMMAND_PRIORITY_CRITICAL, getDOMSelection, isDOMNode, SELECTION_CHANGE_COMMAND } from 'lexical';
10
+ import { $createParagraphNode, $getSelection, $isElementNode, $isParagraphNode, $isRangeSelection, $isTextNode, $setSelection, COMMAND_PRIORITY_CRITICAL, getDOMSelection, isDOMNode, SELECTION_CHANGE_COMMAND } from 'lexical';
11
11
  import * as React from 'react';
12
12
  import { useCallback, useEffect, useRef, useState } from 'react';
13
13
  import { createPortal } from 'react-dom';
@@ -139,8 +139,7 @@ function TableActionMenu({
139
139
  tableNode.markDirty();
140
140
  updateTableCellNode(tableCellNode.getLatest());
141
141
  }
142
- const rootNode = $getRoot();
143
- rootNode.selectStart();
142
+ $setSelection(null);
144
143
  });
145
144
  }, [editor, tableCellNode]);
146
145
  const mergeTableCellsAtSelection = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$deleteTableColumn__EXPERIMENTAL","$deleteTableRow__EXPERIMENTAL","$getNodeTriplet","$getTableCellNodeFromLexicalNode","$getTableColumnIndexFromTableCellNode","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$insertTableColumn__EXPERIMENTAL","$insertTableRow__EXPERIMENTAL","$isTableCellNode","$isTableSelection","$unmergeCell","getTableElement","getTableObserverFromTableElement","TableCellHeaderStates","TableCellNode","mergeRegister","useScrollInfo","$createParagraphNode","$getRoot","$getSelection","$isElementNode","$isParagraphNode","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_CRITICAL","getDOMSelection","isDOMNode","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","createPortal","MeatballsIcon","computeSelectionCount","selection","selectionShape","getShape","columns","toX","fromX","rows","toY","fromY","$canUnmerge","isCollapsed","anchor","is","focus","cell","__colSpan","__rowSpan","$cellContainsEmptyParagraph","getChildrenSize","firstChild","getFirstChildOrThrow","isEmpty","$selectLastDescendant","node","lastDescendant","getLastDescendant","select","selectEnd","selectNext","TableActionMenu","cellMerge","contextRef","onClose","setIsMenuOpen","tableCellNode","_tableCellNode","editor","dropDownRef","updateTableCellNode","selectionCounts","updateSelectionCounts","canMergeCells","setCanMergeCells","canUnmergeCell","setCanUnmergeCell","y","registerMutationListener","nodeMutations","nodeUpdated","get","getKey","getEditorState","read","getLatest","skipInitialization","currentSelectionCounts","menuButtonElement","current","dropDownElement","rootElement","getRootElement","rootEleRect","getBoundingClientRect","menuButtonRect","style","opacity","dropDownElementRect","margin","leftPosition","right","width","window","innerWidth","position","left","pageXOffset","topPosition","top","height","innerHeight","bottom","handleClickOutside","event","target","contains","addEventListener","removeEventListener","clearTableSelection","update","isAttached","tableNode","tableElement","getElementByKey","Error","tableObserver","$clearHighlight","markDirty","rootNode","selectStart","mergeTableCellsAtSelection","nodes","getNodes","tableCells","filter","length","gridMap","minRow","Infinity","maxRow","minCol","maxCol","processedCells","Set","row","mapCell","cellKey","has","some","add","cellStartRow","startRow","cellStartCol","startColumn","cellRowSpan","cellColSpan","Math","min","max","totalRowSpan","totalColSpan","targetCellMap","targetCell","setColSpan","setRowSpan","seenCells","col","currentCell","key","append","getChildren","remove","unmergeTableCellsAtSelection","insertTableRowAtSelection","shouldInsertAfter","i","insertTableColumnAtSelection","deleteTableRowAtSelection","deleteTableAtSelection","deleteTableColumnAtSelection","toggleTableRowIsHeader","tableRowIndex","rowCells","newStyle","getHeaderStyles","ROW","setHeaderStyles","toggleTableColumnIsHeader","tableColumnIndex","columnCells","COLUMN","toggleRowStriping","setRowStriping","getRowStriping","toggleFirstColumnFreeze","setFrozenColumns","getFrozenColumns","mergeCellButton","_jsx","className","onClick","type","_jsxs","e","stopPropagation","ref","Fragment","__headerState","document","body","TableCellActionMenuContainer","anchorElem","menuButtonRef","menuRootRef","isMenuOpen","setTableMenuCellNode","$moveMenu","menu","nativeSelection","_window","activeElement","disable","classList","tableCellParentNodeDOM","anchorNode","tableCellNodeFromSelection","getNode","enabled","isSelecting","toggle","tableCellRect","anchorRect","transform","timeoutId","undefined","callback","delayedCallback","setTimeout","registerUpdateListener","registerCommand","registerRootListener","prevRootElement","clearTimeout","prevTableCellDOM","TableActionMenuPlugin","t0","$","isEditable","t1"],"sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableObserver, TableSelection } from '@lexical/table'\nimport type { ElementNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $deleteTableColumn__EXPERIMENTAL,\n $deleteTableRow__EXPERIMENTAL,\n $getNodeTriplet,\n $getTableCellNodeFromLexicalNode,\n $getTableColumnIndexFromTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumn__EXPERIMENTAL,\n $insertTableRow__EXPERIMENTAL,\n $isTableCellNode,\n $isTableSelection,\n $unmergeCell,\n getTableElement,\n getTableObserverFromTableElement,\n TableCellHeaderStates,\n TableCellNode,\n} from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { useScrollInfo } from '@payloadcms/ui'\nimport {\n $createParagraphNode,\n $getRoot,\n $getSelection,\n $isElementNode,\n $isParagraphNode,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_CRITICAL,\n getDOMSelection,\n isDOMNode,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\n\nimport './index.scss'\nimport { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'\n\nfunction computeSelectionCount(selection: TableSelection): {\n columns: number\n rows: number\n} {\n const selectionShape = selection.getShape()\n return {\n columns: selectionShape.toX - selectionShape.fromX + 1,\n rows: selectionShape.toY - selectionShape.fromY + 1,\n }\n}\n\nfunction $canUnmerge(): boolean {\n const selection = $getSelection()\n if (\n ($isRangeSelection(selection) && !selection.isCollapsed()) ||\n ($isTableSelection(selection) && !selection.anchor.is(selection.focus)) ||\n (!$isRangeSelection(selection) && !$isTableSelection(selection))\n ) {\n return false\n }\n const [cell] = $getNodeTriplet(selection.anchor)\n return cell.__colSpan > 1 || cell.__rowSpan > 1\n}\n\nfunction $cellContainsEmptyParagraph(cell: TableCellNode): boolean {\n if (cell.getChildrenSize() !== 1) {\n return false\n }\n const firstChild = cell.getFirstChildOrThrow()\n if (!$isParagraphNode(firstChild) || !firstChild.isEmpty()) {\n return false\n }\n return true\n}\n\nfunction $selectLastDescendant(node: ElementNode): void {\n const lastDescendant = node.getLastDescendant()\n if ($isTextNode(lastDescendant)) {\n lastDescendant.select()\n } else if ($isElementNode(lastDescendant)) {\n lastDescendant.selectEnd()\n } else if (lastDescendant !== null) {\n lastDescendant.selectNext()\n }\n}\n\ntype TableCellActionMenuProps = Readonly<{\n cellMerge: boolean\n contextRef: { current: HTMLElement | null }\n onClose: () => void\n setIsMenuOpen: (isOpen: boolean) => void\n tableCellNode: TableCellNode\n}>\n\nfunction TableActionMenu({\n cellMerge,\n contextRef,\n onClose,\n setIsMenuOpen,\n tableCellNode: _tableCellNode,\n}: TableCellActionMenuProps) {\n const [editor] = useLexicalComposerContext()\n const dropDownRef = useRef<HTMLDivElement | null>(null)\n const [tableCellNode, updateTableCellNode] = useState(_tableCellNode)\n const [selectionCounts, updateSelectionCounts] = useState({\n columns: 1,\n rows: 1,\n })\n const [canMergeCells, setCanMergeCells] = useState(false)\n const [canUnmergeCell, setCanUnmergeCell] = useState(false)\n const { y } = useScrollInfo()\n\n useEffect(() => {\n return editor.registerMutationListener(\n TableCellNode,\n (nodeMutations) => {\n const nodeUpdated = nodeMutations.get(tableCellNode.getKey()) === 'updated'\n\n if (nodeUpdated) {\n editor.getEditorState().read(() => {\n updateTableCellNode(tableCellNode.getLatest())\n })\n }\n },\n { skipInitialization: true },\n )\n }, [editor, tableCellNode])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n // Merge cells\n if ($isTableSelection(selection)) {\n const currentSelectionCounts = computeSelectionCount(selection)\n updateSelectionCounts(computeSelectionCount(selection))\n\n setCanMergeCells(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1)\n }\n // Unmerge cell\n setCanUnmergeCell($canUnmerge())\n })\n }, [editor])\n\n useEffect(() => {\n const menuButtonElement = contextRef.current\n const dropDownElement = dropDownRef.current\n const rootElement = editor.getRootElement()\n\n if (menuButtonElement != null && dropDownElement != null && rootElement != null) {\n const rootEleRect = rootElement.getBoundingClientRect()\n const menuButtonRect = menuButtonElement.getBoundingClientRect()\n dropDownElement.style.opacity = '1'\n const dropDownElementRect = dropDownElement.getBoundingClientRect()\n const margin = 5\n let leftPosition = menuButtonRect.right + margin\n if (\n leftPosition + dropDownElementRect.width > window.innerWidth ||\n leftPosition + dropDownElementRect.width > rootEleRect.right\n ) {\n const position = menuButtonRect.left - dropDownElementRect.width - margin\n leftPosition = (position < 0 ? margin : position) + window.pageXOffset\n }\n dropDownElement.style.left = `${leftPosition + window.pageXOffset}px`\n\n let topPosition = menuButtonRect.top\n if (topPosition + dropDownElementRect.height > window.innerHeight) {\n const position = menuButtonRect.bottom - dropDownElementRect.height\n topPosition = position < 0 ? margin : position\n }\n dropDownElement.style.top = `${topPosition}px`\n }\n }, [contextRef, dropDownRef, editor, y])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n dropDownRef.current != null &&\n contextRef.current != null &&\n isDOMNode(event.target) &&\n !dropDownRef.current.contains(event.target) &&\n !contextRef.current.contains(event.target)\n ) {\n setIsMenuOpen(false)\n }\n }\n\n window.addEventListener('click', handleClickOutside)\n\n return () => window.removeEventListener('click', handleClickOutside)\n }, [setIsMenuOpen, contextRef])\n\n const clearTableSelection = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('Expected to find tableElement in DOM')\n }\n\n const tableObserver = getTableObserverFromTableElement(tableElement)\n if (tableObserver !== null) {\n tableObserver.$clearHighlight()\n }\n\n tableNode.markDirty()\n updateTableCellNode(tableCellNode.getLatest())\n }\n\n const rootNode = $getRoot()\n rootNode.selectStart()\n })\n }, [editor, tableCellNode])\n\n const mergeTableCellsAtSelection = () => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isTableSelection(selection)) {\n // Get all selected cells and compute the total area\n const nodes = selection.getNodes()\n const tableCells = nodes.filter($isTableCellNode)\n\n if (tableCells.length === 0) {\n return\n }\n\n // Find the table node\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCells[0] as TableCellNode)\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n // Find the boundaries of the selection including merged cells\n let minRow = Infinity\n let maxRow = -Infinity\n let minCol = Infinity\n let maxCol = -Infinity\n\n // First pass: find the actual boundaries considering merged cells\n const processedCells = new Set()\n for (const row of gridMap) {\n for (const mapCell of row) {\n if (!mapCell || !mapCell.cell) {\n continue\n }\n\n const cellKey = mapCell.cell.getKey()\n if (processedCells.has(cellKey)) {\n continue\n }\n\n if (tableCells.some((cell) => cell.is(mapCell.cell))) {\n processedCells.add(cellKey)\n // Get the actual position of this cell in the grid\n const cellStartRow = mapCell.startRow\n const cellStartCol = mapCell.startColumn\n const cellRowSpan = mapCell.cell.__rowSpan || 1\n const cellColSpan = mapCell.cell.__colSpan || 1\n\n // Update boundaries considering the cell's actual position and span\n minRow = Math.min(minRow, cellStartRow)\n maxRow = Math.max(maxRow, cellStartRow + cellRowSpan - 1)\n minCol = Math.min(minCol, cellStartCol)\n maxCol = Math.max(maxCol, cellStartCol + cellColSpan - 1)\n }\n }\n }\n\n // Validate boundaries\n if (minRow === Infinity || minCol === Infinity) {\n return\n }\n\n // The total span of the merged cell\n const totalRowSpan = maxRow - minRow + 1\n const totalColSpan = maxCol - minCol + 1\n\n // Use the top-left cell as the target cell\n const targetCellMap = gridMap?.[minRow]?.[minCol]\n if (!targetCellMap?.cell) {\n return\n }\n const targetCell = targetCellMap.cell\n\n // Set the spans for the target cell\n targetCell.setColSpan(totalColSpan)\n targetCell.setRowSpan(totalRowSpan)\n\n // Move content from other cells to the target cell\n const seenCells = new Set([targetCell.getKey()])\n\n // Second pass: merge content and remove other cells\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n const mapCell = gridMap?.[row]?.[col]\n if (!mapCell?.cell) {\n continue\n }\n\n const currentCell = mapCell.cell\n const key = currentCell.getKey()\n\n if (!seenCells.has(key)) {\n seenCells.add(key)\n const isEmpty = $cellContainsEmptyParagraph(currentCell)\n if (!isEmpty) {\n targetCell.append(...currentCell.getChildren())\n }\n currentCell.remove()\n }\n }\n }\n\n // Ensure target cell has content\n if (targetCell.getChildrenSize() === 0) {\n targetCell.append($createParagraphNode())\n }\n\n $selectLastDescendant(targetCell)\n onClose()\n }\n })\n }\n\n const unmergeTableCellsAtSelection = () => {\n editor.update(() => {\n $unmergeCell()\n })\n }\n\n const insertTableRowAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.rows; i++) {\n $insertTableRow__EXPERIMENTAL(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.rows],\n )\n\n const insertTableColumnAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.columns; i++) {\n $insertTableColumn__EXPERIMENTAL(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.columns],\n )\n\n const deleteTableRowAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableRow__EXPERIMENTAL()\n onClose()\n })\n }, [editor, onClose])\n\n const deleteTableAtSelection = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n tableNode.remove()\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const deleteTableColumnAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableColumn__EXPERIMENTAL()\n onClose()\n })\n }, [editor, onClose])\n\n const toggleTableRowIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const rowCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW\n if (gridMap[tableRowIndex]) {\n for (let col = 0; col < gridMap[tableRowIndex].length; col++) {\n const mapCell = gridMap[tableRowIndex][col]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!rowCells.has(mapCell.cell)) {\n rowCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleTableColumnIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode)\n\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const columnCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN\n if (gridMap) {\n for (let row = 0; row < gridMap.length; row++) {\n const mapCell = gridMap?.[row]?.[tableColumnIndex]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!columnCells.has(mapCell.cell)) {\n columnCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleRowStriping = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setRowStriping(!tableNode.getRowStriping())\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleFirstColumnFreeze = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setFrozenColumns(tableNode.getFrozenColumns() === 0 ? 1 : 0)\n }\n }\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n let mergeCellButton: JSX.Element | null = null\n if (cellMerge) {\n if (canMergeCells) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-merge-cells\"\n onClick={() => mergeTableCellsAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Merge cells</span>\n </button>\n )\n } else if (canUnmergeCell) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-unmerge-cells\"\n onClick={() => unmergeTableCellsAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Unmerge cells</span>\n </button>\n )\n }\n }\n\n return createPortal(\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events\n <div\n className=\"table-action-menu-dropdown\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n ref={dropDownRef}\n >\n {mergeCellButton ? (\n <React.Fragment>\n {mergeCellButton}\n <hr />\n </React.Fragment>\n ) : null}\n\n <button\n className=\"item\"\n data-test-id=\"table-row-striping\"\n onClick={() => toggleRowStriping()}\n type=\"button\"\n >\n <span className=\"text\">Toggle Row Striping</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-freeze-first-column\"\n onClick={() => toggleFirstColumnFreeze()}\n type=\"button\"\n >\n <span className=\"text\">Toggle First Column Freeze</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-above\"\n onClick={() => insertTableRowAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} above\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-below\"\n onClick={() => insertTableRowAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} below\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-before\"\n onClick={() => insertTableColumnAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n left\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-after\"\n onClick={() => insertTableColumnAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n right\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-delete-columns\"\n onClick={() => deleteTableColumnAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete column</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete-rows\"\n onClick={() => deleteTableRowAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete row</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete\"\n onClick={() => deleteTableAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete table</span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-row-header\"\n onClick={() => toggleTableRowIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.ROW) === TableCellHeaderStates.ROW\n ? 'Remove'\n : 'Add'}{' '}\n row header\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-column-header\"\n onClick={() => toggleTableColumnIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.COLUMN) ===\n TableCellHeaderStates.COLUMN\n ? 'Remove'\n : 'Add'}{' '}\n column header\n </span>\n </button>\n </div>,\n document.body,\n )\n}\n\nfunction TableCellActionMenuContainer({\n anchorElem,\n cellMerge,\n}: {\n anchorElem: HTMLElement\n cellMerge: boolean\n}): JSX.Element {\n const [editor] = useLexicalComposerContext()\n\n const menuButtonRef = useRef<HTMLDivElement | null>(null)\n const menuRootRef = useRef<HTMLButtonElement | null>(null)\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n\n const [tableCellNode, setTableMenuCellNode] = useState<null | TableCellNode>(null)\n\n const $moveMenu = useCallback(() => {\n const menu = menuButtonRef.current\n const selection = $getSelection()\n const nativeSelection = getDOMSelection(editor._window)\n const activeElement = document.activeElement\n function disable() {\n if (menu) {\n menu.classList.remove('table-cell-action-button-container--active')\n menu.classList.add('table-cell-action-button-container--inactive')\n }\n setTableMenuCellNode(null)\n }\n\n if (selection == null || menu == null) {\n return disable()\n }\n\n const rootElement = editor.getRootElement()\n let tableObserver: null | TableObserver = null\n let tableCellParentNodeDOM: HTMLElement | null = null\n\n if (\n $isRangeSelection(selection) &&\n rootElement !== null &&\n nativeSelection !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const tableCellNodeFromSelection = $getTableCellNodeFromLexicalNode(\n selection.anchor.getNode(),\n )\n\n if (tableCellNodeFromSelection == null) {\n return disable()\n }\n\n tableCellParentNodeDOM = editor.getElementByKey(tableCellNodeFromSelection.getKey())\n\n if (tableCellParentNodeDOM == null || !tableCellNodeFromSelection.isAttached()) {\n return disable()\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNodeFromSelection)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n setTableMenuCellNode(tableCellNodeFromSelection)\n } else if ($isTableSelection(selection)) {\n const anchorNode = $getTableCellNodeFromLexicalNode(selection.anchor.getNode())\n if (!$isTableCellNode(anchorNode)) {\n throw new Error('TableSelection anchorNode must be a TableCellNode')\n }\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(anchorNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n tableCellParentNodeDOM = editor.getElementByKey(anchorNode.getKey())\n } else if (!activeElement) {\n return disable()\n }\n if (tableObserver === null || tableCellParentNodeDOM === null) {\n return disable()\n }\n const enabled = !tableObserver || !tableObserver.isSelecting\n menu.classList.toggle('table-cell-action-button-container--active', enabled)\n menu.classList.toggle('table-cell-action-button-container--inactive', !enabled)\n if (enabled) {\n const tableCellRect = tableCellParentNodeDOM.getBoundingClientRect()\n const anchorRect = anchorElem.getBoundingClientRect()\n const top = tableCellRect.top - anchorRect.top\n const left = tableCellRect.right - anchorRect.left\n menu.style.transform = `translate(${left}px, ${top}px)`\n }\n }, [editor, anchorElem])\n\n useEffect(() => {\n // We call the $moveMenu callback every time the selection changes,\n // once up front, and once after each pointerup\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n const callback = () => {\n timeoutId = undefined\n editor.getEditorState().read($moveMenu)\n }\n const delayedCallback = () => {\n if (timeoutId === undefined) {\n timeoutId = setTimeout(callback, 0)\n }\n return false\n }\n return mergeRegister(\n editor.registerUpdateListener(delayedCallback),\n editor.registerCommand(SELECTION_CHANGE_COMMAND, delayedCallback, COMMAND_PRIORITY_CRITICAL),\n editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement) {\n prevRootElement.removeEventListener('pointerup', delayedCallback)\n }\n if (rootElement) {\n rootElement.addEventListener('pointerup', delayedCallback)\n delayedCallback()\n }\n }),\n () => clearTimeout(timeoutId),\n )\n })\n\n const prevTableCellDOM = useRef(tableCellNode)\n\n useEffect(() => {\n if (prevTableCellDOM.current !== tableCellNode) {\n setIsMenuOpen(false)\n }\n\n prevTableCellDOM.current = tableCellNode\n }, [prevTableCellDOM, tableCellNode])\n\n return (\n <div className=\"table-cell-action-button-container\" ref={menuButtonRef}>\n {tableCellNode != null && (\n <React.Fragment>\n <button\n className=\"table-cell-action-button\"\n onClick={(e) => {\n e.stopPropagation()\n setIsMenuOpen(!isMenuOpen)\n }}\n ref={menuRootRef}\n type=\"button\"\n >\n <MeatballsIcon />\n </button>\n {isMenuOpen && (\n <TableActionMenu\n cellMerge={cellMerge}\n contextRef={menuRootRef}\n onClose={() => setIsMenuOpen(false)}\n setIsMenuOpen={setIsMenuOpen}\n tableCellNode={tableCellNode}\n />\n )}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableActionMenuPlugin: PluginComponentWithAnchor = ({ anchorElem }) => {\n const isEditable = useLexicalEditable()\n return createPortal(\n isEditable ? (\n <TableCellActionMenuContainer anchorElem={anchorElem ?? document.body} cellMerge />\n ) : null,\n anchorElem ?? document.body,\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$deleteTableColumn__EXPERIMENTAL","$deleteTableRow__EXPERIMENTAL","$getNodeTriplet","$getTableCellNodeFromLexicalNode","$getTableColumnIndexFromTableCellNode","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$insertTableColumn__EXPERIMENTAL","$insertTableRow__EXPERIMENTAL","$isTableCellNode","$isTableSelection","$unmergeCell","getTableElement","getTableObserverFromTableElement","TableCellHeaderStates","TableCellNode","mergeRegister","useScrollInfo","$createParagraphNode","$getSelection","$isElementNode","$isParagraphNode","$isRangeSelection","$isTextNode","$setSelection","COMMAND_PRIORITY_CRITICAL","getDOMSelection","isDOMNode","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","createPortal","MeatballsIcon","computeSelectionCount","selection","selectionShape","getShape","columns","toX","fromX","rows","toY","fromY","$canUnmerge","isCollapsed","anchor","is","focus","cell","__colSpan","__rowSpan","$cellContainsEmptyParagraph","getChildrenSize","firstChild","getFirstChildOrThrow","isEmpty","$selectLastDescendant","node","lastDescendant","getLastDescendant","select","selectEnd","selectNext","TableActionMenu","cellMerge","contextRef","onClose","setIsMenuOpen","tableCellNode","_tableCellNode","editor","dropDownRef","updateTableCellNode","selectionCounts","updateSelectionCounts","canMergeCells","setCanMergeCells","canUnmergeCell","setCanUnmergeCell","y","registerMutationListener","nodeMutations","nodeUpdated","get","getKey","getEditorState","read","getLatest","skipInitialization","currentSelectionCounts","menuButtonElement","current","dropDownElement","rootElement","getRootElement","rootEleRect","getBoundingClientRect","menuButtonRect","style","opacity","dropDownElementRect","margin","leftPosition","right","width","window","innerWidth","position","left","pageXOffset","topPosition","top","height","innerHeight","bottom","handleClickOutside","event","target","contains","addEventListener","removeEventListener","clearTableSelection","update","isAttached","tableNode","tableElement","getElementByKey","Error","tableObserver","$clearHighlight","markDirty","mergeTableCellsAtSelection","nodes","getNodes","tableCells","filter","length","gridMap","minRow","Infinity","maxRow","minCol","maxCol","processedCells","Set","row","mapCell","cellKey","has","some","add","cellStartRow","startRow","cellStartCol","startColumn","cellRowSpan","cellColSpan","Math","min","max","totalRowSpan","totalColSpan","targetCellMap","targetCell","setColSpan","setRowSpan","seenCells","col","currentCell","key","append","getChildren","remove","unmergeTableCellsAtSelection","insertTableRowAtSelection","shouldInsertAfter","i","insertTableColumnAtSelection","deleteTableRowAtSelection","deleteTableAtSelection","deleteTableColumnAtSelection","toggleTableRowIsHeader","tableRowIndex","rowCells","newStyle","getHeaderStyles","ROW","setHeaderStyles","toggleTableColumnIsHeader","tableColumnIndex","columnCells","COLUMN","toggleRowStriping","setRowStriping","getRowStriping","toggleFirstColumnFreeze","setFrozenColumns","getFrozenColumns","mergeCellButton","_jsx","className","onClick","type","_jsxs","e","stopPropagation","ref","Fragment","__headerState","document","body","TableCellActionMenuContainer","anchorElem","menuButtonRef","menuRootRef","isMenuOpen","setTableMenuCellNode","$moveMenu","menu","nativeSelection","_window","activeElement","disable","classList","tableCellParentNodeDOM","anchorNode","tableCellNodeFromSelection","getNode","enabled","isSelecting","toggle","tableCellRect","anchorRect","transform","timeoutId","undefined","callback","delayedCallback","setTimeout","registerUpdateListener","registerCommand","registerRootListener","prevRootElement","clearTimeout","prevTableCellDOM","TableActionMenuPlugin","t0","$","isEditable","t1"],"sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableObserver, TableSelection } from '@lexical/table'\nimport type { ElementNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $deleteTableColumn__EXPERIMENTAL,\n $deleteTableRow__EXPERIMENTAL,\n $getNodeTriplet,\n $getTableCellNodeFromLexicalNode,\n $getTableColumnIndexFromTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumn__EXPERIMENTAL,\n $insertTableRow__EXPERIMENTAL,\n $isTableCellNode,\n $isTableSelection,\n $unmergeCell,\n getTableElement,\n getTableObserverFromTableElement,\n TableCellHeaderStates,\n TableCellNode,\n} from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { useScrollInfo } from '@payloadcms/ui'\nimport {\n $createParagraphNode,\n $getRoot,\n $getSelection,\n $isElementNode,\n $isParagraphNode,\n $isRangeSelection,\n $isTextNode,\n $setSelection,\n COMMAND_PRIORITY_CRITICAL,\n getDOMSelection,\n isDOMNode,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\n\nimport './index.scss'\nimport { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'\n\nfunction computeSelectionCount(selection: TableSelection): {\n columns: number\n rows: number\n} {\n const selectionShape = selection.getShape()\n return {\n columns: selectionShape.toX - selectionShape.fromX + 1,\n rows: selectionShape.toY - selectionShape.fromY + 1,\n }\n}\n\nfunction $canUnmerge(): boolean {\n const selection = $getSelection()\n if (\n ($isRangeSelection(selection) && !selection.isCollapsed()) ||\n ($isTableSelection(selection) && !selection.anchor.is(selection.focus)) ||\n (!$isRangeSelection(selection) && !$isTableSelection(selection))\n ) {\n return false\n }\n const [cell] = $getNodeTriplet(selection.anchor)\n return cell.__colSpan > 1 || cell.__rowSpan > 1\n}\n\nfunction $cellContainsEmptyParagraph(cell: TableCellNode): boolean {\n if (cell.getChildrenSize() !== 1) {\n return false\n }\n const firstChild = cell.getFirstChildOrThrow()\n if (!$isParagraphNode(firstChild) || !firstChild.isEmpty()) {\n return false\n }\n return true\n}\n\nfunction $selectLastDescendant(node: ElementNode): void {\n const lastDescendant = node.getLastDescendant()\n if ($isTextNode(lastDescendant)) {\n lastDescendant.select()\n } else if ($isElementNode(lastDescendant)) {\n lastDescendant.selectEnd()\n } else if (lastDescendant !== null) {\n lastDescendant.selectNext()\n }\n}\n\ntype TableCellActionMenuProps = Readonly<{\n cellMerge: boolean\n contextRef: { current: HTMLElement | null }\n onClose: () => void\n setIsMenuOpen: (isOpen: boolean) => void\n tableCellNode: TableCellNode\n}>\n\nfunction TableActionMenu({\n cellMerge,\n contextRef,\n onClose,\n setIsMenuOpen,\n tableCellNode: _tableCellNode,\n}: TableCellActionMenuProps) {\n const [editor] = useLexicalComposerContext()\n const dropDownRef = useRef<HTMLDivElement | null>(null)\n const [tableCellNode, updateTableCellNode] = useState(_tableCellNode)\n const [selectionCounts, updateSelectionCounts] = useState({\n columns: 1,\n rows: 1,\n })\n const [canMergeCells, setCanMergeCells] = useState(false)\n const [canUnmergeCell, setCanUnmergeCell] = useState(false)\n const { y } = useScrollInfo()\n\n useEffect(() => {\n return editor.registerMutationListener(\n TableCellNode,\n (nodeMutations) => {\n const nodeUpdated = nodeMutations.get(tableCellNode.getKey()) === 'updated'\n\n if (nodeUpdated) {\n editor.getEditorState().read(() => {\n updateTableCellNode(tableCellNode.getLatest())\n })\n }\n },\n { skipInitialization: true },\n )\n }, [editor, tableCellNode])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n // Merge cells\n if ($isTableSelection(selection)) {\n const currentSelectionCounts = computeSelectionCount(selection)\n updateSelectionCounts(computeSelectionCount(selection))\n\n setCanMergeCells(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1)\n }\n // Unmerge cell\n setCanUnmergeCell($canUnmerge())\n })\n }, [editor])\n\n useEffect(() => {\n const menuButtonElement = contextRef.current\n const dropDownElement = dropDownRef.current\n const rootElement = editor.getRootElement()\n\n if (menuButtonElement != null && dropDownElement != null && rootElement != null) {\n const rootEleRect = rootElement.getBoundingClientRect()\n const menuButtonRect = menuButtonElement.getBoundingClientRect()\n dropDownElement.style.opacity = '1'\n const dropDownElementRect = dropDownElement.getBoundingClientRect()\n const margin = 5\n let leftPosition = menuButtonRect.right + margin\n if (\n leftPosition + dropDownElementRect.width > window.innerWidth ||\n leftPosition + dropDownElementRect.width > rootEleRect.right\n ) {\n const position = menuButtonRect.left - dropDownElementRect.width - margin\n leftPosition = (position < 0 ? margin : position) + window.pageXOffset\n }\n dropDownElement.style.left = `${leftPosition + window.pageXOffset}px`\n\n let topPosition = menuButtonRect.top\n if (topPosition + dropDownElementRect.height > window.innerHeight) {\n const position = menuButtonRect.bottom - dropDownElementRect.height\n topPosition = position < 0 ? margin : position\n }\n dropDownElement.style.top = `${topPosition}px`\n }\n }, [contextRef, dropDownRef, editor, y])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n dropDownRef.current != null &&\n contextRef.current != null &&\n isDOMNode(event.target) &&\n !dropDownRef.current.contains(event.target) &&\n !contextRef.current.contains(event.target)\n ) {\n setIsMenuOpen(false)\n }\n }\n\n window.addEventListener('click', handleClickOutside)\n\n return () => window.removeEventListener('click', handleClickOutside)\n }, [setIsMenuOpen, contextRef])\n\n const clearTableSelection = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('Expected to find tableElement in DOM')\n }\n\n const tableObserver = getTableObserverFromTableElement(tableElement)\n if (tableObserver !== null) {\n tableObserver.$clearHighlight()\n }\n\n tableNode.markDirty()\n updateTableCellNode(tableCellNode.getLatest())\n }\n\n $setSelection(null)\n })\n }, [editor, tableCellNode])\n\n const mergeTableCellsAtSelection = () => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isTableSelection(selection)) {\n // Get all selected cells and compute the total area\n const nodes = selection.getNodes()\n const tableCells = nodes.filter($isTableCellNode)\n\n if (tableCells.length === 0) {\n return\n }\n\n // Find the table node\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCells[0] as TableCellNode)\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n // Find the boundaries of the selection including merged cells\n let minRow = Infinity\n let maxRow = -Infinity\n let minCol = Infinity\n let maxCol = -Infinity\n\n // First pass: find the actual boundaries considering merged cells\n const processedCells = new Set()\n for (const row of gridMap) {\n for (const mapCell of row) {\n if (!mapCell || !mapCell.cell) {\n continue\n }\n\n const cellKey = mapCell.cell.getKey()\n if (processedCells.has(cellKey)) {\n continue\n }\n\n if (tableCells.some((cell) => cell.is(mapCell.cell))) {\n processedCells.add(cellKey)\n // Get the actual position of this cell in the grid\n const cellStartRow = mapCell.startRow\n const cellStartCol = mapCell.startColumn\n const cellRowSpan = mapCell.cell.__rowSpan || 1\n const cellColSpan = mapCell.cell.__colSpan || 1\n\n // Update boundaries considering the cell's actual position and span\n minRow = Math.min(minRow, cellStartRow)\n maxRow = Math.max(maxRow, cellStartRow + cellRowSpan - 1)\n minCol = Math.min(minCol, cellStartCol)\n maxCol = Math.max(maxCol, cellStartCol + cellColSpan - 1)\n }\n }\n }\n\n // Validate boundaries\n if (minRow === Infinity || minCol === Infinity) {\n return\n }\n\n // The total span of the merged cell\n const totalRowSpan = maxRow - minRow + 1\n const totalColSpan = maxCol - minCol + 1\n\n // Use the top-left cell as the target cell\n const targetCellMap = gridMap?.[minRow]?.[minCol]\n if (!targetCellMap?.cell) {\n return\n }\n const targetCell = targetCellMap.cell\n\n // Set the spans for the target cell\n targetCell.setColSpan(totalColSpan)\n targetCell.setRowSpan(totalRowSpan)\n\n // Move content from other cells to the target cell\n const seenCells = new Set([targetCell.getKey()])\n\n // Second pass: merge content and remove other cells\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n const mapCell = gridMap?.[row]?.[col]\n if (!mapCell?.cell) {\n continue\n }\n\n const currentCell = mapCell.cell\n const key = currentCell.getKey()\n\n if (!seenCells.has(key)) {\n seenCells.add(key)\n const isEmpty = $cellContainsEmptyParagraph(currentCell)\n if (!isEmpty) {\n targetCell.append(...currentCell.getChildren())\n }\n currentCell.remove()\n }\n }\n }\n\n // Ensure target cell has content\n if (targetCell.getChildrenSize() === 0) {\n targetCell.append($createParagraphNode())\n }\n\n $selectLastDescendant(targetCell)\n onClose()\n }\n })\n }\n\n const unmergeTableCellsAtSelection = () => {\n editor.update(() => {\n $unmergeCell()\n })\n }\n\n const insertTableRowAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.rows; i++) {\n $insertTableRow__EXPERIMENTAL(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.rows],\n )\n\n const insertTableColumnAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.columns; i++) {\n $insertTableColumn__EXPERIMENTAL(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.columns],\n )\n\n const deleteTableRowAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableRow__EXPERIMENTAL()\n onClose()\n })\n }, [editor, onClose])\n\n const deleteTableAtSelection = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n tableNode.remove()\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const deleteTableColumnAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableColumn__EXPERIMENTAL()\n onClose()\n })\n }, [editor, onClose])\n\n const toggleTableRowIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const rowCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW\n if (gridMap[tableRowIndex]) {\n for (let col = 0; col < gridMap[tableRowIndex].length; col++) {\n const mapCell = gridMap[tableRowIndex][col]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!rowCells.has(mapCell.cell)) {\n rowCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleTableColumnIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode)\n\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const columnCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN\n if (gridMap) {\n for (let row = 0; row < gridMap.length; row++) {\n const mapCell = gridMap?.[row]?.[tableColumnIndex]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!columnCells.has(mapCell.cell)) {\n columnCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleRowStriping = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setRowStriping(!tableNode.getRowStriping())\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleFirstColumnFreeze = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setFrozenColumns(tableNode.getFrozenColumns() === 0 ? 1 : 0)\n }\n }\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n let mergeCellButton: JSX.Element | null = null\n if (cellMerge) {\n if (canMergeCells) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-merge-cells\"\n onClick={() => mergeTableCellsAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Merge cells</span>\n </button>\n )\n } else if (canUnmergeCell) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-unmerge-cells\"\n onClick={() => unmergeTableCellsAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Unmerge cells</span>\n </button>\n )\n }\n }\n\n return createPortal(\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events\n <div\n className=\"table-action-menu-dropdown\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n ref={dropDownRef}\n >\n {mergeCellButton ? (\n <React.Fragment>\n {mergeCellButton}\n <hr />\n </React.Fragment>\n ) : null}\n\n <button\n className=\"item\"\n data-test-id=\"table-row-striping\"\n onClick={() => toggleRowStriping()}\n type=\"button\"\n >\n <span className=\"text\">Toggle Row Striping</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-freeze-first-column\"\n onClick={() => toggleFirstColumnFreeze()}\n type=\"button\"\n >\n <span className=\"text\">Toggle First Column Freeze</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-above\"\n onClick={() => insertTableRowAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} above\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-below\"\n onClick={() => insertTableRowAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} below\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-before\"\n onClick={() => insertTableColumnAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n left\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-after\"\n onClick={() => insertTableColumnAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n right\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-delete-columns\"\n onClick={() => deleteTableColumnAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete column</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete-rows\"\n onClick={() => deleteTableRowAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete row</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete\"\n onClick={() => deleteTableAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete table</span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-row-header\"\n onClick={() => toggleTableRowIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.ROW) === TableCellHeaderStates.ROW\n ? 'Remove'\n : 'Add'}{' '}\n row header\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-column-header\"\n onClick={() => toggleTableColumnIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.COLUMN) ===\n TableCellHeaderStates.COLUMN\n ? 'Remove'\n : 'Add'}{' '}\n column header\n </span>\n </button>\n </div>,\n document.body,\n )\n}\n\nfunction TableCellActionMenuContainer({\n anchorElem,\n cellMerge,\n}: {\n anchorElem: HTMLElement\n cellMerge: boolean\n}): JSX.Element {\n const [editor] = useLexicalComposerContext()\n\n const menuButtonRef = useRef<HTMLDivElement | null>(null)\n const menuRootRef = useRef<HTMLButtonElement | null>(null)\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n\n const [tableCellNode, setTableMenuCellNode] = useState<null | TableCellNode>(null)\n\n const $moveMenu = useCallback(() => {\n const menu = menuButtonRef.current\n const selection = $getSelection()\n const nativeSelection = getDOMSelection(editor._window)\n const activeElement = document.activeElement\n function disable() {\n if (menu) {\n menu.classList.remove('table-cell-action-button-container--active')\n menu.classList.add('table-cell-action-button-container--inactive')\n }\n setTableMenuCellNode(null)\n }\n\n if (selection == null || menu == null) {\n return disable()\n }\n\n const rootElement = editor.getRootElement()\n let tableObserver: null | TableObserver = null\n let tableCellParentNodeDOM: HTMLElement | null = null\n\n if (\n $isRangeSelection(selection) &&\n rootElement !== null &&\n nativeSelection !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const tableCellNodeFromSelection = $getTableCellNodeFromLexicalNode(\n selection.anchor.getNode(),\n )\n\n if (tableCellNodeFromSelection == null) {\n return disable()\n }\n\n tableCellParentNodeDOM = editor.getElementByKey(tableCellNodeFromSelection.getKey())\n\n if (tableCellParentNodeDOM == null || !tableCellNodeFromSelection.isAttached()) {\n return disable()\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNodeFromSelection)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n setTableMenuCellNode(tableCellNodeFromSelection)\n } else if ($isTableSelection(selection)) {\n const anchorNode = $getTableCellNodeFromLexicalNode(selection.anchor.getNode())\n if (!$isTableCellNode(anchorNode)) {\n throw new Error('TableSelection anchorNode must be a TableCellNode')\n }\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(anchorNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n tableCellParentNodeDOM = editor.getElementByKey(anchorNode.getKey())\n } else if (!activeElement) {\n return disable()\n }\n if (tableObserver === null || tableCellParentNodeDOM === null) {\n return disable()\n }\n const enabled = !tableObserver || !tableObserver.isSelecting\n menu.classList.toggle('table-cell-action-button-container--active', enabled)\n menu.classList.toggle('table-cell-action-button-container--inactive', !enabled)\n if (enabled) {\n const tableCellRect = tableCellParentNodeDOM.getBoundingClientRect()\n const anchorRect = anchorElem.getBoundingClientRect()\n const top = tableCellRect.top - anchorRect.top\n const left = tableCellRect.right - anchorRect.left\n menu.style.transform = `translate(${left}px, ${top}px)`\n }\n }, [editor, anchorElem])\n\n useEffect(() => {\n // We call the $moveMenu callback every time the selection changes,\n // once up front, and once after each pointerup\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n const callback = () => {\n timeoutId = undefined\n editor.getEditorState().read($moveMenu)\n }\n const delayedCallback = () => {\n if (timeoutId === undefined) {\n timeoutId = setTimeout(callback, 0)\n }\n return false\n }\n return mergeRegister(\n editor.registerUpdateListener(delayedCallback),\n editor.registerCommand(SELECTION_CHANGE_COMMAND, delayedCallback, COMMAND_PRIORITY_CRITICAL),\n editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement) {\n prevRootElement.removeEventListener('pointerup', delayedCallback)\n }\n if (rootElement) {\n rootElement.addEventListener('pointerup', delayedCallback)\n delayedCallback()\n }\n }),\n () => clearTimeout(timeoutId),\n )\n })\n\n const prevTableCellDOM = useRef(tableCellNode)\n\n useEffect(() => {\n if (prevTableCellDOM.current !== tableCellNode) {\n setIsMenuOpen(false)\n }\n\n prevTableCellDOM.current = tableCellNode\n }, [prevTableCellDOM, tableCellNode])\n\n return (\n <div className=\"table-cell-action-button-container\" ref={menuButtonRef}>\n {tableCellNode != null && (\n <React.Fragment>\n <button\n className=\"table-cell-action-button\"\n onClick={(e) => {\n e.stopPropagation()\n setIsMenuOpen(!isMenuOpen)\n }}\n ref={menuRootRef}\n type=\"button\"\n >\n <MeatballsIcon />\n </button>\n {isMenuOpen && (\n <TableActionMenu\n cellMerge={cellMerge}\n contextRef={menuRootRef}\n onClose={() => setIsMenuOpen(false)}\n setIsMenuOpen={setIsMenuOpen}\n tableCellNode={tableCellNode}\n />\n )}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableActionMenuPlugin: PluginComponentWithAnchor = ({ anchorElem }) => {\n const isEditable = useLexicalEditable()\n return createPortal(\n isEditable ? (\n <TableCellActionMenuContainer anchorElem={anchorElem ?? document.body} cellMerge />\n ) : null,\n anchorElem ?? document.body,\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,3 @@
1
- export declare const IndentFeatureClient: import("../../typesClient.js").FeatureProviderProviderClient<undefined, import("../server/index.js").IndentFeatureProps>;
1
+ import { type IndentFeatureProps } from '../server/index.js';
2
+ export declare const IndentFeatureClient: import("../../typesClient.js").FeatureProviderProviderClient<IndentFeatureProps, IndentFeatureProps>;
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/indent/client/index.tsx"],"names":[],"mappings":"AAkFA,eAAO,MAAM,mBAAmB,0HAa9B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/indent/client/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAwE5D,eAAO,MAAM,mBAAmB,sGAiB9B,CAAA"}
@@ -7,7 +7,9 @@ import { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/ind
7
7
  import { createClientFeature } from '../../../utilities/createClientFeature.js';
8
8
  import { IndentPlugin } from './IndentPlugin.js';
9
9
  import { toolbarIndentGroupWithItems } from './toolbarIndentGroup.js';
10
- const toolbarGroups = [toolbarIndentGroupWithItems([{
10
+ const toolbarGroups = ({
11
+ disabledNodes
12
+ }) => [toolbarIndentGroupWithItems([{
11
13
  ChildComponent: IndentDecreaseIcon,
12
14
  isActive: () => false,
13
15
  isEnabled: ({
@@ -28,13 +30,8 @@ const toolbarGroups = [toolbarIndentGroupWithItems([{
28
30
  }
29
31
  }
30
32
  }
31
- if (!atLeastOneNodeCanOutdent && $isRangeSelection(selection)) {
32
- const anchorNode = selection.anchor.getNode();
33
- if ($findMatchingParent(anchorNode, node => isIndentable(node) && node.getIndent() > 0)) {
34
- return true;
35
- }
36
- const focusNode = selection.focus.getNode();
37
- if ($findMatchingParent(focusNode, node => isIndentable(node) && node.getIndent() > 0)) {
33
+ if (!atLeastOneNodeCanOutdent) {
34
+ if ($pointsAncestorMatch(selection, node => isIndentable(node) && node.getIndent() > 0)) {
38
35
  return true;
39
36
  }
40
37
  }
@@ -55,6 +52,18 @@ const toolbarGroups = [toolbarIndentGroupWithItems([{
55
52
  }, {
56
53
  ChildComponent: IndentIncreaseIcon,
57
54
  isActive: () => false,
55
+ isEnabled: ({
56
+ selection
57
+ }) => {
58
+ const nodes = selection?.getNodes();
59
+ if (!nodes?.length) {
60
+ return false;
61
+ }
62
+ if (nodes.some(node => disabledNodes?.includes(node.getType()))) {
63
+ return false;
64
+ }
65
+ return !$pointsAncestorMatch(selection, node => (disabledNodes ?? []).includes(node.getType()));
66
+ },
58
67
  key: 'indentIncrease',
59
68
  label: ({
60
69
  i18n
@@ -68,16 +77,29 @@ const toolbarGroups = [toolbarIndentGroupWithItems([{
68
77
  },
69
78
  order: 2
70
79
  }])];
71
- export const IndentFeatureClient = createClientFeature({
72
- plugins: [{
73
- Component: IndentPlugin,
74
- position: 'normal'
75
- }],
76
- toolbarFixed: {
77
- groups: toolbarGroups
78
- },
79
- toolbarInline: {
80
- groups: toolbarGroups
81
- }
80
+ export const IndentFeatureClient = createClientFeature(({
81
+ props
82
+ }) => {
83
+ const disabledNodes = props.disabledNodes ?? [];
84
+ return {
85
+ plugins: [{
86
+ Component: IndentPlugin,
87
+ position: 'normal'
88
+ }],
89
+ sanitizedClientFeatureProps: props,
90
+ toolbarFixed: {
91
+ groups: toolbarGroups({
92
+ disabledNodes
93
+ })
94
+ },
95
+ toolbarInline: {
96
+ groups: toolbarGroups({
97
+ disabledNodes
98
+ })
99
+ }
100
+ };
82
101
  });
102
+ function $pointsAncestorMatch(selection, fn) {
103
+ return $isRangeSelection(selection) && (!!$findMatchingParent(selection.anchor.getNode(), fn) || !!$findMatchingParent(selection.focus.getNode(), fn));
104
+ }
83
105
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["$findMatchingParent","$isElementNode","$isRangeSelection","INDENT_CONTENT_COMMAND","OUTDENT_CONTENT_COMMAND","IndentDecreaseIcon","IndentIncreaseIcon","createClientFeature","IndentPlugin","toolbarIndentGroupWithItems","toolbarGroups","ChildComponent","isActive","isEnabled","selection","nodes","getNodes","length","atLeastOneNodeCanOutdent","isIndentable","node","canIndent","getIndent","anchorNode","anchor","getNode","focusNode","focus","key","label","i18n","t","onSelect","editor","dispatchCommand","undefined","order","IndentFeatureClient","plugins","Component","position","toolbarFixed","groups","toolbarInline"],"sources":["../../../../src/features/indent/client/index.tsx"],"sourcesContent":["'use client'\n\nimport type { ElementNode, LexicalNode } from 'lexical'\n\nimport { $findMatchingParent } from '@lexical/utils'\nimport {\n $isElementNode,\n $isRangeSelection,\n INDENT_CONTENT_COMMAND,\n OUTDENT_CONTENT_COMMAND,\n} from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { IndentDecreaseIcon } from '../../../lexical/ui/icons/IndentDecrease/index.js'\nimport { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { IndentPlugin } from './IndentPlugin.js'\nimport { toolbarIndentGroupWithItems } from './toolbarIndentGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarIndentGroupWithItems([\n {\n ChildComponent: IndentDecreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n const nodes = selection?.getNodes()\n if (!nodes?.length) {\n return false\n }\n let atLeastOneNodeCanOutdent = false\n const isIndentable = (node: LexicalNode): node is ElementNode =>\n $isElementNode(node) && node.canIndent()\n for (const node of nodes) {\n if (isIndentable(node)) {\n if (node.getIndent() <= 0) {\n return false\n } else {\n atLeastOneNodeCanOutdent = true\n }\n }\n }\n if (!atLeastOneNodeCanOutdent && $isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode()\n if (\n $findMatchingParent(anchorNode, (node) => isIndentable(node) && node.getIndent() > 0)\n ) {\n return true\n }\n const focusNode = selection.focus.getNode()\n if (\n $findMatchingParent(focusNode, (node) => isIndentable(node) && node.getIndent() > 0)\n ) {\n return true\n }\n }\n return atLeastOneNodeCanOutdent\n },\n key: 'indentDecrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:decreaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\n },\n order: 1,\n },\n {\n ChildComponent: IndentIncreaseIcon,\n isActive: () => false,\n key: 'indentIncrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:increaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\n },\n order: 2,\n },\n ]),\n]\n\nexport const IndentFeatureClient = createClientFeature({\n plugins: [\n {\n Component: IndentPlugin,\n position: 'normal',\n },\n ],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n"],"mappings":"AAAA;;AAIA,SAASA,mBAAmB,QAAQ;AACpC,SACEC,cAAc,EACdC,iBAAiB,EACjBC,sBAAsB,EACtBC,uBAAuB,QAClB;AAIP,SAASC,kBAAkB,QAAQ;AACnC,SAASC,kBAAkB,QAAQ;AACnC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,YAAY,QAAQ;AAC7B,SAASC,2BAA2B,QAAQ;AAE5C,MAAMC,aAAA,GAAgC,CACpCD,2BAAA,CAA4B,CAC1B;EACEE,cAAA,EAAgBN,kBAAA;EAChBO,QAAA,EAAUA,CAAA,KAAM;EAChBC,SAAA,EAAWA,CAAC;IAAEC;EAAS,CAAE;IACvB,MAAMC,KAAA,GAAQD,SAAA,EAAWE,QAAA;IACzB,IAAI,CAACD,KAAA,EAAOE,MAAA,EAAQ;MAClB,OAAO;IACT;IACA,IAAIC,wBAAA,GAA2B;IAC/B,MAAMC,YAAA,GAAgBC,IAAA,IACpBnB,cAAA,CAAemB,IAAA,KAASA,IAAA,CAAKC,SAAS;IACxC,KAAK,MAAMD,IAAA,IAAQL,KAAA,EAAO;MACxB,IAAII,YAAA,CAAaC,IAAA,GAAO;QACtB,IAAIA,IAAA,CAAKE,SAAS,MAAM,GAAG;UACzB,OAAO;QACT,OAAO;UACLJ,wBAAA,GAA2B;QAC7B;MACF;IACF;IACA,IAAI,CAACA,wBAAA,IAA4BhB,iBAAA,CAAkBY,SAAA,GAAY;MAC7D,MAAMS,UAAA,GAAaT,SAAA,CAAUU,MAAM,CAACC,OAAO;MAC3C,IACEzB,mBAAA,CAAoBuB,UAAA,EAAaH,IAAA,IAASD,YAAA,CAAaC,IAAA,KAASA,IAAA,CAAKE,SAAS,KAAK,IACnF;QACA,OAAO;MACT;MACA,MAAMI,SAAA,GAAYZ,SAAA,CAAUa,KAAK,CAACF,OAAO;MACzC,IACEzB,mBAAA,CAAoB0B,SAAA,EAAYN,IAAA,IAASD,YAAA,CAAaC,IAAA,KAASA,IAAA,CAAKE,SAAS,KAAK,IAClF;QACA,OAAO;MACT;IACF;IACA,OAAOJ,wBAAA;EACT;EACAU,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC;EAAM,CAAE;IACnBA,MAAA,CAAOC,eAAe,CAAC9B,uBAAA,EAAyB+B,SAAA;EAClD;EACAC,KAAA,EAAO;AACT,GACA;EACEzB,cAAA,EAAgBL,kBAAA;EAChBM,QAAA,EAAUA,CAAA,KAAM;EAChBgB,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC;EAAM,CAAE;IACnBA,MAAA,CAAOC,eAAe,CAAC/B,sBAAA,EAAwBgC,SAAA;EACjD;EACAC,KAAA,EAAO;AACT,EACD,EACF;AAED,OAAO,MAAMC,mBAAA,GAAsB9B,mBAAA,CAAoB;EACrD+B,OAAA,EAAS,CACP;IACEC,SAAA,EAAW/B,YAAA;IACXgC,QAAA,EAAU;EACZ,EACD;EACDC,YAAA,EAAc;IACZC,MAAA,EAAQhC;EACV;EACAiC,aAAA,EAAe;IACbD,MAAA,EAAQhC;EACV;AACF","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["$findMatchingParent","$isElementNode","$isRangeSelection","INDENT_CONTENT_COMMAND","OUTDENT_CONTENT_COMMAND","IndentDecreaseIcon","IndentIncreaseIcon","createClientFeature","IndentPlugin","toolbarIndentGroupWithItems","toolbarGroups","disabledNodes","ChildComponent","isActive","isEnabled","selection","nodes","getNodes","length","atLeastOneNodeCanOutdent","isIndentable","node","canIndent","getIndent","$pointsAncestorMatch","key","label","i18n","t","onSelect","editor","dispatchCommand","undefined","order","some","includes","getType","IndentFeatureClient","props","plugins","Component","position","sanitizedClientFeatureProps","toolbarFixed","groups","toolbarInline","fn","anchor","getNode","focus"],"sources":["../../../../src/features/indent/client/index.tsx"],"sourcesContent":["'use client'\n\nimport type { BaseSelection, ElementNode, LexicalNode } from 'lexical'\n\nimport { $findMatchingParent } from '@lexical/utils'\nimport {\n $isElementNode,\n $isRangeSelection,\n INDENT_CONTENT_COMMAND,\n OUTDENT_CONTENT_COMMAND,\n} from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { IndentDecreaseIcon } from '../../../lexical/ui/icons/IndentDecrease/index.js'\nimport { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { type IndentFeatureProps } from '../server/index.js'\nimport { IndentPlugin } from './IndentPlugin.js'\nimport { toolbarIndentGroupWithItems } from './toolbarIndentGroup.js'\n\nconst toolbarGroups = ({ disabledNodes }: IndentFeatureProps): ToolbarGroup[] => [\n toolbarIndentGroupWithItems([\n {\n ChildComponent: IndentDecreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n const nodes = selection?.getNodes()\n if (!nodes?.length) {\n return false\n }\n let atLeastOneNodeCanOutdent = false\n const isIndentable = (node: LexicalNode): node is ElementNode =>\n $isElementNode(node) && node.canIndent()\n for (const node of nodes) {\n if (isIndentable(node)) {\n if (node.getIndent() <= 0) {\n return false\n } else {\n atLeastOneNodeCanOutdent = true\n }\n }\n }\n\n if (!atLeastOneNodeCanOutdent) {\n if (\n $pointsAncestorMatch(selection, (node) => isIndentable(node) && node.getIndent() > 0)\n ) {\n return true\n }\n }\n return atLeastOneNodeCanOutdent\n },\n key: 'indentDecrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:decreaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\n },\n order: 1,\n },\n {\n ChildComponent: IndentIncreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n const nodes = selection?.getNodes()\n if (!nodes?.length) {\n return false\n }\n if (nodes.some((node) => disabledNodes?.includes(node.getType()))) {\n return false\n }\n return !$pointsAncestorMatch(selection, (node) =>\n (disabledNodes ?? []).includes(node.getType()),\n )\n },\n key: 'indentIncrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:increaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\n },\n order: 2,\n },\n ]),\n]\n\nexport const IndentFeatureClient = createClientFeature<IndentFeatureProps>(({ props }) => {\n const disabledNodes = props.disabledNodes ?? []\n return {\n plugins: [\n {\n Component: IndentPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n toolbarFixed: {\n groups: toolbarGroups({ disabledNodes }),\n },\n toolbarInline: {\n groups: toolbarGroups({ disabledNodes }),\n },\n }\n})\n\nfunction $pointsAncestorMatch(\n selection: BaseSelection,\n fn: (node: LexicalNode) => boolean,\n): boolean {\n return (\n $isRangeSelection(selection) &&\n (!!$findMatchingParent(selection.anchor.getNode(), fn) ||\n !!$findMatchingParent(selection.focus.getNode(), fn))\n )\n}\n"],"mappings":"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","ignoreList":[]}