Browse Source

CI: add TS indentation check via esLint (#24810)

tags/1.8.1
Yongtao Huang 2 months ago
parent
commit
208ce4e774
No account linked to committer's email address
100 changed files with 368 additions and 403 deletions
  1. 3
    1
      .github/workflows/style.yml
  2. 1
    1
      web/__tests__/check-i18n.test.ts
  3. 2
    2
      web/__tests__/description-validation.test.tsx
  4. 1
    1
      web/__tests__/document-list-sorting.test.tsx
  5. 1
    1
      web/__tests__/plugin-tool-workflow-error.test.tsx
  6. 1
    1
      web/__tests__/real-browser-flicker.test.tsx
  7. 2
    2
      web/__tests__/workflow-parallel-limit.test.tsx
  8. 2
    2
      web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/__tests__/svg-attribute-error-reproduction.spec.tsx
  9. 1
    1
      web/app/account/(commonLayout)/account-page/AvatarWithEdit.tsx
  10. 2
    2
      web/app/components/app-sidebar/basic.tsx
  11. 2
    2
      web/app/components/app-sidebar/index.tsx
  12. 1
    1
      web/app/components/app-sidebar/sidebar-animation-issues.spec.tsx
  13. 1
    1
      web/app/components/app/annotation/index.tsx
  14. 5
    5
      web/app/components/app/configuration/config-var/config-modal/type-select.tsx
  15. 0
    1
      web/app/components/app/configuration/dataset-config/params-config/config-content.tsx
  16. 4
    4
      web/app/components/app/configuration/debug/chat-user-input.tsx
  17. 62
    62
      web/app/components/app/log/list.tsx
  18. 1
    1
      web/app/components/app/overview/app-card.tsx
  19. 4
    4
      web/app/components/app/overview/embedded/index.tsx
  20. 1
    1
      web/app/components/app/overview/settings/index.tsx
  21. 1
    1
      web/app/components/apps/list.tsx
  22. 6
    6
      web/app/components/base/chat/embedded-chatbot/inputs-form/content.tsx
  23. 6
    6
      web/app/components/base/checkbox/index.tsx
  24. 1
    1
      web/app/components/base/date-and-time-picker/utils/dayjs.ts
  25. 1
    1
      web/app/components/base/form/form-scenarios/demo/index.tsx
  26. 5
    5
      web/app/components/base/form/types.ts
  27. 3
    3
      web/app/components/base/mermaid/index.tsx
  28. 3
    3
      web/app/components/base/prompt-editor/plugins/current-block/component.tsx
  29. 3
    3
      web/app/components/base/prompt-editor/plugins/error-message-block/component.tsx
  30. 3
    3
      web/app/components/base/prompt-editor/plugins/last-run-block/component.tsx
  31. 24
    24
      web/app/components/base/select/index.tsx
  32. 1
    1
      web/app/components/base/tag-management/selector.tsx
  33. 1
    1
      web/app/components/base/toast/index.tsx
  34. 0
    1
      web/app/components/datasets/common/retrieval-param-config/index.tsx
  35. 0
    1
      web/app/components/datasets/create/website/base/options-wrap.tsx
  36. 1
    2
      web/app/components/datasets/create/website/index.tsx
  37. 0
    1
      web/app/components/datasets/create/website/jina-reader/base/options-wrap.tsx
  38. 1
    1
      web/app/components/datasets/documents/detail/batch-modal/csv-uploader.tsx
  39. 3
    3
      web/app/components/datasets/external-knowledge-base/create/InfoPanel.tsx
  40. 2
    2
      web/app/components/datasets/hit-testing/components/chunk-detail-modal.tsx
  41. 0
    1
      web/app/components/datasets/metadata/hooks/use-edit-dataset-metadata.ts
  42. 2
    2
      web/app/components/goto-anything/actions/commands/registry.ts
  43. 2
    2
      web/app/components/goto-anything/actions/index.ts
  44. 1
    1
      web/app/components/goto-anything/index.tsx
  45. 0
    1
      web/app/components/header/account-setting/data-source-page/data-source-website/index.tsx
  46. 3
    3
      web/app/components/header/account-setting/model-provider-page/model-auth/add-credential-in-load-balancing.tsx
  47. 5
    5
      web/app/components/header/account-setting/model-provider-page/model-auth/authorized/index.tsx
  48. 2
    2
      web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal.tsx
  49. 0
    3
      web/app/components/plugins/install-plugin/install-bundle/item/github-item.tsx
  50. 0
    6
      web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx
  51. 0
    1
      web/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx
  52. 0
    1
      web/app/components/plugins/install-plugin/install-from-local-package/steps/uploading.tsx
  53. 0
    1
      web/app/components/plugins/marketplace/context.tsx
  54. 14
    14
      web/app/components/plugins/plugin-auth/authorized/index.tsx
  55. 3
    3
      web/app/components/plugins/plugin-auth/hooks/use-plugin-auth-action.ts
  56. 1
    1
      web/app/components/plugins/plugin-detail-panel/app-selector/index.tsx
  57. 1
    1
      web/app/components/plugins/plugin-detail-panel/detail-header.tsx
  58. 2
    2
      web/app/components/plugins/plugin-detail-panel/endpoint-modal.tsx
  59. 1
    1
      web/app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.tsx
  60. 6
    6
      web/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx
  61. 0
    1
      web/app/components/plugins/plugin-item/action.tsx
  62. 12
    12
      web/app/components/plugins/reference-setting-modal/auto-update-setting/index.tsx
  63. 6
    6
      web/app/components/plugins/reference-setting-modal/auto-update-setting/utils.ts
  64. 1
    1
      web/app/components/plugins/update-plugin/downgrade-warning.tsx
  65. 38
    38
      web/app/components/plugins/update-plugin/from-market-place.tsx
  66. 0
    1
      web/app/components/tools/mcp/detail/content.tsx
  67. 3
    3
      web/app/components/tools/mcp/mcp-service-card.tsx
  68. 9
    9
      web/app/components/tools/utils/to-form-schema.ts
  69. 0
    1
      web/app/components/workflow-app/hooks/use-workflow-init.ts
  70. 0
    1
      web/app/components/workflow/block-selector/all-tools.tsx
  71. 0
    1
      web/app/components/workflow/block-selector/market-place-plugin/action.tsx
  72. 0
    1
      web/app/components/workflow/block-selector/market-place-plugin/list.tsx
  73. 0
    1
      web/app/components/workflow/block-selector/tool/tool.tsx
  74. 0
    1
      web/app/components/workflow/datasets-detail-store/provider.tsx
  75. 20
    20
      web/app/components/workflow/header/header-in-restoring.tsx
  76. 10
    10
      web/app/components/workflow/header/version-history-button.tsx
  77. 0
    1
      web/app/components/workflow/hooks-store/provider.tsx
  78. 28
    28
      web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts
  79. 3
    3
      web/app/components/workflow/hooks/use-nodes-available-var-list.ts
  80. 1
    1
      web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts
  81. 1
    1
      web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
  82. 1
    1
      web/app/components/workflow/nodes/_base/components/agent-strategy.tsx
  83. 4
    4
      web/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx
  84. 0
    1
      web/app/components/workflow/nodes/_base/components/input-support-select-var.tsx
  85. 1
    1
      web/app/components/workflow/nodes/_base/components/mcp-tool-not-support-tooltip.tsx
  86. 2
    2
      web/app/components/workflow/nodes/_base/components/variable/utils.ts
  87. 5
    5
      web/app/components/workflow/nodes/_base/components/variable/var-list.tsx
  88. 1
    1
      web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx
  89. 2
    2
      web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx
  90. 5
    5
      web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/index.tsx
  91. 4
    4
      web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts
  92. 4
    4
      web/app/components/workflow/nodes/agent/panel.tsx
  93. 1
    1
      web/app/components/workflow/nodes/agent/use-single-run-form-params.ts
  94. 1
    1
      web/app/components/workflow/nodes/assigner/components/var-list/index.tsx
  95. 0
    2
      web/app/components/workflow/nodes/http/hooks/use-key-value-list.ts
  96. 0
    1
      web/app/components/workflow/nodes/http/use-config.ts
  97. 0
    1
      web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-trigger.tsx
  98. 0
    3
      web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts
  99. 0
    1
      web/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-importer.tsx
  100. 0
    0
      web/app/components/workflow/nodes/parameter-extractor/use-config.ts

+ 3
- 1
.github/workflows/style.yml View File

@@ -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

+ 1
- 1
web/__tests__/check-i18n.test.ts View File

@@ -621,7 +621,7 @@ export default translation
&& !trimmed.startsWith('//'))
break
}
else {
else {
break
}


+ 2
- 2
web/__tests__/description-validation.test.tsx View File

@@ -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.',
)

