diff --git a/docker/docker-compose-template.yaml b/docker/docker-compose-template.yaml
index ef58bf99f3..81314421a8 100644
--- a/docker/docker-compose-template.yaml
+++ b/docker/docker-compose-template.yaml
@@ -90,10 +90,10 @@ services:
volumes:
- ./volumes/db/data:/var/lib/postgresql/data
healthcheck:
- test: [ 'CMD', 'pg_isready' ]
+ test: [ 'CMD', 'pg_isready', '-h', 'db', '-U', '${PGUSER:-postgres}', '-d', '${POSTGRES_DB:-dify}' ]
interval: 1s
timeout: 3s
- retries: 30
+ retries: 60
# The redis cache.
redis:
@@ -175,7 +175,8 @@ services:
volumes:
- ./volumes/plugin_daemon:/app/storage
depends_on:
- - db
+ db:
+ condition: service_healthy
# ssrf_proxy server
# for more information, please refer to
diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml
index 305cf22b20..720b604f7f 100644
--- a/docker/docker-compose.yaml
+++ b/docker/docker-compose.yaml
@@ -558,10 +558,10 @@ services:
volumes:
- ./volumes/db/data:/var/lib/postgresql/data
healthcheck:
- test: [ 'CMD', 'pg_isready' ]
+ test: [ 'CMD', 'pg_isready', '-h', 'db', '-U', '${PGUSER:-postgres}', '-d', '${POSTGRES_DB:-dify}' ]
interval: 1s
timeout: 3s
- retries: 30
+ retries: 60
# The redis cache.
redis:
@@ -643,7 +643,8 @@ services:
volumes:
- ./volumes/plugin_daemon:/app/storage
depends_on:
- - db
+ db:
+ condition: service_healthy
# ssrf_proxy server
# for more information, please refer to
diff --git a/web/.husky/pre-commit b/web/.husky/pre-commit
old mode 100755
new mode 100644
diff --git a/web/app/(commonLayout)/datasets/Doc.tsx b/web/app/(commonLayout)/datasets/Doc.tsx
index 57d4b8dfef..e79adbccd5 100644
--- a/web/app/(commonLayout)/datasets/Doc.tsx
+++ b/web/app/(commonLayout)/datasets/Doc.tsx
@@ -1,6 +1,6 @@
'use client'
-import { useEffect, useState } from 'react'
+import { useEffect, useMemo, useState } from 'react'
import { useContext } from 'use-context-selector'
import { useTranslation } from 'react-i18next'
import { RiListUnordered } from '@remixicon/react'
@@ -67,6 +67,17 @@ const Doc = ({ apiBaseUrl }: DocProps) => {
}
}
+ const Template = useMemo(() => {
+ switch (locale) {
+ case LanguagesSupported[1]:
+ return
+ case LanguagesSupported[7]:
+ return
+ default:
+ return
+ }
+ }, [apiBaseUrl, locale])
+
return (
@@ -107,16 +118,7 @@ const Doc = ({ apiBaseUrl }: DocProps) => {
)}
- {(() => {
- switch (locale) {
- case LanguagesSupported[1]:
- return
- case LanguagesSupported[7]:
- return
- default:
- return
- }
- })()}
+ {Template}
)
diff --git a/web/app/(commonLayout)/datasets/template/template.en.mdx b/web/app/(commonLayout)/datasets/template/template.en.mdx
index ca86c7e6d6..4faf26058e 100644
--- a/web/app/(commonLayout)/datasets/template/template.en.mdx
+++ b/web/app/(commonLayout)/datasets/template/template.en.mdx
@@ -1,3 +1,8 @@
+{/**
+ * @typedef Props
+ * @property {string} apiBaseUrl
+ */}
+
import { CodeGroup } from '@/app/components/develop/code.tsx'
import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstruction, Paragraph } from '@/app/components/develop/md.tsx'
diff --git a/web/app/(commonLayout)/datasets/template/template.ja.mdx b/web/app/(commonLayout)/datasets/template/template.ja.mdx
index 45f3adfc4d..a5e560df8c 100644
--- a/web/app/(commonLayout)/datasets/template/template.ja.mdx
+++ b/web/app/(commonLayout)/datasets/template/template.ja.mdx
@@ -1,3 +1,8 @@
+{/**
+ * @typedef Props
+ * @property {string} apiBaseUrl
+ */}
+
import { CodeGroup } from '@/app/components/develop/code.tsx'
import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstruction, Paragraph } from '@/app/components/develop/md.tsx'
diff --git a/web/app/(commonLayout)/datasets/template/template.zh.mdx b/web/app/(commonLayout)/datasets/template/template.zh.mdx
index 20511b8cf7..8ff82ca1fb 100644
--- a/web/app/(commonLayout)/datasets/template/template.zh.mdx
+++ b/web/app/(commonLayout)/datasets/template/template.zh.mdx
@@ -1,3 +1,8 @@
+{/**
+ * @typedef Props
+ * @property {string} apiBaseUrl
+ */}
+
import { CodeGroup } from '@/app/components/develop/code.tsx'
import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstruction, Paragraph } from '@/app/components/develop/md.tsx'
diff --git a/web/app/components/base/drawer/index.tsx b/web/app/components/base/drawer/index.tsx
index 7e3405e9d2..6002112e52 100644
--- a/web/app/components/base/drawer/index.tsx
+++ b/web/app/components/base/drawer/index.tsx
@@ -44,17 +44,17 @@ export default function Drawer({
unmount={unmount}
open={isOpen}
onClose={() => !clickOutsideNotOpen && onClose()}
- className="fixed inset-0 z-30 overflow-y-auto"
+ className="fixed inset-0 z-[80] overflow-y-auto"
>
{/* mask */}
{
!clickOutsideNotOpen && onClose()
}}
/>
-
+
<>
{title &&
void
selectedTools?: ToolValue[]
}
+
+const DEFAULT_TAGS: AllToolsProps['tags'] = []
+
const AllTools = ({
className,
toolContentClassName,
searchText,
- tags = [],
+ tags = DEFAULT_TAGS,
onSelect,
buildInTools,
workflowTools,
@@ -97,7 +101,7 @@ const AllTools = ({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [searchText, tags, enable_marketplace])
- const pluginRef = useRef(null)
+ const pluginRef = useRef(null)
const wrapElemRef = useRef(null)
return (
@@ -136,7 +140,7 @@ const AllTools = ({
{/* Plugins from marketplace */}
{enable_marketplace &&
list: Plugin[]
searchText: string
@@ -20,17 +19,16 @@ type Props = {
disableMaxWidth?: boolean
}
-const List = (
- {
- ref,
- wrapElemRef,
- searchText,
- tags,
- list,
- toolContentClassName,
- disableMaxWidth = false,
- },
-) => {
+export type ListRef = { handleScroll: () => void }
+
+const List = forwardRef(({
+ wrapElemRef,
+ searchText,
+ tags,
+ list,
+ toolContentClassName,
+ disableMaxWidth = false,
+}, ref) => {
const { t } = useTranslation()
const hasFilter = !searchText
const hasRes = list.length > 0
@@ -126,7 +124,7 @@ const List = (
>
)
-}
+})
List.displayName = 'List'
diff --git a/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx b/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
index 83cea4c594..dd6a1c6a22 100644
--- a/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
+++ b/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
@@ -18,10 +18,13 @@ import { CollectionType } from '@/app/components/tools/types'
import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon'
import { useStrategyInfo } from '../../agent/use-config'
import { SwitchPluginVersion } from './switch-plugin-version'
-import PluginList from '@/app/components/workflow/block-selector/market-place-plugin/list'
+import type { ListRef } from '@/app/components/workflow/block-selector/market-place-plugin/list'
+import PluginList, { type ListProps } from '@/app/components/workflow/block-selector/market-place-plugin/list'
import { useMarketplacePlugins } from '@/app/components/plugins/marketplace/hooks'
import { ToolTipContent } from '@/app/components/base/tooltip/content'
+const DEFAULT_TAGS: ListProps['tags'] = []
+
const NotFoundWarn = (props: {
title: ReactNode,
description: ReactNode
@@ -138,7 +141,7 @@ export const AgentStrategySelector = memo((props: AgentStrategySelectorProps) =>
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [query])
- const pluginRef = useRef(null)
+ const pluginRef = useRef(null)
return
@@ -213,10 +216,11 @@ export const AgentStrategySelector = memo((props: AgentStrategySelectorProps) =>
className='h-full max-h-full max-w-none overflow-y-auto'
indexBarClassName='top-0 xl:top-36' showWorkflowEmpty={false} hasSearchText={false} />