@ai-stack/payloadcms 3.76.0-beta.0 → 3.76.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.
- package/dist/ai/core/generateObject.js +1 -4
- package/dist/ai/core/generateObject.js.map +1 -1
- package/dist/ai/core/generateText.js +1 -5
- package/dist/ai/core/generateText.js.map +1 -1
- package/dist/ai/core/media/generateMedia.js +1 -4
- package/dist/ai/core/media/generateMedia.js.map +1 -1
- package/dist/ai/core/media/image/generateImage.js +4 -14
- package/dist/ai/core/media/image/generateImage.js.map +1 -1
- package/dist/ai/core/media/image/handlers/multimodal.js +21 -58
- package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
- package/dist/ai/core/media/image/handlers/standard.js +17 -9
- package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
- package/dist/ai/core/media/speech/generateSpeech.js +10 -11
- package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
- package/dist/ai/core/media/types.d.ts +3 -4
- package/dist/ai/core/media/types.js.map +1 -1
- package/dist/ai/core/streamObject.js +0 -3
- package/dist/ai/core/streamObject.js.map +1 -1
- package/dist/ai/core/streamText.js +1 -4
- package/dist/ai/core/streamText.js.map +1 -1
- package/dist/ai/core/types.d.ts +2 -2
- package/dist/ai/core/types.js.map +1 -1
- package/dist/ai/providers/blocks/anthropic.js +0 -42
- package/dist/ai/providers/blocks/anthropic.js.map +1 -1
- package/dist/ai/providers/blocks/elevenlabs.js +1 -106
- package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
- package/dist/ai/providers/blocks/fal.js +0 -118
- package/dist/ai/providers/blocks/fal.js.map +1 -1
- package/dist/ai/providers/blocks/google.js +2 -236
- package/dist/ai/providers/blocks/google.js.map +1 -1
- package/dist/ai/providers/blocks/openai-compatible.js +0 -144
- package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
- package/dist/ai/providers/blocks/openai.js +0 -200
- package/dist/ai/providers/blocks/openai.js.map +1 -1
- package/dist/ai/providers/blocks/xai.js +0 -53
- package/dist/ai/providers/blocks/xai.js.map +1 -1
- package/dist/ai/providers/index.d.ts +1 -1
- package/dist/ai/providers/index.js +0 -2
- package/dist/ai/providers/index.js.map +1 -1
- package/dist/ai/providers/registry.d.ts +24 -28
- package/dist/ai/providers/registry.js +186 -140
- package/dist/ai/providers/registry.js.map +1 -1
- package/dist/ai/providers/types.d.ts +12 -33
- package/dist/ai/providers/types.js +0 -1
- package/dist/ai/providers/types.js.map +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.js +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
- package/dist/ai/utilities/filterEditorSchemaByNodes.js.map +1 -0
- package/dist/ai/utilities/generateFileNameByPrompt.js.map +1 -0
- package/dist/ai/utilities/isObjectSchema.js.map +1 -0
- package/dist/ai/utilities/nodeToSchemaMap.js.map +1 -0
- package/dist/ai/{prompts.d.ts → utilities/prompts.d.ts} +1 -1
- package/dist/ai/utilities/prompts.js.map +1 -0
- package/dist/ai/utilities/systemGenerate.js.map +1 -0
- package/dist/collections/AIJobs.js +3 -12
- package/dist/collections/AIJobs.js.map +1 -1
- package/dist/collections/AIProviders.d.ts +2 -0
- package/dist/collections/{AISettings.js → AIProviders.js} +54 -26
- package/dist/collections/AIProviders.js.map +1 -0
- package/dist/collections/Instructions.js +93 -57
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/collections/shared.d.ts +30 -0
- package/dist/collections/shared.js +15 -0
- package/dist/collections/shared.js.map +1 -0
- package/dist/defaults.js +1 -1
- package/dist/defaults.js.map +1 -1
- package/dist/endpoints/fetchFields.js +15 -7
- package/dist/endpoints/fetchFields.js.map +1 -1
- package/dist/endpoints/fetchVoices.js +2 -2
- package/dist/endpoints/fetchVoices.js.map +1 -1
- package/dist/endpoints/generate.d.ts +7 -0
- package/dist/endpoints/generate.js +268 -0
- package/dist/endpoints/generate.js.map +1 -0
- package/dist/endpoints/index.js +9 -604
- package/dist/endpoints/index.js.map +1 -1
- package/dist/endpoints/promptMentions.d.ts +2 -0
- package/dist/endpoints/promptMentions.js +166 -0
- package/dist/endpoints/promptMentions.js.map +1 -0
- package/dist/endpoints/upload.d.ts +7 -0
- package/dist/endpoints/upload.js +294 -0
- package/dist/endpoints/upload.js.map +1 -0
- package/dist/endpoints/videogenWebhook.d.ts +7 -0
- package/dist/endpoints/videogenWebhook.js +132 -0
- package/dist/endpoints/videogenWebhook.js.map +1 -0
- package/dist/exports/client.d.ts +3 -2
- package/dist/exports/client.js +3 -2
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/fields.d.ts +2 -1
- package/dist/exports/fields.js +2 -1
- package/dist/exports/fields.js.map +1 -1
- package/dist/fields/ArrayComposeField/ArrayComposeField.js +1 -1
- package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -1
- package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +1 -1
- package/dist/fields/ComposeField/ComposeField.d.ts +1 -0
- package/dist/fields/ComposeField/ComposeField.js +18 -8
- package/dist/fields/ComposeField/ComposeField.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.jsx +12 -7
- package/dist/fields/PromptEditorField/feature.client.d.ts +1 -0
- package/dist/fields/PromptEditorField/feature.client.js +173 -0
- package/dist/fields/PromptEditorField/feature.client.js.map +1 -0
- package/dist/fields/PromptEditorField/feature.client.jsx +148 -0
- package/dist/fields/PromptEditorField/feature.server.d.ts +1 -0
- package/dist/fields/PromptEditorField/feature.server.js +30 -0
- package/dist/fields/PromptEditorField/feature.server.js.map +1 -0
- package/dist/fields/PromptField.d.ts +4 -0
- package/dist/fields/PromptField.js +18 -0
- package/dist/fields/PromptField.js.map +1 -0
- package/dist/fields/SelectField/SelectField.js +0 -1
- package/dist/fields/SelectField/SelectField.js.map +1 -1
- package/dist/fields/SelectField/SelectField.jsx +0 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/libraries/handlebars/helpers.js +2 -2
- package/dist/libraries/handlebars/helpers.js.map +1 -1
- package/dist/libraries/handlebars/replacePlaceholders.js +5 -1
- package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
- package/dist/payload-ai.d.ts +5 -19
- package/dist/plugin.js +19 -22
- package/dist/plugin.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.js +10 -19
- package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.jsx +7 -17
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +4 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +3 -0
- package/dist/providers/InstructionsProvider/useInstructions.js +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/translations/de.json +47 -0
- package/dist/translations/en.json +45 -2
- package/dist/translations/es.json +45 -2
- package/dist/translations/fa.json +45 -2
- package/dist/translations/fr.json +46 -3
- package/dist/translations/hi.json +47 -0
- package/dist/translations/index.d.ts +88 -26
- package/dist/translations/index.js +18 -32
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/ja.json +47 -0
- package/dist/translations/nb.json +47 -0
- package/dist/translations/nl.json +47 -0
- package/dist/translations/pl.json +45 -2
- package/dist/translations/pt.json +47 -0
- package/dist/translations/ru.json +45 -2
- package/dist/translations/th.json +47 -0
- package/dist/translations/translation-schema.json +184 -11
- package/dist/translations/uk.json +45 -2
- package/dist/translations/zh.json +47 -0
- package/dist/types.d.ts +57 -31
- package/dist/types.js.map +1 -1
- package/dist/ui/Compose/Compose.js +42 -79
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/Compose.jsx +32 -86
- package/dist/ui/Compose/ComposePlaceholder.js +1 -1
- package/dist/ui/Compose/ComposePlaceholder.js.map +1 -1
- package/dist/ui/Compose/ComposePlaceholder.jsx +1 -1
- package/dist/ui/Compose/{compose.module.css → compose.module.scss} +3 -5
- package/dist/ui/Compose/hooks/menu/Item.d.ts +1 -1
- package/dist/ui/Compose/hooks/menu/Item.js +7 -3
- package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/Item.jsx +11 -5
- package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts +5 -0
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js +48 -5
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +44 -6
- package/dist/ui/Compose/hooks/menu/items.d.ts +8 -8
- package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +2 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/menu.module.scss +4 -1
- package/dist/ui/Compose/hooks/menu/types.d.ts +21 -0
- package/dist/ui/Compose/hooks/menu/types.js +3 -0
- package/dist/ui/Compose/hooks/menu/types.js.map +1 -0
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
- package/dist/ui/Compose/hooks/menu/useMenu.js +45 -23
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.jsx +43 -23
- package/dist/ui/Compose/hooks/mergeGeneratedValue.d.ts +14 -0
- package/dist/ui/Compose/hooks/mergeGeneratedValue.js +38 -0
- package/dist/ui/Compose/hooks/mergeGeneratedValue.js.map +1 -0
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js +34 -0
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.js +37 -12
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerateUpload.js +67 -19
- package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
- package/dist/ui/Compose/hooks/useStreamingUpdate.js +4 -4
- package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
- package/dist/ui/ConfigDashboard/configDashboard.module.css +94 -0
- package/dist/ui/ConfigDashboard/index.d.ts +2 -0
- package/dist/ui/ConfigDashboard/index.js +159 -0
- package/dist/ui/ConfigDashboard/index.js.map +1 -0
- package/dist/ui/ConfigDashboard/index.jsx +122 -0
- package/dist/ui/DynamicModelSelect/index.js +6 -27
- package/dist/ui/DynamicModelSelect/index.js.map +1 -1
- package/dist/ui/DynamicModelSelect/index.jsx +6 -29
- package/dist/ui/DynamicProviderSelect/index.js +6 -27
- package/dist/ui/DynamicProviderSelect/index.js.map +1 -1
- package/dist/ui/DynamicProviderSelect/index.jsx +6 -29
- package/dist/ui/DynamicVoiceSelect/index.js +34 -83
- package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
- package/dist/ui/DynamicVoiceSelect/index.jsx +16 -53
- package/dist/ui/GlobalProviderOptions/index.d.ts +2 -0
- package/dist/ui/GlobalProviderOptions/index.js +118 -0
- package/dist/ui/GlobalProviderOptions/index.js.map +1 -0
- package/dist/ui/GlobalProviderOptions/index.jsx +60 -0
- package/dist/ui/Icons/Icons.js +1 -1
- package/dist/ui/Icons/Icons.js.map +1 -1
- package/dist/ui/Icons/Icons.jsx +1 -1
- package/dist/ui/Icons/LottieAnimation.js +1 -1
- package/dist/ui/Icons/LottieAnimation.js.map +1 -1
- package/dist/ui/Icons/LottieAnimation.jsx +1 -1
- package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.d.ts +12 -0
- package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js +166 -0
- package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js.map +1 -0
- package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.jsx +83 -0
- package/dist/ui/InstructionProviderOptions/index.d.ts +2 -0
- package/dist/ui/InstructionProviderOptions/index.js +157 -0
- package/dist/ui/InstructionProviderOptions/index.js.map +1 -0
- package/dist/ui/InstructionProviderOptions/index.jsx +92 -0
- package/dist/ui/VoicesFetcher/index.js.map +1 -1
- package/dist/ui/hooks/useAISettings.d.ts +26 -0
- package/dist/ui/hooks/useAISettings.js +73 -0
- package/dist/ui/hooks/useAISettings.js.map +1 -0
- package/dist/ui/providerOptions/updateProviderOptionsValue.d.ts +6 -0
- package/dist/ui/providerOptions/updateProviderOptionsValue.js +50 -0
- package/dist/ui/providerOptions/updateProviderOptionsValue.js.map +1 -0
- package/dist/ui/shared/handleSelectChange.d.ts +5 -0
- package/dist/ui/shared/handleSelectChange.js +12 -0
- package/dist/ui/shared/handleSelectChange.js.map +1 -0
- package/dist/ui/shared/types.d.ts +11 -0
- package/dist/ui/shared/types.js +5 -0
- package/dist/ui/shared/types.js.map +1 -0
- package/dist/utilities/ai/resolveEffectiveInstructionSettings.d.ts +15 -0
- package/dist/utilities/ai/resolveEffectiveInstructionSettings.js +136 -0
- package/dist/utilities/ai/resolveEffectiveInstructionSettings.js.map +1 -0
- package/dist/{endpoints → utilities}/buildPromptUtils.js +14 -5
- package/dist/utilities/buildPromptUtils.js.map +1 -0
- package/dist/utilities/buildSmartPrompt.js +3 -3
- package/dist/utilities/buildSmartPrompt.js.map +1 -1
- package/dist/utilities/fields/fieldToJsonSchema.js.map +1 -0
- package/dist/utilities/fields/getFieldBySchemaPath.js.map +1 -0
- package/dist/utilities/fields/getFieldInfo.js.map +1 -0
- package/dist/utilities/{updateFieldsConfig.js → fields/updateFieldsConfig.js} +8 -3
- package/dist/utilities/fields/updateFieldsConfig.js.map +1 -0
- package/dist/utilities/images/extractImageData.js.map +1 -0
- package/dist/utilities/images/extractPromptAttachments.js.map +1 -0
- package/dist/utilities/{fetchImages.d.ts → images/fetchImages.d.ts} +1 -1
- package/dist/utilities/images/fetchImages.js +49 -0
- package/dist/utilities/images/fetchImages.js.map +1 -0
- package/dist/utilities/images/resolveImageReferences.js +183 -0
- package/dist/utilities/images/resolveImageReferences.js.map +1 -0
- package/dist/utilities/init/autoSetupProviders.d.ts +3 -0
- package/dist/utilities/init/autoSetupProviders.js +216 -0
- package/dist/utilities/init/autoSetupProviders.js.map +1 -0
- package/dist/utilities/lexical/editorSchemaValidator.js.map +1 -0
- package/dist/utilities/lexical/lexicalToHTML.js.map +1 -0
- package/dist/utilities/lexical/lexicalToPromptTemplate.d.ts +2 -0
- package/dist/utilities/lexical/lexicalToPromptTemplate.js +50 -0
- package/dist/utilities/lexical/lexicalToPromptTemplate.js.map +1 -0
- package/dist/utilities/lexical/setSafeLexicalState.js.map +1 -0
- package/dist/utilities/lexical/stringToLexicalJSON.d.ts +2 -0
- package/dist/utilities/lexical/stringToLexicalJSON.js +39 -0
- package/dist/utilities/lexical/stringToLexicalJSON.js.map +1 -0
- package/dist/utilities/sanitizeLog.d.ts +1 -0
- package/dist/utilities/sanitizeLog.js +39 -0
- package/dist/utilities/sanitizeLog.js.map +1 -0
- package/dist/utilities/seedProperties.js +37 -22
- package/dist/utilities/seedProperties.js.map +1 -1
- package/package.json +5 -2
- package/dist/ai/analyse.d.ts +0 -1
- package/dist/ai/analyse.js +0 -3
- package/dist/ai/analyse.js.map +0 -1
- package/dist/ai/index.d.ts +0 -11
- package/dist/ai/index.js +0 -25
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/prompts.js.map +0 -1
- package/dist/ai/utils/filterEditorSchemaByNodes.js.map +0 -1
- package/dist/ai/utils/generateFileNameByPrompt.js.map +0 -1
- package/dist/ai/utils/isObjectSchema.js.map +0 -1
- package/dist/ai/utils/nodeToSchemaMap.js.map +0 -1
- package/dist/ai/utils/systemGenerate.js.map +0 -1
- package/dist/collections/AISettings.d.ts +0 -2
- package/dist/collections/AISettings.js.map +0 -1
- package/dist/endpoints/buildPromptUtils.js.map +0 -1
- package/dist/endpoints/chat.d.ts +0 -4
- package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -3
- package/dist/fields/PromptEditorField/PromptEditorField.js +0 -217
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +0 -1
- package/dist/fields/PromptEditorField/PromptEditorField.jsx +0 -160
- package/dist/ui/AIConfigDashboard/index.d.ts +0 -2
- package/dist/ui/AIConfigDashboard/index.js +0 -222
- package/dist/ui/AIConfigDashboard/index.js.map +0 -1
- package/dist/ui/AIConfigDashboard/index.jsx +0 -170
- package/dist/ui/ProviderOptionsEditor/index.d.ts +0 -7
- package/dist/ui/ProviderOptionsEditor/index.js +0 -291
- package/dist/ui/ProviderOptionsEditor/index.js.map +0 -1
- package/dist/ui/ProviderOptionsEditor/index.jsx +0 -210
- package/dist/utilities/editorSchemaValidator.js.map +0 -1
- package/dist/utilities/extractImageData.js.map +0 -1
- package/dist/utilities/extractPromptAttachments.js.map +0 -1
- package/dist/utilities/fetchImages.js +0 -38
- package/dist/utilities/fetchImages.js.map +0 -1
- package/dist/utilities/fieldToJsonSchema.js.map +0 -1
- package/dist/utilities/getFieldBySchemaPath.js.map +0 -1
- package/dist/utilities/getFieldInfo.js.map +0 -1
- package/dist/utilities/getProviderOptionsFields.d.ts +0 -16
- package/dist/utilities/getProviderOptionsFields.js +0 -80
- package/dist/utilities/getProviderOptionsFields.js.map +0 -1
- package/dist/utilities/isPluginActivated.d.ts +0 -2
- package/dist/utilities/isPluginActivated.js +0 -5
- package/dist/utilities/isPluginActivated.js.map +0 -1
- package/dist/utilities/lexicalToHTML.js.map +0 -1
- package/dist/utilities/resolveImageReferences.js +0 -167
- package/dist/utilities/resolveImageReferences.js.map +0 -1
- package/dist/utilities/schemaConverter.d.ts +0 -3
- package/dist/utilities/schemaConverter.js +0 -93
- package/dist/utilities/schemaConverter.js.map +0 -1
- package/dist/utilities/setSafeLexicalState.js.map +0 -1
- package/dist/utilities/updateFieldsConfig.js.map +0 -1
- /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.js +0 -0
- /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.js +0 -0
- /package/dist/ai/{utils → utilities}/isObjectSchema.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/isObjectSchema.js +0 -0
- /package/dist/ai/{utils → utilities}/nodeToSchemaMap.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/nodeToSchemaMap.js +0 -0
- /package/dist/ai/{prompts.js → utilities/prompts.js} +0 -0
- /package/dist/ai/{utils → utilities}/systemGenerate.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/systemGenerate.js +0 -0
- /package/dist/ui/Icons/{icons.module.css → icons.module.scss} +0 -0
- /package/dist/{endpoints → utilities}/buildPromptUtils.d.ts +0 -0
- /package/dist/utilities/{fieldToJsonSchema.d.ts → fields/fieldToJsonSchema.d.ts} +0 -0
- /package/dist/utilities/{fieldToJsonSchema.js → fields/fieldToJsonSchema.js} +0 -0
- /package/dist/utilities/{getFieldBySchemaPath.d.ts → fields/getFieldBySchemaPath.d.ts} +0 -0
- /package/dist/utilities/{getFieldBySchemaPath.js → fields/getFieldBySchemaPath.js} +0 -0
- /package/dist/utilities/{getFieldInfo.d.ts → fields/getFieldInfo.d.ts} +0 -0
- /package/dist/utilities/{getFieldInfo.js → fields/getFieldInfo.js} +0 -0
- /package/dist/utilities/{updateFieldsConfig.d.ts → fields/updateFieldsConfig.d.ts} +0 -0
- /package/dist/utilities/{extractImageData.d.ts → images/extractImageData.d.ts} +0 -0
- /package/dist/utilities/{extractImageData.js → images/extractImageData.js} +0 -0
- /package/dist/utilities/{extractPromptAttachments.d.ts → images/extractPromptAttachments.d.ts} +0 -0
- /package/dist/utilities/{extractPromptAttachments.js → images/extractPromptAttachments.js} +0 -0
- /package/dist/utilities/{resolveImageReferences.d.ts → images/resolveImageReferences.d.ts} +0 -0
- /package/dist/utilities/{editorSchemaValidator.d.ts → lexical/editorSchemaValidator.d.ts} +0 -0
- /package/dist/utilities/{editorSchemaValidator.js → lexical/editorSchemaValidator.js} +0 -0
- /package/dist/utilities/{lexicalToHTML.d.ts → lexical/lexicalToHTML.d.ts} +0 -0
- /package/dist/utilities/{lexicalToHTML.js → lexical/lexicalToHTML.js} +0 -0
- /package/dist/utilities/{setSafeLexicalState.d.ts → lexical/setSafeLexicalState.d.ts} +0 -0
- /package/dist/utilities/{setSafeLexicalState.js → lexical/setSafeLexicalState.js} +0 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Button, toast, useConfig, useTranslation } from '@payloadcms/ui';
|
|
4
|
+
// @ts-expect-error - Next.js types are not resolving correctly with nodenext but runtime is fine
|
|
5
|
+
import { useRouter } from 'next/navigation';
|
|
6
|
+
import React, { use, useEffect, useState } from 'react';
|
|
7
|
+
import { excludeCollections } from '../../defaults.js';
|
|
8
|
+
import { InstructionsContext } from '../../providers/InstructionsProvider/context.js';
|
|
9
|
+
import styles from './configDashboard.module.css';
|
|
10
|
+
export const ConfigDashboard = ()=>{
|
|
11
|
+
const { config: { collections, routes: { admin: adminRoute, api: apiRoute } } } = useConfig();
|
|
12
|
+
const router = useRouter();
|
|
13
|
+
const { refresh, setEnabledCollections: setEnabledCollectionsInContext } = use(InstructionsContext);
|
|
14
|
+
const [enabledCollections, setEnabledCollections] = useState([]);
|
|
15
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
16
|
+
const [isSaving, setIsSaving] = useState(false);
|
|
17
|
+
const { t } = useTranslation();
|
|
18
|
+
const availableCollections = collections.filter((c)=>!excludeCollections.includes(c.slug) && !c.admin?.hidden);
|
|
19
|
+
useEffect(()=>{
|
|
20
|
+
const fetchSettings = async ()=>{
|
|
21
|
+
try {
|
|
22
|
+
const response = await fetch(`${apiRoute}/globals/ai-providers`);
|
|
23
|
+
if (response.ok) {
|
|
24
|
+
const data = await response.json();
|
|
25
|
+
const storedEnabled = data.enabledCollections || [];
|
|
26
|
+
setEnabledCollections(Array.isArray(storedEnabled) ? storedEnabled : []);
|
|
27
|
+
}
|
|
28
|
+
} catch (error) {
|
|
29
|
+
console.error('Failed to fetch AI settings:', error);
|
|
30
|
+
} finally{
|
|
31
|
+
setIsLoading(false);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
fetchSettings().catch(console.error);
|
|
35
|
+
}, [
|
|
36
|
+
apiRoute
|
|
37
|
+
]);
|
|
38
|
+
const handleToggle = (slug)=>{
|
|
39
|
+
setEnabledCollections((prev)=>{
|
|
40
|
+
if (prev.includes(slug)) {
|
|
41
|
+
return prev.filter((s)=>s !== slug);
|
|
42
|
+
}
|
|
43
|
+
return [
|
|
44
|
+
...prev,
|
|
45
|
+
slug
|
|
46
|
+
];
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
const handleSave = async ()=>{
|
|
50
|
+
setIsSaving(true);
|
|
51
|
+
try {
|
|
52
|
+
const response = await fetch(`${apiRoute}/globals/ai-providers`, {
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
enabledCollections
|
|
55
|
+
}),
|
|
56
|
+
headers: {
|
|
57
|
+
'Content-Type': 'application/json'
|
|
58
|
+
},
|
|
59
|
+
method: 'POST'
|
|
60
|
+
});
|
|
61
|
+
if (response.ok) {
|
|
62
|
+
toast.success(t('ai-plugin:configDashboard:settingsSaved'));
|
|
63
|
+
if (setEnabledCollectionsInContext) {
|
|
64
|
+
setEnabledCollectionsInContext(enabledCollections);
|
|
65
|
+
}
|
|
66
|
+
if (refresh) {
|
|
67
|
+
await refresh();
|
|
68
|
+
}
|
|
69
|
+
router.refresh();
|
|
70
|
+
} else {
|
|
71
|
+
toast.error(t('ai-plugin:configDashboard:failedToSave'));
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error('Error saving settings:', error);
|
|
75
|
+
toast.error(t('ai-plugin:configDashboard:errorSaving'));
|
|
76
|
+
} finally{
|
|
77
|
+
setIsSaving(false);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
if (isLoading) {
|
|
81
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
82
|
+
className: styles.loading,
|
|
83
|
+
children: t('ai-plugin:configDashboard:loadingConfiguration')
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
87
|
+
className: styles.wrapper,
|
|
88
|
+
children: [
|
|
89
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
90
|
+
className: styles.header,
|
|
91
|
+
children: [
|
|
92
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
93
|
+
children: [
|
|
94
|
+
/*#__PURE__*/ _jsx("h2", {
|
|
95
|
+
className: styles.title,
|
|
96
|
+
children: t('ai-plugin:configDashboard:configureTitle')
|
|
97
|
+
}),
|
|
98
|
+
/*#__PURE__*/ _jsx("p", {
|
|
99
|
+
className: styles.subtitle,
|
|
100
|
+
children: t('ai-plugin:configDashboard:configureSubtitle')
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
}),
|
|
104
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
105
|
+
className: styles.headerActions,
|
|
106
|
+
children: [
|
|
107
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
108
|
+
buttonStyle: "secondary",
|
|
109
|
+
el: "link",
|
|
110
|
+
to: `${adminRoute}/globals/ai-providers`,
|
|
111
|
+
children: t('ai-plugin:configDashboard:providers')
|
|
112
|
+
}),
|
|
113
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
114
|
+
disabled: isSaving,
|
|
115
|
+
onClick: handleSave,
|
|
116
|
+
children: isSaving ? t('ai-plugin:configDashboard:saving') : t('ai-plugin:configDashboard:saveChanges')
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
})
|
|
120
|
+
]
|
|
121
|
+
}),
|
|
122
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
123
|
+
className: styles.body,
|
|
124
|
+
children: [
|
|
125
|
+
/*#__PURE__*/ _jsx("h5", {
|
|
126
|
+
className: styles.bodyTitle,
|
|
127
|
+
children: t('ai-plugin:configDashboard:selectCollectionsBody')
|
|
128
|
+
}),
|
|
129
|
+
/*#__PURE__*/ _jsx("div", {
|
|
130
|
+
className: styles.grid,
|
|
131
|
+
children: availableCollections.map((collection)=>{
|
|
132
|
+
const isEnabled = enabledCollections.includes(collection.slug);
|
|
133
|
+
return /*#__PURE__*/ _jsxs("button", {
|
|
134
|
+
className: styles.toggleButton,
|
|
135
|
+
"data-enabled": isEnabled,
|
|
136
|
+
onClick: ()=>handleToggle(collection.slug),
|
|
137
|
+
type: "button",
|
|
138
|
+
children: [
|
|
139
|
+
/*#__PURE__*/ _jsx("div", {
|
|
140
|
+
className: styles.toggleTrack,
|
|
141
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
142
|
+
className: styles.toggleKnob
|
|
143
|
+
})
|
|
144
|
+
}),
|
|
145
|
+
/*#__PURE__*/ _jsx("span", {
|
|
146
|
+
className: styles.toggleLabel,
|
|
147
|
+
children: typeof collection.labels?.singular === 'string' ? collection.labels.singular : collection.labels?.singular?.en || collection.slug
|
|
148
|
+
})
|
|
149
|
+
]
|
|
150
|
+
}, collection.slug);
|
|
151
|
+
})
|
|
152
|
+
})
|
|
153
|
+
]
|
|
154
|
+
})
|
|
155
|
+
]
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/ConfigDashboard/index.tsx"],"sourcesContent":["'use client'\n\nimport { Button, toast, useConfig, useTranslation } from '@payloadcms/ui'\n// @ts-expect-error - Next.js types are not resolving correctly with nodenext but runtime is fine\nimport { useRouter } from 'next/navigation'\nimport React, { use, useEffect, useState } from 'react'\n\nimport { excludeCollections } from '../../defaults.js'\nimport { InstructionsContext } from '../../providers/InstructionsProvider/context.js'\nimport styles from './configDashboard.module.css'\n\nexport const ConfigDashboard: React.FC = () => {\n const {\n config: {\n collections,\n routes: { admin: adminRoute, api: apiRoute },\n },\n } = useConfig()\n const router = useRouter()\n const { refresh, setEnabledCollections: setEnabledCollectionsInContext } =\n use(InstructionsContext)\n\n const [enabledCollections, setEnabledCollections] = useState<string[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isSaving, setIsSaving] = useState(false)\n const { t } = useTranslation()\n\n const availableCollections = collections.filter(\n (c) =>\n !excludeCollections.includes(c.slug) &&\n !(c.admin as unknown as { hidden?: ((args: any) => boolean) | boolean })?.hidden,\n )\n\n useEffect(() => {\n const fetchSettings = async () => {\n try {\n const response = await fetch(`${apiRoute}/globals/ai-providers`)\n if (response.ok) {\n const data = await response.json()\n const storedEnabled = data.enabledCollections || []\n setEnabledCollections(Array.isArray(storedEnabled) ? storedEnabled : [])\n }\n } catch (error) {\n console.error('Failed to fetch AI settings:', error)\n } finally {\n setIsLoading(false)\n }\n }\n\n fetchSettings().catch(console.error)\n }, [apiRoute])\n\n const handleToggle = (slug: string) => {\n setEnabledCollections((prev) => {\n if (prev.includes(slug)) {\n return prev.filter((s) => s !== slug)\n }\n return [...prev, slug]\n })\n }\n\n const handleSave = async () => {\n setIsSaving(true)\n try {\n const response = await fetch(`${apiRoute}/globals/ai-providers`, {\n body: JSON.stringify({\n enabledCollections,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (response.ok) {\n toast.success(t('ai-plugin:configDashboard:settingsSaved' as any))\n if (setEnabledCollectionsInContext) {\n setEnabledCollectionsInContext(enabledCollections)\n }\n if (refresh) {\n await refresh()\n }\n router.refresh()\n } else {\n toast.error(t('ai-plugin:configDashboard:failedToSave' as any))\n }\n } catch (error) {\n console.error('Error saving settings:', error)\n toast.error(t('ai-plugin:configDashboard:errorSaving' as any))\n } finally {\n setIsSaving(false)\n }\n }\n\n if (isLoading) {\n return <div className={styles.loading}>{t('ai-plugin:configDashboard:loadingConfiguration' as any)}</div>\n }\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.header}>\n <div>\n <h2 className={styles.title}>{t('ai-plugin:configDashboard:configureTitle' as any)}</h2>\n <p className={styles.subtitle}>\n {t('ai-plugin:configDashboard:configureSubtitle' as any)}\n </p>\n </div>\n <div className={styles.headerActions}>\n <Button buttonStyle=\"secondary\" el=\"link\" to={`${adminRoute}/globals/ai-providers`}>\n {t('ai-plugin:configDashboard:providers' as any)}\n </Button>\n <Button disabled={isSaving} onClick={handleSave}>\n {isSaving ? t('ai-plugin:configDashboard:saving' as any) : t('ai-plugin:configDashboard:saveChanges' as any)}\n </Button>\n </div>\n </div>\n\n <div className={styles.body}>\n <h5 className={styles.bodyTitle}>\n {t('ai-plugin:configDashboard:selectCollectionsBody' as any)}\n </h5>\n <div className={styles.grid}>\n {availableCollections.map((collection) => {\n const isEnabled = enabledCollections.includes(collection.slug)\n return (\n <button\n className={styles.toggleButton}\n data-enabled={isEnabled}\n key={collection.slug}\n onClick={() => handleToggle(collection.slug)}\n type=\"button\"\n >\n <div className={styles.toggleTrack}>\n <div className={styles.toggleKnob} />\n </div>\n <span className={styles.toggleLabel}>\n {typeof collection.labels?.singular === 'string'\n ? collection.labels.singular\n : collection.labels?.singular?.en || collection.slug}\n </span>\n </button>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["Button","toast","useConfig","useTranslation","useRouter","React","use","useEffect","useState","excludeCollections","InstructionsContext","styles","ConfigDashboard","config","collections","routes","admin","adminRoute","api","apiRoute","router","refresh","setEnabledCollections","setEnabledCollectionsInContext","enabledCollections","isLoading","setIsLoading","isSaving","setIsSaving","t","availableCollections","filter","c","includes","slug","hidden","fetchSettings","response","fetch","ok","data","json","storedEnabled","Array","isArray","error","console","catch","handleToggle","prev","s","handleSave","body","JSON","stringify","headers","method","success","div","className","loading","wrapper","header","h2","title","p","subtitle","headerActions","buttonStyle","el","to","disabled","onClick","h5","bodyTitle","grid","map","collection","isEnabled","button","toggleButton","data-enabled","type","toggleTrack","toggleKnob","span","toggleLabel","labels","singular","en"],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { Button, toast, useConfig, useTranslation } from '@payloadcms/ui';
|
|
3
|
+
// @ts-expect-error - Next.js types are not resolving correctly with nodenext but runtime is fine
|
|
4
|
+
import { useRouter } from 'next/navigation';
|
|
5
|
+
import React, { use, useEffect, useState } from 'react';
|
|
6
|
+
import { excludeCollections } from '../../defaults.js';
|
|
7
|
+
import { InstructionsContext } from '../../providers/InstructionsProvider/context.js';
|
|
8
|
+
import styles from './configDashboard.module.css';
|
|
9
|
+
export const ConfigDashboard = () => {
|
|
10
|
+
const { config: { collections, routes: { admin: adminRoute, api: apiRoute }, }, } = useConfig();
|
|
11
|
+
const router = useRouter();
|
|
12
|
+
const { refresh, setEnabledCollections: setEnabledCollectionsInContext } = use(InstructionsContext);
|
|
13
|
+
const [enabledCollections, setEnabledCollections] = useState([]);
|
|
14
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
15
|
+
const [isSaving, setIsSaving] = useState(false);
|
|
16
|
+
const { t } = useTranslation();
|
|
17
|
+
const availableCollections = collections.filter((c) => !excludeCollections.includes(c.slug) &&
|
|
18
|
+
!c.admin?.hidden);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const fetchSettings = async () => {
|
|
21
|
+
try {
|
|
22
|
+
const response = await fetch(`${apiRoute}/globals/ai-providers`);
|
|
23
|
+
if (response.ok) {
|
|
24
|
+
const data = await response.json();
|
|
25
|
+
const storedEnabled = data.enabledCollections || [];
|
|
26
|
+
setEnabledCollections(Array.isArray(storedEnabled) ? storedEnabled : []);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error('Failed to fetch AI settings:', error);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
setIsLoading(false);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
fetchSettings().catch(console.error);
|
|
37
|
+
}, [apiRoute]);
|
|
38
|
+
const handleToggle = (slug) => {
|
|
39
|
+
setEnabledCollections((prev) => {
|
|
40
|
+
if (prev.includes(slug)) {
|
|
41
|
+
return prev.filter((s) => s !== slug);
|
|
42
|
+
}
|
|
43
|
+
return [...prev, slug];
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const handleSave = async () => {
|
|
47
|
+
setIsSaving(true);
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetch(`${apiRoute}/globals/ai-providers`, {
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
enabledCollections,
|
|
52
|
+
}),
|
|
53
|
+
headers: {
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
},
|
|
56
|
+
method: 'POST',
|
|
57
|
+
});
|
|
58
|
+
if (response.ok) {
|
|
59
|
+
toast.success(t('ai-plugin:configDashboard:settingsSaved'));
|
|
60
|
+
if (setEnabledCollectionsInContext) {
|
|
61
|
+
setEnabledCollectionsInContext(enabledCollections);
|
|
62
|
+
}
|
|
63
|
+
if (refresh) {
|
|
64
|
+
await refresh();
|
|
65
|
+
}
|
|
66
|
+
router.refresh();
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
toast.error(t('ai-plugin:configDashboard:failedToSave'));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error('Error saving settings:', error);
|
|
74
|
+
toast.error(t('ai-plugin:configDashboard:errorSaving'));
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
setIsSaving(false);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
if (isLoading) {
|
|
81
|
+
return <div className={styles.loading}>{t('ai-plugin:configDashboard:loadingConfiguration')}</div>;
|
|
82
|
+
}
|
|
83
|
+
return (<div className={styles.wrapper}>
|
|
84
|
+
<div className={styles.header}>
|
|
85
|
+
<div>
|
|
86
|
+
<h2 className={styles.title}>{t('ai-plugin:configDashboard:configureTitle')}</h2>
|
|
87
|
+
<p className={styles.subtitle}>
|
|
88
|
+
{t('ai-plugin:configDashboard:configureSubtitle')}
|
|
89
|
+
</p>
|
|
90
|
+
</div>
|
|
91
|
+
<div className={styles.headerActions}>
|
|
92
|
+
<Button buttonStyle="secondary" el="link" to={`${adminRoute}/globals/ai-providers`}>
|
|
93
|
+
{t('ai-plugin:configDashboard:providers')}
|
|
94
|
+
</Button>
|
|
95
|
+
<Button disabled={isSaving} onClick={handleSave}>
|
|
96
|
+
{isSaving ? t('ai-plugin:configDashboard:saving') : t('ai-plugin:configDashboard:saveChanges')}
|
|
97
|
+
</Button>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
<div className={styles.body}>
|
|
102
|
+
<h5 className={styles.bodyTitle}>
|
|
103
|
+
{t('ai-plugin:configDashboard:selectCollectionsBody')}
|
|
104
|
+
</h5>
|
|
105
|
+
<div className={styles.grid}>
|
|
106
|
+
{availableCollections.map((collection) => {
|
|
107
|
+
const isEnabled = enabledCollections.includes(collection.slug);
|
|
108
|
+
return (<button className={styles.toggleButton} data-enabled={isEnabled} key={collection.slug} onClick={() => handleToggle(collection.slug)} type="button">
|
|
109
|
+
<div className={styles.toggleTrack}>
|
|
110
|
+
<div className={styles.toggleKnob}/>
|
|
111
|
+
</div>
|
|
112
|
+
<span className={styles.toggleLabel}>
|
|
113
|
+
{typeof collection.labels?.singular === 'string'
|
|
114
|
+
? collection.labels.singular
|
|
115
|
+
: collection.labels?.singular?.en || collection.slug}
|
|
116
|
+
</span>
|
|
117
|
+
</button>);
|
|
118
|
+
})}
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>);
|
|
122
|
+
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { SelectInput, useField, useFormFields } from '@payloadcms/ui';
|
|
4
|
-
import React, {
|
|
4
|
+
import React, { useMemo } from 'react';
|
|
5
5
|
import { allProviderBlocks } from '../../ai/providers/blocks/index.js';
|
|
6
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
7
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
6
8
|
/**
|
|
7
9
|
* Find a field by name within a block's fields, searching through tabs
|
|
8
10
|
*/ function findFieldInBlock(block, fieldName) {
|
|
@@ -88,25 +90,8 @@ export const DynamicModelSelect = (props)=>{
|
|
|
88
90
|
const { setValue, value } = useField({
|
|
89
91
|
path
|
|
90
92
|
});
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
// Fetch AI Settings global to get configured providers
|
|
94
|
-
useEffect(()=>{
|
|
95
|
-
const fetchSettings = async ()=>{
|
|
96
|
-
try {
|
|
97
|
-
const response = await fetch('/api/globals/ai-settings?depth=1');
|
|
98
|
-
if (response.ok) {
|
|
99
|
-
const data = await response.json();
|
|
100
|
-
if (data && data.providers) {
|
|
101
|
-
setProvidersData(data.providers);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
} catch (error) {
|
|
105
|
-
console.error('Error fetching AI settings:', error);
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
fetchSettings().catch(console.error);
|
|
109
|
-
}, []);
|
|
93
|
+
const { data: aiSettings } = useAISettings();
|
|
94
|
+
const providersData = aiSettings?.providers ?? [];
|
|
110
95
|
const inferredUseCase = useMemo(()=>inferUseCase(path), [
|
|
111
96
|
path
|
|
112
97
|
]);
|
|
@@ -213,13 +198,7 @@ export const DynamicModelSelect = (props)=>{
|
|
|
213
198
|
}),
|
|
214
199
|
/*#__PURE__*/ _jsx(SelectInput, {
|
|
215
200
|
name: name,
|
|
216
|
-
onChange: (option)=>
|
|
217
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
218
|
-
setValue(option.value);
|
|
219
|
-
} else {
|
|
220
|
-
setValue(option);
|
|
221
|
-
}
|
|
222
|
-
},
|
|
201
|
+
onChange: (option)=>handleSelectChange(setValue, option),
|
|
223
202
|
options: options,
|
|
224
203
|
path: path,
|
|
225
204
|
value: value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/DynamicModelSelect/index.tsx"],"sourcesContent":["'use client'\n\nimport { SelectInput, useField, useFormFields } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport { allProviderBlocks } from '../../ai/providers/blocks/index.js'\n\ntype Props = {\n name: string\n path: string\n}\n\n/**\n * Find a field by name within a block's fields, searching through tabs\n */\nfunction findFieldInBlock(block: any, fieldName: string): any | undefined {\n const searchFields = (fields: any[]): any | undefined => {\n for (const field of fields) {\n if ('name' in field && field.name === fieldName) {\n return field\n }\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n const found = searchFields(tab.fields)\n if (found) {\n return found\n }\n }\n }\n if (field.type === 'group' && 'fields' in field) {\n const found = searchFields(field.fields)\n if (found) {\n return found\n }\n }\n }\n return undefined\n }\n \n return searchFields(block.fields)\n}\n\n/**\n * Infer use case from field path\n * Handles both:\n * - AISettings paths: 'defaults.text.model', 'defaults.image.model'\n * - Instructions paths: 'text-settings.model', 'image-settings.model'\n */\nfunction inferUseCase(path: string): string {\n const pathParts = path.split('.')\n const parentName = pathParts[pathParts.length - 2]\n \n // AISettings: 'defaults.text.model' -> parentName is 'text'\n // Direct use case names\n if (['image', 'text', 'tts', 'video'].includes(parentName)) {\n return parentName\n }\n \n // Instructions: 'text-settings.model' -> parentName is 'text-settings'\n if (parentName === 'image-settings') {\n return 'image'\n }\n if (parentName === 'tts-settings') {\n return 'tts'\n }\n if (parentName === 'text-settings' || parentName === 'richtext-settings') {\n return 'text'\n }\n if (parentName === 'video-settings') {\n return 'video'\n }\n \n // Default to text\n return 'text'\n}\n\nexport const DynamicModelSelect: React.FC<Props> = (props) => {\n const { name, path } = props\n\n // Getting the 'provider' sibling field value\n const parentPath = path.split('.').slice(0, -1).join('.')\n const providerPath = `${parentPath}.provider`\n\n const providerField = useFormFields(([fields]) => fields[providerPath])\n const providerValue = providerField?.value as string\n\n // Get all form fields to search for live provider configuration (for AISettings context)\n // We filter to only 'providers' fields to avoid unnecessary re-renders, \n // but note that the selector runs on every change.\n const formProviders = useFormFields(([fields]) => {\n const providers: Record<string, any> = {}\n if (fields && typeof fields === 'object') {\n Object.keys(fields).forEach((key) => {\n if (key.startsWith('providers.')) {\n providers[key] = fields[key]\n }\n })\n }\n return providers\n })\n\n const { setValue, value } = useField<string>({ path })\n\n // State to hold fetched providers data\n const [providersData, setProvidersData] = useState<any[]>([])\n\n // Fetch AI Settings global to get configured providers\n useEffect(() => {\n const fetchSettings = async () => {\n try {\n const response = await fetch('/api/globals/ai-settings?depth=1')\n if (response.ok) {\n const data = await response.json()\n if (data && data.providers) {\n setProvidersData(data.providers)\n }\n }\n } catch (error) {\n console.error('Error fetching AI settings:', error)\n }\n }\n\n fetchSettings().catch(console.error)\n }, [])\n\n const inferredUseCase = useMemo(() => inferUseCase(path), [path])\n\n const options = useMemo(() => {\n if (!providerValue) {\n return []\n }\n\n const optionsList: { label: string; value: string }[] = []\n\n // Strategy:\n // 1. Try to find provider in LIVE form state (if editing AISettings)\n // 2. If not found, try to find in FETCHED API data (if editing Instructions or saved AISettings)\n // 3. Fall back to static defaults from block definitions\n\n let foundInForm = false\n let foundInAPI = false\n\n // --- 1. Live Form Search ---\n // Iterate through form fields to find the matching provider block\n // We assume standard block structure: providers.0.blockType, etc.\n // We search up to 20 providers to be safe (unlikely to have more)\n for (let i = 0; i < 20; i++) {\n const typeKey = `providers.${i}.blockType`\n const typeField = formProviders[typeKey]\n \n if (!typeField) {break} // Stop if no more blocks (or gap)\n \n if (typeof typeField === 'object' && 'value' in typeField && typeField.value === providerValue) {\n foundInForm = true\n // Found the provider! Now iterate its models\n // Models path: providers.0.models.0.id\n for (let j = 0; j < 50; j++) {\n const idKey = `providers.${i}.models.${j}.id`\n const nameKey = `providers.${i}.models.${j}.name`\n const useCaseKey = `providers.${i}.models.${j}.useCase`\n const enabledKey = `providers.${i}.models.${j}.enabled`\n \n const idField = formProviders[idKey]\n if (!idField) {break} // Stop if no more models\n \n const modelId = (idField).value as string\n const modelName = (formProviders[nameKey])?.value as string\n const modelUseCase = (formProviders[useCaseKey])?.value as string\n const modelEnabled = (formProviders[enabledKey])?.value\n \n // Check use case and enabled status (default to enabled if undefined)\n if (modelUseCase === inferredUseCase && modelEnabled !== false) {\n optionsList.push({\n label: modelName || modelId,\n value: modelId,\n })\n }\n }\n break // Stop searching providers\n }\n }\n\n // --- 2. API Data Search (if not found in form) ---\n if (!foundInForm) {\n const userProviderBlock = providersData.find((p: any) => p.blockType === providerValue)\n\n if (userProviderBlock && userProviderBlock.models) {\n foundInAPI = true\n userProviderBlock.models.forEach((m: any) => {\n if (m.useCase === inferredUseCase && m.enabled !== false) {\n // Avoid duplicates\n if (!optionsList.some((opt) => opt.value === m.id)) {\n optionsList.push({\n label: m.name,\n value: m.id,\n })\n }\n }\n })\n }\n }\n\n // --- 3. Static Defaults (if not found in form OR API) ---\n // Note: We only fall back to static if we didn't find ANY configuration for this provider.\n // If we found the provider but it had no models for this use case, we show empty list (correct).\n if (!foundInForm && !foundInAPI) {\n const staticBlock = allProviderBlocks.find((b) => b.slug === providerValue)\n\n if (staticBlock) {\n // Search through tabs to find models field\n const modelsField = findFieldInBlock(staticBlock, 'models')\n const defaultModels =\n modelsField && 'defaultValue' in modelsField ? (modelsField.defaultValue as any[]) : []\n\n defaultModels.forEach((m) => {\n if (m.useCase === inferredUseCase && m.enabled !== false) {\n optionsList.push({\n label: m.name,\n value: m.id,\n })\n }\n })\n }\n }\n\n return optionsList\n }, [providerValue, providersData, inferredUseCase, formProviders])\n\n return (\n <div className=\"field-type select\">\n <label className=\"field-label\" htmlFor={path}>\n Model\n </label>\n <SelectInput\n name={name}\n onChange={(option) => {\n if (option && typeof option === 'object' && 'value' in option) {\n setValue(option.value as string)\n } else {\n setValue(option)\n }\n }}\n options={options as any}\n path={path}\n value={value}\n />\n </div>\n )\n}\n\n"],"names":["SelectInput","useField","useFormFields","React","useEffect","useMemo","useState","allProviderBlocks","findFieldInBlock","block","fieldName","searchFields","fields","field","name","type","tab","tabs","found","undefined","inferUseCase","path","pathParts","split","parentName","length","includes","DynamicModelSelect","props","parentPath","slice","join","providerPath","providerField","providerValue","value","formProviders","providers","Object","keys","forEach","key","startsWith","setValue","providersData","setProvidersData","fetchSettings","response","fetch","ok","data","json","error","console","catch","inferredUseCase","options","optionsList","foundInForm","foundInAPI","i","typeKey","typeField","j","idKey","nameKey","useCaseKey","enabledKey","idField","modelId","modelName","modelUseCase","modelEnabled","push","label","userProviderBlock","find","p","blockType","models","m","useCase","enabled","some","opt","id","staticBlock","b","slug","modelsField","defaultModels","defaultValue","div","className","htmlFor","onChange","option"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/DynamicModelSelect/index.tsx"],"sourcesContent":["'use client'\n\nimport { SelectInput, useField, useFormFields } from '@payloadcms/ui'\nimport React, { useMemo } from 'react'\n\nimport { allProviderBlocks } from '../../ai/providers/blocks/index.js'\nimport { handleSelectChange } from '../shared/handleSelectChange.js'\nimport { useAISettings } from '../hooks/useAISettings.js'\n\ntype Props = {\n name: string\n path: string\n}\n\n/**\n * Find a field by name within a block's fields, searching through tabs\n */\nfunction findFieldInBlock(block: any, fieldName: string): any | undefined {\n const searchFields = (fields: any[]): any | undefined => {\n for (const field of fields) {\n if ('name' in field && field.name === fieldName) {\n return field\n }\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n const found = searchFields(tab.fields)\n if (found) {\n return found\n }\n }\n }\n if (field.type === 'group' && 'fields' in field) {\n const found = searchFields(field.fields)\n if (found) {\n return found\n }\n }\n }\n return undefined\n }\n \n return searchFields(block.fields)\n}\n\n/**\n * Infer use case from field path\n * Handles both:\n * - AISettings paths: 'defaults.text.model', 'defaults.image.model'\n * - Instructions paths: 'text-settings.model', 'image-settings.model'\n */\nfunction inferUseCase(path: string): string {\n const pathParts = path.split('.')\n const parentName = pathParts[pathParts.length - 2]\n \n // AISettings: 'defaults.text.model' -> parentName is 'text'\n // Direct use case names\n if (['image', 'text', 'tts', 'video'].includes(parentName)) {\n return parentName\n }\n \n // Instructions: 'text-settings.model' -> parentName is 'text-settings'\n if (parentName === 'image-settings') {\n return 'image'\n }\n if (parentName === 'tts-settings') {\n return 'tts'\n }\n if (parentName === 'text-settings' || parentName === 'richtext-settings') {\n return 'text'\n }\n if (parentName === 'video-settings') {\n return 'video'\n }\n \n // Default to text\n return 'text'\n}\n\nexport const DynamicModelSelect: React.FC<Props> = (props) => {\n const { name, path } = props\n\n // Getting the 'provider' sibling field value\n const parentPath = path.split('.').slice(0, -1).join('.')\n const providerPath = `${parentPath}.provider`\n\n const providerField = useFormFields(([fields]) => fields[providerPath])\n const providerValue = providerField?.value as string\n\n // Get all form fields to search for live provider configuration (for AISettings context)\n // We filter to only 'providers' fields to avoid unnecessary re-renders, \n // but note that the selector runs on every change.\n const formProviders = useFormFields(([fields]) => {\n const providers: Record<string, any> = {}\n if (fields && typeof fields === 'object') {\n Object.keys(fields).forEach((key) => {\n if (key.startsWith('providers.')) {\n providers[key] = fields[key]\n }\n })\n }\n return providers\n })\n\n const { setValue, value } = useField<string>({ path })\n\n const { data: aiSettings } = useAISettings()\n const providersData = aiSettings?.providers ?? []\n\n const inferredUseCase = useMemo(() => inferUseCase(path), [path])\n\n const options = useMemo(() => {\n if (!providerValue) {\n return []\n }\n\n const optionsList: { label: string; value: string }[] = []\n\n // Strategy:\n // 1. Try to find provider in LIVE form state (if editing AISettings)\n // 2. If not found, try to find in FETCHED API data (if editing Instructions or saved AISettings)\n // 3. Fall back to static defaults from block definitions\n\n let foundInForm = false\n let foundInAPI = false\n\n // --- 1. Live Form Search ---\n // Iterate through form fields to find the matching provider block\n // We assume standard block structure: providers.0.blockType, etc.\n // We search up to 20 providers to be safe (unlikely to have more)\n for (let i = 0; i < 20; i++) {\n const typeKey = `providers.${i}.blockType`\n const typeField = formProviders[typeKey]\n \n if (!typeField) {break} // Stop if no more blocks (or gap)\n \n if (typeof typeField === 'object' && 'value' in typeField && typeField.value === providerValue) {\n foundInForm = true\n // Found the provider! Now iterate its models\n // Models path: providers.0.models.0.id\n for (let j = 0; j < 50; j++) {\n const idKey = `providers.${i}.models.${j}.id`\n const nameKey = `providers.${i}.models.${j}.name`\n const useCaseKey = `providers.${i}.models.${j}.useCase`\n const enabledKey = `providers.${i}.models.${j}.enabled`\n \n const idField = formProviders[idKey]\n if (!idField) {break} // Stop if no more models\n \n const modelId = (idField).value as string\n const modelName = (formProviders[nameKey])?.value as string\n const modelUseCase = (formProviders[useCaseKey])?.value as string\n const modelEnabled = (formProviders[enabledKey])?.value\n \n // Check use case and enabled status (default to enabled if undefined)\n if (modelUseCase === inferredUseCase && modelEnabled !== false) {\n optionsList.push({\n label: modelName || modelId,\n value: modelId,\n })\n }\n }\n break // Stop searching providers\n }\n }\n\n // --- 2. API Data Search (if not found in form) ---\n if (!foundInForm) {\n const userProviderBlock = providersData.find((p: any) => p.blockType === providerValue)\n\n if (userProviderBlock && userProviderBlock.models) {\n foundInAPI = true\n userProviderBlock.models.forEach((m: any) => {\n if (m.useCase === inferredUseCase && m.enabled !== false) {\n // Avoid duplicates\n if (!optionsList.some((opt) => opt.value === m.id)) {\n optionsList.push({\n label: m.name,\n value: m.id,\n })\n }\n }\n })\n }\n }\n\n // --- 3. Static Defaults (if not found in form OR API) ---\n // Note: We only fall back to static if we didn't find ANY configuration for this provider.\n // If we found the provider but it had no models for this use case, we show empty list (correct).\n if (!foundInForm && !foundInAPI) {\n const staticBlock = allProviderBlocks.find((b) => b.slug === providerValue)\n\n if (staticBlock) {\n // Search through tabs to find models field\n const modelsField = findFieldInBlock(staticBlock, 'models')\n const defaultModels =\n modelsField && 'defaultValue' in modelsField ? (modelsField.defaultValue as any[]) : []\n\n defaultModels.forEach((m) => {\n if (m.useCase === inferredUseCase && m.enabled !== false) {\n optionsList.push({\n label: m.name,\n value: m.id,\n })\n }\n })\n }\n }\n\n return optionsList\n }, [providerValue, providersData, inferredUseCase, formProviders])\n\n return (\n <div className=\"field-type select\">\n <label className=\"field-label\" htmlFor={path}>\n Model\n </label>\n <SelectInput\n name={name}\n onChange={(option) => handleSelectChange(setValue, option)}\n options={options as any}\n path={path}\n value={value}\n />\n </div>\n )\n}\n\n"],"names":["SelectInput","useField","useFormFields","React","useMemo","allProviderBlocks","handleSelectChange","useAISettings","findFieldInBlock","block","fieldName","searchFields","fields","field","name","type","tab","tabs","found","undefined","inferUseCase","path","pathParts","split","parentName","length","includes","DynamicModelSelect","props","parentPath","slice","join","providerPath","providerField","providerValue","value","formProviders","providers","Object","keys","forEach","key","startsWith","setValue","data","aiSettings","providersData","inferredUseCase","options","optionsList","foundInForm","foundInAPI","i","typeKey","typeField","j","idKey","nameKey","useCaseKey","enabledKey","idField","modelId","modelName","modelUseCase","modelEnabled","push","label","userProviderBlock","find","p","blockType","models","m","useCase","enabled","some","opt","id","staticBlock","b","slug","modelsField","defaultModels","defaultValue","div","className","htmlFor","onChange","option"],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { SelectInput, useField, useFormFields } from '@payloadcms/ui';
|
|
3
|
-
import React, {
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
4
|
import { allProviderBlocks } from '../../ai/providers/blocks/index.js';
|
|
5
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
6
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
5
7
|
/**
|
|
6
8
|
* Find a field by name within a block's fields, searching through tabs
|
|
7
9
|
*/
|
|
@@ -82,26 +84,8 @@ export const DynamicModelSelect = (props) => {
|
|
|
82
84
|
return providers;
|
|
83
85
|
});
|
|
84
86
|
const { setValue, value } = useField({ path });
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
// Fetch AI Settings global to get configured providers
|
|
88
|
-
useEffect(() => {
|
|
89
|
-
const fetchSettings = async () => {
|
|
90
|
-
try {
|
|
91
|
-
const response = await fetch('/api/globals/ai-settings?depth=1');
|
|
92
|
-
if (response.ok) {
|
|
93
|
-
const data = await response.json();
|
|
94
|
-
if (data && data.providers) {
|
|
95
|
-
setProvidersData(data.providers);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
console.error('Error fetching AI settings:', error);
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
fetchSettings().catch(console.error);
|
|
104
|
-
}, []);
|
|
87
|
+
const { data: aiSettings } = useAISettings();
|
|
88
|
+
const providersData = aiSettings?.providers ?? [];
|
|
105
89
|
const inferredUseCase = useMemo(() => inferUseCase(path), [path]);
|
|
106
90
|
const options = useMemo(() => {
|
|
107
91
|
if (!providerValue) {
|
|
@@ -195,13 +179,6 @@ export const DynamicModelSelect = (props) => {
|
|
|
195
179
|
<label className="field-label" htmlFor={path}>
|
|
196
180
|
Model
|
|
197
181
|
</label>
|
|
198
|
-
<SelectInput name={name} onChange={(option) => {
|
|
199
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
200
|
-
setValue(option.value);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
setValue(option);
|
|
204
|
-
}
|
|
205
|
-
}} options={options} path={path} value={value}/>
|
|
182
|
+
<SelectInput name={name} onChange={(option) => handleSelectChange(setValue, option)} options={options} path={path} value={value}/>
|
|
206
183
|
</div>);
|
|
207
184
|
};
|
|
@@ -1,32 +1,17 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { SelectInput, useField } from '@payloadcms/ui';
|
|
4
|
-
import React, {
|
|
4
|
+
import React, { useMemo } from 'react';
|
|
5
5
|
import { allProviderBlocks } from '../../ai/providers/blocks/index.js';
|
|
6
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
7
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
6
8
|
export const DynamicProviderSelect = (props)=>{
|
|
7
9
|
const { name, path } = props;
|
|
8
10
|
const { setValue, value } = useField({
|
|
9
11
|
path
|
|
10
12
|
});
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
// Fetch AI Settings global to get configured providers
|
|
14
|
-
useEffect(()=>{
|
|
15
|
-
const fetchSettings = async ()=>{
|
|
16
|
-
try {
|
|
17
|
-
const response = await fetch('/api/globals/ai-settings?depth=1');
|
|
18
|
-
if (response.ok) {
|
|
19
|
-
const data = await response.json();
|
|
20
|
-
if (data && data.providers) {
|
|
21
|
-
setProvidersData(data.providers);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
} catch (error) {
|
|
25
|
-
console.error('Error fetching AI settings:', error);
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
void fetchSettings();
|
|
29
|
-
}, []);
|
|
13
|
+
const { data: aiSettings } = useAISettings();
|
|
14
|
+
const providersData = aiSettings?.providers ?? [];
|
|
30
15
|
const options = useMemo(()=>{
|
|
31
16
|
const optionsList = [];
|
|
32
17
|
const processedProviders = new Set();
|
|
@@ -83,13 +68,7 @@ export const DynamicProviderSelect = (props)=>{
|
|
|
83
68
|
}),
|
|
84
69
|
/*#__PURE__*/ _jsx(SelectInput, {
|
|
85
70
|
name: name,
|
|
86
|
-
onChange: (option)=>
|
|
87
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
88
|
-
setValue(option.value);
|
|
89
|
-
} else {
|
|
90
|
-
setValue(option);
|
|
91
|
-
}
|
|
92
|
-
},
|
|
71
|
+
onChange: (option)=>handleSelectChange(setValue, option),
|
|
93
72
|
options: options,
|
|
94
73
|
path: path,
|
|
95
74
|
value: value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/DynamicProviderSelect/index.tsx"],"sourcesContent":["'use client'\n\nimport { SelectInput, useField } from '@payloadcms/ui'\nimport React, {
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/DynamicProviderSelect/index.tsx"],"sourcesContent":["'use client'\n\nimport { SelectInput, useField } from '@payloadcms/ui'\nimport React, { useMemo } from 'react'\n\nimport { allProviderBlocks } from '../../ai/providers/blocks/index.js'\nimport { handleSelectChange } from '../shared/handleSelectChange.js'\nimport { useAISettings } from '../hooks/useAISettings.js'\n\ntype Props = {\n name: string\n path: string\n}\n\nexport const DynamicProviderSelect: React.FC<Props> = (props) => {\n const { name, path } = props\n\n const { setValue, value } = useField<string>({ path })\n\n const { data: aiSettings } = useAISettings()\n const providersData = aiSettings?.providers ?? []\n\n const options = useMemo(() => {\n const optionsList: { label: string; value: string }[] = []\n const processedProviders = new Set<string>()\n\n // Iterate through fetched providers to find custom names\n providersData.forEach((provider: any) => {\n if (!provider.enabled) {\n return\n }\n\n const blockType = provider.blockType\n const customName = provider.providerName\n\n // Get static label as fallback\n const staticBlock = allProviderBlocks.find((b) => b.slug === blockType)\n const staticLabel = staticBlock?.labels?.singular\n ? typeof staticBlock.labels.singular === 'string'\n ? staticBlock.labels.singular\n : blockType\n : blockType\n\n const label = customName || staticLabel\n\n if (!processedProviders.has(blockType)) {\n optionsList.push({\n label,\n value: blockType,\n })\n processedProviders.add(blockType)\n } else if (customName) {\n // Update existing label if custom name is available\n const existingOpt = optionsList.find((o) => o.value === blockType)\n if (existingOpt && existingOpt.label === staticLabel) {\n existingOpt.label = customName\n }\n }\n })\n\n // Add any other available providers from blocks that might not be configured yet?\n // Usually we only want to show configured providers in the selection list.\n // But for standard providers (OpenAI, Google), they might not need much config other than API key.\n // If they are not in the list, user can't select them.\n // However, if they are not enabled in settings, maybe we shouldn't show them?\n // Let's stick to showing all available blocks, but prioritizing configured ones with custom names.\n\n allProviderBlocks.forEach((block) => {\n if (!processedProviders.has(block.slug)) {\n optionsList.push({\n label: typeof block.labels?.singular === 'string' ? block.labels.singular : block.slug,\n value: block.slug,\n })\n }\n })\n\n return optionsList\n }, [providersData])\n\n return (\n <div className=\"field-type select\">\n <label className=\"field-label\" htmlFor={path}>\n Provider\n </label>\n <SelectInput\n name={name}\n onChange={(option) => handleSelectChange(setValue, option)}\n options={options as any}\n path={path}\n value={value}\n />\n </div>\n )\n}\n"],"names":["SelectInput","useField","React","useMemo","allProviderBlocks","handleSelectChange","useAISettings","DynamicProviderSelect","props","name","path","setValue","value","data","aiSettings","providersData","providers","options","optionsList","processedProviders","Set","forEach","provider","enabled","blockType","customName","providerName","staticBlock","find","b","slug","staticLabel","labels","singular","label","has","push","add","existingOpt","o","block","div","className","htmlFor","onChange","option"],"mappings":"AAAA;;AAEA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,iBAAgB;AACtD,OAAOC,SAASC,OAAO,QAAQ,QAAO;AAEtC,SAASC,iBAAiB,QAAQ,qCAAoC;AACtE,SAASC,kBAAkB,QAAQ,kCAAiC;AACpE,SAASC,aAAa,QAAQ,4BAA2B;AAOzD,OAAO,MAAMC,wBAAyC,CAACC;IACrD,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGF;IAEvB,MAAM,EAAEG,QAAQ,EAAEC,KAAK,EAAE,GAAGX,SAAiB;QAAES;IAAK;IAEpD,MAAM,EAAEG,MAAMC,UAAU,EAAE,GAAGR;IAC7B,MAAMS,gBAAgBD,YAAYE,aAAa,EAAE;IAEjD,MAAMC,UAAUd,QAAQ;QACtB,MAAMe,cAAkD,EAAE;QAC1D,MAAMC,qBAAqB,IAAIC;QAE/B,yDAAyD;QACzDL,cAAcM,OAAO,CAAC,CAACC;YACrB,IAAI,CAACA,SAASC,OAAO,EAAE;gBACrB;YACF;YAEA,MAAMC,YAAYF,SAASE,SAAS;YACpC,MAAMC,aAAaH,SAASI,YAAY;YAExC,+BAA+B;YAC/B,MAAMC,cAAcvB,kBAAkBwB,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKN;YAC7D,MAAMO,cAAcJ,aAAaK,QAAQC,WACrC,OAAON,YAAYK,MAAM,CAACC,QAAQ,KAAK,WACrCN,YAAYK,MAAM,CAACC,QAAQ,GAC3BT,YACFA;YAEJ,MAAMU,QAAQT,cAAcM;YAE5B,IAAI,CAACZ,mBAAmBgB,GAAG,CAACX,YAAY;gBACtCN,YAAYkB,IAAI,CAAC;oBACfF;oBACAtB,OAAOY;gBACT;gBACAL,mBAAmBkB,GAAG,CAACb;YACzB,OAAO,IAAIC,YAAY;gBACrB,oDAAoD;gBACpD,MAAMa,cAAcpB,YAAYU,IAAI,CAAC,CAACW,IAAMA,EAAE3B,KAAK,KAAKY;gBACxD,IAAIc,eAAeA,YAAYJ,KAAK,KAAKH,aAAa;oBACpDO,YAAYJ,KAAK,GAAGT;gBACtB;YACF;QACF;QAEA,kFAAkF;QAClF,2EAA2E;QAC3E,mGAAmG;QACnG,uDAAuD;QACvD,8EAA8E;QAC9E,mGAAmG;QAEnGrB,kBAAkBiB,OAAO,CAAC,CAACmB;YACzB,IAAI,CAACrB,mBAAmBgB,GAAG,CAACK,MAAMV,IAAI,GAAG;gBACvCZ,YAAYkB,IAAI,CAAC;oBACfF,OAAO,OAAOM,MAAMR,MAAM,EAAEC,aAAa,WAAWO,MAAMR,MAAM,CAACC,QAAQ,GAAGO,MAAMV,IAAI;oBACtFlB,OAAO4B,MAAMV,IAAI;gBACnB;YACF;QACF;QAEA,OAAOZ;IACT,GAAG;QAACH;KAAc;IAElB,qBACE,MAAC0B;QAAIC,WAAU;;0BACb,KAACR;gBAAMQ,WAAU;gBAAcC,SAASjC;0BAAM;;0BAG9C,KAACV;gBACCS,MAAMA;gBACNmC,UAAU,CAACC,SAAWxC,mBAAmBM,UAAUkC;gBACnD5B,SAASA;gBACTP,MAAMA;gBACNE,OAAOA;;;;AAIf,EAAC"}
|
|
@@ -1,30 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { SelectInput, useField } from '@payloadcms/ui';
|
|
3
|
-
import React, {
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
4
|
import { allProviderBlocks } from '../../ai/providers/blocks/index.js';
|
|
5
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
6
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
5
7
|
export const DynamicProviderSelect = (props) => {
|
|
6
8
|
const { name, path } = props;
|
|
7
9
|
const { setValue, value } = useField({ path });
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
// Fetch AI Settings global to get configured providers
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
const fetchSettings = async () => {
|
|
13
|
-
try {
|
|
14
|
-
const response = await fetch('/api/globals/ai-settings?depth=1');
|
|
15
|
-
if (response.ok) {
|
|
16
|
-
const data = await response.json();
|
|
17
|
-
if (data && data.providers) {
|
|
18
|
-
setProvidersData(data.providers);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
console.error('Error fetching AI settings:', error);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
void fetchSettings();
|
|
27
|
-
}, []);
|
|
10
|
+
const { data: aiSettings } = useAISettings();
|
|
11
|
+
const providersData = aiSettings?.providers ?? [];
|
|
28
12
|
const options = useMemo(() => {
|
|
29
13
|
const optionsList = [];
|
|
30
14
|
const processedProviders = new Set();
|
|
@@ -78,13 +62,6 @@ export const DynamicProviderSelect = (props) => {
|
|
|
78
62
|
<label className="field-label" htmlFor={path}>
|
|
79
63
|
Provider
|
|
80
64
|
</label>
|
|
81
|
-
<SelectInput name={name} onChange={(option) => {
|
|
82
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
83
|
-
setValue(option.value);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
setValue(option);
|
|
87
|
-
}
|
|
88
|
-
}} options={options} path={path} value={value}/>
|
|
65
|
+
<SelectInput name={name} onChange={(option) => handleSelectChange(setValue, option)} options={options} path={path} value={value}/>
|
|
89
66
|
</div>);
|
|
90
67
|
};
|