+ 1
- 1
web/__tests__/document-list-sorting.test.tsx View File

@@ -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
}

+ 1
- 1
web/__tests__/plugin-tool-workflow-error.test.tsx View File

@@ -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]

+ 1
- 1
web/__tests__/real-browser-flicker.test.tsx View File

@@ -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)

+ 2
- 2
web/__tests__/workflow-parallel-limit.test.tsx View File

@@ -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()

+ 2
- 2
web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/__tests__/svg-attribute-error-reproduction.spec.tsx View File

@@ -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')
})
})

+ 1
- 1
web/app/account/(commonLayout)/account-page/AvatarWithEdit.tsx View File

@@ -106,7 +106,7 @@ const AvatarWithEdit = ({ onSave, ...props }: AvatarWithEditProps) => {
onClick={() => {
if (hoverArea === 'right' && !onAvatarError)
setIsShowDeleteConfirm(true)
else
else
setIsShowAvatarPicker(true)
}}
onMouseMove={(e) => {

+ 2
- 2
web/app/components/app-sidebar/basic.tsx View File

@@ -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' />,
}


+ 2
- 2
web/app/components/app-sidebar/index.tsx View File

@@ -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

+ 1
- 1
web/app/components/app-sidebar/sidebar-animation-issues.spec.tsx View File

@@ -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 = () => {

+ 1
- 1
web/app/components/app/annotation/index.tsx View File

@@ -84,7 +84,7 @@ const Annotation: FC<Props> = (props) => {
setList(data as AnnotationItem[])
setTotal(total)
}
finally {
finally {
setIsLoading(false)
}
}

+ 5
- 5
web/app/components/app/configuration/config-var/config-modal/type-select.tsx View File

@@ -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>

+ 0
- 1
web/app/components/app/configuration/dataset-config/params-config/config-content.tsx View File

@@ -175,7 +175,6 @@ const ConfigContent: FC<Props> = ({
...datasetConfigs,
reranking_enable: enable,
})
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [currentRerankModel, datasetConfigs, onChange])

return (

+ 4
- 4
web/app/components/app/configuration/debug/chat-user-input.tsx View File

@@ -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' && (

+ 62
- 62
web/app/components/app/log/list.tsx View File

@@ -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) {

+ 1
- 1
web/app/components/app/overview/app-card.tsx View File

@@ -167,7 +167,7 @@ function AppCard({
setAppDetail(res)
setShowAccessControl(false)
}
catch (error) {
catch (error) {
console.error('Failed to fetch app detail:', error)
}
}, [appDetail, setAppDetail])

+ 4
- 4
web/app/components/app/overview/embedded/index.tsx View File

@@ -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

+ 1
- 1
web/app/components/app/overview/settings/index.tsx View File

@@ -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 */}

+ 1
- 1
web/app/components/apps/list.tsx View File

@@ -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)

+ 6
- 6
web/app/components/base/chat/embedded-chatbot/inputs-form/content.tsx View File

@@ -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

+ 6
- 6
web/app/components/base/checkbox/index.tsx View File

@@ -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'

+ 1
- 1
web/app/components/base/date-and-time-picker/utils/dayjs.ts View File

@@ -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')
}

