@ai-stack/payloadcms 3.68.0-beta.1 → 3.68.0-beta.2

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 (97) hide show
  1. package/dist/ai/core/media/image/handlers/multimodal.js +5 -0
  2. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  3. package/dist/ai/core/streamObject.js +0 -3
  4. package/dist/ai/core/streamObject.js.map +1 -1
  5. package/dist/ai/providers/blocks/anthropic.js +2 -1
  6. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  7. package/dist/ai/providers/blocks/elevenlabs.js +2 -1
  8. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  9. package/dist/ai/providers/blocks/fal.js +2 -1
  10. package/dist/ai/providers/blocks/fal.js.map +1 -1
  11. package/dist/ai/providers/blocks/google.js +2 -1
  12. package/dist/ai/providers/blocks/google.js.map +1 -1
  13. package/dist/ai/providers/blocks/openai-compatible.js +2 -1
  14. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  15. package/dist/ai/providers/blocks/openai.js +2 -1
  16. package/dist/ai/providers/blocks/openai.js.map +1 -1
  17. package/dist/ai/providers/blocks/xai.js +2 -1
  18. package/dist/ai/providers/blocks/xai.js.map +1 -1
  19. package/dist/ai/providers/icons.d.ts +7 -0
  20. package/dist/ai/providers/icons.js +9 -0
  21. package/dist/ai/providers/icons.js.map +1 -0
  22. package/dist/ai/providers/registry.js +34 -23
  23. package/dist/ai/providers/registry.js.map +1 -1
  24. package/dist/collections/Instructions.js +37 -0
  25. package/dist/collections/Instructions.js.map +1 -1
  26. package/dist/endpoints/chat.d.ts +4 -0
  27. package/dist/endpoints/index.js +86 -10
  28. package/dist/endpoints/index.js.map +1 -1
  29. package/dist/exports/fields.d.ts +1 -0
  30. package/dist/exports/fields.js +1 -0
  31. package/dist/exports/fields.js.map +1 -1
  32. package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
  33. package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
  34. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
  35. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
  36. package/dist/fields/PromptEditorField/PromptEditorField.js +7 -2
  37. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  38. package/dist/fields/PromptEditorField/PromptEditorField.jsx +5 -2
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/init.js +23 -6
  43. package/dist/init.js.map +1 -1
  44. package/dist/payload-ai.d.ts +149 -0
  45. package/dist/providers/InstructionsProvider/InstructionsProvider.js +3 -0
  46. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  47. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +3 -0
  48. package/dist/providers/InstructionsProvider/useInstructions.js +18 -1
  49. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  50. package/dist/styles.d.ts +11 -0
  51. package/dist/types/handlebars-async-helpers.d.ts +1 -0
  52. package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
  53. package/dist/types/react-mentions.d.ts +1 -0
  54. package/dist/ui/Compose/Compose.d.ts +1 -0
  55. package/dist/ui/Compose/Compose.js +2 -2
  56. package/dist/ui/Compose/Compose.js.map +1 -1
  57. package/dist/ui/Compose/Compose.jsx +2 -2
  58. package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
  59. package/dist/ui/Compose/UndoRedoActions.js +8 -5
  60. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  61. package/dist/ui/Compose/UndoRedoActions.jsx +6 -5
  62. package/dist/ui/Compose/compose.module.css +56 -16
  63. package/dist/ui/Compose/hooks/menu/itemsMap.js +12 -6
  64. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  65. package/dist/ui/Compose/hooks/menu/useMenu.js +26 -15
  66. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  67. package/dist/ui/Compose/hooks/menu/useMenu.jsx +25 -12
  68. package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
  69. package/dist/ui/Compose/hooks/useHistory.js +65 -25
  70. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  71. package/dist/ui/DynamicVoiceSelect/index.js +63 -11
  72. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  73. package/dist/ui/DynamicVoiceSelect/index.jsx +47 -14
  74. package/dist/ui/VoicesFetcher/index.js +54 -8
  75. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  76. package/dist/ui/VoicesFetcher/index.jsx +32 -9
  77. package/dist/utilities/buildSmartPrompt.d.ts +22 -0
  78. package/dist/utilities/buildSmartPrompt.js +143 -0
  79. package/dist/utilities/buildSmartPrompt.js.map +1 -0
  80. package/dist/utilities/resolveImageReferences.d.ts +3 -1
  81. package/dist/utilities/resolveImageReferences.js +21 -2
  82. package/dist/utilities/resolveImageReferences.js.map +1 -1
  83. package/dist/utilities/updateFieldsConfig.js +7 -1
  84. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  85. package/package.json +3 -3
  86. package/dist/endpoints/chat.d.js +0 -3
  87. package/dist/endpoints/chat.d.js.map +0 -1
  88. package/dist/payload-ai.d.js +0 -3
  89. package/dist/payload-ai.d.js.map +0 -1
  90. package/dist/styles.d.js +0 -2
  91. package/dist/styles.d.js.map +0 -1
  92. package/dist/types/handlebars-async-helpers.d.js +0 -2
  93. package/dist/types/handlebars-async-helpers.d.js.map +0 -1
  94. package/dist/types/handlebars-dist-handlebars.d.js +0 -2
  95. package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
  96. package/dist/types/react-mentions.d.js +0 -2
  97. package/dist/types/react-mentions.d.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"sourcesContent":["'use client'\n\nimport { useAuth, useConfig, useDocumentDrawer } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { SerializedPromptField } from '../../types.js'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { InstructionsContext } from './context.js'\n\nexport const InstructionsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [instructions, setInstructionsState] = useState({})\n const [promptFields, setPromptFields] = useState<SerializedPromptField[]>([])\n const [activeCollection, setActiveCollection] = useState('')\n const [isConfigAllowed, setIsConfigAllowed] = useState(false)\n const [enabledLanguages, setEnabledLanguages] = useState<string[]>()\n const [debugging, setDebugging] = useState(false)\n const { user } = useAuth()\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n // Global Document Drawer state\n const [drawerInstructionId, setDrawerInstructionId] = useState<string>('')\n const [drawerOpenCount, setDrawerOpenCount] = useState(0)\n\n const [DocumentDrawer, _, { openDrawer: openPayloadDrawer }] = useDocumentDrawer({\n id: drawerInstructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const openDrawer = useCallback((id: string) => {\n setDrawerInstructionId(id)\n setDrawerOpenCount((prev) => prev + 1)\n }, [])\n\n // Open drawer when count changes\n useEffect(() => {\n if (drawerOpenCount > 0) {\n openPayloadDrawer()\n }\n }, [drawerOpenCount, openPayloadDrawer])\n\n // This is here because each field have separate instructions and\n // their ID is needed to edit them for Drawer\n useEffect(() => {\n // Only fetch if we have a user ID - prevents fetching on every user object reference change\n if (!user?.id) {\n return\n }\n\n fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`)\n .then(async (res) => {\n await res.json().then((data) => {\n setIsConfigAllowed(data?.isConfigAllowed || false)\n setEnabledLanguages(data?.enabledLanguages || [])\n setInstructionsState(data?.fields || {})\n setPromptFields(data?.promptFields || [])\n setDebugging(data?.debugging || false)\n })\n })\n .catch((err) => {\n console.error('InstructionsProvider:', err)\n })\n }, [api, serverURL, user?.id])\n\n return (\n <InstructionsContext.Provider\n value={{\n activeCollection,\n debugging,\n enabledLanguages,\n hasInstructions: instructions && Object.keys(instructions).length > 0,\n instructions,\n isConfigAllowed,\n openDrawer,\n promptFields,\n setActiveCollection,\n }}\n >\n {children}\n <DocumentDrawer />\n </InstructionsContext.Provider>\n )\n}\n"],"names":["useAuth","useConfig","useDocumentDrawer","React","useCallback","useEffect","useState","PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_INSTRUCTIONS_TABLE","InstructionsContext","InstructionsProvider","children","instructions","setInstructionsState","promptFields","setPromptFields","activeCollection","setActiveCollection","isConfigAllowed","setIsConfigAllowed","enabledLanguages","setEnabledLanguages","debugging","setDebugging","user","config","routes","api","serverURL","drawerInstructionId","setDrawerInstructionId","drawerOpenCount","setDrawerOpenCount","DocumentDrawer","_","openDrawer","openPayloadDrawer","id","collectionSlug","prev","fetch","then","res","json","data","fields","catch","err","console","error","Provider","value","hasInstructions","Object","keys","length"],"mappings":"AAAA;;AAEA,SAASA,OAAO,EAAEC,SAAS,EAAEC,iBAAiB,QAAQ,iBAAgB;AACtE,OAAOC,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAI/D,SAASC,4BAA4B,EAAEC,yBAAyB,QAAQ,oBAAmB;AAC3F,SAASC,mBAAmB,QAAQ,eAAc;AAElD,OAAO,MAAMC,uBAAgE,CAAC,EAAEC,QAAQ,EAAE;IACxF,MAAM,CAACC,cAAcC,qBAAqB,GAAGP,SAAS,CAAC;IACvD,MAAM,CAACQ,cAAcC,gBAAgB,GAAGT,SAAkC,EAAE;IAC5E,MAAM,CAACU,kBAAkBC,oBAAoB,GAAGX,SAAS;IACzD,MAAM,CAACY,iBAAiBC,mBAAmB,GAAGb,SAAS;IACvD,MAAM,CAACc,kBAAkBC,oBAAoB,GAAGf;IAChD,MAAM,CAACgB,WAAWC,aAAa,GAAGjB,SAAS;IAC3C,MAAM,EAAEkB,IAAI,EAAE,GAAGxB;IAEjB,MAAM,EAAEyB,MAAM,EAAE,GAAGxB;IACnB,MAAM,EACJyB,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IAEJ,+BAA+B;IAC/B,MAAM,CAACI,qBAAqBC,uBAAuB,GAAGxB,SAAiB;IACvE,MAAM,CAACyB,iBAAiBC,mBAAmB,GAAG1B,SAAS;IAEvD,MAAM,CAAC2B,gBAAgBC,GAAG,EAAEC,YAAYC,iBAAiB,EAAE,CAAC,GAAGlC,kBAAkB;QAC/EmC,IAAIR;QACJS,gBAAgB9B;IAClB;IAEA,MAAM2B,aAAa/B,YAAY,CAACiC;QAC9BP,uBAAuBO;QACvBL,mBAAmB,CAACO,OAASA,OAAO;IACtC,GAAG,EAAE;IAEL,iCAAiC;IACjClC,UAAU;QACR,IAAI0B,kBAAkB,GAAG;YACvBK;QACF;IACF,GAAG;QAACL;QAAiBK;KAAkB;IAEvC,iEAAiE;IACjE,6CAA6C;IAC7C/B,UAAU;QACR,4FAA4F;QAC5F,IAAI,CAACmB,MAAMa,IAAI;YACb;QACF;QAEAG,MAAM,CAAC,EAAEZ,UAAU,EAAED,IAAI,EAAEpB,6BAA6B,CAAC,EACtDkC,IAAI,CAAC,OAAOC;YACX,MAAMA,IAAIC,IAAI,GAAGF,IAAI,CAAC,CAACG;gBACrBzB,mBAAmByB,MAAM1B,mBAAmB;gBAC5CG,oBAAoBuB,MAAMxB,oBAAoB,EAAE;gBAChDP,qBAAqB+B,MAAMC,UAAU,CAAC;gBACtC9B,gBAAgB6B,MAAM9B,gBAAgB,EAAE;gBACxCS,aAAaqB,MAAMtB,aAAa;YAClC;QACF,GACCwB,KAAK,CAAC,CAACC;YACNC,QAAQC,KAAK,CAAC,yBAAyBF;QACzC;IACJ,GAAG;QAACpB;QAAKC;QAAWJ,MAAMa;KAAG;IAE7B,qBACE,MAAC5B,oBAAoByC,QAAQ;QAC3BC,OAAO;YACLnC;YACAM;YACAF;YACAgC,iBAAiBxC,gBAAgByC,OAAOC,IAAI,CAAC1C,cAAc2C,MAAM,GAAG;YACpE3C;YACAM;YACAiB;YACArB;YACAG;QACF;;YAECN;0BACD,KAACsB;;;AAGP,EAAC"}
