| @@ -89,7 +89,9 @@ jobs: | |||
| - name: Web style check | |||
| if: steps.changed-files.outputs.any_changed == 'true' | |||
| working-directory: ./web | |||
| run: pnpm run lint | |||
| run: | | |||
| pnpm run lint | |||
| pnpm run eslint | |||
| docker-compose-template: | |||
| name: Docker Compose Template | |||
| @@ -621,7 +621,7 @@ export default translation | |||
| && !trimmed.startsWith('//')) | |||
| break | |||
| } | |||
| else { | |||
| else { | |||
| break | |||
| } | |||
| @@ -60,7 +60,7 @@ describe('Description Validation Logic', () => { | |||
| try { | |||
| validateDescriptionLength(invalidDescription) | |||
| } | |||
| catch (error) { | |||
| catch (error) { | |||
| expect((error as Error).message).toBe(expectedErrorMessage) | |||
| } | |||
| }) | |||
| @@ -86,7 +86,7 @@ describe('Description Validation Logic', () => { | |||
| expect(() => validateDescriptionLength(testDescription)).not.toThrow() | |||
| expect(validateDescriptionLength(testDescription)).toBe(testDescription) | |||
| } | |||
| else { | |||
| else { | |||
| expect(() => validateDescriptionLength(testDescription)).toThrow( | |||
| 'Description cannot exceed 400 characters.', | |||
| ) | |||
| @@ -39,7 +39,7 @@ describe('Document List Sorting', () => { | |||
| const result = aValue.localeCompare(bValue) | |||
| return order === 'asc' ? result : -result | |||
| } | |||
| else { | |||
| else { | |||
| const result = aValue - bValue | |||
| return order === 'asc' ? result : -result | |||
| } | |||
| @@ -196,7 +196,7 @@ describe('Plugin Tool Workflow Integration', () => { | |||
| const _pluginId = (tool.uniqueIdentifier as any).split(':')[0] | |||
| }).toThrow() | |||
| } | |||
| else { | |||
| else { | |||
| // Valid tools should work fine | |||
| expect(() => { | |||
| const _pluginId = tool.uniqueIdentifier.split(':')[0] | |||
| @@ -252,7 +252,7 @@ describe('Real Browser Environment Dark Mode Flicker Test', () => { | |||
| if (hasStyleChange) | |||
| console.log('⚠️ Style changes detected - this causes visible flicker') | |||
| else | |||
| else | |||
| console.log('✅ No style changes detected') | |||
| expect(timingData.length).toBeGreaterThan(1) | |||
| @@ -15,7 +15,7 @@ const originalEnv = process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT | |||
| function setupEnvironment(value?: string) { | |||
| if (value) | |||
| process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT = value | |||
| else | |||
| else | |||
| delete process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT | |||
| // Clear module cache to force re-evaluation | |||
| @@ -25,7 +25,7 @@ function setupEnvironment(value?: string) { | |||
| function restoreEnvironment() { | |||
| if (originalEnv) | |||
| process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT = originalEnv | |||
| else | |||
| else | |||
| delete process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT | |||
| jest.resetModules() | |||
| @@ -47,7 +47,7 @@ describe('SVG Attribute Error Reproduction', () => { | |||
| console.log(` ${index + 1}. ${error.substring(0, 100)}...`) | |||
| }) | |||
| } | |||
| else { | |||
| else { | |||
| console.log('No inkscape errors found in this render') | |||
| } | |||
| @@ -150,7 +150,7 @@ describe('SVG Attribute Error Reproduction', () => { | |||
| if (problematicKeys.length > 0) | |||
| console.log(`🚨 PROBLEM: Still found problematic attributes: ${problematicKeys.join(', ')}`) | |||
| else | |||
| else | |||
| console.log('✅ No problematic attributes found after normalization') | |||
| }) | |||
| }) | |||
| @@ -106,7 +106,7 @@ const AvatarWithEdit = ({ onSave, ...props }: AvatarWithEditProps) => { | |||
| onClick={() => { | |||
| if (hoverArea === 'right' && !onAvatarError) | |||
| setIsShowDeleteConfirm(true) | |||
| else | |||
| else | |||
| setIsShowAvatarPicker(true) | |||
| }} | |||
| onMouseMove={(e) => { | |||
| @@ -45,8 +45,8 @@ const ICON_MAP = { | |||
| </div>, | |||
| dataset: <AppIcon innerIcon={DatasetSvg} className='!border-[0.5px] !border-indigo-100 !bg-indigo-25' />, | |||
| webapp: <div className='rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-brand-blue-brand-500 p-1 shadow-md'> | |||
| <WindowCursor className='h-4 w-4 text-text-primary-on-surface' /> | |||
| </div>, | |||
| <WindowCursor className='h-4 w-4 text-text-primary-on-surface' /> | |||
| </div>, | |||
| notion: <AppIcon innerIcon={NotionSvg} className='!border-[0.5px] !border-indigo-100 !bg-white' />, | |||
| } | |||
| @@ -62,12 +62,12 @@ const AppDetailNav = ({ title, desc, isExternal, icon, icon_background, navigati | |||
| }, [appSidebarExpand, setAppSiderbarExpand]) | |||
| if (inWorkflowCanvas && hideHeader) { | |||
| return ( | |||
| return ( | |||
| <div className='flex w-0 shrink-0'> | |||
| <AppSidebarDropdown navigation={navigation} /> | |||
| </div> | |||
| ) | |||
| } | |||
| } | |||
| return ( | |||
| <div | |||
| @@ -121,7 +121,7 @@ describe('Sidebar Animation Issues Reproduction', () => { | |||
| })) | |||
| }) | |||
| describe('Issue #1: Toggle Button Position Movement - FIXED', () => { | |||
| describe('Issue #1: Toggle Button Position Movement - FIXED', () => { | |||
| it('should verify consistent padding prevents button position shift', () => { | |||
| let expanded = false | |||
| const handleToggle = () => { | |||
| @@ -84,7 +84,7 @@ const Annotation: FC<Props> = (props) => { | |||
| setList(data as AnnotationItem[]) | |||
| setTotal(total) | |||
| } | |||
| finally { | |||
| finally { | |||
| setIsLoading(false) | |||
| } | |||
| } | |||
| @@ -52,13 +52,13 @@ const TypeSelector: FC<Props> = ({ | |||
| > | |||
| <div className='flex items-center'> | |||
| <InputVarTypeIcon type={selectedItem?.value as InputVarType} className='size-4 shrink-0 text-text-secondary' /> | |||
| <span | |||
| className={` | |||
| <span | |||
| className={` | |||
| ml-1.5 ${!selectedItem?.name && 'text-components-input-text-placeholder'} | |||
| `} | |||
| > | |||
| {selectedItem?.name} | |||
| </span> | |||
| > | |||
| {selectedItem?.name} | |||
| </span> | |||
| </div> | |||
| <div className='flex items-center space-x-1'> | |||
| <Badge uppercase={false}>{inputVarTypeToVarType(selectedItem?.value as InputVarType)}</Badge> | |||
| @@ -175,7 +175,6 @@ const ConfigContent: FC<Props> = ({ | |||
| ...datasetConfigs, | |||
| reranking_enable: enable, | |||
| }) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [currentRerankModel, datasetConfigs, onChange]) | |||
| return ( | |||
| @@ -57,10 +57,10 @@ const ChatUserInput = ({ | |||
| > | |||
| <div> | |||
| {type !== 'checkbox' && ( | |||
| <div className='system-sm-semibold mb-1 flex h-6 items-center gap-1 text-text-secondary'> | |||
| <div className='truncate'>{name || key}</div> | |||
| {!required && <span className='system-xs-regular text-text-tertiary'>{t('workflow.panel.optional')}</span>} | |||
| </div> | |||
| <div className='system-sm-semibold mb-1 flex h-6 items-center gap-1 text-text-secondary'> | |||
| <div className='truncate'>{name || key}</div> | |||
| {!required && <span className='system-xs-regular text-text-tertiary'>{t('workflow.panel.optional')}</span>} | |||
| </div> | |||
| )} | |||
| <div className='grow'> | |||
| {type === 'string' && ( | |||
| @@ -112,72 +112,72 @@ const getFormattedChatList = (messages: ChatMessage[], conversationId: string, t | |||
| const newChatList: IChatItem[] = [] | |||
| try { | |||
| messages.forEach((item: ChatMessage) => { | |||
| const questionFiles = item.message_files?.filter((file: any) => file.belongs_to === 'user') || [] | |||
| newChatList.push({ | |||
| id: `question-${item.id}`, | |||
| content: item.inputs.query || item.inputs.default_input || item.query, // text generation: item.inputs.query; chat: item.query | |||
| isAnswer: false, | |||
| message_files: getProcessedFilesFromResponse(questionFiles.map((item: any) => ({ ...item, related_id: item.id }))), | |||
| parentMessageId: item.parent_message_id || undefined, | |||
| }) | |||
| const questionFiles = item.message_files?.filter((file: any) => file.belongs_to === 'user') || [] | |||
| newChatList.push({ | |||
| id: `question-${item.id}`, | |||
| content: item.inputs.query || item.inputs.default_input || item.query, // text generation: item.inputs.query; chat: item.query | |||
| isAnswer: false, | |||
| message_files: getProcessedFilesFromResponse(questionFiles.map((item: any) => ({ ...item, related_id: item.id }))), | |||
| parentMessageId: item.parent_message_id || undefined, | |||
| }) | |||
| const answerFiles = item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || [] | |||
| newChatList.push({ | |||
| id: item.id, | |||
| content: item.answer, | |||
| agent_thoughts: addFileInfos(item.agent_thoughts ? sortAgentSorts(item.agent_thoughts) : item.agent_thoughts, item.message_files), | |||
| feedback: item.feedbacks.find(item => item.from_source === 'user'), // user feedback | |||
| adminFeedback: item.feedbacks.find(item => item.from_source === 'admin'), // admin feedback | |||
| feedbackDisabled: false, | |||
| isAnswer: true, | |||
| message_files: getProcessedFilesFromResponse(answerFiles.map((item: any) => ({ ...item, related_id: item.id }))), | |||
| log: [ | |||
| ...item.message, | |||
| ...(item.message[item.message.length - 1]?.role !== 'assistant' | |||
| ? [ | |||
| { | |||
| role: 'assistant', | |||
| text: item.answer, | |||
| files: item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || [], | |||
| }, | |||
| ] | |||
| : []), | |||
| ] as IChatItem['log'], | |||
| workflow_run_id: item.workflow_run_id, | |||
| conversationId, | |||
| input: { | |||
| inputs: item.inputs, | |||
| query: item.query, | |||
| }, | |||
| more: { | |||
| time: dayjs.unix(item.created_at).tz(timezone).format(format), | |||
| tokens: item.answer_tokens + item.message_tokens, | |||
| latency: item.provider_response_latency.toFixed(2), | |||
| }, | |||
| citation: item.metadata?.retriever_resources, | |||
| annotation: (() => { | |||
| if (item.annotation_hit_history) { | |||
| return { | |||
| id: item.annotation_hit_history.annotation_id, | |||
| authorName: item.annotation_hit_history.annotation_create_account?.name || 'N/A', | |||
| created_at: item.annotation_hit_history.created_at, | |||
| const answerFiles = item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || [] | |||
| newChatList.push({ | |||
| id: item.id, | |||
| content: item.answer, | |||
| agent_thoughts: addFileInfos(item.agent_thoughts ? sortAgentSorts(item.agent_thoughts) : item.agent_thoughts, item.message_files), | |||
| feedback: item.feedbacks.find(item => item.from_source === 'user'), // user feedback | |||
| adminFeedback: item.feedbacks.find(item => item.from_source === 'admin'), // admin feedback | |||
| feedbackDisabled: false, | |||
| isAnswer: true, | |||
| message_files: getProcessedFilesFromResponse(answerFiles.map((item: any) => ({ ...item, related_id: item.id }))), | |||
| log: [ | |||
| ...item.message, | |||
| ...(item.message[item.message.length - 1]?.role !== 'assistant' | |||
| ? [ | |||
| { | |||
| role: 'assistant', | |||
| text: item.answer, | |||
| files: item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || [], | |||
| }, | |||
| ] | |||
| : []), | |||
| ] as IChatItem['log'], | |||
| workflow_run_id: item.workflow_run_id, | |||
| conversationId, | |||
| input: { | |||
| inputs: item.inputs, | |||
| query: item.query, | |||
| }, | |||
| more: { | |||
| time: dayjs.unix(item.created_at).tz(timezone).format(format), | |||
| tokens: item.answer_tokens + item.message_tokens, | |||
| latency: item.provider_response_latency.toFixed(2), | |||
| }, | |||
| citation: item.metadata?.retriever_resources, | |||
| annotation: (() => { | |||
| if (item.annotation_hit_history) { | |||
| return { | |||
| id: item.annotation_hit_history.annotation_id, | |||
| authorName: item.annotation_hit_history.annotation_create_account?.name || 'N/A', | |||
| created_at: item.annotation_hit_history.created_at, | |||
| } | |||
| } | |||
| } | |||
| if (item.annotation) { | |||
| return { | |||
| id: item.annotation.id, | |||
| authorName: item.annotation.account.name, | |||
| logAnnotation: item.annotation, | |||
| created_at: 0, | |||
| if (item.annotation) { | |||
| return { | |||
| id: item.annotation.id, | |||
| authorName: item.annotation.account.name, | |||
| logAnnotation: item.annotation, | |||
| created_at: 0, | |||
| } | |||
| } | |||
| } | |||
| return undefined | |||
| })(), | |||
| parentMessageId: `question-${item.id}`, | |||
| return undefined | |||
| })(), | |||
| parentMessageId: `question-${item.id}`, | |||
| }) | |||
| }) | |||
| }) | |||
| return newChatList | |||
| } | |||
| @@ -503,7 +503,7 @@ function DetailPanel({ detail, onFeedback }: IDetailPanel) { | |||
| setThreadChatItems(getThreadMessages(tree, newAllChatItems.at(-1)?.id)) | |||
| } | |||
| catch (error) { | |||
| catch (error) { | |||
| console.error(error) | |||
| setHasMore(false) | |||
| } | |||
| @@ -522,7 +522,7 @@ function DetailPanel({ detail, onFeedback }: IDetailPanel) { | |||
| if (outerDiv && outerDiv.scrollHeight > outerDiv.clientHeight) { | |||
| scrollContainer = outerDiv | |||
| } | |||
| else if (scrollableDiv && scrollableDiv.scrollHeight > scrollableDiv.clientHeight) { | |||
| else if (scrollableDiv && scrollableDiv.scrollHeight > scrollableDiv.clientHeight) { | |||
| scrollContainer = scrollableDiv | |||
| } | |||
| else if (chatContainer && chatContainer.scrollHeight > chatContainer.clientHeight) { | |||
| @@ -167,7 +167,7 @@ function AppCard({ | |||
| setAppDetail(res) | |||
| setShowAccessControl(false) | |||
| } | |||
| catch (error) { | |||
| catch (error) { | |||
| console.error('Failed to fetch app detail:', error) | |||
| } | |||
| }, [appDetail, setAppDetail]) | |||
| @@ -40,12 +40,12 @@ const OPTION_MAP = { | |||
| `<script> | |||
| window.difyChatbotConfig = { | |||
| token: '${token}'${isTestEnv | |||
| ? `, | |||
| ? `, | |||
| isDev: true` | |||
| : ''}${IS_CE_EDITION | |||
| ? `, | |||
| : ''}${IS_CE_EDITION | |||
| ? `, | |||
| baseUrl: '${url}${basePath}'` | |||
| : ''}, | |||
| : ''}, | |||
| inputs: { | |||
| // You can define the inputs from the Start node here | |||
| // key is the variable name | |||
| @@ -240,7 +240,7 @@ const SettingsModal: FC<ISettingsModalProps> = ({ | |||
| <Link href={docLink('/guides/application-publishing/launch-your-webapp-quickly/README', { | |||
| 'zh-Hans': '/guides/application-publishing/launch-your-webapp-quickly/readme', | |||
| })} | |||
| target='_blank' rel='noopener noreferrer' className='text-text-accent'>{t('common.operation.learnMore')}</Link> | |||
| target='_blank' rel='noopener noreferrer' className='text-text-accent'>{t('common.operation.learnMore')}</Link> | |||
| </div> | |||
| </div> | |||
| {/* form body */} | |||
| @@ -68,7 +68,7 @@ const getKey = ( | |||
| const List = () => { | |||
| const { t } = useTranslation() | |||
| const { systemFeatures } = useGlobalPublicStore() | |||
| const { systemFeatures } = useGlobalPublicStore() | |||
| const router = useRouter() | |||
| const { isCurrentWorkspaceEditor, isCurrentWorkspaceDatasetOperator } = useAppContext() | |||
| const showTagManagementModal = useTagStore(s => s.showTagManagementModal) | |||
| @@ -46,12 +46,12 @@ const InputsFormContent = ({ showTip }: Props) => { | |||
| {visibleInputsForms.map(form => ( | |||
| <div key={form.variable} className='space-y-1'> | |||
| {form.type !== InputVarType.checkbox && ( | |||
| <div className='flex h-6 items-center gap-1'> | |||
| <div className='system-md-semibold text-text-secondary'>{form.label}</div> | |||
| {!form.required && ( | |||
| <div className='system-xs-regular text-text-tertiary'>{t('appDebug.variableTable.optional')}</div> | |||
| )} | |||
| </div> | |||
| <div className='flex h-6 items-center gap-1'> | |||
| <div className='system-md-semibold text-text-secondary'>{form.label}</div> | |||
| {!form.required && ( | |||
| <div className='system-xs-regular text-text-tertiary'>{t('appDebug.variableTable.optional')}</div> | |||
| )} | |||
| </div> | |||
| )} | |||
| {form.type === InputVarType.textInput && ( | |||
| <Input | |||
| @@ -12,12 +12,12 @@ type CheckboxProps = { | |||
| } | |||
| const Checkbox = ({ | |||
| id, | |||
| checked, | |||
| onCheck, | |||
| className, | |||
| disabled, | |||
| indeterminate, | |||
| id, | |||
| checked, | |||
| onCheck, | |||
| className, | |||
| disabled, | |||
| indeterminate, | |||
| }: CheckboxProps) => { | |||
| const checkClassName = (checked || indeterminate) | |||
| ? 'bg-components-checkbox-bg text-components-checkbox-icon hover:bg-components-checkbox-bg-hover' | |||
| @@ -131,7 +131,7 @@ export const formatDateForOutput = (date: Dayjs, includeTime: boolean = false, l | |||
| // Output format with time | |||
| return date.format('YYYY-MM-DDTHH:mm:ss.SSSZ') | |||
| } | |||
| else { | |||
| else { | |||
| // Date-only output format without timezone | |||
| return date.format('YYYY-MM-DD') | |||
| } | |||
| @@ -24,7 +24,7 @@ const DemoForm = () => { | |||
| }, | |||
| }) | |||
| const name = useStore(form.store, state => state.values.name) | |||
| const name = useStore(form.store, state => state.values.name) | |||
| return ( | |||
| <form | |||
| @@ -70,10 +70,10 @@ export type GetValuesOptions = { | |||
| needCheckValidatedValues?: boolean | |||
| } | |||
| export type FormRefObject = { | |||
| getForm: () => AnyFormApi | |||
| getFormValues: (obj: GetValuesOptions) => { | |||
| values: Record<string, any> | |||
| isCheckValidated: boolean | |||
| } | |||
| getForm: () => AnyFormApi | |||
| getFormValues: (obj: GetValuesOptions) => { | |||
| values: Record<string, any> | |||
| isCheckValidated: boolean | |||
| } | |||
| } | |||
| export type FormRef = ForwardedRef<FormRefObject> | |||
| @@ -529,9 +529,9 @@ const Flowchart = React.forwardRef((props: { | |||
| {isLoading && !svgString && ( | |||
| <div className='px-[26px] py-4'> | |||
| <LoadingAnim type='text'/> | |||
| <div className="mt-2 text-sm text-gray-500"> | |||
| {t('common.wait_for_completion', 'Waiting for diagram code to complete...')} | |||
| </div> | |||
| <div className="mt-2 text-sm text-gray-500"> | |||
| {t('common.wait_for_completion', 'Waiting for diagram code to complete...')} | |||
| </div> | |||
| </div> | |||
| )} | |||
| @@ -20,9 +20,9 @@ const CurrentBlockComponent: FC<CurrentBlockComponentProps> = ({ | |||
| const Icon = generatorType === GeneratorType.prompt ? MagicEdit : CodeAssistant | |||
| useEffect(() => { | |||
| if (!editor.hasNodes([CurrentBlockNode])) | |||
| throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor') | |||
| }, [editor]) | |||
| if (!editor.hasNodes([CurrentBlockNode])) | |||
| throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor') | |||
| }, [editor]) | |||
| return ( | |||
| <div | |||
| @@ -16,9 +16,9 @@ const ErrorMessageBlockComponent: FC<Props> = ({ | |||
| const [ref, isSelected] = useSelectOrDelete(nodeKey, DELETE_ERROR_MESSAGE_COMMAND) | |||
| useEffect(() => { | |||
| if (!editor.hasNodes([ErrorMessageBlockNode])) | |||
| throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor') | |||
| }, [editor]) | |||
| if (!editor.hasNodes([ErrorMessageBlockNode])) | |||
| throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor') | |||
| }, [editor]) | |||
| return ( | |||
| <div | |||
| @@ -16,9 +16,9 @@ const LastRunBlockComponent: FC<Props> = ({ | |||
| const [ref, isSelected] = useSelectOrDelete(nodeKey, DELETE_LAST_RUN_COMMAND) | |||
| useEffect(() => { | |||
| if (!editor.hasNodes([LastRunBlockNode])) | |||
| throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor') | |||
| }, [editor]) | |||
| if (!editor.hasNodes([LastRunBlockNode])) | |||
| throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor') | |||
| }, [editor]) | |||
| return ( | |||
| <div | |||
| @@ -219,36 +219,36 @@ const SimpleSelect: FC<ISelectProps> = ({ | |||
| {renderTrigger && <ListboxButton className='w-full'>{renderTrigger(selectedItem)}</ListboxButton>} | |||
| {!renderTrigger && ( | |||
| <ListboxButton onClick={() => { | |||
| onOpenChange?.(open) | |||
| onOpenChange?.(open) | |||
| }} className={classNames(`flex h-full w-full items-center rounded-lg border-0 bg-components-input-bg-normal pl-3 pr-10 focus-visible:bg-state-base-hover-alt focus-visible:outline-none group-hover/simple-select:bg-state-base-hover-alt sm:text-sm sm:leading-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`, className)}> | |||
| <span className={classNames('system-sm-regular block truncate text-left text-components-input-text-filled', !selectedItem?.name && 'text-components-input-text-placeholder')}>{selectedItem?.name ?? localPlaceholder}</span> | |||
| <span className="absolute inset-y-0 right-0 flex items-center pr-2"> | |||
| {isLoading ? <RiLoader4Line className='h-3.5 w-3.5 animate-spin text-text-secondary' /> | |||
| : (selectedItem && !notClearable) | |||
| ? ( | |||
| <XMarkIcon | |||
| onClick={(e) => { | |||
| e.stopPropagation() | |||
| setSelectedItem(null) | |||
| onSelect({ name: '', value: '' }) | |||
| }} | |||
| className="h-4 w-4 cursor-pointer text-text-quaternary" | |||
| aria-hidden="false" | |||
| /> | |||
| ) | |||
| : ( | |||
| open ? ( | |||
| <ChevronUpIcon | |||
| className="h-4 w-4 text-text-quaternary group-hover/simple-select:text-text-secondary" | |||
| aria-hidden="true" | |||
| /> | |||
| ) : ( | |||
| <ChevronDownIcon | |||
| className="h-4 w-4 text-text-quaternary group-hover/simple-select:text-text-secondary" | |||
| aria-hidden="true" | |||
| : (selectedItem && !notClearable) | |||
| ? ( | |||
| <XMarkIcon | |||
| onClick={(e) => { | |||
| e.stopPropagation() | |||
| setSelectedItem(null) | |||
| onSelect({ name: '', value: '' }) | |||
| }} | |||
| className="h-4 w-4 cursor-pointer text-text-quaternary" | |||
| aria-hidden="false" | |||
| /> | |||
| ) | |||
| )} | |||
| : ( | |||
| open ? ( | |||
| <ChevronUpIcon | |||
| className="h-4 w-4 text-text-quaternary group-hover/simple-select:text-text-secondary" | |||
| aria-hidden="true" | |||
| /> | |||
| ) : ( | |||
| <ChevronDownIcon | |||
| className="h-4 w-4 text-text-quaternary group-hover/simple-select:text-text-secondary" | |||
| aria-hidden="true" | |||
| /> | |||
| ) | |||
| )} | |||
| </span> | |||
| </ListboxButton> | |||
| )} | |||
| @@ -226,7 +226,7 @@ const TagSelector: FC<TagSelectorProps> = ({ | |||
| const res = await fetchTagList(type) | |||
| setTagList(res) | |||
| } | |||
| catch (error) { | |||
| catch (error) { | |||
| setTagList([]) | |||
| } | |||
| } | |||
| @@ -60,7 +60,7 @@ const Toast = ({ | |||
| || (type === 'warning' && 'bg-toast-warning-bg') | |||
| || (type === 'error' && 'bg-toast-error-bg') | |||
| || (type === 'info' && 'bg-toast-info-bg') | |||
| }`} | |||
| }`} | |||
| /> | |||
| <div className={`flex ${size === 'md' ? 'gap-1' : 'gap-0.5'}`}> | |||
| <div className={`flex items-center justify-center ${size === 'md' ? 'p-0.5' : 'p-1'}`}> | |||
| @@ -61,7 +61,6 @@ const RetrievalParamConfig: FC<Props> = ({ | |||
| ...value, | |||
| reranking_enable: enable, | |||
| }) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [currentModel, onChange, value]) | |||
| const rerankModel = useMemo(() => { | |||
| @@ -29,7 +29,6 @@ const OptionsWrap: FC<Props> = ({ | |||
| useEffect(() => { | |||
| if (controlFoldOptions) | |||
| foldHide() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [controlFoldOptions]) | |||
| return ( | |||
| <div className={cn(className, !fold ? 'mb-0' : 'mb-3')}> | |||
| @@ -64,7 +64,6 @@ const Website: FC<Props> = ({ | |||
| checkSetApiKey().then(() => { | |||
| setIsLoaded(true) | |||
| }) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| const handleOnConfig = useCallback(() => { | |||
| setShowAccountSettingModal({ | |||
| @@ -97,7 +96,7 @@ const Website: FC<Props> = ({ | |||
| <span className={cn(s.jinaLogo, 'mr-2')}/> | |||
| <span>Jina Reader</span> | |||
| </button>} | |||
| {ENABLE_WEBSITE_FIRECRAWL && <button | |||
| {ENABLE_WEBSITE_FIRECRAWL && <button | |||
| className={cn('rounded-lg px-4 py-2', | |||
| selectedProvider === DataSourceProvider.fireCrawl | |||
| ? 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary' | |||
| @@ -29,7 +29,6 @@ const OptionsWrap: FC<Props> = ({ | |||
| useEffect(() => { | |||
| if (controlFoldOptions) | |||
| foldHide() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [controlFoldOptions]) | |||
| return ( | |||
| <div className={cn(className, !fold ? 'mb-0' : 'mb-3')}> | |||
| @@ -161,7 +161,7 @@ const CSVUploader: FC<Props> = ({ | |||
| const fileChangeHandle = (e: React.ChangeEvent<HTMLInputElement>) => { | |||
| const currentFile = e.target.files?.[0] | |||
| if (!isValid(currentFile)) | |||
| return | |||
| return | |||
| initialUpload(currentFile) | |||
| } | |||
| @@ -24,9 +24,9 @@ const InfoPanel = () => { | |||
| {t('dataset.connectDatasetIntro.content.end')} | |||
| </span> | |||
| <a className='system-sm-regular self-stretch text-text-accent' | |||
| href={docLink('/guides/knowledge-base/connect-external-knowledge-base')} | |||
| target='_blank' | |||
| rel="noopener noreferrer"> | |||
| href={docLink('/guides/knowledge-base/connect-external-knowledge-base')} | |||
| target='_blank' | |||
| rel="noopener noreferrer"> | |||
| {t('dataset.connectDatasetIntro.learnMore')} | |||
| </a> | |||
| </p> | |||
| @@ -69,13 +69,13 @@ const ChunkDetailModal: FC<Props> = ({ | |||
| <div> | |||
| <div className='flex gap-x-1'> | |||
| <div className='w-4 shrink-0 text-[13px] font-medium leading-[20px] text-text-tertiary'>Q</div> | |||
| <div className={cn('body-md-regular text-text-secondary line-clamp-20')}> | |||
| <div className={cn('body-md-regular line-clamp-20 text-text-secondary')}> | |||
| {content} | |||
| </div> | |||
| </div> | |||
| <div className='flex gap-x-1'> | |||
| <div className='w-4 shrink-0 text-[13px] font-medium leading-[20px] text-text-tertiary'>A</div> | |||
| <div className={cn('body-md-regular text-text-secondary line-clamp-20')}> | |||
| <div className={cn('body-md-regular line-clamp-20 text-text-secondary')}> | |||
| {answer} | |||
| </div> | |||
| </div> | |||
| @@ -28,7 +28,6 @@ const useEditDatasetMetadata = ({ | |||
| showEditModal() | |||
| localStorage.removeItem(isShowManageMetadataLocalStorageKey) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| const { data: datasetMetaData } = useDatasetMetaData(datasetId) | |||
| @@ -132,7 +132,7 @@ export class SlashCommandRegistry { | |||
| try { | |||
| return await handler.search(args, locale) | |||
| } | |||
| catch (error) { | |||
| catch (error) { | |||
| console.warn(`Command search failed for ${commandName}:`, error) | |||
| return [] | |||
| } | |||
| @@ -144,7 +144,7 @@ export class SlashCommandRegistry { | |||
| try { | |||
| return await handler.search(args, locale) | |||
| } | |||
| catch (error) { | |||
| catch (error) { | |||
| console.warn(`Command search failed for ${handler.name}:`, error) | |||
| return [] | |||
| } | |||
| @@ -205,7 +205,7 @@ export const searchAnything = async ( | |||
| const results = await action.search(query, query, locale) | |||
| return { success: true, data: results, actionType: action.key } | |||
| } | |||
| catch (error) { | |||
| catch (error) { | |||
| console.warn(`Search failed for ${action.key}:`, error) | |||
| return { success: false, data: [], actionType: action.key, error } | |||
| } | |||
| @@ -220,7 +220,7 @@ export const searchAnything = async ( | |||
| if (result.status === 'fulfilled' && result.value.success) { | |||
| allResults.push(...result.value.data) | |||
| } | |||
| else { | |||
| else { | |||
| const actionKey = globalSearchActions[index]?.key || 'unknown' | |||
| failedActions.push(actionKey) | |||
| } | |||
| @@ -166,7 +166,7 @@ const GotoAnything: FC<Props> = ({ | |||
| acc[result.type].push(result) | |||
| return acc | |||
| }, {} as { [key: string]: SearchResult[] }), | |||
| [searchResults]) | |||
| [searchResults]) | |||
| const emptyResult = useMemo(() => { | |||
| if (searchResults.length || !searchQuery.trim() || isLoading || isCommandsMode) | |||
| @@ -32,7 +32,6 @@ const DataSourceWebsite: FC<Props> = ({ provider }) => { | |||
| useEffect(() => { | |||
| checkSetApiKey() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| const [configTarget, setConfigTarget] = useState<DataSourceProvider | null>(null) | |||
| @@ -60,9 +60,9 @@ const AddCredentialInLoadBalancing = ({ | |||
| asChild | |||
| popupContent={t('plugin.auth.credentialUnavailable')} | |||
| > | |||
| {Item} | |||
| </Tooltip> | |||
| ) | |||
| {Item} | |||
| </Tooltip> | |||
| ) | |||
| } | |||
| return Item | |||
| }, [notAllowCustomCredential, t, customModel]) | |||
| @@ -176,11 +176,11 @@ const Authorized = ({ | |||
| onClick={() => handleEdit( | |||
| undefined, | |||
| currentCustomConfigurationModelFixedFields | |||
| ? { | |||
| model: currentCustomConfigurationModelFixedFields.__model_name, | |||
| model_type: currentCustomConfigurationModelFixedFields.__model_type, | |||
| } | |||
| : undefined, | |||
| ? { | |||
| model: currentCustomConfigurationModelFixedFields.__model_name, | |||
| model_type: currentCustomConfigurationModelFixedFields.__model_type, | |||
| } | |||
| : undefined, | |||
| )} | |||
| className='system-xs-medium flex h-[30px] cursor-pointer items-center px-3 text-text-accent-light-mode-only' | |||
| > | |||
| @@ -200,8 +200,8 @@ const ModelLoadBalancingModal = ({ | |||
| <div className='grow'> | |||
| <div className='text-sm text-text-secondary'>{ | |||
| providerFormSchemaPredefined | |||
| ? t('common.modelProvider.auth.providerManaged') | |||
| : t('common.modelProvider.auth.specifyModelCredential') | |||
| ? t('common.modelProvider.auth.providerManaged') | |||
| : t('common.modelProvider.auth.specifyModelCredential') | |||
| }</div> | |||
| <div className='text-xs text-text-tertiary'>{ | |||
| providerFormSchemaPredefined | |||
| @@ -41,13 +41,10 @@ const Item: FC<Props> = ({ | |||
| onFetchedPayload(payload) | |||
| setPayload({ ...payload, from: dependency.type }) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [data]) | |||
| useEffect(() => { | |||
| if (error) | |||
| onFetchError() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [error]) | |||
| if (!payload) return <Loading /> | |||
| return ( | |||
| @@ -131,7 +131,6 @@ const InstallByDSLList: ForwardRefRenderFunction<ExposeRefs, Props> = ({ | |||
| if (failedIndex.length > 0) | |||
| setErrorIndexes([...errorIndexes, ...failedIndex]) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [isFetchingMarketplaceDataById]) | |||
| useEffect(() => { | |||
| @@ -156,15 +155,12 @@ const InstallByDSLList: ForwardRefRenderFunction<ExposeRefs, Props> = ({ | |||
| if (failedIndex.length > 0) | |||
| setErrorIndexes([...errorIndexes, ...failedIndex]) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [isFetchingDataByMeta]) | |||
| useEffect(() => { | |||
| // get info all failed | |||
| if (infoByMetaError || infoByIdError) | |||
| setErrorIndexes([...errorIndexes, ...marketPlaceInDSLIndex]) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [infoByMetaError, infoByIdError]) | |||
| const isLoadedAllData = (plugins.filter(p => !!p).length + errorIndexes.length) === allPlugins.length | |||
| @@ -189,8 +185,6 @@ const InstallByDSLList: ForwardRefRenderFunction<ExposeRefs, Props> = ({ | |||
| useEffect(() => { | |||
| if (isLoadedAllData && installedInfo) | |||
| onLoadedAllPlugin(installedInfo!) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [isLoadedAllData, installedInfo]) | |||
| const handleSelect = useCallback((index: number) => { | |||
| @@ -61,7 +61,6 @@ const Loaded: React.FC<LoadedProps> = ({ | |||
| useEffect(() => { | |||
| if (hasInstalled && uniqueIdentifier === installedInfoPayload.uniqueIdentifier) | |||
| onInstalled() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [hasInstalled]) | |||
| const handleInstall = async () => { | |||
| @@ -55,7 +55,6 @@ const Uploading: FC<Props> = ({ | |||
| React.useEffect(() => { | |||
| handleUpload() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| return ( | |||
| <> | |||
| @@ -175,7 +175,6 @@ export const MarketplaceContextProvider = ({ | |||
| }) | |||
| } | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [queryPlugins, queryMarketplaceCollectionsAndPlugins, isSuccess, exclude]) | |||
| const handleQueryMarketplaceCollectionsAndPlugins = useCallback(() => { | |||
| @@ -155,9 +155,9 @@ const Authorized = ({ | |||
| }, [setPluginDefaultCredential, onUpdate, notify, t, handleSetDoingAction]) | |||
| const { mutateAsync: updatePluginCredential } = useUpdatePluginCredentialHook(pluginPayload) | |||
| const handleRename = useCallback(async (payload: { | |||
| credential_id: string | |||
| name: string | |||
| }) => { | |||
| credential_id: string | |||
| name: string | |||
| }) => { | |||
| if (doingActionRef.current) | |||
| return | |||
| try { | |||
| @@ -306,17 +306,17 @@ const Authorized = ({ | |||
| !notAllowCustomCredential && ( | |||
| <> | |||
| <div className='h-[1px] bg-divider-subtle'></div> | |||
| <div className='p-2'> | |||
| <Authorize | |||
| pluginPayload={pluginPayload} | |||
| theme='secondary' | |||
| showDivider={false} | |||
| canOAuth={canOAuth} | |||
| canApiKey={canApiKey} | |||
| disabled={disabled} | |||
| onUpdate={onUpdate} | |||
| /> | |||
| </div> | |||
| <div className='p-2'> | |||
| <Authorize | |||
| pluginPayload={pluginPayload} | |||
| theme='secondary' | |||
| showDivider={false} | |||
| canOAuth={canOAuth} | |||
| canApiKey={canApiKey} | |||
| disabled={disabled} | |||
| onUpdate={onUpdate} | |||
| /> | |||
| </div> | |||
| </> | |||
| ) | |||
| } | |||
| @@ -87,9 +87,9 @@ export const usePluginAuthAction = ( | |||
| }, [setPluginDefaultCredential, onUpdate, notify, t, handleSetDoingAction]) | |||
| const { mutateAsync: updatePluginCredential } = useUpdatePluginCredentialHook(pluginPayload) | |||
| const handleRename = useCallback(async (payload: { | |||
| credential_id: string | |||
| name: string | |||
| }) => { | |||
| credential_id: string | |||
| name: string | |||
| }) => { | |||
| if (doingActionRef.current) | |||
| return | |||
| try { | |||
| @@ -97,7 +97,7 @@ const AppSelector: FC<Props> = ({ | |||
| try { | |||
| await setSize((size: number) => size + 1) | |||
| } | |||
| finally { | |||
| finally { | |||
| // Add a small delay to ensure state updates are complete | |||
| setTimeout(() => { | |||
| setIsLoadingMore(false) | |||
| @@ -61,7 +61,7 @@ const DetailHeader = ({ | |||
| onUpdate, | |||
| }: Props) => { | |||
| const { t } = useTranslation() | |||
| const { userProfile: { timezone } } = useAppContext() | |||
| const { userProfile: { timezone } } = useAppContext() | |||
| const { theme } = useTheme() | |||
| const locale = useGetLanguage() | |||
| @@ -55,9 +55,9 @@ const EndpointModal: FC<Props> = ({ | |||
| const value = processedCredential[field.name] | |||
| if (typeof value === 'string') | |||
| processedCredential[field.name] = value === 'true' || value === '1' || value === 'True' | |||
| else if (typeof value === 'number') | |||
| else if (typeof value === 'number') | |||
| processedCredential[field.name] = value === 1 | |||
| else if (typeof value === 'boolean') | |||
| else if (typeof value === 'boolean') | |||
| processedCredential[field.name] = value | |||
| } | |||
| }) | |||
| @@ -45,7 +45,7 @@ const MultipleToolSelector = ({ | |||
| canChooseMCPTool, | |||
| }: Props) => { | |||
| const { t } = useTranslation() | |||
| const { data: mcpTools } = useAllMCPTools() | |||
| const { data: mcpTools } = useAllMCPTools() | |||
| const enabledCount = value.filter((item) => { | |||
| const isMCPTool = mcpTools?.find(tool => tool.id === item.provider_name) | |||
| if(isMCPTool) | |||
| @@ -222,12 +222,12 @@ const ReasoningConfigForm: React.FC<Props> = ({ | |||
| {t('workflow.nodes.agent.clickToViewParameterSchema')} | |||
| </div>} | |||
| asChild={false}> | |||
| <div | |||
| className='ml-0.5 cursor-pointer rounded-[4px] p-px text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary' | |||
| onClick={() => showSchema(input_schema as SchemaRoot, label[language] || label.en_US)} | |||
| > | |||
| <RiBracesLine className='size-3.5'/> | |||
| </div> | |||
| <div | |||
| className='ml-0.5 cursor-pointer rounded-[4px] p-px text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary' | |||
| onClick={() => showSchema(input_schema as SchemaRoot, label[language] || label.en_US)} | |||
| > | |||
| <RiBracesLine className='size-3.5'/> | |||
| </div> | |||
| </Tooltip> | |||
| )} | |||
| @@ -98,7 +98,6 @@ const Action: FC<Props> = ({ | |||
| hideDeleteConfirm() | |||
| onDelete() | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [installationId, onDelete]) | |||
| return ( | |||
| <div className='flex space-x-1'> | |||
| @@ -101,19 +101,19 @@ const AutoUpdateSetting: FC<Props> = ({ | |||
| const renderTimePickerTrigger = useCallback(({ inputElem, onClick, isOpen }: TriggerParams) => { | |||
| return ( | |||
| <div | |||
| className='group float-right flex h-8 w-[160px] cursor-pointer items-center justify-between rounded-lg bg-components-input-bg-normal px-2 hover:bg-state-base-hover-alt' | |||
| onClick={onClick} | |||
| > | |||
| <div className='flex w-0 grow items-center gap-x-1'> | |||
| <RiTimeLine className={cn( | |||
| 'h-4 w-4 shrink-0 text-text-tertiary', | |||
| isOpen ? 'text-text-secondary' : 'group-hover:text-text-secondary', | |||
| )} /> | |||
| {inputElem} | |||
| </div> | |||
| <div className='system-sm-regular text-text-tertiary'>{convertTimezoneToOffsetStr(timezone)}</div> | |||
| <div | |||
| className='group float-right flex h-8 w-[160px] cursor-pointer items-center justify-between rounded-lg bg-components-input-bg-normal px-2 hover:bg-state-base-hover-alt' | |||
| onClick={onClick} | |||
| > | |||
| <div className='flex w-0 grow items-center gap-x-1'> | |||
| <RiTimeLine className={cn( | |||
| 'h-4 w-4 shrink-0 text-text-tertiary', | |||
| isOpen ? 'text-text-secondary' : 'group-hover:text-text-secondary', | |||
| )} /> | |||
| {inputElem} | |||
| </div> | |||
| <div className='system-sm-regular text-text-tertiary'>{convertTimezoneToOffsetStr(timezone)}</div> | |||
| </div> | |||
| ) | |||
| }, [timezone]) | |||
| @@ -28,10 +28,10 @@ export const dayjsToTimeOfDay = (date?: Dayjs): number => { | |||
| } | |||
| export const convertUTCDaySecondsToLocalSeconds = (utcDaySeconds: number, localTimezone: string): number => { | |||
| const utcDayStart = dayjs().utc().startOf('day') | |||
| const utcTargetTime = utcDayStart.add(utcDaySeconds, 'second') | |||
| const localTargetTime = utcTargetTime.tz(localTimezone) | |||
| const localDayStart = localTargetTime.startOf('day') | |||
| const secondsInLocalDay = localTargetTime.diff(localDayStart, 'second') | |||
| return secondsInLocalDay | |||
| const utcDayStart = dayjs().utc().startOf('day') | |||
| const utcTargetTime = utcDayStart.add(utcDaySeconds, 'second') | |||
| const localTargetTime = utcTargetTime.tz(localTimezone) | |||
| const localDayStart = localTargetTime.startOf('day') | |||
| const secondsInLocalDay = localTargetTime.diff(localDayStart, 'second') | |||
| return secondsInLocalDay | |||
| } | |||
| @@ -20,7 +20,7 @@ const DowngradeWarningModal = ({ | |||
| <div className='flex flex-col items-start gap-2 self-stretch'> | |||
| <div className='title-2xl-semi-bold text-text-primary'>{t(`${i18nPrefix}.title`)}</div> | |||
| <div className='system-md-regular text-text-secondary'> | |||
| {t(`${i18nPrefix}.description`)} | |||
| {t(`${i18nPrefix}.description`)} | |||
| </div> | |||
| </div> | |||
| <div className='mt-9 flex items-start justify-end space-x-2 self-stretch'> | |||
| @@ -136,47 +136,47 @@ const UpdatePluginModal: FC<Props> = ({ | |||
| onExcludeAndDowngrade={handleExcludeAndDownload} | |||
| /> | |||
| )} | |||
| {!doShowDowngradeWarningModal && ( | |||
| <> | |||
| <div className='system-md-regular mb-2 mt-3 text-text-secondary'> | |||
| {t(`${i18nPrefix}.description`)} | |||
| </div> | |||
| <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'> | |||
| <Card | |||
| installed={uploadStep === UploadStep.installed} | |||
| payload={pluginManifestToCardPluginProps({ | |||
| ...originalPackageInfo.payload, | |||
| icon: icon!, | |||
| })} | |||
| className='w-full' | |||
| titleLeft={ | |||
| <> | |||
| <Badge className='mx-1' size="s" state={BadgeState.Warning}> | |||
| {`${originalPackageInfo.payload.version} -> ${targetPackageInfo.version}`} | |||
| </Badge> | |||
| </> | |||
| } | |||
| /> | |||
| </div> | |||
| <div className='flex items-center justify-end gap-2 self-stretch pt-5'> | |||
| {uploadStep === UploadStep.notStarted && ( | |||
| {!doShowDowngradeWarningModal && ( | |||
| <> | |||
| <div className='system-md-regular mb-2 mt-3 text-text-secondary'> | |||
| {t(`${i18nPrefix}.description`)} | |||
| </div> | |||
| <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'> | |||
| <Card | |||
| installed={uploadStep === UploadStep.installed} | |||
| payload={pluginManifestToCardPluginProps({ | |||
| ...originalPackageInfo.payload, | |||
| icon: icon!, | |||
| })} | |||
| className='w-full' | |||
| titleLeft={ | |||
| <> | |||
| <Badge className='mx-1' size="s" state={BadgeState.Warning}> | |||
| {`${originalPackageInfo.payload.version} -> ${targetPackageInfo.version}`} | |||
| </Badge> | |||
| </> | |||
| } | |||
| /> | |||
| </div> | |||
| <div className='flex items-center justify-end gap-2 self-stretch pt-5'> | |||
| {uploadStep === UploadStep.notStarted && ( | |||
| <Button | |||
| onClick={handleCancel} | |||
| > | |||
| {t('common.operation.cancel')} | |||
| </Button> | |||
| )} | |||
| <Button | |||
| onClick={handleCancel} | |||
| variant='primary' | |||
| loading={uploadStep === UploadStep.upgrading} | |||
| onClick={handleConfirm} | |||
| disabled={uploadStep === UploadStep.upgrading} | |||
| > | |||
| {t('common.operation.cancel')} | |||
| {configBtnText} | |||
| </Button> | |||
| )} | |||
| <Button | |||
| variant='primary' | |||
| loading={uploadStep === UploadStep.upgrading} | |||
| onClick={handleConfirm} | |||
| disabled={uploadStep === UploadStep.upgrading} | |||
| > | |||
| {configBtnText} | |||
| </Button> | |||
| </div> | |||
| </> | |||
| )} | |||
| </div> | |||
| </> | |||
| )} | |||
| </Modal> | |||
| ) | |||
| @@ -141,7 +141,6 @@ const MCPDetailContent: FC<Props> = ({ | |||
| useEffect(() => { | |||
| if (isTriggerAuthorize) | |||
| handleAuthorize() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| if (!detail) | |||
| @@ -209,9 +209,9 @@ function MCPServiceCard({ | |||
| > | |||
| <div className="flex items-center justify-center gap-[1px]"> | |||
| <RiEditLine className="h-3.5 w-3.5" /> | |||
| <div className="system-xs-medium px-[3px] text-text-tertiary">{serverPublished ? t('tools.mcp.server.edit') : t('tools.mcp.server.addDescription')}</div> | |||
| </div> | |||
| <RiEditLine className="h-3.5 w-3.5" /> | |||
| <div className="system-xs-medium px-[3px] text-text-tertiary">{serverPublished ? t('tools.mcp.server.edit') : t('tools.mcp.server.addDescription')}</div> | |||
| </div> | |||
| </Button> | |||
| </div> | |||
| </div> | |||
| @@ -70,9 +70,9 @@ export const addDefaultValue = (value: Record<string, any>, formSchemas: { varia | |||
| if (formSchema.type === 'boolean' && itemValue !== undefined && itemValue !== null && itemValue !== '') { | |||
| if (typeof itemValue === 'string') | |||
| newValues[formSchema.variable] = itemValue === 'true' || itemValue === '1' || itemValue === 'True' | |||
| else if (typeof itemValue === 'number') | |||
| else if (typeof itemValue === 'number') | |||
| newValues[formSchema.variable] = itemValue === 1 | |||
| else if (typeof itemValue === 'boolean') | |||
| else if (typeof itemValue === 'boolean') | |||
| newValues[formSchema.variable] = itemValue | |||
| } | |||
| }) | |||
| @@ -162,13 +162,13 @@ export const getConfiguredValue = (value: Record<string, any>, formSchemas: { va | |||
| } | |||
| const getVarKindType = (type: FormTypeEnum) => { | |||
| if (type === FormTypeEnum.file || type === FormTypeEnum.files) | |||
| return VarKindType.variable | |||
| if (type === FormTypeEnum.select || type === FormTypeEnum.boolean || type === FormTypeEnum.textNumber) | |||
| return VarKindType.constant | |||
| if (type === FormTypeEnum.textInput || type === FormTypeEnum.secretInput) | |||
| return VarKindType.mixed | |||
| } | |||
| if (type === FormTypeEnum.file || type === FormTypeEnum.files) | |||
| return VarKindType.variable | |||
| if (type === FormTypeEnum.select || type === FormTypeEnum.boolean || type === FormTypeEnum.textNumber) | |||
| return VarKindType.constant | |||
| if (type === FormTypeEnum.textInput || type === FormTypeEnum.secretInput) | |||
| return VarKindType.mixed | |||
| } | |||
| export const generateAgentToolValue = (value: Record<string, any>, formSchemas: { variable: string; default?: any; type: string }[], isReasoning = false) => { | |||
| const newValues = {} as any | |||
| @@ -83,7 +83,6 @@ export const useWorkflowInit = () => { | |||
| useEffect(() => { | |||
| handleGetInitialWorkflowData() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| const handleFetchPreloadData = useCallback(async () => { | |||
| @@ -101,7 +101,6 @@ const AllTools = ({ | |||
| category: PluginType.tool, | |||
| }) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [searchText, tags, enable_marketplace]) | |||
| const pluginRef = useRef<ListRef>(null) | |||
| @@ -60,7 +60,6 @@ const OperationDropdown: FC<Props> = ({ | |||
| downloadFile({ data: blob, fileName }) | |||
| setNeedDownload(false) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [blob]) | |||
| return ( | |||
| <PortalToFollowElem | |||
| @@ -56,7 +56,6 @@ const List = forwardRef<ListRef, ListProps>(({ | |||
| useEffect(() => { | |||
| handleScroll() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [list]) | |||
| const handleHeadClick = () => { | |||
| @@ -122,7 +122,6 @@ const Tool: FC<Props> = ({ | |||
| } | |||
| if (!hasSearchText && !isFold) | |||
| setFold(true) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [hasSearchText]) | |||
| const FoldIcon = isFold ? RiArrowRightSLine : RiArrowDownSLine | |||
| @@ -40,7 +40,6 @@ const DatasetsDetailProvider: FC<DatasetsDetailProviderProps> = ({ | |||
| }, []) | |||
| if (allDatasetIds.length === 0) return | |||
| updateDatasetsDetail(allDatasetIds) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| return ( | |||
| @@ -82,26 +82,26 @@ const HeaderInRestoring = ({ | |||
| <RestoringTitle /> | |||
| </div> | |||
| <div className=' flex items-center justify-end gap-x-2'> | |||
| <Button | |||
| onClick={handleRestore} | |||
| disabled={!currentVersion || currentVersion.version === WorkflowVersion.Draft} | |||
| variant='primary' | |||
| className={cn( | |||
| theme === 'dark' && 'rounded-lg border border-black/5 bg-white/10 backdrop-blur-sm', | |||
| )} | |||
| > | |||
| {t('workflow.common.restore')} | |||
| </Button> | |||
| <Button | |||
| onClick={handleCancelRestore} | |||
| className={cn( | |||
| 'text-components-button-secondary-accent-text', | |||
| theme === 'dark' && 'rounded-lg border border-black/5 bg-white/10 backdrop-blur-sm', | |||
| )} | |||
| > | |||
| <div className='flex items-center gap-x-0.5'> | |||
| <RiHistoryLine className='h-4 w-4' /> | |||
| <span className='px-0.5'>{t('workflow.common.exitVersions')}</span> | |||
| <Button | |||
| onClick={handleRestore} | |||
| disabled={!currentVersion || currentVersion.version === WorkflowVersion.Draft} | |||
| variant='primary' | |||
| className={cn( | |||
| theme === 'dark' && 'rounded-lg border border-black/5 bg-white/10 backdrop-blur-sm', | |||
| )} | |||
| > | |||
| {t('workflow.common.restore')} | |||
| </Button> | |||
| <Button | |||
| onClick={handleCancelRestore} | |||
| className={cn( | |||
| 'text-components-button-secondary-accent-text', | |||
| theme === 'dark' && 'rounded-lg border border-black/5 bg-white/10 backdrop-blur-sm', | |||
| )} | |||
| > | |||
| <div className='flex items-center gap-x-0.5'> | |||
| <RiHistoryLine className='h-4 w-4' /> | |||
| <span className='px-0.5'>{t('workflow.common.exitVersions')}</span> | |||
| </div> | |||
| </Button> | |||
| </div> | |||
| @@ -49,7 +49,7 @@ const VersionHistoryButton: FC<VersionHistoryButtonProps> = ({ | |||
| e.preventDefault() | |||
| handleViewVersionHistory() | |||
| }, | |||
| { exactMatch: true, useCapture: true }) | |||
| { exactMatch: true, useCapture: true }) | |||
| return <Tooltip | |||
| popupContent={<PopupContent />} | |||
| @@ -57,15 +57,15 @@ const VersionHistoryButton: FC<VersionHistoryButtonProps> = ({ | |||
| popupClassName='rounded-lg border-[0.5px] border-components-panel-border bg-components-tooltip-bg | |||
| shadow-lg shadow-shadow-shadow-5 backdrop-blur-[5px] p-1.5' | |||
| > | |||
| <Button | |||
| className={cn( | |||
| 'p-2', | |||
| theme === 'dark' && 'rounded-lg border border-black/5 bg-white/10 backdrop-blur-sm', | |||
| )} | |||
| onClick={handleViewVersionHistory} | |||
| > | |||
| <RiHistoryLine className='h-4 w-4 text-components-button-secondary-text' /> | |||
| </Button> | |||
| <Button | |||
| className={cn( | |||
| 'p-2', | |||
| theme === 'dark' && 'rounded-lg border border-black/5 bg-white/10 backdrop-blur-sm', | |||
| )} | |||
| onClick={handleViewVersionHistory} | |||
| > | |||
| <RiHistoryLine className='h-4 w-4 text-components-button-secondary-text' /> | |||
| </Button> | |||
| </Tooltip> | |||
| } | |||
| @@ -22,7 +22,6 @@ export const HooksStoreContextProvider = ({ children, ...restProps }: HooksStore | |||
| useEffect(() => { | |||
| if (storeRef.current && d3Selection && d3Zoom) | |||
| storeRef.current.getState().refreshAll(restProps) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [d3Selection, d3Zoom]) | |||
| if (!storeRef.current) | |||
| @@ -54,9 +54,9 @@ export const useInspectVarsCrudCommon = ({ | |||
| if (!node) | |||
| return undefined | |||
| const varId = node.vars.find((varItem) => { | |||
| return varItem.selector[1] === varName | |||
| })?.id | |||
| return varId | |||
| return varItem.selector[1] === varName | |||
| })?.id | |||
| return varId | |||
| }, [getNodeInspectVars]) | |||
| const getInspectVar = useCallback((nodeId: string, name: string): VarInInspect | undefined => { | |||
| @@ -71,16 +71,16 @@ export const useInspectVarsCrudCommon = ({ | |||
| }, [getNodeInspectVars]) | |||
| const hasSetInspectVar = useCallback((nodeId: string, name: string, sysVars: VarInInspect[], conversationVars: VarInInspect[]) => { | |||
| const isEnv = isENV([nodeId]) | |||
| if (isEnv) // always have value | |||
| return true | |||
| const isSys = isSystemVar([nodeId]) | |||
| if (isSys) | |||
| return sysVars.some(varItem => varItem.selector?.[1]?.replace('sys.', '') === name) | |||
| const isChatVar = isConversationVar([nodeId]) | |||
| if (isChatVar) | |||
| return conversationVars.some(varItem => varItem.selector?.[1] === name) | |||
| return getInspectVar(nodeId, name) !== undefined | |||
| const isEnv = isENV([nodeId]) | |||
| if (isEnv) // always have value | |||
| return true | |||
| const isSys = isSystemVar([nodeId]) | |||
| if (isSys) | |||
| return sysVars.some(varItem => varItem.selector?.[1]?.replace('sys.', '') === name) | |||
| const isChatVar = isConversationVar([nodeId]) | |||
| if (isChatVar) | |||
| return conversationVars.some(varItem => varItem.selector?.[1] === name) | |||
| return getInspectVar(nodeId, name) !== undefined | |||
| }, [getInspectVar]) | |||
| const hasNodeInspectVars = useCallback((nodeId: string) => { | |||
| @@ -115,23 +115,23 @@ export const useInspectVarsCrudCommon = ({ | |||
| } = workflowStore.getState() | |||
| const nodes = produce(nodesWithInspectVars, (draft) => { | |||
| const nodeInfo = allNodes.find(node => node.id === nodeId) | |||
| if (nodeInfo) { | |||
| const index = draft.findIndex(node => node.nodeId === nodeId) | |||
| if (index === -1) { | |||
| draft.unshift({ | |||
| nodeId, | |||
| nodeType: nodeInfo.data.type, | |||
| title: nodeInfo.data.title, | |||
| vars: payload, | |||
| nodePayload: nodeInfo.data, | |||
| }) | |||
| } | |||
| else { | |||
| draft[index].vars = payload | |||
| if (nodeInfo) { | |||
| const index = draft.findIndex(node => node.nodeId === nodeId) | |||
| if (index === -1) { | |||
| draft.unshift({ | |||
| nodeId, | |||
| nodeType: nodeInfo.data.type, | |||
| title: nodeInfo.data.title, | |||
| vars: payload, | |||
| nodePayload: nodeInfo.data, | |||
| }) | |||
| } | |||
| else { | |||
| draft[index].vars = payload | |||
| // put the node to the topAdd commentMore actions | |||
| draft.unshift(draft.splice(index, 1)[0]) | |||
| } | |||
| draft.unshift(draft.splice(index, 1)[0]) | |||
| } | |||
| } | |||
| }) | |||
| setNodesWithInspectVars(nodes) | |||
| handleCancelNodeSuccessStatus(nodeId) | |||
| @@ -35,9 +35,9 @@ const useNodesAvailableVarList = (nodes: Node[], { | |||
| hideChatVar = false, | |||
| passedInAvailableNodes, | |||
| }: Params = { | |||
| onlyLeafNodeVar: false, | |||
| filterVar: () => true, | |||
| }) => { | |||
| onlyLeafNodeVar: false, | |||
| filterVar: () => true, | |||
| }) => { | |||
| const { getTreeLeafNodes, getBeforeNodesInSameBranchIncludeParent } = useWorkflow() | |||
| const { getNodeAvailableVars } = useWorkflowVariables() | |||
| const isChatMode = useIsChatMode() | |||
| @@ -68,7 +68,7 @@ export const useWorkflowNodeStarted = () => { | |||
| incomeEdges.forEach((edge) => { | |||
| const incomeNode = nodes.find(node => node.id === edge.source)! | |||
| if (!incomeNode || !('data' in incomeNode)) | |||
| return | |||
| return | |||
| if ( | |||
| (!incomeNode.data._runningBranchId && edge.sourceHandle === 'source') | |||
| @@ -93,7 +93,7 @@ export type AgentStrategySelectorProps = { | |||
| } | |||
| export const AgentStrategySelector = memo((props: AgentStrategySelectorProps) => { | |||
| const { enable_marketplace } = useGlobalPublicStore(s => s.systemFeatures) | |||
| const { enable_marketplace } = useGlobalPublicStore(s => s.systemFeatures) | |||
| const { value, onChange, canChooseMCPTool } = props | |||
| const [open, setOpen] = useState(false) | |||
| @@ -236,7 +236,7 @@ export const AgentStrategy = memo((props: AgentStrategyProps) => { | |||
| 'zh-Hans': '/guides/workflow/node/agent#选择-agent-策略', | |||
| 'ja-JP': '/guides/workflow/node/agent#エージェント戦略の選択', | |||
| })} | |||
| className='text-text-accent-secondary' target='_blank'> | |||
| className='text-text-accent-secondary' target='_blank'> | |||
| {t('workflow.nodes.agent.learnMore')} | |||
| </Link> | |||
| </div>} | |||
| @@ -193,10 +193,10 @@ const FormItem: FC<Props> = ({ | |||
| language={CodeLanguage.json} | |||
| onChange={onChange} | |||
| noWrapper | |||
| className='bg h-[80px] overflow-y-auto rounded-[10px] bg-components-input-bg-normal p-1' | |||
| placeholder={ | |||
| <div className='whitespace-pre'>{payload.json_schema}</div> | |||
| } | |||
| className='bg h-[80px] overflow-y-auto rounded-[10px] bg-components-input-bg-normal p-1' | |||
| placeholder={ | |||
| <div className='whitespace-pre'>{payload.json_schema}</div> | |||
| } | |||
| /> | |||
| )} | |||
| {(type === InputVarType.singleFile) && ( | |||
| @@ -53,7 +53,6 @@ const Editor: FC<Props> = ({ | |||
| useEffect(() => { | |||
| onFocusChange?.(isFocus) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [isFocus]) | |||
| return ( | |||
| @@ -11,7 +11,7 @@ const McpToolNotSupportTooltip: FC = () => { | |||
| <Tooltip | |||
| popupContent={ | |||
| <div className='w-[256px]'> | |||
| {t('plugin.detailPanel.toolSelector.unsupportedMCPTool')} | |||
| {t('plugin.detailPanel.toolSelector.unsupportedMCPTool')} | |||
| </div> | |||
| } | |||
| > | |||
| @@ -694,9 +694,9 @@ const getIterationItemType = ({ | |||
| curr = Array.isArray(curr) ? curr.find(v => v.variable === key) : [] | |||
| if (isLast) | |||
| arrayType = curr?.type | |||
| arrayType = curr?.type | |||
| else if (curr?.type === VarType.object || curr?.type === VarType.file) | |||
| curr = curr.children || [] | |||
| curr = curr.children || [] | |||
| } | |||
| } | |||
| @@ -55,11 +55,11 @@ const VarList: FC<Props> = ({ | |||
| const { isValid, errorKey, errorMessageKey } = checkKeys([newKey], true) | |||
| if (!isValid) { | |||
| setToastHandle(Toast.notify({ | |||
| type: 'error', | |||
| message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: errorKey }), | |||
| })) | |||
| return | |||
| } | |||
| type: 'error', | |||
| message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: errorKey }), | |||
| })) | |||
| return | |||
| } | |||
| if (list.some(item => item.variable?.trim() === newKey.trim())) { | |||
| console.log('new key', newKey.trim()) | |||
| setToastHandle(Toast.notify({ | |||
| @@ -339,7 +339,7 @@ const VarReferencePicker: FC<Props> = ({ | |||
| const data = await fetchDynamicOptions() | |||
| setDynamicOptions(data?.options || []) | |||
| } | |||
| finally { | |||
| finally { | |||
| setIsLoading(false) | |||
| } | |||
| } | |||
| @@ -250,7 +250,7 @@ const BasePanel: FC<BasePanelProps> = ({ | |||
| if(logParams.showSpecialResultPanel) { | |||
| return ( | |||
| <div className={cn( | |||
| <div className={cn( | |||
| 'relative mr-1 h-full', | |||
| )}> | |||
| <div | |||
| @@ -356,7 +356,7 @@ const BasePanel: FC<BasePanelProps> = ({ | |||
| > | |||
| { | |||
| isSingleRunning ? <Stop className='h-4 w-4 text-text-tertiary' /> | |||
| : <RiPlayLargeLine className='h-4 w-4 text-text-tertiary' /> | |||
| : <RiPlayLargeLine className='h-4 w-4 text-text-tertiary' /> | |||
| } | |||
| </div> | |||
| </Tooltip> | |||
| @@ -79,11 +79,11 @@ const LastRun: FC<Props> = ({ | |||
| }, [nodeId]) | |||
| const handlePageVisibilityChange = useCallback(() => { | |||
| if (document.visibilityState === 'hidden') | |||
| setPageHasHide(true) | |||
| else | |||
| setPageShowed(true) | |||
| }, []) | |||
| if (document.visibilityState === 'hidden') | |||
| setPageHasHide(true) | |||
| else | |||
| setPageShowed(true) | |||
| }, []) | |||
| useEffect(() => { | |||
| document.addEventListener('visibilitychange', handlePageVisibilityChange) | |||
| @@ -118,8 +118,8 @@ function useOutputVarList<T>({ | |||
| const [removedVar, setRemovedVar] = useState<ValueSelector>([]) | |||
| const removeVarInNode = useCallback(() => { | |||
| const varId = nodesWithInspectVars.find(node => node.nodeId === id)?.vars.find((varItem) => { | |||
| return varItem.name === removedVar[1] | |||
| })?.id | |||
| return varItem.name === removedVar[1] | |||
| })?.id | |||
| if(varId) | |||
| deleteInspectVar(id, varId) | |||
| removeUsedVarInNodes(removedVar) | |||
| @@ -143,8 +143,8 @@ function useOutputVarList<T>({ | |||
| setInputs(newInputs) | |||
| onOutputKeyOrdersChange(outputKeyOrders.filter((_, i) => i !== index)) | |||
| const varId = nodesWithInspectVars.find(node => node.nodeId === id)?.vars.find((varItem) => { | |||
| return varItem.name === key | |||
| })?.id | |||
| return varItem.name === key | |||
| })?.id | |||
| if(varId) | |||
| deleteInspectVar(id, varId) | |||
| }, [outputKeyOrders, isVarUsedInNodes, id, inputs, setInputs, onOutputKeyOrdersChange, nodesWithInspectVars, deleteInspectVar, showRemoveVarConfirm, varKey]) | |||
| @@ -45,10 +45,10 @@ const AgentPanel: FC<NodePanelProps<AgentNodeType>> = (props) => { | |||
| const resetEditor = useStore(s => s.setControlPromptEditorRerenderKey) | |||
| return <div className='my-2'> | |||
| <Field | |||
| required | |||
| title={t('workflow.nodes.agent.strategy.label')} | |||
| className='px-4 py-2' | |||
| tooltip={t('workflow.nodes.agent.strategy.tooltip')} > | |||
| required | |||
| title={t('workflow.nodes.agent.strategy.label')} | |||
| className='px-4 py-2' | |||
| tooltip={t('workflow.nodes.agent.strategy.tooltip')} > | |||
| <AgentStrategy | |||
| strategy={inputs.agent_strategy_name ? { | |||
| agent_strategy_provider_name: inputs.agent_strategy_provider_name!, | |||
| @@ -76,7 +76,7 @@ const useSingleRunFormParams = ({ | |||
| return formatTracing([runResult], t)[0] | |||
| }, [runResult, t]) | |||
| const getDependentVars = () => { | |||
| const getDependentVars = () => { | |||
| return varInputs.map((item) => { | |||
| // Guard against null/undefined variable to prevent app crash | |||
| if (!item.variable || typeof item.variable !== 'string') | |||
| @@ -69,7 +69,7 @@ const VarList: FC<Props> = ({ | |||
| if (item.value === WriteMode.set || item.value === WriteMode.increment || item.value === WriteMode.decrement | |||
| || item.value === WriteMode.multiply || item.value === WriteMode.divide) { | |||
| if(varType === VarType.boolean) | |||
| draft[index].value = false | |||
| draft[index].value = false | |||
| draft[index].input_type = AssignerNodeInputType.constant | |||
| } | |||
| else { | |||
| @@ -31,8 +31,6 @@ const useKeyValueList = (value: string, onChange: (value: string) => void, noFil | |||
| const newValue = list.filter(item => item.key && item.value).map(item => `${item.key}:${item.value}`).join('\n') | |||
| if (newValue !== value) | |||
| onChange(newValue) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [list, noFilter]) | |||
| const addItem = useCallback(() => { | |||
| setList([...list, { | |||
| @@ -51,7 +51,6 @@ const useConfig = (id: string, payload: HttpNodeType) => { | |||
| setInputs(newInputs) | |||
| setIsDataReady(true) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [defaultConfig]) | |||
| const handleMethodChange = useCallback((method: Method) => { | |||
| @@ -31,7 +31,6 @@ const MetadataTrigger = ({ | |||
| handleRemoveCondition(condition.id) | |||
| }) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [metadataList, handleRemoveCondition, selectedDatasetsLoaded]) | |||
| return ( | |||
| @@ -172,7 +172,6 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { | |||
| } | |||
| }) | |||
| setInputs(newInput) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, [currentProvider?.provider, currentModel, currentRerankModel, rerankDefaultModel]) | |||
| const [selectedDatasets, setSelectedDatasets] = useState<DataSet[]>([]) | |||
| const [rerankModelOpen, setRerankModelOpen] = useState(false) | |||
| @@ -229,7 +228,6 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { | |||
| setInputs(newInputs) | |||
| setSelectedDatasetsLoaded(true) | |||
| })() | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| useEffect(() => { | |||
| @@ -241,7 +239,6 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => { | |||
| setInputs(produce(inputs, (draft) => { | |||
| draft.query_variable_selector = query_variable_selector | |||
| })) | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| const handleOnDatasetsChange = useCallback((newDatasets: DataSet[]) => { | |||
| @@ -34,7 +34,6 @@ const JsonImporter: FC<JsonImporterProps> = ({ | |||
| const rect = importBtnRef.current.getBoundingClientRect() | |||
| updateBtnWidth(rect.width) | |||
| } | |||
| // eslint-disable-next-line react-hooks/exhaustive-deps | |||
| }, []) | |||
| const handleTrigger = useCallback((e: React.MouseEvent<HTMLElement, MouseEvent>) => { | |||