+ 1
- 1
web/app/components/base/form/form-scenarios/demo/index.tsx View File

@@ -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

+ 5
- 5
web/app/components/base/form/types.ts View File

@@ -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>

+ 3
- 3
web/app/components/base/mermaid/index.tsx View File

@@ -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>
)}


+ 3
- 3
web/app/components/base/prompt-editor/plugins/current-block/component.tsx View File

@@ -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

+ 3
- 3
web/app/components/base/prompt-editor/plugins/error-message-block/component.tsx View File

@@ -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

+ 3
- 3
web/app/components/base/prompt-editor/plugins/last-run-block/component.tsx View File

@@ -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

+ 24
- 24
web/app/components/base/select/index.tsx View File

@@ -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>
)}

+ 1
- 1
web/app/components/base/tag-management/selector.tsx View File

@@ -226,7 +226,7 @@ const TagSelector: FC<TagSelectorProps> = ({
const res = await fetchTagList(type)
setTagList(res)
}
catch (error) {
catch (error) {
setTagList([])
}
}

+ 1
- 1
web/app/components/base/toast/index.tsx View File

@@ -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'}`}>

+ 0
- 1
web/app/components/datasets/common/retrieval-param-config/index.tsx View File

@@ -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(() => {

+ 0
- 1
web/app/components/datasets/create/website/base/options-wrap.tsx View File

@@ -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')}>

+ 1
- 2
web/app/components/datasets/create/website/index.tsx View File

@@ -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'

+ 0
- 1
web/app/components/datasets/create/website/jina-reader/base/options-wrap.tsx View File

@@ -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')}>

+ 1
- 1
web/app/components/datasets/documents/detail/batch-modal/csv-uploader.tsx View File

@@ -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)
}

+ 3
- 3
web/app/components/datasets/external-knowledge-base/create/InfoPanel.tsx View File

@@ -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>

+ 2
- 2
web/app/components/datasets/hit-testing/components/chunk-detail-modal.tsx View File

@@ -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>

+ 0
- 1
web/app/components/datasets/metadata/hooks/use-edit-dataset-metadata.ts View File

@@ -28,7 +28,6 @@ const useEditDatasetMetadata = ({
showEditModal()
localStorage.removeItem(isShowManageMetadataLocalStorageKey)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

const { data: datasetMetaData } = useDatasetMetaData(datasetId)

+ 2
- 2
web/app/components/goto-anything/actions/commands/registry.ts View File

@@ -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 []
}

+ 2
- 2
web/app/components/goto-anything/actions/index.ts View File

@@ -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)
}