1
+ {"version":3,"sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"sourcesContent":["'use client'\n\nimport { useAuth, useConfig, useDocumentDrawer } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { SerializedPromptField } from '../../types.js'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { useActiveFieldTracking } from '../../ui/Compose/hooks/useActiveFieldTracking.js'\nimport { InstructionsContext } from './context.js'\n\nexport const InstructionsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n // Initialize field tracking globally so ai-plugin-active class is added on field focus\n useActiveFieldTracking()\n \n const [instructions, setInstructionsState] = useState({})\n const [promptFields, setPromptFields] = useState<SerializedPromptField[]>([])\n const [activeCollection, setActiveCollection] = useState('')\n const [isConfigAllowed, setIsConfigAllowed] = useState(false)\n const [enabledLanguages, setEnabledLanguages] = useState<string[]>()\n const [debugging, setDebugging] = useState(false)\n const { user } = useAuth()\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n // Global Document Drawer state\n const [drawerInstructionId, setDrawerInstructionId] = useState<string>('')\n const [drawerOpenCount, setDrawerOpenCount] = useState(0)\n\n const [DocumentDrawer, _, { openDrawer: openPayloadDrawer }] = useDocumentDrawer({\n id: drawerInstructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const openDrawer = useCallback((id: string) => {\n setDrawerInstructionId(id)\n setDrawerOpenCount((prev) => prev + 1)\n }, [])\n\n // Open drawer when count changes\n useEffect(() => {\n if (drawerOpenCount > 0) {\n openPayloadDrawer()\n }\n }, [drawerOpenCount, openPayloadDrawer])\n\n // This is here because each field have separate instructions and\n // their ID is needed to edit them for Drawer\n useEffect(() => {\n // Only fetch if we have a user ID - prevents fetching on every user object reference change\n if (!user?.id) {\n return\n }\n\n fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`)\n .then(async (res) => {\n await res.json().then((data) => {\n setIsConfigAllowed(data?.isConfigAllowed || false)\n setEnabledLanguages(data?.enabledLanguages || [])\n setInstructionsState(data?.fields || {})\n setPromptFields(data?.promptFields || [])\n setDebugging(data?.debugging || false)\n })\n })\n .catch((err) => {\n console.error('InstructionsProvider:', err)\n })\n }, [api, serverURL, user?.id])\n\n return (\n <InstructionsContext.Provider\n value={{\n activeCollection,\n debugging,\n enabledLanguages,\n hasInstructions: instructions && Object.keys(instructions).length > 0,\n instructions,\n isConfigAllowed,\n openDrawer,\n promptFields,\n setActiveCollection,\n }}\n >\n {children}\n <DocumentDrawer />\n </InstructionsContext.Provider>\n )\n}\n"],"names":["useAuth","useConfig","useDocumentDrawer","React","useCallback","useEffect","useState","PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_INSTRUCTIONS_TABLE","useActiveFieldTracking","InstructionsContext","InstructionsProvider","children","instructions","setInstructionsState","promptFields","setPromptFields","activeCollection","setActiveCollection","isConfigAllowed","setIsConfigAllowed","enabledLanguages","setEnabledLanguages","debugging","setDebugging","user","config","routes","api","serverURL","drawerInstructionId","setDrawerInstructionId","drawerOpenCount","setDrawerOpenCount","DocumentDrawer","_","openDrawer","openPayloadDrawer","id","collectionSlug","prev","fetch","then","res","json","data","fields","catch","err","console","error","Provider","value","hasInstructions","Object","keys","length"],"mappings":"AAAA;;AAEA,SAASA,OAAO,EAAEC,SAAS,EAAEC,iBAAiB,QAAQ,iBAAgB;AACtE,OAAOC,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAI/D,SAASC,4BAA4B,EAAEC,yBAAyB,QAAQ,oBAAmB;AAC3F,SAASC,sBAAsB,QAAQ,mDAAkD;AACzF,SAASC,mBAAmB,QAAQ,eAAc;AAElD,OAAO,MAAMC,uBAAgE,CAAC,EAAEC,QAAQ,EAAE;IACxF,uFAAuF;IACvFH;IAEA,MAAM,CAACI,cAAcC,qBAAqB,GAAGR,SAAS,CAAC;IACvD,MAAM,CAACS,cAAcC,gBAAgB,GAAGV,SAAkC,EAAE;IAC5E,MAAM,CAACW,kBAAkBC,oBAAoB,GAAGZ,SAAS;IACzD,MAAM,CAACa,iBAAiBC,mBAAmB,GAAGd,SAAS;IACvD,MAAM,CAACe,kBAAkBC,oBAAoB,GAAGhB;IAChD,MAAM,CAACiB,WAAWC,aAAa,GAAGlB,SAAS;IAC3C,MAAM,EAAEmB,IAAI,EAAE,GAAGzB;IAEjB,MAAM,EAAE0B,MAAM,EAAE,GAAGzB;IACnB,MAAM,EACJ0B,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IAEJ,+BAA+B;IAC/B,MAAM,CAACI,qBAAqBC,uBAAuB,GAAGzB,SAAiB;IACvE,MAAM,CAAC0B,iBAAiBC,mBAAmB,GAAG3B,SAAS;IAEvD,MAAM,CAAC4B,gBAAgBC,GAAG,EAAEC,YAAYC,iBAAiB,EAAE,CAAC,GAAGnC,kBAAkB;QAC/EoC,IAAIR;QACJS,gBAAgB/B;IAClB;IAEA,MAAM4B,aAAahC,YAAY,CAACkC;QAC9BP,uBAAuBO;QACvBL,mBAAmB,CAACO,OAASA,OAAO;IACtC,GAAG,EAAE;IAEL,iCAAiC;IACjCnC,UAAU;QACR,IAAI2B,kBAAkB,GAAG;YACvBK;QACF;IACF,GAAG;QAACL;QAAiBK;KAAkB;IAEvC,iEAAiE;IACjE,6CAA6C;IAC7ChC,UAAU;QACR,4FAA4F;QAC5F,IAAI,CAACoB,MAAMa,IAAI;YACb;QACF;QAEAG,MAAM,CAAC,EAAEZ,UAAU,EAAED,IAAI,EAAErB,6BAA6B,CAAC,EACtDmC,IAAI,CAAC,OAAOC;YACX,MAAMA,IAAIC,IAAI,GAAGF,IAAI,CAAC,CAACG;gBACrBzB,mBAAmByB,MAAM1B,mBAAmB;gBAC5CG,oBAAoBuB,MAAMxB,oBAAoB,EAAE;gBAChDP,qBAAqB+B,MAAMC,UAAU,CAAC;gBACtC9B,gBAAgB6B,MAAM9B,gBAAgB,EAAE;gBACxCS,aAAaqB,MAAMtB,aAAa;YAClC;QACF,GACCwB,KAAK,CAAC,CAACC;YACNC,QAAQC,KAAK,CAAC,yBAAyBF;QACzC;IACJ,GAAG;QAACpB;QAAKC;QAAWJ,MAAMa;KAAG;IAE7B,qBACE,MAAC5B,oBAAoByC,QAAQ;QAC3BC,OAAO;YACLnC;YACAM;YACAF;YACAgC,iBAAiBxC,gBAAgByC,OAAOC,IAAI,CAAC1C,cAAc2C,MAAM,GAAG;YACpE3C;YACAM;YACAiB;YACArB;YACAG;QACF;;YAECN;0BACD,KAACsB;;;AAGP,EAAC"}
@@ -2,8 +2,11 @@
2
2
  import { useAuth, useConfig, useDocumentDrawer } from '@payloadcms/ui';
3
3
  import React, { useCallback, useEffect, useState } from 'react';
4
4
  import { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
5
+ import { useActiveFieldTracking } from '../../ui/Compose/hooks/useActiveFieldTracking.js';
5
6
  import { InstructionsContext } from './context.js';
6
7
  export const InstructionsProvider = ({ children }) => {
8
+ // Initialize field tracking globally so ai-plugin-active class is added on field focus
9
+ useActiveFieldTracking();
7
10
  const [instructions, setInstructionsState] = useState({});
8
11
  const [promptFields, setPromptFields] = useState([]);
9
12
  const [activeCollection, setActiveCollection] = useState('');
@@ -3,6 +3,21 @@ import { useDocumentInfo } from '@payloadcms/ui';
3
3
  import { useContext, useEffect, useMemo, useState } from 'react';
4
4
  import { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
5
5
  import { handlebarsHelpers, handlebarsHelpersMap } from '../../libraries/handlebars/helpersMap.js';
6
+ /**
7
+ * Normalize a schema path by removing array indices.
8
+ * This allows fields inside arrays to match their instruction records.
9
+ *
10
+ * Example:
11
+ * 'array-test-cases.keywords.0.keyword' -> 'array-test-cases.keywords.keyword'
12
+ * 'characters.views.2.description' -> 'characters.views.description'
13
+ * 'posts.title' -> 'posts.title' (no change)
14
+ */ const normalizeSchemaPath = (path)=>{
15
+ if (!path) {
16
+ return path;
17
+ }
18
+ // Remove numeric path segments (array indices)
19
+ return path.split('.').filter((segment)=>!/^\d+$/.test(segment)).join('.');
20
+ };
6
21
  const warnedOnceOnNoInstructionId = new Set();
7
22
  const warnOnceOnMissingInstructions = (path)=>{
8
23
  if (!warnedOnceOnNoInstructionId.has(path)) {
@@ -91,7 +106,9 @@ export const useInstructions = (update = {})=>{
91
106
  instructions,
92
107
  promptFields
93
108
  ]);
94
- const pathInstructions = instructions[schemaPath];
109
+ // Normalize the schema path to handle array indices
110
+ const normalizedSchemaPath = normalizeSchemaPath(schemaPath);
111
+ const pathInstructions = instructions[normalizedSchemaPath];
95
112
  if (debugging && !pathInstructions && schemaPath && hasInstructions) {
96
113
  warnOnceOnMissingInstructions(schemaPath);
97
114
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"sourcesContent":["import { InstructionsContext } from '@ai-stack/payloadcms/client'\nimport { useDocumentInfo } from '@payloadcms/ui'\nimport { useContext, useEffect, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { handlebarsHelpers, handlebarsHelpersMap } from '../../libraries/handlebars/helpersMap.js'\n\n\nconst warnedOnceOnNoInstructionId = new Set<string>()\nconst warnOnceOnMissingInstructions = (path: string) => {\n if (!warnedOnceOnNoInstructionId.has(path)) {\n warnedOnceOnNoInstructionId.add(path)\n // eslint-disable-next-line no-console\n console.info(`[AI Plugin] There are no AI instructions for this field: ${path}. Enable \"generatePromptOnInit\" option to enable them.`)\n }\n}\n\nexport const useInstructions = (\n update: {\n schemaPath?: unknown\n } = {},\n) => {\n const context = useContext(InstructionsContext)\n const { collectionSlug } = useDocumentInfo()\n const { activeCollection, debugging, hasInstructions, instructions, promptFields, setActiveCollection } = context\n\n const [schemaPath, setSchemaPath] = useState(update.schemaPath as string)\n\n useEffect(() => {\n if (update.schemaPath !== schemaPath) {\n setSchemaPath((update.schemaPath as string) ?? '')\n }\n }, [update.schemaPath, schemaPath])\n\n useEffect(() => {\n if (\n activeCollection !== collectionSlug &&\n collectionSlug !== PLUGIN_INSTRUCTIONS_TABLE &&\n typeof setActiveCollection === 'function'\n ) {\n setActiveCollection(collectionSlug ?? '')\n }\n }, [activeCollection, collectionSlug, setActiveCollection])\n\n const groupedFields = useMemo(() => {\n const result: Record<string, string[]> = {}\n\n for (const fullKey of Object.keys(instructions || {})) {\n const [collection, ...pathParts] = fullKey.split('.')\n const path = pathParts.join('.')\n if (!result[collection]) {\n result[collection] = []\n }\n result[collection].push(path)\n }\n\n return result\n }, [instructions])\n\n // Suggestions for prompt editor\n const promptEditorSuggestions = useMemo(() => {\n const activeFields = groupedFields[activeCollection as string] || []\n const suggestions: string[] = []\n\n // Build instruction lookup map once for O(1) access instead of O(n) search per field\n const instructionLookup = new Map(\n Object.entries(instructions).map(([key, value]) => {\n const path = key.split('.').slice(1).join('.')\n return [path, value]\n })\n )\n\n activeFields.forEach((f) => {\n const fieldInfo = instructionLookup.get(f)\n\n if (!fieldInfo) {return}\n\n if (fieldInfo.fieldType === 'upload') {\n return\n }\n\n const helpers = handlebarsHelpers.filter(\n (h) => (handlebarsHelpersMap as Record<string, { field?: string }>)[h]?.field === fieldInfo.fieldType,\n )\n\n if (helpers.length) {\n for (const helper of helpers) {\n suggestions.push(`${helper} ${f}`)\n }\n } else {\n suggestions.push(f)\n }\n })\n\n promptFields.forEach(({ name, collections }) => {\n if (!activeCollection) {return}\n\n if (!collections || collections.includes(activeCollection)) {\n suggestions.push(name)\n }\n })\n\n return suggestions\n }, [groupedFields, activeCollection, instructions, promptFields])\n\n const pathInstructions = instructions[schemaPath]\n\n if (debugging && !pathInstructions && schemaPath && hasInstructions) {\n warnOnceOnMissingInstructions(schemaPath)\n }\n \n return {\n ...context,\n ...(pathInstructions || {}),\n promptEditorSuggestions,\n }\n}\n"],"names":["InstructionsContext","useDocumentInfo","useContext","useEffect","useMemo","useState","PLUGIN_INSTRUCTIONS_TABLE","handlebarsHelpers","handlebarsHelpersMap","warnedOnceOnNoInstructionId","Set","warnOnceOnMissingInstructions","path","has","add","console","info","useInstructions","update","context","collectionSlug","activeCollection","debugging","hasInstructions","instructions","promptFields","setActiveCollection","schemaPath","setSchemaPath","groupedFields","result","fullKey","Object","keys","collection","pathParts","split","join","push","promptEditorSuggestions","activeFields","suggestions","instructionLookup","Map","entries","map","key","value","slice","forEach","f","fieldInfo","get","fieldType","helpers","filter","h","field","length","helper","name","collections","includes","pathInstructions"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"sourcesContent":["import { InstructionsContext } from '@ai-stack/payloadcms/client'\nimport { useDocumentInfo } from '@payloadcms/ui'\nimport { useContext, useEffect, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { handlebarsHelpers, handlebarsHelpersMap } from '../../libraries/handlebars/helpersMap.js'\n\n/**\n * Normalize a schema path by removing array indices.\n * This allows fields inside arrays to match their instruction records.\n * \n * Example:\n * 'array-test-cases.keywords.0.keyword' -> 'array-test-cases.keywords.keyword'\n * 'characters.views.2.description' -> 'characters.views.description'\n * 'posts.title' -> 'posts.title' (no change)\n */\nconst normalizeSchemaPath = (path: string): string => {\n if (!path) {\n return path\n }\n // Remove numeric path segments (array indices)\n return path.split('.').filter(segment => !/^\\d+$/.test(segment)).join('.')\n}\n\nconst warnedOnceOnNoInstructionId = new Set<string>()\nconst warnOnceOnMissingInstructions = (path: string) => {\n if (!warnedOnceOnNoInstructionId.has(path)) {\n warnedOnceOnNoInstructionId.add(path)\n // eslint-disable-next-line no-console\n console.info(`[AI Plugin] There are no AI instructions for this field: ${path}. Enable \"generatePromptOnInit\" option to enable them.`)\n }\n}\n\nexport const useInstructions = (\n update: {\n schemaPath?: unknown\n } = {},\n) => {\n const context = useContext(InstructionsContext)\n const { collectionSlug } = useDocumentInfo()\n const { activeCollection, debugging, hasInstructions, instructions, promptFields, setActiveCollection } = context\n\n const [schemaPath, setSchemaPath] = useState(update.schemaPath as string)\n\n useEffect(() => {\n if (update.schemaPath !== schemaPath) {\n setSchemaPath((update.schemaPath as string) ?? '')\n }\n }, [update.schemaPath, schemaPath])\n\n useEffect(() => {\n if (\n activeCollection !== collectionSlug &&\n collectionSlug !== PLUGIN_INSTRUCTIONS_TABLE &&\n typeof setActiveCollection === 'function'\n ) {\n setActiveCollection(collectionSlug ?? '')\n }\n }, [activeCollection, collectionSlug, setActiveCollection])\n\n const groupedFields = useMemo(() => {\n const result: Record<string, string[]> = {}\n\n for (const fullKey of Object.keys(instructions || {})) {\n const [collection, ...pathParts] = fullKey.split('.')\n const path = pathParts.join('.')\n if (!result[collection]) {\n result[collection] = []\n }\n result[collection].push(path)\n }\n\n return result\n }, [instructions])\n\n // Suggestions for prompt editor\n const promptEditorSuggestions = useMemo(() => {\n const activeFields = groupedFields[activeCollection as string] || []\n const suggestions: string[] = []\n\n // Build instruction lookup map once for O(1) access instead of O(n) search per field\n const instructionLookup = new Map(\n Object.entries(instructions).map(([key, value]) => {\n const path = key.split('.').slice(1).join('.')\n return [path, value]\n })\n )\n\n activeFields.forEach((f) => {\n const fieldInfo = instructionLookup.get(f)\n\n if (!fieldInfo) {return}\n\n if (fieldInfo.fieldType === 'upload') {\n return\n }\n\n const helpers = handlebarsHelpers.filter(\n (h) => (handlebarsHelpersMap as Record<string, { field?: string }>)[h]?.field === fieldInfo.fieldType,\n )\n\n if (helpers.length) {\n for (const helper of helpers) {\n suggestions.push(`${helper} ${f}`)\n }\n } else {\n suggestions.push(f)\n }\n })\n\n promptFields.forEach(({ name, collections }) => {\n if (!activeCollection) {return}\n\n if (!collections || collections.includes(activeCollection)) {\n suggestions.push(name)\n }\n })\n\n return suggestions\n }, [groupedFields, activeCollection, instructions, promptFields])\n\n // Normalize the schema path to handle array indices\n const normalizedSchemaPath = normalizeSchemaPath(schemaPath)\n const pathInstructions = instructions[normalizedSchemaPath]\n\n if (debugging && !pathInstructions && schemaPath && hasInstructions) {\n warnOnceOnMissingInstructions(schemaPath)\n }\n \n return {\n ...context,\n ...(pathInstructions || {}),\n promptEditorSuggestions,\n }\n}\n\n"],"names":["InstructionsContext","useDocumentInfo","useContext","useEffect","useMemo","useState","PLUGIN_INSTRUCTIONS_TABLE","handlebarsHelpers","handlebarsHelpersMap","normalizeSchemaPath","path","split","filter","segment","test","join","warnedOnceOnNoInstructionId","Set","warnOnceOnMissingInstructions","has","add","console","info","useInstructions","update","context","collectionSlug","activeCollection","debugging","hasInstructions","instructions","promptFields","setActiveCollection","schemaPath","setSchemaPath","groupedFields","result","fullKey","Object","keys","collection","pathParts","push","promptEditorSuggestions","activeFields","suggestions","instructionLookup","Map","entries","map","key","value","slice","forEach","f","fieldInfo","get","fieldType","helpers","h","field","length","helper","name","collections","includes","normalizedSchemaPath","pathInstructions"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ declare module '*.css' {
2
+ const classes: { [key: string]: string }
3
+
4
+ export default classes
5
+ }
6
+
7
+ declare module '*.scss' {
8
+ const classes: { [key: string]: string }
9
+
10
+ export default classes
11
+ }
@@ -0,0 +1 @@
1
+ declare module 'handlebars-async-helpers'
@@ -0,0 +1 @@
1
+ declare module 'handlebars/dist/handlebars.js'
@@ -0,0 +1 @@
1
+ declare module 'react-mentions/dist/react-mentions.cjs.js'
@@ -6,6 +6,7 @@ export type ComposeProps = {
6
6
  path: string;
7
7
  schemaPath: string;
8
8
  };
9
+ forceVisible?: boolean;
9
10
  instructionId: string;
10
11
  isConfigAllowed: boolean;
11
12
  };
@@ -11,7 +11,7 @@ import { useMenu } from './hooks/menu/useMenu.js';
11
11
  import { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js';
12
12
  import { useGenerate } from './hooks/useGenerate.js';
13
13
  import { UndoRedoActions } from './UndoRedoActions.js';
14
- export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
14
+ export const Compose = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed })=>{
15
15
  const pathFromContext = descriptionProps?.path;
16
16
  const { editor: lexicalEditor } = useEditorConfigContext();
17
17
  // Get global openDrawer from context
@@ -164,7 +164,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
164
164
  isAnyLoading
165
165
  ]);
166
166
  return /*#__PURE__*/ _jsxs("label", {
167
- className: `payloadai-compose__actions ${styles.actions}`,
167
+ className: `payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`,
168
168
  onClick: (e)=>e.preventDefault(),
169
169
  role: "presentation",
170
170
  children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { Popup, useField } from '@payloadcms/ui'\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js'\nimport { useGenerate } from './hooks/useGenerate.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\n\nexport type ComposeProps = {\n descriptionProps?: {\n field: ClientField\n path: string\n schemaPath: string\n }\n instructionId: string\n isConfigAllowed: boolean\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, instructionId, isConfigAllowed }) => {\n const pathFromContext = descriptionProps?.path\n const { editor: lexicalEditor } = useEditorConfigContext()\n \n // Get global openDrawer from context\n const { openDrawer } = useInstructions()\n\n // Initialize global active-field tracking\n useActiveFieldTracking()\n\n const [isProcessing, setIsProcessing] = useState<boolean>(false)\n const { generate, isJobActive, isLoading, jobProgress, jobStatus, stop } = useGenerate({ instructionId })\n\n // Memoize menu event handlers to prevent recreation on every render\n const onCompose = useCallback(() => {\n console.log('Composing...')\n setIsProcessing(true)\n generate({\n action: 'Compose',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onExpand = useCallback(() => {\n console.log('Expanding...')\n generate({\n action: 'Expand',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onProofread = useCallback(() => {\n console.log('Proofreading...')\n generate({\n action: 'Proofread',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onRephrase = useCallback(() => {\n console.log('Rephrasing...')\n generate({\n action: 'Rephrase',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSimplify = useCallback(() => {\n console.log('Simplifying...')\n generate({\n action: 'Simplify',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSummarize = useCallback(() => {\n console.log('Summarizing...')\n generate({\n action: 'Summarize',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onTranslate = useCallback((data: unknown) => {\n console.log('Translating...')\n generate({\n action: 'Translate',\n params: data,\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const handleOpenSettings = useCallback(() => {\n if (isConfigAllowed) {\n openDrawer(instructionId)\n }\n }, [isConfigAllowed, openDrawer, instructionId])\n\n const { ActiveComponent, Menu } = useMenu(\n {\n onCompose,\n onExpand,\n onProofread,\n onRephrase,\n onSettings: isConfigAllowed ? handleOpenSettings : undefined,\n onSimplify,\n onSummarize,\n onTranslate,\n },\n {\n isConfigAllowed,\n },\n )\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit\n }, [])\n\n const popupRender = useCallback(\n ({ close }: { close: () => void }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n // Combine loading states to reduce re-renders\n const isAnyLoading = isProcessing || isLoading || isJobActive\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isAnyLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isAnyLoading])\n\n return (\n <label\n className={`payloadai-compose__actions ${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n role=\"presentation\"\n >\n {memoizedPopup}\n <ActiveComponent\n isLoading={isProcessing || isLoading || isJobActive}\n loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined}\n stop={stop}\n />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n )\n}\n"],"names":["useEditorConfigContext","Popup","useField","React","useCallback","useMemo","useState","useInstructions","setSafeLexicalState","PluginIcon","styles","useMenu","useActiveFieldTracking","useGenerate","UndoRedoActions","Compose","descriptionProps","instructionId","isConfigAllowed","pathFromContext","path","editor","lexicalEditor","openDrawer","isProcessing","setIsProcessing","generate","isJobActive","isLoading","jobProgress","jobStatus","stop","onCompose","console","log","action","catch","reason","error","finally","onExpand","onProofread","onRephrase","onSimplify","onSummarize","onTranslate","data","params","handleOpenSettings","ActiveComponent","Menu","onSettings","undefined","setValue","setIfValueIsLexicalState","val","JSON","stringify","popupRender","close","onClose","isAnyLoading","memoizedPopup","button","render","verticalAlign","label","className","actions","onClick","e","preventDefault","role","loadingLabel","Math","max","min","round","onChange"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { Popup, useField } from '@payloadcms/ui'\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js'\nimport { useGenerate } from './hooks/useGenerate.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\n\nexport type ComposeProps = {\n descriptionProps?: {\n field: ClientField\n path: string\n schemaPath: string\n }\n forceVisible?: boolean\n instructionId: string\n isConfigAllowed: boolean\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed }) => {\n const pathFromContext = descriptionProps?.path\n const { editor: lexicalEditor } = useEditorConfigContext()\n \n // Get global openDrawer from context\n const { openDrawer } = useInstructions()\n\n // Initialize global active-field tracking\n useActiveFieldTracking()\n\n const [isProcessing, setIsProcessing] = useState<boolean>(false)\n const { generate, isJobActive, isLoading, jobProgress, jobStatus, stop } = useGenerate({ instructionId })\n\n // Memoize menu event handlers to prevent recreation on every render\n const onCompose = useCallback(() => {\n console.log('Composing...')\n setIsProcessing(true)\n generate({\n action: 'Compose',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onExpand = useCallback(() => {\n console.log('Expanding...')\n generate({\n action: 'Expand',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onProofread = useCallback(() => {\n console.log('Proofreading...')\n generate({\n action: 'Proofread',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onRephrase = useCallback(() => {\n console.log('Rephrasing...')\n generate({\n action: 'Rephrase',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSimplify = useCallback(() => {\n console.log('Simplifying...')\n generate({\n action: 'Simplify',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSummarize = useCallback(() => {\n console.log('Summarizing...')\n generate({\n action: 'Summarize',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onTranslate = useCallback((data: unknown) => {\n console.log('Translating...')\n generate({\n action: 'Translate',\n params: data,\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const handleOpenSettings = useCallback(() => {\n if (isConfigAllowed) {\n openDrawer(instructionId)\n }\n }, [isConfigAllowed, openDrawer, instructionId])\n\n const { ActiveComponent, Menu } = useMenu(\n {\n onCompose,\n onExpand,\n onProofread,\n onRephrase,\n onSettings: isConfigAllowed ? handleOpenSettings : undefined,\n onSimplify,\n onSummarize,\n onTranslate,\n },\n {\n isConfigAllowed,\n },\n )\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit\n }, [])\n\n const popupRender = useCallback(\n ({ close }: { close: () => void }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n // Combine loading states to reduce re-renders\n const isAnyLoading = isProcessing || isLoading || isJobActive\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isAnyLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isAnyLoading])\n\n return (\n <label\n className={`payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`}\n onClick={(e) => e.preventDefault()}\n role=\"presentation\"\n >\n {memoizedPopup}\n <ActiveComponent\n isLoading={isProcessing || isLoading || isJobActive}\n loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined}\n stop={stop}\n />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n )\n}\n"],"names":["useEditorConfigContext","Popup","useField","React","useCallback","useMemo","useState","useInstructions","setSafeLexicalState","PluginIcon","styles","useMenu","useActiveFieldTracking","useGenerate","UndoRedoActions","Compose","descriptionProps","forceVisible","instructionId","isConfigAllowed","pathFromContext","path","editor","lexicalEditor","openDrawer","isProcessing","setIsProcessing","generate","isJobActive","isLoading","jobProgress","jobStatus","stop","onCompose","console","log","action","catch","reason","error","finally","onExpand","onProofread","onRephrase","onSimplify","onSummarize","onTranslate","data","params","handleOpenSettings","ActiveComponent","Menu","onSettings","undefined","setValue","setIfValueIsLexicalState","val","JSON","stringify","popupRender","close","onClose","isAnyLoading","memoizedPopup","button","render","verticalAlign","label","className","actions","actionsVisible","onClick","e","preventDefault","role","loadingLabel","Math","max","min","round","onChange"],"mappings":"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"}
@@ -10,7 +10,7 @@ import { useMenu } from './hooks/menu/useMenu.js';
10
10
  import { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js';
11
11
  import { useGenerate } from './hooks/useGenerate.js';
12
12
  import { UndoRedoActions } from './UndoRedoActions.js';
13
- export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) => {
13
+ export const Compose = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed }) => {
14
14
  const pathFromContext = descriptionProps?.path;
15
15
  const { editor: lexicalEditor } = useEditorConfigContext();
16
16
  // Get global openDrawer from context
@@ -140,7 +140,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) =>
140
140
  const memoizedPopup = useMemo(() => {
141
141
  return (<Popup button={<PluginIcon isLoading={isAnyLoading}/>} render={popupRender} verticalAlign="bottom"/>);
142
142
  }, [popupRender, isAnyLoading]);
143
- return (<label className={`payloadai-compose__actions ${styles.actions}`} onClick={(e) => e.preventDefault()} role="presentation">
143
+ return (<label className={`payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`} onClick={(e) => e.preventDefault()} role="presentation">
144
144
  {memoizedPopup}
145
145
  <ActiveComponent isLoading={isProcessing || isLoading || isJobActive} loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined} stop={stop}/>
146
146
  <UndoRedoActions onChange={(val) => {
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
- export declare const UndoRedoActions: ({ onChange }: {
2
+ export declare const UndoRedoActions: React.MemoExoticComponent<({ onChange }: {
3
3
  onChange: (val: unknown) => void;
4
- }) => React.JSX.Element | null;
4
+ }) => React.JSX.Element | null>;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React, { useCallback, useEffect, useState } from 'react';
2
+ import React, { memo, useCallback, useEffect, useState } from 'react';
3
3
  import { useHistory } from './hooks/useHistory.js';
4
- export const UndoRedoActions = ({ onChange })=>{
4
+ export const UndoRedoActions = /*#__PURE__*/ memo(({ onChange })=>{
5
5
  const { canRedo, canUndo, redo, undo } = useHistory();
6
6
  const redoHistoryValue = useCallback((event)=>{
7
7
  event.stopPropagation();
@@ -10,7 +10,8 @@ export const UndoRedoActions = ({ onChange })=>{
10
10
  onChange(value);
11
11
  }
12
12
  }, [
13
- redo
13
+ redo,
14
+ onChange
14
15
  ]);
15
16
  const undoHistoryValue = useCallback((event)=>{
16
17
  event.stopPropagation();
@@ -19,7 +20,8 @@ export const UndoRedoActions = ({ onChange })=>{
19
20
  onChange(value);
20
21
  }
21
22
  }, [
22
- undo
23
+ undo,
24
+ onChange
23
25
  ]);
24
26
  // Delay rendering until the client-side hydration is complete
25
27
  const [isMounted, setIsMounted] = useState(false);
@@ -53,6 +55,7 @@ export const UndoRedoActions = ({ onChange })=>{
53
55
  })
54
56
  ]
55
57
  });
56
- };
58
+ });
59
+ UndoRedoActions.displayName = 'UndoRedoActions';
57
60
 
58
61
  //# sourceMappingURL=UndoRedoActions.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import type { MouseEventHandler} from 'react';\n\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { useHistory } from './hooks/useHistory.js'\n\nexport const UndoRedoActions = ({ onChange }: { onChange: (val: unknown) => void }) => {\n const { canRedo, canUndo, redo, undo } = useHistory()\n\n const redoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = redo()\n if (value) {\n onChange(value)\n }\n },\n [redo],\n )\n\n const undoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = undo()\n if (value) {\n onChange(value)\n }\n },\n [undo],\n )\n\n // Delay rendering until the client-side hydration is complete\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted || (!canUndo && !canRedo)) {return null}\n\n return (\n <React.Fragment>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`}\n disabled={!canUndo}\n onClick={undoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Undo\n </button>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`}\n disabled={!canRedo}\n onClick={redoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Redo\n </button>\n </React.Fragment>\n )\n}\n"],"names":["React","useCallback","useEffect","useState","useHistory","UndoRedoActions","onChange","canRedo","canUndo","redo","undo","redoHistoryValue","event","stopPropagation","value","undoHistoryValue","isMounted","setIsMounted","Fragment","button","className","disabled","onClick","style","marginBlock","type"],"mappings":";AAEA,OAAOA,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE/D,SAASC,UAAU,QAAQ,wBAAuB;AAElD,OAAO,MAAMC,kBAAkB,CAAC,EAAEC,QAAQ,EAAwC;IAChF,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGN;IAEzC,MAAMO,mBAAmBV,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQL;QACd,IAAIK,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACL;KAAK;IAGR,MAAMM,mBAAmBd,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQJ;QACd,IAAII,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACJ;KAAK;IAGR,8DAA8D;IAC9D,MAAM,CAACM,WAAWC,aAAa,GAAGd,SAAS;IAE3CD,UAAU;QACRe,aAAa;IACf,GAAG,EAAE;IAEL,IAAI,CAACD,aAAc,CAACR,WAAW,CAACD,SAAU;QAAC,OAAO;IAAI;IAEtD,qBACE,MAACP,MAAMkB,QAAQ;;0BACb,KAACC;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACZ,WAAW,gBAAgB,CAAC;gBACpFa,UAAU,CAACb;gBACXc,SAASP;gBACTQ,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;0BAGD,KAACN;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACb,WAAW,gBAAgB,CAAC;gBACpFc,UAAU,CAACd;gBACXe,SAASX;gBACTY,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;;;AAKP,EAAC"}
1
+ {"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import type { MouseEventHandler } from 'react'\n\nimport React, { memo, useCallback, useEffect, useState } from 'react'\n\nimport { useHistory } from './hooks/useHistory.js'\n\nexport const UndoRedoActions = memo(({ onChange }: { onChange: (val: unknown) => void }) => {\n const { canRedo, canUndo, redo, undo } = useHistory()\n\n const redoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = redo()\n if (value) {\n onChange(value)\n }\n },\n [redo, onChange],\n )\n\n const undoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = undo()\n if (value) {\n onChange(value)\n }\n },\n [undo, onChange],\n )\n\n // Delay rendering until the client-side hydration is complete\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted || (!canUndo && !canRedo)) {\n return null\n }\n\n return (\n <React.Fragment>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`}\n disabled={!canUndo}\n onClick={undoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Undo\n </button>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`}\n disabled={!canRedo}\n onClick={redoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Redo\n </button>\n </React.Fragment>\n )\n})\n\nUndoRedoActions.displayName = 'UndoRedoActions'\n"],"names":["React","memo","useCallback","useEffect","useState","useHistory","UndoRedoActions","onChange","canRedo","canUndo","redo","undo","redoHistoryValue","event","stopPropagation","value","undoHistoryValue","isMounted","setIsMounted","Fragment","button","className","disabled","onClick","style","marginBlock","type","displayName"],"mappings":";AAEA,OAAOA,SAASC,IAAI,EAAEC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAErE,SAASC,UAAU,QAAQ,wBAAuB;AAElD,OAAO,MAAMC,gCAAkBL,KAAK,CAAC,EAAEM,QAAQ,EAAwC;IACrF,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGN;IAEzC,MAAMO,mBAAmBV,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQL;QACd,IAAIK,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACL;QAAMH;KAAS;IAGlB,MAAMS,mBAAmBd,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQJ;QACd,IAAII,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACJ;QAAMJ;KAAS;IAGlB,8DAA8D;IAC9D,MAAM,CAACU,WAAWC,aAAa,GAAGd,SAAS;IAE3CD,UAAU;QACRe,aAAa;IACf,GAAG,EAAE;IAEL,IAAI,CAACD,aAAc,CAACR,WAAW,CAACD,SAAU;QACxC,OAAO;IACT;IAEA,qBACE,MAACR,MAAMmB,QAAQ;;0BACb,KAACC;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACZ,WAAW,gBAAgB,CAAC;gBACpFa,UAAU,CAACb;gBACXc,SAASP;gBACTQ,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;0BAGD,KAACN;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACb,WAAW,gBAAgB,CAAC;gBACpFc,UAAU,CAACd;gBACXe,SAASX;gBACTY,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;;;AAKP,GAAE;AAEFpB,gBAAgBqB,WAAW,GAAG"}
@@ -1,6 +1,6 @@
1
- import React, { useCallback, useEffect, useState } from 'react';
1
+ import React, { memo, useCallback, useEffect, useState } from 'react';
2
2
  import { useHistory } from './hooks/useHistory.js';
3
- export const UndoRedoActions = ({ onChange }) => {
3
+ export const UndoRedoActions = memo(({ onChange }) => {
4
4
  const { canRedo, canUndo, redo, undo } = useHistory();
5
5
  const redoHistoryValue = useCallback((event) => {
6
6
  event.stopPropagation();
@@ -8,14 +8,14 @@ export const UndoRedoActions = ({ onChange }) => {
8
8
  if (value) {
9
9
  onChange(value);
10
10
  }
11
- }, [redo]);
11
+ }, [redo, onChange]);
12
12
  const undoHistoryValue = useCallback((event) => {
13
13
  event.stopPropagation();
14
14
  const value = undo();
15
15
  if (value) {
16
16
  onChange(value);
17
17
  }
18
- }, [undo]);
18
+ }, [undo, onChange]);
19
19
  // Delay rendering until the client-side hydration is complete
20
20
  const [isMounted, setIsMounted] = useState(false);
21
21
  useEffect(() => {
@@ -32,4 +32,5 @@ export const UndoRedoActions = ({ onChange }) => {
32
32
  Redo
33
33
  </button>
34
34
  </React.Fragment>);
35
- };
35
+ });
36
+ UndoRedoActions.displayName = 'UndoRedoActions';
@@ -13,10 +13,6 @@
13
13
  transform-origin: top;
14
14
  max-height: 0;
15
15
 
16
- will-change: transform, opacity;
17
- backface-visibility: hidden;
18
- perspective: 1000px;
19
-
20
16
  transition:
21
17
  opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1),
22
18
  transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
@@ -39,23 +35,22 @@
39
35
  max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1);
40
36
  }
