@ai-stack/payloadcms 3.2.8-beta → 3.2.10-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -21
- package/dist/ai/models/anthropic/generateRichText.d.ts +1 -1
- package/dist/ai/models/anthropic/generateRichText.d.ts.map +1 -1
- package/dist/ai/models/anthropic/generateRichText.js +5 -6
- package/dist/ai/models/anthropic/generateRichText.js.map +1 -1
- package/dist/ai/models/anthropic/index.js +15 -12
- package/dist/ai/models/anthropic/index.js.map +1 -1
- package/dist/ai/models/openai/generateImage.d.ts +2 -6
- package/dist/ai/models/openai/generateImage.d.ts.map +1 -1
- package/dist/ai/models/openai/generateImage.js +19 -9
- package/dist/ai/models/openai/generateImage.js.map +1 -1
- package/dist/ai/models/openai/generateRichText.d.ts +1 -1
- package/dist/ai/models/openai/generateRichText.d.ts.map +1 -1
- package/dist/ai/models/openai/generateRichText.js +5 -6
- package/dist/ai/models/openai/generateRichText.js.map +1 -1
- package/dist/ai/models/openai/index.d.ts.map +1 -1
- package/dist/ai/models/openai/index.js +133 -4
- package/dist/ai/models/openai/index.js.map +1 -1
- package/dist/ai/prompts.js +6 -6
- package/dist/ai/prompts.js.map +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.d.ts +20 -370
- package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.js +81 -9
- package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
- package/dist/ai/utils/editImagesWithOpenAI.d.ts +11 -0
- package/dist/ai/utils/editImagesWithOpenAI.d.ts.map +1 -0
- package/dist/ai/utils/editImagesWithOpenAI.js +37 -0
- package/dist/ai/utils/editImagesWithOpenAI.js.map +1 -0
- package/dist/ai/utils/filterEditorSchemaByNodes.d.ts +72 -0
- package/dist/ai/utils/filterEditorSchemaByNodes.d.ts.map +1 -0
- package/dist/ai/utils/filterEditorSchemaByNodes.js +43 -0
- package/dist/ai/utils/filterEditorSchemaByNodes.js.map +1 -0
- package/dist/ai/utils/isObjectSchema.d.ts +3 -0
- package/dist/ai/utils/isObjectSchema.d.ts.map +1 -0
- package/dist/ai/utils/isObjectSchema.js +5 -0
- package/dist/ai/utils/isObjectSchema.js.map +1 -0
- package/dist/collections/Instructions.d.ts.map +1 -1
- package/dist/collections/Instructions.js +43 -29
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/defaults.d.ts +1 -1
- package/dist/defaults.js +1 -1
- package/dist/defaults.js.map +1 -1
- package/dist/endpoints/fetchFields.d.ts +2 -1
- package/dist/endpoints/fetchFields.d.ts.map +1 -1
- package/dist/endpoints/fetchFields.js +33 -17
- package/dist/endpoints/fetchFields.js.map +1 -1
- package/dist/endpoints/index.d.ts.map +1 -1
- package/dist/endpoints/index.js +65 -15
- package/dist/endpoints/index.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.js +3 -2
- package/dist/fields/ComposeField/ComposeField.js.map +1 -1
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -1
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.js +3 -2
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.js.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.d.ts.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.js +46 -16
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
- package/dist/fields/PromptEditorField/defaultStyle.d.ts +50 -0
- package/dist/fields/PromptEditorField/defaultStyle.d.ts.map +1 -0
- package/dist/fields/PromptEditorField/defaultStyle.js +51 -0
- package/dist/fields/PromptEditorField/defaultStyle.js.map +1 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +5 -3
- package/dist/init.js.map +1 -1
- package/dist/plugin.js +3 -3
- package/dist/plugin.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts +3 -0
- package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +14 -4
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.d.ts.map +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js +54 -29
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/types.d.ts +28 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/Compose/Compose.d.ts +2 -1
- package/dist/ui/Compose/Compose.d.ts.map +1 -1
- package/dist/ui/Compose/Compose.js +7 -6
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js +4 -0
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.js +9 -4
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.d.ts.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.js +11 -4
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/utilities/extractImageData.d.ts +10 -0
- package/dist/utilities/extractImageData.d.ts.map +1 -0
- package/dist/utilities/extractImageData.js +22 -0
- package/dist/utilities/extractImageData.js.map +1 -0
- package/dist/utilities/isPluginActivated.d.ts +1 -1
- package/dist/utilities/isPluginActivated.d.ts.map +1 -1
- package/dist/utilities/isPluginActivated.js.map +1 -1
- package/dist/utilities/setSafeLexicalState.js +5 -2
- package/dist/utilities/setSafeLexicalState.js.map +1 -1
- package/package.json +19 -14
- package/dist/ai/models/example-prompt-rich-text.md +0 -47
- package/dist/ai/models/example.d.ts +0 -73
- package/dist/ai/models/example.d.ts.map +0 -1
- package/dist/ai/models/example.js +0 -126
- package/dist/ai/models/example.js.map +0 -1
- package/dist/libraries/autocomplete/AutocompleteTextArea.d.ts +0 -8
- package/dist/libraries/autocomplete/AutocompleteTextArea.d.ts.map +0 -1
- package/dist/libraries/autocomplete/AutocompleteTextArea.js +0 -437
- package/dist/libraries/autocomplete/AutocompleteTextArea.js.map +0 -1
- package/dist/libraries/autocomplete/AutocompleteTextArea.module.scss +0 -35
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { PluginConfig } from './types.js'\n\nimport { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js'\nimport { instructionsCollection } from './collections/Instructions.js'\nimport { PLUGIN_NAME } from './defaults.js'\nimport { fetchFields } from './endpoints/fetchFields.js'\nimport { endpoints } from './endpoints/index.js'\nimport { init } from './init.js'\nimport { translations } from './translations/index.js'\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { PluginConfig } from './types.js'\n\nimport { defaultGenerationModels } from './ai/models/index.js'\nimport { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js'\nimport { instructionsCollection } from './collections/Instructions.js'\nimport { PLUGIN_NAME } from './defaults.js'\nimport { fetchFields } from './endpoints/fetchFields.js'\nimport { endpoints } from './endpoints/index.js'\nimport { init } from './init.js'\nimport { translations } from './translations/index.js'\nimport { getGenerationModels } from './utilities/getGenerationModels.js'\nimport { isPluginActivated } from './utilities/isPluginActivated.js'\nimport { updateFieldsConfig } from './utilities/updateFieldsConfig.js'\n\nconst defaultPluginConfig: PluginConfig = {\n collections: {},\n disableSponsorMessage: false,\n generatePromptOnInit: true,\n generationModels: defaultGenerationModels,\n}\n\nconst sponsorMessage = `\n╔═══════════════════════════════════════════════════════════════╗\n║ THANK YOU FOR USING THE PAYLOAD AI PLUGIN! ║\n║ ║\n║ If this plugin makes your life easier, please ║\n║ consider supporting its development and maintenance: ║\n║ ║\n║ • Buy me a coffee: https://buymeacoffee.com/ashbuilds ║\n║ • Sponsor on GitHub: https://github.com/sponsors/ashbuilds ║\n║ ║\n║ Your support fuels continued improvements, ║\n║ new features, and more caffeinated coding sessions! ☕ ║\n║ ║\n║ Got feedback or need help? Submit an issue here: ║\n║ • https://github.com/ashbuilds/payload-ai/issues/new ║\n║ ║\n║ Thank you again, and happy building! ║\n╚═══════════════════════════════════════════════════════════════╝\n`\n\nconst payloadAiPlugin =\n (pluginConfig: PluginConfig) =>\n (incomingConfig: Config): Config => {\n pluginConfig = { ...defaultPluginConfig, ...pluginConfig }\n pluginConfig.generationModels = getGenerationModels(pluginConfig)\n const isActivated = isPluginActivated(pluginConfig)\n let updatedConfig: Config = { ...incomingConfig }\n let collectionsFieldPathMap = {}\n if (isActivated) {\n const Instructions = instructionsCollection(pluginConfig)\n // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit\n const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes)\n\n if (pluginConfig.debugging) {\n Instructions.admin.hidden = false\n }\n\n Instructions.admin.custom = {\n ...(Instructions.admin.custom || {}),\n [PLUGIN_NAME]: {\n editorConfig: {\n // Used in admin client for useObject hook\n schema: lexicalSchema,\n },\n },\n }\n\n const collections = [...(incomingConfig.collections ?? []), Instructions]\n const { collections: collectionSlugs = [] } = pluginConfig\n\n const { components: { providers = [] } = {} } = incomingConfig.admin || {}\n const updatedProviders = [\n ...(providers ?? []),\n {\n path: '@ai-stack/payloadcms/client#InstructionsProvider',\n },\n ]\n\n incomingConfig.admin = {\n ...(incomingConfig.admin || {}),\n components: {\n ...(incomingConfig.admin?.components ?? {}),\n providers: updatedProviders,\n },\n }\n\n const pluginEndpoints = endpoints(pluginConfig)\n updatedConfig = {\n ...incomingConfig,\n collections: collections.map((collection) => {\n if (collectionSlugs[collection.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection)\n collectionsFieldPathMap = {\n ...collectionsFieldPathMap,\n ...schemaPathMap,\n }\n return updatedCollectionConfig\n }\n\n return collection\n }),\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n pluginEndpoints.textarea,\n pluginEndpoints.upload,\n fetchFields(pluginConfig.access),\n ],\n i18n: {\n ...(incomingConfig.i18n || {}),\n translations: {\n ...deepMerge(translations, incomingConfig.i18n?.translations ?? {}),\n },\n },\n }\n }\n\n updatedConfig.onInit = async (payload) => {\n if (incomingConfig.onInit) await incomingConfig.onInit(payload)\n\n if (!isActivated) {\n payload.logger.warn(`— AI Plugin: Not activated. Please verify your environment keys.`)\n return\n }\n\n await init(payload, collectionsFieldPathMap, pluginConfig)\n .catch((error) => {\n console.error(error)\n payload.logger.error(`— AI Plugin: Initialization Error: ${error}`)\n })\n .finally(() => {\n if (!pluginConfig.disableSponsorMessage) {\n setTimeout(() => {\n payload.logger.info(sponsorMessage)\n }, 3000)\n }\n })\n }\n\n return updatedConfig\n }\n\nexport { payloadAiPlugin }\n"],"names":["deepMerge","defaultGenerationModels","lexicalJsonSchema","instructionsCollection","PLUGIN_NAME","fetchFields","endpoints","init","translations","getGenerationModels","isPluginActivated","updateFieldsConfig","defaultPluginConfig","collections","disableSponsorMessage","generatePromptOnInit","generationModels","sponsorMessage","payloadAiPlugin","pluginConfig","incomingConfig","isActivated","updatedConfig","collectionsFieldPathMap","Instructions","lexicalSchema","editorConfig","nodes","debugging","admin","hidden","custom","schema","collectionSlugs","components","providers","updatedProviders","path","pluginEndpoints","map","collection","slug","schemaPathMap","updatedCollectionConfig","textarea","upload","access","i18n","onInit","payload","logger","warn","catch","error","console","finally","setTimeout","info"],"mappings":"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"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { Field } from 'payload';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
export declare const InstructionsContext: React.Context<{
|
|
4
|
+
activeCollection?: string;
|
|
4
5
|
field?: Field;
|
|
5
6
|
instructions: Record<string, any>;
|
|
7
|
+
isConfigAllowed: boolean;
|
|
6
8
|
path?: string;
|
|
7
9
|
schemaPath?: unknown;
|
|
10
|
+
setActiveCollection?: (val: unknown) => void;
|
|
8
11
|
}>;
|
|
9
12
|
export declare const InstructionsProvider: React.FC;
|
|
10
13
|
//# sourceMappingURL=InstructionsProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstructionsProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAGpC,OAAO,KAA6C,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"InstructionsProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAGpC,OAAO,KAA6C,MAAM,OAAO,CAAA;AAoBjE,eAAO,MAAM,mBAAmB;uBAfX,MAAM;YACjB,KAAK;kBACC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;qBAChB,OAAO;WACjB,MAAM;iBACA,OAAO;0BACE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI;EASkB,CAAA;AAEhE,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAkCxC,CAAA"}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { useConfig } from '@payloadcms/ui';
|
|
3
|
+
import { useAuth, useConfig } from '@payloadcms/ui';
|
|
4
4
|
import React, { createContext, useEffect, useState } from 'react';
|
|
5
5
|
import { PLUGIN_FETCH_FIELDS_ENDPOINT } from '../../defaults.js';
|
|
6
6
|
const initialContext = {
|
|
7
7
|
field: undefined,
|
|
8
8
|
instructions: undefined,
|
|
9
|
+
isConfigAllowed: true,
|
|
9
10
|
path: '',
|
|
10
11
|
schemaPath: ''
|
|
11
12
|
};
|
|
12
13
|
export const InstructionsContext = /*#__PURE__*/ createContext(initialContext);
|
|
13
14
|
export const InstructionsProvider = ({ children })=>{
|
|
14
15
|
const [instructions, setInstructionsState] = useState({});
|
|
16
|
+
const [activeCollection, setActiveCollection] = useState('');
|
|
17
|
+
const [isConfigAllowed, setIsConfigAllowed] = useState(false);
|
|
18
|
+
const { user } = useAuth();
|
|
15
19
|
const { config } = useConfig();
|
|
16
20
|
const { routes: { api }, serverURL } = config;
|
|
17
21
|
// This is here because each field have separate instructions and
|
|
@@ -19,15 +23,21 @@ export const InstructionsProvider = ({ children })=>{
|
|
|
19
23
|
useEffect(()=>{
|
|
20
24
|
fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`).then(async (res)=>{
|
|
21
25
|
await res.json().then((data)=>{
|
|
22
|
-
|
|
26
|
+
setIsConfigAllowed(data?.isConfigAllowed);
|
|
27
|
+
setInstructionsState(data?.fields);
|
|
23
28
|
});
|
|
24
29
|
}).catch((err)=>{
|
|
25
30
|
console.error('InstructionsProvider:', err);
|
|
26
31
|
});
|
|
27
|
-
}, [
|
|
32
|
+
}, [
|
|
33
|
+
user
|
|
34
|
+
]);
|
|
28
35
|
return /*#__PURE__*/ _jsx(InstructionsContext.Provider, {
|
|
29
36
|
value: {
|
|
30
|
-
|
|
37
|
+
activeCollection,
|
|
38
|
+
instructions,
|
|
39
|
+
isConfigAllowed,
|
|
40
|
+
setActiveCollection
|
|
31
41
|
},
|
|
32
42
|
children: children
|
|
33
43
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"sourcesContent":["'use client'\n\nimport type { Field } from 'payload'\n\nimport { useConfig } from '@payloadcms/ui'\nimport React, { createContext, useEffect, useState } from 'react'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT } from '../../defaults.js'\n\nconst initialContext: {\n field?: Field\n instructions: Record<string, any>\n path?: string\n schemaPath?: unknown\n} = {\n field: undefined,\n instructions: undefined,\n path: '',\n schemaPath: '',\n}\n\nexport const InstructionsContext = createContext(initialContext)\n\nexport const InstructionsProvider: React.FC = ({ children }: { children: React.ReactNode }) => {\n const [instructions, setInstructionsState] = useState({})\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\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 fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`)\n .then(async (res) => {\n await res.json().then((data) => {\n setInstructionsState(data)\n })\n })\n .catch((err) => {\n console.error('InstructionsProvider:', err)\n })\n }, [])\n\n return (\n <InstructionsContext.Provider
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"sourcesContent":["'use client'\n\nimport type { Field } from 'payload'\n\nimport { useAuth, useConfig } from '@payloadcms/ui'\nimport React, { createContext, useEffect, useState } from 'react'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT } from '../../defaults.js'\n\nconst initialContext: {\n activeCollection?: string\n field?: Field\n instructions: Record<string, any>\n isConfigAllowed: boolean\n path?: string\n schemaPath?: unknown\n setActiveCollection?: (val: unknown) => void\n} = {\n field: undefined,\n instructions: undefined,\n isConfigAllowed: true,\n path: '',\n schemaPath: '',\n}\n\nexport const InstructionsContext = createContext(initialContext)\n\nexport const InstructionsProvider: React.FC = ({ children }: { children: React.ReactNode }) => {\n const [instructions, setInstructionsState] = useState({})\n const [activeCollection, setActiveCollection] = useState('')\n const [isConfigAllowed, setIsConfigAllowed] = useState(false)\n const { user } = useAuth()\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\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 fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`)\n .then(async (res) => {\n await res.json().then((data) => {\n setIsConfigAllowed(data?.isConfigAllowed)\n setInstructionsState(data?.fields)\n })\n })\n .catch((err) => {\n console.error('InstructionsProvider:', err)\n })\n }, [user])\n\n return (\n <InstructionsContext.Provider\n value={{ activeCollection, instructions, isConfigAllowed, setActiveCollection }}\n >\n {children}\n </InstructionsContext.Provider>\n )\n}\n"],"names":["useAuth","useConfig","React","createContext","useEffect","useState","PLUGIN_FETCH_FIELDS_ENDPOINT","initialContext","field","undefined","instructions","isConfigAllowed","path","schemaPath","InstructionsContext","InstructionsProvider","children","setInstructionsState","activeCollection","setActiveCollection","setIsConfigAllowed","user","config","routes","api","serverURL","fetch","then","res","json","data","fields","catch","err","console","error","Provider","value"],"mappings":"AAAA;;AAIA,SAASA,OAAO,EAAEC,SAAS,QAAQ,iBAAgB;AACnD,OAAOC,SAASC,aAAa,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAEjE,SAASC,4BAA4B,QAAQ,oBAAmB;AAEhE,MAAMC,iBAQF;IACFC,OAAOC;IACPC,cAAcD;IACdE,iBAAiB;IACjBC,MAAM;IACNC,YAAY;AACd;AAEA,OAAO,MAAMC,oCAAsBX,cAAcI,gBAAe;AAEhE,OAAO,MAAMQ,uBAAiC,CAAC,EAAEC,QAAQ,EAAiC;IACxF,MAAM,CAACN,cAAcO,qBAAqB,GAAGZ,SAAS,CAAC;IACvD,MAAM,CAACa,kBAAkBC,oBAAoB,GAAGd,SAAS;IACzD,MAAM,CAACM,iBAAiBS,mBAAmB,GAAGf,SAAS;IACvD,MAAM,EAAEgB,IAAI,EAAE,GAAGrB;IAEjB,MAAM,EAAEsB,MAAM,EAAE,GAAGrB;IACnB,MAAM,EACJsB,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IAEJ,iEAAiE;IACjE,6CAA6C;IAC7ClB,UAAU;QACRsB,MAAM,GAAGD,YAAYD,MAAMlB,8BAA8B,EACtDqB,IAAI,CAAC,OAAOC;YACX,MAAMA,IAAIC,IAAI,GAAGF,IAAI,CAAC,CAACG;gBACrBV,mBAAmBU,MAAMnB;gBACzBM,qBAAqBa,MAAMC;YAC7B;QACF,GACCC,KAAK,CAAC,CAACC;YACNC,QAAQC,KAAK,CAAC,yBAAyBF;QACzC;IACJ,GAAG;QAACZ;KAAK;IAET,qBACE,KAACP,oBAAoBsB,QAAQ;QAC3BC,OAAO;YAAEnB;YAAkBR;YAAcC;YAAiBQ;QAAoB;kBAE7EH;;AAGP,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInstructions.d.ts","sourceRoot":"","sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useInstructions.d.ts","sourceRoot":"","sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe,GAC1B,SAAQ;IACN,UAAU,CAAC,EAAE,OAAO,CAAA;CAChB,QAqEP,CAAA"}
|
|
@@ -1,45 +1,70 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useDocumentInfo } from '@payloadcms/ui';
|
|
2
|
+
import { useContext, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
|
|
2
4
|
import { handlebarsHelpers, handlebarsHelpersMap } from '../../libraries/handlebars/helpersMap.js';
|
|
3
5
|
import { InstructionsContext } from './InstructionsProvider.js';
|
|
4
6
|
export const useInstructions = (update = {})=>{
|
|
5
7
|
const context = useContext(InstructionsContext);
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
return key.split('.').slice(1).join('.');
|
|
9
|
-
});
|
|
10
|
-
const promptEditorSuggestions = [
|
|
11
|
-
...fields
|
|
12
|
-
].reduce((acc, f)=>{
|
|
13
|
-
const fieldKey = Object.keys(context.instructions).find((k)=>k.endsWith(f));
|
|
14
|
-
const fieldInfo = context.instructions[fieldKey];
|
|
15
|
-
// Currently, Upload fields are excluded from suggestions
|
|
16
|
-
if (fieldInfo.fieldType === 'upload') {
|
|
17
|
-
return acc;
|
|
18
|
-
}
|
|
19
|
-
const helpers = handlebarsHelpers.filter((h)=>handlebarsHelpersMap[h]?.field === fieldInfo.fieldType);
|
|
20
|
-
if (helpers.length) {
|
|
21
|
-
for (const helper of helpers){
|
|
22
|
-
acc.push(helper + ` ${f}`);
|
|
23
|
-
}
|
|
24
|
-
return acc;
|
|
25
|
-
}
|
|
26
|
-
acc.push(f);
|
|
27
|
-
return acc;
|
|
28
|
-
}, []);
|
|
8
|
+
const { collectionSlug } = useDocumentInfo();
|
|
9
|
+
const { activeCollection, instructions, setActiveCollection } = context;
|
|
29
10
|
const [schemaPath, setSchemaPath] = useState(update.schemaPath);
|
|
30
11
|
useEffect(()=>{
|
|
31
12
|
if (update.schemaPath !== schemaPath) {
|
|
32
13
|
setSchemaPath(update.schemaPath);
|
|
33
14
|
}
|
|
34
15
|
}, [
|
|
35
|
-
schemaPath
|
|
36
|
-
|
|
16
|
+
update.schemaPath
|
|
17
|
+
]);
|
|
18
|
+
useEffect(()=>{
|
|
19
|
+
if (activeCollection !== collectionSlug && collectionSlug !== PLUGIN_INSTRUCTIONS_TABLE) {
|
|
20
|
+
setActiveCollection(collectionSlug);
|
|
21
|
+
}
|
|
22
|
+
}, [
|
|
23
|
+
activeCollection,
|
|
24
|
+
collectionSlug,
|
|
25
|
+
setActiveCollection
|
|
26
|
+
]);
|
|
27
|
+
const groupedFields = useMemo(()=>{
|
|
28
|
+
const result = {};
|
|
29
|
+
for (const fullKey of Object.keys(instructions)){
|
|
30
|
+
const [collection, ...pathParts] = fullKey.split('.');
|
|
31
|
+
const path = pathParts.join('.');
|
|
32
|
+
if (!result[collection]) result[collection] = [];
|
|
33
|
+
result[collection].push(path);
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}, [
|
|
37
|
+
instructions
|
|
38
|
+
]);
|
|
39
|
+
// Suggestions for prompt editor
|
|
40
|
+
const promptEditorSuggestions = useMemo(()=>{
|
|
41
|
+
const activeFields = groupedFields[activeCollection] || [];
|
|
42
|
+
return activeFields.reduce((acc, f)=>{
|
|
43
|
+
const fieldKey = Object.keys(instructions).find((k)=>k.endsWith(f));
|
|
44
|
+
const fieldInfo = instructions[fieldKey];
|
|
45
|
+
if (!fieldInfo) return acc;
|
|
46
|
+
if (fieldInfo.fieldType === 'upload') {
|
|
47
|
+
acc.push(`${f}.url`);
|
|
48
|
+
return acc;
|
|
49
|
+
}
|
|
50
|
+
const helpers = handlebarsHelpers.filter((h)=>handlebarsHelpersMap[h]?.field === fieldInfo.fieldType);
|
|
51
|
+
if (helpers.length) {
|
|
52
|
+
for (const helper of helpers){
|
|
53
|
+
acc.push(`${helper} ${f}`);
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
acc.push(f);
|
|
57
|
+
}
|
|
58
|
+
return acc;
|
|
59
|
+
}, []);
|
|
60
|
+
}, [
|
|
61
|
+
groupedFields,
|
|
62
|
+
activeCollection,
|
|
63
|
+
instructions
|
|
37
64
|
]);
|
|
38
65
|
return {
|
|
39
66
|
...context,
|
|
40
|
-
...
|
|
41
|
-
fields,
|
|
42
|
-
map: context.instructions,
|
|
67
|
+
...instructions[schemaPath] || {},
|
|
43
68
|
promptEditorSuggestions
|
|
44
69
|
};
|
|
45
70
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"sourcesContent":["import { useContext, useEffect, useState } from 'react'\n\nimport { handlebarsHelpers, handlebarsHelpersMap } from '../../libraries/handlebars/helpersMap.js'\nimport { InstructionsContext } from './InstructionsProvider.js'\n\nexport const useInstructions = (\n update: {\n schemaPath?: unknown\n } = {},\n) => {\n const context = useContext(InstructionsContext)\n\n
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"sourcesContent":["import { 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'\nimport { InstructionsContext } from './InstructionsProvider.js'\n\nexport const useInstructions = (\n update: {\n schemaPath?: unknown\n } = {},\n) => {\n const context = useContext(InstructionsContext)\n const { collectionSlug } = useDocumentInfo()\n const { activeCollection, instructions, 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])\n\n useEffect(() => {\n if (activeCollection !== collectionSlug && collectionSlug !== PLUGIN_INSTRUCTIONS_TABLE) {\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]) result[collection] = []\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] || []\n\n return activeFields.reduce<string[]>((acc, f) => {\n const fieldKey = Object.keys(instructions).find((k) => k.endsWith(f))\n const fieldInfo = instructions[fieldKey]\n\n if (!fieldInfo) return acc\n\n if (fieldInfo.fieldType === 'upload') {\n acc.push(`${f}.url`)\n return acc\n }\n\n const helpers = handlebarsHelpers.filter(\n (h) => handlebarsHelpersMap[h]?.field === fieldInfo.fieldType,\n )\n\n if (helpers.length) {\n for (const helper of helpers) {\n acc.push(`${helper} ${f}`)\n }\n } else {\n acc.push(f)\n }\n\n return acc\n }, [])\n }, [groupedFields, activeCollection, instructions])\n\n return {\n ...context,\n ...(instructions[schemaPath] || {}),\n promptEditorSuggestions,\n }\n}\n"],"names":["useDocumentInfo","useContext","useEffect","useMemo","useState","PLUGIN_INSTRUCTIONS_TABLE","handlebarsHelpers","handlebarsHelpersMap","InstructionsContext","useInstructions","update","context","collectionSlug","activeCollection","instructions","setActiveCollection","schemaPath","setSchemaPath","groupedFields","result","fullKey","Object","keys","collection","pathParts","split","path","join","push","promptEditorSuggestions","activeFields","reduce","acc","f","fieldKey","find","k","endsWith","fieldInfo","fieldType","helpers","filter","h","field","length","helper"],"mappings":"AAAA,SAASA,eAAe,QAAQ,iBAAgB;AAChD,SAASC,UAAU,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAEhE,SAASC,yBAAyB,QAAQ,oBAAmB;AAC7D,SAASC,iBAAiB,EAAEC,oBAAoB,QAAQ,2CAA0C;AAClG,SAASC,mBAAmB,QAAQ,4BAA2B;AAE/D,OAAO,MAAMC,kBAAkB,CAC7BC,SAEI,CAAC,CAAC;IAEN,MAAMC,UAAUV,WAAWO;IAC3B,MAAM,EAAEI,cAAc,EAAE,GAAGZ;IAC3B,MAAM,EAAEa,gBAAgB,EAAEC,YAAY,EAAEC,mBAAmB,EAAE,GAAGJ;IAEhE,MAAM,CAACK,YAAYC,cAAc,GAAGb,SAASM,OAAOM,UAAU;IAE9Dd,UAAU;QACR,IAAIQ,OAAOM,UAAU,KAAKA,YAAY;YACpCC,cAAcP,OAAOM,UAAU;QACjC;IACF,GAAG;QAACN,OAAOM,UAAU;KAAC;IAEtBd,UAAU;QACR,IAAIW,qBAAqBD,kBAAkBA,mBAAmBP,2BAA2B;YACvFU,oBAAoBH;QACtB;IACF,GAAG;QAACC;QAAkBD;QAAgBG;KAAoB;IAE1D,MAAMG,gBAAgBf,QAAQ;QAC5B,MAAMgB,SAAmC,CAAC;QAE1C,KAAK,MAAMC,WAAWC,OAAOC,IAAI,CAACR,cAAe;YAC/C,MAAM,CAACS,YAAY,GAAGC,UAAU,GAAGJ,QAAQK,KAAK,CAAC;YACjD,MAAMC,OAAOF,UAAUG,IAAI,CAAC;YAC5B,IAAI,CAACR,MAAM,CAACI,WAAW,EAAEJ,MAAM,CAACI,WAAW,GAAG,EAAE;YAChDJ,MAAM,CAACI,WAAW,CAACK,IAAI,CAACF;QAC1B;QAEA,OAAOP;IACT,GAAG;QAACL;KAAa;IAEjB,gCAAgC;IAChC,MAAMe,0BAA0B1B,QAAQ;QACtC,MAAM2B,eAAeZ,aAAa,CAACL,iBAAiB,IAAI,EAAE;QAE1D,OAAOiB,aAAaC,MAAM,CAAW,CAACC,KAAKC;YACzC,MAAMC,WAAWb,OAAOC,IAAI,CAACR,cAAcqB,IAAI,CAAC,CAACC,IAAMA,EAAEC,QAAQ,CAACJ;YAClE,MAAMK,YAAYxB,YAAY,CAACoB,SAAS;YAExC,IAAI,CAACI,WAAW,OAAON;YAEvB,IAAIM,UAAUC,SAAS,KAAK,UAAU;gBACpCP,IAAIJ,IAAI,CAAC,GAAGK,EAAE,IAAI,CAAC;gBACnB,OAAOD;YACT;YAEA,MAAMQ,UAAUlC,kBAAkBmC,MAAM,CACtC,CAACC,IAAMnC,oBAAoB,CAACmC,EAAE,EAAEC,UAAUL,UAAUC,SAAS;YAG/D,IAAIC,QAAQI,MAAM,EAAE;gBAClB,KAAK,MAAMC,UAAUL,QAAS;oBAC5BR,IAAIJ,IAAI,CAAC,GAAGiB,OAAO,CAAC,EAAEZ,GAAG;gBAC3B;YACF,OAAO;gBACLD,IAAIJ,IAAI,CAACK;YACX;YAEA,OAAOD;QACT,GAAG,EAAE;IACP,GAAG;QAACd;QAAeL;QAAkBC;KAAa;IAElD,OAAO;QACL,GAAGH,OAAO;QACV,GAAIG,YAAY,CAACE,WAAW,IAAI,CAAC,CAAC;QAClCa;IACF;AACF,EAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import type { JSONSchema } from 'openai/lib/jsonschema';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ImageGenerateParams } from 'openai/resources/images';
|
|
3
|
+
import type { Endpoint, Field, GroupField, PayloadRequest } from 'payload';
|
|
3
4
|
import type { CSSProperties, MouseEventHandler } from 'react';
|
|
5
|
+
export interface PluginConfigAccess {
|
|
6
|
+
settings?: ({ req }: {
|
|
7
|
+
req: PayloadRequest;
|
|
8
|
+
}) => Promise<boolean> | boolean;
|
|
9
|
+
}
|
|
4
10
|
export interface PluginConfig {
|
|
11
|
+
access?: PluginConfigAccess;
|
|
5
12
|
collections: {
|
|
6
13
|
[key: string]: boolean;
|
|
7
14
|
};
|
|
@@ -18,20 +25,22 @@ export interface PluginConfig {
|
|
|
18
25
|
}
|
|
19
26
|
export interface GenerationModel {
|
|
20
27
|
fields: string[];
|
|
21
|
-
|
|
28
|
+
generateText?: (prompt: string, system: string) => Promise<string>;
|
|
29
|
+
handler?: (prompt: string, options: any) => Promise<any> | Response;
|
|
22
30
|
id: string;
|
|
23
31
|
name: string;
|
|
24
32
|
output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video';
|
|
25
33
|
settings?: GroupField;
|
|
26
34
|
supportsPromptOptimization?: boolean;
|
|
27
|
-
generateText?: (prompt: string, system: string) => Promise<string>;
|
|
28
35
|
}
|
|
29
36
|
export interface GenerationConfig {
|
|
30
37
|
models: GenerationModel[];
|
|
31
38
|
provider: string;
|
|
32
39
|
}
|
|
33
40
|
export type GenerateTextarea<T = any> = (args: {
|
|
41
|
+
collectionSlug: string;
|
|
34
42
|
doc: T;
|
|
43
|
+
documentId?: number | string;
|
|
35
44
|
locale?: string;
|
|
36
45
|
options?: any;
|
|
37
46
|
}) => Promise<string> | string;
|
|
@@ -50,6 +59,9 @@ export type ActionMenuEvents = 'onCompose' | 'onExpand' | 'onProofread' | 'onRep
|
|
|
50
59
|
export type UseMenuEvents = {
|
|
51
60
|
[key in ActionMenuEvents]?: (data?: unknown) => void;
|
|
52
61
|
};
|
|
62
|
+
export type UseMenuOptions = {
|
|
63
|
+
isConfigAllowed: boolean;
|
|
64
|
+
};
|
|
53
65
|
export type BaseItemProps<T = any> = {
|
|
54
66
|
children?: React.ReactNode;
|
|
55
67
|
disabled?: boolean;
|
|
@@ -62,4 +74,17 @@ export type BaseItemProps<T = any> = {
|
|
|
62
74
|
style?: CSSProperties | undefined;
|
|
63
75
|
title?: string;
|
|
64
76
|
};
|
|
77
|
+
export type ImageReference = {
|
|
78
|
+
data: Blob;
|
|
79
|
+
name: string;
|
|
80
|
+
size: number;
|
|
81
|
+
type: string;
|
|
82
|
+
url: string;
|
|
83
|
+
};
|
|
84
|
+
export type GenerateImageParams = {
|
|
85
|
+
images?: ImageReference[];
|
|
86
|
+
size?: ImageGenerateParams['size'];
|
|
87
|
+
style?: ImageGenerateParams['style'];
|
|
88
|
+
version?: ImageGenerateParams['model'];
|
|
89
|
+
};
|
|
65
90
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\nimport type { Endpoint, Field, GroupField } from 'payload'\nimport type { CSSProperties, MouseEventHandler } from 'react'\n\nexport interface PluginConfig {\n collections: {\n [key: string]: boolean\n }\n debugging?: boolean\n disableSponsorMessage?: boolean\n editorConfig?: { nodes: JSONSchema[] }\n fields?: Field[]\n generatePromptOnInit?: boolean\n generationModels?: ((defaultModels: GenerationModel[]) => GenerationModel[]) | GenerationModel[]\n globals?: string[]\n interfaceName?: string\n}\n\nexport interface GenerationModel {\n fields: string[]\n handler?: (prompt: string, options: any) => Promise<any
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\nimport type { ImageGenerateParams } from 'openai/resources/images'\nimport type { Endpoint, Field, GroupField, PayloadRequest } from 'payload'\nimport type { CSSProperties, MouseEventHandler } from 'react'\n\nexport interface PluginConfigAccess {\n settings?: ({ req }: { req: PayloadRequest }) => Promise<boolean> | boolean\n}\n\nexport interface PluginConfig {\n access?: PluginConfigAccess\n collections: {\n [key: string]: boolean\n }\n debugging?: boolean\n disableSponsorMessage?: boolean\n editorConfig?: { nodes: JSONSchema[] }\n fields?: Field[]\n generatePromptOnInit?: boolean\n generationModels?: ((defaultModels: GenerationModel[]) => GenerationModel[]) | GenerationModel[]\n globals?: string[]\n interfaceName?: string\n}\n\nexport interface GenerationModel {\n fields: string[]\n generateText?: (prompt: string, system: string) => Promise<string>\n handler?: (prompt: string, options: any) => Promise<any> | Response\n id: string\n name: string\n output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video'\n settings?: GroupField\n supportsPromptOptimization?: boolean\n}\n\nexport interface GenerationConfig {\n models: GenerationModel[]\n provider: string\n}\n\nexport type GenerateTextarea<T = any> = (args: {\n collectionSlug: string\n doc: T\n documentId?: number | string\n locale?: string\n options?: any\n}) => Promise<string> | string\n\nexport interface Instructions {\n 'collection-slug': string\n id: string\n 'model-id': string\n prompt: string\n}\n\nexport interface Endpoints {\n textarea: Omit<Endpoint, 'root'>\n upload: Omit<Endpoint, 'root'>\n}\n\nexport type ActionMenuItems =\n | 'Compose'\n | 'Expand'\n | 'Proofread'\n | 'Rephrase'\n | 'Settings'\n | 'Simplify'\n | 'Summarize'\n | 'Tone'\n | 'Translate'\n\nexport type ActionMenuEvents =\n | 'onCompose'\n | 'onExpand'\n | 'onProofread'\n | 'onRephrase'\n | 'onSettings'\n | 'onSimplify'\n | 'onSummarize'\n | 'onTone'\n | 'onTranslate'\n\nexport type UseMenuEvents = {\n [key in ActionMenuEvents]?: (data?: unknown) => void\n}\n\nexport type UseMenuOptions = {\n isConfigAllowed: boolean\n}\n\nexport type BaseItemProps<T = any> = {\n children?: React.ReactNode\n disabled?: boolean\n hideIcon?: boolean\n isActive?: boolean\n isMenu?: boolean\n onClick: (data?: unknown) => void\n onMouseEnter?: MouseEventHandler<T> | undefined\n onMouseLeave?: MouseEventHandler<T> | undefined\n style?: CSSProperties | undefined\n title?: string\n}\n\nexport type ImageReference = {\n data: Blob\n name: string\n size: number\n type: string\n url: string\n}\n\nexport type GenerateImageParams = {\n images?: ImageReference[]\n size?: ImageGenerateParams['size']\n style?: ImageGenerateParams['style']\n version?: ImageGenerateParams['model']\n}\n"],"names":[],"mappings":"AA+GA,WAKC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ClientField } from 'payload';
|
|
2
|
-
import { FC } from 'react';
|
|
2
|
+
import type { FC } from 'react';
|
|
3
3
|
type ComposeProps = {
|
|
4
4
|
descriptionProps?: {
|
|
5
5
|
field: ClientField;
|
|
@@ -7,6 +7,7 @@ type ComposeProps = {
|
|
|
7
7
|
schemaPath: string;
|
|
8
8
|
};
|
|
9
9
|
instructionId: string;
|
|
10
|
+
isConfigAllowed: boolean;
|
|
10
11
|
};
|
|
11
12
|
export declare const Compose: FC<ComposeProps>;
|
|
12
13
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Compose.d.ts","sourceRoot":"","sources":["../../../src/ui/Compose/Compose.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"Compose.d.ts","sourceRoot":"","sources":["../../../src/ui/Compose/Compose.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AA6B/B,KAAK,YAAY,GAAG;IAClB,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,WAAW,CAAA;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CAkLpC,CAAA"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useMemo } from 'react';
|
|
4
3
|
import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
|
|
5
4
|
import { FieldDescription, Popup, useDocumentDrawer, useField } from '@payloadcms/ui';
|
|
6
|
-
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
5
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
7
6
|
import { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
|
|
8
7
|
import { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js';
|
|
9
8
|
import { PluginIcon } from '../Icons/Icons.js';
|
|
@@ -12,7 +11,7 @@ import styles from './compose.module.css';
|
|
|
12
11
|
import { useMenu } from './hooks/menu/useMenu.js';
|
|
13
12
|
import { useGenerate } from './hooks/useGenerate.js';
|
|
14
13
|
function findParentWithClass(element, className) {
|
|
15
|
-
// Base case: if the element is null or we've reached the top of the DOM
|
|
14
|
+
// Base case: if the element is null, or we've reached the top of the DOM
|
|
16
15
|
if (!element || element === document.body) {
|
|
17
16
|
return null;
|
|
18
17
|
}
|
|
@@ -23,14 +22,14 @@ function findParentWithClass(element, className) {
|
|
|
23
22
|
// Recursively call the function on the parent element
|
|
24
23
|
return findParentWithClass(element.parentElement, className);
|
|
25
24
|
}
|
|
26
|
-
export const Compose = ({ descriptionProps, instructionId })=>{
|
|
25
|
+
export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
|
|
27
26
|
const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({
|
|
28
27
|
id: instructionId,
|
|
29
28
|
collectionSlug: PLUGIN_INSTRUCTIONS_TABLE
|
|
30
29
|
});
|
|
31
30
|
const { field: { type: fieldType }, path: pathFromContext, schemaPath } = descriptionProps || {};
|
|
32
31
|
const { editor: lexicalEditor, editorContainerRef } = useEditorConfigContext();
|
|
33
|
-
//
|
|
32
|
+
// The below snippet is used to show/hide the action menu on AI-enabled fields
|
|
34
33
|
const [input, setInput] = useState(null);
|
|
35
34
|
const actionsRef = useRef(null);
|
|
36
35
|
// Set input element for current field
|
|
@@ -111,7 +110,7 @@ export const Compose = ({ descriptionProps, instructionId })=>{
|
|
|
111
110
|
action: 'Rephrase'
|
|
112
111
|
});
|
|
113
112
|
},
|
|
114
|
-
onSettings: openDrawer,
|
|
113
|
+
onSettings: isConfigAllowed ? openDrawer : undefined,
|
|
115
114
|
onSimplify: async ()=>{
|
|
116
115
|
console.log('Simplifying...');
|
|
117
116
|
await generate({
|
|
@@ -131,6 +130,8 @@ export const Compose = ({ descriptionProps, instructionId })=>{
|
|
|
131
130
|
params: data
|
|
132
131
|
});
|
|
133
132
|
}
|
|
133
|
+
}, {
|
|
134
|
+
isConfigAllowed
|
|
134
135
|
});
|
|
135
136
|
const { setValue } = useField({
|
|
136
137
|
path: pathFromContext
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\nimport { FC, useMemo } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { FieldDescription, Popup, useDocumentDrawer, useField } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useGenerate } from './hooks/useGenerate.js'\n\nfunction findParentWithClass(element, className) {\n // Base case: if the element is null or we've reached the top of the DOM\n if (!element || element === document.body) {\n return null\n }\n\n // Check if the current element has the class we're looking for\n if (element.classList.contains(className)) {\n return element\n }\n\n // Recursively call the function on the parent element\n return findParentWithClass(element.parentElement, className)\n}\n\ntype ComposeProps = {\n descriptionProps?: {\n field: ClientField\n path: string\n schemaPath: string\n }\n instructionId: string\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, instructionId }) => {\n const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({\n id: instructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const {\n field: { type: fieldType },\n path: pathFromContext,\n schemaPath,\n } = descriptionProps || {}\n const { editor: lexicalEditor, editorContainerRef } = useEditorConfigContext()\n\n // Below snippet is used to show/hide the actions menu on AI enabled fields\n const [input, setInput] = useState(null)\n const actionsRef = useRef(null)\n\n // Set input element for current field\n useEffect(() => {\n if (!actionsRef.current) return\n\n const fieldId = `field-${pathFromContext.replace(/\\./g, '__')}`\n const inputElement = document.getElementById(fieldId)\n\n if (!inputElement && fieldType === 'richText') {\n setInput(editorContainerRef.current)\n } else {\n actionsRef.current.setAttribute('for', fieldId)\n setInput(inputElement)\n }\n }, [pathFromContext, schemaPath, actionsRef, editorContainerRef])\n\n // Show or hide actions menu on field\n useEffect(() => {\n if (!input || !actionsRef.current) return\n\n actionsRef.current.classList.add(styles.actions_hidden)\n\n // Create the handler function\n const clickHandler = (event) => {\n document.querySelectorAll('.ai-plugin-active')?.forEach((element) => {\n const actionElement = element.querySelector(`.${styles.actions}`)\n if (actionElement) {\n actionElement.classList.add(styles.actions_hidden)\n element.classList.remove('ai-plugin-active')\n }\n })\n\n actionsRef.current.classList.remove(styles.actions_hidden)\n const parentWithClass = findParentWithClass(event.target, 'field-type')\n if (parentWithClass) {\n parentWithClass.classList.add('ai-plugin-active')\n }\n }\n\n // Add the event listener\n input.addEventListener('click', clickHandler)\n\n // Clean up the event listener when the component unmounts or input changes\n return () => {\n input.removeEventListener('click', clickHandler)\n }\n }, [input, actionsRef])\n\n const [isProcessing, setIsProcessing] = useState(false)\n const { generate, isLoading, stop } = useGenerate({ instructionId })\n\n const { ActiveComponent, Menu } = useMenu({\n onCompose: async () => {\n console.log('Composing...')\n setIsProcessing(true)\n await generate({\n action: 'Compose',\n }).finally(() => {\n setIsProcessing(false)\n })\n },\n onExpand: async () => {\n console.log('Expanding...')\n await generate({\n action: 'Expand',\n })\n },\n onProofread: async () => {\n console.log('Proofreading...')\n await generate({\n action: 'Proofread',\n })\n },\n onRephrase: async () => {\n console.log('Rephrasing...')\n await generate({\n action: 'Rephrase',\n })\n },\n onSettings: openDrawer,\n onSimplify: async () => {\n console.log('Simplifying...')\n await generate({\n action: 'Simplify',\n })\n },\n onSummarize: async () => {\n console.log('Summarizing...')\n await generate({\n action: 'Summarize',\n })\n },\n onTranslate: async (data) => {\n console.log('Translating...')\n await generate({\n action: 'Translate',\n params: data,\n })\n },\n })\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val.root && 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\n }, [])\n\n const popupRender = useCallback(\n ({ close }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isProcessing || isLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isProcessing, isLoading])\n\n return (\n <React.Fragment>\n <label\n className={`${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n ref={actionsRef}\n role=\"presentation\"\n >\n <DocumentDrawer\n onSave={() => {\n closeDrawer()\n }}\n />\n {memoizedPopup}\n <ActiveComponent isLoading={isProcessing || isLoading} stop={stop} />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n {/*Render incoming description field*/}\n {descriptionProps ? (\n <div>\n <FieldDescription {...descriptionProps} />\n </div>\n ) : null}\n </React.Fragment>\n )\n}\n"],"names":["useMemo","useEditorConfigContext","FieldDescription","Popup","useDocumentDrawer","useField","React","useCallback","useEffect","useRef","useState","PLUGIN_INSTRUCTIONS_TABLE","setSafeLexicalState","PluginIcon","UndoRedoActions","styles","useMenu","useGenerate","findParentWithClass","element","className","document","body","classList","contains","parentElement","Compose","descriptionProps","instructionId","DocumentDrawer","_","closeDrawer","openDrawer","id","collectionSlug","field","type","fieldType","path","pathFromContext","schemaPath","editor","lexicalEditor","editorContainerRef","input","setInput","actionsRef","current","fieldId","replace","inputElement","getElementById","setAttribute","add","actions_hidden","clickHandler","event","querySelectorAll","forEach","actionElement","querySelector","actions","remove","parentWithClass","target","addEventListener","removeEventListener","isProcessing","setIsProcessing","generate","isLoading","stop","ActiveComponent","Menu","onCompose","console","log","action","finally","onExpand","onProofread","onRephrase","onSettings","onSimplify","onSummarize","onTranslate","data","params","setValue","setIfValueIsLexicalState","val","root","JSON","stringify","popupRender","close","onClose","memoizedPopup","button","render","verticalAlign","Fragment","label","onClick","e","preventDefault","ref","role","onSave","onChange","div"],"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 { FieldDescription, Popup, useDocumentDrawer, useField } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useGenerate } from './hooks/useGenerate.js'\n\nfunction findParentWithClass(element, className) {\n // Base case: if the element is null, or we've reached the top of the DOM\n if (!element || element === document.body) {\n return null\n }\n\n // Check if the current element has the class we're looking for\n if (element.classList.contains(className)) {\n return element\n }\n\n // Recursively call the function on the parent element\n return findParentWithClass(element.parentElement, className)\n}\n\ntype 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 [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({\n id: instructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const {\n field: { type: fieldType },\n path: pathFromContext,\n schemaPath,\n } = descriptionProps || {}\n const { editor: lexicalEditor, editorContainerRef } = useEditorConfigContext()\n\n // The below snippet is used to show/hide the action menu on AI-enabled fields\n const [input, setInput] = useState(null)\n const actionsRef = useRef(null)\n\n // Set input element for current field\n useEffect(() => {\n if (!actionsRef.current) return\n\n const fieldId = `field-${pathFromContext.replace(/\\./g, '__')}`\n const inputElement = document.getElementById(fieldId)\n\n if (!inputElement && fieldType === 'richText') {\n setInput(editorContainerRef.current)\n } else {\n actionsRef.current.setAttribute('for', fieldId)\n setInput(inputElement)\n }\n }, [pathFromContext, schemaPath, actionsRef, editorContainerRef])\n\n // Show or hide actions menu on field\n useEffect(() => {\n if (!input || !actionsRef.current) return\n\n actionsRef.current.classList.add(styles.actions_hidden)\n\n // Create the handler function\n const clickHandler = (event) => {\n document.querySelectorAll('.ai-plugin-active')?.forEach((element) => {\n const actionElement = element.querySelector(`.${styles.actions}`)\n if (actionElement) {\n actionElement.classList.add(styles.actions_hidden)\n element.classList.remove('ai-plugin-active')\n }\n })\n\n actionsRef.current.classList.remove(styles.actions_hidden)\n const parentWithClass = findParentWithClass(event.target, 'field-type')\n if (parentWithClass) {\n parentWithClass.classList.add('ai-plugin-active')\n }\n }\n\n // Add the event listener\n input.addEventListener('click', clickHandler)\n\n // Clean up the event listener when the component unmounts or input changes\n return () => {\n input.removeEventListener('click', clickHandler)\n }\n }, [input, actionsRef])\n\n const [isProcessing, setIsProcessing] = useState(false)\n const { generate, isLoading, stop } = useGenerate({ instructionId })\n\n const { ActiveComponent, Menu } = useMenu({\n onCompose: async () => {\n console.log('Composing...')\n setIsProcessing(true)\n await generate({\n action: 'Compose',\n }).finally(() => {\n setIsProcessing(false)\n })\n },\n onExpand: async () => {\n console.log('Expanding...')\n await generate({\n action: 'Expand',\n })\n },\n onProofread: async () => {\n console.log('Proofreading...')\n await generate({\n action: 'Proofread',\n })\n },\n onRephrase: async () => {\n console.log('Rephrasing...')\n await generate({\n action: 'Rephrase',\n })\n },\n onSettings: isConfigAllowed ? openDrawer : undefined,\n onSimplify: async () => {\n console.log('Simplifying...')\n await generate({\n action: 'Simplify',\n })\n },\n onSummarize: async () => {\n console.log('Summarizing...')\n await generate({\n action: 'Summarize',\n })\n },\n onTranslate: async (data) => {\n console.log('Translating...')\n await generate({\n action: 'Translate',\n params: data,\n })\n },\n },{\n isConfigAllowed\n })\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val.root && 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\n }, [])\n\n const popupRender = useCallback(\n ({ close }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isProcessing || isLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isProcessing, isLoading])\n\n return (\n <React.Fragment>\n <label\n className={`${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n ref={actionsRef}\n role=\"presentation\"\n >\n <DocumentDrawer\n onSave={() => {\n closeDrawer()\n }}\n />\n {memoizedPopup}\n <ActiveComponent isLoading={isProcessing || isLoading} stop={stop} />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n {/*Render the incoming description field*/}\n {descriptionProps ? (\n <div>\n <FieldDescription {...descriptionProps} />\n </div>\n ) : null}\n </React.Fragment>\n )\n}\n"],"names":["useEditorConfigContext","FieldDescription","Popup","useDocumentDrawer","useField","React","useCallback","useEffect","useMemo","useRef","useState","PLUGIN_INSTRUCTIONS_TABLE","setSafeLexicalState","PluginIcon","UndoRedoActions","styles","useMenu","useGenerate","findParentWithClass","element","className","document","body","classList","contains","parentElement","Compose","descriptionProps","instructionId","isConfigAllowed","DocumentDrawer","_","closeDrawer","openDrawer","id","collectionSlug","field","type","fieldType","path","pathFromContext","schemaPath","editor","lexicalEditor","editorContainerRef","input","setInput","actionsRef","current","fieldId","replace","inputElement","getElementById","setAttribute","add","actions_hidden","clickHandler","event","querySelectorAll","forEach","actionElement","querySelector","actions","remove","parentWithClass","target","addEventListener","removeEventListener","isProcessing","setIsProcessing","generate","isLoading","stop","ActiveComponent","Menu","onCompose","console","log","action","finally","onExpand","onProofread","onRephrase","onSettings","undefined","onSimplify","onSummarize","onTranslate","data","params","setValue","setIfValueIsLexicalState","val","root","JSON","stringify","popupRender","close","onClose","memoizedPopup","button","render","verticalAlign","Fragment","label","onClick","e","preventDefault","ref","role","onSave","onChange","div"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslateMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,GAAI;;CAAW,
|
|
1
|
+
{"version":3,"file":"TranslateMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,GAAI;;CAAW,4CA6ExC,CAAA"}
|
|
@@ -32,6 +32,10 @@ export const TranslateMenu = ({ onClick })=>{
|
|
|
32
32
|
"data-show": show,
|
|
33
33
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
34
34
|
className: `${styles.menu} ${styles.subMenu}`,
|
|
35
|
+
style: {
|
|
36
|
+
background: "var(--popup-bg)",
|
|
37
|
+
minHeight: "300px"
|
|
38
|
+
},
|
|
35
39
|
children: [
|
|
36
40
|
/*#__PURE__*/ _jsx(Item, {
|
|
37
41
|
onClick: ()=>{},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"sourcesContent":["import locales from 'locale-codes'\nimport React, { useState } from 'react'\n\nimport { Item } from './Item.js'\nimport { Translate } from './items.js'\nimport styles from './menu.module.scss'\n\nexport const TranslateMenu = ({ onClick }) => {\n const [show, setShow] = useState(false)\n\n const filteredLocales = locales.all.filter((a) => {\n return a.tag && a.location\n })\n\n const [languages, setLanguages] = useState(filteredLocales)\n const [inputFocus, setInputFocus] = useState(false)\n\n return (\n <div\n className={styles.menu}\n onMouseLeave={() => {\n if (!inputFocus) {\n setShow(false)\n }\n }}\n >\n <Translate\n isActive={show}\n isMenu\n onClick={() => {\n setShow(!show)\n }}\n onMouseEnter={() => setShow(true)}\n />\n <div className={styles.hoverMenu} data-show={show}>\n <div className={`${styles.menu} ${styles.subMenu}`}>\n <Item\n onClick={() => {}}\n style={{\n background: 'transparent',\n padding: '0 0 5px 0',\n position: 'sticky',\n top: 0,\n }}\n >\n <input\n className={styles.menuInput}\n onBlur={() => setInputFocus(false)}\n onChange={(event) => {\n const value = event.target.value\n setLanguages(\n filteredLocales.filter((l) => {\n const lowerCaseValue = value.toLowerCase()\n return (\n l.name.toLowerCase().startsWith(lowerCaseValue) ||\n l.location.toLowerCase().startsWith(lowerCaseValue) ||\n l.tag.toLowerCase().startsWith(lowerCaseValue)\n )\n }),\n )\n }}\n onFocus={() => setInputFocus(true)}\n placeholder=\"Search...\"\n />\n </Item>\n {languages.map((locale) => {\n return (\n <Item\n key={locale.tag}\n onClick={() => {\n onClick({ locale: locale.tag })\n }}\n >\n <span className={styles.ellipsis}>{`${locale.location} (${locale.tag})`}</span>\n </Item>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["locales","React","useState","Item","Translate","styles","TranslateMenu","onClick","show","setShow","filteredLocales","all","filter","a","tag","location","languages","setLanguages","inputFocus","setInputFocus","div","className","menu","onMouseLeave","isActive","isMenu","onMouseEnter","hoverMenu","data-show","subMenu","style","background","padding","position","top","input","menuInput","onBlur","onChange","event","value","target","l","lowerCaseValue","toLowerCase","name","startsWith","onFocus","placeholder","map","locale","span","ellipsis"],"mappings":";AAAA,OAAOA,aAAa,eAAc;AAClC,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAEvC,SAASC,IAAI,QAAQ,YAAW;AAChC,SAASC,SAAS,QAAQ,aAAY;AACtC,OAAOC,YAAY,qBAAoB;AAEvC,OAAO,MAAMC,gBAAgB,CAAC,EAAEC,OAAO,EAAE;IACvC,MAAM,CAACC,MAAMC,QAAQ,GAAGP,SAAS;IAEjC,MAAMQ,kBAAkBV,QAAQW,GAAG,CAACC,MAAM,CAAC,CAACC;QAC1C,OAAOA,EAAEC,GAAG,IAAID,EAAEE,QAAQ;IAC5B;IAEA,MAAM,CAACC,WAAWC,aAAa,GAAGf,SAASQ;IAC3C,MAAM,CAACQ,YAAYC,cAAc,GAAGjB,SAAS;IAE7C,qBACE,MAACkB;QACCC,WAAWhB,OAAOiB,IAAI;QACtBC,cAAc;YACZ,IAAI,CAACL,YAAY;gBACfT,QAAQ;YACV;QACF;;0BAEA,KAACL;gBACCoB,UAAUhB;gBACViB,MAAM;gBACNlB,SAAS;oBACPE,QAAQ,CAACD;gBACX;gBACAkB,cAAc,IAAMjB,QAAQ;;0BAE9B,KAACW;gBAAIC,WAAWhB,OAAOsB,SAAS;gBAAEC,aAAWpB;0BAC3C,cAAA,MAACY;oBAAIC,WAAW,GAAGhB,OAAOiB,IAAI,CAAC,CAAC,EAAEjB,OAAOwB,OAAO,EAAE;;
|
|
1
|
+
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"sourcesContent":["import locales from 'locale-codes'\nimport React, { useState } from 'react'\n\nimport { Item } from './Item.js'\nimport { Translate } from './items.js'\nimport styles from './menu.module.scss'\n\nexport const TranslateMenu = ({ onClick }) => {\n const [show, setShow] = useState(false)\n\n const filteredLocales = locales.all.filter((a) => {\n return a.tag && a.location\n })\n\n const [languages, setLanguages] = useState(filteredLocales)\n const [inputFocus, setInputFocus] = useState(false)\n\n return (\n <div\n className={styles.menu}\n onMouseLeave={() => {\n if (!inputFocus) {\n setShow(false)\n }\n }}\n >\n <Translate\n isActive={show}\n isMenu\n onClick={() => {\n setShow(!show)\n }}\n onMouseEnter={() => setShow(true)}\n />\n <div className={styles.hoverMenu} data-show={show}>\n <div className={`${styles.menu} ${styles.subMenu}`} style={{\n background: \"var(--popup-bg)\",\n minHeight: \"300px\"\n }}>\n <Item\n onClick={() => {}}\n style={{\n background: 'transparent',\n padding: '0 0 5px 0',\n position: 'sticky',\n top: 0,\n }}\n >\n <input\n className={styles.menuInput}\n onBlur={() => setInputFocus(false)}\n onChange={(event) => {\n const value = event.target.value\n setLanguages(\n filteredLocales.filter((l) => {\n const lowerCaseValue = value.toLowerCase()\n return (\n l.name.toLowerCase().startsWith(lowerCaseValue) ||\n l.location.toLowerCase().startsWith(lowerCaseValue) ||\n l.tag.toLowerCase().startsWith(lowerCaseValue)\n )\n }),\n )\n }}\n onFocus={() => setInputFocus(true)}\n placeholder=\"Search...\"\n />\n </Item>\n {languages.map((locale) => {\n return (\n <Item\n key={locale.tag}\n onClick={() => {\n onClick({ locale: locale.tag })\n }}\n >\n <span className={styles.ellipsis}>{`${locale.location} (${locale.tag})`}</span>\n </Item>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["locales","React","useState","Item","Translate","styles","TranslateMenu","onClick","show","setShow","filteredLocales","all","filter","a","tag","location","languages","setLanguages","inputFocus","setInputFocus","div","className","menu","onMouseLeave","isActive","isMenu","onMouseEnter","hoverMenu","data-show","subMenu","style","background","minHeight","padding","position","top","input","menuInput","onBlur","onChange","event","value","target","l","lowerCaseValue","toLowerCase","name","startsWith","onFocus","placeholder","map","locale","span","ellipsis"],"mappings":";AAAA,OAAOA,aAAa,eAAc;AAClC,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAEvC,SAASC,IAAI,QAAQ,YAAW;AAChC,SAASC,SAAS,QAAQ,aAAY;AACtC,OAAOC,YAAY,qBAAoB;AAEvC,OAAO,MAAMC,gBAAgB,CAAC,EAAEC,OAAO,EAAE;IACvC,MAAM,CAACC,MAAMC,QAAQ,GAAGP,SAAS;IAEjC,MAAMQ,kBAAkBV,QAAQW,GAAG,CAACC,MAAM,CAAC,CAACC;QAC1C,OAAOA,EAAEC,GAAG,IAAID,EAAEE,QAAQ;IAC5B;IAEA,MAAM,CAACC,WAAWC,aAAa,GAAGf,SAASQ;IAC3C,MAAM,CAACQ,YAAYC,cAAc,GAAGjB,SAAS;IAE7C,qBACE,MAACkB;QACCC,WAAWhB,OAAOiB,IAAI;QACtBC,cAAc;YACZ,IAAI,CAACL,YAAY;gBACfT,QAAQ;YACV;QACF;;0BAEA,KAACL;gBACCoB,UAAUhB;gBACViB,MAAM;gBACNlB,SAAS;oBACPE,QAAQ,CAACD;gBACX;gBACAkB,cAAc,IAAMjB,QAAQ;;0BAE9B,KAACW;gBAAIC,WAAWhB,OAAOsB,SAAS;gBAAEC,aAAWpB;0BAC3C,cAAA,MAACY;oBAAIC,WAAW,GAAGhB,OAAOiB,IAAI,CAAC,CAAC,EAAEjB,OAAOwB,OAAO,EAAE;oBAAEC,OAAO;wBACzDC,YAAY;wBACZC,WAAW;oBACb;;sCACE,KAAC7B;4BACCI,SAAS,KAAO;4BAChBuB,OAAO;gCACLC,YAAY;gCACZE,SAAS;gCACTC,UAAU;gCACVC,KAAK;4BACP;sCAEA,cAAA,KAACC;gCACCf,WAAWhB,OAAOgC,SAAS;gCAC3BC,QAAQ,IAAMnB,cAAc;gCAC5BoB,UAAU,CAACC;oCACT,MAAMC,QAAQD,MAAME,MAAM,CAACD,KAAK;oCAChCxB,aACEP,gBAAgBE,MAAM,CAAC,CAAC+B;wCACtB,MAAMC,iBAAiBH,MAAMI,WAAW;wCACxC,OACEF,EAAEG,IAAI,CAACD,WAAW,GAAGE,UAAU,CAACH,mBAChCD,EAAE5B,QAAQ,CAAC8B,WAAW,GAAGE,UAAU,CAACH,mBACpCD,EAAE7B,GAAG,CAAC+B,WAAW,GAAGE,UAAU,CAACH;oCAEnC;gCAEJ;gCACAI,SAAS,IAAM7B,cAAc;gCAC7B8B,aAAY;;;wBAGfjC,UAAUkC,GAAG,CAAC,CAACC;4BACd,qBACE,KAAChD;gCAECI,SAAS;oCACPA,QAAQ;wCAAE4C,QAAQA,OAAOrC,GAAG;oCAAC;gCAC/B;0CAEA,cAAA,KAACsC;oCAAK/B,WAAWhB,OAAOgD,QAAQ;8CAAG,GAAGF,OAAOpC,QAAQ,CAAC,EAAE,EAAEoC,OAAOrC,GAAG,CAAC,CAAC,CAAC;;+BALlEqC,OAAOrC,GAAG;wBAQrB;;;;;;AAKV,EAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { UseMenuEvents } from '../../../../types.js';
|
|
2
|
-
export declare const useMenu: (menuEvents: UseMenuEvents) => {
|
|
1
|
+
import type { UseMenuEvents, UseMenuOptions } from '../../../../types.js';
|
|
2
|
+
export declare const useMenu: (menuEvents: UseMenuEvents, options: UseMenuOptions) => {
|
|
3
3
|
ActiveComponent: ({ isLoading, stop }: {
|
|
4
4
|
isLoading: any;
|
|
5
5
|
stop: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"useMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAoB1F,eAAO,MAAM,OAAO,GAAI,YAAY,aAAa,EAAE,SAAS,cAAc;;;;;;;;;CA2FzE,CAAA"}
|
|
@@ -18,7 +18,7 @@ const getActiveComponent = (ac)=>{
|
|
|
18
18
|
return Rephrase;
|
|
19
19
|
}
|
|
20
20
|
};
|
|
21
|
-
export const useMenu = (menuEvents)=>{
|
|
21
|
+
export const useMenu = (menuEvents, options)=>{
|
|
22
22
|
const { type: fieldType, path: pathFromContext } = useFieldProps();
|
|
23
23
|
const field = useField({
|
|
24
24
|
path: pathFromContext
|
|
@@ -69,9 +69,14 @@ export const useMenu = (menuEvents)=>{
|
|
|
69
69
|
}, [
|
|
70
70
|
activeComponent
|
|
71
71
|
]);
|
|
72
|
-
const filteredMenuItems = useMemo(()=>menuItemsMap.filter((i)=>
|
|
72
|
+
const filteredMenuItems = useMemo(()=>menuItemsMap.filter((i)=>{
|
|
73
|
+
if (i.name === 'Settings' && !options.isConfigAllowed) return false // Disable settings if a user role is not permitted
|
|
74
|
+
;
|
|
75
|
+
return i.name !== activeComponent && !i.excludedFor?.includes(fieldType);
|
|
76
|
+
}), [
|
|
73
77
|
activeComponent,
|
|
74
|
-
fieldType
|
|
78
|
+
fieldType,
|
|
79
|
+
options.isConfigAllowed
|
|
75
80
|
]);
|
|
76
81
|
const MemoizedMenu = useMemo(()=>{
|
|
77
82
|
return ({ isLoading, onClose })=>/*#__PURE__*/ _jsx("div", {
|
|
@@ -84,7 +89,7 @@ export const useMenu = (menuEvents)=>{
|
|
|
84
89
|
if (i.name !== 'Settings') {
|
|
85
90
|
setActiveComponent(i.name);
|
|
86
91
|
}
|
|
87
|
-
menuEvents[`on${i.name}`](data);
|
|
92
|
+
menuEvents[`on${i.name}`]?.(data);
|
|
88
93
|
onClose();
|
|
89
94
|
},
|
|
90
95
|
children: isLoading && i.loadingText
|