+ 1
- 1
web/app/components/goto-anything/index.tsx View File

@@ -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)

+ 0
- 1
web/app/components/header/account-setting/data-source-page/data-source-website/index.tsx View File

@@ -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)

+ 3
- 3
web/app/components/header/account-setting/model-provider-page/model-auth/add-credential-in-load-balancing.tsx View File

@@ -60,9 +60,9 @@ const AddCredentialInLoadBalancing = ({
asChild
popupContent={t('plugin.auth.credentialUnavailable')}
>
{Item}
</Tooltip>
)
{Item}
</Tooltip>
)
}
return Item
}, [notAllowCustomCredential, t, customModel])

+ 5
- 5
web/app/components/header/account-setting/model-provider-page/model-auth/authorized/index.tsx View File

@@ -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'
>

+ 2
- 2
web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal.tsx View File

@@ -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

+ 0
- 3
web/app/components/plugins/install-plugin/install-bundle/item/github-item.tsx View File

@@ -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 (

+ 0
- 6
web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx View File

@@ -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) => {

+ 0
- 1
web/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx View File

@@ -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 () => {

+ 0
- 1
web/app/components/plugins/install-plugin/install-from-local-package/steps/uploading.tsx View File

@@ -55,7 +55,6 @@ const Uploading: FC<Props> = ({

React.useEffect(() => {
handleUpload()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
return (
<>

+ 0
- 1
web/app/components/plugins/marketplace/context.tsx View File

@@ -175,7 +175,6 @@ export const MarketplaceContextProvider = ({
})
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [queryPlugins, queryMarketplaceCollectionsAndPlugins, isSuccess, exclude])

const handleQueryMarketplaceCollectionsAndPlugins = useCallback(() => {

+ 14
- 14
web/app/components/plugins/plugin-auth/authorized/index.tsx View File

@@ -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>
</>
)
}

+ 3
- 3
web/app/components/plugins/plugin-auth/hooks/use-plugin-auth-action.ts View File

@@ -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 {

+ 1
- 1
web/app/components/plugins/plugin-detail-panel/app-selector/index.tsx View File

@@ -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)

+ 1
- 1
web/app/components/plugins/plugin-detail-panel/detail-header.tsx View File

@@ -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()

+ 2
- 2
web/app/components/plugins/plugin-detail-panel/endpoint-modal.tsx View File

@@ -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
}
})

+ 1
- 1
web/app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.tsx View File

@@ -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)

+ 6
- 6
web/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx View File

@@ -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>
)}


+ 0
- 1
web/app/components/plugins/plugin-item/action.tsx View File

@@ -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'>

+ 12
- 12
web/app/components/plugins/reference-setting-modal/auto-update-setting/index.tsx View File

@@ -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])


+ 6
- 6
web/app/components/plugins/reference-setting-modal/auto-update-setting/utils.ts View File

@@ -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
}

+ 1
- 1
web/app/components/plugins/update-plugin/downgrade-warning.tsx View File

@@ -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'>

+ 38
- 38
web/app/components/plugins/update-plugin/from-market-place.tsx View File

@@ -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>
)

+ 0
- 1
web/app/components/tools/mcp/detail/content.tsx View File