41
37
 
38
+
39
+
42
40
  :global(.field-type.ai-plugin-active) .actions {
43
- animation: removeWillChange 0.3s forwards;
41
+ /* animation: removeWillChange 0.3s forwards; */
44
42
  }
45
43
 
46
- @keyframes removeWillChange {
44
+ /* @keyframes removeWillChange {
47
45
  to {
48
46
  will-change: auto;
49
47
  }
50
- }
48
+ } */
51
49
 
52
50
  .actions > * {
53
51
  opacity: 0;
54
52
  transform: translateY(-3px) translateZ(0);
55
53
 
56
- will-change: transform, opacity;
57
- backface-visibility: hidden;
58
-
59
54
  transition:
60
55
  opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1),
61
56
  transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
@@ -68,27 +63,22 @@
68
63
 
69
64
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(1) {
70
65
  transition-delay: 0.05s;
71
- animation: removeWillChange 0.25s 0.05s forwards;
72
66
  }
73
67
 
74
68
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(2) {
75
69
  transition-delay: 0.08s;
76
- animation: removeWillChange 0.28s 0.08s forwards;
77
70
  }
78
71
 
79
72
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(3) {
80
73
  transition-delay: 0.11s;
81
- animation: removeWillChange 0.31s 0.11s forwards;
82
74
  }
83
75
 
84
76
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(4) {
85
77
  transition-delay: 0.14s;
86
- animation: removeWillChange 0.34s 0.14s forwards;
87
78
  }
88
79
 
89
80
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(5) {
90
81
  transition-delay: 0.17s;
91
- animation: removeWillChange 0.37s 0.17s forwards;
92
82
  }
93
83
 
94
84
  @media (prefers-reduced-motion: no-preference) and (min-resolution: 120dpi) {
@@ -103,6 +93,56 @@
103
93
  .actions > * {
104
94
  transition-duration: 0.01ms !important;
105
95
  animation-duration: 0.01ms !important;
106
- will-change: auto !important;
107
96
  }
108
97
  }
98
+
99
+ /* Force visibility modifier - Placed at end for CSS priority */
100
+ .actions.actionsVisible {
101
+ opacity: 1;
102
+ visibility: visible;
103
+ pointer-events: auto;
104
+ max-height: 100px;
105
+ transform: scaleY(1) skewX(0) translateY(0) translateZ(0);
106
+
107
+ /* User requested overrides */
108
+ margin: 0;
109
+ padding: 0;
110
+ /* flex-direction: row-reverse; - Reverted */
111
+ }
112
+
113
+ .actions.actionsVisible > * {
114
+ opacity: 1;
115
+ transform: translateY(0) translateZ(0);
116
+ }
117
+
118
+ /* Ensure field wrapper is positioned for absolute children */
119
+ /* Ensure field wrapper is positioned for absolute children */
120
+ .arrayFieldWrapper {
121
+ position: relative !important;
122
+ }
123
+
124
+ /* Position Compose button - Base */
125
+ .composePortal {
126
+ display: flex !important;
127
+ align-items: center;
128
+ height: min-content;
129
+ z-index: 5;
130
+ }
131
+
132
+ /* When Add Row is present: Overlay at bottom right */
133
+ .composePortalAbsolute {
134
+ position: absolute;
135
+ bottom: 0;
136
+ right: 0;
137
+ }
138
+
139
+ /* When Add Row is missing: Normal flow at bottom right */
140
+ .composePortalStatic {
141
+ position: relative;
142
+ width: 100%;
143
+ justify-content: flex-end;
144
+ margin-top: -32px;
145
+ /* Reset absolute positioning styles */
146
+ bottom: auto;
147
+ right: auto;
148
+ }
@@ -5,7 +5,8 @@ export const menuItemsMap = [
5
5
  name: 'Proofread',
6
6
  component: Proofread,
7
7
  excludedFor: [
8
- 'upload'
8
+ 'upload',
9
+ 'array'
9
10
  ],
10
11
  loadingText: 'Proofreading'
11
12
  },
@@ -13,7 +14,8 @@ export const menuItemsMap = [
13
14
  name: 'Rephrase',
14
15
  component: Rephrase,
15
16
  excludedFor: [
16
- 'upload'
17
+ 'upload',
18
+ 'array'
17
19
  ],
18
20
  loadingText: 'Rephrasing'
19
21
  },
@@ -21,7 +23,8 @@ export const menuItemsMap = [
21
23
  name: 'Translate',
22
24
  component: MemoizedTranslateMenu,
23
25
  excludedFor: [
24
- 'upload'
26
+ 'upload',
27
+ 'array'
25
28
  ],
26
29
  loadingText: 'Translating'
27
30
  },
@@ -30,7 +33,8 @@ export const menuItemsMap = [
30
33
  component: Expand,
31
34
  excludedFor: [
32
35
  'upload',
33
- 'text'
36
+ 'text',
37
+ 'array'
34
38
  ],
35
39
  loadingText: 'Expanding'
36
40
  },
@@ -41,7 +45,8 @@ export const menuItemsMap = [
41
45
  excludedFor: [
42
46
  'upload',
43
47
  'text',
44
- 'richText'
48
+ 'richText',
49
+ 'array'
45
50
  ],
46
51
  loadingText: 'Summarizing'
47
52
  },
@@ -49,7 +54,8 @@ export const menuItemsMap = [
49
54
  name: 'Simplify',
50
55
  component: Simplify,
51
56
  excludedFor: [
52
- 'upload'
57
+ 'upload',
58
+ 'array'
53
59
  ],
54
60
  loadingText: 'Simplifying'
55
61
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import type React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\nimport { MemoizedTranslateMenu, TranslateMenu } from './TranslateMenu.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: MemoizedTranslateMenu,\n excludedFor: ['upload'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","MemoizedTranslateMenu","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAIA,SAASA,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAChG,SAASC,qBAAqB,QAAuB,qBAAoB;AASzE,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWR;QAAWS,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAe;IAChG;QAAEH,MAAM;QAAYC,WAAWP;QAAUQ,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAa;IAC5F;QACEH,MAAM;QACNC,WAAWH;QACXI,aAAa;YAAC;SAAS;QACvBC,aAAa;IACf;IACA;QAAEH,MAAM;QAAUC,WAAWT;QAAQU,aAAa;YAAC;YAAU;SAAO;QAAEC,aAAa;IAAY;IAC/F;QACE,mBAAmB;QACnBH,MAAM;QACNC,WAAWJ;QACXK,aAAa;YAAC;YAAU;YAAQ;SAAW;QAC3CC,aAAa;IACf;IACA;QAAEH,MAAM;QAAYC,WAAWL;QAAUM,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAc;IAC7F;QAAEH,MAAM;QAAWC,WAAWV;QAASY,aAAa;IAAY;IAChE;QAAEH,MAAM;QAAYC,WAAWN;IAAS;CACzC,CAAA"}
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import type React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\nimport { MemoizedTranslateMenu, TranslateMenu } from './TranslateMenu.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload', 'array'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload', 'array'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: MemoizedTranslateMenu,\n excludedFor: ['upload', 'array'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text', 'array'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText', 'array'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload', 'array'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","MemoizedTranslateMenu","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAIA,SAASA,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAChG,SAASC,qBAAqB,QAAuB,qBAAoB;AASzE,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWR;QAAWS,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAe;IACzG;QAAEH,MAAM;QAAYC,WAAWP;QAAUQ,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAa;IACrG;QACEH,MAAM;QACNC,WAAWH;QACXI,aAAa;YAAC;YAAU;SAAQ;QAChCC,aAAa;IACf;IACA;QAAEH,MAAM;QAAUC,WAAWT;QAAQU,aAAa;YAAC;YAAU;YAAQ;SAAQ;QAAEC,aAAa;IAAY;IACxG;QACE,mBAAmB;QACnBH,MAAM;QACNC,WAAWJ;QACXK,aAAa;YAAC;YAAU;YAAQ;YAAY;SAAQ;QACpDC,aAAa;IACf;IACA;QAAEH,MAAM;QAAYC,WAAWL;QAAUM,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAc;IACtG;QAAEH,MAAM;QAAWC,WAAWV;QAASY,aAAa;IAAY;IAChE;QAAEH,MAAM;QAAYC,WAAWN;IAAS;CACzC,CAAA"}
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useField } from '@payloadcms/ui';
3
+ import { useForm } from '@payloadcms/ui';
4
+ import { getSiblingData } from 'payload/shared';
4
5
  import React, { useEffect, useMemo, useState } from 'react';
5
6
  import { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js';
6
7
  import { Compose, Proofread, Rephrase } from './items.js';
@@ -19,14 +20,27 @@ const getActiveComponent = (ac)=>{
19
20
  }
20
21
  };
21
22
  export const useMenu = (menuEvents, options)=>{
22
- const { field: { type: fieldType } = {}, path: pathFromContext } = useFieldProps();
23
- const field = useField({
24
- path: pathFromContext ?? ''
25
- });
23
+ const { field: { type: fieldType } = {}, path } = useFieldProps();
24
+ const { getData } = useForm();
26
25
  const [activeComponent, setActiveComponent] = useState('Rephrase');
27
- const { initialValue, value } = field;
26
+ // Check value once on mount or when path/type changes
28
27
  useEffect(()=>{
29
- if (!value) {
28
+ let hasValue = false;
29
+ try {
30
+ const data = getData();
31
+ if (path) {
32
+ const val = getSiblingData(data, path);
33
+ hasValue = val !== undefined && val !== null;
34
+ // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)
35
+ // But for now, simple truthiness covers most cases or at least defaults safely
36
+ if (fieldType === 'richText' && val && typeof val === 'object' && 'root' in val) {
37
+ // Basic lexical check could go here if needed
38
+ }
39
+ }
40
+ } catch (e) {
41
+ // ignore
42
+ }
43
+ if (!hasValue) {
30
44
  setActiveComponent('Compose');
31
45
  return;
32
46
  }
@@ -34,15 +48,12 @@ export const useMenu = (menuEvents, options)=>{
34
48
  setActiveComponent('Compose');
35
49
  return;
36
50
  }
37
- if (typeof value === 'string' && value !== initialValue) {
38
- setActiveComponent('Proofread');
39
- } else {
40
- setActiveComponent('Rephrase');
41
- }
51
+ // Default to Rephrase if value exists
52
+ setActiveComponent('Rephrase');
42
53
  }, [
43
- initialValue,
44
- value,
45
- fieldType
54
+ fieldType,
55
+ getData,
56
+ path
46
57
  ]);
47
58
  const MemoizedActiveComponent = useMemo(()=>{
48
59
  return ({ isLoading, loadingLabel, stop })=>{