@@ -141,7 +141,6 @@ const MCPDetailContent: FC<Props> = ({
useEffect(() => {
if (isTriggerAuthorize)
handleAuthorize()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

if (!detail)

+ 3
- 3
web/app/components/tools/mcp/mcp-service-card.tsx View File

@@ -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>

+ 9
- 9
web/app/components/tools/utils/to-form-schema.ts View File

@@ -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

+ 0
- 1
web/app/components/workflow-app/hooks/use-workflow-init.ts View File

@@ -83,7 +83,6 @@ export const useWorkflowInit = () => {

useEffect(() => {
handleGetInitialWorkflowData()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

const handleFetchPreloadData = useCallback(async () => {

+ 0
- 1
web/app/components/workflow/block-selector/all-tools.tsx View File

@@ -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)

+ 0
- 1
web/app/components/workflow/block-selector/market-place-plugin/action.tsx View File

@@ -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

+ 0
- 1
web/app/components/workflow/block-selector/market-place-plugin/list.tsx View File

@@ -56,7 +56,6 @@ const List = forwardRef<ListRef, ListProps>(({

useEffect(() => {
handleScroll()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [list])

const handleHeadClick = () => {

+ 0
- 1
web/app/components/workflow/block-selector/tool/tool.tsx View File

@@ -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

+ 0
- 1
web/app/components/workflow/datasets-detail-store/provider.tsx View File

@@ -40,7 +40,6 @@ const DatasetsDetailProvider: FC<DatasetsDetailProviderProps> = ({
}, [])
if (allDatasetIds.length === 0) return
updateDatasetsDetail(allDatasetIds)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

return (

+ 20
- 20
web/app/components/workflow/header/header-in-restoring.tsx View File

@@ -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>

+ 10
- 10
web/app/components/workflow/header/version-history-button.tsx View File

@@ -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>
}


+ 0
- 1
web/app/components/workflow/hooks-store/provider.tsx View File

@@ -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)

+ 28
- 28
web/app/components/workflow/hooks/use-inspect-vars-crud-common.ts View File

@@ -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)

+ 3
- 3
web/app/components/workflow/hooks/use-nodes-available-var-list.ts View File

@@ -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()

+ 1
- 1
web/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts View File

@@ -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')

+ 1
- 1
web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx View File

@@ -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)

+ 1
- 1
web/app/components/workflow/nodes/_base/components/agent-strategy.tsx View File

@@ -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>}

+ 4
- 4
web/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx View File

@@ -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) && (

+ 0
- 1
web/app/components/workflow/nodes/_base/components/input-support-select-var.tsx View File

@@ -53,7 +53,6 @@ const Editor: FC<Props> = ({

useEffect(() => {
onFocusChange?.(isFocus)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isFocus])

return (

+ 1
- 1
web/app/components/workflow/nodes/_base/components/mcp-tool-not-support-tooltip.tsx View File

@@ -11,7 +11,7 @@ const McpToolNotSupportTooltip: FC = () => {
<Tooltip
popupContent={
<div className='w-[256px]'>
{t('plugin.detailPanel.toolSelector.unsupportedMCPTool')}
{t('plugin.detailPanel.toolSelector.unsupportedMCPTool')}
</div>
}
>

+ 2
- 2
web/app/components/workflow/nodes/_base/components/variable/utils.ts View File

@@ -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 || []
}
}


+ 5
- 5
web/app/components/workflow/nodes/_base/components/variable/var-list.tsx View File

@@ -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({

+ 1
- 1
web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx View File

@@ -339,7 +339,7 @@ const VarReferencePicker: FC<Props> = ({
const data = await fetchDynamicOptions()
setDynamicOptions(data?.options || [])
}
finally {
finally {
setIsLoading(false)
}
}

+ 2
- 2
web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx View File

@@ -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>

+ 5
- 5
web/app/components/workflow/nodes/_base/components/workflow-panel/last-run/index.tsx View File

@@ -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)


+ 4
- 4
web/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts View File

@@ -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])

+ 4
- 4
web/app/components/workflow/nodes/agent/panel.tsx View File

@@ -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!,

+ 1
- 1
web/app/components/workflow/nodes/agent/use-single-run-form-params.ts View File

@@ -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')

+ 1
- 1
web/app/components/workflow/nodes/assigner/components/var-list/index.tsx View File

@@ -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 {

+ 0
- 2
web/app/components/workflow/nodes/http/hooks/use-key-value-list.ts View File

@@ -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, {

+ 0
- 1
web/app/components/workflow/nodes/http/use-config.ts View File

@@ -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) => {

+ 0
- 1
web/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-trigger.tsx View File

@@ -31,7 +31,6 @@ const MetadataTrigger = ({
handleRemoveCondition(condition.id)
})
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [metadataList, handleRemoveCondition, selectedDatasetsLoaded])

return (

+ 0
- 3
web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts View File

@@ -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[]) => {

+ 0
- 1
web/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-importer.tsx View File

@@ -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>) => {

+ 0
- 0
web/app/components/workflow/nodes/parameter-extractor/use-config.ts View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save